From 6b51725df4cba7cc82cc50e8de23e83aa29724f5 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Thu, 3 Apr 2025 15:12:52 +0800 Subject: [PATCH] feat[kmpp]: Add kmpp_frame_test 1. Add kmpp frame / buffer / packet / meta define in rk_type.h 2. Move KmppObj, KmppObjDef and KmppShmPtr to rk_type.h 3. Add kmpp_frame_test 4. Add kmpp_objdef_get_offset function in kmpp_obj.c Signed-off-by: Herman Chen Change-Id: Ib4aecfc26f60521288b6e33b8c4e0af5afd3213b --- inc/rk_type.h | 28 +++ kmpp/base/inc/kmpp_frame.h | 2 - kmpp/base/inc/kmpp_obj.h | 22 +- kmpp/base/inc/kmpp_obj_helper.h | 4 +- kmpp/base/kmpp_frame.c | 4 - kmpp/base/kmpp_obj.c | 385 ++++++++++++++++++------------- kmpp/base/test/CMakeLists.txt | 3 + kmpp/base/test/kmpp_frame_test.c | 48 ++++ 8 files changed, 303 insertions(+), 193 deletions(-) create mode 100644 kmpp/base/test/kmpp_frame_test.c diff --git a/inc/rk_type.h b/inc/rk_type.h index 7b4570c6..cc3dc42d 100644 --- a/inc/rk_type.h +++ b/inc/rk_type.h @@ -182,4 +182,32 @@ typedef void* MppBufferGroup; typedef void* MppTask; typedef void* MppMeta; +/* KmppObjDef - mpp object name size and access table trie definition */ +typedef void* KmppObjDef; +/* KmppObj - mpp object for string name access and function access */ +typedef void* KmppObj; + +/* kmpp transaction object */ +typedef void* KmppMeta; +typedef void* KmppFrame; +typedef void* KmppPacket; + +typedef void* KmppBuffer; +typedef void* KmppBufGrp; + +/* MUST be the same to the KmppObjShm in rk-mpp-kobj.h */ +typedef struct KmppShmPtr_t { + /* uaddr - the userspace base address for userspace access */ + union { + rk_u64 uaddr; + void *uptr; + }; + /* kaddr - the kernel base address for kernel access */ + union { + rk_u64 kaddr; + void *kptr; + }; + /* DO NOT access reserved data only used by kernel */ +} KmppShmPtr; + #endif /*__RK_TYPE_H__*/ diff --git a/kmpp/base/inc/kmpp_frame.h b/kmpp/base/inc/kmpp_frame.h index 1440b326..70c7343d 100644 --- a/kmpp/base/inc/kmpp_frame.h +++ b/kmpp/base/inc/kmpp_frame.h @@ -8,8 +8,6 @@ #include "mpp_frame.h" -typedef void* KmppFrame; - #define KMPP_FRAME_ENTRY_TABLE(ENTRY, prefix) \ ENTRY(prefix, u32, rk_u32, width) \ ENTRY(prefix, u32, rk_u32, height) \ diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index 9139082f..e1d821b2 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -9,7 +9,6 @@ #include #include "mpp_trie.h" - /* * kernel - userspace transaction trie node ctx info (64 bit) definition * @@ -151,26 +150,6 @@ typedef union KmppEntry_u { }; } KmppEntry; -/* MUST be the same to the KmppObjShm in rk-mpp-kobj.h */ -typedef struct KmppShmPtr_t { - /* uaddr - the userspace base address for userspace access */ - union { - rk_u64 uaddr; - void *uptr; - }; - /* kaddr - the kernel base address for kernel access */ - union { - rk_u64 kaddr; - void *kptr; - }; - /* DO NOT access reserved data only used by kernel */ -} KmppShmPtr; - -/* KmppObjDef - mpp object name size and access table trie definition */ -typedef void* KmppObjDef; -/* KmppObj - mpp object for string name access and function access */ -typedef void* KmppObj; - typedef void (*KmppObjPreset)(void *obj); typedef rk_s32 (*KmppObjDump)(void *obj); @@ -183,6 +162,7 @@ rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name); 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); /* mpp objcet internal element set / get function */ diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index 8335c98e..f4a3c88c 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -219,10 +219,8 @@ rk_s32 KMPP_OBJ_FUNC2(prefix, init)(void) __attribute__((constructor)); \ rk_s32 KMPP_OBJ_FUNC2(prefix, init)(void) \ { \ kmpp_objdef_get(&KMPP_OBJ_DEF(prefix), KMPP_OBJ_DEF_NAME(KMPP_OBJ_INTF_TYPE)); \ - if (!KMPP_OBJ_DEF(prefix)) { \ - mpp_loge_f(#prefix " init failed\n"); \ + if (!KMPP_OBJ_DEF(prefix)) \ return rk_nok; \ - } \ KMPP_OBJ_ADD_IOCTL(prefix); \ KMPP_OBJ_ENTRY_TABLE(ENTRY_QUERY, prefix) \ KMPP_OBJ_ENTRY_RO_TABLE(ENTRY_QUERY, prefix) \ diff --git a/kmpp/base/kmpp_frame.c b/kmpp/base/kmpp_frame.c index a877e738..ce06b28a 100644 --- a/kmpp/base/kmpp_frame.c +++ b/kmpp/base/kmpp_frame.c @@ -12,8 +12,4 @@ #define KMPP_OBJ_IMPL_TYPE KmppFrameImpl #define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE #define KMPP_OBJ_STRUCT_TABLE KMPP_FRAME_STRUCT_TABLE -#define KMPP_OBJ_FUNC_INIT kmpp_frame_impl_init -#define KMPP_OBJ_FUNC_DEINIT kmpp_frame_impl_deinit -#define KMPP_OBJ_FUNC_EXPORT_ENABLE -#define KMPP_OBJ_SHARE_ENABLE #include "kmpp_obj_helper.h" diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index f51ed56d..76e388f2 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -127,6 +127,20 @@ typedef struct KmppObjs_t { static rk_u32 kmpp_obj_debug = 0; static KmppObjs *objs = NULL; +#define get_objs(caller) \ +({ \ + KmppObjs *__tmp; \ + if (objs) { \ + __tmp = objs; \ + } else { \ + obj_dbg_flow("kmpp objs srv not init at %s\n", caller); \ + __tmp = NULL; \ + } \ + __tmp; \ +}) + +#define get_objs_f() get_objs(__FUNCTION__) + const char *strof_entry_type(EntryType type) { static const char *ELEM_TYPE_names[] = { @@ -400,16 +414,19 @@ rk_s32 kmpp_objdef_put(KmppObjDef def) rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name) { - KmppObjs *p = objs; + KmppObjs *p = get_objs_f(); MppTrieInfo *info = NULL; - if (!def || !name || !p) { + 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) { mpp_loge_f("failed to get objdef %s\n", name); @@ -446,12 +463,31 @@ rk_s32 kmpp_objdef_get_entry(KmppObjDef def, const char *name, KmppEntry **tbl) } if (ret) - mpp_loge_f("class %s get entry %s failed ret %d\n", - impl ? impl->name : NULL, name, ret); + mpp_loge("objdef %s get entry %s failed ret %d\n", + impl ? impl->name : NULL, name, ret); return ret; } +rk_s32 kmpp_objdef_get_offset(KmppObjDef def, const char *name) +{ + KmppObjDefImpl *impl = (KmppObjDefImpl *)def; + rk_s32 offset = -1; + + if (impl->trie) { + MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); + + if (info) { + KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); + + if (tbl) + offset = tbl->tbl.elem_offset; + } + } + + return offset; +} + rk_s32 kmpp_objdef_dump(KmppObjDef def) { if (def) { @@ -523,6 +559,7 @@ MppTrie kmpp_objdef_get_trie(KmppObjDef def) rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) { + KmppObjs *p = get_objs(caller); KmppObjImpl *impl; KmppObjDefImpl *def_impl; KmppObjIocArg *ioc; @@ -535,6 +572,10 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) } *obj = NULL; + + if (!p) + return ret; + def_impl = (KmppObjDefImpl *)def; impl = mpp_calloc(KmppObjImpl, 1); if (!impl) { @@ -548,10 +589,10 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) ioc->flag = 0; ioc->name_uaddr[0] = (__u64)(intptr_t)def_impl->name; - ret = ioctl(objs->fd, KMPP_SHM_IOC_GET_SHM, ioc); + ret = ioctl(p->fd, KMPP_SHM_IOC_GET_SHM, ioc); if (ret) { mpp_err("%s fd %d ioctl KMPP_SHM_IOC_GET_SHM failed at %s\n", - def_impl->name, objs->fd, caller); + def_impl->name, p->fd, caller); mpp_free(impl); return ret; } @@ -562,13 +603,13 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) impl->trie = def_impl->trie; impl->need_free = 1; impl->shm = U64_TO_PTR(uaddr); - impl->entry = U64_TO_PTR(uaddr + objs->entry_offset); + impl->entry = U64_TO_PTR(uaddr + p->entry_offset); obj_dbg_flow("get obj %s - %p entry [u:k] %llx:%llx at %s\n", def_impl->name, impl, uaddr, ioc->obj_sptr[0].kaddr, caller); /* write userspace object address to share memory userspace private value */ - *(RK_U64 *)U64_TO_PTR(uaddr + objs->priv_offset) = (RK_U64)(intptr_t)impl; + *(RK_U64 *)U64_TO_PTR(uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl; *obj = impl; @@ -577,15 +618,20 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller) rk_s32 kmpp_obj_get_by_name(KmppObj *obj, const char *name, const char *caller) { - KmppObjs *p = objs; + KmppObjs *p = get_objs(caller); MppTrieInfo *info = NULL; - if (!obj || !name || !p) { + if (!obj || !name) { mpp_loge_f("invalid param obj %p name %p objs %p at %s\n", obj, name, p, caller); return rk_nok; } + *obj = NULL; + + if (!p) + return rk_nok; + info = mpp_trie_get_info(p->trie, name); if (!info) { mpp_loge_f("failed to get objdef %s at %s\n", name, caller); @@ -607,6 +653,7 @@ rk_s32 kmpp_obj_get_by_name(KmppObj *obj, const char *name, const char *caller) rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) { + KmppObjs *p = get_objs(caller); KmppObjImpl *impl; KmppObjDefImpl *def; rk_u8 *uptr = sptr ? sptr->uptr : NULL; @@ -620,19 +667,22 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) *obj = NULL; + if (!p) + return ret; + { - rk_u32 val = *((rk_u32 *)(uptr + objs->name_offset)); - char *p; + rk_u32 val = *((rk_u32 *)(uptr + p->name_offset)); + char *str; if (!val) { mpp_loge_f("invalid obj name offset %d at %s\n", val, caller); return ret; } - p = (char *)objs->root + val; - kmpp_objdef_get((KmppObjDef *)&def, p); + str = (char *)p->root + val; + kmpp_objdef_get((KmppObjDef *)&def, str); if (!def) { - mpp_loge_f("failed to get objdef %p - %s at %s\n", p, p, caller); + mpp_loge_f("failed to get objdef %p - %s at %s\n", str, str, caller); return ret; } } @@ -648,13 +698,13 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) impl->trie = def->trie; impl->need_free = 1; impl->shm = (KmppShmPtr *)uptr; - impl->entry = uptr + objs->entry_offset; + impl->entry = uptr + p->entry_offset; obj_dbg_flow("get obj %s - %p by sptr [u:k] %llx:%llx at %s\n", def->name, impl, sptr->uaddr, sptr->kaddr, caller); /* write userspace object address to share memory userspace private value */ - *(RK_U64 *)U64_TO_PTR(sptr->uaddr + objs->priv_offset) = (RK_U64)(intptr_t)impl; + *(RK_U64 *)U64_TO_PTR(sptr->uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl; *obj = impl; @@ -664,9 +714,10 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller) rk_s32 kmpp_obj_put(KmppObj obj, const char *caller) { if (obj) { + KmppObjs *p = get_objs(caller); KmppObjImpl *impl = (KmppObjImpl *)obj; - if (impl->shm) { + if (impl->shm && p && p->fd >= 0) { KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr)); KmppObjDefImpl *def = impl->def; rk_s32 ret; @@ -679,12 +730,11 @@ rk_s32 kmpp_obj_put(KmppObj obj, const char *caller) obj_dbg_flow("put obj %s - %p entry [u:k] %llx:%llx at %s\n", def ? def->name : NULL, impl, impl->shm->uaddr, impl->shm->kaddr, caller); - ret = ioctl(objs->fd, KMPP_SHM_IOC_PUT_SHM, ioc); + ret = ioctl(p->fd, KMPP_SHM_IOC_PUT_SHM, ioc); if (ret) mpp_err("ioctl KMPP_SHM_IOC_PUT_SHM failed ret %d at %s\n", ret, caller); - - impl->shm = NULL; } + impl->shm = NULL; if (impl->need_free) mpp_free(impl); @@ -1072,6 +1122,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller) KmppObjDefImpl *def = impl ? impl->def : NULL; MppTrie trie = NULL; MppTrieInfo *info = NULL; + MppTrieInfo *next = NULL; const char *name = NULL; rk_s32 ret = rk_nok; RK_S32 i = 0; @@ -1086,168 +1137,175 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller) mpp_logi("dump obj %-12s - %p at %s:\n", name, impl, caller); - info = mpp_trie_get_info_first(trie); - while (info) { + next = mpp_trie_get_info_first(trie); + while (next) { + KmppEntry *e; + rk_s32 idx; + + info = next; + next = mpp_trie_get_info_next(trie, info); + + e = (KmppEntry *)mpp_trie_info_ctx(info); name = mpp_trie_info_name(info); - if (!strstr(name, "__")) { - KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); - rk_s32 idx = i++; - switch (tbl->tbl.elem_type) { - case ELEM_TYPE_s32 : { - rk_s32 val; - rk_s32 val_chk; + if (strstr(name, "__")) + continue; - ret = kmpp_obj_tbl_get_s32(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s s32 %#x:%d\n", idx, name, val, val); - else - mpp_loge("%-2d - %-16s s32 get failed\n", idx, name); + idx = i++; - kmpp_obj_get_s32(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s s32 check failed\n", idx, name); - } break; - case ELEM_TYPE_u32 : { - rk_u32 val; - rk_u32 val_chk; + switch (e->tbl.elem_type) { + case ELEM_TYPE_s32 : { + rk_s32 val; + rk_s32 val_chk; - ret = kmpp_obj_tbl_get_u32(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s u32 %#x:%u\n", idx, name, val, val); - else - mpp_loge("%-2d - %-16s u32 get failed\n", idx, name); + ret = kmpp_obj_tbl_get_s32(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s s32 %#x:%d\n", idx, name, val, val); + else + mpp_loge("%-2d - %-16s s32 get failed\n", idx, name); - kmpp_obj_get_u32(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s u32 check failed\n", idx, name); - } break; - case ELEM_TYPE_s64 : { - rk_s64 val; - rk_s64 val_chk; + kmpp_obj_get_s32(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s s32 check failed\n", idx, name); + } break; + case ELEM_TYPE_u32 : { + rk_u32 val; + rk_u32 val_chk; - ret = kmpp_obj_tbl_get_s64(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s s64 %#llx:%lld\n", idx, name, val, val); - else - mpp_loge("%-2d - %-16s s64 get failed\n", idx, name); + ret = kmpp_obj_tbl_get_u32(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s u32 %#x:%u\n", idx, name, val, val); + else + mpp_loge("%-2d - %-16s u32 get failed\n", idx, name); - kmpp_obj_get_s64(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s s64 check failed\n", idx, name); - } break; - case ELEM_TYPE_u64 : { - rk_u64 val; - rk_u64 val_chk; + kmpp_obj_get_u32(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s u32 check failed\n", idx, name); + } break; + case ELEM_TYPE_s64 : { + rk_s64 val; + rk_s64 val_chk; - ret = kmpp_obj_tbl_get_u64(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s u64 %#llx:%llu\n", idx, name, val, val); - else - mpp_loge("%-2d - %-16s u64 get failed\n", idx, name); + ret = kmpp_obj_tbl_get_s64(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s s64 %#llx:%lld\n", idx, name, val, val); + else + mpp_loge("%-2d - %-16s s64 get failed\n", idx, name); - kmpp_obj_get_u64(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s u64 check failed\n", idx, name); - } break; - case ELEM_TYPE_st : { - void *val_chk = mpp_malloc_size(void, tbl->tbl.elem_size); - void *val = mpp_malloc_size(void, tbl->tbl.elem_size); - rk_s32 data_size = tbl->tbl.elem_size; - char logs[128]; + kmpp_obj_get_s64(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s s64 check failed\n", idx, name); + } break; + case ELEM_TYPE_u64 : { + rk_u64 val; + rk_u64 val_chk; - ret = kmpp_obj_tbl_get_st(obj, tbl, val); - if (!ret) { - rk_s32 pos; + ret = kmpp_obj_tbl_get_u64(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s u64 %#llx:%llu\n", idx, name, val, val); + else + mpp_loge("%-2d - %-16s u64 get failed\n", idx, name); - mpp_logi("%-2d - %-16s st %d:%d\n", - idx, name, tbl->tbl.elem_offset, data_size); + kmpp_obj_get_u64(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s u64 check failed\n", idx, name); + } break; + case ELEM_TYPE_st : { + void *val_chk = mpp_malloc_size(void, e->tbl.elem_size); + void *val = mpp_malloc_size(void, e->tbl.elem_size); + rk_s32 data_size = e->tbl.elem_size; + char logs[128]; - i = 0; - for (; i < data_size / 4 - 8; i += 8) { - snprintf(logs, sizeof(logs) - 1, "%-2x - %#08x %#08x %#08x %#08x %#08x %#08x %#08x %#08x", i, - ((RK_U32 *)val)[i + 0], ((RK_U32 *)val)[i + 1], - ((RK_U32 *)val)[i + 2], ((RK_U32 *)val)[i + 3], - ((RK_U32 *)val)[i + 4], ((RK_U32 *)val)[i + 5], - ((RK_U32 *)val)[i + 6], ((RK_U32 *)val)[i + 7]); + ret = kmpp_obj_tbl_get_st(obj, e, val); + if (!ret) { + rk_s32 pos; + rk_s32 j; - mpp_logi("%s\n", logs); - } + mpp_logi("%-2d - %-16s st %d:%d\n", idx, name, e->tbl.elem_offset, data_size); - pos = snprintf(logs, sizeof(logs) - 1, "%-2x -", i); - for (; i < data_size / 4; i++) - pos += snprintf(logs + pos, sizeof(logs) - 1 - pos, " %#08x", ((RK_U32 *)val)[i]); + j = 0; + for (; j < data_size / 4 - 8; j += 8) { + snprintf(logs, sizeof(logs) - 1, " - %02x : %#08x %#08x %#08x %#08x %#08x %#08x %#08x %#08x", j, + ((RK_U32 *)val)[j + 0], ((RK_U32 *)val)[j + 1], + ((RK_U32 *)val)[j + 2], ((RK_U32 *)val)[j + 3], + ((RK_U32 *)val)[j + 4], ((RK_U32 *)val)[j + 5], + ((RK_U32 *)val)[j + 6], ((RK_U32 *)val)[j + 7]); mpp_logi("%s\n", logs); - } else - mpp_loge("%-2d - %-16s st get failed\n", idx, name); - - kmpp_obj_get_st(obj, name, val_chk); - if (memcmp(val, val_chk, tbl->tbl.elem_size)) { - mpp_loge("%-2d - %-16s st check failed\n", idx, name); - mpp_loge("val %p\n", val); - mpp_loge("val_chk %p\n", val_chk); } - MPP_FREE(val); - MPP_FREE(val_chk); - } break; - case ELEM_TYPE_shm : { - KmppShmPtr *val_chk = mpp_malloc_size(void, tbl->tbl.elem_size); - KmppShmPtr *val = mpp_malloc_size(void, tbl->tbl.elem_size); + pos = snprintf(logs, sizeof(logs) - 1, " - %02x :", j); + for (; j < data_size / 4; j++) + pos += snprintf(logs + pos, sizeof(logs) - 1 - pos, " %#08x", ((RK_U32 *)val)[j]); - ret = kmpp_obj_tbl_get_st(obj, tbl, val); - if (!ret) - mpp_logi("%-2d - %-16s shm u%#llx:k%#llx\n", - idx, name, val->uaddr, val->kaddr); - else - mpp_loge("%-2d - %-16s shm get failed\n", idx, name); + mpp_logi("%s\n", logs); + } else + mpp_loge("%-2d - %-16s st get failed\n", idx, name); - kmpp_obj_get_st(obj, name, val_chk); - if (memcmp(val, val_chk, tbl->tbl.elem_size)) { - mpp_loge("%-2d - %-16s shm check failed\n", idx, name); - mpp_loge("val %p - %#llx:%#llx\n", val, val->uaddr, val->kaddr); - mpp_loge("val_chk %p - %#llx:%#llx\n", val_chk, val_chk->uaddr, val_chk->kaddr); - } - - MPP_FREE(val); - MPP_FREE(val_chk); - } break; - case ELEM_TYPE_uptr : { - void *val; - void *val_chk; - - ret = kmpp_obj_tbl_get_ptr(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s ptr %p\n", idx, name, val); - else - mpp_loge("%-2d - %-16s ptr get failed\n", idx, name); - - kmpp_obj_get_ptr(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s ptr check failed\n", idx, name); - } break; - case ELEM_TYPE_ufp : { - void *val; - void *val_chk; - - ret = kmpp_obj_tbl_get_fp(obj, tbl, &val); - if (!ret) - mpp_logi("%-2d - %-16s fp %p\n", idx, name, val); - else - mpp_loge("%-2d - %-16s fp get failed\n", idx, name); - - kmpp_obj_get_fp(obj, name, &val_chk); - if (val != val_chk) - mpp_loge("%-2d - %-16s fp check failed\n", idx, name); - } break; - default : { - mpp_loge("%-2d - %-16s found invalid type %d\n", idx, name, tbl->tbl.elem_type); - ret = rk_nok; - } break; + kmpp_obj_get_st(obj, name, val_chk); + if (memcmp(val, val_chk, e->tbl.elem_size)) { + mpp_loge("%-2d - %-16s st check failed\n", idx, name); + mpp_loge("val %p\n", val); + mpp_loge("val_chk %p\n", val_chk); } + + MPP_FREE(val); + MPP_FREE(val_chk); + } break; + case ELEM_TYPE_shm : { + KmppShmPtr *val_chk = mpp_malloc_size(void, e->tbl.elem_size); + KmppShmPtr *val = mpp_malloc_size(void, e->tbl.elem_size); + + ret = kmpp_obj_tbl_get_st(obj, e, val); + if (!ret) + mpp_logi("%-2d - %-16s shm u%#llx:k%#llx\n", + idx, name, val->uaddr, val->kaddr); + else + mpp_loge("%-2d - %-16s shm get failed\n", idx, name); + + kmpp_obj_get_st(obj, name, val_chk); + if (memcmp(val, val_chk, e->tbl.elem_size)) { + mpp_loge("%-2d - %-16s shm check failed\n", idx, name); + mpp_loge("val %p - %#llx:%#llx\n", val, val->uaddr, val->kaddr); + mpp_loge("val_chk %p - %#llx:%#llx\n", val_chk, val_chk->uaddr, val_chk->kaddr); + } + + MPP_FREE(val); + MPP_FREE(val_chk); + } break; + case ELEM_TYPE_uptr : { + void *val; + void *val_chk; + + ret = kmpp_obj_tbl_get_ptr(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s ptr %p\n", idx, name, val); + else + mpp_loge("%-2d - %-16s ptr get failed\n", idx, name); + + kmpp_obj_get_ptr(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s ptr check failed\n", idx, name); + } break; + case ELEM_TYPE_ufp : { + void *val; + void *val_chk; + + ret = kmpp_obj_tbl_get_fp(obj, e, &val); + if (!ret) + mpp_logi("%-2d - %-16s fp %p\n", idx, name, val); + else + mpp_loge("%-2d - %-16s fp get failed\n", idx, name); + + kmpp_obj_get_fp(obj, name, &val_chk); + if (val != val_chk) + mpp_loge("%-2d - %-16s fp check failed\n", idx, name); + } break; + default : { + mpp_loge("%-2d - %-16s found invalid type %d\n", idx, name, e->tbl.elem_type); + ret = rk_nok; + } break; } - info = mpp_trie_get_info_next(trie, info); } return ret ? rk_nok : rk_ok; @@ -1255,18 +1313,19 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller) rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller) { + KmppObjs *p = get_objs(caller); KmppObjImpl *impl = (KmppObjImpl *)obj; KmppObjDefImpl *def = impl ? impl->def : NULL; rk_s32 ret = rk_nok; - if (!impl || !def) { - mpp_loge_f("invalid obj %p def %p\n", impl, def); + if (!impl || !def || !p) { + mpp_loge_f("invalid obj %p def %p objs %p\n", impl, def, p); return rk_nok; } mpp_logi("dump obj %-12s - %p at %s by kernel\n", def->name, impl, caller); - ret = ioctl(objs->fd, KMPP_SHM_IOC_DUMP, impl->shm); + ret = ioctl(p->fd, KMPP_SHM_IOC_DUMP, impl->shm); if (ret) mpp_err("ioctl KMPP_SHM_IOC_DUMP failed ret %d\n", ret); diff --git a/kmpp/base/test/CMakeLists.txt b/kmpp/base/test/CMakeLists.txt index 61d53e90..bcea9fe8 100644 --- a/kmpp/base/test/CMakeLists.txt +++ b/kmpp/base/test/CMakeLists.txt @@ -21,3 +21,6 @@ endmacro() # kmpp object unit test add_kmpp_base_test(kmpp_obj) + +# kmpp frame unit test +add_kmpp_base_test(kmpp_frame) diff --git a/kmpp/base/test/kmpp_frame_test.c b/kmpp/base/test/kmpp_frame_test.c new file mode 100644 index 00000000..007020f4 --- /dev/null +++ b/kmpp/base/test/kmpp_frame_test.c @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_frame_test" + +#include "mpp_debug.h" +#include "kmpp_frame.h" + +#define KMPP_FRAME_TEST_SIZE 1024 + +#define TEST_CHECK(ret, func, ...) \ + do { \ + ret = func(__VA_ARGS__); \ + if (ret) { \ + mpp_err(MODULE_TAG " %s failed ret %d\n", #func, ret); \ + goto failed; \ + } \ + } while (0) + +int main() +{ + KmppFrame frame = NULL; + rk_u32 width = 1920; + rk_u32 height = 1080; + rk_u32 val = 0; + rk_s32 ret = rk_ok; + + mpp_log(MODULE_TAG " start\n"); + + TEST_CHECK(ret, kmpp_frame_get, &frame); + TEST_CHECK(ret, kmpp_frame_set_width, frame, width); + TEST_CHECK(ret, kmpp_frame_set_height, frame, height); + + kmpp_frame_dump(frame, "test"); + + TEST_CHECK(ret, kmpp_frame_get_width, frame, &val); + mpp_assert(val == width); + TEST_CHECK(ret, kmpp_frame_get_height, frame, &val); + mpp_assert(val == height); + +failed: + kmpp_frame_put(frame); + + mpp_log(MODULE_TAG " %s\n", ret ? "failed" : "success"); + return ret; +}