/* 
 | 
 * Copyright 2020 Rockchip Electronics Co. LTD 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 */ 
 | 
  
 | 
#ifndef __MPP_CFG_H__ 
 | 
#define __MPP_CFG_H__ 
 | 
  
 | 
#include "rk_type.h" 
 | 
#include "mpp_err.h" 
 | 
  
 | 
typedef enum CfgType_e { 
 | 
    CFG_FUNC_TYPE_S32, 
 | 
    CFG_FUNC_TYPE_U32, 
 | 
    CFG_FUNC_TYPE_S64, 
 | 
    CFG_FUNC_TYPE_U64, 
 | 
    CFG_FUNC_TYPE_St, 
 | 
    CFG_FUNC_TYPE_Ptr, 
 | 
    CFG_FUNC_TYPE_BUTT, 
 | 
} CfgType; 
 | 
  
 | 
typedef struct MppCfgApi_t { 
 | 
    const char          *name; 
 | 
    CfgType             data_type; 
 | 
    RK_U32              flag_offset; 
 | 
    RK_U32              flag_value; 
 | 
    RK_U32              data_offset; 
 | 
    RK_S32              data_size; 
 | 
} MppCfgApi; 
 | 
  
 | 
typedef struct MppCfgInfo_t { 
 | 
    /* size for the whole node including name */ 
 | 
    RK_S32          node_size; 
 | 
    RK_U32          name_len; 
 | 
    /* CfgType */ 
 | 
    RK_S32          data_type; 
 | 
    /* update flag info 32bit */ 
 | 
    RK_S32          flag_offset; 
 | 
    RK_U32          flag_value; 
 | 
    /* data access info */ 
 | 
    RK_S32          data_offset; 
 | 
    RK_S32          data_size; 
 | 
    /* linked next node offset for pointer type */ 
 | 
    RK_S32          node_next; 
 | 
    /* function pointer for get / put accessor (user filled) */ 
 | 
    RK_U64          set_func; 
 | 
    RK_U64          get_func; 
 | 
    /* reserve for extension */ 
 | 
    RK_U64          stuff[2]; 
 | 
    char            name[]; 
 | 
} MppCfgInfoNode; 
 | 
  
 | 
typedef MPP_RET (*CfgSetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 val); 
 | 
typedef MPP_RET (*CfgGetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 *val); 
 | 
typedef MPP_RET (*CfgSetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 val); 
 | 
typedef MPP_RET (*CfgGetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 *val); 
 | 
typedef MPP_RET (*CfgSetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 val); 
 | 
typedef MPP_RET (*CfgGetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 *val); 
 | 
typedef MPP_RET (*CfgSetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 val); 
 | 
typedef MPP_RET (*CfgGetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 *val); 
 | 
typedef MPP_RET (*CfgSetSt) (MppCfgInfoNode *info, void *cfg, void *val); 
 | 
typedef MPP_RET (*CfgGetSt) (MppCfgInfoNode *info, void *cfg, void *val); 
 | 
typedef MPP_RET (*CfgSetPtr)(MppCfgInfoNode *info, void *cfg, void *val); 
 | 
typedef MPP_RET (*CfgGetPtr)(MppCfgInfoNode *info, void *cfg, void **val); 
 | 
  
 | 
#define MPP_CFG_SET_S32(info, cfg, val) (mpp_cfg_ops.fp_SetS32)(info, cfg, val) 
 | 
#define MPP_CFG_GET_S32(info, cfg, val) (mpp_cfg_ops.fp_GetS32)(info, cfg, (RK_S32 *)(val)) 
 | 
#define MPP_CFG_SET_U32(info, cfg, val) (mpp_cfg_ops.fp_SetU32)(info, cfg, val) 
 | 
#define MPP_CFG_GET_U32(info, cfg, val) (mpp_cfg_ops.fp_GetU32)(info, cfg, (RK_U32 *)(val)) 
 | 
#define MPP_CFG_SET_S64(info, cfg, val) (mpp_cfg_ops.fp_SetS64)(info, cfg, val) 
 | 
#define MPP_CFG_GET_S64(info, cfg, val) (mpp_cfg_ops.fp_GetS64)(info, cfg, (RK_S64 *)(val)) 
 | 
#define MPP_CFG_SET_U64(info, cfg, val) (mpp_cfg_ops.fp_SetU64)(info, cfg, val) 
 | 
#define MPP_CFG_GET_U64(info, cfg, val) (mpp_cfg_ops.fp_GetU64)(info, cfg, (RK_U64 *)(val)) 
 | 
#define MPP_CFG_SET_St(info, cfg, val)  (mpp_cfg_ops.fp_SetSt )(info, cfg, val) 
 | 
#define MPP_CFG_GET_St(info, cfg, val)  (mpp_cfg_ops.fp_GetSt )(info, cfg, (void *)(val)) 
 | 
#define MPP_CFG_SET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_SetPtr)(info, cfg, val) 
 | 
#define MPP_CFG_GET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_GetPtr)(info, cfg, (void **)(val)) 
 | 
  
 | 
/* header size 128 byte */ 
 | 
typedef struct MppCfgInfoHead_t { 
 | 
    char            version[112]; 
 | 
    RK_S32          info_size; 
 | 
    RK_S32          info_count; 
 | 
    RK_S32          node_count; 
 | 
    RK_S32          cfg_size; 
 | 
} MppCfgInfoHead; 
 | 
  
 | 
typedef struct MppCfgOps_t { 
 | 
    CfgSetS32       fp_SetS32; 
 | 
    CfgGetS32       fp_GetS32; 
 | 
    CfgSetU32       fp_SetU32; 
 | 
    CfgGetU32       fp_GetU32; 
 | 
    CfgSetS64       fp_SetS64; 
 | 
    CfgGetS64       fp_GetS64; 
 | 
    CfgSetU64       fp_SetU64; 
 | 
    CfgGetU64       fp_GetU64; 
 | 
    CfgSetSt        fp_SetSt; 
 | 
    CfgGetSt        fp_GetSt; 
 | 
    CfgSetPtr       fp_SetPtr; 
 | 
    CfgGetPtr       fp_GetPtr; 
 | 
} MppCfgOps; 
 | 
  
 | 
#ifdef  __cplusplus 
 | 
extern "C" { 
 | 
#endif 
 | 
  
 | 
extern const char *cfg_type_names[]; 
 | 
  
 | 
extern MppCfgOps mpp_cfg_ops; 
 | 
MPP_RET mpp_cfg_node_fixup_func(MppCfgInfoNode *node); 
 | 
  
 | 
#define CHECK_CFG_INFO(node, name, type) \ 
 | 
    check_cfg_info(node, name, type, __FUNCTION__) 
 | 
  
 | 
MPP_RET check_cfg_info(MppCfgInfoNode *node, const char *name, CfgType type, 
 | 
                       const char *func); 
 | 
  
 | 
#ifdef  __cplusplus 
 | 
} 
 | 
#endif 
 | 
  
 | 
#endif /*__MPP_CFG_H__*/ 
 |