1 /*
2  * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef __MPP_DEVICE_H__
17 #define __MPP_DEVICE_H__
18 
19 #include "mpp_err.h"
20 #include "mpp_dev_defs.h"
21 
22 typedef enum MppDevIoctlCmd_e {
23     /* device batch mode config */
24     MPP_DEV_BATCH_ON,
25     MPP_DEV_BATCH_OFF,
26 
27     /* hardware operation setup config */
28     MPP_DEV_REG_WR,
29     MPP_DEV_REG_RD,
30     MPP_DEV_REG_OFFSET,
31     MPP_DEV_RCB_INFO,
32     MPP_DEV_SET_INFO,
33 
34     MPP_DEV_CMD_SEND,
35     MPP_DEV_CMD_POLL,
36 
37     MPP_DEV_IOCTL_CMD_BUTT,
38 } MppDevIoctlCmd;
39 
40 /* for MPP_DEV_REG_WR */
41 typedef struct MppDevRegWrCfg_t {
42     void    *reg;
43     RK_U32  size;
44     RK_U32  offset;
45 } MppDevRegWrCfg;
46 
47 /* for MPP_DEV_REG_RD */
48 typedef struct MppDevRegRdCfg_t {
49     void    *reg;
50     RK_U32  size;
51     RK_U32  offset;
52 } MppDevRegRdCfg;
53 
54 /* for MPP_DEV_REG_OFFSET */
55 typedef struct MppDevRegOffsetCfg_t {
56     RK_U32  reg_idx;
57     RK_U32  offset;
58 } MppDevRegOffsetCfg;
59 
60 /* for MPP_DEV_RCB_INFO */
61 typedef struct MppDevRcbInfoCfg_t {
62     RK_U32  reg_idx;
63     RK_U32  size;
64 } MppDevRcbInfoCfg;
65 
66 /* for MPP_DEV_SET_INFO */
67 typedef struct MppDevSetInfoCfg_t {
68     RK_U32  type;
69     RK_U32  flag;
70     RK_U64  data;
71 } MppDevInfoCfg;
72 
73 typedef struct MppDevApi_t {
74     const char  *name;
75     RK_U32      ctx_size;
76     MPP_RET     (*init)(void *ctx, MppClientType type);
77     MPP_RET     (*deinit)(void *ctx);
78 
79     /* bat mode function */
80     MPP_RET     (*attach)(void *ctx);
81     MPP_RET     (*detach)(void *ctx);
82 
83     /* config the cmd on preparing */
84     MPP_RET     (*reg_wr)(void *ctx, MppDevRegWrCfg *cfg);
85     MPP_RET     (*reg_rd)(void *ctx, MppDevRegRdCfg *cfg);
86     MPP_RET     (*reg_offset)(void *ctx, MppDevRegOffsetCfg *cfg);
87     MPP_RET     (*rcb_info)(void *ctx, MppDevRcbInfoCfg *cfg);
88     MPP_RET     (*set_info)(void *ctx, MppDevInfoCfg *cfg);
89 
90     /* send cmd to hardware */
91     MPP_RET     (*cmd_send)(void *ctx);
92 
93     /* poll cmd from hardware */
94     MPP_RET     (*cmd_poll)(void *ctx);
95 } MppDevApi;
96 
97 typedef void* MppDev;
98 
99 #ifdef __cplusplus
100 extern "C" {
101 #endif
102 
103 MPP_RET mpp_dev_init(MppDev *ctx, MppClientType type);
104 MPP_RET mpp_dev_deinit(MppDev ctx);
105 
106 MPP_RET mpp_dev_ioctl(MppDev ctx, RK_S32 cmd, void *param);
107 
108 /* special helper function for large address offset config */
109 MPP_RET mpp_dev_set_reg_offset(MppDev dev, RK_S32 index, RK_U32 offset);
110 
111 #ifdef __cplusplus
112 }
113 #endif
114 
115 #endif /* __MPP_DEVICE_H__ */