1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */ 2*437bfbebSnyanmisaka /* 3*437bfbebSnyanmisaka * Copyright (c) 2020 Rockchip Electronics Co., Ltd. 4*437bfbebSnyanmisaka */ 5*437bfbebSnyanmisaka 6*437bfbebSnyanmisaka #ifndef __MPP_DEVICE_H__ 7*437bfbebSnyanmisaka #define __MPP_DEVICE_H__ 8*437bfbebSnyanmisaka 9*437bfbebSnyanmisaka #include "mpp_err.h" 10*437bfbebSnyanmisaka #include "mpp_list.h" 11*437bfbebSnyanmisaka #include "mpp_mem_pool.h" 12*437bfbebSnyanmisaka 13*437bfbebSnyanmisaka #include "mpp_dev_defs.h" 14*437bfbebSnyanmisaka #include "mpp_callback.h" 15*437bfbebSnyanmisaka 16*437bfbebSnyanmisaka #define MPP_MAX_REG_TRANS_NUM 80 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka typedef void* MppDev; 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka typedef enum MppDevIoctlCmd_e { 21*437bfbebSnyanmisaka /* device batch mode config */ 22*437bfbebSnyanmisaka MPP_DEV_BATCH_ON, 23*437bfbebSnyanmisaka MPP_DEV_BATCH_OFF, 24*437bfbebSnyanmisaka MPP_DEV_DELIMIT, 25*437bfbebSnyanmisaka MPP_DEV_SET_CB_CTX, 26*437bfbebSnyanmisaka 27*437bfbebSnyanmisaka /* hardware operation setup config */ 28*437bfbebSnyanmisaka MPP_DEV_REG_WR, 29*437bfbebSnyanmisaka MPP_DEV_REG_RD, 30*437bfbebSnyanmisaka MPP_DEV_REG_OFFSET, 31*437bfbebSnyanmisaka MPP_DEV_REG_OFFS, 32*437bfbebSnyanmisaka MPP_DEV_RCB_INFO, 33*437bfbebSnyanmisaka MPP_DEV_SET_INFO, 34*437bfbebSnyanmisaka MPP_DEV_SET_ERR_REF_HACK, 35*437bfbebSnyanmisaka MPP_DEV_LOCK_MAP, 36*437bfbebSnyanmisaka MPP_DEV_UNLOCK_MAP, 37*437bfbebSnyanmisaka MPP_DEV_ATTACH_FD, 38*437bfbebSnyanmisaka MPP_DEV_DETACH_FD, 39*437bfbebSnyanmisaka 40*437bfbebSnyanmisaka MPP_DEV_CMD_SEND, 41*437bfbebSnyanmisaka MPP_DEV_CMD_POLL, 42*437bfbebSnyanmisaka 43*437bfbebSnyanmisaka MPP_DEV_IOCTL_CMD_BUTT, 44*437bfbebSnyanmisaka } MppDevIoctlCmd; 45*437bfbebSnyanmisaka 46*437bfbebSnyanmisaka /* for MPP_DEV_REG_WR */ 47*437bfbebSnyanmisaka typedef struct MppDevRegWrCfg_t { 48*437bfbebSnyanmisaka void *reg; 49*437bfbebSnyanmisaka RK_U32 size; 50*437bfbebSnyanmisaka RK_U32 offset; 51*437bfbebSnyanmisaka } MppDevRegWrCfg; 52*437bfbebSnyanmisaka 53*437bfbebSnyanmisaka /* for MPP_DEV_REG_RD */ 54*437bfbebSnyanmisaka typedef struct MppDevRegRdCfg_t { 55*437bfbebSnyanmisaka void *reg; 56*437bfbebSnyanmisaka RK_U32 size; 57*437bfbebSnyanmisaka RK_U32 offset; 58*437bfbebSnyanmisaka } MppDevRegRdCfg; 59*437bfbebSnyanmisaka 60*437bfbebSnyanmisaka /* for MPP_DEV_REG_OFFSET */ 61*437bfbebSnyanmisaka typedef struct MppDevRegOffsetCfg_t { 62*437bfbebSnyanmisaka RK_U32 reg_idx; 63*437bfbebSnyanmisaka RK_U32 offset; 64*437bfbebSnyanmisaka } MppDevRegOffsetCfg; 65*437bfbebSnyanmisaka 66*437bfbebSnyanmisaka /* for multi MPP_DEV_REG_OFFSET */ 67*437bfbebSnyanmisaka typedef struct MppDevRegOffsCfg_t { 68*437bfbebSnyanmisaka RK_S32 size; 69*437bfbebSnyanmisaka RK_S32 count; 70*437bfbebSnyanmisaka MppDevRegOffsetCfg cfgs[]; 71*437bfbebSnyanmisaka } MppDevRegOffCfgs; 72*437bfbebSnyanmisaka 73*437bfbebSnyanmisaka /* for MPP_DEV_RCB_INFO */ 74*437bfbebSnyanmisaka typedef struct MppDevRcbInfoCfg_t { 75*437bfbebSnyanmisaka RK_U32 reg_idx; 76*437bfbebSnyanmisaka RK_U32 size; 77*437bfbebSnyanmisaka } MppDevRcbInfoCfg; 78*437bfbebSnyanmisaka 79*437bfbebSnyanmisaka /* for MPP_DEV_SET_INFO */ 80*437bfbebSnyanmisaka typedef struct MppDevSetInfoCfg_t { 81*437bfbebSnyanmisaka RK_U32 type; 82*437bfbebSnyanmisaka RK_U32 flag; 83*437bfbebSnyanmisaka RK_U64 data; 84*437bfbebSnyanmisaka } MppDevInfoCfg; 85*437bfbebSnyanmisaka 86*437bfbebSnyanmisaka typedef union MppDevPollEncSliceInfo_u { 87*437bfbebSnyanmisaka RK_U32 val; 88*437bfbebSnyanmisaka struct { 89*437bfbebSnyanmisaka RK_U32 length : 31; 90*437bfbebSnyanmisaka RK_U32 last : 1; 91*437bfbebSnyanmisaka }; 92*437bfbebSnyanmisaka } MppDevPollEncSliceInfo; 93*437bfbebSnyanmisaka 94*437bfbebSnyanmisaka /* for MPP_DEV_POLL */ 95*437bfbebSnyanmisaka typedef struct MppDevPollCfg_t { 96*437bfbebSnyanmisaka RK_S32 poll_type; 97*437bfbebSnyanmisaka RK_S32 poll_ret; 98*437bfbebSnyanmisaka RK_S32 count_max; 99*437bfbebSnyanmisaka RK_S32 count_ret; 100*437bfbebSnyanmisaka MppDevPollEncSliceInfo slice_info[]; 101*437bfbebSnyanmisaka } MppDevPollCfg; 102*437bfbebSnyanmisaka 103*437bfbebSnyanmisaka typedef struct MppDevBufMapNode_t { 104*437bfbebSnyanmisaka /* data write by buffer function */ 105*437bfbebSnyanmisaka struct list_head list_buf; 106*437bfbebSnyanmisaka pthread_mutex_t *lock_buf; 107*437bfbebSnyanmisaka MppBuffer buffer; 108*437bfbebSnyanmisaka MppDev dev; 109*437bfbebSnyanmisaka MppMemPool pool; 110*437bfbebSnyanmisaka RK_S32 buf_fd; 111*437bfbebSnyanmisaka 112*437bfbebSnyanmisaka /* data write by device function */ 113*437bfbebSnyanmisaka struct list_head list_dev; 114*437bfbebSnyanmisaka pthread_mutex_t *lock_dev; 115*437bfbebSnyanmisaka RK_S32 dev_fd; 116*437bfbebSnyanmisaka RK_U32 iova; 117*437bfbebSnyanmisaka } MppDevBufMapNode; 118*437bfbebSnyanmisaka 119*437bfbebSnyanmisaka typedef struct MppDevApi_t { 120*437bfbebSnyanmisaka const char *name; 121*437bfbebSnyanmisaka RK_U32 ctx_size; 122*437bfbebSnyanmisaka MPP_RET (*init)(void *ctx, MppClientType type); 123*437bfbebSnyanmisaka MPP_RET (*deinit)(void *ctx); 124*437bfbebSnyanmisaka 125*437bfbebSnyanmisaka /* bat mode function */ 126*437bfbebSnyanmisaka MPP_RET (*attach)(void *ctx); 127*437bfbebSnyanmisaka MPP_RET (*detach)(void *ctx); 128*437bfbebSnyanmisaka MPP_RET (*delimit)(void *ctx); 129*437bfbebSnyanmisaka MPP_RET (*set_cb_ctx)(void *ctx, MppCbCtx *cb); 130*437bfbebSnyanmisaka 131*437bfbebSnyanmisaka /* config the cmd on preparing */ 132*437bfbebSnyanmisaka MPP_RET (*reg_wr)(void *ctx, MppDevRegWrCfg *cfg); 133*437bfbebSnyanmisaka MPP_RET (*reg_rd)(void *ctx, MppDevRegRdCfg *cfg); 134*437bfbebSnyanmisaka MPP_RET (*reg_offset)(void *ctx, MppDevRegOffsetCfg *cfg); 135*437bfbebSnyanmisaka MPP_RET (*reg_offs)(void *ctx, MppDevRegOffCfgs *cfg); 136*437bfbebSnyanmisaka MPP_RET (*rcb_info)(void *ctx, MppDevRcbInfoCfg *cfg); 137*437bfbebSnyanmisaka MPP_RET (*set_info)(void *ctx, MppDevInfoCfg *cfg); 138*437bfbebSnyanmisaka MPP_RET (*set_err_ref_hack)(void *ctx, RK_U32 *enable); 139*437bfbebSnyanmisaka 140*437bfbebSnyanmisaka /* buffer attach / detach */ 141*437bfbebSnyanmisaka MPP_RET (*lock_map)(void *ctx); 142*437bfbebSnyanmisaka MPP_RET (*unlock_map)(void *ctx); 143*437bfbebSnyanmisaka MPP_RET (*attach_fd)(void *ctx, MppDevBufMapNode *node); 144*437bfbebSnyanmisaka MPP_RET (*detach_fd)(void *ctx, MppDevBufMapNode *node); 145*437bfbebSnyanmisaka 146*437bfbebSnyanmisaka /* send cmd to hardware */ 147*437bfbebSnyanmisaka MPP_RET (*cmd_send)(void *ctx); 148*437bfbebSnyanmisaka 149*437bfbebSnyanmisaka /* poll cmd from hardware */ 150*437bfbebSnyanmisaka MPP_RET (*cmd_poll)(void *ctx, MppDevPollCfg *cfg); 151*437bfbebSnyanmisaka } MppDevApi; 152*437bfbebSnyanmisaka 153*437bfbebSnyanmisaka #ifdef __cplusplus 154*437bfbebSnyanmisaka extern "C" { 155*437bfbebSnyanmisaka #endif 156*437bfbebSnyanmisaka 157*437bfbebSnyanmisaka MPP_RET mpp_dev_init(MppDev *ctx, MppClientType type); 158*437bfbebSnyanmisaka MPP_RET mpp_dev_deinit(MppDev ctx); 159*437bfbebSnyanmisaka 160*437bfbebSnyanmisaka MPP_RET mpp_dev_ioctl(MppDev ctx, RK_S32 cmd, void *param); 161*437bfbebSnyanmisaka 162*437bfbebSnyanmisaka /* special helper function for large address offset config */ 163*437bfbebSnyanmisaka MPP_RET mpp_dev_set_reg_offset(MppDev dev, RK_S32 index, RK_U32 offset); 164*437bfbebSnyanmisaka 165*437bfbebSnyanmisaka /* register offset multi config */ 166*437bfbebSnyanmisaka MPP_RET mpp_dev_multi_offset_init(MppDevRegOffCfgs **cfgs, RK_S32 size); 167*437bfbebSnyanmisaka MPP_RET mpp_dev_multi_offset_deinit(MppDevRegOffCfgs *cfgs); 168*437bfbebSnyanmisaka 169*437bfbebSnyanmisaka MPP_RET mpp_dev_multi_offset_reset(MppDevRegOffCfgs *cfgs); 170*437bfbebSnyanmisaka MPP_RET mpp_dev_multi_offset_update(MppDevRegOffCfgs *cfgs, RK_S32 index, RK_U32 offset); 171*437bfbebSnyanmisaka 172*437bfbebSnyanmisaka #ifdef __cplusplus 173*437bfbebSnyanmisaka } 174*437bfbebSnyanmisaka #endif 175*437bfbebSnyanmisaka 176*437bfbebSnyanmisaka #endif /* __MPP_DEVICE_H__ */ 177