Files
mpp/kmpp/base/inc/kmpp_obj.h
Herman Chen 6b51725df4 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
2025-04-03 17:18:34 +08:00

266 lines
10 KiB
C

/* SPDX-License-Identifier: Apache-2.0 OR MIT */
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*/
#ifndef __KMPP_OBJ_H__
#define __KMPP_OBJ_H__
#include <linux/types.h>
#include "mpp_trie.h"
/*
* kernel - userspace transaction trie node ctx info (64 bit) definition
*
* +------+--------------------+---------------------------+
* | 8bit | 24 bit | 32 bit |
* +------+--------------------+---------------------------+
*
* bit 0~3 - 4-bit entry type (EntryType)
* 0 - invalid entry
* 1 - trie self info node
* 2 - access location table node
* 3 - ioctl cmd node
*
* bit 4~7 - 4-bit entry flag (EntryFlag) for different entry type
*/
typedef enum EntryType_e {
ENTRY_TYPE_NONE = 0x0, /* invalid entry type */
ENTRY_TYPE_VAL = 0x1, /* 32-bit value */
ENTRY_TYPE_STR = 0x2, /* string info property */
ENTRY_TYPE_LOC_TBL = 0x3, /* entry location table */
ENTRY_TYPE_BUTT,
} EntryType;
/*
* 4-bit extention flag for different entry property
* EntryValFlag - for ENTRY_TYPE_VAL
* EntryValFlag - for ENTRY_TYPE_STR
* EntryLocTblFlag - for ENTRY_TYPE_LOC_TBL
*/
typedef enum EntryValFlag_e {
/*
* 0 - value is unsigned value
* 1 - value is signed value
*/
VALUE_SIGNED = 0x1,
} EntryValFlag;
typedef enum EntryValUsage_e {
VALUE_NORMAL = 0x0,
VALUE_TRIE = 0x10,
/* trie info value */
VALUE_TRIE_INFO = (VALUE_TRIE + 1),
/* trie offset from the trie root */
VALUE_TRIE_OFFSET = (VALUE_TRIE + 2),
/* ioctl cmd */
VALUE_IOCTL_CMD = 0x20,
} EntryValUsage;
typedef enum EntryStrFlag_e {
STRING_NORMAL = 0x0,
/* string is trie self info */
STRING_TRIE = 0x1,
} EntryStrFlag;
typedef enum EntryLocTblFlag_e {
/*
* bit 4 - element can be accessed by kernel
* bit 5 - element can be accessed by userspace
* bit 6 - element is read-only
*/
LOCTBL_KERNEL = 0x1,
LOCTBL_USERSPACE = 0x2,
LOCTBL_READONLY = 0x4,
} EntryLocTblFlag;
typedef enum ElemType_e {
/* commaon fix size value */
ELEM_TYPE_FIX = 0x0,
ELEM_TYPE_s32 = (ELEM_TYPE_FIX + 0),
ELEM_TYPE_u32 = (ELEM_TYPE_FIX + 1),
ELEM_TYPE_s64 = (ELEM_TYPE_FIX + 2),
ELEM_TYPE_u64 = (ELEM_TYPE_FIX + 3),
/* pointer type stored by 64-bit */
ELEM_TYPE_ptr = (ELEM_TYPE_FIX + 4),
/* value only structure */
ELEM_TYPE_st = (ELEM_TYPE_FIX + 5),
/* kernel and userspace share data */
ELEM_TYPE_SHARE = 0x6,
/* share memory between kernel and userspace */
ELEM_TYPE_shm = (ELEM_TYPE_SHARE + 0),
/* kernel access only data */
ELEM_TYPE_KERNEL = 0x8,
/* kenrel object poineter */
ELEM_TYPE_kobj = (ELEM_TYPE_KERNEL + 0),
/* kenrel normal data poineter */
ELEM_TYPE_kptr = (ELEM_TYPE_KERNEL + 1),
/* kernel function poineter */
ELEM_TYPE_kfp = (ELEM_TYPE_KERNEL + 2),
/* userspace access only data */
ELEM_TYPE_USER = 0xc,
/* userspace object poineter */
ELEM_TYPE_uobj = (ELEM_TYPE_USER + 0),
/* userspace normal data poineter */
ELEM_TYPE_uptr = (ELEM_TYPE_USER + 1),
/* userspace function poineter */
ELEM_TYPE_ufp = (ELEM_TYPE_USER + 2),
ELEM_TYPE_BUTT = 0xf,
} ElemType;
/* element update flag type */
typedef enum ElemFlagType_e {
ELEM_FLAG_NONE, /* element without update flag */
ELEM_FLAG_START, /* element update flag will align to new 32bit */
ELEM_FLAG_UPDATE, /* element flag increase by one */
ELEM_FLAG_HOLD, /* element flag equal to previous one */
} ElemFlagType;
typedef union KmppEntry_u {
rk_u64 val;
union {
EntryType type : 4;
struct {
EntryType prop : 4;
EntryValFlag flag : 4;
EntryValUsage usage : 8;
rk_u32 reserve : 16;
rk_u32 val;
} v;
struct {
EntryType prop : 4;
EntryValFlag flag : 4;
rk_u32 len : 24;
rk_u32 offset;
} str;
struct {
EntryType type : 4;
EntryLocTblFlag flag : 4;
ElemType elem_type : 8;
rk_u16 elem_size;
rk_u16 elem_offset;
rk_u16 flag_offset; /* define by ElemFlagType */
} tbl;
};
} KmppEntry;
typedef void (*KmppObjPreset)(void *obj);
typedef rk_s32 (*KmppObjDump)(void *obj);
#ifdef __cplusplus
extern "C" {
#endif
/* query objdef from /dev/kmpp_objs */
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 */
const char *kmpp_objdef_get_name(KmppObjDef def);
rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def);
MppTrie kmpp_objdef_get_trie(KmppObjDef def);
/* import kernel object ref */
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);
rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller);
rk_s32 kmpp_obj_put(KmppObj obj, const char *caller);
rk_s32 kmpp_obj_check(KmppObj obj, const char *caller);
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__)
#define kmpp_obj_get_by_name_f(obj, name) kmpp_obj_get_by_name(obj, name, __FUNCTION__)
#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_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__)
/* 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 */
rk_s32 kmpp_obj_to_shm_size(KmppObj obj);
const char *kmpp_obj_get_name(KmppObj obj);
/*
* entry is the userspace address for kernel share object body
* entry = KmppShmPtr->uaddr + entry_offset
*/
void *kmpp_obj_to_entry(KmppObj obj);
/* offset is the entry offset from kernel share object body */
rk_s32 kmpp_obj_to_offset(KmppObj obj, const char *name);
/* value access function */
rk_s32 kmpp_obj_set_s32(KmppObj obj, const char *name, rk_s32 val);
rk_s32 kmpp_obj_get_s32(KmppObj obj, const char *name, rk_s32 *val);
rk_s32 kmpp_obj_set_u32(KmppObj obj, const char *name, rk_u32 val);
rk_s32 kmpp_obj_get_u32(KmppObj obj, const char *name, rk_u32 *val);
rk_s32 kmpp_obj_set_s64(KmppObj obj, const char *name, rk_s64 val);
rk_s32 kmpp_obj_get_s64(KmppObj obj, const char *name, rk_s64 *val);
rk_s32 kmpp_obj_set_u64(KmppObj obj, const char *name, rk_u64 val);
rk_s32 kmpp_obj_get_u64(KmppObj obj, const char *name, rk_u64 *val);
rk_s32 kmpp_obj_set_st(KmppObj obj, const char *name, void *val);
rk_s32 kmpp_obj_get_st(KmppObj obj, const char *name, void *val);
rk_s32 kmpp_obj_tbl_set_s32(KmppObj obj, KmppEntry *tbl, rk_s32 val);
rk_s32 kmpp_obj_tbl_get_s32(KmppObj obj, KmppEntry *tbl, rk_s32 *val);
rk_s32 kmpp_obj_tbl_set_u32(KmppObj obj, KmppEntry *tbl, rk_u32 val);
rk_s32 kmpp_obj_tbl_get_u32(KmppObj obj, KmppEntry *tbl, rk_u32 *val);
rk_s32 kmpp_obj_tbl_set_s64(KmppObj obj, KmppEntry *tbl, rk_s64 val);
rk_s32 kmpp_obj_tbl_get_s64(KmppObj obj, KmppEntry *tbl, rk_s64 *val);
rk_s32 kmpp_obj_tbl_set_u64(KmppObj obj, KmppEntry *tbl, rk_u64 val);
rk_s32 kmpp_obj_tbl_get_u64(KmppObj obj, KmppEntry *tbl, rk_u64 *val);
rk_s32 kmpp_obj_tbl_set_st(KmppObj obj, KmppEntry *tbl, void *val);
rk_s32 kmpp_obj_tbl_get_st(KmppObj obj, KmppEntry *tbl, void *val);
/* userspace access only function */
rk_s32 kmpp_obj_set_obj(KmppObj obj, const char *name, KmppObj val);
rk_s32 kmpp_obj_get_obj(KmppObj obj, const char *name, KmppObj *val);
rk_s32 kmpp_obj_set_ptr(KmppObj obj, const char *name, void *val);
rk_s32 kmpp_obj_get_ptr(KmppObj obj, const char *name, void **val);
rk_s32 kmpp_obj_set_fp(KmppObj obj, const char *name, void *val);
rk_s32 kmpp_obj_get_fp(KmppObj obj, const char *name, void **val);
rk_s32 kmpp_obj_tbl_set_obj(KmppObj obj, KmppEntry *tbl, KmppObj val);
rk_s32 kmpp_obj_tbl_get_obj(KmppObj obj, KmppEntry *tbl, KmppObj *val);
rk_s32 kmpp_obj_tbl_set_ptr(KmppObj obj, KmppEntry *tbl, void *val);
rk_s32 kmpp_obj_tbl_get_ptr(KmppObj obj, KmppEntry *tbl, void **val);
rk_s32 kmpp_obj_tbl_set_fp(KmppObj obj, KmppEntry *tbl, void *val);
rk_s32 kmpp_obj_tbl_get_fp(KmppObj obj, KmppEntry *tbl, void **val);
/* share access function */
rk_s32 kmpp_obj_set_shm(KmppObj obj, const char *name, KmppShmPtr *val);
rk_s32 kmpp_obj_get_shm(KmppObj obj, const char *name, KmppShmPtr *val);
rk_s32 kmpp_obj_tbl_set_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val);
rk_s32 kmpp_obj_tbl_get_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val);
/* helper for get share object from a share memory element */
rk_s32 kmpp_obj_set_shm_obj(KmppObj obj, const char *name, KmppObj val);
rk_s32 kmpp_obj_get_shm_obj(KmppObj obj, const char *name, KmppObj *val);
/* update flag check function */
rk_s32 kmpp_obj_test(KmppObj obj, const char *name);
rk_s32 kmpp_obj_tbl_test(KmppObj obj, KmppEntry *tbl);
/* run a callback function */
rk_s32 kmpp_obj_run(KmppObj obj, const char *name);
/* dump by userspace */
rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller);
/* dump by kernel */
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__)
#ifdef __cplusplus
}
#endif
#endif /* __KMPP_OBJ_H__ */