From 8596bbb7aaa2385e07cfa4861e32d34b938df36b Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Mon, 15 Sep 2025 17:36:02 +0800 Subject: [PATCH] feat[kmpp_obj]: Add KmppShm allocate function Signed-off-by: Herman Chen Change-Id: I15cbc70c9df81586fe4f9002dcaed1f52ffcaf3a --- kmpp/base/inc/kmpp_obj.h | 6 +++ kmpp/base/kmpp_obj.c | 80 ++++++++++++++++++++++++++++++++++ kmpp/base/test/kmpp_obj_test.c | 33 ++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index 2a5f7590..42a654de 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -164,6 +164,12 @@ rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller); #define kmpp_obj_udump(obj) kmpp_obj_udump_f(obj, __FUNCTION__) #define kmpp_obj_kdump(obj) kmpp_obj_kdump_f(obj, __FUNCTION__) +rk_s32 kmpp_shm_get(KmppShmPtr **shm, rk_s32 size, const char *caller); +rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller); + +#define kmpp_shm_get_f(shm, size) kmpp_shm_get(shm, size, __FUNCTION__) +#define kmpp_shm_put_f(shm) kmpp_shm_put(shm, __FUNCTION__) + const char *strof_elem_type(ElemType type); #ifdef __cplusplus diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index 450fd75a..4d33a31d 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -76,6 +76,15 @@ #define ENTRY_TEST_FLAG(e, entry) \ (*ENTRY_TO_FLAG_PTR(e, entry) & 1ul << (ELEM_FLAG_BIT_POS(e->tbl.flag_offset))) ? 1 : 0 +typedef struct KmppShmReq_t { + /* shm_name - NULL name addresss for shm direct allocation */ + __u64 shm_name; + /* shm_size - share memory size for shm direct allocation */ + __u32 shm_size; + /* shm_flag - share memory allocation flags */ + __u32 shm_flag; +} KmppShmReq; + /* kernel object share memory get / put ioctl data */ typedef struct KmppObjIocArg_t { /* address array element count */ @@ -96,6 +105,7 @@ typedef struct KmppObjIocArg_t { __u64 name_uaddr[0]; /* ioctl object userspace / kernel address */ KmppShmPtr obj_sptr[0]; + KmppShmReq shm_req[0]; }; } KmppObjIocArg; @@ -1835,3 +1845,73 @@ rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller) return ret ? rk_nok : rk_ok; } + +rk_s32 kmpp_shm_get(KmppShmPtr **shm, rk_s32 size, const char *caller) +{ + KmppObjs *p; + KmppObjIocArg *ioc; + rk_s32 ret = rk_nok; + + if (!shm || !size) { + mpp_loge_f("invalid param shm %p size %d at %s\n", shm, size, caller); + return ret; + } + + *shm = NULL; + + /* kernel objdef path */ + p = get_objs(caller); + if (!p) + return ret; + + ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr)); + + ioc->count = 1; + ioc->flag = 0; + ioc->shm_req->shm_name = 0; + ioc->shm_req->shm_size = size; + ioc->shm_req->shm_flag = 0; + + ret = ioctl(p->fd, KMPP_SHM_IOC_GET_SHM, ioc); + if (ret) { + mpp_err("shm fd %d ioctl KMPP_SHM_IOC_GET_SHM failed at %s\n", + p->fd, caller); + return ret; + } + + *shm = (KmppShmPtr *)U64_TO_PTR(ioc->obj_sptr[0].uaddr); + + return *shm ? rk_ok : rk_nok; +} + +rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller) +{ + KmppObjs *p = get_objs(caller); + rk_s32 ret = rk_nok; + + if (!shm) { + mpp_loge_f("invalid param shm %p at %s\n", shm, caller); + return ret; + } + + if (!p) + return ret; + + if (p && p->fd >= 0) { + KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr)); + + ioc->count = 1; + ioc->flag = 0; + ioc->obj_sptr[0].uaddr = shm->uaddr; + ioc->obj_sptr[0].kaddr = shm->kaddr; + + obj_dbg_flow("put shm %p entry [u:k] %llx:%llx at %s\n", + shm, shm->uaddr, shm->kaddr, caller); + + 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); + } + + return ret; +} diff --git a/kmpp/base/test/kmpp_obj_test.c b/kmpp/base/test/kmpp_obj_test.c index c41a29d2..74cd383d 100644 --- a/kmpp/base/test/kmpp_obj_test.c +++ b/kmpp/base/test/kmpp_obj_test.c @@ -234,6 +234,34 @@ done: return ret; } +static rk_s32 kmpp_shm_test(const char *name, rk_u32 flag) +{ + KmppShmPtr *shm[4]; + rk_u32 sizes[4] = {512, 4096, 4096 * 4, 4096 * 4096}; + rk_s32 ret = rk_ok; + rk_u32 i; + (void)name; + (void)flag; + + for (i = 0; i < MPP_ARRAY_ELEMS(sizes); i++) { + kmpp_shm_get_f(&shm[i], sizes[i]); + if (!shm[i]) { + mpp_log_f("shm get size %d failed\n", sizes[i]); + ret = rk_nok; + } + } + + for (i = 0; i < MPP_ARRAY_ELEMS(sizes); i++) { + if (kmpp_shm_put_f(shm[i])) { + mpp_log_f("shm put size %d failed\n", sizes[i]); + ret = rk_nok; + } + shm[i] = NULL; + } + + return ret; +} + static KmppObjTest obj_tests[] = { { "KmppFrame", @@ -250,6 +278,11 @@ static KmppObjTest obj_tests[] = { 0, kmpp_buffer_test, }, + { + "kmpp_shm_test", + 0, + kmpp_shm_test, + }, }; int main()