From f662bfc1c1f5a45d15302cb9b89f8c3c464685f7 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Mon, 26 May 2025 18:01:28 +0800 Subject: [PATCH] feat[kmpp_obj]: Refactor kmpp_obj helper 1. Integrate simple element and struct element to one macro. 2. Resolve different update flag mode. 3. Support hierarchy definition for future config file registration. Signed-off-by: Herman Chen Change-Id: I691a99aafec3f4e9d4e883e172d2b82ace44e379 --- kmpp/base/inc/kmpp_frame.h | 49 ++- kmpp/base/inc/kmpp_obj_func.h | 128 ++----- kmpp/base/inc/kmpp_obj_helper.h | 614 ++++++++++++++++++++------------ kmpp/base/inc/kmpp_obj_macro.h | 44 +++ kmpp/base/kmpp_frame.c | 2 +- mpp/inc/mpp_internal.h | 51 ++- 6 files changed, 536 insertions(+), 352 deletions(-) create mode 100644 kmpp/base/inc/kmpp_obj_macro.h diff --git a/kmpp/base/inc/kmpp_frame.h b/kmpp/base/inc/kmpp_frame.h index 70c7343d..def35684 100644 --- a/kmpp/base/inc/kmpp_frame.h +++ b/kmpp/base/inc/kmpp_frame.h @@ -8,31 +8,29 @@ #include "mpp_frame.h" -#define KMPP_FRAME_ENTRY_TABLE(ENTRY, prefix) \ - ENTRY(prefix, u32, rk_u32, width) \ - ENTRY(prefix, u32, rk_u32, height) \ - ENTRY(prefix, u32, rk_u32, hor_stride) \ - ENTRY(prefix, u32, rk_u32, ver_stride) \ - ENTRY(prefix, u32, rk_u32, hor_stride_pixel) \ - ENTRY(prefix, u32, rk_u32, offset_x) \ - ENTRY(prefix, u32, rk_u32, offset_y) \ - ENTRY(prefix, u32, rk_u32, poc) \ - ENTRY(prefix, s64, rk_s64, pts) \ - ENTRY(prefix, s64, rk_s64, dts) \ - ENTRY(prefix, u32, rk_u32, eos) \ - ENTRY(prefix, u32, rk_u32, color_range) \ - ENTRY(prefix, u32, rk_u32, color_primaries) \ - ENTRY(prefix, u32, rk_u32, color_trc) \ - ENTRY(prefix, u32, rk_u32, colorspace) \ - ENTRY(prefix, u32, rk_u32, chroma_location) \ - ENTRY(prefix, u32, rk_u32, fmt) \ - ENTRY(prefix, u32, rk_u32, buf_size) \ - ENTRY(prefix, u32, rk_u32, is_gray) - -#define KMPP_FRAME_STRUCT_TABLE(ENTRY, prefix) \ - ENTRY(prefix, shm, KmppShmPtr, meta) \ - ENTRY(prefix, shm, KmppShmPtr, buffer) \ - ENTRY(prefix, st, MppFrameRational, sar) +#define KMPP_FRAME_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS) \ + ENTRY(prefix, u32, rk_u32, width, ELEM_FLAG_NONE, width) \ + ENTRY(prefix, u32, rk_u32, height, ELEM_FLAG_NONE, height) \ + ENTRY(prefix, u32, rk_u32, hor_stride, ELEM_FLAG_NONE, hor_stride) \ + ENTRY(prefix, u32, rk_u32, ver_stride, ELEM_FLAG_NONE, ver_stride) \ + ENTRY(prefix, u32, rk_u32, hor_stride_pixel, ELEM_FLAG_NONE, hor_stride_pixel) \ + ENTRY(prefix, u32, rk_u32, offset_x, ELEM_FLAG_NONE, offset_x) \ + ENTRY(prefix, u32, rk_u32, offset_y, ELEM_FLAG_NONE, offset_y) \ + ENTRY(prefix, u32, rk_u32, poc, ELEM_FLAG_NONE, poc) \ + ENTRY(prefix, s64, rk_s64, pts, ELEM_FLAG_NONE, pts) \ + ENTRY(prefix, s64, rk_s64, dts, ELEM_FLAG_NONE, dts) \ + ENTRY(prefix, u32, rk_u32, eos, ELEM_FLAG_NONE, eos) \ + ENTRY(prefix, u32, rk_u32, color_range, ELEM_FLAG_NONE, color_range) \ + ENTRY(prefix, u32, rk_u32, color_primaries, ELEM_FLAG_NONE, color_primaries) \ + ENTRY(prefix, u32, rk_u32, color_trc, ELEM_FLAG_NONE, color_trc) \ + ENTRY(prefix, u32, rk_u32, colorspace, ELEM_FLAG_NONE, colorspace) \ + ENTRY(prefix, u32, rk_u32, chroma_location, ELEM_FLAG_NONE, chroma_location) \ + ENTRY(prefix, u32, rk_u32, fmt, ELEM_FLAG_NONE, fmt) \ + ENTRY(prefix, u32, rk_u32, buf_size, ELEM_FLAG_NONE, buf_size) \ + ENTRY(prefix, u32, rk_u32, is_gray, ELEM_FLAG_NONE, is_gray) \ + STRCT(prefix, shm, KmppShmPtr, meta, ELEM_FLAG_NONE, meta) \ + STRCT(prefix, shm, KmppShmPtr, buffer, ELEM_FLAG_NONE, buffer) \ + STRCT(prefix, st, MppFrameRational, sar, ELEM_FLAG_NONE, sar) #ifdef __cplusplus extern "C" { @@ -41,7 +39,6 @@ extern "C" { #define KMPP_OBJ_NAME kmpp_frame #define KMPP_OBJ_INTF_TYPE KmppFrame #define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE -#define KMPP_OBJ_STRUCT_TABLE KMPP_FRAME_STRUCT_TABLE #include "kmpp_obj_func.h" #ifdef __cplusplus diff --git a/kmpp/base/inc/kmpp_obj_func.h b/kmpp/base/inc/kmpp_obj_func.h index b61d6825..ccd855fa 100644 --- a/kmpp/base/inc/kmpp_obj_func.h +++ b/kmpp/base/inc/kmpp_obj_func.h @@ -3,6 +3,8 @@ * Copyright (c) 2024 Rockchip Electronics Co., Ltd. */ +#include "kmpp_obj_macro.h" + #ifndef KMPP_OBJ_NAME #error "KMPP_OBJ_NAME must be defined on using kmpp_obj_func.h" #endif @@ -11,111 +13,55 @@ #error "KMPP_OBJ_INTF_TYPE must be defined on using kmpp_obj_func.h" #endif -#ifndef KMPP_OBJ_CONCAT2 -#define KMPP_OBJ_CONCAT2(a, b) a##_##b -#endif -#ifndef KMPP_OBJ_CONCAT3 -#define KMPP_OBJ_CONCAT3(a, b, c) a##_##b##_##c -#endif -#ifndef KMPP_OBJ_CONCAT4 -#define KMPP_OBJ_CONCAT4(a, b, c, d) a##_##b##_##c##_##d -#endif +#include "rk_type.h" +/* always define object common function */ #define KMPP_OBJ_FUNC_DEFINE(prefix) \ -rk_s32 KMPP_OBJ_CONCAT2(prefix, size)(void); \ -rk_s32 KMPP_OBJ_CONCAT2(prefix, get)(KMPP_OBJ_INTF_TYPE *p); \ -rk_s32 KMPP_OBJ_CONCAT2(prefix, put)(KMPP_OBJ_INTF_TYPE p); \ -rk_s32 KMPP_OBJ_CONCAT2(prefix, dump)(KMPP_OBJ_INTF_TYPE p, const char *caller); + rk_s32 CONCAT_US(prefix, init)(void); \ + rk_s32 CONCAT_US(prefix, deinit)(void); \ + rk_s32 CONCAT_US(prefix, size)(void); \ + rk_s32 CONCAT_US(prefix, get)(KMPP_OBJ_INTF_TYPE *p); \ + rk_s32 CONCAT_US(prefix, assign)(KMPP_OBJ_INTF_TYPE *p, void *buf, rk_s32 size); \ + rk_s32 CONCAT_US(prefix, put)(KMPP_OBJ_INTF_TYPE p); \ + rk_s32 CONCAT_US(prefix, dump)(KMPP_OBJ_INTF_TYPE p, const char *caller); KMPP_OBJ_FUNC_DEFINE(KMPP_OBJ_NAME) +#undef KMPP_OBJ_FUNC_DEFINE -/* simple entry access funcitons */ +/* entry and hook access funcitons */ #ifdef KMPP_OBJ_ENTRY_TABLE -#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, ...) \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, test, f1)(KMPP_OBJ_INTF_TYPE p); +/* disable all hierarchy macro in header */ +#define CFG_DEF_START(...) +#define CFG_DEF_END(...) +#define STRUCT_START(...) +#define STRUCT_END(...) -KMPP_OBJ_ENTRY_TABLE(ENTRY_TO_DECLARE, KMPP_OBJ_NAME) +#define ENTRY_DECLARE(prefix, ftype, type, name, flag, ...) \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type val); \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \ + rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p); -#undef KMPP_OBJ_ENTRY_TABLE -#undef ENTRY_TO_DECLARE -#endif +#define STRCT_DECLARE(prefix, ftype, type, name, flag, ...) \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \ + rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p); -/* simple entry read-only access funcitons */ -#ifdef KMPP_OBJ_ENTRY_RO_TABLE -#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, ...) \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); +#define ALIAS_DECLARE(prefix, ftype, type, name, flag, ...) -KMPP_OBJ_ENTRY_RO_TABLE(ENTRY_TO_DECLARE, KMPP_OBJ_NAME) +KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_DECLARE, STRCT_DECLARE, + ENTRY_DECLARE, STRCT_DECLARE, ALIAS_DECLARE) -#undef KMPP_OBJ_ENTRY_RO_TABLE -#undef ENTRY_TO_DECLARE -#endif +#undef ENTRY_DECLARE +#undef ENTRY_TO_ALIAS +#undef STRCT_DECLARE -/* structure entry access funcitons */ -#ifdef KMPP_OBJ_STRUCT_TABLE -#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, test, f1)(KMPP_OBJ_INTF_TYPE p); +#undef CFG_DEF_START +#undef CFG_DEF_END +#undef STRUCT_START +#undef STRUCT_END -KMPP_OBJ_STRUCT_TABLE(STRUCT_TO_DECLARE, KMPP_OBJ_NAME) - -#undef KMPP_OBJ_STRUCT_TABLE -#undef STRUCT_TO_DECLARE -#endif - -/* simple entry hook access funcitons */ -#ifdef KMPP_OBJ_ENTRY_HOOK -#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); - -KMPP_OBJ_ENTRY_HOOK(STRUCT_TO_DECLARE, KMPP_OBJ_NAME) - -#undef KMPP_OBJ_ENTRY_HOOK -#undef STRUCT_TO_DECLARE -#endif - -/* structure entry hook access funcitons */ -#ifdef KMPP_OBJ_STRUCT_HOOK -#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); - -KMPP_OBJ_STRUCT_HOOK(STRUCT_TO_DECLARE, KMPP_OBJ_NAME) - -#undef KMPP_OBJ_STRUCT_HOOK -#undef STRUCT_TO_DECLARE -#endif - -/* internal structure simple entry access funcitons */ -#ifdef KMPP_OBJ_ENTRY_TABLE2 -#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, f2, ...) \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE p, type val); \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE p); - -KMPP_OBJ_ENTRY_TABLE2(ENTRY_TO_DECLARE, KMPP_OBJ_NAME) - -#undef KMPP_OBJ_ENTRY_TABLE2 -#undef ENTRY_TO_DECLARE -#endif - -/* internal structure entry access funcitons */ -#ifdef KMPP_OBJ_STRUCT_TABLE2 -#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, f2, ...) \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \ - rk_s32 KMPP_OBJ_CONCAT4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE p); - -KMPP_OBJ_STRUCT_TABLE2(ENTRY_TO_DECLARE, KMPP_OBJ_NAME) - -#undef KMPP_OBJ_STRUCT_TABLE2 -#undef ENTRY_TO_DECLARE #endif #undef KMPP_OBJ_NAME #undef KMPP_OBJ_INTF_TYPE -#undef KMPP_OBJ_FUNC_DEFINE +#undef KMPP_OBJ_ENTRY_TABLE diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index dcd5a59a..662d4437 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -3,8 +3,14 @@ * Copyright (c) 2024 Rockchip Electronics Co., Ltd. */ -#ifndef __KMPP_OBJ_HERLPER_H__ -#define __KMPP_OBJ_HERLPER_H__ +#include "kmpp_obj_macro.h" + +#ifdef __OBJECT_HERLPER_H__ +#error “MUST NOT include obj_helper.h within obj_helper.h“ +#endif + +/* define object helper for loop include detection */ +#define __OBJECT_HERLPER_H__ #if !defined(KMPP_OBJ_NAME) || \ !defined(KMPP_OBJ_INTF_TYPE) || \ @@ -15,12 +21,16 @@ #warning "KMPP_OBJ_INTF_TYPE - object interface type" #warning "KMPP_OBJ_IMPL_TYPE - object implement type" #warning "option macro:" +#warning "KMPP_OBJ_EXTRA_SIZE - object extra size in bytes" #warning "KMPP_OBJ_ENTRY_TABLE - object element value / pointer entry table" -#warning "KMPP_OBJ_STRUCT_TABLE - object element structure / array / share memory table" -#warning "KMPP_OBJ_ENTRY_TABLE2 - object element value / pointer entry 2 level table" -#warning "KMPP_OBJ_STRUCT_TABLE2 - object element structure / array / share memory 2 level table" #warning "KMPP_OBJ_FUNC_IOCTL - object element ioctl cmd and function table" -#warning "KMPP_OBJ_FUNC_STUB_ENABLE - enable function stub mode by define empty function" +#warning "KMPP_OBJ_FUNC_INIT - add object init function" +#warning "KMPP_OBJ_FUNC_DEINIT - add object deinit function" +#warning "KMPP_OBJ_FUNC_DUMP - add object dump function" +#warning "KMPP_OBJ_FUNC_EXPORT_DISABLE - disable function exprot by EXPORT_SYMBOL" +#warning "KMPP_OBJ_ACCESS_DISABLE - disable access function creation" +#warning "KMPP_OBJ_SHARE_DISABLE - disable object sharing by /dev/kmpp_objs to userspace" +#warning "KMPP_OBJ_HIERARCHY_ENABLE - enable hierarchy name creation" #ifndef KMPP_OBJ_NAME #error "KMPP_OBJ_NAME not defined" @@ -34,252 +44,398 @@ #else /* all input macro defined */ -#include #include +#define KMPP_OBJ_DEF(x) CONCAT_US(x, def) +#define KMPP_OBJ_DEF_NAME(x) TO_STR(x) + +#ifndef KMPP_OBJ_EXTRA_SIZE +#define KMPP_OBJ_EXTRA_SIZE 0 +#endif + +#ifndef KMPP_OBJ_ENTRY_TABLE +#define KMPP_OBJ_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS) +#endif + +/* + * macro for register structure fiedl to trie + * type -> struct base type + * f1 -> struct:name1 name segment 1 the name1 part + * f2 -> struct:name1:name2 name segment 2 the name2 part + * ftype -> name type as ElemType + * flag -> name update flag type + */ +#define FLAG_TYPE_TO_OFFSET(flag) \ + ({ \ + rk_u16 __offset; \ + rk_s32 __flag_op = flag & ELEM_FLAG_OP_MASK; \ + switch (__flag_op) { \ + case ELEM_FLAG_NONE : __offset = 0; break; \ + case ELEM_FLAG_START : __flag_base = ((__flag_base + 31) & (~31)); __offset = __flag_base++; break; \ + case ELEM_FLAG_UPDATE : __offset = __flag_base++; break; \ + case ELEM_FLAG_HOLD : __offset = __flag_base; break; \ + default : __offset = 0; break; \ + }; \ + if (flag & (ELEM_FLAG_RECORD | ELEM_FLAG_REPLAY)) { \ + rk_s32 __flag_idx = flag & ELEM_FLAG_IDX_MASK; \ + if (flag & ELEM_FLAG_RECORD) \ + __flag_record[__flag_idx] = __offset; \ + else \ + __offset = __flag_record[__flag_idx]; \ + } \ + __offset; \ + }) + +#define ENTRY_TO_TRIE(prefix, ftype, type, name, flag, ...) \ + do { \ + KmppEntry tbl = { \ + .tbl.elem_offset = ((size_t)&(((KMPP_OBJ_IMPL_TYPE *)0)->CONCAT_DOT(__VA_ARGS__))), \ + .tbl.elem_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->CONCAT_DOT(__VA_ARGS__)), \ + .tbl.elem_type = ELEM_TYPE_##ftype, \ + .tbl.flag_offset = FLAG_TYPE_TO_OFFSET(flag), \ + }; \ + kmpp_objdef_add_entry(KMPP_OBJ_DEF(prefix), ENTRY_TO_NAME_START(name), &tbl); \ + ENTRY_TO_NAME_END(name); \ + } while (0); + +#define ENTRY_NOTHING(prefix, ftype, type, name, flag, ...) + +#if !defined(KMPP_OBJ_ACCESS_DISABLE) +#define VAL_ENTRY_TBL(prefix, ftype, type, name, flag, ...) \ + static KmppEntry *CONCAT_US(tbl, prefix, __VA_ARGS__) = NULL; + +#define VAL_HOOK_IDX(prefix, ftype, type, name, flag, ...) \ + static rk_s32 CONCAT_US(hook, prefix, get, __VA_ARGS__) = -1; \ + static rk_s32 CONCAT_US(hook, prefix, set, __VA_ARGS__) = -1; + +#define ENTRY_QUERY(prefix, ftype, type, name, flag, ...) \ + do { \ + kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), ENTRY_TO_NAME_START(name), &CONCAT_US(tbl, prefix, __VA_ARGS__)); \ + } while (0); + +#define HOOK_QUERY(prefix, ftype, type, name, flag, ...) \ + do { \ + CONCAT_US(hook, prefix, set, __VA_ARGS__) = \ + kmpp_objdef_get_hook(KMPP_OBJ_DEF(prefix), CONCAT_STR(set, __VA_ARGS__)); \ + CONCAT_US(hook, prefix, get, __VA_ARGS__) = \ + kmpp_objdef_get_hook(KMPP_OBJ_DEF(prefix), CONCAT_STR(get, __VA_ARGS__)); \ + } while (0); + +#define ENTRY_TO_FUNC(prefix, ftype, type, name, flag, ...) \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \ + ret = kmpp_obj_tbl_get_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \ + else \ + *v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__); \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \ + ret = kmpp_obj_tbl_set_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \ + else \ + ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__) = v; \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s) \ + { \ + if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ + return kmpp_obj_tbl_test(s, CONCAT_US(tbl, prefix, __VA_ARGS__)); \ + } + +#define STRUCT_TO_FUNC(prefix, ftype, type, name, flag, ...) \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \ + ret = kmpp_obj_tbl_get_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \ + else \ + memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__), \ + sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->CONCAT_DOT(__VA_ARGS__))); \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \ + ret = kmpp_obj_tbl_set_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \ + else \ + memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__), v, \ + sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->CONCAT_DOT(__VA_ARGS__))); \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s) \ + { \ + if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ + return kmpp_obj_tbl_test(s, CONCAT_US(tbl, prefix, __VA_ARGS__)); \ + } + +#define EHOOK_TO_FUNC(prefix, ftype, type, name, flag, ...) \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(hook, prefix, get, __VA_ARGS__) >= 0) \ + ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, get, __VA_ARGS__), (void *)v, __FUNCTION__); \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(hook, prefix, set, __VA_ARGS__) >= 0) \ + ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, set, __VA_ARGS__), (void *)&v, __FUNCTION__); \ + return ret; \ + } + +#define SHOOK_TO_FUNC(prefix, ftype, type, name, flag, ...) \ \ + rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(hook, prefix, get, __VA_ARGS__) >= 0) \ + ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, get, __VA_ARGS__), (void *)v, __FUNCTION__); \ + return ret; \ + } \ + rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \ + { \ + rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ + if (ret) return ret; \ + if (CONCAT_US(hook, prefix, set, __VA_ARGS__) >= 0) \ + ret = kmpp_obj_idx_run(s, CONCAT_US(prefix, set, __VA_ARGS__), (void *)v, __FUNCTION__); \ + return ret; \ + } + +#else +#define VAL_ENTRY_TBL ENTRY_NOTHING +#define VAL_HOOK_IDX ENTRY_NOTHING +#define ENTRY_QUERY ENTRY_NOTHING +#define HOOK_QUERY ENTRY_NOTHING +#define ENTRY_TO_FUNC ENTRY_NOTHING +#define STRUCT_TO_FUNC ENTRY_NOTHING +#define EHOOK_TO_FUNC ENTRY_NOTHING +#define SHOOK_TO_FUNC ENTRY_NOTHING +#endif + +/* disable structure layout macro for global variable definition */ +#undef CFG_DEF_START +#undef CFG_DEF_END +#undef STRUCT_START +#undef STRUCT_END +#undef ENTRY_TO_NAME_START +#undef ENTRY_TO_NAME_END + +#define CFG_DEF_START(...) +#define CFG_DEF_END(...) +#define STRUCT_START(...) +#define STRUCT_END(...) +#define ENTRY_TO_NAME_START(name, ...) TO_STR(name) +#define ENTRY_TO_NAME_END(...) + +#include + #include "mpp_debug.h" #include "kmpp_obj.h" -#define KMPP_OBJ_TO_STR(x) #x -#define KMPP_OBJ_DEF(x) x##_def -#define KMPP_OBJ_DEF_NAME(x) KMPP_OBJ_TO_STR(x) +/* object definition common functions */ +static KmppObjDef KMPP_OBJ_DEF(KMPP_OBJ_NAME) = NULL; +/* globla variable definitions */ +KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, VAL_ENTRY_TBL, VAL_ENTRY_TBL, + VAL_HOOK_IDX, VAL_HOOK_IDX, ENTRY_NOTHING) + +/* enable structure layout macro for objdef registration */ +#ifdef KMPP_OBJ_HIERARCHY_ENABLE +#undef CFG_DEF_START +#undef CFG_DEF_END +#undef STRUCT_START +#undef STRUCT_END +#undef ENTRY_TO_NAME_START +#undef ENTRY_TO_NAME_END + +#define CFG_DEF_START(...) \ + { \ + char str_buf[256] = {0}; \ + rk_s32 str_pos = 0; \ + rk_s32 str_size = sizeof(str_buf) - 1; + +#define CFG_DEF_END(...) \ + } + +#define STRUCT_START(...) \ + { \ + rk_s32 CONCAT_US(pos, __VA_ARGS__, root) = str_pos; \ + str_pos += snprintf(str_buf + str_pos, str_size - str_pos, str_pos ? ":%s" : "%s", CONCAT_STR(__VA_ARGS__)); + +#define STRUCT_END(...) \ + str_pos = CONCAT_US(pos, __VA_ARGS__, root); \ + str_buf[str_pos] = '\0'; \ + } + +#define ENTRY_TO_NAME_START(name, ...) \ + ({ \ + snprintf(str_buf + str_pos, str_size - str_pos, str_pos ? ":%s" : "%s", TO_STR(name)); \ + str_buf; \ + }) + +#define ENTRY_TO_NAME_END(...) \ + str_buf[str_pos] = '\0'; -#ifndef KMPP_OBJ_ENTRY_TABLE -#define KMPP_OBJ_ENTRY_TABLE(ENTRY, prefix) -#endif -#ifndef KMPP_OBJ_ENTRY_RO_TABLE -#define KMPP_OBJ_ENTRY_RO_TABLE(ENTRY, prefix) -#endif -#ifndef KMPP_OBJ_STRUCT_TABLE -#define KMPP_OBJ_STRUCT_TABLE(ENTRY, prefix) -#endif -#ifndef KMPP_OBJ_ENTRY_TABLE2 -#define KMPP_OBJ_ENTRY_TABLE2(ENTRY, prefix) -#endif -#ifndef KMPP_OBJ_STRUCT_TABLE2 -#define KMPP_OBJ_STRUCT_TABLE2(ENTRY, prefix) #endif -#define ENTRY_QUERY(prefix, ftype, type, f1, ...) \ - do { \ - kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1, &tbl_##prefix##_##f1); \ - } while (0); +void CONCAT_US(KMPP_OBJ_NAME, register)(void) +{ + rk_s32 impl_size = (sizeof(KMPP_OBJ_IMPL_TYPE) + KMPP_OBJ_EXTRA_SIZE + 3) & ~3; + rk_s32 __flag_base = impl_size << 3; + rk_s32 __flag_record[ELEM_FLAG_RECORD_MAX]; + (void) __flag_base; + (void) __flag_record; -#define ENTRY_QUERY2(prefix, ftype, type, f1, f2, ...) \ - do { \ - kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1":"#f2, &tbl_##prefix##_##f1##_##f2); \ - } while (0); + mpp_logi_f("enter\n"); -#define KMPP_OBJ_FUNC2(a, b) a##_##b -#define KMPP_OBJ_FUNC3(a, b, c) a##_##b##_##c -#define KMPP_OBJ_FUNC4(a, b, c, d) a##_##b##_##c##_##d + kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), impl_size, KMPP_OBJ_DEF_NAME(KMPP_OBJ_INTF_TYPE)); + if (!KMPP_OBJ_DEF(KMPP_OBJ_NAME)) { + mpp_loge_f(TO_STR(KMPP_OBJ_NAME) " init failed\n"); + return; + } + KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_TO_TRIE, ENTRY_TO_TRIE, + ENTRY_TO_TRIE, ENTRY_TO_TRIE, ENTRY_TO_TRIE) + kmpp_objdef_add_entry(KMPP_OBJ_DEF(KMPP_OBJ_NAME), NULL, NULL); + KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_QUERY, ENTRY_QUERY, + HOOK_QUERY, HOOK_QUERY, ENTRY_NOTHING); + +#if defined(KMPP_OBJ_FUNC_INIT) + kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT); +#endif +#if defined(KMPP_OBJ_FUNC_DEINIT) + kmpp_objdef_add_deinit(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_DEINIT); +#endif #if defined(KMPP_OBJ_FUNC_IOCTL) -#define KMPP_OBJ_ADD_IOCTL(x) kmpp_objdef_add_ioctl(KMPP_OBJ_DEF(x), &KMPP_OBJ_FUNC_IOCTL) -#else -#define KMPP_OBJ_ADD_IOCTL(x) + kmpp_objdef_add_ioctl(KMPP_OBJ_DEF(KMPP_OBJ_NAME), &KMPP_OBJ_FUNC_IOCTL); #endif - -#define KMPP_OBJ_ENTRY_FUNC(prefix, ftype, type, field, ...) \ - static KmppEntry *tbl_##prefix##_##field = NULL; \ - rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##field) \ - ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \ - else \ - *v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field; \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC3(prefix, set, field)(KMPP_OBJ_INTF_TYPE s, type v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##field) \ - ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##field, v); \ - else \ - ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field = v; \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC3(prefix, test, field)(KMPP_OBJ_INTF_TYPE s) \ - { \ - if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ - return kmpp_obj_tbl_test(s, tbl_##prefix##_##field); \ - } - -#define KMPP_OBJ_ENTRY_RO_FUNC(prefix, ftype, type, field, ...) \ - static KmppEntry *tbl_##prefix##_##field = NULL; \ - rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##field) \ - ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \ - else \ - *v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field; \ - return ret; \ - } - -#define KMPP_OBJ_STRUCT_FUNC(prefix, ftype, type, field, ...) \ - static KmppEntry *tbl_##prefix##_##field = NULL; \ - rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##field) \ - ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \ - else \ - memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field, \ - sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->field)); \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC3(prefix, set, field)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##field) \ - ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##field, v); \ - else \ - memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field, v, \ - sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->field)); \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC3(prefix, test, field)(KMPP_OBJ_INTF_TYPE s) \ - { \ - if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ - return kmpp_obj_tbl_test(s, tbl_##prefix##_##field); \ - } - -#define KMPP_OBJ_ENTRY_FUNC2(prefix, ftype, type, f1, f2, ...) \ - static KmppEntry *tbl_##prefix##_##f1##_##f2 = NULL; \ - rk_s32 KMPP_OBJ_FUNC4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##f1##_##f2) \ - ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \ - else \ - *v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2; \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE s, type v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##f1##_##f2) \ - ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \ - else \ - ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2 = v; \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE s) \ - { \ - if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ - return kmpp_obj_tbl_test(s, tbl_##prefix##_##f1##_##f2); \ - } - -#define KMPP_OBJ_STRUCT_FUNC2(prefix, ftype, type, f1, f2, ...) \ - static KmppEntry *tbl_##prefix##_##f1##_##f2 = NULL; \ - rk_s32 KMPP_OBJ_FUNC4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##f1##_##f2) \ - ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \ - else \ - memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2, \ - sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->f1.f2)); \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \ - { \ - rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \ - if (ret) return ret; \ - if (tbl_##prefix##_##f1##_##f2) \ - ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \ - else \ - memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2, v, \ - sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->f1.f2)); \ - return ret; \ - } \ - rk_s32 KMPP_OBJ_FUNC4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE s) \ - { \ - if (kmpp_obj_check(s, __FUNCTION__)) return 0; \ - return kmpp_obj_tbl_test(s, tbl_##prefix##_##f1##_##f2); \ - } - -#define KMPP_OBJS_USAGE_SET(prefix) \ -static KmppObjDef KMPP_OBJ_DEF(prefix) = NULL; \ -KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_ENTRY_FUNC, prefix) \ -KMPP_OBJ_ENTRY_RO_TABLE(KMPP_OBJ_ENTRY_RO_FUNC, prefix) \ -KMPP_OBJ_STRUCT_TABLE(KMPP_OBJ_STRUCT_FUNC, prefix) \ -KMPP_OBJ_ENTRY_TABLE2(KMPP_OBJ_ENTRY_FUNC2, prefix) \ -KMPP_OBJ_STRUCT_TABLE2(KMPP_OBJ_STRUCT_FUNC2, prefix) \ -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)) \ - return rk_nok; \ - KMPP_OBJ_ADD_IOCTL(prefix); \ - KMPP_OBJ_ENTRY_TABLE(ENTRY_QUERY, prefix) \ - KMPP_OBJ_ENTRY_RO_TABLE(ENTRY_QUERY, prefix) \ - KMPP_OBJ_STRUCT_TABLE(ENTRY_QUERY, prefix) \ - KMPP_OBJ_ENTRY_TABLE2(ENTRY_QUERY2, prefix) \ - KMPP_OBJ_STRUCT_TABLE2(ENTRY_QUERY2, prefix) \ - return rk_ok; \ -} \ -rk_s32 KMPP_OBJ_FUNC2(prefix, deinit)(void) __attribute__((destructor)); \ -rk_s32 KMPP_OBJ_FUNC2(prefix, deinit)(void) \ -{ \ - KmppObjDef def = __sync_fetch_and_and(&KMPP_OBJ_DEF(prefix), NULL); \ - return kmpp_objdef_put(def); \ -} \ -rk_s32 KMPP_OBJ_FUNC2(prefix, size)(void) \ -{ \ - return kmpp_objdef_get_entry_size(KMPP_OBJ_DEF(prefix)); \ -} \ -rk_s32 KMPP_OBJ_FUNC2(prefix, get)(KMPP_OBJ_INTF_TYPE *obj) \ -{ \ - return kmpp_obj_get_f((KmppObj *)obj, KMPP_OBJ_DEF(prefix)); \ -} \ -rk_s32 KMPP_OBJ_FUNC2(prefix, put)(KMPP_OBJ_INTF_TYPE obj) \ -{ \ - return kmpp_obj_put_f(obj); \ -} \ -rk_s32 KMPP_OBJ_FUNC2(prefix, dump)(KMPP_OBJ_INTF_TYPE obj, const char *caller) \ -{ \ - return kmpp_obj_udump_f(obj, caller); \ +#if defined(KMPP_OBJ_FUNC_DUMP) + kmpp_objdef_add_dump(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_DUMP); +#endif +#if !defined(KMPP_OBJ_SHARE_DISABLE) && defined(__KERNEL__) + kmpp_objdef_share(KMPP_OBJ_DEF(KMPP_OBJ_NAME)); +#endif + mpp_logi_f("leave\n"); } -KMPP_OBJS_USAGE_SET(KMPP_OBJ_NAME); +void CONCAT_US(KMPP_OBJ_NAME, unregister)(void) +{ + KmppObjDef def = __sync_fetch_and_and(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), NULL); + + kmpp_objdef_unregister(def); +} + +#include "mpp_singleton.h" + +MPP_SINGLETON(KMPP_OBJ_SGLN_ID, TO_STR(KMPP_OBJ_NAME), CONCAT_US(KMPP_OBJ_NAME, register), CONCAT_US(KMPP_OBJ_NAME, unregister)); + +rk_s32 CONCAT_US(KMPP_OBJ_NAME, size)(void) +{ + return kmpp_objdef_get_entry_size(KMPP_OBJ_DEF(KMPP_OBJ_NAME)); +} + +rk_s32 CONCAT_US(KMPP_OBJ_NAME, get)(KMPP_OBJ_INTF_TYPE *obj) +{ + return kmpp_obj_get_f((KmppObj *)obj, KMPP_OBJ_DEF(KMPP_OBJ_NAME)); +} + +rk_s32 CONCAT_US(KMPP_OBJ_NAME, put)(KMPP_OBJ_INTF_TYPE obj) +{ + return kmpp_obj_put_f(obj); +} + +rk_s32 CONCAT_US(KMPP_OBJ_NAME, dump)(KMPP_OBJ_INTF_TYPE obj, const char *caller) +{ + return kmpp_obj_kdump_f(obj, caller); +} + +#if !defined(KMPP_OBJ_FUNC_EXPORT_DISABLE) && defined(__KERNEL__) +#include + +EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, size)); +EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, get)); +EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, put)); +EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, dump)); +#endif + +/* disable structure layout macro for access function definition */ +#undef CFG_DEF_START +#undef CFG_DEF_END +#undef STRUCT_START +#undef STRUCT_END +#undef ENTRY_TO_NAME_START +#undef ENTRY_TO_NAME_END + +#define CFG_DEF_START(...) +#define CFG_DEF_END(...) +#define STRUCT_START(...) +#define STRUCT_END(...) + +#if !defined(KMPP_OBJ_ACCESS_DISABLE) +/* object element access functions */ +KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_TO_FUNC, STRUCT_TO_FUNC, + EHOOK_TO_FUNC, SHOOK_TO_FUNC, ENTRY_NOTHING) + +#if !defined(KMPP_OBJ_FUNC_EXPORT_DISABLE) && defined(__KERNEL__) +#define KMPP_OBJ_EXPORT(prefix, ftype, type, name, flag, ...) \ + EXPORT_SYMBOL(CONCAT_US(prefix, get, __VA_ARGS__)); \ + EXPORT_SYMBOL(CONCAT_US(prefix, set, __VA_ARGS__)); + +#define KMPP_OBJ_EXPORT_NONE(prefix, ftype, type, name, flag, ...) + +KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT, + KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT_NONE) +#undef KMPP_OBJ_EXPORT +#endif +#endif + +/* restore layout definition */ +#undef CFG_DEF_START +#undef CFG_DEF_END +#undef STRUCT_START +#undef STRUCT_END + -#undef KMPP_OBJ_TO_STR #undef KMPP_OBJ_DEF - +#undef KMPP_OBJ_DEF_NAME #undef KMPP_OBJ_NAME #undef KMPP_OBJ_INTF_TYPE #undef KMPP_OBJ_IMPL_TYPE +#undef KMPP_OBJ_EXTRA_SIZE #undef KMPP_OBJ_ENTRY_TABLE -#undef KMPP_OBJ_ENTRY_RO_TABLE -#undef KMPP_OBJ_STRUCT_TABLE -#undef KMPP_OBJ_ENTRY_TABLE2 -#undef KMPP_OBJ_STRUCT_TABLE2 +#undef KMPP_OBJ_FUNC_INIT +#undef KMPP_OBJ_FUNC_DEINIT #undef KMPP_OBJ_FUNC_IOCTL +#undef KMPP_OBJ_FUNC_DUMP +#undef KMPP_OBJ_FUNC_EXPORT_DISABLE +#undef KMPP_OBJ_ACCESS_DISABLE +#undef KMPP_OBJ_SHARE_DISABLE +#undef KMPP_OBJ_HIERARCHY_ENABLE -#undef KMPP_OBJ_FUNC2 -#undef KMPP_OBJ_FUNC3 -#undef KMPP_OBJ_FUNC4 -#undef KMPP_OBJ_ENTRY_FUNC -#undef KMPP_OBJ_ENTRY_RO_FUNC -#undef KMPP_OBJ_ENTRY_FUNC2 -#undef KMPP_OBJ_STRUCT_FUNC -#undef KMPP_OBJ_STRUCT_FUNC2 -#undef KMPP_OBJ_ADD_IOCTL +/* undef tmp macro */ +#undef FLAG_TYPE_TO_OFFSET +#undef ENTRY_TO_TRIE +#undef ENTRY_TO_FUNC +#undef ENTRY_NOTHING +#undef STRUCT_TO_FUNC +#undef EHOOK_TO_FUNC +#undef SHOOK_TO_FUNC +#undef VAL_ENTRY_TBL +#undef VAL_HOOK_IDX +#undef ENTRY_QUERY +#undef HOOK_QUERY -#undef __KMPP_OBJ_HERLPER_H__ +#undef __OBJECT_HERLPER_H__ #endif - -#endif /* __KMPP_OBJ_HERLPER_H__ */ diff --git a/kmpp/base/inc/kmpp_obj_macro.h b/kmpp/base/inc/kmpp_obj_macro.h new file mode 100644 index 00000000..8f1b833b --- /dev/null +++ b/kmpp/base/inc/kmpp_obj_macro.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2024 Rockchip Electronics Co., Ltd. + */ + +#ifndef __KMPP_OBJ_MACRO_H__ +#define __KMPP_OBJ_MACRO_H__ + +#define TO_STR(x) #x + +/* concat by underscore */ +#define CONCAT_US1(a) a +#define CONCAT_US2(a,b) a##_##b +#define CONCAT_US3(a,b,c) a##_##b##_##c +#define CONCAT_US4(a,b,c,d) a##_##b##_##c##_##d +#define CONCAT_US5(a,b,c,d,e) a##_##b##_##c##_##d##_##e +#define CONCAT_US6(a,b,c,d,e,f) a##_##b##_##c##_##d##_##e##_##f + +#define CONCAT_US_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME +#define CONCAT_US(...) CONCAT_US_HELPER(__VA_ARGS__, CONCAT_US6, CONCAT_US5, CONCAT_US4, CONCAT_US3, CONCAT_US2, CONCAT_US1)(__VA_ARGS__) + +/* concat by dot */ +#define CONCAT_DOT1(a) a +#define CONCAT_DOT2(a,b) a.b +#define CONCAT_DOT3(a,b,c) a.b.c +#define CONCAT_DOT4(a,b,c,d) a.b.c.d +#define CONCAT_DOT5(a,b,c,d,e) a.b.c.d.e +#define CONCAT_DOT6(a,b,c,d,e,f) a.b.c.d.e.f + +#define CONCAT_DOT_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME +#define CONCAT_DOT(...) CONCAT_DOT_HELPER(__VA_ARGS__, CONCAT_DOT6, CONCAT_DOT5, CONCAT_DOT4, CONCAT_DOT3, CONCAT_DOT2, CONCAT_DOT1)(__VA_ARGS__) + +/* concat to string connect with colon */ +#define CONCAT_STR1(a) TO_STR(a) +#define CONCAT_STR2(a,b) TO_STR(a:b) +#define CONCAT_STR3(a,b,c) TO_STR(a:b:c) +#define CONCAT_STR4(a,b,c,d) TO_STR(a:b:c:d) +#define CONCAT_STR5(a,b,c,d,e) TO_STR(a:b:c:d:e) +#define CONCAT_STR6(a,b,c,d,e,f) TO_STR(a:b:c:d:e:f) + +#define CONCAT_STR_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME +#define CONCAT_STR(...) CONCAT_STR_HELPER(__VA_ARGS__, CONCAT_STR6, CONCAT_STR5, CONCAT_STR4, CONCAT_STR3, CONCAT_STR2, CONCAT_STR1)(__VA_ARGS__) + +#endif /* __KMPP_OBJ_MACRO_H__ */ diff --git a/kmpp/base/kmpp_frame.c b/kmpp/base/kmpp_frame.c index ce06b28a..a929d040 100644 --- a/kmpp/base/kmpp_frame.c +++ b/kmpp/base/kmpp_frame.c @@ -10,6 +10,6 @@ #define KMPP_OBJ_NAME kmpp_frame #define KMPP_OBJ_INTF_TYPE KmppFrame #define KMPP_OBJ_IMPL_TYPE KmppFrameImpl +#define KMPP_OBJ_SGLN_ID MPP_SGLN_FRAME #define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE -#define KMPP_OBJ_STRUCT_TABLE KMPP_FRAME_STRUCT_TABLE #include "kmpp_obj_helper.h" diff --git a/mpp/inc/mpp_internal.h b/mpp/inc/mpp_internal.h index 55546498..86b32406 100644 --- a/mpp/inc/mpp_internal.h +++ b/mpp/inc/mpp_internal.h @@ -151,12 +151,53 @@ typedef enum ElemType_e { ELEM_TYPE_BUTT = 0xf, } ElemType; -/* element update flag type */ +#define ELEM_FLAG_OP_SHIFT 8 +#define ELEM_FLAG_IDX_MASK ((1 << ELEM_FLAG_OP_SHIFT) - 1) +/* + * element update flag bits usage: + * bit 0 - 7 record / replay operation index bit + * bit 8 - 9 record / replay operation bit + * bit 10 - 11 update flag update operation invalid / start / update / hold + */ 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 */ + /* element without update flag (not available) */ + ELEM_FLAG_NONE = (1 << ELEM_FLAG_OP_SHIFT), + /* element update flag will align to new 32bit */ + ELEM_FLAG_START = (2 << ELEM_FLAG_OP_SHIFT), + /* element flag increase by one */ + ELEM_FLAG_UPDATE = (3 << ELEM_FLAG_OP_SHIFT), + /* element flag equal to previous one */ + ELEM_FLAG_HOLD = (4 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_OP_MASK = (7 << ELEM_FLAG_OP_SHIFT), + + /* index for record element update flag */ + ELEM_FLAG_RECORD = (8 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_RECORD_0 = (ELEM_FLAG_RECORD + 0), + ELEM_FLAG_RECORD_1 = (ELEM_FLAG_RECORD + 1), + ELEM_FLAG_RECORD_2 = (ELEM_FLAG_RECORD + 2), + ELEM_FLAG_RECORD_3 = (ELEM_FLAG_RECORD + 3), + ELEM_FLAG_RECORD_4 = (ELEM_FLAG_RECORD + 4), + ELEM_FLAG_RECORD_5 = (ELEM_FLAG_RECORD + 5), + ELEM_FLAG_RECORD_6 = (ELEM_FLAG_RECORD + 6), + ELEM_FLAG_RECORD_7 = (ELEM_FLAG_RECORD + 7), + ELEM_FLAG_RECORD_8 = (ELEM_FLAG_RECORD + 8), + ELEM_FLAG_RECORD_9 = (ELEM_FLAG_RECORD + 9), + ELEM_FLAG_RECORD_BUT, + ELEM_FLAG_RECORD_MAX = (ELEM_FLAG_RECORD_BUT - ELEM_FLAG_RECORD), + + /* index for replay element update flag */ + ELEM_FLAG_REPLAY = (16 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_REPLAY_0 = (ELEM_FLAG_REPLAY + 0), + ELEM_FLAG_REPLAY_1 = (ELEM_FLAG_REPLAY + 1), + ELEM_FLAG_REPLAY_2 = (ELEM_FLAG_REPLAY + 2), + ELEM_FLAG_REPLAY_3 = (ELEM_FLAG_REPLAY + 3), + ELEM_FLAG_REPLAY_4 = (ELEM_FLAG_REPLAY + 4), + ELEM_FLAG_REPLAY_5 = (ELEM_FLAG_REPLAY + 5), + ELEM_FLAG_REPLAY_6 = (ELEM_FLAG_REPLAY + 6), + ELEM_FLAG_REPLAY_7 = (ELEM_FLAG_REPLAY + 7), + ELEM_FLAG_REPLAY_8 = (ELEM_FLAG_REPLAY + 8), + ELEM_FLAG_REPLAY_9 = (ELEM_FLAG_REPLAY + 9), + ELEM_FLAG_REPLAY_BUT, } ElemFlagType; typedef union KmppEntry_u {