1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */ 2 /* 3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd. 4 */ 5 6 #ifndef __KMPP_OBJ_H__ 7 #define __KMPP_OBJ_H__ 8 9 #include "mpp_internal.h" 10 11 typedef rk_s32 (*KmppObjInit)(void *entry, KmppObj obj, const char *caller); 12 typedef rk_s32 (*KmppObjDeinit)(void *entry, KmppObj obj, const char *caller); 13 typedef rk_s32 (*KmppObjPreset)(void *entry, KmppObj obj, const char *val, const char *caller); 14 typedef rk_s32 (*KmppObjDump)(void *entry); 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 /* userspace objdef register */ 21 rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 priv_size, rk_s32 size, const char *name); 22 /* kernel objdef query from /dev/kmpp_objs */ 23 rk_s32 kmpp_objdef_get(KmppObjDef *def, rk_s32 priv_size, const char *name); 24 /* find kernel objdef by name */ 25 rk_s32 kmpp_objdef_find(KmppObjDef *def, const char *name); 26 /* kernel objdef from /dev/kmpp_objs reduce refcnt */ 27 rk_s32 kmpp_objdef_put(KmppObjDef def); 28 29 /* userspace objdef add MppCfgObj root */ 30 rk_s32 kmpp_objdef_add_cfg_root(KmppObjDef def, MppCfgObj root); 31 /* userspace objdef get MppCfgObj root */ 32 MppCfgObj kmpp_objdef_get_cfg_root(KmppObjDef def); 33 /* userspace objdef add KmppEntry table */ 34 rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl); 35 /* userspace object init function register default object is all zero */ 36 rk_s32 kmpp_objdef_add_init(KmppObjDef def, KmppObjInit init); 37 /* userspace object deinit function register */ 38 rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit); 39 /* userspace object preset function register */ 40 rk_s32 kmpp_objdef_add_preset(KmppObjDef def, KmppObjPreset preset); 41 /* userspace object dump function register */ 42 rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump); 43 44 rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value); 45 46 rk_s32 kmpp_objdef_get_entry(KmppObjDef def, const char *name, KmppEntry **tbl); 47 rk_s32 kmpp_objdef_get_offset(KmppObjDef def, const char *name); 48 rk_s32 kmpp_objdef_get_cmd(KmppObjDef def, const char *name); 49 rk_s32 kmpp_objdef_dump(KmppObjDef def); 50 51 /* mpp objcet internal element set / get function */ 52 const char *kmpp_objdef_get_name(KmppObjDef def); 53 rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def); 54 MppTrie kmpp_objdef_get_trie(KmppObjDef def); 55 56 /* import kernel object ref */ 57 rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller); 58 rk_s32 kmpp_obj_get_by_name(KmppObj *obj, const char *name, const char *caller); 59 rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller); 60 /* release object and impl head */ 61 rk_s32 kmpp_obj_put(KmppObj obj, const char *caller); 62 /* release impl head only */ 63 rk_s32 kmpp_obj_impl_put(KmppObj obj, const char *caller); 64 /* setup object to a preset value by string args input */ 65 rk_s32 kmpp_obj_preset(KmppObj obj, const char *arg, const char *caller); 66 /* check object is valid or not */ 67 rk_s32 kmpp_obj_check(KmppObj obj, const char *caller); 68 /* run object's ioctl to kernel with input and output object */ 69 rk_s32 kmpp_obj_ioctl(KmppObj ctx, rk_s32 cmd, KmppObj in, KmppObj *out, const char *caller); 70 71 #define kmpp_obj_get_f(obj, def) kmpp_obj_get(obj, def, __FUNCTION__) 72 #define kmpp_obj_get_by_name_f(obj, name) kmpp_obj_get_by_name(obj, name, __FUNCTION__) 73 #define kmpp_obj_get_by_sptr_f(obj, sptr) kmpp_obj_get_by_sptr(obj, sptr, __FUNCTION__) 74 #define kmpp_obj_put_f(obj) kmpp_obj_put(obj, __FUNCTION__) 75 #define kmpp_obj_impl_put_f(obj) kmpp_obj_impl_put(obj, __FUNCTION__) 76 #define kmpp_obj_preset_f(obj, arg) kmpp_obj_preset(obj, arg, __FUNCTION__) 77 #define kmpp_obj_check_f(obj) kmpp_obj_check(obj, __FUNCTION__) 78 #define kmpp_obj_ioctl_f(ctx, cmd, in, out) kmpp_obj_ioctl(ctx, cmd, in, out, __FUNCTION__) 79 80 /* check a object is kobject or not */ 81 rk_s32 kmpp_obj_is_kobj(KmppObj obj); 82 /* object to its objdef */ 83 KmppObjDef kmpp_obj_to_objdef(KmppObj obj); 84 /* object implement element update flags access */ 85 void *kmpp_obj_to_flags(KmppObj obj); 86 rk_s32 kmpp_obj_to_flags_size(KmppObj obj); 87 /* KmppShmPtr is the kernel share object userspace base address for kernel ioctl */ 88 KmppShmPtr *kmpp_obj_to_shm(KmppObj obj); 89 /* KmppShmPtr size defined the copy size for kernel ioctl */ 90 rk_s32 kmpp_obj_to_shm_size(KmppObj obj); 91 const char *kmpp_obj_get_name(KmppObj obj); 92 /* 93 * priv is the private data in userspace KmppObjImpl struct for kobject transaction 94 * priv = KmppObjImpl->priv 95 */ 96 void *kmpp_obj_to_priv(KmppObj obj); 97 /* 98 * entry is the userspace address for kernel share object body 99 * entry = KmppShmPtr->uaddr + entry_offset 100 */ 101 void *kmpp_obj_to_entry(KmppObj obj); 102 /* offset is the entry offset from kernel share object body */ 103 rk_s32 kmpp_obj_to_offset(KmppObj obj, const char *name); 104 105 /* value access function */ 106 rk_s32 kmpp_obj_set_s32(KmppObj obj, const char *name, rk_s32 val); 107 rk_s32 kmpp_obj_get_s32(KmppObj obj, const char *name, rk_s32 *val); 108 rk_s32 kmpp_obj_set_u32(KmppObj obj, const char *name, rk_u32 val); 109 rk_s32 kmpp_obj_get_u32(KmppObj obj, const char *name, rk_u32 *val); 110 rk_s32 kmpp_obj_set_s64(KmppObj obj, const char *name, rk_s64 val); 111 rk_s32 kmpp_obj_get_s64(KmppObj obj, const char *name, rk_s64 *val); 112 rk_s32 kmpp_obj_set_u64(KmppObj obj, const char *name, rk_u64 val); 113 rk_s32 kmpp_obj_get_u64(KmppObj obj, const char *name, rk_u64 *val); 114 rk_s32 kmpp_obj_set_st(KmppObj obj, const char *name, void *val); 115 rk_s32 kmpp_obj_get_st(KmppObj obj, const char *name, void *val); 116 rk_s32 kmpp_obj_tbl_set_s32(KmppObj obj, KmppEntry *tbl, rk_s32 val); 117 rk_s32 kmpp_obj_tbl_get_s32(KmppObj obj, KmppEntry *tbl, rk_s32 *val); 118 rk_s32 kmpp_obj_tbl_set_u32(KmppObj obj, KmppEntry *tbl, rk_u32 val); 119 rk_s32 kmpp_obj_tbl_get_u32(KmppObj obj, KmppEntry *tbl, rk_u32 *val); 120 rk_s32 kmpp_obj_tbl_set_s64(KmppObj obj, KmppEntry *tbl, rk_s64 val); 121 rk_s32 kmpp_obj_tbl_get_s64(KmppObj obj, KmppEntry *tbl, rk_s64 *val); 122 rk_s32 kmpp_obj_tbl_set_u64(KmppObj obj, KmppEntry *tbl, rk_u64 val); 123 rk_s32 kmpp_obj_tbl_get_u64(KmppObj obj, KmppEntry *tbl, rk_u64 *val); 124 rk_s32 kmpp_obj_tbl_set_st(KmppObj obj, KmppEntry *tbl, void *val); 125 rk_s32 kmpp_obj_tbl_get_st(KmppObj obj, KmppEntry *tbl, void *val); 126 127 /* userspace access only function */ 128 rk_s32 kmpp_obj_set_obj(KmppObj obj, const char *name, KmppObj val); 129 rk_s32 kmpp_obj_get_obj(KmppObj obj, const char *name, KmppObj *val); 130 rk_s32 kmpp_obj_set_ptr(KmppObj obj, const char *name, void *val); 131 rk_s32 kmpp_obj_get_ptr(KmppObj obj, const char *name, void **val); 132 rk_s32 kmpp_obj_set_fp(KmppObj obj, const char *name, void *val); 133 rk_s32 kmpp_obj_get_fp(KmppObj obj, const char *name, void **val); 134 rk_s32 kmpp_obj_tbl_set_obj(KmppObj obj, KmppEntry *tbl, KmppObj val); 135 rk_s32 kmpp_obj_tbl_get_obj(KmppObj obj, KmppEntry *tbl, KmppObj *val); 136 rk_s32 kmpp_obj_tbl_set_ptr(KmppObj obj, KmppEntry *tbl, void *val); 137 rk_s32 kmpp_obj_tbl_get_ptr(KmppObj obj, KmppEntry *tbl, void **val); 138 rk_s32 kmpp_obj_tbl_set_fp(KmppObj obj, KmppEntry *tbl, void *val); 139 rk_s32 kmpp_obj_tbl_get_fp(KmppObj obj, KmppEntry *tbl, void **val); 140 141 /* share access function */ 142 rk_s32 kmpp_obj_set_shm(KmppObj obj, const char *name, KmppShmPtr *val); 143 rk_s32 kmpp_obj_get_shm(KmppObj obj, const char *name, KmppShmPtr *val); 144 rk_s32 kmpp_obj_tbl_set_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val); 145 rk_s32 kmpp_obj_tbl_get_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val); 146 147 /* helper for get share object from a share memory element */ 148 rk_s32 kmpp_obj_set_shm_obj(KmppObj obj, const char *name, KmppObj val); 149 rk_s32 kmpp_obj_get_shm_obj(KmppObj obj, const char *name, KmppObj *val); 150 151 /* update flag check function */ 152 rk_s32 kmpp_obj_test(KmppObj obj, const char *name); 153 rk_s32 kmpp_obj_tbl_test(KmppObj obj, KmppEntry *tbl); 154 rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src); 155 rk_s32 kmpp_obj_update_entry(void *entry, KmppObj src); 156 157 /* copy entry value from src to dst */ 158 rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src); 159 160 /* run a callback function */ 161 rk_s32 kmpp_obj_run(KmppObj obj, const char *name); 162 /* dump by userspace */ 163 rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller); 164 /* dump by kernel */ 165 rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller); 166 167 #define kmpp_obj_udump(obj) kmpp_obj_udump_f(obj, __FUNCTION__) 168 #define kmpp_obj_kdump(obj) kmpp_obj_kdump_f(obj, __FUNCTION__) 169 170 rk_s32 kmpp_shm_get(KmppShm *shm, rk_s32 size, const char *caller); 171 rk_s32 kmpp_shm_put(KmppShm shm, const char *caller); 172 173 void *kmpp_shm_to_entry(KmppShm shm, const char *caller); 174 175 #define kmpp_shm_get_f(shm, size) kmpp_shm_get(shm, size, __FUNCTION__) 176 #define kmpp_shm_put_f(shm) kmpp_shm_put(shm, __FUNCTION__) 177 #define kmpp_shm_to_entry_f(shm) kmpp_shm_to_entry(shm, __FUNCTION__) 178 179 const char *strof_elem_type(ElemType type); 180 181 #ifdef __cplusplus 182 } 183 #endif 184 185 #endif /* __KMPP_OBJ_H__ */ 186