feat[kmpp_frame]: Add KmppFrame module

1. Sync kmpp_obj_func.h and kmpp_obj_helper.h from kernel.
2. Add more kmpp_obj function from kernel.
3. Add KmppFrame module.
4. Fix kmpp_obj_check failure.

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: Ib333370eb36c7b63ef50d3e52cf7fd753c9e5af1
This commit is contained in:
Herman Chen 2025-04-01 16:47:22 +08:00
parent fa7f83351d
commit ca334adda0
10 changed files with 693 additions and 175 deletions

View file

@ -3,80 +3,284 @@
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*/
#if defined(KMPP_OBJ_HERLPER_EXIST)
#error "can not include kmpp_obj_helper.h twice"
#ifndef __KMPP_OBJ_HERLPER_H__
#define __KMPP_OBJ_HERLPER_H__
#if !defined(KMPP_OBJ_NAME) || \
!defined(KMPP_OBJ_INTF_TYPE) || \
!defined(KMPP_OBJ_IMPL_TYPE)
#warning "When using kmpp_obj_helper.h The following macro must be defined:"
#warning "KMPP_OBJ_NAME - object name"
#warning "KMPP_OBJ_INTF_TYPE - object interface type"
#warning "KMPP_OBJ_IMPL_TYPE - object implement type"
#warning "option macro:"
#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"
#ifndef KMPP_OBJ_NAME
#error "KMPP_OBJ_NAME not defined"
#endif
#ifndef KMPP_OBJ_INTF_TYPE
#error "KMPP_OBJ_INTF_TYPE not defined"
#endif
#ifndef KMPP_OBJ_IMPL_TYPE
#error "KMPP_OBJ_IMPL_TYPE not defined"
#endif
#define KMPP_OBJ_HERLPER_EXIST
#else /* all input macro defined */
#if defined(KMPP_OBJ_IMPL_TYPE) && defined(KMPP_OBJ_IMPL_DEF)
#include <linux/stddef.h>
/*
* macro for register structure fiedl to trie
* type -> struct base type
* f1 -> struct:field1 name segment 1 the field1 part
* f2 -> struct:field1:field2 name segment 2 the field2 part
* ftype -> field type as EntryType
*/
#define FIELD_TO_LOCTBL_FLAG1(f1, ftype, field_flag, flag_value) \
{ \
.data_offset = offsetof(KMPP_OBJ_IMPL_TYPE, f1), \
.data_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->f1), \
.data_type = ENTRY_TYPE_##ftype, \
.flag_offset = offsetof(KMPP_OBJ_IMPL_TYPE, field_flag), \
.flag_value = flag_value, \
}
#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)
#define FIELD_TO_LOCTBL_ACCESS1(f1, ftype) \
{ \
.data_offset = offsetof(KMPP_OBJ_IMPL_TYPE, f1), \
.data_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->f1), \
.data_type = ENTRY_TYPE_##ftype, \
.flag_offset = 0, \
.flag_value = 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_TO_TRIE1(ftype, type, f1) \
#define ENTRY_QUERY(prefix, ftype, type, f1, ...) \
do { \
KmppEntry tbl = FIELD_TO_LOCTBL_ACCESS1(f1, ftype); \
kmpp_objdef_add_entry(KMPP_OBJ_IMPL_DEF, #f1, &tbl); \
kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1, &tbl_##prefix##_##f1); \
} while (0);
#define FIELD_TO_LOCTBL_FLAG2(f1, f2, ftype, field_flag, flag_value) \
{ \
.data_offset = offsetof(KMPP_OBJ_IMPL_TYPE, f1.f2), \
.data_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->f1.f2), \
.data_type = ENTRY_TYPE_##ftype, \
.flag_offset = offsetof(KMPP_OBJ_IMPL_TYPE, field_flag), \
.flag_value = flag_value, \
}
#define FIELD_TO_LOCTBL_ACCESS2(f1, f2, ftype) \
{ \
.data_offset = offsetof(KMPP_OBJ_IMPL_TYPE, f1.f2), \
.data_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->f1.f2), \
.data_type = ENTRY_TYPE_##ftype, \
.flag_offset = 0, \
.flag_value = 0, \
}
#define ENTRY_TO_TRIE2(ftype, type, f1, f2) \
#define ENTRY_QUERY2(prefix, ftype, type, f1, f2, ...) \
do { \
KmppEntry tbl = FIELD_TO_LOCTBL_ACCESS2(KMPP_OBJ_IMPL_TYPE, f1, f2, ftype); \
kmpp_objdef_add_entry(KMPP_OBJ_IMPL_DEF, #f1":"#f2, &tbl); \
kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1":"#f2, &tbl_##prefix##_##f1##_##f2); \
} while (0);
#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
#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)
#endif
#define FIELD_TO_LOCTBL_FLAG1(f1, ftype, field_flag, flag_value)
#define FIELD_TO_LOCTBL_ACCESS1(f1, ftype)
#define ENTRY_TO_TRIE1(ftype, type, f1)
#define FIELD_TO_LOCTBL_FLAG2(f1, f2, ftype, field_flag, flag_value)
#define FIELD_TO_LOCTBL_ACCESS2(f1, f2, ftype)
#define ENTRY_TO_TRIE2(ftype, type, f1, f2)
#include <string.h>
#include "mpp_debug.h"
#error "use kmpp_obj_helper.h need macro KMPP_OBJ_IMPL_TYPE and KMPP_OBJ_IMPL_DEF as input"
#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)) { \
mpp_loge_f(#prefix " init failed\n"); \
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); \
}
KMPP_OBJS_USAGE_SET(KMPP_OBJ_NAME);
#undef KMPP_OBJ_TO_STR
#undef KMPP_OBJ_DEF
#undef KMPP_OBJ_NAME
#undef KMPP_OBJ_INTF_TYPE
#undef KMPP_OBJ_IMPL_TYPE
#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_IOCTL
#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 __KMPP_OBJ_HERLPER_H__
#endif
#undef KMPP_OBJ_HERLPER_EXIST
#endif /* __KMPP_OBJ_HERLPER_H__ */