xref: /rockchip-linux_mpp/kmpp/base/kmpp_obj.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define  MODULE_TAG "kmpp_obj"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <linux/types.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include <string.h>
11*437bfbebSnyanmisaka #include <sys/ioctl.h>
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #include "mpp_env.h"
14*437bfbebSnyanmisaka #include "mpp_list.h"
15*437bfbebSnyanmisaka #include "mpp_lock.h"
16*437bfbebSnyanmisaka #include "mpp_debug.h"
17*437bfbebSnyanmisaka #include "mpp_common.h"
18*437bfbebSnyanmisaka #include "mpp_mem_pool.h"
19*437bfbebSnyanmisaka #include "mpp_singleton.h"
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_trie.h"
22*437bfbebSnyanmisaka #include "mpp_cfg_io.h"
23*437bfbebSnyanmisaka #include "kmpp_ioc.h"
24*437bfbebSnyanmisaka #include "kmpp_obj_impl.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #define KMPP_SHM_IOC_MAGIC              'm'
27*437bfbebSnyanmisaka #define KMPP_SHM_IOC_QUERY_INFO         _IOW(KMPP_SHM_IOC_MAGIC, 1, unsigned int)
28*437bfbebSnyanmisaka #define KMPP_SHM_IOC_RELEASE_INFO       _IOW(KMPP_SHM_IOC_MAGIC, 2, unsigned int)
29*437bfbebSnyanmisaka #define KMPP_SHM_IOC_GET_SHM            _IOW(KMPP_SHM_IOC_MAGIC, 3, unsigned int)
30*437bfbebSnyanmisaka #define KMPP_SHM_IOC_PUT_SHM            _IOW(KMPP_SHM_IOC_MAGIC, 4, unsigned int)
31*437bfbebSnyanmisaka #define KMPP_SHM_IOC_DUMP               _IOW(KMPP_SHM_IOC_MAGIC, 5, unsigned int)
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #define KMPP_IOCTL_IOC_MAGIC            'i'
34*437bfbebSnyanmisaka #define KMPP_IOCTL_IOC_QUERY_INFO       _IOW(KMPP_IOCTL_IOC_MAGIC, 1, unsigned int)
35*437bfbebSnyanmisaka #define KMPP_IOCTL_IOC_PROC             _IOW(KMPP_IOCTL_IOC_MAGIC, 2, unsigned int)
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka #define OBJ_DBG_FLOW                    (0x00000001)
38*437bfbebSnyanmisaka #define OBJ_DBG_SHARE                   (0x00000002)
39*437bfbebSnyanmisaka #define OBJ_DBG_ENTRY                   (0x00000004)
40*437bfbebSnyanmisaka #define OBJ_DBG_POOL                    (0x00000008)
41*437bfbebSnyanmisaka #define OBJ_DBG_IOCTL                   (0x00000010)
42*437bfbebSnyanmisaka #define OBJ_DBG_UPDATE                  (0x00000020)
43*437bfbebSnyanmisaka #define OBJ_DBG_SET                     (0x00000040)
44*437bfbebSnyanmisaka #define OBJ_DBG_GET                     (0x00000080)
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka #define obj_dbg(flag, fmt, ...)         _mpp_dbg(kmpp_obj_debug, flag, fmt, ## __VA_ARGS__)
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka #define obj_dbg_flow(fmt, ...)          obj_dbg(OBJ_DBG_FLOW, fmt, ## __VA_ARGS__)
49*437bfbebSnyanmisaka #define obj_dbg_share(fmt, ...)         obj_dbg(OBJ_DBG_SHARE, fmt, ## __VA_ARGS__)
50*437bfbebSnyanmisaka #define obj_dbg_entry(fmt, ...)         obj_dbg(OBJ_DBG_ENTRY, fmt, ## __VA_ARGS__)
51*437bfbebSnyanmisaka #define obj_dbg_pool(fmt, ...)          obj_dbg(OBJ_DBG_POOL, fmt, ## __VA_ARGS__)
52*437bfbebSnyanmisaka #define obj_dbg_ioctl(fmt, ...)         obj_dbg(OBJ_DBG_IOCTL, fmt, ## __VA_ARGS__)
53*437bfbebSnyanmisaka #define obj_dbg_update(fmt, ...)        obj_dbg(OBJ_DBG_UPDATE, fmt, ## __VA_ARGS__)
54*437bfbebSnyanmisaka #define obj_dbg_set(fmt, ...)           obj_dbg(OBJ_DBG_SET, fmt, ## __VA_ARGS__)
55*437bfbebSnyanmisaka #define obj_dbg_get(fmt, ...)           obj_dbg(OBJ_DBG_GET, fmt, ## __VA_ARGS__)
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka #define U64_TO_PTR(ptr)                 ((void *)(intptr_t)(ptr))
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka #define ENTRY_TO_PTR(tbl, entry)        (((char *)entry) + tbl->tbl.elem_offset)
60*437bfbebSnyanmisaka #define ENTRY_TO_s32_PTR(tbl, entry)    ((rk_s32 *)ENTRY_TO_PTR(tbl, entry))
61*437bfbebSnyanmisaka #define ENTRY_TO_u32_PTR(tbl, entry)    ((rk_u32 *)ENTRY_TO_PTR(tbl, entry))
62*437bfbebSnyanmisaka #define ENTRY_TO_s64_PTR(tbl, entry)    ((rk_s64 *)ENTRY_TO_PTR(tbl, entry))
63*437bfbebSnyanmisaka #define ENTRY_TO_u64_PTR(tbl, entry)    ((rk_u64 *)ENTRY_TO_PTR(tbl, entry))
64*437bfbebSnyanmisaka #define ENTRY_TO_obj_PTR(tbl, entry)    ((KmppObj *)ENTRY_TO_PTR(tbl, entry))
65*437bfbebSnyanmisaka #define ENTRY_TO_ptr_PTR(tbl, entry)    ((void **)ENTRY_TO_PTR(tbl, entry))
66*437bfbebSnyanmisaka #define ENTRY_TO_fp_PTR(tbl, entry)     ((void **)ENTRY_TO_PTR(tbl, entry))
67*437bfbebSnyanmisaka #define ENTRY_TO_st_PTR(tbl, entry)     ((void *)ENTRY_TO_PTR(tbl, entry))
68*437bfbebSnyanmisaka #define ENTRY_TO_shm_PTR(tbl, entry)    ((void *)ENTRY_TO_PTR(tbl, entry))
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka /* 32bit unsigned long pointer */
71*437bfbebSnyanmisaka #define ELEM_FLAG_U32_POS(offset)       (((offset) & (~31)) / 8)
72*437bfbebSnyanmisaka #define ELEM_FLAG_BIT_POS(offset)       ((offset) & 31)
73*437bfbebSnyanmisaka #define ENTRY_TO_FLAG_PTR(e, entry)     ((rk_ul *)((rk_u8 *)entry + ELEM_FLAG_U32_POS(e->tbl.flag_offset)))
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka #define ENTRY_SET_FLAG(e, entry) \
76*437bfbebSnyanmisaka     *ENTRY_TO_FLAG_PTR(e, entry) |= 1ul << (ELEM_FLAG_BIT_POS(e->tbl.flag_offset))
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka #define ENTRY_CLR_FLAG(e, entry) \
79*437bfbebSnyanmisaka     *ENTRY_TO_FLAG_PTR(e, entry) &= ~(1ul << (ELEM_FLAG_BIT_POS(e->tbl.flag_offset)))
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka #define ENTRY_TEST_FLAG(e, entry) \
82*437bfbebSnyanmisaka     (*ENTRY_TO_FLAG_PTR(e, entry) & 1ul << (ELEM_FLAG_BIT_POS(e->tbl.flag_offset))) ? 1 : 0
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka typedef struct KmppShmReq_t {
85*437bfbebSnyanmisaka     /* shm_name     - NULL name addresss for shm direct allocation */
86*437bfbebSnyanmisaka     __u64           shm_name;
87*437bfbebSnyanmisaka     /* shm_size     - share memory size for shm direct allocation */
88*437bfbebSnyanmisaka     __u32           shm_size;
89*437bfbebSnyanmisaka     /* shm_flag     - share memory allocation flags */
90*437bfbebSnyanmisaka     __u32           shm_flag;
91*437bfbebSnyanmisaka } KmppShmReq;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka /* kernel object share memory get / put ioctl data */
94*437bfbebSnyanmisaka typedef struct KmppObjIocArg_t {
95*437bfbebSnyanmisaka     /* address array element count */
96*437bfbebSnyanmisaka     __u32       count;
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka     /* flag for batch operation */
99*437bfbebSnyanmisaka     __u32       flag;
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka     /*
102*437bfbebSnyanmisaka      * at KMPP_SHM_IOC_GET_SHM
103*437bfbebSnyanmisaka      * name_uaddr   - kernel object name in userspace address
104*437bfbebSnyanmisaka      * obj_sptr     - kernel object userspace / kernel address of KmppShmPtr
105*437bfbebSnyanmisaka      *
106*437bfbebSnyanmisaka      * at KMPP_SHM_IOC_PUT_SHM
107*437bfbebSnyanmisaka      * obj_sptr     - kernel object userspace / kernel address of KmppShmPtr
108*437bfbebSnyanmisaka      */
109*437bfbebSnyanmisaka     union {
110*437bfbebSnyanmisaka         __u64       name_uaddr[0];
111*437bfbebSnyanmisaka         /* ioctl object userspace / kernel address */
112*437bfbebSnyanmisaka         KmppShmPtr  obj_sptr[0];
113*437bfbebSnyanmisaka         KmppShmReq  shm_req[0];
114*437bfbebSnyanmisaka     };
115*437bfbebSnyanmisaka } KmppObjIocArg;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka typedef struct KmppObjDefImpl_t {
118*437bfbebSnyanmisaka     /* userspace objdef */
119*437bfbebSnyanmisaka     MppCfgObj cfg;
120*437bfbebSnyanmisaka     MppMemPool pool;
121*437bfbebSnyanmisaka     /* object define from kernel or userspace */
122*437bfbebSnyanmisaka     rk_s32 is_kobj;
123*437bfbebSnyanmisaka     KmppObjInit init;
124*437bfbebSnyanmisaka     KmppObjDeinit deinit;
125*437bfbebSnyanmisaka     KmppObjPreset preset;
126*437bfbebSnyanmisaka     KmppObjDump dump;
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     /* comment data of userspace / kernel objdef */
129*437bfbebSnyanmisaka     MppTrie trie;
130*437bfbebSnyanmisaka     MppTrie ioctl;
131*437bfbebSnyanmisaka     /* objdef index in kernel (/dev/kmpp_objs) */
132*437bfbebSnyanmisaka     rk_s32 index;
133*437bfbebSnyanmisaka     /* objdef set index in objdefset for ioctl */
134*437bfbebSnyanmisaka     rk_s32 defs_idx;
135*437bfbebSnyanmisaka     rk_s32 ref_cnt;
136*437bfbebSnyanmisaka     /* private data size for priv in KmppObjImpl */
137*437bfbebSnyanmisaka     rk_s32 priv_size;
138*437bfbebSnyanmisaka     /* entry size for entry in KmppObjImpl */
139*437bfbebSnyanmisaka     rk_s32 entry_size;
140*437bfbebSnyanmisaka     rk_s32 flag_max_pos;
141*437bfbebSnyanmisaka     rk_s32 flag_offset;
142*437bfbebSnyanmisaka     /* entry size + flag size for entry in KmppObjImpl */
143*437bfbebSnyanmisaka     rk_s32 buf_size;
144*437bfbebSnyanmisaka     /* all size for sizeof(KmppObjImpl) + priv_size + entry_size + flag_size */
145*437bfbebSnyanmisaka     rk_s32 all_size;
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     /* properties */
148*437bfbebSnyanmisaka     rk_s32 disable_mismatch_log;
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     const char *name;
151*437bfbebSnyanmisaka } KmppObjDefImpl;
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka typedef struct KmppObjImpl_t {
154*437bfbebSnyanmisaka     const char *name;
155*437bfbebSnyanmisaka     /* class infomation link */
156*437bfbebSnyanmisaka     KmppObjDefImpl *def;
157*437bfbebSnyanmisaka     /* trie for fast access */
158*437bfbebSnyanmisaka     MppTrie trie;
159*437bfbebSnyanmisaka     void *priv;
160*437bfbebSnyanmisaka     KmppShmPtr *shm;
161*437bfbebSnyanmisaka     void *entry;
162*437bfbebSnyanmisaka } KmppObjImpl;
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka typedef struct KmppKtrieInfo_t {
165*437bfbebSnyanmisaka     rk_s32              fd;
166*437bfbebSnyanmisaka     MppTrie             trie;
167*437bfbebSnyanmisaka     void                *root;
168*437bfbebSnyanmisaka } KmppKtrieInfo;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka typedef struct KmppObjs_t {
171*437bfbebSnyanmisaka     KmppKtrieInfo       obj;
172*437bfbebSnyanmisaka     KmppKtrieInfo       ioc;
173*437bfbebSnyanmisaka     rk_s32              count;
174*437bfbebSnyanmisaka     rk_s32              entry_offset;
175*437bfbebSnyanmisaka     rk_s32              priv_offset;
176*437bfbebSnyanmisaka     rk_s32              name_offset;
177*437bfbebSnyanmisaka     KmppObjDefImpl      defs[0];
178*437bfbebSnyanmisaka } KmppObjs;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka static rk_u32 kmpp_obj_debug = 0;
181*437bfbebSnyanmisaka static KmppObjs *objs = NULL;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka #define get_objs(caller) \
184*437bfbebSnyanmisaka ({ \
185*437bfbebSnyanmisaka     KmppObjs *__tmp; \
186*437bfbebSnyanmisaka     if (objs) { \
187*437bfbebSnyanmisaka         __tmp = objs; \
188*437bfbebSnyanmisaka     } else { \
189*437bfbebSnyanmisaka         obj_dbg_flow("kmpp objs srv not init at %s\n", caller); \
190*437bfbebSnyanmisaka         __tmp = NULL; \
191*437bfbebSnyanmisaka     } \
192*437bfbebSnyanmisaka     __tmp; \
193*437bfbebSnyanmisaka })
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka #define get_objs_f() get_objs(__FUNCTION__)
196*437bfbebSnyanmisaka 
strof_elem_type(ElemType type)197*437bfbebSnyanmisaka const char *strof_elem_type(ElemType type)
198*437bfbebSnyanmisaka {
199*437bfbebSnyanmisaka     static const char *ELEM_TYPE_names[] = {
200*437bfbebSnyanmisaka         [ELEM_TYPE_s32]    = "s32",
201*437bfbebSnyanmisaka         [ELEM_TYPE_u32]    = "u32",
202*437bfbebSnyanmisaka         [ELEM_TYPE_s64]    = "s64",
203*437bfbebSnyanmisaka         [ELEM_TYPE_u64]    = "u64",
204*437bfbebSnyanmisaka         [ELEM_TYPE_ptr]    = "ptr",
205*437bfbebSnyanmisaka         [ELEM_TYPE_st]     = "struct",
206*437bfbebSnyanmisaka         [ELEM_TYPE_shm]    = "shm_ptr",
207*437bfbebSnyanmisaka         [ELEM_TYPE_kobj]   = "kobj",
208*437bfbebSnyanmisaka         [ELEM_TYPE_kptr]   = "kptr",
209*437bfbebSnyanmisaka         [ELEM_TYPE_kfp]    = "kfunc_ptr",
210*437bfbebSnyanmisaka         [ELEM_TYPE_uobj]   = "uobj",
211*437bfbebSnyanmisaka         [ELEM_TYPE_uptr]   = "uptr",
212*437bfbebSnyanmisaka         [ELEM_TYPE_ufp]    = "ufunc_ptr",
213*437bfbebSnyanmisaka     };
214*437bfbebSnyanmisaka     static const char *invalid_type_str = "invalid";
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     if (type & (~ELEM_TYPE_BUTT))
217*437bfbebSnyanmisaka         return invalid_type_str;
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     return ELEM_TYPE_names[type] ? ELEM_TYPE_names[type] : invalid_type_str;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka #define MPP_OBJ_ACCESS_IMPL(type, base_type, log_str) \
223*437bfbebSnyanmisaka     rk_s32 kmpp_obj_impl_set_##type(KmppEntry *tbl, void *entry, base_type val) \
224*437bfbebSnyanmisaka     { \
225*437bfbebSnyanmisaka         base_type *dst = ENTRY_TO_##type##_PTR(tbl, entry); \
226*437bfbebSnyanmisaka         base_type old = dst[0]; \
227*437bfbebSnyanmisaka         dst[0] = val; \
228*437bfbebSnyanmisaka         if (!tbl->tbl.flag_offset) { \
229*437bfbebSnyanmisaka             obj_dbg_set("%p + %x set " #type " change " #log_str " -> " #log_str "\n", entry, tbl->tbl.elem_offset, old, val); \
230*437bfbebSnyanmisaka         } else { \
231*437bfbebSnyanmisaka             if (old != val) { \
232*437bfbebSnyanmisaka                 obj_dbg_set("%p + %x set " #type " update " #log_str " -> " #log_str " flag %d\n", \
233*437bfbebSnyanmisaka                             entry, tbl->tbl.elem_offset, old, val, tbl->tbl.flag_offset); \
234*437bfbebSnyanmisaka                 ENTRY_SET_FLAG(tbl, entry); \
235*437bfbebSnyanmisaka             } else { \
236*437bfbebSnyanmisaka                 obj_dbg_set("%p + %x set " #type " keep   " #log_str "\n", entry, tbl->tbl.elem_offset, old); \
237*437bfbebSnyanmisaka             } \
238*437bfbebSnyanmisaka         } \
239*437bfbebSnyanmisaka         return rk_ok; \
240*437bfbebSnyanmisaka     } \
241*437bfbebSnyanmisaka     rk_s32 kmpp_obj_impl_get_##type(KmppEntry *tbl, void *entry, base_type *val) \
242*437bfbebSnyanmisaka     { \
243*437bfbebSnyanmisaka         if (tbl && tbl->tbl.elem_size) { \
244*437bfbebSnyanmisaka             base_type *src = ENTRY_TO_##type##_PTR(tbl, entry); \
245*437bfbebSnyanmisaka             obj_dbg_get("%p + %x get " #type " value  " #log_str "\n", entry, tbl->tbl.elem_offset, src[0]); \
246*437bfbebSnyanmisaka             val[0] = src[0]; \
247*437bfbebSnyanmisaka             return rk_ok; \
248*437bfbebSnyanmisaka         } \
249*437bfbebSnyanmisaka         return rk_nok; \
250*437bfbebSnyanmisaka     }
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(s32, rk_s32, % d)
253*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(u32, rk_u32, % u)
254*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(s64, rk_s64, % #llx)
255*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(u64, rk_u64, % #llx)
256*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(obj, KmppObj, % p)
257*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(ptr, void *, % p)
258*437bfbebSnyanmisaka MPP_OBJ_ACCESS_IMPL(fp, void *, % p)
259*437bfbebSnyanmisaka 
260*437bfbebSnyanmisaka #define MPP_OBJ_STRUCT_ACCESS_IMPL(type, base_type, log_str) \
261*437bfbebSnyanmisaka     rk_s32 kmpp_obj_impl_set_##type(KmppEntry *tbl, void *entry, base_type *val) \
262*437bfbebSnyanmisaka     { \
263*437bfbebSnyanmisaka         void *dst = ENTRY_TO_##type##_PTR(tbl, entry); \
264*437bfbebSnyanmisaka         if (!tbl->tbl.flag_offset) { \
265*437bfbebSnyanmisaka             /* simple copy */ \
266*437bfbebSnyanmisaka             obj_dbg_set("%p + %x set " #type " size %d change %p -> %p\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst, val); \
267*437bfbebSnyanmisaka             memcpy(dst, val, tbl->tbl.elem_size); \
268*437bfbebSnyanmisaka             return rk_ok; \
269*437bfbebSnyanmisaka         } \
270*437bfbebSnyanmisaka         /* copy with flag check and updata */ \
271*437bfbebSnyanmisaka         if (memcmp(dst, val, tbl->tbl.elem_size)) { \
272*437bfbebSnyanmisaka             obj_dbg_set("%p + %x set " #type " size %d update %p -> %p flag %d\n", \
273*437bfbebSnyanmisaka                         entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst, val, tbl->tbl.flag_offset); \
274*437bfbebSnyanmisaka             memcpy(dst, val, tbl->tbl.elem_size); \
275*437bfbebSnyanmisaka             ENTRY_SET_FLAG(tbl, entry); \
276*437bfbebSnyanmisaka         } else { \
277*437bfbebSnyanmisaka             obj_dbg_set("%p + %x set " #type " size %d keep   %p\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst); \
278*437bfbebSnyanmisaka         } \
279*437bfbebSnyanmisaka         return rk_ok; \
280*437bfbebSnyanmisaka     } \
281*437bfbebSnyanmisaka     rk_s32 kmpp_obj_impl_get_##type(KmppEntry *tbl, void *entry, base_type *val) \
282*437bfbebSnyanmisaka     { \
283*437bfbebSnyanmisaka         if (tbl && tbl->tbl.elem_size) { \
284*437bfbebSnyanmisaka             void *src = ENTRY_TO_##type##_PTR(tbl, entry); \
285*437bfbebSnyanmisaka             obj_dbg_get("%p + %x get " #type " size %d value  " #log_str "\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, src); \
286*437bfbebSnyanmisaka             memcpy(val, src, tbl->tbl.elem_size); \
287*437bfbebSnyanmisaka             return rk_ok; \
288*437bfbebSnyanmisaka         } \
289*437bfbebSnyanmisaka         return rk_nok; \
290*437bfbebSnyanmisaka     }
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka MPP_OBJ_STRUCT_ACCESS_IMPL(st, void, % p)
293*437bfbebSnyanmisaka MPP_OBJ_STRUCT_ACCESS_IMPL(shm, KmppShmPtr, % p)
294*437bfbebSnyanmisaka 
kmpp_ktrie_get(KmppKtrieInfo * info,const char * path,rk_ul cmd)295*437bfbebSnyanmisaka static rk_s32 kmpp_ktrie_get(KmppKtrieInfo *info, const char *path, rk_ul cmd)
296*437bfbebSnyanmisaka {
297*437bfbebSnyanmisaka     rk_s32 fd = open(path, O_RDWR);
298*437bfbebSnyanmisaka     MppTrie trie = NULL;
299*437bfbebSnyanmisaka     rk_u64 uaddr = 0;
300*437bfbebSnyanmisaka     void *root;
301*437bfbebSnyanmisaka     rk_s32 ret;
302*437bfbebSnyanmisaka 
303*437bfbebSnyanmisaka     info->fd = fd;
304*437bfbebSnyanmisaka     info->trie = NULL;
305*437bfbebSnyanmisaka     info->root = NULL;
306*437bfbebSnyanmisaka 
307*437bfbebSnyanmisaka     if (fd < 0) {
308*437bfbebSnyanmisaka         obj_dbg_flow("%s open failed ret fd %d\n", path, fd);
309*437bfbebSnyanmisaka         return rk_nok;
310*437bfbebSnyanmisaka     }
311*437bfbebSnyanmisaka 
312*437bfbebSnyanmisaka     ret = ioctl(fd, cmd, &uaddr);
313*437bfbebSnyanmisaka     if (ret < 0) {
314*437bfbebSnyanmisaka         obj_dbg_flow("%s ioctl failed ret %d\n", path, ret);
315*437bfbebSnyanmisaka         goto __ret;
316*437bfbebSnyanmisaka     }
317*437bfbebSnyanmisaka 
318*437bfbebSnyanmisaka     root = (void *)(intptr_t)uaddr;
319*437bfbebSnyanmisaka     obj_dbg_share("query fd %d root %p from kernel\n", fd, root);
320*437bfbebSnyanmisaka 
321*437bfbebSnyanmisaka     ret = mpp_trie_init_by_root(&trie, root);
322*437bfbebSnyanmisaka     if (ret || !trie) {
323*437bfbebSnyanmisaka         mpp_loge_f("init trie by root failed ret %d\n", ret);
324*437bfbebSnyanmisaka         goto __ret;
325*437bfbebSnyanmisaka     }
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     if (kmpp_obj_debug & OBJ_DBG_SHARE)
328*437bfbebSnyanmisaka         mpp_trie_dump_f(trie);
329*437bfbebSnyanmisaka 
330*437bfbebSnyanmisaka     info->trie = trie;
331*437bfbebSnyanmisaka     info->root = root;
332*437bfbebSnyanmisaka 
333*437bfbebSnyanmisaka __ret:
334*437bfbebSnyanmisaka     return rk_ok;
335*437bfbebSnyanmisaka }
336*437bfbebSnyanmisaka 
kmpp_ktrie_put(KmppKtrieInfo * info)337*437bfbebSnyanmisaka rk_s32 kmpp_ktrie_put(KmppKtrieInfo *info)
338*437bfbebSnyanmisaka {
339*437bfbebSnyanmisaka     if (info->fd >= 0) {
340*437bfbebSnyanmisaka         close(info->fd);
341*437bfbebSnyanmisaka         info->fd = -1;
342*437bfbebSnyanmisaka     }
343*437bfbebSnyanmisaka 
344*437bfbebSnyanmisaka     if (info->trie) {
345*437bfbebSnyanmisaka         mpp_trie_deinit(info->trie);
346*437bfbebSnyanmisaka         info->trie = NULL;
347*437bfbebSnyanmisaka     }
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     info->root = NULL;
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     return rk_ok;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka 
kmpp_objs_deinit(void)354*437bfbebSnyanmisaka static void kmpp_objs_deinit(void)
355*437bfbebSnyanmisaka {
356*437bfbebSnyanmisaka     KmppObjs *p = MPP_FETCH_AND(&objs, NULL);
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     obj_dbg_flow("kmpp_objs_deinit objs %p\n", p);
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka     if (p) {
361*437bfbebSnyanmisaka         rk_s32 i;
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka         for (i = 0; i < p->count; i++) {
364*437bfbebSnyanmisaka             KmppObjDefImpl *impl = &p->defs[i];
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka             if (impl->pool) {
367*437bfbebSnyanmisaka                 mpp_mem_pool_deinit_f(impl->pool);
368*437bfbebSnyanmisaka                 impl->pool = NULL;
369*437bfbebSnyanmisaka             }
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka             if (impl->trie) {
372*437bfbebSnyanmisaka                 mpp_trie_deinit(impl->trie);
373*437bfbebSnyanmisaka                 impl->trie = NULL;
374*437bfbebSnyanmisaka             }
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka             if (impl->ioctl) {
377*437bfbebSnyanmisaka                 mpp_trie_deinit(impl->ioctl);
378*437bfbebSnyanmisaka                 impl->ioctl = NULL;
379*437bfbebSnyanmisaka             }
380*437bfbebSnyanmisaka         }
381*437bfbebSnyanmisaka 
382*437bfbebSnyanmisaka         kmpp_ktrie_put(&p->obj);
383*437bfbebSnyanmisaka         kmpp_ktrie_put(&p->ioc);
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka         mpp_free(p);
386*437bfbebSnyanmisaka     }
387*437bfbebSnyanmisaka }
388*437bfbebSnyanmisaka 
kmpp_objs_init(void)389*437bfbebSnyanmisaka static void kmpp_objs_init(void)
390*437bfbebSnyanmisaka {
391*437bfbebSnyanmisaka     static const char *dev_obj = "/dev/kmpp_objs";
392*437bfbebSnyanmisaka     static const char *dev_ioc = "/dev/kmpp_ioctl";
393*437bfbebSnyanmisaka     KmppObjs *p = objs;
394*437bfbebSnyanmisaka     KmppKtrieInfo obj;
395*437bfbebSnyanmisaka     KmppKtrieInfo ioc;
396*437bfbebSnyanmisaka     void *root = NULL;
397*437bfbebSnyanmisaka     MppTrie trie = NULL;
398*437bfbebSnyanmisaka     MppTrieInfo *info;
399*437bfbebSnyanmisaka     rk_s32 offset;
400*437bfbebSnyanmisaka     rk_s32 count;
401*437bfbebSnyanmisaka     rk_s32 ret;
402*437bfbebSnyanmisaka     rk_s32 i;
403*437bfbebSnyanmisaka 
404*437bfbebSnyanmisaka     if (p) {
405*437bfbebSnyanmisaka         obj_dbg_flow("objs already inited %p\n", p);
406*437bfbebSnyanmisaka         kmpp_objs_deinit();
407*437bfbebSnyanmisaka         p = NULL;
408*437bfbebSnyanmisaka     }
409*437bfbebSnyanmisaka 
410*437bfbebSnyanmisaka     mpp_env_get_u32("kmpp_obj_debug", &kmpp_obj_debug, 0);
411*437bfbebSnyanmisaka 
412*437bfbebSnyanmisaka     /* skip kmpp_ioctls failure and call ioc init first to avoid deinit crash */
413*437bfbebSnyanmisaka     kmpp_ktrie_get(&ioc, dev_ioc, KMPP_IOCTL_IOC_QUERY_INFO);
414*437bfbebSnyanmisaka 
415*437bfbebSnyanmisaka     ret = kmpp_ktrie_get(&obj, dev_obj, KMPP_SHM_IOC_QUERY_INFO);
416*437bfbebSnyanmisaka     if (ret < 0)
417*437bfbebSnyanmisaka         goto __failed;
418*437bfbebSnyanmisaka 
419*437bfbebSnyanmisaka     trie = obj.trie;
420*437bfbebSnyanmisaka     root = obj.root;
421*437bfbebSnyanmisaka     info = mpp_trie_get_info(trie, "__count");
422*437bfbebSnyanmisaka     count = info ? *(rk_s32 *)mpp_trie_info_ctx(info) : 0;
423*437bfbebSnyanmisaka 
424*437bfbebSnyanmisaka     p = mpp_calloc_size(KmppObjs, sizeof(KmppObjs) + sizeof(KmppObjDefImpl) * count);
425*437bfbebSnyanmisaka     if (!p) {
426*437bfbebSnyanmisaka         mpp_loge_f("alloc objs failed\n");
427*437bfbebSnyanmisaka         goto __failed;
428*437bfbebSnyanmisaka     }
429*437bfbebSnyanmisaka 
430*437bfbebSnyanmisaka     p->obj = obj;
431*437bfbebSnyanmisaka     p->ioc = ioc;
432*437bfbebSnyanmisaka     p->count = count;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     info = mpp_trie_get_info(trie, "__offset");
435*437bfbebSnyanmisaka     offset = info ? *(rk_s32 *)mpp_trie_info_ctx(info) : 0;
436*437bfbebSnyanmisaka     p->entry_offset = offset;
437*437bfbebSnyanmisaka     info = mpp_trie_get_info(trie, "__priv");
438*437bfbebSnyanmisaka     offset = info ? *(rk_s32 *)mpp_trie_info_ctx(info) : 0;
439*437bfbebSnyanmisaka     p->priv_offset = offset;
440*437bfbebSnyanmisaka     info = mpp_trie_get_info(trie, "__name_offset");
441*437bfbebSnyanmisaka     offset = info ? *(rk_s32 *)mpp_trie_info_ctx(info) : 0;
442*437bfbebSnyanmisaka     p->name_offset = offset;
443*437bfbebSnyanmisaka 
444*437bfbebSnyanmisaka     obj_dbg_share("count %d object offsets - priv %d name %d entry %d\n", count,
445*437bfbebSnyanmisaka                   p->priv_offset, p->name_offset, p->entry_offset);
446*437bfbebSnyanmisaka 
447*437bfbebSnyanmisaka     info = mpp_trie_get_info_first(trie);
448*437bfbebSnyanmisaka 
449*437bfbebSnyanmisaka     for (i = 0; i < count && info; i++) {
450*437bfbebSnyanmisaka         KmppObjDefImpl *impl = &p->defs[i];
451*437bfbebSnyanmisaka         const char *name = mpp_trie_info_name(info);
452*437bfbebSnyanmisaka         MppTrie trie_objdef = NULL;
453*437bfbebSnyanmisaka         MppTrieInfo *info_objdef;
454*437bfbebSnyanmisaka 
455*437bfbebSnyanmisaka         offset = *(rk_s32 *)mpp_trie_info_ctx(info);
456*437bfbebSnyanmisaka         ret = mpp_trie_init_by_root(&trie_objdef, root + offset);
457*437bfbebSnyanmisaka         if (!trie_objdef) {
458*437bfbebSnyanmisaka             mpp_loge_f("init %d:%d obj trie failed\n", count, i);
459*437bfbebSnyanmisaka             break;
460*437bfbebSnyanmisaka         }
461*437bfbebSnyanmisaka 
462*437bfbebSnyanmisaka         impl->trie = trie_objdef;
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka         info_objdef = mpp_trie_get_info(trie_objdef, "__index");
465*437bfbebSnyanmisaka         impl->index = info_objdef ? *(rk_s32 *)mpp_trie_info_ctx(info_objdef) : -1;
466*437bfbebSnyanmisaka         impl->defs_idx = info->index;
467*437bfbebSnyanmisaka         info_objdef = mpp_trie_get_info(trie_objdef, "__size");
468*437bfbebSnyanmisaka         impl->entry_size = info_objdef ? *(rk_s32 *)mpp_trie_info_ctx(info_objdef) : 0;
469*437bfbebSnyanmisaka         impl->name = name;
470*437bfbebSnyanmisaka         impl->is_kobj = 1;
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka         info = mpp_trie_get_info_next(trie, info);
473*437bfbebSnyanmisaka         obj_dbg_share("%2d:%2d - %s offset %d entry_size %d\n",
474*437bfbebSnyanmisaka                       count, i, name, offset, impl->entry_size);
475*437bfbebSnyanmisaka 
476*437bfbebSnyanmisaka         obj_dbg_flow("objdef %-16s in kernel  size %4d\n",
477*437bfbebSnyanmisaka                      name, impl->entry_size);
478*437bfbebSnyanmisaka 
479*437bfbebSnyanmisaka         /* check ioctl functions */
480*437bfbebSnyanmisaka         if (ioc.root) {
481*437bfbebSnyanmisaka             MppTrieInfo *ioc_info = mpp_trie_get_info(ioc.trie, name);
482*437bfbebSnyanmisaka 
483*437bfbebSnyanmisaka             if (ioc_info) {
484*437bfbebSnyanmisaka                 rk_s32 ioc_offset = *(rk_s32 *)mpp_trie_info_ctx(ioc_info);
485*437bfbebSnyanmisaka 
486*437bfbebSnyanmisaka                 mpp_trie_init_by_root(&impl->ioctl, ioc.root + ioc_offset);
487*437bfbebSnyanmisaka                 if (impl->ioctl)
488*437bfbebSnyanmisaka                     obj_dbg_flow("objdef %-16s in kernel  support ioctl %d\n",
489*437bfbebSnyanmisaka                                  name, mpp_trie_get_info_count(impl->ioctl));
490*437bfbebSnyanmisaka             }
491*437bfbebSnyanmisaka         }
492*437bfbebSnyanmisaka     }
493*437bfbebSnyanmisaka 
494*437bfbebSnyanmisaka     objs = p;
495*437bfbebSnyanmisaka 
496*437bfbebSnyanmisaka     return;
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka __failed:
499*437bfbebSnyanmisaka     kmpp_ktrie_put(&obj);
500*437bfbebSnyanmisaka     kmpp_ktrie_put(&ioc);
501*437bfbebSnyanmisaka }
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka MPP_SINGLETON(MPP_SGLN_KOBJ, kmpp_obj, kmpp_objs_init, kmpp_objs_deinit);
504*437bfbebSnyanmisaka 
kmpp_objdef_put(KmppObjDef def)505*437bfbebSnyanmisaka rk_s32 kmpp_objdef_put(KmppObjDef def)
506*437bfbebSnyanmisaka {
507*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
508*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka     if (impl) {
511*437bfbebSnyanmisaka         rk_s32 release = 0;
512*437bfbebSnyanmisaka 
513*437bfbebSnyanmisaka         if (impl->is_kobj) {
514*437bfbebSnyanmisaka             impl->ref_cnt--;
515*437bfbebSnyanmisaka             if (!impl->ref_cnt)
516*437bfbebSnyanmisaka                 release = 1;
517*437bfbebSnyanmisaka             else
518*437bfbebSnyanmisaka                 mpp_loge_f("objdef %-16s non-zero ref_cnt %d\n",
519*437bfbebSnyanmisaka                            impl->name, impl->ref_cnt);
520*437bfbebSnyanmisaka         } else {
521*437bfbebSnyanmisaka             if (impl->cfg) {
522*437bfbebSnyanmisaka                 mpp_cfg_put_all(impl->cfg);
523*437bfbebSnyanmisaka                 impl->cfg = NULL;
524*437bfbebSnyanmisaka             }
525*437bfbebSnyanmisaka             release = 1;
526*437bfbebSnyanmisaka         }
527*437bfbebSnyanmisaka 
528*437bfbebSnyanmisaka         if (release) {
529*437bfbebSnyanmisaka             if (impl->pool) {
530*437bfbebSnyanmisaka                 mpp_mem_pool_deinit_f(impl->pool);
531*437bfbebSnyanmisaka                 impl->pool = NULL;
532*437bfbebSnyanmisaka             }
533*437bfbebSnyanmisaka 
534*437bfbebSnyanmisaka             if (impl->trie) {
535*437bfbebSnyanmisaka                 mpp_trie_deinit(impl->trie);
536*437bfbebSnyanmisaka                 impl->trie = NULL;
537*437bfbebSnyanmisaka             }
538*437bfbebSnyanmisaka         }
539*437bfbebSnyanmisaka 
540*437bfbebSnyanmisaka         if (!impl->is_kobj)
541*437bfbebSnyanmisaka             mpp_free(impl);
542*437bfbebSnyanmisaka 
543*437bfbebSnyanmisaka         ret = rk_ok;
544*437bfbebSnyanmisaka     }
545*437bfbebSnyanmisaka 
546*437bfbebSnyanmisaka     return ret;
547*437bfbebSnyanmisaka }
548*437bfbebSnyanmisaka 
kmpp_objdef_register(KmppObjDef * def,rk_s32 priv_size,rk_s32 size,const char * name)549*437bfbebSnyanmisaka rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 priv_size, rk_s32 size, const char *name)
550*437bfbebSnyanmisaka {
551*437bfbebSnyanmisaka     KmppObjDefImpl *impl = NULL;
552*437bfbebSnyanmisaka     rk_s32 name_len;
553*437bfbebSnyanmisaka     rk_s32 name_buf_size;
554*437bfbebSnyanmisaka     char *buf;
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka     if (!def || !name || size <= 0) {
557*437bfbebSnyanmisaka         mpp_loge_f("invalid param def %p size %d name %p\n", def, size, name);
558*437bfbebSnyanmisaka         return rk_nok;
559*437bfbebSnyanmisaka     }
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka     *def = NULL;
562*437bfbebSnyanmisaka     name_len = strlen(name);
563*437bfbebSnyanmisaka     name_buf_size = MPP_ALIGN(name_len + 1, sizeof(rk_s32));
564*437bfbebSnyanmisaka     impl = mpp_calloc_size(KmppObjDefImpl, sizeof(KmppObjDefImpl) + name_buf_size);
565*437bfbebSnyanmisaka     if (!impl) {
566*437bfbebSnyanmisaka         mpp_loge_f("alloc objdef size %d failed\n", sizeof(KmppObjDefImpl) + name_buf_size);
567*437bfbebSnyanmisaka         return rk_nok;
568*437bfbebSnyanmisaka     }
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka     buf = (char *)(impl + 1);
571*437bfbebSnyanmisaka     memcpy(buf, name, name_len);
572*437bfbebSnyanmisaka     buf[name_len] = '\0';
573*437bfbebSnyanmisaka     impl->name = buf;
574*437bfbebSnyanmisaka     impl->priv_size = MPP_ALIGN(priv_size, sizeof(void *));
575*437bfbebSnyanmisaka     impl->entry_size = size;
576*437bfbebSnyanmisaka     impl->buf_size = size + sizeof(KmppObjImpl);
577*437bfbebSnyanmisaka     impl->ref_cnt = 1;
578*437bfbebSnyanmisaka 
579*437bfbebSnyanmisaka     obj_dbg_flow("objdef %-16s registered size %4d\n", name, size, impl);
580*437bfbebSnyanmisaka 
581*437bfbebSnyanmisaka     *def = impl;
582*437bfbebSnyanmisaka 
583*437bfbebSnyanmisaka     return rk_ok;
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka 
kmpp_objdef_find(KmppObjDef * def,const char * name)586*437bfbebSnyanmisaka rk_s32 kmpp_objdef_find(KmppObjDef *def, const char *name)
587*437bfbebSnyanmisaka {
588*437bfbebSnyanmisaka     KmppObjs *p = get_objs_f();
589*437bfbebSnyanmisaka     MppTrieInfo *info = NULL;
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka     if (!def || !name) {
592*437bfbebSnyanmisaka         mpp_loge_f("invalid param def %p name %p objs %p\n", def, name, p);
593*437bfbebSnyanmisaka         return rk_nok;
594*437bfbebSnyanmisaka     }
595*437bfbebSnyanmisaka 
596*437bfbebSnyanmisaka     *def = NULL;
597*437bfbebSnyanmisaka 
598*437bfbebSnyanmisaka     if (!p)
599*437bfbebSnyanmisaka         return rk_nok;
600*437bfbebSnyanmisaka 
601*437bfbebSnyanmisaka     info = mpp_trie_get_info(p->obj.trie, name);
602*437bfbebSnyanmisaka     if (!info) {
603*437bfbebSnyanmisaka         obj_dbg_flow("objdef %-16s can not be found in kernel\n", name);
604*437bfbebSnyanmisaka         return rk_nok;
605*437bfbebSnyanmisaka     }
606*437bfbebSnyanmisaka 
607*437bfbebSnyanmisaka     if (p->count > 0 && info->index < (RK_U32)p->count) {
608*437bfbebSnyanmisaka         *def = &p->defs[info->index];
609*437bfbebSnyanmisaka         return rk_ok;
610*437bfbebSnyanmisaka     }
611*437bfbebSnyanmisaka 
612*437bfbebSnyanmisaka     mpp_loge_f("objdef %-16s is found but with invalid index %d max %d\n",
613*437bfbebSnyanmisaka                name, info->index, p->count);
614*437bfbebSnyanmisaka 
615*437bfbebSnyanmisaka     return rk_nok;
616*437bfbebSnyanmisaka }
617*437bfbebSnyanmisaka 
create_objdef_mem_pool(KmppObjDefImpl * impl)618*437bfbebSnyanmisaka static rk_s32 create_objdef_mem_pool(KmppObjDefImpl *impl)
619*437bfbebSnyanmisaka {
620*437bfbebSnyanmisaka     rk_s32 old_size = impl->all_size;
621*437bfbebSnyanmisaka 
622*437bfbebSnyanmisaka     /* When last entry finish update and create memory pool */
623*437bfbebSnyanmisaka     if (impl->flag_max_pos) {
624*437bfbebSnyanmisaka         rk_s32 flag_max_pos = MPP_ALIGN(impl->flag_max_pos, 8);
625*437bfbebSnyanmisaka         rk_s32 flag_size = flag_max_pos / 8;
626*437bfbebSnyanmisaka 
627*437bfbebSnyanmisaka         impl->flag_offset = impl->entry_size;
628*437bfbebSnyanmisaka         impl->flag_max_pos = flag_max_pos;
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka         flag_size -= impl->entry_size;
631*437bfbebSnyanmisaka         flag_size = MPP_ALIGN(flag_size, 4);
632*437bfbebSnyanmisaka 
633*437bfbebSnyanmisaka         impl->buf_size = impl->entry_size + flag_size;
634*437bfbebSnyanmisaka     }
635*437bfbebSnyanmisaka 
636*437bfbebSnyanmisaka     impl->all_size = sizeof(KmppObjImpl) + impl->priv_size + impl->buf_size;
637*437bfbebSnyanmisaka 
638*437bfbebSnyanmisaka     obj_dbg_pool("objdef %-16s entry size %4d buf size %4d -> %4d\n", impl->name,
639*437bfbebSnyanmisaka                  impl->entry_size, old_size, impl->all_size);
640*437bfbebSnyanmisaka 
641*437bfbebSnyanmisaka     impl->pool = mpp_mem_pool_init_f(impl->name, impl->all_size);
642*437bfbebSnyanmisaka     if (!impl->pool)
643*437bfbebSnyanmisaka         mpp_loge_f("get mem pool size %d failed\n", impl->all_size);
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka     return impl->pool ? rk_ok : rk_nok;
646*437bfbebSnyanmisaka }
647*437bfbebSnyanmisaka 
kmpp_objdef_get(KmppObjDef * def,rk_s32 priv_size,const char * name)648*437bfbebSnyanmisaka rk_s32 kmpp_objdef_get(KmppObjDef *def, rk_s32 priv_size, const char *name)
649*437bfbebSnyanmisaka {
650*437bfbebSnyanmisaka     KmppObjDefImpl *impl = NULL;
651*437bfbebSnyanmisaka 
652*437bfbebSnyanmisaka     if (!def || !name) {
653*437bfbebSnyanmisaka         mpp_loge_f("invalid param def %p name %p\n", def, name);
654*437bfbebSnyanmisaka         return rk_nok;
655*437bfbebSnyanmisaka     }
656*437bfbebSnyanmisaka 
657*437bfbebSnyanmisaka     if (kmpp_objdef_find((KmppObjDef *)&impl, name)) {
658*437bfbebSnyanmisaka         *def = NULL;
659*437bfbebSnyanmisaka         return rk_nok;
660*437bfbebSnyanmisaka     }
661*437bfbebSnyanmisaka 
662*437bfbebSnyanmisaka     mpp_assert(impl);
663*437bfbebSnyanmisaka     impl->priv_size = priv_size;
664*437bfbebSnyanmisaka     create_objdef_mem_pool(impl);
665*437bfbebSnyanmisaka     if (impl->ref_cnt)
666*437bfbebSnyanmisaka         mpp_logw_f("objdef %-16s already get ref %d\n", name, impl->ref_cnt);
667*437bfbebSnyanmisaka     else
668*437bfbebSnyanmisaka         impl->ref_cnt++;
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka     *def = impl;
671*437bfbebSnyanmisaka 
672*437bfbebSnyanmisaka     return rk_ok;
673*437bfbebSnyanmisaka }
674*437bfbebSnyanmisaka 
kmpp_objdef_add_cfg_root(KmppObjDef def,MppCfgObj root)675*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_cfg_root(KmppObjDef def, MppCfgObj root)
676*437bfbebSnyanmisaka {
677*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
678*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
679*437bfbebSnyanmisaka 
680*437bfbebSnyanmisaka     if (impl) {
681*437bfbebSnyanmisaka         impl->cfg = root;
682*437bfbebSnyanmisaka         ret = rk_ok;
683*437bfbebSnyanmisaka     }
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     return ret;
686*437bfbebSnyanmisaka }
687*437bfbebSnyanmisaka 
kmpp_objdef_get_cfg_root(KmppObjDef def)688*437bfbebSnyanmisaka MppCfgObj kmpp_objdef_get_cfg_root(KmppObjDef def)
689*437bfbebSnyanmisaka {
690*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
691*437bfbebSnyanmisaka 
692*437bfbebSnyanmisaka     return impl ? impl->cfg : NULL;
693*437bfbebSnyanmisaka }
694*437bfbebSnyanmisaka 
kmpp_objdef_add_entry(KmppObjDef def,const char * name,KmppEntry * tbl)695*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl)
696*437bfbebSnyanmisaka {
697*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
698*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
699*437bfbebSnyanmisaka 
700*437bfbebSnyanmisaka     if (!impl->trie) {
701*437bfbebSnyanmisaka         if (!name) {
702*437bfbebSnyanmisaka             /* NOTE: no entry objdef still need to create mempool */
703*437bfbebSnyanmisaka             return create_objdef_mem_pool(impl);
704*437bfbebSnyanmisaka         }
705*437bfbebSnyanmisaka 
706*437bfbebSnyanmisaka         mpp_trie_init(&impl->trie, impl->name);
707*437bfbebSnyanmisaka     }
708*437bfbebSnyanmisaka 
709*437bfbebSnyanmisaka     if (impl->trie) {
710*437bfbebSnyanmisaka         MppTrie trie = impl->trie;
711*437bfbebSnyanmisaka 
712*437bfbebSnyanmisaka         if (name) {
713*437bfbebSnyanmisaka             ret = mpp_trie_add_info(trie, name, tbl, tbl ? sizeof(*tbl) : 0);
714*437bfbebSnyanmisaka 
715*437bfbebSnyanmisaka             if (tbl->tbl.flag_offset > impl->flag_max_pos)
716*437bfbebSnyanmisaka                 impl->flag_max_pos = tbl->tbl.flag_offset;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka             obj_dbg_entry("objdef %-16s add entry %-16s flag offset %4d\n",
719*437bfbebSnyanmisaka                           impl->name, name, tbl->tbl.flag_offset);
720*437bfbebSnyanmisaka         } else {
721*437bfbebSnyanmisaka             /* record object impl size */
722*437bfbebSnyanmisaka             ret = mpp_trie_add_info(trie, "__index", &impl->index, sizeof(rk_s32));
723*437bfbebSnyanmisaka             ret = mpp_trie_add_info(trie, "__size", &impl->entry_size, sizeof(rk_s32));
724*437bfbebSnyanmisaka             ret |= mpp_trie_add_info(trie, NULL, NULL, 0);
725*437bfbebSnyanmisaka             ret |= create_objdef_mem_pool(impl);
726*437bfbebSnyanmisaka         }
727*437bfbebSnyanmisaka     }
728*437bfbebSnyanmisaka 
729*437bfbebSnyanmisaka     if (ret)
730*437bfbebSnyanmisaka         mpp_loge("objdef %s add entry %s failed ret %d\n", impl ? impl->name : NULL, name, ret);
731*437bfbebSnyanmisaka 
732*437bfbebSnyanmisaka     return ret;
733*437bfbebSnyanmisaka }
734*437bfbebSnyanmisaka 
kmpp_objdef_add_init(KmppObjDef def,KmppObjInit init)735*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_init(KmppObjDef def, KmppObjInit init)
736*437bfbebSnyanmisaka {
737*437bfbebSnyanmisaka     if (def) {
738*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
739*437bfbebSnyanmisaka 
740*437bfbebSnyanmisaka         impl->init = init;
741*437bfbebSnyanmisaka         return rk_ok;
742*437bfbebSnyanmisaka     }
743*437bfbebSnyanmisaka 
744*437bfbebSnyanmisaka     return rk_nok;
745*437bfbebSnyanmisaka }
746*437bfbebSnyanmisaka 
kmpp_objdef_add_deinit(KmppObjDef def,KmppObjDeinit deinit)747*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit)
748*437bfbebSnyanmisaka {
749*437bfbebSnyanmisaka     if (def) {
750*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
751*437bfbebSnyanmisaka 
752*437bfbebSnyanmisaka         impl->deinit = deinit;
753*437bfbebSnyanmisaka         return rk_ok;
754*437bfbebSnyanmisaka     }
755*437bfbebSnyanmisaka 
756*437bfbebSnyanmisaka     return rk_nok;
757*437bfbebSnyanmisaka }
758*437bfbebSnyanmisaka 
kmpp_objdef_add_preset(KmppObjDef def,KmppObjPreset preset)759*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_preset(KmppObjDef def, KmppObjPreset preset)
760*437bfbebSnyanmisaka {
761*437bfbebSnyanmisaka     if (def) {
762*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
763*437bfbebSnyanmisaka 
764*437bfbebSnyanmisaka         impl->preset = preset;
765*437bfbebSnyanmisaka         return rk_ok;
766*437bfbebSnyanmisaka     }
767*437bfbebSnyanmisaka 
768*437bfbebSnyanmisaka     return rk_nok;
769*437bfbebSnyanmisaka }
770*437bfbebSnyanmisaka 
kmpp_objdef_add_dump(KmppObjDef def,KmppObjDump dump)771*437bfbebSnyanmisaka rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump)
772*437bfbebSnyanmisaka {
773*437bfbebSnyanmisaka     if (def) {
774*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
775*437bfbebSnyanmisaka 
776*437bfbebSnyanmisaka         impl->dump = dump;
777*437bfbebSnyanmisaka         return rk_ok;
778*437bfbebSnyanmisaka     }
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka     return rk_nok;
781*437bfbebSnyanmisaka }
782*437bfbebSnyanmisaka 
kmpp_objdef_set_prop(KmppObjDef def,const char * op,rk_s32 value)783*437bfbebSnyanmisaka rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value)
784*437bfbebSnyanmisaka {
785*437bfbebSnyanmisaka     if (def && op) {
786*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
787*437bfbebSnyanmisaka 
788*437bfbebSnyanmisaka         if (!strcmp(op, "disable_mismatch_log")) {
789*437bfbebSnyanmisaka             impl->disable_mismatch_log = value ? 1 : 0;
790*437bfbebSnyanmisaka         } else {
791*437bfbebSnyanmisaka             mpp_loge_f("unknown property %s value %d\n", op, value);
792*437bfbebSnyanmisaka             return rk_nok;
793*437bfbebSnyanmisaka         }
794*437bfbebSnyanmisaka 
795*437bfbebSnyanmisaka         return rk_ok;
796*437bfbebSnyanmisaka     }
797*437bfbebSnyanmisaka 
798*437bfbebSnyanmisaka     return rk_nok;
799*437bfbebSnyanmisaka }
800*437bfbebSnyanmisaka 
kmpp_objdef_get_entry(KmppObjDef def,const char * name,KmppEntry ** tbl)801*437bfbebSnyanmisaka rk_s32 kmpp_objdef_get_entry(KmppObjDef def, const char *name, KmppEntry **tbl)
802*437bfbebSnyanmisaka {
803*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
804*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
805*437bfbebSnyanmisaka 
806*437bfbebSnyanmisaka     if (impl->trie) {
807*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
808*437bfbebSnyanmisaka 
809*437bfbebSnyanmisaka         if (info) {
810*437bfbebSnyanmisaka             *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
811*437bfbebSnyanmisaka             ret = rk_ok;
812*437bfbebSnyanmisaka         }
813*437bfbebSnyanmisaka     }
814*437bfbebSnyanmisaka 
815*437bfbebSnyanmisaka     if (ret && !impl->disable_mismatch_log)
816*437bfbebSnyanmisaka         mpp_loge("objdef %s get entry %s failed ret %d\n",
817*437bfbebSnyanmisaka                  impl ? impl->name : NULL, name, ret);
818*437bfbebSnyanmisaka 
819*437bfbebSnyanmisaka     return ret;
820*437bfbebSnyanmisaka }
821*437bfbebSnyanmisaka 
kmpp_objdef_get_offset(KmppObjDef def,const char * name)822*437bfbebSnyanmisaka rk_s32 kmpp_objdef_get_offset(KmppObjDef def, const char *name)
823*437bfbebSnyanmisaka {
824*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
825*437bfbebSnyanmisaka     rk_s32 offset = -1;
826*437bfbebSnyanmisaka 
827*437bfbebSnyanmisaka     if (impl->trie) {
828*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
829*437bfbebSnyanmisaka 
830*437bfbebSnyanmisaka         if (info) {
831*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
832*437bfbebSnyanmisaka 
833*437bfbebSnyanmisaka             if (tbl)
834*437bfbebSnyanmisaka                 offset = tbl->tbl.elem_offset;
835*437bfbebSnyanmisaka         }
836*437bfbebSnyanmisaka     }
837*437bfbebSnyanmisaka 
838*437bfbebSnyanmisaka     return offset;
839*437bfbebSnyanmisaka }
840*437bfbebSnyanmisaka 
kmpp_objdef_get_cmd(KmppObjDef def,const char * name)841*437bfbebSnyanmisaka rk_s32 kmpp_objdef_get_cmd(KmppObjDef def, const char *name)
842*437bfbebSnyanmisaka {
843*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka     if (impl->ioctl) {
846*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->ioctl, name);
847*437bfbebSnyanmisaka 
848*437bfbebSnyanmisaka         if (info)
849*437bfbebSnyanmisaka             return info->index;
850*437bfbebSnyanmisaka     }
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka     return -1;
853*437bfbebSnyanmisaka }
854*437bfbebSnyanmisaka 
kmpp_objdef_dump(KmppObjDef def)855*437bfbebSnyanmisaka rk_s32 kmpp_objdef_dump(KmppObjDef def)
856*437bfbebSnyanmisaka {
857*437bfbebSnyanmisaka     if (def) {
858*437bfbebSnyanmisaka         KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
859*437bfbebSnyanmisaka         MppTrie trie = impl->trie;
860*437bfbebSnyanmisaka         MppTrieInfo *info = NULL;
861*437bfbebSnyanmisaka         const char *name = impl->name;
862*437bfbebSnyanmisaka         RK_S32 i = 0;
863*437bfbebSnyanmisaka 
864*437bfbebSnyanmisaka         mpp_logi("dump objdef %-16s entry_size %d element count %d\n",
865*437bfbebSnyanmisaka                  name, impl->entry_size, mpp_trie_get_info_count(trie));
866*437bfbebSnyanmisaka 
867*437bfbebSnyanmisaka         info = mpp_trie_get_info_first(trie);
868*437bfbebSnyanmisaka         while (info) {
869*437bfbebSnyanmisaka             name = mpp_trie_info_name(info);
870*437bfbebSnyanmisaka             if (!strstr(name, "__")) {
871*437bfbebSnyanmisaka                 KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
872*437bfbebSnyanmisaka                 rk_s32 idx = i++;
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s offset %4d size %d\n", idx,
875*437bfbebSnyanmisaka                          name, tbl->tbl.elem_offset, tbl->tbl.elem_size);
876*437bfbebSnyanmisaka             }
877*437bfbebSnyanmisaka             info = mpp_trie_get_info_next(trie, info);
878*437bfbebSnyanmisaka         }
879*437bfbebSnyanmisaka 
880*437bfbebSnyanmisaka         info = mpp_trie_get_info_first(trie);
881*437bfbebSnyanmisaka         while (info) {
882*437bfbebSnyanmisaka             name = mpp_trie_info_name(info);
883*437bfbebSnyanmisaka             if (strstr(name, "__")) {
884*437bfbebSnyanmisaka                 void *p = mpp_trie_info_ctx(info);
885*437bfbebSnyanmisaka                 rk_s32 idx = i++;
886*437bfbebSnyanmisaka 
887*437bfbebSnyanmisaka                 if (info->ctx_len == sizeof(RK_U32)) {
888*437bfbebSnyanmisaka 
889*437bfbebSnyanmisaka                     mpp_logi("%-2d - %-16s val %d\n", idx, name, *(RK_U32 *)p);
890*437bfbebSnyanmisaka                 } else {
891*437bfbebSnyanmisaka                     mpp_logi("%-2d - %-16s str %s\n", idx, name, p);
892*437bfbebSnyanmisaka                 }
893*437bfbebSnyanmisaka             }
894*437bfbebSnyanmisaka             info = mpp_trie_get_info_next(trie, info);
895*437bfbebSnyanmisaka         }
896*437bfbebSnyanmisaka 
897*437bfbebSnyanmisaka         return rk_ok;
898*437bfbebSnyanmisaka     }
899*437bfbebSnyanmisaka 
900*437bfbebSnyanmisaka     return rk_nok;
901*437bfbebSnyanmisaka }
902*437bfbebSnyanmisaka 
kmpp_objdef_get_name(KmppObjDef def)903*437bfbebSnyanmisaka const char *kmpp_objdef_get_name(KmppObjDef def)
904*437bfbebSnyanmisaka {
905*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
906*437bfbebSnyanmisaka 
907*437bfbebSnyanmisaka     return impl ? impl->name : NULL;
908*437bfbebSnyanmisaka }
909*437bfbebSnyanmisaka 
kmpp_objdef_get_entry_size(KmppObjDef def)910*437bfbebSnyanmisaka rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def)
911*437bfbebSnyanmisaka {
912*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
913*437bfbebSnyanmisaka 
914*437bfbebSnyanmisaka     return impl ? impl->entry_size : 0;
915*437bfbebSnyanmisaka }
916*437bfbebSnyanmisaka 
kmpp_objdef_get_trie(KmppObjDef def)917*437bfbebSnyanmisaka MppTrie kmpp_objdef_get_trie(KmppObjDef def)
918*437bfbebSnyanmisaka {
919*437bfbebSnyanmisaka     KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
920*437bfbebSnyanmisaka 
921*437bfbebSnyanmisaka     return impl ? impl->trie : NULL;
922*437bfbebSnyanmisaka }
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka #define get_obj_from_def(p, def, shm, caller) \
925*437bfbebSnyanmisaka     _get_obj_from_def(p, def, shm, caller, __FUNCTION__)
926*437bfbebSnyanmisaka 
_get_obj_from_def(KmppObjs * p,KmppObjDefImpl * def,KmppShmPtr * shm,const char * caller,const char * func)927*437bfbebSnyanmisaka static KmppObjImpl *_get_obj_from_def(KmppObjs *p, KmppObjDefImpl *def, KmppShmPtr *shm,
928*437bfbebSnyanmisaka                                       const char *caller, const char *func)
929*437bfbebSnyanmisaka {
930*437bfbebSnyanmisaka     KmppObjImpl *impl = mpp_mem_pool_get(def->pool, caller);
931*437bfbebSnyanmisaka     rk_u8 *base;
932*437bfbebSnyanmisaka 
933*437bfbebSnyanmisaka     if (!impl) {
934*437bfbebSnyanmisaka         mpp_loge("%s get obj %s impl %d failed at %s\n",
935*437bfbebSnyanmisaka                  func, def->name, def->all_size, caller);
936*437bfbebSnyanmisaka         return NULL;
937*437bfbebSnyanmisaka     }
938*437bfbebSnyanmisaka 
939*437bfbebSnyanmisaka     base = (rk_u8 *)(impl + 1);
940*437bfbebSnyanmisaka     impl->name = def->name;
941*437bfbebSnyanmisaka     impl->def = def;
942*437bfbebSnyanmisaka     impl->trie = def->trie;
943*437bfbebSnyanmisaka 
944*437bfbebSnyanmisaka     if (def->priv_size) {
945*437bfbebSnyanmisaka         impl->priv = base;
946*437bfbebSnyanmisaka         base += def->priv_size;
947*437bfbebSnyanmisaka     } else {
948*437bfbebSnyanmisaka         impl->priv = NULL;
949*437bfbebSnyanmisaka     }
950*437bfbebSnyanmisaka 
951*437bfbebSnyanmisaka     if (shm && p) {
952*437bfbebSnyanmisaka         impl->shm = shm;
953*437bfbebSnyanmisaka         impl->entry = (void *)(shm->uptr + p->entry_offset);
954*437bfbebSnyanmisaka 
955*437bfbebSnyanmisaka         /* write userspace object address to share memory userspace private value */
956*437bfbebSnyanmisaka         *(RK_U64 *)(shm->uptr + p->priv_offset) = (RK_U64)(intptr_t)impl;
957*437bfbebSnyanmisaka 
958*437bfbebSnyanmisaka         obj_dbg_flow("%s get kobj %-16s - %p entry [u:k] %llx:%llx at %s\n", func,
959*437bfbebSnyanmisaka                      def->name, impl, shm->uaddr, shm->kaddr, caller);
960*437bfbebSnyanmisaka     } else {
961*437bfbebSnyanmisaka         impl->shm = NULL;
962*437bfbebSnyanmisaka         impl->entry = base;
963*437bfbebSnyanmisaka 
964*437bfbebSnyanmisaka         obj_dbg_flow("%s get uobj %-16s - %p entry %p at %s\n", func,
965*437bfbebSnyanmisaka                      def->name, impl, base, caller);
966*437bfbebSnyanmisaka     }
967*437bfbebSnyanmisaka 
968*437bfbebSnyanmisaka     if (def->init)
969*437bfbebSnyanmisaka         def->init(impl->entry, impl, caller);
970*437bfbebSnyanmisaka 
971*437bfbebSnyanmisaka     return impl;
972*437bfbebSnyanmisaka }
973*437bfbebSnyanmisaka 
kmpp_obj_get(KmppObj * obj,KmppObjDef def,const char * caller)974*437bfbebSnyanmisaka rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
975*437bfbebSnyanmisaka {
976*437bfbebSnyanmisaka     KmppObjs *p;
977*437bfbebSnyanmisaka     KmppObjDefImpl *def_impl;
978*437bfbebSnyanmisaka     KmppObjIocArg *ioc;
979*437bfbebSnyanmisaka     rk_u64 uaddr;
980*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
981*437bfbebSnyanmisaka 
982*437bfbebSnyanmisaka     if (!obj || !def) {
983*437bfbebSnyanmisaka         mpp_loge_f("invalid param obj %p def %p at %s\n", obj, def, caller);
984*437bfbebSnyanmisaka         return ret;
985*437bfbebSnyanmisaka     }
986*437bfbebSnyanmisaka 
987*437bfbebSnyanmisaka     *obj = NULL;
988*437bfbebSnyanmisaka 
989*437bfbebSnyanmisaka     def_impl = (KmppObjDefImpl *)def;
990*437bfbebSnyanmisaka 
991*437bfbebSnyanmisaka     /* use buf_size to check userspace objdef or kernel objdef */
992*437bfbebSnyanmisaka     if (!def_impl->pool) {
993*437bfbebSnyanmisaka         mpp_loge_f("invalid objdef %s without pool at %s\n", def_impl->name, caller);
994*437bfbebSnyanmisaka         return ret;
995*437bfbebSnyanmisaka     }
996*437bfbebSnyanmisaka 
997*437bfbebSnyanmisaka     /* userspace objdef path */
998*437bfbebSnyanmisaka     if (!def_impl->is_kobj) {
999*437bfbebSnyanmisaka         *obj = get_obj_from_def(NULL, def_impl, NULL, caller);
1000*437bfbebSnyanmisaka 
1001*437bfbebSnyanmisaka         return *obj ? rk_ok : rk_nok;
1002*437bfbebSnyanmisaka     }
1003*437bfbebSnyanmisaka 
1004*437bfbebSnyanmisaka     /* kernel objdef path */
1005*437bfbebSnyanmisaka     p = get_objs(caller);
1006*437bfbebSnyanmisaka     if (!p)
1007*437bfbebSnyanmisaka         return ret;
1008*437bfbebSnyanmisaka 
1009*437bfbebSnyanmisaka     ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
1010*437bfbebSnyanmisaka 
1011*437bfbebSnyanmisaka     ioc->count = 1;
1012*437bfbebSnyanmisaka     ioc->flag = 0;
1013*437bfbebSnyanmisaka     ioc->name_uaddr[0] = (__u64)(intptr_t)def_impl->name;
1014*437bfbebSnyanmisaka 
1015*437bfbebSnyanmisaka     ret = ioctl(p->obj.fd, KMPP_SHM_IOC_GET_SHM, ioc);
1016*437bfbebSnyanmisaka     if (ret) {
1017*437bfbebSnyanmisaka         mpp_err("%s fd %d ioctl KMPP_SHM_IOC_GET_SHM failed at %s\n",
1018*437bfbebSnyanmisaka                 def_impl->name, p->obj.fd, caller);
1019*437bfbebSnyanmisaka         return ret;
1020*437bfbebSnyanmisaka     }
1021*437bfbebSnyanmisaka 
1022*437bfbebSnyanmisaka     uaddr = ioc->obj_sptr[0].uaddr;
1023*437bfbebSnyanmisaka 
1024*437bfbebSnyanmisaka     *obj = get_obj_from_def(p, def_impl, (KmppShmPtr *)U64_TO_PTR(uaddr), caller);
1025*437bfbebSnyanmisaka 
1026*437bfbebSnyanmisaka     return *obj ? rk_ok : rk_nok;
1027*437bfbebSnyanmisaka }
1028*437bfbebSnyanmisaka 
kmpp_obj_get_by_name(KmppObj * obj,const char * name,const char * caller)1029*437bfbebSnyanmisaka rk_s32 kmpp_obj_get_by_name(KmppObj *obj, const char *name, const char *caller)
1030*437bfbebSnyanmisaka {
1031*437bfbebSnyanmisaka     KmppObjDefImpl *def;
1032*437bfbebSnyanmisaka 
1033*437bfbebSnyanmisaka     if (!obj || !name) {
1034*437bfbebSnyanmisaka         mpp_loge_f("invalid param obj %p name %p at %s\n",
1035*437bfbebSnyanmisaka                    obj, name, caller);
1036*437bfbebSnyanmisaka         return rk_nok;
1037*437bfbebSnyanmisaka     }
1038*437bfbebSnyanmisaka 
1039*437bfbebSnyanmisaka     if (kmpp_objdef_find((KmppObjDef *)&def, name)) {
1040*437bfbebSnyanmisaka         *obj = NULL;
1041*437bfbebSnyanmisaka         return rk_nok;
1042*437bfbebSnyanmisaka     }
1043*437bfbebSnyanmisaka 
1044*437bfbebSnyanmisaka     mpp_assert(def);
1045*437bfbebSnyanmisaka     if (def->is_kobj && !def->pool)
1046*437bfbebSnyanmisaka         create_objdef_mem_pool(def);
1047*437bfbebSnyanmisaka 
1048*437bfbebSnyanmisaka     return kmpp_obj_get(obj, def, caller);
1049*437bfbebSnyanmisaka }
1050*437bfbebSnyanmisaka 
kmpp_obj_get_by_sptr(KmppObj * obj,KmppShmPtr * sptr,const char * caller)1051*437bfbebSnyanmisaka rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller)
1052*437bfbebSnyanmisaka {
1053*437bfbebSnyanmisaka     KmppObjs *p = get_objs(caller);
1054*437bfbebSnyanmisaka     KmppObjImpl *impl;
1055*437bfbebSnyanmisaka     KmppObjDefImpl *def;
1056*437bfbebSnyanmisaka     rk_u8 *uptr = sptr ? sptr->uptr : NULL;
1057*437bfbebSnyanmisaka 
1058*437bfbebSnyanmisaka     if (!obj) {
1059*437bfbebSnyanmisaka         mpp_loge_f("invalid param obj %p sptr %p uptr %p at %s\n",
1060*437bfbebSnyanmisaka                    obj, sptr, uptr, caller);
1061*437bfbebSnyanmisaka         return rk_nok;
1062*437bfbebSnyanmisaka     }
1063*437bfbebSnyanmisaka 
1064*437bfbebSnyanmisaka     *obj = NULL;
1065*437bfbebSnyanmisaka 
1066*437bfbebSnyanmisaka     /* allow NULL sptr and NULL uptr return NULL object value without error */
1067*437bfbebSnyanmisaka     if (!sptr || !uptr)
1068*437bfbebSnyanmisaka         return rk_ok;
1069*437bfbebSnyanmisaka 
1070*437bfbebSnyanmisaka     if (!p)
1071*437bfbebSnyanmisaka         return rk_nok;
1072*437bfbebSnyanmisaka 
1073*437bfbebSnyanmisaka     impl = (KmppObjImpl *)(intptr_t) * (rk_u64 *)(uptr + p->priv_offset);
1074*437bfbebSnyanmisaka     if (impl) {
1075*437bfbebSnyanmisaka         if (!kmpp_obj_check_f((KmppObj)impl))
1076*437bfbebSnyanmisaka             goto done;
1077*437bfbebSnyanmisaka     }
1078*437bfbebSnyanmisaka 
1079*437bfbebSnyanmisaka     {
1080*437bfbebSnyanmisaka         rk_u32 val = *((rk_u32 *)(uptr + p->name_offset));
1081*437bfbebSnyanmisaka         char *str;
1082*437bfbebSnyanmisaka 
1083*437bfbebSnyanmisaka         if (!val) {
1084*437bfbebSnyanmisaka             mpp_loge_f("invalid obj name offset %d at %s\n", val, caller);
1085*437bfbebSnyanmisaka             return rk_nok;
1086*437bfbebSnyanmisaka         }
1087*437bfbebSnyanmisaka 
1088*437bfbebSnyanmisaka         str = (char *)p->obj.root + val;
1089*437bfbebSnyanmisaka         if (kmpp_objdef_find((KmppObjDef *)&def, str)) {
1090*437bfbebSnyanmisaka             mpp_loge_f("failed to get objdef %p - %s at %s\n", str, str, caller);
1091*437bfbebSnyanmisaka             return rk_nok;
1092*437bfbebSnyanmisaka         }
1093*437bfbebSnyanmisaka     }
1094*437bfbebSnyanmisaka 
1095*437bfbebSnyanmisaka     mpp_assert(def && def->pool);
1096*437bfbebSnyanmisaka     impl = get_obj_from_def(p, def, (KmppShmPtr *)uptr, caller);
1097*437bfbebSnyanmisaka 
1098*437bfbebSnyanmisaka done:
1099*437bfbebSnyanmisaka     *obj = impl;
1100*437bfbebSnyanmisaka 
1101*437bfbebSnyanmisaka     return impl ? rk_ok : rk_nok;
1102*437bfbebSnyanmisaka }
1103*437bfbebSnyanmisaka 
kmpp_obj_put(KmppObj obj,const char * caller)1104*437bfbebSnyanmisaka rk_s32 kmpp_obj_put(KmppObj obj, const char *caller)
1105*437bfbebSnyanmisaka {
1106*437bfbebSnyanmisaka     if (obj) {
1107*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj;
1108*437bfbebSnyanmisaka         KmppObjDefImpl *def = impl->def;
1109*437bfbebSnyanmisaka         KmppObjs *p;
1110*437bfbebSnyanmisaka 
1111*437bfbebSnyanmisaka         mpp_assert(def && def->pool);
1112*437bfbebSnyanmisaka 
1113*437bfbebSnyanmisaka         if (def && def->deinit)
1114*437bfbebSnyanmisaka             def->deinit(impl->entry, impl, caller);
1115*437bfbebSnyanmisaka 
1116*437bfbebSnyanmisaka         /* use shm to check userspace objdef or kernel objdef */
1117*437bfbebSnyanmisaka         /* userspace objdef path */
1118*437bfbebSnyanmisaka         if (impl->shm) {
1119*437bfbebSnyanmisaka             p = get_objs(caller);
1120*437bfbebSnyanmisaka             if (p && p->obj.fd >= 0) {
1121*437bfbebSnyanmisaka                 KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
1122*437bfbebSnyanmisaka                 rk_s32 ret;
1123*437bfbebSnyanmisaka 
1124*437bfbebSnyanmisaka                 ioc->count = 1;
1125*437bfbebSnyanmisaka                 ioc->flag = 0;
1126*437bfbebSnyanmisaka                 ioc->obj_sptr[0].uaddr = impl->shm->uaddr;
1127*437bfbebSnyanmisaka                 ioc->obj_sptr[0].kaddr = impl->shm->kaddr;
1128*437bfbebSnyanmisaka 
1129*437bfbebSnyanmisaka                 obj_dbg_flow("put obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def ? def->name : NULL,
1130*437bfbebSnyanmisaka                              impl, impl->shm->uaddr, impl->shm->kaddr, caller);
1131*437bfbebSnyanmisaka 
1132*437bfbebSnyanmisaka                 ret = ioctl(p->obj.fd, KMPP_SHM_IOC_PUT_SHM, ioc);
1133*437bfbebSnyanmisaka                 if (ret)
1134*437bfbebSnyanmisaka                     mpp_err("ioctl KMPP_SHM_IOC_PUT_SHM failed ret %d at %s\n", ret, caller);
1135*437bfbebSnyanmisaka             }
1136*437bfbebSnyanmisaka             impl->shm = NULL;
1137*437bfbebSnyanmisaka         }
1138*437bfbebSnyanmisaka 
1139*437bfbebSnyanmisaka         mpp_mem_pool_put(def->pool, impl, caller);
1140*437bfbebSnyanmisaka 
1141*437bfbebSnyanmisaka         return rk_ok;
1142*437bfbebSnyanmisaka     }
1143*437bfbebSnyanmisaka 
1144*437bfbebSnyanmisaka     return rk_nok;
1145*437bfbebSnyanmisaka }
1146*437bfbebSnyanmisaka 
kmpp_obj_impl_put(KmppObj obj,const char * caller)1147*437bfbebSnyanmisaka rk_s32 kmpp_obj_impl_put(KmppObj obj, const char *caller)
1148*437bfbebSnyanmisaka {
1149*437bfbebSnyanmisaka     if (obj) {
1150*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj;
1151*437bfbebSnyanmisaka         KmppObjDefImpl *def = impl->def;
1152*437bfbebSnyanmisaka 
1153*437bfbebSnyanmisaka         mpp_assert(def);
1154*437bfbebSnyanmisaka 
1155*437bfbebSnyanmisaka         if (def) {
1156*437bfbebSnyanmisaka             if (def->deinit)
1157*437bfbebSnyanmisaka                 def->deinit(impl->entry, impl, caller);
1158*437bfbebSnyanmisaka 
1159*437bfbebSnyanmisaka             mpp_assert(def->pool);
1160*437bfbebSnyanmisaka             mpp_mem_pool_put(def->pool, impl, caller);
1161*437bfbebSnyanmisaka 
1162*437bfbebSnyanmisaka             return rk_ok;
1163*437bfbebSnyanmisaka         }
1164*437bfbebSnyanmisaka     }
1165*437bfbebSnyanmisaka 
1166*437bfbebSnyanmisaka     return rk_nok;
1167*437bfbebSnyanmisaka }
1168*437bfbebSnyanmisaka 
kmpp_obj_preset(KmppObj obj,const char * arg,const char * caller)1169*437bfbebSnyanmisaka rk_s32 kmpp_obj_preset(KmppObj obj, const char *arg, const char *caller)
1170*437bfbebSnyanmisaka {
1171*437bfbebSnyanmisaka     if (obj) {
1172*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj;
1173*437bfbebSnyanmisaka         KmppObjDefImpl *def = impl->def;
1174*437bfbebSnyanmisaka 
1175*437bfbebSnyanmisaka         mpp_assert(def);
1176*437bfbebSnyanmisaka 
1177*437bfbebSnyanmisaka         if (def && def->preset)
1178*437bfbebSnyanmisaka             return def->preset(impl->entry, impl, arg, caller);
1179*437bfbebSnyanmisaka     }
1180*437bfbebSnyanmisaka 
1181*437bfbebSnyanmisaka     return rk_ok;
1182*437bfbebSnyanmisaka }
1183*437bfbebSnyanmisaka 
kmpp_obj_check(KmppObj obj,const char * caller)1184*437bfbebSnyanmisaka rk_s32 kmpp_obj_check(KmppObj obj, const char *caller)
1185*437bfbebSnyanmisaka {
1186*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1187*437bfbebSnyanmisaka 
1188*437bfbebSnyanmisaka     if (!impl) {
1189*437bfbebSnyanmisaka         mpp_loge_f("from %s failed for NULL arg\n", caller);
1190*437bfbebSnyanmisaka         return rk_nok;
1191*437bfbebSnyanmisaka     }
1192*437bfbebSnyanmisaka 
1193*437bfbebSnyanmisaka     if (!impl->name || !impl->def || impl->name != impl->def->name) {
1194*437bfbebSnyanmisaka         mpp_loge_f("from %s failed for name check %s but %s\n", caller,
1195*437bfbebSnyanmisaka                    impl->def ? impl->def->name : NULL, impl->name);
1196*437bfbebSnyanmisaka         return rk_nok;
1197*437bfbebSnyanmisaka     }
1198*437bfbebSnyanmisaka 
1199*437bfbebSnyanmisaka     if (!impl->entry || !impl->def->trie) {
1200*437bfbebSnyanmisaka         mpp_loge_f("from %s failed for entry %p and def trie %p\n", caller,
1201*437bfbebSnyanmisaka                    impl->entry, impl->def->trie);
1202*437bfbebSnyanmisaka         return rk_nok;
1203*437bfbebSnyanmisaka     }
1204*437bfbebSnyanmisaka 
1205*437bfbebSnyanmisaka     return rk_ok;
1206*437bfbebSnyanmisaka }
1207*437bfbebSnyanmisaka 
kmpp_obj_ioctl(KmppObj ctx,rk_s32 cmd,KmppObj in,KmppObj * out,const char * caller)1208*437bfbebSnyanmisaka rk_s32 kmpp_obj_ioctl(KmppObj ctx, rk_s32 cmd, KmppObj in, KmppObj *out, const char *caller)
1209*437bfbebSnyanmisaka {
1210*437bfbebSnyanmisaka     KmppObjs *p = get_objs_f();
1211*437bfbebSnyanmisaka     KmppObjDef def_ioc = kmpp_ioc_objdef();
1212*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)ctx;
1213*437bfbebSnyanmisaka     KmppObjImpl *ioc = NULL;
1214*437bfbebSnyanmisaka     KmppObjIocArg *ioc_arg;
1215*437bfbebSnyanmisaka     KmppObjDefImpl *def;
1216*437bfbebSnyanmisaka     rk_s32 ret;
1217*437bfbebSnyanmisaka 
1218*437bfbebSnyanmisaka     if (!p)
1219*437bfbebSnyanmisaka         return rk_nok;
1220*437bfbebSnyanmisaka 
1221*437bfbebSnyanmisaka     if (!def_ioc) {
1222*437bfbebSnyanmisaka         static rk_s32 once = 1;
1223*437bfbebSnyanmisaka 
1224*437bfbebSnyanmisaka         if (once) {
1225*437bfbebSnyanmisaka             mpp_loge("KmppIoc is not defined\n");
1226*437bfbebSnyanmisaka             once = 0;
1227*437bfbebSnyanmisaka         }
1228*437bfbebSnyanmisaka 
1229*437bfbebSnyanmisaka         return rk_nok;
1230*437bfbebSnyanmisaka     }
1231*437bfbebSnyanmisaka 
1232*437bfbebSnyanmisaka     if (!impl || !impl->def) {
1233*437bfbebSnyanmisaka         mpp_err("invalid ioctl ctx %p def %p failed at %s\n",
1234*437bfbebSnyanmisaka                 impl, impl ? impl->def : NULL, caller);
1235*437bfbebSnyanmisaka         return rk_nok;
1236*437bfbebSnyanmisaka     }
1237*437bfbebSnyanmisaka 
1238*437bfbebSnyanmisaka     def = impl->def;
1239*437bfbebSnyanmisaka 
1240*437bfbebSnyanmisaka     obj_dbg_ioctl("ioctl def %s:%d cmd %d ctx %p in %p out %p at %s\n",
1241*437bfbebSnyanmisaka                   def->name, def->defs_idx, cmd, ctx, in, out, caller);
1242*437bfbebSnyanmisaka 
1243*437bfbebSnyanmisaka     ret = kmpp_obj_get((KmppObj *)&ioc, def_ioc, caller);
1244*437bfbebSnyanmisaka     if (ret) {
1245*437bfbebSnyanmisaka         mpp_loge("failed to get KmppIoc ret %d\n", ret);
1246*437bfbebSnyanmisaka         return rk_nok;
1247*437bfbebSnyanmisaka     }
1248*437bfbebSnyanmisaka 
1249*437bfbebSnyanmisaka     ioc_arg = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
1250*437bfbebSnyanmisaka     ioc_arg->count = 1;
1251*437bfbebSnyanmisaka     ioc_arg->flag = 0;
1252*437bfbebSnyanmisaka     ioc_arg->obj_sptr[0].uaddr = ioc->shm->uaddr;
1253*437bfbebSnyanmisaka     ioc_arg->obj_sptr[0].kaddr = ioc->shm->kaddr;
1254*437bfbebSnyanmisaka 
1255*437bfbebSnyanmisaka     obj_dbg_ioctl("ioctl arg %p obj_sptr [u:k] %llx : %llx\n", ioc_arg,
1256*437bfbebSnyanmisaka                   ioc_arg->obj_sptr[0].uaddr, ioc_arg->obj_sptr[0].kaddr);
1257*437bfbebSnyanmisaka 
1258*437bfbebSnyanmisaka     kmpp_ioc_set_def(ioc, def->defs_idx);
1259*437bfbebSnyanmisaka     kmpp_ioc_set_cmd(ioc, cmd);
1260*437bfbebSnyanmisaka     kmpp_ioc_set_flags(ioc, 0);
1261*437bfbebSnyanmisaka     kmpp_ioc_set_id(ioc, 0);
1262*437bfbebSnyanmisaka 
1263*437bfbebSnyanmisaka     {
1264*437bfbebSnyanmisaka         static rk_s32 has_ctx = -1;
1265*437bfbebSnyanmisaka 
1266*437bfbebSnyanmisaka         if (has_ctx < 0)
1267*437bfbebSnyanmisaka             has_ctx = kmpp_objdef_get_offset(def_ioc, "ctx") >= 0;
1268*437bfbebSnyanmisaka 
1269*437bfbebSnyanmisaka         if (has_ctx) {
1270*437bfbebSnyanmisaka             KmppShmPtr *sptr = kmpp_obj_to_shm(ctx);
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka             kmpp_ioc_set_ctx(ioc, sptr);
1273*437bfbebSnyanmisaka             obj_dbg_ioctl("ioctl [u:k] ctx %#llx : %#llx\n", sptr->uaddr, sptr->kaddr);
1274*437bfbebSnyanmisaka         }
1275*437bfbebSnyanmisaka     }
1276*437bfbebSnyanmisaka 
1277*437bfbebSnyanmisaka     if (in) {
1278*437bfbebSnyanmisaka         KmppShmPtr *sptr = kmpp_obj_to_shm(in);
1279*437bfbebSnyanmisaka 
1280*437bfbebSnyanmisaka         kmpp_ioc_set_in(ioc, sptr);
1281*437bfbebSnyanmisaka         obj_dbg_ioctl("ioctl [u:k] in %#llx : %#llx\n", sptr->uaddr, sptr->kaddr);
1282*437bfbebSnyanmisaka     }
1283*437bfbebSnyanmisaka 
1284*437bfbebSnyanmisaka     ret = ioctl(p->ioc.fd, 0, ioc_arg);
1285*437bfbebSnyanmisaka 
1286*437bfbebSnyanmisaka     /* if defined ret in ioc object use ret in ioc object */
1287*437bfbebSnyanmisaka     kmpp_ioc_get_ret(ioc, &ret);
1288*437bfbebSnyanmisaka 
1289*437bfbebSnyanmisaka     if (out) {
1290*437bfbebSnyanmisaka         *out = NULL;
1291*437bfbebSnyanmisaka 
1292*437bfbebSnyanmisaka         if (!ret) {
1293*437bfbebSnyanmisaka             KmppShmPtr sptr = { 0 };
1294*437bfbebSnyanmisaka 
1295*437bfbebSnyanmisaka             kmpp_ioc_get_out(ioc, &sptr);
1296*437bfbebSnyanmisaka             kmpp_obj_get_by_sptr(out, &sptr, caller);
1297*437bfbebSnyanmisaka 
1298*437bfbebSnyanmisaka             obj_dbg_ioctl("ioctl [u:k] out %#llx : %#llx obj %p\n",
1299*437bfbebSnyanmisaka                           sptr.uaddr, sptr.kaddr, *out);
1300*437bfbebSnyanmisaka         }
1301*437bfbebSnyanmisaka     }
1302*437bfbebSnyanmisaka 
1303*437bfbebSnyanmisaka     kmpp_obj_put(ioc, caller);
1304*437bfbebSnyanmisaka 
1305*437bfbebSnyanmisaka     return ret;
1306*437bfbebSnyanmisaka }
1307*437bfbebSnyanmisaka 
kmpp_obj_is_kobj(KmppObj obj)1308*437bfbebSnyanmisaka rk_s32 kmpp_obj_is_kobj(KmppObj obj)
1309*437bfbebSnyanmisaka {
1310*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1311*437bfbebSnyanmisaka 
1312*437bfbebSnyanmisaka     return (impl && impl->def) ? impl->def->is_kobj : 0;
1313*437bfbebSnyanmisaka }
1314*437bfbebSnyanmisaka 
kmpp_obj_to_objdef(KmppObj obj)1315*437bfbebSnyanmisaka KmppObjDef kmpp_obj_to_objdef(KmppObj obj)
1316*437bfbebSnyanmisaka {
1317*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1318*437bfbebSnyanmisaka 
1319*437bfbebSnyanmisaka     return impl ? impl->def : NULL;
1320*437bfbebSnyanmisaka }
1321*437bfbebSnyanmisaka 
kmpp_obj_to_flags(KmppObj obj)1322*437bfbebSnyanmisaka void *kmpp_obj_to_flags(KmppObj obj)
1323*437bfbebSnyanmisaka {
1324*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1325*437bfbebSnyanmisaka 
1326*437bfbebSnyanmisaka     if (impl && impl->def && impl->def->flag_offset)
1327*437bfbebSnyanmisaka         return impl->entry + impl->def->flag_offset;
1328*437bfbebSnyanmisaka 
1329*437bfbebSnyanmisaka     return NULL;
1330*437bfbebSnyanmisaka }
1331*437bfbebSnyanmisaka 
kmpp_obj_to_flags_size(KmppObj obj)1332*437bfbebSnyanmisaka rk_s32 kmpp_obj_to_flags_size(KmppObj obj)
1333*437bfbebSnyanmisaka {
1334*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1335*437bfbebSnyanmisaka 
1336*437bfbebSnyanmisaka     if (impl && impl->def && impl->def->flag_max_pos) {
1337*437bfbebSnyanmisaka         KmppObjDefImpl *def = impl->def;
1338*437bfbebSnyanmisaka         rk_s32 max_pos = MPP_ALIGN(def->flag_max_pos, 8) / 8;
1339*437bfbebSnyanmisaka 
1340*437bfbebSnyanmisaka         return MPP_ALIGN(max_pos - def->flag_offset, 4);
1341*437bfbebSnyanmisaka     }
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka     return 0;
1344*437bfbebSnyanmisaka }
1345*437bfbebSnyanmisaka 
kmpp_obj_to_shm(KmppObj obj)1346*437bfbebSnyanmisaka KmppShmPtr *kmpp_obj_to_shm(KmppObj obj)
1347*437bfbebSnyanmisaka {
1348*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1349*437bfbebSnyanmisaka 
1350*437bfbebSnyanmisaka     if (!impl) {
1351*437bfbebSnyanmisaka         mpp_loge("invalid obj %p\n", obj);
1352*437bfbebSnyanmisaka         return NULL;
1353*437bfbebSnyanmisaka     }
1354*437bfbebSnyanmisaka 
1355*437bfbebSnyanmisaka     return impl->shm;
1356*437bfbebSnyanmisaka }
1357*437bfbebSnyanmisaka 
kmpp_obj_to_shm_size(KmppObj obj)1358*437bfbebSnyanmisaka rk_s32 kmpp_obj_to_shm_size(KmppObj obj)
1359*437bfbebSnyanmisaka {
1360*437bfbebSnyanmisaka     (void)obj;
1361*437bfbebSnyanmisaka     return sizeof(KmppShmPtr);
1362*437bfbebSnyanmisaka }
1363*437bfbebSnyanmisaka 
kmpp_obj_get_name(KmppObj obj)1364*437bfbebSnyanmisaka const char *kmpp_obj_get_name(KmppObj obj)
1365*437bfbebSnyanmisaka {
1366*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1367*437bfbebSnyanmisaka 
1368*437bfbebSnyanmisaka     if (impl && impl->def && impl->def->name)
1369*437bfbebSnyanmisaka         return impl->def->name;
1370*437bfbebSnyanmisaka 
1371*437bfbebSnyanmisaka     return NULL;
1372*437bfbebSnyanmisaka }
1373*437bfbebSnyanmisaka 
kmpp_obj_to_priv(KmppObj obj)1374*437bfbebSnyanmisaka void *kmpp_obj_to_priv(KmppObj obj)
1375*437bfbebSnyanmisaka {
1376*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1377*437bfbebSnyanmisaka 
1378*437bfbebSnyanmisaka     return impl ? impl->priv : NULL;
1379*437bfbebSnyanmisaka }
1380*437bfbebSnyanmisaka 
kmpp_obj_to_entry(KmppObj obj)1381*437bfbebSnyanmisaka void *kmpp_obj_to_entry(KmppObj obj)
1382*437bfbebSnyanmisaka {
1383*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1384*437bfbebSnyanmisaka 
1385*437bfbebSnyanmisaka     return impl ? impl->entry : NULL;
1386*437bfbebSnyanmisaka }
1387*437bfbebSnyanmisaka 
kmpp_obj_to_offset(KmppObj obj,const char * name)1388*437bfbebSnyanmisaka rk_s32 kmpp_obj_to_offset(KmppObj obj, const char *name)
1389*437bfbebSnyanmisaka {
1390*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1391*437bfbebSnyanmisaka 
1392*437bfbebSnyanmisaka     if (!impl || !name) {
1393*437bfbebSnyanmisaka         mpp_loge("invalid obj %p name %s\n", obj, name);
1394*437bfbebSnyanmisaka         return -1;
1395*437bfbebSnyanmisaka     }
1396*437bfbebSnyanmisaka 
1397*437bfbebSnyanmisaka     if (impl->trie) {
1398*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
1399*437bfbebSnyanmisaka 
1400*437bfbebSnyanmisaka         if (info) {
1401*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
1402*437bfbebSnyanmisaka 
1403*437bfbebSnyanmisaka             if (tbl)
1404*437bfbebSnyanmisaka                 return tbl->tbl.elem_offset;
1405*437bfbebSnyanmisaka         }
1406*437bfbebSnyanmisaka     }
1407*437bfbebSnyanmisaka 
1408*437bfbebSnyanmisaka     mpp_loge("invalid offset for name %s\n", name);
1409*437bfbebSnyanmisaka 
1410*437bfbebSnyanmisaka     return -1;
1411*437bfbebSnyanmisaka }
1412*437bfbebSnyanmisaka 
1413*437bfbebSnyanmisaka #define MPP_OBJ_ACCESS(type, base_type) \
1414*437bfbebSnyanmisaka     rk_s32 kmpp_obj_set_##type(KmppObj obj, const char *name, base_type val) \
1415*437bfbebSnyanmisaka     { \
1416*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1417*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1418*437bfbebSnyanmisaka         if (impl->trie) { \
1419*437bfbebSnyanmisaka             MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
1420*437bfbebSnyanmisaka             if (info) { \
1421*437bfbebSnyanmisaka                 KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
1422*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
1423*437bfbebSnyanmisaka             } \
1424*437bfbebSnyanmisaka         } \
1425*437bfbebSnyanmisaka         if (ret) \
1426*437bfbebSnyanmisaka             mpp_loge("obj %s set %s " #type " failed ret %d\n", \
1427*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, name, ret); \
1428*437bfbebSnyanmisaka         return ret; \
1429*437bfbebSnyanmisaka     } \
1430*437bfbebSnyanmisaka     rk_s32 kmpp_obj_get_##type(KmppObj obj, const char *name, base_type *val) \
1431*437bfbebSnyanmisaka     { \
1432*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1433*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1434*437bfbebSnyanmisaka         if (impl->trie) { \
1435*437bfbebSnyanmisaka             MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
1436*437bfbebSnyanmisaka             if (info) { \
1437*437bfbebSnyanmisaka                 KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
1438*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
1439*437bfbebSnyanmisaka             } \
1440*437bfbebSnyanmisaka         } \
1441*437bfbebSnyanmisaka         if (ret) \
1442*437bfbebSnyanmisaka             mpp_loge("obj %s get %s " #type " failed ret %d\n", \
1443*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, name, ret); \
1444*437bfbebSnyanmisaka         return ret; \
1445*437bfbebSnyanmisaka     }
1446*437bfbebSnyanmisaka 
MPP_OBJ_ACCESS(s32,rk_s32)1447*437bfbebSnyanmisaka MPP_OBJ_ACCESS(s32, rk_s32)
1448*437bfbebSnyanmisaka MPP_OBJ_ACCESS(u32, rk_u32)
1449*437bfbebSnyanmisaka MPP_OBJ_ACCESS(s64, rk_s64)
1450*437bfbebSnyanmisaka MPP_OBJ_ACCESS(u64, rk_u64)
1451*437bfbebSnyanmisaka MPP_OBJ_ACCESS(obj, KmppObj)
1452*437bfbebSnyanmisaka MPP_OBJ_ACCESS(fp, void *)
1453*437bfbebSnyanmisaka 
1454*437bfbebSnyanmisaka /* compatible for pointer and structure setup */
1455*437bfbebSnyanmisaka rk_s32 kmpp_obj_set_ptr(KmppObj obj, const char *name, void* val)
1456*437bfbebSnyanmisaka {
1457*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1458*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1459*437bfbebSnyanmisaka 
1460*437bfbebSnyanmisaka     if (impl->trie) {
1461*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
1462*437bfbebSnyanmisaka 
1463*437bfbebSnyanmisaka         if (info) {
1464*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
1465*437bfbebSnyanmisaka 
1466*437bfbebSnyanmisaka             if (tbl->tbl.elem_type == ELEM_TYPE_st)
1467*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_set_st(tbl, impl->entry, val);
1468*437bfbebSnyanmisaka             else
1469*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_set_ptr(tbl, impl->entry, val);
1470*437bfbebSnyanmisaka         }
1471*437bfbebSnyanmisaka     }
1472*437bfbebSnyanmisaka 
1473*437bfbebSnyanmisaka     if (ret)
1474*437bfbebSnyanmisaka         mpp_loge("obj %s set %s ptr failed ret %d\n",
1475*437bfbebSnyanmisaka                  (impl && impl->def && impl->def->name) ? impl->def->name : NULL, name, ret);
1476*437bfbebSnyanmisaka 
1477*437bfbebSnyanmisaka     return ret;
1478*437bfbebSnyanmisaka }
1479*437bfbebSnyanmisaka 
kmpp_obj_get_ptr(KmppObj obj,const char * name,void ** val)1480*437bfbebSnyanmisaka rk_s32 kmpp_obj_get_ptr(KmppObj obj, const char *name, void **val)
1481*437bfbebSnyanmisaka {
1482*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1483*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1484*437bfbebSnyanmisaka 
1485*437bfbebSnyanmisaka     if (impl->trie) {
1486*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
1487*437bfbebSnyanmisaka 
1488*437bfbebSnyanmisaka         if (info) {
1489*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
1490*437bfbebSnyanmisaka 
1491*437bfbebSnyanmisaka             if (tbl->tbl.elem_type == ELEM_TYPE_st)
1492*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_get_st(tbl, impl->entry, val);
1493*437bfbebSnyanmisaka             else
1494*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_get_ptr(tbl, impl->entry, val);
1495*437bfbebSnyanmisaka         }
1496*437bfbebSnyanmisaka     }
1497*437bfbebSnyanmisaka 
1498*437bfbebSnyanmisaka     if (ret)
1499*437bfbebSnyanmisaka         mpp_loge("obj %s get %s ptr failed ret %d\n",
1500*437bfbebSnyanmisaka                  (impl && impl->def && impl->def->name) ? impl->def->name : NULL, name, ret);
1501*437bfbebSnyanmisaka 
1502*437bfbebSnyanmisaka     return ret;
1503*437bfbebSnyanmisaka }
1504*437bfbebSnyanmisaka 
1505*437bfbebSnyanmisaka #define MPP_OBJ_STRUCT_ACCESS(type, base_type) \
1506*437bfbebSnyanmisaka     rk_s32 kmpp_obj_set_##type(KmppObj obj, const char *name, base_type *val) \
1507*437bfbebSnyanmisaka     { \
1508*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1509*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1510*437bfbebSnyanmisaka         if (impl->trie) { \
1511*437bfbebSnyanmisaka             MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
1512*437bfbebSnyanmisaka             if (info) { \
1513*437bfbebSnyanmisaka                 KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
1514*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
1515*437bfbebSnyanmisaka             } \
1516*437bfbebSnyanmisaka         } \
1517*437bfbebSnyanmisaka         if (ret) \
1518*437bfbebSnyanmisaka             mpp_loge("obj %s set %s " #type " failed ret %d\n", \
1519*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, name, ret); \
1520*437bfbebSnyanmisaka         return ret; \
1521*437bfbebSnyanmisaka     } \
1522*437bfbebSnyanmisaka     rk_s32 kmpp_obj_get_##type(KmppObj obj, const char *name, base_type *val) \
1523*437bfbebSnyanmisaka     { \
1524*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1525*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1526*437bfbebSnyanmisaka         if (impl->trie) { \
1527*437bfbebSnyanmisaka             MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
1528*437bfbebSnyanmisaka             if (info) { \
1529*437bfbebSnyanmisaka                 KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
1530*437bfbebSnyanmisaka                 ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
1531*437bfbebSnyanmisaka             } \
1532*437bfbebSnyanmisaka         } \
1533*437bfbebSnyanmisaka         if (ret) \
1534*437bfbebSnyanmisaka             mpp_loge("obj %s get %s " #type " failed ret %d\n", \
1535*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, name, ret); \
1536*437bfbebSnyanmisaka         return ret; \
1537*437bfbebSnyanmisaka     }
1538*437bfbebSnyanmisaka 
MPP_OBJ_STRUCT_ACCESS(st,void)1539*437bfbebSnyanmisaka MPP_OBJ_STRUCT_ACCESS(st, void)
1540*437bfbebSnyanmisaka MPP_OBJ_STRUCT_ACCESS(shm, KmppShmPtr)
1541*437bfbebSnyanmisaka 
1542*437bfbebSnyanmisaka #define MPP_OBJ_TBL_ACCESS(type, base_type) \
1543*437bfbebSnyanmisaka     rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppEntry *tbl, base_type val) \
1544*437bfbebSnyanmisaka     { \
1545*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1546*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1547*437bfbebSnyanmisaka         if (impl) \
1548*437bfbebSnyanmisaka             ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
1549*437bfbebSnyanmisaka         if (ret) \
1550*437bfbebSnyanmisaka             mpp_loge("obj %s tbl %08x set " #type " failed ret %d\n", \
1551*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
1552*437bfbebSnyanmisaka         return ret; \
1553*437bfbebSnyanmisaka     } \
1554*437bfbebSnyanmisaka     rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
1555*437bfbebSnyanmisaka     { \
1556*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1557*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1558*437bfbebSnyanmisaka         if (impl) \
1559*437bfbebSnyanmisaka             ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
1560*437bfbebSnyanmisaka         if (ret) \
1561*437bfbebSnyanmisaka             mpp_loge("obj %s tbl %08x get " #type " failed ret %d\n", \
1562*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
1563*437bfbebSnyanmisaka         return ret; \
1564*437bfbebSnyanmisaka     }
1565*437bfbebSnyanmisaka 
1566*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(s32, rk_s32)
1567*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(u32, rk_u32)
1568*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(s64, rk_s64)
1569*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(u64, rk_u64)
1570*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(obj, KmppObj)
1571*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(ptr, void *)
1572*437bfbebSnyanmisaka MPP_OBJ_TBL_ACCESS(fp, void *)
1573*437bfbebSnyanmisaka 
1574*437bfbebSnyanmisaka #define MPP_OBJ_STRUCT_TBL_ACCESS(type, base_type) \
1575*437bfbebSnyanmisaka     rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
1576*437bfbebSnyanmisaka     { \
1577*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1578*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1579*437bfbebSnyanmisaka         if (impl) \
1580*437bfbebSnyanmisaka             ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
1581*437bfbebSnyanmisaka         if (ret) \
1582*437bfbebSnyanmisaka             mpp_loge("obj %s tbl %08x set " #type " failed ret %d\n", \
1583*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
1584*437bfbebSnyanmisaka         return ret; \
1585*437bfbebSnyanmisaka     } \
1586*437bfbebSnyanmisaka     rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
1587*437bfbebSnyanmisaka     { \
1588*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj; \
1589*437bfbebSnyanmisaka         rk_s32 ret = rk_nok; \
1590*437bfbebSnyanmisaka         if (impl) \
1591*437bfbebSnyanmisaka             ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
1592*437bfbebSnyanmisaka         if (ret) \
1593*437bfbebSnyanmisaka             mpp_loge("obj %s tbl %08x get " #type " failed ret %d\n", \
1594*437bfbebSnyanmisaka                     impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
1595*437bfbebSnyanmisaka         return ret; \
1596*437bfbebSnyanmisaka     }
1597*437bfbebSnyanmisaka 
1598*437bfbebSnyanmisaka MPP_OBJ_STRUCT_TBL_ACCESS(st, void)
1599*437bfbebSnyanmisaka MPP_OBJ_STRUCT_TBL_ACCESS(shm, KmppShmPtr)
1600*437bfbebSnyanmisaka 
1601*437bfbebSnyanmisaka rk_s32 kmpp_obj_set_shm_obj(KmppObj obj, const char *name, KmppObj val)
1602*437bfbebSnyanmisaka {
1603*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1604*437bfbebSnyanmisaka 
1605*437bfbebSnyanmisaka     if (!obj || !name || !val) {
1606*437bfbebSnyanmisaka         mpp_loge_f("obj %p set shm obj %s to %p failed invalid param\n",
1607*437bfbebSnyanmisaka                    obj, name, val);
1608*437bfbebSnyanmisaka     } else {
1609*437bfbebSnyanmisaka         KmppShmPtr *sptr = kmpp_obj_to_shm(val);
1610*437bfbebSnyanmisaka 
1611*437bfbebSnyanmisaka         if (!sptr) {
1612*437bfbebSnyanmisaka             mpp_loge_f("obj %p found invalid shm ptr\n", val);
1613*437bfbebSnyanmisaka         } else {
1614*437bfbebSnyanmisaka             ret = kmpp_obj_set_shm(obj, name, sptr);
1615*437bfbebSnyanmisaka         }
1616*437bfbebSnyanmisaka     }
1617*437bfbebSnyanmisaka 
1618*437bfbebSnyanmisaka     return ret;
1619*437bfbebSnyanmisaka }
1620*437bfbebSnyanmisaka 
kmpp_obj_get_shm_obj(KmppObj obj,const char * name,KmppObj * val)1621*437bfbebSnyanmisaka rk_s32 kmpp_obj_get_shm_obj(KmppObj obj, const char *name, KmppObj *val)
1622*437bfbebSnyanmisaka {
1623*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1624*437bfbebSnyanmisaka 
1625*437bfbebSnyanmisaka     if (!obj || !name || !val) {
1626*437bfbebSnyanmisaka         mpp_loge_f("obj %p get shm obj %s to %p failed invalid param\n",
1627*437bfbebSnyanmisaka                    obj, name, val);
1628*437bfbebSnyanmisaka     } else {
1629*437bfbebSnyanmisaka         KmppObjImpl *impl = (KmppObjImpl *)obj;
1630*437bfbebSnyanmisaka         KmppShmPtr sptr = {0};
1631*437bfbebSnyanmisaka 
1632*437bfbebSnyanmisaka         *val = NULL;
1633*437bfbebSnyanmisaka 
1634*437bfbebSnyanmisaka         ret = kmpp_obj_get_shm(obj, name, &sptr);
1635*437bfbebSnyanmisaka         if (ret || !sptr.uptr) {
1636*437bfbebSnyanmisaka             mpp_loge_f("obj %p get shm %s failed ret %d\n", impl, name, ret);
1637*437bfbebSnyanmisaka         } else {
1638*437bfbebSnyanmisaka             ret = kmpp_obj_get_by_sptr(val, &sptr, __FUNCTION__);
1639*437bfbebSnyanmisaka         }
1640*437bfbebSnyanmisaka     }
1641*437bfbebSnyanmisaka 
1642*437bfbebSnyanmisaka     return ret;
1643*437bfbebSnyanmisaka }
1644*437bfbebSnyanmisaka 
kmpp_obj_test(KmppObj obj,const char * name)1645*437bfbebSnyanmisaka rk_s32 kmpp_obj_test(KmppObj obj, const char *name)
1646*437bfbebSnyanmisaka {
1647*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1648*437bfbebSnyanmisaka 
1649*437bfbebSnyanmisaka     if (impl && impl->trie) {
1650*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
1651*437bfbebSnyanmisaka 
1652*437bfbebSnyanmisaka         if (info) {
1653*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
1654*437bfbebSnyanmisaka 
1655*437bfbebSnyanmisaka             return ENTRY_TEST_FLAG(tbl, impl->entry);;
1656*437bfbebSnyanmisaka         }
1657*437bfbebSnyanmisaka     }
1658*437bfbebSnyanmisaka 
1659*437bfbebSnyanmisaka     return 0;
1660*437bfbebSnyanmisaka }
1661*437bfbebSnyanmisaka 
kmpp_obj_tbl_test(KmppObj obj,KmppEntry * tbl)1662*437bfbebSnyanmisaka rk_s32 kmpp_obj_tbl_test(KmppObj obj, KmppEntry *tbl)
1663*437bfbebSnyanmisaka {
1664*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1665*437bfbebSnyanmisaka 
1666*437bfbebSnyanmisaka     return (impl && tbl) ? ENTRY_TEST_FLAG(tbl, impl->entry) : 0;
1667*437bfbebSnyanmisaka }
1668*437bfbebSnyanmisaka 
kmpp_obj_update(KmppObj dst,KmppObj src)1669*437bfbebSnyanmisaka rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src)
1670*437bfbebSnyanmisaka {
1671*437bfbebSnyanmisaka     KmppObjImpl *dst_impl = (KmppObjImpl *)dst;
1672*437bfbebSnyanmisaka     KmppObjImpl *src_impl = (KmppObjImpl *)src;
1673*437bfbebSnyanmisaka     MppTrie trie = NULL;
1674*437bfbebSnyanmisaka     MppTrieInfo *info = NULL;
1675*437bfbebSnyanmisaka 
1676*437bfbebSnyanmisaka     if (kmpp_obj_check_f(src) || kmpp_obj_check_f(dst) || src_impl->def != dst_impl->def) {
1677*437bfbebSnyanmisaka         mpp_loge_f("obj %p update to %p failed invalid param\n", src, dst);
1678*437bfbebSnyanmisaka         return rk_nok;
1679*437bfbebSnyanmisaka     }
1680*437bfbebSnyanmisaka 
1681*437bfbebSnyanmisaka     trie = src_impl->def->trie;
1682*437bfbebSnyanmisaka 
1683*437bfbebSnyanmisaka     info = mpp_trie_get_info_first(trie);
1684*437bfbebSnyanmisaka     do {
1685*437bfbebSnyanmisaka         KmppEntry *e;
1686*437bfbebSnyanmisaka 
1687*437bfbebSnyanmisaka         if (mpp_trie_info_is_self(info))
1688*437bfbebSnyanmisaka             continue;
1689*437bfbebSnyanmisaka 
1690*437bfbebSnyanmisaka         e = (KmppEntry *)mpp_trie_info_ctx(info);
1691*437bfbebSnyanmisaka         if (e->tbl.flag_offset && ENTRY_TEST_FLAG(e, src_impl->entry)) {
1692*437bfbebSnyanmisaka             rk_s32 offset = e->tbl.elem_offset;
1693*437bfbebSnyanmisaka             rk_s32 size = e->tbl.elem_size;
1694*437bfbebSnyanmisaka 
1695*437bfbebSnyanmisaka             obj_dbg_update("obj %s %p update %s\n", src_impl->name,
1696*437bfbebSnyanmisaka                            dst, mpp_trie_info_name(info));
1697*437bfbebSnyanmisaka             memcpy(dst_impl->entry + offset, src_impl->entry + offset, size);
1698*437bfbebSnyanmisaka         }
1699*437bfbebSnyanmisaka     } while ((info = mpp_trie_get_info_next(trie, info)));
1700*437bfbebSnyanmisaka 
1701*437bfbebSnyanmisaka     if (src_impl->def) {
1702*437bfbebSnyanmisaka         KmppObjDefImpl *def = src_impl->def;
1703*437bfbebSnyanmisaka         rk_s32 flag_offset = def->flag_offset;
1704*437bfbebSnyanmisaka         rk_s32 flag_size = kmpp_obj_to_flags_size(src);
1705*437bfbebSnyanmisaka 
1706*437bfbebSnyanmisaka         if (flag_offset && flag_size) {
1707*437bfbebSnyanmisaka             rk_s32 i;
1708*437bfbebSnyanmisaka 
1709*437bfbebSnyanmisaka             for (i = flag_offset; i < flag_offset + flag_size; i += 4)
1710*437bfbebSnyanmisaka                 obj_dbg_update("obj %s %p update flag at %#06x - %08x\n", src_impl->def->name,
1711*437bfbebSnyanmisaka                                dst, i, *((rk_u32 *)((rk_u8 *)src_impl->entry + i)));
1712*437bfbebSnyanmisaka 
1713*437bfbebSnyanmisaka             memcpy(dst_impl->entry + flag_offset,
1714*437bfbebSnyanmisaka                    src_impl->entry + flag_offset, flag_size);
1715*437bfbebSnyanmisaka             memset(src_impl->entry + flag_offset, 0, flag_size);
1716*437bfbebSnyanmisaka         }
1717*437bfbebSnyanmisaka     }
1718*437bfbebSnyanmisaka 
1719*437bfbebSnyanmisaka     return rk_ok;
1720*437bfbebSnyanmisaka }
1721*437bfbebSnyanmisaka 
kmpp_obj_update_entry(void * entry,KmppObj src)1722*437bfbebSnyanmisaka rk_s32 kmpp_obj_update_entry(void *entry, KmppObj src)
1723*437bfbebSnyanmisaka {
1724*437bfbebSnyanmisaka     KmppObjImpl *src_impl = (KmppObjImpl *)src;
1725*437bfbebSnyanmisaka     MppTrie trie = NULL;
1726*437bfbebSnyanmisaka     MppTrieInfo *info = NULL;
1727*437bfbebSnyanmisaka 
1728*437bfbebSnyanmisaka     if (kmpp_obj_check_f(src) || !entry) {
1729*437bfbebSnyanmisaka         mpp_loge_f("obj %p update to entry %p failed invalid param\n", src, entry);
1730*437bfbebSnyanmisaka         return rk_nok;
1731*437bfbebSnyanmisaka     }
1732*437bfbebSnyanmisaka 
1733*437bfbebSnyanmisaka     trie = src_impl->def->trie;
1734*437bfbebSnyanmisaka 
1735*437bfbebSnyanmisaka     info = mpp_trie_get_info_first(trie);
1736*437bfbebSnyanmisaka     do {
1737*437bfbebSnyanmisaka         KmppEntry *e;
1738*437bfbebSnyanmisaka 
1739*437bfbebSnyanmisaka         if (mpp_trie_info_is_self(info))
1740*437bfbebSnyanmisaka             continue;
1741*437bfbebSnyanmisaka 
1742*437bfbebSnyanmisaka         e = (KmppEntry *)mpp_trie_info_ctx(info);
1743*437bfbebSnyanmisaka         if (e->tbl.flag_offset && ENTRY_TEST_FLAG(e, src_impl->entry)) {
1744*437bfbebSnyanmisaka             rk_s32 offset = e->tbl.elem_offset;
1745*437bfbebSnyanmisaka             rk_s32 size = e->tbl.elem_size;
1746*437bfbebSnyanmisaka 
1747*437bfbebSnyanmisaka             obj_dbg_update("obj %s %p -> %p update %s\n", src_impl->name,
1748*437bfbebSnyanmisaka                            src_impl, entry, mpp_trie_info_name(info));
1749*437bfbebSnyanmisaka             memcpy(entry + offset, src_impl->entry + offset, size);
1750*437bfbebSnyanmisaka         }
1751*437bfbebSnyanmisaka     } while ((info = mpp_trie_get_info_next(trie, info)));
1752*437bfbebSnyanmisaka 
1753*437bfbebSnyanmisaka     return rk_ok;
1754*437bfbebSnyanmisaka }
1755*437bfbebSnyanmisaka 
kmpp_obj_copy_entry(KmppObj dst,KmppObj src)1756*437bfbebSnyanmisaka rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src)
1757*437bfbebSnyanmisaka {
1758*437bfbebSnyanmisaka     KmppObjImpl *dst_impl = (KmppObjImpl *)dst;
1759*437bfbebSnyanmisaka     KmppObjImpl *src_impl = (KmppObjImpl *)src;
1760*437bfbebSnyanmisaka 
1761*437bfbebSnyanmisaka     if (kmpp_obj_check_f(src) || kmpp_obj_check_f(dst) || src_impl->def != dst_impl->def) {
1762*437bfbebSnyanmisaka         mpp_loge_f("obj %p copy entry to %p failed invalid param\n", src, dst);
1763*437bfbebSnyanmisaka         return rk_nok;
1764*437bfbebSnyanmisaka     }
1765*437bfbebSnyanmisaka 
1766*437bfbebSnyanmisaka     memcpy(dst_impl->entry, src_impl->entry, src_impl->def->entry_size);
1767*437bfbebSnyanmisaka     {   /* NOTE: clear dst update flags */
1768*437bfbebSnyanmisaka         rk_s32 offset = src_impl->def->flag_offset;
1769*437bfbebSnyanmisaka         rk_s32 size = kmpp_obj_to_flags_size(src);
1770*437bfbebSnyanmisaka 
1771*437bfbebSnyanmisaka         memset(dst_impl->entry + offset, 0, size);
1772*437bfbebSnyanmisaka     }
1773*437bfbebSnyanmisaka 
1774*437bfbebSnyanmisaka     return rk_ok;
1775*437bfbebSnyanmisaka }
1776*437bfbebSnyanmisaka 
kmpp_obj_impl_run(rk_s32 (* run)(void * ctx),void * ctx)1777*437bfbebSnyanmisaka static rk_s32 kmpp_obj_impl_run(rk_s32 (*run)(void *ctx), void *ctx)
1778*437bfbebSnyanmisaka {
1779*437bfbebSnyanmisaka     return run(ctx);
1780*437bfbebSnyanmisaka }
1781*437bfbebSnyanmisaka 
kmpp_obj_run(KmppObj obj,const char * name)1782*437bfbebSnyanmisaka rk_s32 kmpp_obj_run(KmppObj obj, const char *name)
1783*437bfbebSnyanmisaka {
1784*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1785*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1786*437bfbebSnyanmisaka 
1787*437bfbebSnyanmisaka     if (impl->trie) {
1788*437bfbebSnyanmisaka         MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
1789*437bfbebSnyanmisaka         void *val = NULL;
1790*437bfbebSnyanmisaka 
1791*437bfbebSnyanmisaka         if (info) {
1792*437bfbebSnyanmisaka             KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
1793*437bfbebSnyanmisaka 
1794*437bfbebSnyanmisaka             ret = kmpp_obj_impl_get_fp(tbl, impl->entry, &val);
1795*437bfbebSnyanmisaka         }
1796*437bfbebSnyanmisaka 
1797*437bfbebSnyanmisaka         if (val)
1798*437bfbebSnyanmisaka             ret = kmpp_obj_impl_run(val, impl->entry);
1799*437bfbebSnyanmisaka     }
1800*437bfbebSnyanmisaka 
1801*437bfbebSnyanmisaka     return ret;
1802*437bfbebSnyanmisaka }
1803*437bfbebSnyanmisaka 
kmpp_obj_udump_f(KmppObj obj,const char * caller)1804*437bfbebSnyanmisaka rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
1805*437bfbebSnyanmisaka {
1806*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
1807*437bfbebSnyanmisaka     KmppObjDefImpl *def = impl ? impl->def : NULL;
1808*437bfbebSnyanmisaka     MppTrie trie = NULL;
1809*437bfbebSnyanmisaka     MppTrieInfo *info = NULL;
1810*437bfbebSnyanmisaka     MppTrieInfo *next = NULL;
1811*437bfbebSnyanmisaka     const char *name = NULL;
1812*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
1813*437bfbebSnyanmisaka     RK_S32 i = 0;
1814*437bfbebSnyanmisaka 
1815*437bfbebSnyanmisaka     if (!impl || !def) {
1816*437bfbebSnyanmisaka         mpp_loge_f("invalid obj %p def %p\n", impl, def);
1817*437bfbebSnyanmisaka         return rk_nok;
1818*437bfbebSnyanmisaka     }
1819*437bfbebSnyanmisaka 
1820*437bfbebSnyanmisaka     trie = impl->trie;
1821*437bfbebSnyanmisaka     name = def->name;
1822*437bfbebSnyanmisaka 
1823*437bfbebSnyanmisaka     mpp_logi("dump obj %-12s - %p at %s:\n", name, impl, caller);
1824*437bfbebSnyanmisaka 
1825*437bfbebSnyanmisaka     if (def->dump)
1826*437bfbebSnyanmisaka         return def->dump(impl->entry);
1827*437bfbebSnyanmisaka 
1828*437bfbebSnyanmisaka     next = mpp_trie_get_info_first(trie);
1829*437bfbebSnyanmisaka     while (next) {
1830*437bfbebSnyanmisaka         KmppEntry *e;
1831*437bfbebSnyanmisaka         rk_s32 idx;
1832*437bfbebSnyanmisaka 
1833*437bfbebSnyanmisaka         info = next;
1834*437bfbebSnyanmisaka         next = mpp_trie_get_info_next(trie, info);
1835*437bfbebSnyanmisaka 
1836*437bfbebSnyanmisaka         e = (KmppEntry *)mpp_trie_info_ctx(info);
1837*437bfbebSnyanmisaka         name = mpp_trie_info_name(info);
1838*437bfbebSnyanmisaka 
1839*437bfbebSnyanmisaka         if (mpp_trie_info_is_self(info))
1840*437bfbebSnyanmisaka             continue;
1841*437bfbebSnyanmisaka 
1842*437bfbebSnyanmisaka         idx = i++;
1843*437bfbebSnyanmisaka 
1844*437bfbebSnyanmisaka         switch (e->tbl.elem_type) {
1845*437bfbebSnyanmisaka         case ELEM_TYPE_s32 : {
1846*437bfbebSnyanmisaka             rk_s32 val;
1847*437bfbebSnyanmisaka             rk_s32 val_chk;
1848*437bfbebSnyanmisaka 
1849*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_s32(obj, e, &val);
1850*437bfbebSnyanmisaka             if (!ret)
1851*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s s32 %#x:%d\n", idx, name, val, val);
1852*437bfbebSnyanmisaka             else
1853*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s s32 get failed\n", idx, name);
1854*437bfbebSnyanmisaka 
1855*437bfbebSnyanmisaka             kmpp_obj_get_s32(obj, name, &val_chk);
1856*437bfbebSnyanmisaka             if (val != val_chk)
1857*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s s32 check failed\n", idx, name);
1858*437bfbebSnyanmisaka         } break;
1859*437bfbebSnyanmisaka         case ELEM_TYPE_u32 : {
1860*437bfbebSnyanmisaka             rk_u32 val;
1861*437bfbebSnyanmisaka             rk_u32 val_chk;
1862*437bfbebSnyanmisaka 
1863*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_u32(obj, e, &val);
1864*437bfbebSnyanmisaka             if (!ret)
1865*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s u32 %#x:%u\n", idx, name, val, val);
1866*437bfbebSnyanmisaka             else
1867*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s u32 get failed\n", idx, name);
1868*437bfbebSnyanmisaka 
1869*437bfbebSnyanmisaka             kmpp_obj_get_u32(obj, name, &val_chk);
1870*437bfbebSnyanmisaka             if (val != val_chk)
1871*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s u32 check failed\n", idx, name);
1872*437bfbebSnyanmisaka         } break;
1873*437bfbebSnyanmisaka         case ELEM_TYPE_s64 : {
1874*437bfbebSnyanmisaka             rk_s64 val;
1875*437bfbebSnyanmisaka             rk_s64 val_chk;
1876*437bfbebSnyanmisaka 
1877*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_s64(obj, e, &val);
1878*437bfbebSnyanmisaka             if (!ret)
1879*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s s64 %#llx:%lld\n", idx, name, val, val);
1880*437bfbebSnyanmisaka             else
1881*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s s64 get failed\n", idx, name);
1882*437bfbebSnyanmisaka 
1883*437bfbebSnyanmisaka             kmpp_obj_get_s64(obj, name, &val_chk);
1884*437bfbebSnyanmisaka             if (val != val_chk)
1885*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s s64 check failed\n", idx, name);
1886*437bfbebSnyanmisaka         } break;
1887*437bfbebSnyanmisaka         case ELEM_TYPE_u64 : {
1888*437bfbebSnyanmisaka             rk_u64 val;
1889*437bfbebSnyanmisaka             rk_u64 val_chk;
1890*437bfbebSnyanmisaka 
1891*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_u64(obj, e, &val);
1892*437bfbebSnyanmisaka             if (!ret)
1893*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s u64 %#llx:%llu\n", idx, name, val, val);
1894*437bfbebSnyanmisaka             else
1895*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s u64 get failed\n", idx, name);
1896*437bfbebSnyanmisaka 
1897*437bfbebSnyanmisaka             kmpp_obj_get_u64(obj, name, &val_chk);
1898*437bfbebSnyanmisaka             if (val != val_chk)
1899*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s u64 check failed\n", idx, name);
1900*437bfbebSnyanmisaka         } break;
1901*437bfbebSnyanmisaka         case ELEM_TYPE_st : {
1902*437bfbebSnyanmisaka             void *val_chk = mpp_malloc_size(void, e->tbl.elem_size);
1903*437bfbebSnyanmisaka             void *val = mpp_malloc_size(void, e->tbl.elem_size);
1904*437bfbebSnyanmisaka             rk_s32 data_size = e->tbl.elem_size;
1905*437bfbebSnyanmisaka             char logs[128];
1906*437bfbebSnyanmisaka 
1907*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_st(obj, e, val);
1908*437bfbebSnyanmisaka             if (!ret) {
1909*437bfbebSnyanmisaka                 rk_s32 pos;
1910*437bfbebSnyanmisaka                 rk_s32 j;
1911*437bfbebSnyanmisaka 
1912*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s st  %d:%d\n", idx, name, e->tbl.elem_offset, data_size);
1913*437bfbebSnyanmisaka 
1914*437bfbebSnyanmisaka                 j = 0;
1915*437bfbebSnyanmisaka                 for (; j < data_size / 4 - 8; j += 8) {
1916*437bfbebSnyanmisaka                     snprintf(logs, sizeof(logs) - 1, "   - %02x : %#08x %#08x %#08x %#08x %#08x %#08x %#08x %#08x", j,
1917*437bfbebSnyanmisaka                              ((RK_U32 *)val)[j + 0], ((RK_U32 *)val)[j + 1],
1918*437bfbebSnyanmisaka                              ((RK_U32 *)val)[j + 2], ((RK_U32 *)val)[j + 3],
1919*437bfbebSnyanmisaka                              ((RK_U32 *)val)[j + 4], ((RK_U32 *)val)[j + 5],
1920*437bfbebSnyanmisaka                              ((RK_U32 *)val)[j + 6], ((RK_U32 *)val)[j + 7]);
1921*437bfbebSnyanmisaka 
1922*437bfbebSnyanmisaka                     mpp_logi("%s\n", logs);
1923*437bfbebSnyanmisaka                 }
1924*437bfbebSnyanmisaka 
1925*437bfbebSnyanmisaka                 pos = snprintf(logs, sizeof(logs) - 1, "   - %02x :", j);
1926*437bfbebSnyanmisaka                 for (; j < data_size / 4; j++)
1927*437bfbebSnyanmisaka                     pos += snprintf(logs + pos, sizeof(logs) - 1 - pos, " %#08x", ((RK_U32 *)val)[j]);
1928*437bfbebSnyanmisaka 
1929*437bfbebSnyanmisaka                 mpp_logi("%s\n", logs);
1930*437bfbebSnyanmisaka             } else
1931*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s st  get failed\n", idx, name);
1932*437bfbebSnyanmisaka 
1933*437bfbebSnyanmisaka             kmpp_obj_get_st(obj, name, val_chk);
1934*437bfbebSnyanmisaka             if (memcmp(val, val_chk, e->tbl.elem_size)) {
1935*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s st  check failed\n", idx, name);
1936*437bfbebSnyanmisaka                 mpp_loge("val     %p\n", val);
1937*437bfbebSnyanmisaka                 mpp_loge("val_chk %p\n", val_chk);
1938*437bfbebSnyanmisaka             }
1939*437bfbebSnyanmisaka 
1940*437bfbebSnyanmisaka             MPP_FREE(val);
1941*437bfbebSnyanmisaka             MPP_FREE(val_chk);
1942*437bfbebSnyanmisaka         } break;
1943*437bfbebSnyanmisaka         case ELEM_TYPE_shm : {
1944*437bfbebSnyanmisaka             KmppShmPtr *val_chk = mpp_malloc_size(void, e->tbl.elem_size);
1945*437bfbebSnyanmisaka             KmppShmPtr *val = mpp_malloc_size(void, e->tbl.elem_size);
1946*437bfbebSnyanmisaka 
1947*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_st(obj, e, val);
1948*437bfbebSnyanmisaka             if (!ret)
1949*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s shm u%#llx:k%#llx\n",
1950*437bfbebSnyanmisaka                          idx, name, val->uaddr, val->kaddr);
1951*437bfbebSnyanmisaka             else
1952*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s shm get failed\n", idx, name);
1953*437bfbebSnyanmisaka 
1954*437bfbebSnyanmisaka             kmpp_obj_get_st(obj, name, val_chk);
1955*437bfbebSnyanmisaka             if (memcmp(val, val_chk, e->tbl.elem_size)) {
1956*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s shm check failed\n", idx, name);
1957*437bfbebSnyanmisaka                 mpp_loge("val     %p - %#llx:%#llx\n", val, val->uaddr, val->kaddr);
1958*437bfbebSnyanmisaka                 mpp_loge("val_chk %p - %#llx:%#llx\n", val_chk, val_chk->uaddr, val_chk->kaddr);
1959*437bfbebSnyanmisaka             }
1960*437bfbebSnyanmisaka 
1961*437bfbebSnyanmisaka             MPP_FREE(val);
1962*437bfbebSnyanmisaka             MPP_FREE(val_chk);
1963*437bfbebSnyanmisaka         } break;
1964*437bfbebSnyanmisaka         case ELEM_TYPE_uptr : {
1965*437bfbebSnyanmisaka             void *val;
1966*437bfbebSnyanmisaka             void *val_chk;
1967*437bfbebSnyanmisaka 
1968*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_ptr(obj, e, &val);
1969*437bfbebSnyanmisaka             if (!ret)
1970*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s ptr %p\n", idx, name, val);
1971*437bfbebSnyanmisaka             else
1972*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s ptr get failed\n", idx, name);
1973*437bfbebSnyanmisaka 
1974*437bfbebSnyanmisaka             kmpp_obj_get_ptr(obj, name, &val_chk);
1975*437bfbebSnyanmisaka             if (val != val_chk)
1976*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s ptr check failed\n", idx, name);
1977*437bfbebSnyanmisaka         } break;
1978*437bfbebSnyanmisaka         case ELEM_TYPE_ufp : {
1979*437bfbebSnyanmisaka             void *val;
1980*437bfbebSnyanmisaka             void *val_chk;
1981*437bfbebSnyanmisaka 
1982*437bfbebSnyanmisaka             ret = kmpp_obj_tbl_get_fp(obj, e, &val);
1983*437bfbebSnyanmisaka             if (!ret)
1984*437bfbebSnyanmisaka                 mpp_logi("%-2d - %-16s fp  %p\n", idx, name, val);
1985*437bfbebSnyanmisaka             else
1986*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s fp  get failed\n", idx, name);
1987*437bfbebSnyanmisaka 
1988*437bfbebSnyanmisaka             kmpp_obj_get_fp(obj, name, &val_chk);
1989*437bfbebSnyanmisaka             if (val != val_chk)
1990*437bfbebSnyanmisaka                 mpp_loge("%-2d - %-16s fp  check failed\n", idx, name);
1991*437bfbebSnyanmisaka         } break;
1992*437bfbebSnyanmisaka         default : {
1993*437bfbebSnyanmisaka             mpp_loge("%-2d - %-16s found invalid type %d\n", idx, name, e->tbl.elem_type);
1994*437bfbebSnyanmisaka             ret = rk_nok;
1995*437bfbebSnyanmisaka         } break;
1996*437bfbebSnyanmisaka         }
1997*437bfbebSnyanmisaka     }
1998*437bfbebSnyanmisaka 
1999*437bfbebSnyanmisaka     return ret ? rk_nok : rk_ok;
2000*437bfbebSnyanmisaka }
2001*437bfbebSnyanmisaka 
kmpp_obj_kdump_f(KmppObj obj,const char * caller)2002*437bfbebSnyanmisaka rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller)
2003*437bfbebSnyanmisaka {
2004*437bfbebSnyanmisaka     KmppObjs *p = get_objs(caller);
2005*437bfbebSnyanmisaka     KmppObjImpl *impl = (KmppObjImpl *)obj;
2006*437bfbebSnyanmisaka     KmppObjDefImpl *def = impl ? impl->def : NULL;
2007*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
2008*437bfbebSnyanmisaka 
2009*437bfbebSnyanmisaka     if (!impl || !def || !p) {
2010*437bfbebSnyanmisaka         mpp_loge_f("invalid obj %p def %p objs %p\n", impl, def, p);
2011*437bfbebSnyanmisaka         return rk_nok;
2012*437bfbebSnyanmisaka     }
2013*437bfbebSnyanmisaka 
2014*437bfbebSnyanmisaka     mpp_logi("dump obj %-12s - %p at %s by kernel\n", def->name, impl, caller);
2015*437bfbebSnyanmisaka 
2016*437bfbebSnyanmisaka     ret = ioctl(p->obj.fd, KMPP_SHM_IOC_DUMP, impl->shm);
2017*437bfbebSnyanmisaka     if (ret)
2018*437bfbebSnyanmisaka         mpp_err("ioctl KMPP_SHM_IOC_DUMP failed ret %d\n", ret);
2019*437bfbebSnyanmisaka 
2020*437bfbebSnyanmisaka     return ret ? rk_nok : rk_ok;
2021*437bfbebSnyanmisaka }
2022*437bfbebSnyanmisaka 
kmpp_shm_get(KmppShm * shm,rk_s32 size,const char * caller)2023*437bfbebSnyanmisaka rk_s32 kmpp_shm_get(KmppShm *shm, rk_s32 size, const char *caller)
2024*437bfbebSnyanmisaka {
2025*437bfbebSnyanmisaka     KmppObjs *p;
2026*437bfbebSnyanmisaka     KmppObjIocArg *ioc;
2027*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
2028*437bfbebSnyanmisaka 
2029*437bfbebSnyanmisaka     if (!shm || !size) {
2030*437bfbebSnyanmisaka         mpp_loge_f("invalid param shm %p size %d at %s\n", shm, size, caller);
2031*437bfbebSnyanmisaka         return ret;
2032*437bfbebSnyanmisaka     }
2033*437bfbebSnyanmisaka 
2034*437bfbebSnyanmisaka     *shm = NULL;
2035*437bfbebSnyanmisaka 
2036*437bfbebSnyanmisaka     /* kernel objdef path */
2037*437bfbebSnyanmisaka     p = get_objs(caller);
2038*437bfbebSnyanmisaka     if (!p)
2039*437bfbebSnyanmisaka         return ret;
2040*437bfbebSnyanmisaka 
2041*437bfbebSnyanmisaka     ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
2042*437bfbebSnyanmisaka 
2043*437bfbebSnyanmisaka     ioc->count = 1;
2044*437bfbebSnyanmisaka     ioc->flag = 0;
2045*437bfbebSnyanmisaka     ioc->shm_req->shm_name = 0;
2046*437bfbebSnyanmisaka     ioc->shm_req->shm_size = size;
2047*437bfbebSnyanmisaka     ioc->shm_req->shm_flag = 0;
2048*437bfbebSnyanmisaka 
2049*437bfbebSnyanmisaka     ret = ioctl(p->obj.fd, KMPP_SHM_IOC_GET_SHM, ioc);
2050*437bfbebSnyanmisaka     if (ret) {
2051*437bfbebSnyanmisaka         mpp_err("shm fd %d ioctl KMPP_SHM_IOC_GET_SHM failed at %s\n",
2052*437bfbebSnyanmisaka                 p->obj.fd, caller);
2053*437bfbebSnyanmisaka         return ret;
2054*437bfbebSnyanmisaka     }
2055*437bfbebSnyanmisaka 
2056*437bfbebSnyanmisaka     *shm = U64_TO_PTR(ioc->obj_sptr[0].uaddr);
2057*437bfbebSnyanmisaka 
2058*437bfbebSnyanmisaka     return *shm ? rk_ok : rk_nok;
2059*437bfbebSnyanmisaka }
2060*437bfbebSnyanmisaka 
kmpp_shm_put(KmppShm shm,const char * caller)2061*437bfbebSnyanmisaka rk_s32 kmpp_shm_put(KmppShm shm, const char *caller)
2062*437bfbebSnyanmisaka {
2063*437bfbebSnyanmisaka     KmppObjs *p = get_objs(caller);
2064*437bfbebSnyanmisaka     rk_s32 ret = rk_nok;
2065*437bfbebSnyanmisaka 
2066*437bfbebSnyanmisaka     if (!shm) {
2067*437bfbebSnyanmisaka         mpp_loge_f("invalid param shm %p at %s\n", shm, caller);
2068*437bfbebSnyanmisaka         return ret;
2069*437bfbebSnyanmisaka     }
2070*437bfbebSnyanmisaka 
2071*437bfbebSnyanmisaka     if (!p)
2072*437bfbebSnyanmisaka         return ret;
2073*437bfbebSnyanmisaka 
2074*437bfbebSnyanmisaka     if (p && p->obj.fd >= 0) {
2075*437bfbebSnyanmisaka         KmppShmPtr *sptr = (KmppShmPtr *)shm;
2076*437bfbebSnyanmisaka         KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
2077*437bfbebSnyanmisaka 
2078*437bfbebSnyanmisaka         ioc->count = 1;
2079*437bfbebSnyanmisaka         ioc->flag = 0;
2080*437bfbebSnyanmisaka 
2081*437bfbebSnyanmisaka         ioc->count = 1;
2082*437bfbebSnyanmisaka         ioc->flag = 0;
2083*437bfbebSnyanmisaka         ioc->obj_sptr[0].uaddr = sptr->uaddr;
2084*437bfbebSnyanmisaka         ioc->obj_sptr[0].kaddr = sptr->kaddr;
2085*437bfbebSnyanmisaka 
2086*437bfbebSnyanmisaka         obj_dbg_flow("put shm %p entry [u:k] %llx:%llx at %s\n",
2087*437bfbebSnyanmisaka                      sptr, sptr->uaddr, sptr->kaddr, caller);
2088*437bfbebSnyanmisaka 
2089*437bfbebSnyanmisaka         ret = ioctl(p->obj.fd, KMPP_SHM_IOC_PUT_SHM, ioc);
2090*437bfbebSnyanmisaka         if (ret)
2091*437bfbebSnyanmisaka             mpp_err("ioctl KMPP_SHM_IOC_PUT_SHM failed ret %d at %s\n", ret, caller);
2092*437bfbebSnyanmisaka     }
2093*437bfbebSnyanmisaka 
2094*437bfbebSnyanmisaka     return ret;
2095*437bfbebSnyanmisaka }
2096*437bfbebSnyanmisaka 
kmpp_shm_to_entry(KmppShm shm,const char * caller)2097*437bfbebSnyanmisaka void *kmpp_shm_to_entry(KmppShm shm, const char *caller)
2098*437bfbebSnyanmisaka {
2099*437bfbebSnyanmisaka     KmppObjs *p = get_objs(caller);
2100*437bfbebSnyanmisaka     KmppShmPtr *sptr = (KmppShmPtr *)shm;
2101*437bfbebSnyanmisaka 
2102*437bfbebSnyanmisaka     if (!shm) {
2103*437bfbebSnyanmisaka         mpp_loge_f("invalid param shm %p at %s\n", shm, caller);
2104*437bfbebSnyanmisaka         return NULL;
2105*437bfbebSnyanmisaka     }
2106*437bfbebSnyanmisaka 
2107*437bfbebSnyanmisaka     return sptr->uptr + p->entry_offset;
2108*437bfbebSnyanmisaka }
2109