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 <herman.chen@rock-chips.com>
Change-Id: Ib4aecfc26f60521288b6e33b8c4e0af5afd3213b
This commit is contained in:
Herman Chen
2025-04-03 15:12:52 +08:00
parent ea8b5af151
commit 6b51725df4
8 changed files with 303 additions and 193 deletions

View File

@@ -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__*/

View File

@@ -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) \

View File

@@ -9,7 +9,6 @@
#include <linux/types.h>
#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 */

View File

@@ -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) \

View File

@@ -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"

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;
}