xref: /rockchip-linux_mpp/mpp/inc/mpp_internal.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4  */
5 
6 #ifndef __MPP_INTERNAL_H__
7 #define __MPP_INTERNAL_H__
8 
9 #include "rk_type.h"
10 #include "mpp_err.h"
11 
12 /*
13  * All mpp / kmpp internal interface object list here.
14  */
15 typedef void* MppTrie;
16 typedef void* MppCfgObj;
17 
18 /* MppObjDef - mpp object name size and access table trie definition */
19 typedef void* MppObjDef;
20 /* MppObj    - mpp object for string name access and function access */
21 typedef void* MppObj;
22 typedef void* MppIoc;
23 
24 /* KmppObjDef - mpp kernel object name size and access table trie definition */
25 typedef void* KmppObjDef;
26 /* KmppObj    - mpp kernel object for string name access and function access */
27 typedef void* KmppObj;
28 
29 typedef enum CfgType_e {
30     CFG_FUNC_TYPE_s32,
31     CFG_FUNC_TYPE_u32,
32     CFG_FUNC_TYPE_s64,
33     CFG_FUNC_TYPE_u64,
34     CFG_FUNC_TYPE_st,
35     CFG_FUNC_TYPE_ptr,
36     CFG_FUNC_TYPE_BUTT,
37 } CfgType;
38 
39 typedef struct MppCfgInfo_t {
40     CfgType             data_type;
41     /* update flag info 32bit */
42     RK_U32              flag_offset;
43     /* data access info */
44     RK_U32              data_offset;
45     RK_S32              data_size;
46 } MppCfgInfo;
47 
48 /*
49  * kernel - userspace transaction trie node ctx info (64 bit) definition
50  *
51  * +------+--------------------+---------------------------+
52  * | 8bit |       24 bit       |          32 bit           |
53  * +------+--------------------+---------------------------+
54  *
55  * bit 0~3 - 4-bit entry type (EntryType)
56  * 0 - invalid entry
57  * 1 - trie self info node
58  * 2 - access location table node
59  * 3 - ioctl cmd node
60  *
61  * bit 4~7 - 4-bit entry flag (EntryFlag) for different entry type
62  */
63 typedef enum EntryType_e {
64     ENTRY_TYPE_NONE     = 0x0,  /* invalid entry type */
65     ENTRY_TYPE_VAL      = 0x1,  /* 32-bit value  */
66     ENTRY_TYPE_STR      = 0x2,  /* string info property */
67     ENTRY_TYPE_LOC_TBL  = 0x3,  /* entry location table */
68     ENTRY_TYPE_BUTT,
69 } EntryType;
70 
71 /*
72  * 4-bit extention flag for different entry property
73  * EntryValFlag     - for ENTRY_TYPE_VAL
74  * EntryValFlag     - for ENTRY_TYPE_STR
75  * EntryLocTblFlag  - for ENTRY_TYPE_LOC_TBL
76  */
77 typedef enum EntryValFlag_e {
78     /*
79      * 0 - value is unsigned value
80      * 1 - value is signed value
81      */
82     VALUE_SIGNED        = 0x1,
83 } EntryValFlag;
84 
85 typedef enum EntryValUsage_e {
86     VALUE_NORMAL        = 0x0,
87 
88     VALUE_TRIE          = 0x10,
89     /* trie info value */
90     VALUE_TRIE_INFO     = (VALUE_TRIE + 1),
91     /* trie offset from the trie root */
92     VALUE_TRIE_OFFSET   = (VALUE_TRIE + 2),
93 
94     /* ioctl cmd */
95     VALUE_IOCTL_CMD     = 0x20,
96 } EntryValUsage;
97 
98 typedef enum EntryStrFlag_e {
99     STRING_NORMAL       = 0x0,
100     /* string is trie self info */
101     STRING_TRIE         = 0x1,
102 } EntryStrFlag;
103 
104 typedef enum EntryLocTblFlag_e {
105     /*
106      * bit 4    - element can be accessed by kernel
107      * bit 5    - element can be accessed by userspace
108      * bit 6    - element is read-only
109      */
110     LOCTBL_KERNEL       = 0x1,
111     LOCTBL_USERSPACE    = 0x2,
112     LOCTBL_READONLY     = 0x4,
113 } EntryLocTblFlag;
114 
115 typedef enum ElemType_e {
116     /* commaon fix size value */
117     ELEM_TYPE_FIX       = 0x0,
118     ELEM_TYPE_s32       = (ELEM_TYPE_FIX + 0),
119     ELEM_TYPE_u32       = (ELEM_TYPE_FIX + 1),
120     ELEM_TYPE_s64       = (ELEM_TYPE_FIX + 2),
121     ELEM_TYPE_u64       = (ELEM_TYPE_FIX + 3),
122     /* pointer type stored by 64-bit */
123     ELEM_TYPE_ptr       = (ELEM_TYPE_FIX + 4),
124     /* value only structure */
125     ELEM_TYPE_st        = (ELEM_TYPE_FIX + 5),
126 
127     /* kernel and userspace share data */
128     ELEM_TYPE_SHARE     = 0x6,
129     /* share memory between kernel and userspace */
130     ELEM_TYPE_shm       = (ELEM_TYPE_SHARE + 0),
131 
132     /* kernel access only data */
133     ELEM_TYPE_KERNEL    = 0x8,
134     /* kenrel object poineter */
135     ELEM_TYPE_kobj      = (ELEM_TYPE_KERNEL + 0),
136     /* kenrel normal data poineter */
137     ELEM_TYPE_kptr      = (ELEM_TYPE_KERNEL + 1),
138     /* kernel function poineter */
139     ELEM_TYPE_kfp       = (ELEM_TYPE_KERNEL + 2),
140 
141     /* userspace access only data */
142     ELEM_TYPE_USER      = 0xc,
143     /* userspace object poineter */
144     ELEM_TYPE_uobj      = (ELEM_TYPE_USER + 0),
145     /* userspace normal data poineter */
146     ELEM_TYPE_uptr      = (ELEM_TYPE_USER + 1),
147     /* userspace function poineter */
148     ELEM_TYPE_ufp       = (ELEM_TYPE_USER + 2),
149 
150     ELEM_TYPE_BUTT      = 0xf,
151 } ElemType;
152 
153 typedef union KmppEntry_u {
154     rk_u64                  val;
155     union {
156         EntryType           type            : 4;
157         struct {
158             EntryType       prop            : 4;
159             EntryValFlag    flag            : 4;
160             EntryValUsage   usage           : 8;
161             rk_u32          reserve         : 16;
162             rk_u32          val;
163         } v;
164         struct {
165             EntryType       prop            : 4;
166             EntryValFlag    flag            : 4;
167             rk_u32          len             : 24;
168             rk_u32          offset;
169         } str;
170         struct {
171             EntryType       type            : 4;
172             EntryLocTblFlag flag            : 4;
173             ElemType        elem_type       : 8;
174             rk_u16          elem_size;
175             rk_u16          elem_offset;
176             rk_u16          flag_offset;    /* define by ElemFlagType */
177         } tbl;
178     };
179 } KmppEntry;
180 
181 #endif /*__MPP_INTERNAL_H__*/
182