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