xref: /rockchip-linux_mpp/osal/inc/mpp_device.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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