From a30fe2262ba3346f542b2d56d34097f4a2db60b0 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Thu, 11 Sep 2025 10:05:57 +0800 Subject: [PATCH] feat[kmpp_obj]: Add more functions 1. Add objdef find function. 2. Add preset function. 3. Add priv size on objdef init. 4. Add obj to flags / flags_size function. 5. Add pool size debug log macro. Signed-off-by: Herman Chen Change-Id: I22a5c160d3d14bac98044a90558ef610cc89270c --- kmpp/base/inc/kmpp_obj.h | 29 ++- kmpp/base/inc/kmpp_obj_helper.h | 18 +- kmpp/base/kmpp_meta.c | 3 +- kmpp/base/kmpp_obj.c | 390 ++++++++++++++++++-------------- kmpp/base/kmpp_venc_cfg.c | 2 +- kmpp/base/test/kmpp_obj_test.c | 13 +- 6 files changed, 255 insertions(+), 200 deletions(-) diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index 29a10b33..10ece7f5 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -10,6 +10,7 @@ typedef rk_s32 (*KmppObjInit)(void *entry, KmppObj obj, const char *caller); typedef rk_s32 (*KmppObjDeinit)(void *entry, KmppObj obj, const char *caller); +typedef rk_s32 (*KmppObjPreset)(void *entry, KmppObj obj, const char *val, const char *caller); typedef rk_s32 (*KmppObjDump)(void *entry); #ifdef __cplusplus @@ -17,7 +18,14 @@ extern "C" { #endif /* userspace objdef register */ -rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name); +rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 priv_size, rk_s32 size, const char *name); +/* kernel objdef query from /dev/kmpp_objs */ +rk_s32 kmpp_objdef_get(KmppObjDef *def, rk_s32 priv_size, const char *name); +/* find kernel objdef by name */ +rk_s32 kmpp_objdef_find(KmppObjDef *def, const char *name); +/* kernel objdef from /dev/kmpp_objs reduce refcnt */ +rk_s32 kmpp_objdef_put(KmppObjDef def); + /* userspace objdef add MppCfgObj root */ rk_s32 kmpp_objdef_add_cfg_root(KmppObjDef def, MppCfgObj root); /* userspace objdef add KmppEntry table */ @@ -26,16 +34,13 @@ rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl); rk_s32 kmpp_objdef_add_init(KmppObjDef def, KmppObjInit init); /* userspace object deinit function register */ rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit); +/* userspace object preset function register */ +rk_s32 kmpp_objdef_add_preset(KmppObjDef def, KmppObjPreset preset); /* userspace object dump function register */ rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump); rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value); -/* kernel objdef query from /dev/kmpp_objs */ -rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name); -/* kernel objdef from /dev/kmpp_objs reduce refcnt */ -rk_s32 kmpp_objdef_put(KmppObjDef def); - rk_s32 kmpp_objdef_get_entry(KmppObjDef def, const char *name, KmppEntry **tbl); rk_s32 kmpp_objdef_get_offset(KmppObjDef def, const char *name); rk_s32 kmpp_objdef_dump(KmppObjDef def); @@ -43,8 +48,8 @@ rk_s32 kmpp_objdef_dump(KmppObjDef def); /* mpp objcet internal element set / get function */ const char *kmpp_objdef_get_name(KmppObjDef def); rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def); -rk_s32 kmpp_objdef_get_flag_base(KmppObjDef def); -rk_s32 kmpp_objdef_get_flag_size(KmppObjDef def); +rk_s32 kmpp_objdef_get_flags_base(KmppObjDef def); +rk_s32 kmpp_objdef_get_flags_size(KmppObjDef def); MppTrie kmpp_objdef_get_trie(KmppObjDef def); /* import kernel object ref */ @@ -55,7 +60,11 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller); rk_s32 kmpp_obj_put(KmppObj obj, const char *caller); /* release impl head only */ rk_s32 kmpp_obj_impl_put(KmppObj obj, const char *caller); +/* setup object to a preset value by string args input */ +rk_s32 kmpp_obj_preset(KmppObj obj, const char *arg, const char *caller); +/* check object is valid or not */ rk_s32 kmpp_obj_check(KmppObj obj, const char *caller); +/* run object's ioctl to kernel with input and output object */ rk_s32 kmpp_obj_ioctl(KmppObj obj, rk_s32 cmd, KmppObj in, KmppObj out, const char *caller); #define kmpp_obj_get_f(obj, def) kmpp_obj_get(obj, def, __FUNCTION__) @@ -63,11 +72,15 @@ rk_s32 kmpp_obj_ioctl(KmppObj obj, rk_s32 cmd, KmppObj in, KmppObj out, const ch #define kmpp_obj_get_by_sptr_f(obj, sptr) kmpp_obj_get_by_sptr(obj, sptr, __FUNCTION__) #define kmpp_obj_put_f(obj) kmpp_obj_put(obj, __FUNCTION__) #define kmpp_obj_impl_put_f(obj) kmpp_obj_impl_put(obj, __FUNCTION__) +#define kmpp_obj_preset_f(obj, arg) kmpp_obj_preset(obj, arg, __FUNCTION__) #define kmpp_obj_check_f(obj) kmpp_obj_check(obj, __FUNCTION__) #define kmpp_obj_ioctl_f(obj, cmd, in, out) kmpp_obj_ioctl(obj, cmd, in, out, __FUNCTION__) /* check a object is kobject or not */ rk_s32 kmpp_obj_is_kobj(KmppObj obj); +/* object implement element update flags access */ +void *kmpp_obj_to_flags(KmppObj obj); +rk_s32 kmpp_obj_to_flags_size(KmppObj obj); /* KmppShmPtr is the kernel share object userspace base address for kernel ioctl */ KmppShmPtr *kmpp_obj_to_shm(KmppObj obj); /* KmppShmPtr size defined the copy size for kernel ioctl */ diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index bfc760ca..b9ea17ad 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -47,6 +47,10 @@ #include +#ifndef KMPP_OBJ_PRIV_SIZE +#define KMPP_OBJ_PRIV_SIZE 0 +#endif + #ifndef KMPP_OBJ_EXTRA_SIZE #define KMPP_OBJ_EXTRA_SIZE 0 #endif @@ -259,12 +263,12 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void) KMPP_OBJ_DBG_LOG("register enter\n"); - kmpp_objdef_get(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), TO_STR(KMPP_OBJ_INTF_TYPE)); + kmpp_objdef_get(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_PRIV_SIZE, TO_STR(KMPP_OBJ_INTF_TYPE)); if (KMPP_OBJ_DEF(KMPP_OBJ_NAME)) { KMPP_OBJ_DBG_LOG(TO_STR(KMPP_OBJ_NAME) " found at kernel\n"); } else { - rk_s32 __entry_size = (sizeof(KMPP_OBJ_IMPL_TYPE) + KMPP_OBJ_EXTRA_SIZE + 3) & ~3; - rk_s32 __flag_base = __entry_size << 3; + rk_s32 impl_size = (sizeof(KMPP_OBJ_IMPL_TYPE) + KMPP_OBJ_EXTRA_SIZE + 3) & ~3; + rk_s32 __flag_base = impl_size << 3; rk_s32 __flag_step = 0; rk_s32 __flag_prev = 0; rk_s32 __flag_record[ELEM_FLAG_RECORD_MAX]; @@ -273,7 +277,9 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void) (void) __flag_prev; (void) __flag_record; - kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), __entry_size, TO_STR(KMPP_OBJ_INTF_TYPE)); + kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_PRIV_SIZE, + impl_size, TO_STR(KMPP_OBJ_INTF_TYPE)); + if (!KMPP_OBJ_DEF(KMPP_OBJ_NAME)) { mpp_loge_f(TO_STR(KMPP_OBJ_NAME) " init failed\n"); return; @@ -289,10 +295,6 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void) KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_QUERY, ENTRY_QUERY, HOOK_QUERY, HOOK_QUERY, ENTRY_NOTHING); -#if defined(KMPP_OBJ_PRIV_SIZE) - if (KMPP_OBJ_PRIV_SIZE) - kmpp_objdef_set_prop(KMPP_OBJ_DEF(KMPP_OBJ_NAME), "priv_size", KMPP_OBJ_PRIV_SIZE); -#endif #if defined(KMPP_OBJ_FUNC_INIT) kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT); #endif diff --git a/kmpp/base/kmpp_meta.c b/kmpp/base/kmpp_meta.c index db6c2e29..94559c85 100644 --- a/kmpp/base/kmpp_meta.c +++ b/kmpp/base/kmpp_meta.c @@ -162,14 +162,13 @@ static void kmpp_meta_init(void) pthread_mutexattr_destroy(&attr); INIT_LIST_HEAD(&srv->list); - kmpp_objdef_get(&srv->def, "KmppMeta"); + kmpp_objdef_get(&srv->def, sizeof(KmppMetaPriv), "KmppMeta"); if (!srv->def) { kmeta_dbg_func("kmpp meta get objdef failed\n"); MPP_FREE(srv); return; } - kmpp_objdef_set_prop(srv->def, "priv_size", sizeof(KmppMetaPriv)); kmpp_objdef_add_init(srv->def, kmpp_meta_impl_init); kmpp_objdef_add_deinit(srv->def, kmpp_meta_impl_deinit); diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index 6efef6c7..2ac70555 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -32,7 +32,7 @@ #define OBJ_DBG_FLOW (0x00000001) #define OBJ_DBG_SHARE (0x00000002) #define OBJ_DBG_ENTRY (0x00000004) -#define OBJ_DBG_HOOK (0x00000008) +#define OBJ_DBG_POOL (0x00000008) #define OBJ_DBG_IOCTL (0x00000010) #define OBJ_DBG_UPDATE (0x00000020) #define OBJ_DBG_SET (0x00000040) @@ -43,7 +43,7 @@ #define obj_dbg_flow(fmt, ...) obj_dbg(OBJ_DBG_FLOW, fmt, ## __VA_ARGS__) #define obj_dbg_share(fmt, ...) obj_dbg(OBJ_DBG_SHARE, fmt, ## __VA_ARGS__) #define obj_dbg_entry(fmt, ...) obj_dbg(OBJ_DBG_ENTRY, fmt, ## __VA_ARGS__) -#define obj_dbg_hook(fmt, ...) obj_dbg(OBJ_DBG_HOOK, fmt, ## __VA_ARGS__) +#define obj_dbg_pool(fmt, ...) obj_dbg(OBJ_DBG_POOL, fmt, ## __VA_ARGS__) #define obj_dbg_ioctl(fmt, ...) obj_dbg(OBJ_DBG_IOCTL, fmt, ## __VA_ARGS__) #define obj_dbg_update(fmt, ...) obj_dbg(OBJ_DBG_UPDATE, fmt, ## __VA_ARGS__) #define obj_dbg_set(fmt, ...) obj_dbg(OBJ_DBG_SET, fmt, ## __VA_ARGS__) @@ -106,21 +106,28 @@ typedef struct KmppObjDefImpl_t { /* object define from kernel or userspace */ rk_s32 is_kobj; rk_s32 flag_base; - rk_s32 flag_max_pos; - rk_s32 buf_size; KmppObjInit init; KmppObjDeinit deinit; + KmppObjPreset preset; KmppObjDump dump; /* comment data of userspace / kernel objdef */ MppTrie trie; rk_s32 index; rk_s32 ref_cnt; + /* private data size for priv in KmppObjImpl */ + rk_s32 priv_size; + /* entry size for entry in KmppObjImpl */ rk_s32 entry_size; + rk_s32 flag_max_pos; + rk_s32 flag_offset; + /* entry size + flag size for entry in KmppObjImpl */ + rk_s32 buf_size; + /* all size for sizeof(KmppObjImpl) + priv_size + entry_size + flag_size */ + rk_s32 all_size; /* properties */ rk_s32 disable_mismatch_log; - rk_s32 priv_size; const char *name; } KmppObjDefImpl; @@ -390,11 +397,6 @@ static void kmpp_objs_init(void) break; } - /* create KmppObjImpl header pool for kenel objdef */ - impl->pool = mpp_mem_pool_init_f(name, sizeof(KmppObjImpl)); - if (!impl->pool) - mpp_loge_f("init mem pool %s size %d failed\n", name, sizeof(KmppObjImpl)); - impl->trie = trie_objdef; info_objdef = mpp_trie_get_info(trie_objdef, "__index"); @@ -441,6 +443,9 @@ rk_s32 kmpp_objdef_put(KmppObjDef def) impl->ref_cnt--; if (!impl->ref_cnt) release = 1; + else + mpp_loge_f("objdef %-16s non-zero ref_cnt %d\n", + impl->name, impl->ref_cnt); } else { if (impl->cfg) { mpp_cfg_put_all(impl->cfg); @@ -472,7 +477,7 @@ rk_s32 kmpp_objdef_put(KmppObjDef def) return ret; } -rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name) +rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 priv_size, rk_s32 size, const char *name) { KmppObjDefImpl *impl = NULL; rk_s32 name_len; @@ -497,6 +502,7 @@ rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name) memcpy(buf, name, name_len); buf[name_len] = '\0'; impl->name = buf; + impl->priv_size = MPP_ALIGN(priv_size, sizeof(void *)); impl->entry_size = size; impl->buf_size = size + sizeof(KmppObjImpl); impl->ref_cnt = 1; @@ -508,6 +514,95 @@ rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name) return rk_ok; } +rk_s32 kmpp_objdef_find(KmppObjDef *def, const char *name) +{ + KmppObjs *p = get_objs_f(); + MppTrieInfo *info = NULL; + + if (!def || !name) { + mpp_loge_f("invalid param def %p name %p objs %p\n", def, name, p); + return rk_nok; + } + + *def = NULL; + + if (!p) + return rk_nok; + + info = mpp_trie_get_info(p->trie, name); + if (!info) { + obj_dbg_flow("objdef %-16s can not be found in kernel\n", name); + return rk_nok; + } + + if (p->count > 0 && info->index < (RK_U32)p->count) { + *def = &p->defs[info->index]; + return rk_ok; + } + + mpp_loge_f("objdef %-16s is found but with invalid index %d max %d\n", + name, info->index, p->count); + + return rk_nok; +} + +static rk_s32 create_objdef_mem_pool(KmppObjDefImpl *impl) +{ + rk_s32 old_size = impl->all_size; + + /* When last entry finish update and create memory pool */ + if (impl->flag_max_pos) { + rk_s32 flag_max_pos = MPP_ALIGN(impl->flag_max_pos, 8); + rk_s32 flag_size = flag_max_pos / 8; + + impl->flag_offset = impl->entry_size; + impl->flag_max_pos = flag_max_pos; + + flag_size -= impl->entry_size; + flag_size = MPP_ALIGN(flag_size, 4); + + impl->buf_size = impl->entry_size + flag_size; + } + + impl->all_size = sizeof(KmppObjImpl) + impl->priv_size + impl->buf_size; + + obj_dbg_pool("objdef %-16s entry size %4d buf size %4d -> %4d\n", impl->name, + impl->entry_size, old_size, impl->all_size); + + impl->pool = mpp_mem_pool_init_f(impl->name, impl->all_size); + if (!impl->pool) + mpp_loge_f("get mem pool size %d failed\n", impl->all_size); + + return impl->pool ? rk_ok : rk_nok; +} + +rk_s32 kmpp_objdef_get(KmppObjDef *def, rk_s32 priv_size, const char *name) +{ + KmppObjDefImpl *impl = NULL; + + if (!def || !name) { + mpp_loge_f("invalid param def %p name %p\n", def, name); + return rk_nok; + } + + if (kmpp_objdef_find((KmppObjDef *)&impl, name)) { + *def = NULL; + return rk_nok; + } + + mpp_assert(impl); + impl->priv_size = priv_size; + create_objdef_mem_pool(impl); + if (impl->ref_cnt) + mpp_logw_f("objdef %-16s already get ref %d\n", name, impl->ref_cnt); + else + impl->ref_cnt++; + + *def = impl; + + return rk_ok; +} + rk_s32 kmpp_objdef_add_cfg_root(KmppObjDef def, MppCfgObj root) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; @@ -528,8 +623,10 @@ rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl) rk_s32 ret = rk_nok; if (!impl->trie) { - if (!name) - return rk_ok; + if (!name) { + /* NOTE: no entry objdef still need to create mempool */ + return create_objdef_mem_pool(impl); + } mpp_trie_init(&impl->trie, impl->name); } @@ -546,35 +643,11 @@ rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl) obj_dbg_entry("objdef %-16s add entry %-16s flag offset %4d\n", impl->name, name, tbl->tbl.flag_offset); } else { - rk_s32 old_size = impl->buf_size; - /* record object impl size */ ret = mpp_trie_add_info(trie, "__index", &impl->index, sizeof(rk_s32)); ret = mpp_trie_add_info(trie, "__size", &impl->entry_size, sizeof(rk_s32)); ret |= mpp_trie_add_info(trie, NULL, NULL, 0); - - /* When last entry finish update and create memory pool */ - if (impl->flag_max_pos) { - rk_s32 flag_max_pos = MPP_ALIGN(impl->flag_max_pos, 8); - rk_s32 flag_size = flag_max_pos / 8; - - impl->flag_base = impl->entry_size; - impl->flag_max_pos = flag_size; - - flag_size -= impl->entry_size; - flag_size = MPP_ALIGN(flag_size, 4); - impl->buf_size += flag_size; - } - - obj_dbg_entry("objdef %-16s entry size %4d buf size %4d -> %4d\n", impl->name, - impl->entry_size, old_size, impl->buf_size); - - mpp_assert(!impl->pool); - impl->pool = mpp_mem_pool_init_f(impl->name, impl->buf_size); - if (!impl->pool) { - mpp_loge_f("init mem pool %s size %d failed\n", impl->name, impl->buf_size); - ret = rk_nok; - } + ret |= create_objdef_mem_pool(impl); } } @@ -608,6 +681,18 @@ rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit) return rk_nok; } +rk_s32 kmpp_objdef_add_preset(KmppObjDef def, KmppObjPreset preset) +{ + if (def) { + KmppObjDefImpl *impl = (KmppObjDefImpl *)def; + + impl->preset = preset; + return rk_ok; + } + + return rk_nok; +} + rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump) { if (def) { @@ -625,24 +710,8 @@ rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value) if (def && op) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; - if (!strcmp(op, "disable_mismatch_log")) + if (!strcmp(op, "disable_mismatch_log")) { impl->disable_mismatch_log = value ? 1 : 0; - else if (!strcmp(op, "priv_size")) { - rk_s32 priv_size = MPP_ALIGN(value, sizeof(void *)); - - /* recreate mem pool when private size is changed */ - if (impl->priv_size != priv_size) { - rk_s32 buf_size = sizeof(KmppObjImpl) + priv_size + impl->buf_size; - - if (impl->pool) - mpp_mem_pool_deinit_f(impl->pool); - - impl->pool = mpp_mem_pool_init_f(impl->name, buf_size); - - obj_dbg_flow("objdef %-16s priv size %d -> %d \n", - impl->name, impl->priv_size, priv_size); - impl->priv_size = priv_size; - } } else { mpp_loge_f("unknown property %s value %d\n", op, value); return rk_nok; @@ -654,42 +723,6 @@ rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value) return rk_nok; } -rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name) -{ - KmppObjs *p = get_objs_f(); - MppTrieInfo *info = NULL; - - if (!def || !name) { - mpp_loge_f("invalid param def %p name %p objs %p\n", def, name, p); - return rk_nok; - } - - *def = NULL; - - if (!p) - return rk_nok; - - info = mpp_trie_get_info(p->trie, name); - if (!info) { - obj_dbg_flow("objdef %-16s can not be found in kernel \n", name); - return rk_nok; - } - - if (p->count > 0 && info->index < (RK_U32)p->count) { - KmppObjDefImpl *impl = &p->defs[info->index]; - - impl->ref_cnt++; - *def = impl; - - return rk_ok; - } - - mpp_loge_f("objdef %-16s is found but with invalid index %d max %d\n", - name, info->index, p->count); - - return rk_nok; -} - rk_s32 kmpp_objdef_get_entry(KmppObjDef def, const char *name, KmppEntry **tbl) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; @@ -792,14 +825,14 @@ rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def) return impl ? impl->entry_size : 0; } -rk_s32 kmpp_objdef_get_flag_base(KmppObjDef def) +rk_s32 kmpp_objdef_get_flags_base(KmppObjDef def) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; return impl ? impl->flag_base : 0; } -rk_s32 kmpp_objdef_get_flag_size(KmppObjDef def) +rk_s32 kmpp_objdef_get_flags_size(KmppObjDef def) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; @@ -813,10 +846,22 @@ MppTrie kmpp_objdef_get_trie(KmppObjDef def) return impl ? impl->trie : NULL; } -static void setup_obj(KmppObjImpl *impl, KmppObjs *p, KmppObjDefImpl *def, rk_u8 *shm, const char *caller) -{ - rk_u8 *base = (rk_u8 *)(impl + 1); +#define get_obj_from_def(p, def, shm, caller) \ + _get_obj_from_def(p, def, shm, caller, __FUNCTION__) +static KmppObjImpl *_get_obj_from_def(KmppObjs *p, KmppObjDefImpl *def, KmppShmPtr *shm, + const char *caller, const char *func) +{ + KmppObjImpl *impl = mpp_mem_pool_get(def->pool, caller); + rk_u8 *base; + + if (!impl) { + mpp_loge("%s get obj %s impl %d failed at %s\n", + func, def->name, def->all_size, caller); + return NULL; + } + + base = (rk_u8 *)(impl + 1); impl->name = def->name; impl->def = def; impl->trie = def->trie; @@ -829,24 +874,31 @@ static void setup_obj(KmppObjImpl *impl, KmppObjs *p, KmppObjDefImpl *def, rk_u8 } if (shm && p) { - impl->shm = (KmppShmPtr *)shm; - impl->entry = (void *)(shm + p->entry_offset); + impl->shm = shm; + impl->entry = (void *)(shm->uptr + p->entry_offset); /* write userspace object address to share memory userspace private value */ - *(RK_U64 *)(shm + p->priv_offset) = (RK_U64)(intptr_t)impl; + *(RK_U64 *)(shm->uptr + p->priv_offset) = (RK_U64)(intptr_t)impl; + + obj_dbg_flow("%s get kobj %-16s - %p entry [u:k] %llx:%llx at %s\n", func, + def->name, impl, shm->uaddr, shm->kaddr, caller); } else { impl->shm = NULL; impl->entry = base; + + obj_dbg_flow("%s get uobj %-16s - %p entry %p at %s\n", func, + def->name, impl, base, caller); } if (def->init) def->init(impl->entry, impl, caller); + + return impl; } rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) { KmppObjs *p; - KmppObjImpl *impl; KmppObjDefImpl *def_impl; KmppObjIocArg *ioc; rk_u64 uaddr; @@ -862,22 +914,16 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) def_impl = (KmppObjDefImpl *)def; /* use buf_size to check userspace objdef or kernel objdef */ - mpp_assert(def_impl->pool); + if (!def_impl->pool) { + mpp_loge_f("invalid objdef %s without pool at %s\n", def_impl->name, caller); + return ret; + } /* userspace objdef path */ if (!def_impl->is_kobj) { - impl = mpp_mem_pool_get(def_impl->pool, caller); - if (!impl) { - mpp_loge_f("get obj %s impl %d failed at %s\n", - def_impl->name, def_impl->buf_size, caller); - return ret; - } + *obj = get_obj_from_def(NULL, def_impl, NULL, caller); - setup_obj(impl, NULL, def_impl, NULL, caller); - - *obj = impl; - - return rk_ok; + return *obj ? rk_ok : rk_nok; } /* kernel objdef path */ @@ -885,12 +931,6 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) if (!p) return ret; - impl = (KmppObjImpl *)mpp_mem_pool_get(def_impl->pool, caller); - if (!impl) { - mpp_loge_f("get obj impl %d failed at %s\n", sizeof(KmppObjImpl), caller); - return ret; - } - ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr)); ioc->count = 1; @@ -901,55 +941,36 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) if (ret) { mpp_err("%s fd %d ioctl KMPP_SHM_IOC_GET_SHM failed at %s\n", def_impl->name, p->fd, caller); - mpp_free(impl); return ret; } uaddr = ioc->obj_sptr[0].uaddr; - obj_dbg_flow("get obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def_impl->name, - impl, uaddr, ioc->obj_sptr[0].kaddr, caller); + *obj = get_obj_from_def(p, def_impl, (KmppShmPtr *)U64_TO_PTR(uaddr), caller); - setup_obj(impl, p, def_impl, (rk_u8 *)U64_TO_PTR(uaddr), caller); - - *obj = impl; - - return rk_ok; + return *obj ? rk_ok : rk_nok; } rk_s32 kmpp_obj_get_by_name(KmppObj *obj, const char *name, const char *caller) { - KmppObjs *p = get_objs(caller); - MppTrieInfo *info = NULL; + KmppObjDefImpl *def; if (!obj || !name) { - mpp_loge_f("invalid param obj %p name %p objs %p at %s\n", - obj, name, p, caller); + mpp_loge_f("invalid param obj %p name %p at %s\n", + obj, name, caller); return rk_nok; } - *obj = NULL; - - if (!p) - return rk_nok; - - info = mpp_trie_get_info(p->trie, name); - if (!info) { - obj_dbg_flow("objdef %-16s can not be found in kernel \n", name); + if (kmpp_objdef_find((KmppObjDef *)&def, name)) { + *obj = NULL; return rk_nok; } - if (p->count > 0 && info->index < (RK_U32)p->count) { - KmppObjDefImpl *impl = &p->defs[info->index]; + mpp_assert(def); + if (def->is_kobj && !def->pool) + create_objdef_mem_pool(def); - /* NOTE: do NOT increase ref_cnt here */ - return kmpp_obj_get(obj, impl, caller); - } - - mpp_loge_f("objdef %-16s is found but with invalid index %d max %d\n", - name, info->index, p->count); - - return rk_nok; + return kmpp_obj_get(obj, def, caller); } rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) @@ -958,18 +979,17 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) KmppObjImpl *impl; KmppObjDefImpl *def; rk_u8 *uptr = sptr ? sptr->uptr : NULL; - rk_s32 ret = rk_nok; if (!obj || !sptr || !uptr) { mpp_loge_f("invalid param obj %p sptr %p uptr %p at %s\n", obj, sptr, uptr, caller); - return ret; + return rk_nok; } *obj = NULL; if (!p) - return ret; + return rk_nok; impl = (KmppObjImpl *)(intptr_t) * (rk_u64 *)(uptr + p->priv_offset); if (impl) { @@ -983,32 +1003,23 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) if (!val) { mpp_loge_f("invalid obj name offset %d at %s\n", val, caller); - return ret; + return rk_nok; } str = (char *)p->root + val; - kmpp_objdef_get((KmppObjDef *)&def, str); - if (!def) { + if (kmpp_objdef_find((KmppObjDef *)&def, str)) { mpp_loge_f("failed to get objdef %p - %s at %s\n", str, str, caller); - return ret; + return rk_nok; } } - mpp_assert(def->pool); - impl = (KmppObjImpl *)mpp_mem_pool_get(def->pool, caller); - if (!impl) { - mpp_loge_f("get obj impl %d failed at %s\n", sizeof(KmppObjImpl), caller); - return ret; - } + mpp_assert(def && def->pool); + impl = get_obj_from_def(p, def, (KmppShmPtr *)uptr, caller); - obj_dbg_flow("get obj %-16s - %p by sptr [u:k] %llx:%llx at %s\n", def->name, - impl, sptr->uaddr, sptr->kaddr, caller); - - setup_obj(impl, p, def, uptr, caller); done: *obj = impl; - return rk_ok; + return impl ? rk_ok : rk_nok; } rk_s32 kmpp_obj_put(KmppObj obj, const char *caller) @@ -1076,6 +1087,21 @@ rk_s32 kmpp_obj_impl_put(KmppObj obj, const char *caller) return rk_nok; } +rk_s32 kmpp_obj_preset(KmppObj obj, const char *arg, const char *caller) +{ + if (obj) { + KmppObjImpl *impl = (KmppObjImpl *)obj; + KmppObjDefImpl *def = impl->def; + + mpp_assert(def); + + if (def && def->preset) + return def->preset(impl->entry, impl, arg, caller); + } + + return rk_ok; +} + rk_s32 kmpp_obj_check(KmppObj obj, const char *caller) { KmppObjImpl *impl = (KmppObjImpl *)obj; @@ -1160,6 +1186,30 @@ rk_s32 kmpp_obj_ioctl(KmppObj obj, rk_s32 cmd, KmppObj in, KmppObj out, const ch return ret; } +void *kmpp_obj_to_flags(KmppObj obj) +{ + KmppObjImpl *impl = (KmppObjImpl *)obj; + + if (impl && impl->def && impl->def->flag_offset) + return impl->entry + impl->def->flag_offset; + + return NULL; +} + +rk_s32 kmpp_obj_to_flags_size(KmppObj obj) +{ + KmppObjImpl *impl = (KmppObjImpl *)obj; + + if (impl && impl->def && impl->def->flag_max_pos) { + KmppObjDefImpl *def = impl->def; + rk_s32 max_pos = MPP_ALIGN(def->flag_max_pos, 8) / 8; + + return MPP_ALIGN(max_pos - def->flag_offset, 4); + } + + return 0; +} + KmppShmPtr *kmpp_obj_to_shm(KmppObj obj) { KmppObjImpl *impl = (KmppObjImpl *)obj; @@ -1477,8 +1527,8 @@ rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src) { /* copy update flag to dst */ - rk_s32 offset = kmpp_objdef_get_flag_base(src_impl->def); - rk_s32 size = kmpp_objdef_get_flag_size(src_impl->def); + rk_s32 offset = kmpp_objdef_get_flags_base(src_impl->def); + rk_s32 size = kmpp_objdef_get_flags_size(src_impl->def); rk_s32 i; for (i = offset; i < offset + size; i += 4) @@ -1537,8 +1587,8 @@ rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src) memcpy(dst_impl->entry, src_impl->entry, src_impl->def->entry_size); { /* NOTE: clear dst update flags */ - rk_s32 offset = kmpp_objdef_get_flag_base(src_impl->def); - rk_s32 size = kmpp_objdef_get_flag_size(src_impl->def); + rk_s32 offset = kmpp_objdef_get_flags_base(src_impl->def); + rk_s32 size = kmpp_objdef_get_flags_size(src_impl->def); memset(dst_impl->entry + offset, 0, size); } diff --git a/kmpp/base/kmpp_venc_cfg.c b/kmpp/base/kmpp_venc_cfg.c index d9b69e4c..44738a76 100644 --- a/kmpp/base/kmpp_venc_cfg.c +++ b/kmpp/base/kmpp_venc_cfg.c @@ -45,7 +45,7 @@ static void mpp_venc_kcfg_def_init(void) RK_U32 i; for (i = 0; i < MPP_VENC_KCFG_TYPE_BUTT; i++) { - kmpp_objdef_get(&kcfg_defs[i], kcfg_names[i]); + kmpp_objdef_get(&kcfg_defs[i], 0, kcfg_names[i]); } } diff --git a/kmpp/base/test/kmpp_obj_test.c b/kmpp/base/test/kmpp_obj_test.c index 0f0a905e..c41a29d2 100644 --- a/kmpp/base/test/kmpp_obj_test.c +++ b/kmpp/base/test/kmpp_obj_test.c @@ -34,9 +34,9 @@ static rk_s32 kmpp_obj_std_test(const char *name, rk_u32 flag) KmppObj obj = NULL; MPP_RET ret = MPP_NOK; - ret = kmpp_objdef_get(&def, name); + ret = kmpp_objdef_find(&def, name); if (ret) { - mpp_log("kmpp_objdef_get %s failed\n", name); + mpp_log("kmpp_objdef_find %s failed\n", name); goto done; } @@ -57,22 +57,13 @@ static rk_s32 kmpp_obj_std_test(const char *name, rk_u32 flag) ret = kmpp_obj_put_f(obj); if (ret) { mpp_log("kmpp_obj_put %s failed\n", name); - goto done; } obj = NULL; - - ret = kmpp_objdef_put(def); - if (ret) { - mpp_log("kmpp_objdef_put %s failed\n", name); - goto done; - } def = NULL; done: if (obj) kmpp_obj_put_f(obj); - if (def) - kmpp_objdef_put(def); return ret; }