mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-12-26 11:17:44 +01:00
feat[kmpp_obj]: Add KmppShm allocate function
Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I15cbc70c9df81586fe4f9002dcaed1f52ffcaf3a
This commit is contained in:
parent
b0c69ecb46
commit
8596bbb7aa
3 changed files with 119 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue