xref: /rockchip-linux_mpp/kmpp/base/kmpp_meta.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "kmpp_meta"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka #include <endian.h>
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka #include "mpp_mem.h"
12*437bfbebSnyanmisaka #include "mpp_list.h"
13*437bfbebSnyanmisaka #include "mpp_lock.h"
14*437bfbebSnyanmisaka #include "mpp_debug.h"
15*437bfbebSnyanmisaka #include "mpp_thread.h"
16*437bfbebSnyanmisaka #include "mpp_singleton.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #include "kmpp_obj.h"
19*437bfbebSnyanmisaka #include "kmpp_meta_impl.h"
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #define KMETA_DBG_FUNC              (0x00000001)
22*437bfbebSnyanmisaka #define KMETA_DBG_SIZE              (0x00000002)
23*437bfbebSnyanmisaka #define KMETA_DBG_SET               (0x00000004)
24*437bfbebSnyanmisaka #define KMETA_DBG_GET               (0x00000008)
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #define kmeta_dbg(flag, fmt, ...)   _mpp_dbg_f(kmpp_meta_debug, flag, fmt, ## __VA_ARGS__)
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define kmeta_dbg_func(fmt, ...)    kmeta_dbg(KMETA_DBG_FUNC, fmt, ## __VA_ARGS__)
29*437bfbebSnyanmisaka #define kmeta_dbg_size(fmt, ...)    kmeta_dbg(KMETA_DBG_SIZE, fmt, ## __VA_ARGS__)
30*437bfbebSnyanmisaka #define kmeta_dbg_set(fmt, ...)     kmeta_dbg(KMETA_DBG_SET, fmt, ## __VA_ARGS__)
31*437bfbebSnyanmisaka #define kmeta_dbg_get(fmt, ...)     kmeta_dbg(KMETA_DBG_GET, fmt, ## __VA_ARGS__)
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #define META_ON_OPS                 (0x00010000)
34*437bfbebSnyanmisaka #define META_VAL_INVALID            (0x00000000)
35*437bfbebSnyanmisaka #define META_VAL_VALID              (0x00000001)
36*437bfbebSnyanmisaka #define META_VAL_READY              (0x00000002)
37*437bfbebSnyanmisaka #define META_READY_MASK             (META_VAL_VALID | META_VAL_READY)
38*437bfbebSnyanmisaka /* property mask */
39*437bfbebSnyanmisaka #define META_VAL_IS_OBJ             (0x00000010)
40*437bfbebSnyanmisaka #define META_VAL_IS_SHM             (0x00000020)
41*437bfbebSnyanmisaka #define META_PROP_MASK              (META_VAL_IS_OBJ | META_VAL_IS_SHM)
42*437bfbebSnyanmisaka #define META_UNMASK_PROP(x)         MPP_FETCH_AND(x, (~META_PROP_MASK))
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka #define META_KEY_TO_U64(key, type)  ((rk_u64)((rk_u32)htobe32(key)) | ((rk_u64)type << 32))
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka typedef enum KmppMetaDataType_e {
47*437bfbebSnyanmisaka     /* kmpp meta data of normal data type */
48*437bfbebSnyanmisaka     TYPE_VAL_32         = '3',
49*437bfbebSnyanmisaka     TYPE_VAL_64         = '6',
50*437bfbebSnyanmisaka     TYPE_KPTR           = 'k',  /* kernel pointer */
51*437bfbebSnyanmisaka     TYPE_UPTR           = 'u',  /* userspace pointer */
52*437bfbebSnyanmisaka     TYPE_SPTR           = 's',  /* share memory pointer */
53*437bfbebSnyanmisaka } KmppMetaType;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka typedef struct KmppMetaSrv_s {
56*437bfbebSnyanmisaka     pthread_mutex_t     lock;
57*437bfbebSnyanmisaka     struct list_head    list;
58*437bfbebSnyanmisaka     KmppObjDef          def;
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     rk_s32              offset_size;
61*437bfbebSnyanmisaka     rk_u32              meta_id;
62*437bfbebSnyanmisaka     rk_s32              meta_count;
63*437bfbebSnyanmisaka } KmppMetaSrv;
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka typedef struct KmppMetaPriv_s {
66*437bfbebSnyanmisaka     struct list_head    list;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     KmppObj             meta;
69*437bfbebSnyanmisaka     rk_u32              meta_id;
70*437bfbebSnyanmisaka } KmppMetaPriv;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka static KmppMetaSrv *srv_meta = NULL;
73*437bfbebSnyanmisaka static rk_u32 kmpp_meta_debug = 0;
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka #define get_meta_srv(caller) \
76*437bfbebSnyanmisaka     ({ \
77*437bfbebSnyanmisaka         KmppMetaSrv *__tmp; \
78*437bfbebSnyanmisaka         if (srv_meta) { \
79*437bfbebSnyanmisaka             __tmp = srv_meta; \
80*437bfbebSnyanmisaka         } else { \
81*437bfbebSnyanmisaka             mpp_loge_f("kmpp meta srv not init at %s : %s\n", __FUNCTION__, caller); \
82*437bfbebSnyanmisaka             __tmp = NULL; \
83*437bfbebSnyanmisaka         } \
84*437bfbebSnyanmisaka         __tmp; \
85*437bfbebSnyanmisaka     })
86*437bfbebSnyanmisaka 
kmpp_meta_impl_init(void * entry,KmppObj obj,const char * caller)87*437bfbebSnyanmisaka static rk_s32 kmpp_meta_impl_init(void *entry, KmppObj obj, const char *caller)
88*437bfbebSnyanmisaka {
89*437bfbebSnyanmisaka     KmppMetaPriv *priv = (KmppMetaPriv *)kmpp_obj_to_priv(obj);
90*437bfbebSnyanmisaka     KmppMetaSrv *srv = get_meta_srv(caller);
91*437bfbebSnyanmisaka     (void)entry;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     if (srv) {
94*437bfbebSnyanmisaka         priv->meta = obj;
95*437bfbebSnyanmisaka         INIT_LIST_HEAD(&priv->list);
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka         pthread_mutex_lock(&srv->lock);
98*437bfbebSnyanmisaka         list_add_tail(&priv->list, &srv->list);
99*437bfbebSnyanmisaka         priv->meta_id = srv->meta_id++;
100*437bfbebSnyanmisaka         srv->meta_count++;
101*437bfbebSnyanmisaka         pthread_mutex_unlock(&srv->lock);
102*437bfbebSnyanmisaka     }
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     return rk_ok;
105*437bfbebSnyanmisaka }
106*437bfbebSnyanmisaka 
kmpp_meta_impl_deinit(void * entry,KmppObj obj,const char * caller)107*437bfbebSnyanmisaka static rk_s32 kmpp_meta_impl_deinit(void *entry, KmppObj obj, const char *caller)
108*437bfbebSnyanmisaka {
109*437bfbebSnyanmisaka     KmppMetaPriv *priv = (KmppMetaPriv *)kmpp_obj_to_priv(obj);
110*437bfbebSnyanmisaka     KmppMetaSrv *srv = get_meta_srv(caller);
111*437bfbebSnyanmisaka     (void)entry;
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     if (srv) {
114*437bfbebSnyanmisaka         pthread_mutex_lock(&srv->lock);
115*437bfbebSnyanmisaka         list_del_init(&priv->list);
116*437bfbebSnyanmisaka         srv->meta_count--;
117*437bfbebSnyanmisaka         pthread_mutex_unlock(&srv->lock);
118*437bfbebSnyanmisaka     }
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     return rk_ok;
121*437bfbebSnyanmisaka }
122*437bfbebSnyanmisaka 
kmpp_meta_deinit(void)123*437bfbebSnyanmisaka static void kmpp_meta_deinit(void)
124*437bfbebSnyanmisaka {
125*437bfbebSnyanmisaka     KmppMetaSrv *srv = srv_meta;
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     if (!srv) {
128*437bfbebSnyanmisaka         kmeta_dbg_func("kmpp meta already deinit\n");
129*437bfbebSnyanmisaka         return;
130*437bfbebSnyanmisaka     }
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka     if (srv->def) {
133*437bfbebSnyanmisaka         kmpp_objdef_put(srv->def);
134*437bfbebSnyanmisaka         srv->def = NULL;
135*437bfbebSnyanmisaka     }
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     pthread_mutex_destroy(&srv->lock);
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     MPP_FREE(srv);
140*437bfbebSnyanmisaka     srv_meta = NULL;
141*437bfbebSnyanmisaka }
142*437bfbebSnyanmisaka 
kmpp_meta_init(void)143*437bfbebSnyanmisaka static void kmpp_meta_init(void)
144*437bfbebSnyanmisaka {
145*437bfbebSnyanmisaka     KmppMetaSrv *srv = srv_meta;
146*437bfbebSnyanmisaka     pthread_mutexattr_t attr;
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     if (srv) {
149*437bfbebSnyanmisaka         kmeta_dbg_func("kmpp meta %p already init\n", srv);
150*437bfbebSnyanmisaka         kmpp_meta_deinit();
151*437bfbebSnyanmisaka     }
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     srv = mpp_calloc(KmppMetaSrv, 1);
154*437bfbebSnyanmisaka     if (!srv) {
155*437bfbebSnyanmisaka         mpp_loge_f("kmpp meta malloc failed\n");
156*437bfbebSnyanmisaka         return;
157*437bfbebSnyanmisaka     }
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     pthread_mutexattr_init(&attr);
160*437bfbebSnyanmisaka     pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
161*437bfbebSnyanmisaka     pthread_mutex_init(&srv->lock, &attr);
162*437bfbebSnyanmisaka     pthread_mutexattr_destroy(&attr);
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka     INIT_LIST_HEAD(&srv->list);
165*437bfbebSnyanmisaka     kmpp_objdef_get(&srv->def, sizeof(KmppMetaPriv), "KmppMeta");
166*437bfbebSnyanmisaka     if (!srv->def) {
167*437bfbebSnyanmisaka         kmeta_dbg_func("kmpp meta get objdef failed\n");
168*437bfbebSnyanmisaka         MPP_FREE(srv);
169*437bfbebSnyanmisaka         return;
170*437bfbebSnyanmisaka     }
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka     kmpp_objdef_add_init(srv->def, kmpp_meta_impl_init);
173*437bfbebSnyanmisaka     kmpp_objdef_add_deinit(srv->def, kmpp_meta_impl_deinit);
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka     {
176*437bfbebSnyanmisaka         KmppEntry *tbl = NULL;
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka         kmpp_objdef_get_entry(srv->def, "size", &tbl);
179*437bfbebSnyanmisaka         srv->offset_size = tbl ? tbl->tbl.elem_offset : 0;
180*437bfbebSnyanmisaka     }
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka     srv_meta = srv;
183*437bfbebSnyanmisaka }
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka MPP_SINGLETON(MPP_SGLN_KMPP_META, kmpp_meta, kmpp_meta_init, kmpp_meta_deinit);
186*437bfbebSnyanmisaka 
meta_key_to_addr(KmppObj meta,KmppMetaKey key,KmppMetaType type)187*437bfbebSnyanmisaka static void *meta_key_to_addr(KmppObj meta, KmppMetaKey key, KmppMetaType type)
188*437bfbebSnyanmisaka {
189*437bfbebSnyanmisaka     if (meta) {
190*437bfbebSnyanmisaka         KmppMetaSrv *srv = srv_meta;
191*437bfbebSnyanmisaka         rk_u64 val = META_KEY_TO_U64(key, type);
192*437bfbebSnyanmisaka         KmppEntry *tbl = NULL;
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka         kmpp_objdef_get_entry(srv->def, (const char *)&val, &tbl);
195*437bfbebSnyanmisaka         if (tbl)
196*437bfbebSnyanmisaka             return ((rk_u8 *)kmpp_obj_to_entry(meta)) + tbl->tbl.elem_offset;
197*437bfbebSnyanmisaka     }
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka     return NULL;
200*437bfbebSnyanmisaka }
201*437bfbebSnyanmisaka 
meta_inc_size(KmppObj meta,rk_s32 val,const char * caller)202*437bfbebSnyanmisaka static rk_s32 meta_inc_size(KmppObj meta, rk_s32 val, const char *caller)
203*437bfbebSnyanmisaka {
204*437bfbebSnyanmisaka     rk_s32 ret = 0;
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     if (meta && srv_meta) {
207*437bfbebSnyanmisaka         void *entry = kmpp_obj_to_entry(meta);
208*437bfbebSnyanmisaka         rk_s32 offset = srv_meta->offset_size;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka         if (entry && offset) {
211*437bfbebSnyanmisaka             rk_s32 *p = (rk_s32 *)((rk_u8 *)entry + offset);
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka             ret = MPP_FETCH_ADD(p, val);
214*437bfbebSnyanmisaka             kmeta_dbg_size("meta %p size %d -> %d at %s\n",
215*437bfbebSnyanmisaka                            meta, p[0], ret, caller);
216*437bfbebSnyanmisaka         }
217*437bfbebSnyanmisaka     }
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     return ret;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka 
meta_dec_size(KmppObj meta,rk_s32 val,const char * caller)222*437bfbebSnyanmisaka static rk_s32 meta_dec_size(KmppObj meta, rk_s32 val, const char *caller)
223*437bfbebSnyanmisaka {
224*437bfbebSnyanmisaka     rk_s32 ret = 0;
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka     if (meta && srv_meta) {
227*437bfbebSnyanmisaka         void *entry = kmpp_obj_to_entry(meta);
228*437bfbebSnyanmisaka         rk_s32 offset = srv_meta->offset_size;
229*437bfbebSnyanmisaka 
230*437bfbebSnyanmisaka         if (entry && offset) {
231*437bfbebSnyanmisaka             rk_s32 *p = (rk_s32 *)((rk_u8 *)entry + offset);
232*437bfbebSnyanmisaka 
233*437bfbebSnyanmisaka             ret = MPP_FETCH_SUB(p, val);
234*437bfbebSnyanmisaka             kmeta_dbg_size("meta %p size %d -> %d at %s\n",
235*437bfbebSnyanmisaka                            meta, p[0], ret, caller);
236*437bfbebSnyanmisaka         }
237*437bfbebSnyanmisaka     }
238*437bfbebSnyanmisaka 
239*437bfbebSnyanmisaka     return ret;
240*437bfbebSnyanmisaka }
241*437bfbebSnyanmisaka 
kmpp_meta_get(KmppMeta * meta,const char * caller)242*437bfbebSnyanmisaka rk_s32 kmpp_meta_get(KmppMeta *meta, const char *caller)
243*437bfbebSnyanmisaka {
244*437bfbebSnyanmisaka     KmppMetaSrv *srv = get_meta_srv(caller);
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka     if (!srv)
247*437bfbebSnyanmisaka         return rk_nok;
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka     return kmpp_obj_get(meta, srv->def, caller);
250*437bfbebSnyanmisaka }
251*437bfbebSnyanmisaka 
kmpp_meta_put(KmppMeta meta,const char * caller)252*437bfbebSnyanmisaka rk_s32 kmpp_meta_put(KmppMeta meta, const char *caller)
253*437bfbebSnyanmisaka {
254*437bfbebSnyanmisaka     KmppMetaSrv *srv = get_meta_srv(caller);
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     if (!srv)
257*437bfbebSnyanmisaka         return rk_nok;
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka     return kmpp_obj_put(meta, caller);
260*437bfbebSnyanmisaka }
261*437bfbebSnyanmisaka 
kmpp_meta_size(KmppMeta meta,const char * caller)262*437bfbebSnyanmisaka rk_s32 kmpp_meta_size(KmppMeta meta, const char *caller)
263*437bfbebSnyanmisaka {
264*437bfbebSnyanmisaka     return meta_inc_size(meta, 0, caller);
265*437bfbebSnyanmisaka }
266*437bfbebSnyanmisaka 
kmpp_meta_dump(KmppMeta meta,const char * caller)267*437bfbebSnyanmisaka rk_s32 kmpp_meta_dump(KmppMeta meta, const char *caller)
268*437bfbebSnyanmisaka {
269*437bfbebSnyanmisaka     return kmpp_obj_udump_f(meta, caller);
270*437bfbebSnyanmisaka }
271*437bfbebSnyanmisaka 
kmpp_meta_dump_all(const char * caller)272*437bfbebSnyanmisaka rk_s32 kmpp_meta_dump_all(const char *caller)
273*437bfbebSnyanmisaka {
274*437bfbebSnyanmisaka     KmppMetaSrv *srv = get_meta_srv(caller);
275*437bfbebSnyanmisaka 
276*437bfbebSnyanmisaka     if (srv) {
277*437bfbebSnyanmisaka         KmppMeta meta = NULL;
278*437bfbebSnyanmisaka         KmppMetaPriv *pos, *n;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka         pthread_mutex_lock(&srv->lock);
281*437bfbebSnyanmisaka         list_for_each_entry_safe(pos, n, &srv->list, KmppMetaPriv, list) {
282*437bfbebSnyanmisaka             meta = pos->meta;
283*437bfbebSnyanmisaka             mpp_logi("meta %p:%d size %d\n", meta, pos->meta_id,
284*437bfbebSnyanmisaka                      kmpp_meta_size(meta, caller));
285*437bfbebSnyanmisaka             kmpp_meta_dump(meta, caller);
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka     }
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka     return rk_ok;
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka #define KMPP_META_ACCESSOR(func_type, arg_type, key_type, key_field)  \
293*437bfbebSnyanmisaka     rk_s32 kmpp_meta_set_##func_type(KmppMeta meta, KmppMetaKey key, arg_type val) \
294*437bfbebSnyanmisaka     { \
295*437bfbebSnyanmisaka         KmppMetaVal *meta_val = meta_key_to_addr(meta, key, key_type); \
296*437bfbebSnyanmisaka         if (!meta_val) \
297*437bfbebSnyanmisaka             return rk_nok; \
298*437bfbebSnyanmisaka         if (MPP_BOOL_CAS(&meta_val->state, META_VAL_INVALID, META_VAL_VALID)) \
299*437bfbebSnyanmisaka             meta_inc_size(meta, 1, __FUNCTION__); \
300*437bfbebSnyanmisaka         meta_val->key_field = val; \
301*437bfbebSnyanmisaka         MPP_FETCH_OR(&meta_val->state, META_VAL_READY); \
302*437bfbebSnyanmisaka         return rk_ok; \
303*437bfbebSnyanmisaka     } \
304*437bfbebSnyanmisaka     rk_s32 kmpp_meta_get_##func_type(KmppMeta meta, KmppMetaKey key, arg_type *val) \
305*437bfbebSnyanmisaka     { \
306*437bfbebSnyanmisaka         KmppMetaVal *meta_val = meta_key_to_addr(meta, key, key_type); \
307*437bfbebSnyanmisaka         if (!meta_val) \
308*437bfbebSnyanmisaka             return rk_nok; \
309*437bfbebSnyanmisaka         if (MPP_BOOL_CAS(&meta_val->state, META_READY_MASK, META_VAL_INVALID)) { \
310*437bfbebSnyanmisaka             if (val) *val = meta_val->key_field; \
311*437bfbebSnyanmisaka             meta_dec_size(meta, 1, __FUNCTION__); \
312*437bfbebSnyanmisaka             return rk_ok; \
313*437bfbebSnyanmisaka         } \
314*437bfbebSnyanmisaka         return rk_nok; \
315*437bfbebSnyanmisaka     } \
316*437bfbebSnyanmisaka     rk_s32 kmpp_meta_get_##func_type##_d(KmppMeta meta, KmppMetaKey key, arg_type *val, arg_type def) \
317*437bfbebSnyanmisaka     { \
318*437bfbebSnyanmisaka         KmppMetaVal *meta_val = meta_key_to_addr(meta, key, key_type); \
319*437bfbebSnyanmisaka         if (!meta_val) \
320*437bfbebSnyanmisaka             return rk_nok; \
321*437bfbebSnyanmisaka         if (MPP_BOOL_CAS(&meta_val->state, META_READY_MASK, META_VAL_INVALID)) { \
322*437bfbebSnyanmisaka             if (val) *val = meta_val->key_field; \
323*437bfbebSnyanmisaka             meta_dec_size(meta, 1, __FUNCTION__); \
324*437bfbebSnyanmisaka         } else { \
325*437bfbebSnyanmisaka             if (val) *val = def; \
326*437bfbebSnyanmisaka         } \
327*437bfbebSnyanmisaka         return rk_ok; \
328*437bfbebSnyanmisaka     }
329*437bfbebSnyanmisaka 
KMPP_META_ACCESSOR(s32,rk_s32,TYPE_VAL_32,val_s32)330*437bfbebSnyanmisaka KMPP_META_ACCESSOR(s32, rk_s32, TYPE_VAL_32, val_s32)
331*437bfbebSnyanmisaka KMPP_META_ACCESSOR(s64, rk_s64, TYPE_VAL_64, val_s64)
332*437bfbebSnyanmisaka KMPP_META_ACCESSOR(ptr, void *, TYPE_UPTR, val_ptr)
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka rk_s32 kmpp_meta_set_obj(KmppMeta meta, KmppMetaKey key, KmppObj val)
335*437bfbebSnyanmisaka {
336*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = meta_key_to_addr(meta, key, TYPE_SPTR);
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka     if (!meta_obj)
339*437bfbebSnyanmisaka         return rk_nok;
340*437bfbebSnyanmisaka 
341*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_VAL_INVALID, META_VAL_VALID))
342*437bfbebSnyanmisaka         meta_inc_size(meta, 1, __FUNCTION__);
343*437bfbebSnyanmisaka 
344*437bfbebSnyanmisaka     {
345*437bfbebSnyanmisaka         KmppShmPtr *ptr = kmpp_obj_to_shm(val);
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka         if (ptr) {
348*437bfbebSnyanmisaka             meta_obj->val_shm.uaddr = ptr->uaddr;
349*437bfbebSnyanmisaka             meta_obj->val_shm.kaddr = ptr->kaddr;;
350*437bfbebSnyanmisaka             MPP_FETCH_OR(&meta_obj->state, META_VAL_IS_SHM);
351*437bfbebSnyanmisaka         } else {
352*437bfbebSnyanmisaka             meta_obj->val_shm.uaddr = 0;
353*437bfbebSnyanmisaka             meta_obj->val_shm.kptr = val;
354*437bfbebSnyanmisaka             MPP_FETCH_AND(&meta_obj->state, ~META_VAL_IS_SHM);
355*437bfbebSnyanmisaka         }
356*437bfbebSnyanmisaka     }
357*437bfbebSnyanmisaka     MPP_FETCH_OR(&meta_obj->state, META_VAL_READY);
358*437bfbebSnyanmisaka     return rk_ok;
359*437bfbebSnyanmisaka }
360*437bfbebSnyanmisaka 
kmpp_meta_get_obj(KmppMeta meta,KmppMetaKey key,KmppObj * val)361*437bfbebSnyanmisaka rk_s32 kmpp_meta_get_obj(KmppMeta meta, KmppMetaKey key, KmppObj *val)
362*437bfbebSnyanmisaka {
363*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = meta_key_to_addr(meta, key, TYPE_SPTR);
364*437bfbebSnyanmisaka 
365*437bfbebSnyanmisaka     if (!meta_obj)
366*437bfbebSnyanmisaka         return rk_nok;
367*437bfbebSnyanmisaka 
368*437bfbebSnyanmisaka     META_UNMASK_PROP(&meta_obj->state);
369*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_READY_MASK, META_VAL_INVALID)) {
370*437bfbebSnyanmisaka         if (val)
371*437bfbebSnyanmisaka             *val = meta_obj->val_shm.kptr;
372*437bfbebSnyanmisaka         meta_dec_size(meta, 1, __FUNCTION__);
373*437bfbebSnyanmisaka         return rk_ok;
374*437bfbebSnyanmisaka     }
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     return rk_nok;
377*437bfbebSnyanmisaka }
378*437bfbebSnyanmisaka 
kmpp_meta_get_obj_d(KmppMeta meta,KmppMetaKey key,KmppObj * val,KmppObj def)379*437bfbebSnyanmisaka rk_s32 kmpp_meta_get_obj_d(KmppMeta meta, KmppMetaKey key, KmppObj *val, KmppObj def)
380*437bfbebSnyanmisaka {
381*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = meta_key_to_addr(meta, key, TYPE_SPTR);
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka     if (!meta_obj)
384*437bfbebSnyanmisaka         return rk_nok;
385*437bfbebSnyanmisaka 
386*437bfbebSnyanmisaka     META_UNMASK_PROP(&meta_obj->state);
387*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_READY_MASK, META_VAL_INVALID)) {
388*437bfbebSnyanmisaka         if (val)
389*437bfbebSnyanmisaka             *val = meta_obj->val_shm.kptr;
390*437bfbebSnyanmisaka         meta_dec_size(meta, 1, __FUNCTION__);
391*437bfbebSnyanmisaka     } else {
392*437bfbebSnyanmisaka         if (val)
393*437bfbebSnyanmisaka             *val = def ? def : NULL;
394*437bfbebSnyanmisaka     }
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka     return rk_ok;
397*437bfbebSnyanmisaka }
398*437bfbebSnyanmisaka 
kmpp_meta_set_shm(KmppMeta meta,KmppMetaKey key,KmppShmPtr * sptr)399*437bfbebSnyanmisaka rk_s32 kmpp_meta_set_shm(KmppMeta meta, KmppMetaKey key, KmppShmPtr *sptr)
400*437bfbebSnyanmisaka {
401*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = (KmppMetaObj *)meta_key_to_addr(meta, key, TYPE_SPTR);
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka     if (!meta_obj)
404*437bfbebSnyanmisaka         return rk_nok;
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_VAL_INVALID, META_VAL_VALID))
407*437bfbebSnyanmisaka         meta_inc_size(meta, 1, __FUNCTION__);
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka     if (sptr) {
410*437bfbebSnyanmisaka         meta_obj->val_shm.uaddr = sptr->uaddr;
411*437bfbebSnyanmisaka         meta_obj->val_shm.kaddr = sptr->kaddr;
412*437bfbebSnyanmisaka     } else {
413*437bfbebSnyanmisaka         meta_obj->val_shm.uaddr = 0;
414*437bfbebSnyanmisaka         meta_obj->val_shm.kptr = 0;
415*437bfbebSnyanmisaka     }
416*437bfbebSnyanmisaka 
417*437bfbebSnyanmisaka     if (sptr && sptr->uaddr)
418*437bfbebSnyanmisaka         MPP_FETCH_OR(&meta_obj->state, META_VAL_IS_SHM);
419*437bfbebSnyanmisaka     else
420*437bfbebSnyanmisaka         MPP_FETCH_AND(&meta_obj->state, ~META_VAL_IS_SHM);
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     MPP_FETCH_OR(&meta_obj->state, META_VAL_READY);
423*437bfbebSnyanmisaka 
424*437bfbebSnyanmisaka     return rk_ok;
425*437bfbebSnyanmisaka }
426*437bfbebSnyanmisaka 
kmpp_meta_get_shm(KmppMeta meta,KmppMetaKey key,KmppShmPtr * sptr)427*437bfbebSnyanmisaka rk_s32 kmpp_meta_get_shm(KmppMeta meta, KmppMetaKey key, KmppShmPtr *sptr)
428*437bfbebSnyanmisaka {
429*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = meta_key_to_addr(meta, key, TYPE_SPTR);
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka     if (!meta_obj)
432*437bfbebSnyanmisaka         return rk_nok;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     META_UNMASK_PROP(&meta_obj->state);
435*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_READY_MASK, META_VAL_INVALID)) {
436*437bfbebSnyanmisaka         if (sptr) {
437*437bfbebSnyanmisaka             sptr->uaddr = meta_obj->val_shm.uaddr;
438*437bfbebSnyanmisaka             sptr->kaddr = meta_obj->val_shm.kaddr;
439*437bfbebSnyanmisaka         }
440*437bfbebSnyanmisaka         meta_dec_size(meta, 1, __FUNCTION__);
441*437bfbebSnyanmisaka         return rk_ok;
442*437bfbebSnyanmisaka     }
443*437bfbebSnyanmisaka     return rk_nok;
444*437bfbebSnyanmisaka }
445*437bfbebSnyanmisaka 
kmpp_meta_get_shm_d(KmppMeta meta,KmppMetaKey key,KmppShmPtr * sptr,KmppShmPtr * def)446*437bfbebSnyanmisaka rk_s32 kmpp_meta_get_shm_d(KmppMeta meta, KmppMetaKey key, KmppShmPtr *sptr, KmppShmPtr *def)
447*437bfbebSnyanmisaka {
448*437bfbebSnyanmisaka     KmppMetaObj *meta_obj = meta_key_to_addr(meta, key, TYPE_SPTR);
449*437bfbebSnyanmisaka 
450*437bfbebSnyanmisaka     if (!meta_obj)
451*437bfbebSnyanmisaka         return rk_nok;
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka     META_UNMASK_PROP(&meta_obj->state);
454*437bfbebSnyanmisaka     if (MPP_BOOL_CAS(&meta_obj->state, META_READY_MASK, META_VAL_INVALID)) {
455*437bfbebSnyanmisaka         if (sptr) {
456*437bfbebSnyanmisaka             sptr->uaddr = meta_obj->val_shm.uaddr;
457*437bfbebSnyanmisaka             sptr->kaddr = meta_obj->val_shm.kaddr;
458*437bfbebSnyanmisaka         }
459*437bfbebSnyanmisaka         meta_dec_size(meta, 1, __FUNCTION__);
460*437bfbebSnyanmisaka     } else {
461*437bfbebSnyanmisaka         if (sptr) {
462*437bfbebSnyanmisaka             if (def) {
463*437bfbebSnyanmisaka                 sptr->uaddr = def->uaddr;
464*437bfbebSnyanmisaka                 sptr->kaddr = def->kaddr;
465*437bfbebSnyanmisaka             } else {
466*437bfbebSnyanmisaka                 sptr->uaddr = 0;
467*437bfbebSnyanmisaka                 sptr->kaddr = 0;
468*437bfbebSnyanmisaka             }
469*437bfbebSnyanmisaka         }
470*437bfbebSnyanmisaka     }
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka     return rk_ok;
473*437bfbebSnyanmisaka }
474