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