1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */ 2 /* 3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd. 4 */ 5 6 #ifndef __KMPP_OBJ_MACRO_H__ 7 #define __KMPP_OBJ_MACRO_H__ 8 9 #include <string.h> 10 11 #include "mpp_env.h" 12 #include "mpp_debug.h" 13 #include "mpp_singleton.h" 14 15 #include "kmpp_obj.h" 16 17 #define _TO_STR(x) #x 18 #define TO_STR(x) _TO_STR(x) 19 20 /* concat two args */ 21 #define CONCAT_1(a) a 22 #define CONCAT_2(a,b) a##b 23 #define CONCAT_3(a,b,c) a##b##c 24 #define CONCAT_4(a,b,c,d) a##b##c##d 25 #define CONCAT_5(a,b,c,d,e) a##b##c##d##e 26 #define CONCAT_6(a,b,c,d,e,f) a##b##c##d##e##f 27 28 #define CONCAT_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME 29 #define CONCAT(...) CONCAT_HELPER(__VA_ARGS__, CONCAT_6, CONCAT_5, CONCAT_4, CONCAT_3, CONCAT_2, CONCAT_1)(__VA_ARGS__) 30 31 /* concat by underscore */ 32 #define CONCAT_US1(a) a 33 #define CONCAT_US2(a,b) a##_##b 34 #define CONCAT_US3(a,b,c) a##_##b##_##c 35 #define CONCAT_US4(a,b,c,d) a##_##b##_##c##_##d 36 #define CONCAT_US5(a,b,c,d,e) a##_##b##_##c##_##d##_##e 37 #define CONCAT_US6(a,b,c,d,e,f) a##_##b##_##c##_##d##_##e##_##f 38 39 #define CONCAT_US_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME 40 #define CONCAT_US(...) CONCAT_US_HELPER(__VA_ARGS__, CONCAT_US6, CONCAT_US5, CONCAT_US4, CONCAT_US3, CONCAT_US2, CONCAT_US1)(__VA_ARGS__) 41 42 /* concat by dot */ 43 #define CONCAT_DOT1(a) a 44 #define CONCAT_DOT2(a,b) a.b 45 #define CONCAT_DOT3(a,b,c) a.b.c 46 #define CONCAT_DOT4(a,b,c,d) a.b.c.d 47 #define CONCAT_DOT5(a,b,c,d,e) a.b.c.d.e 48 #define CONCAT_DOT6(a,b,c,d,e,f) a.b.c.d.e.f 49 50 #define CONCAT_DOT_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME 51 #define CONCAT_DOT(...) CONCAT_DOT_HELPER(__VA_ARGS__, CONCAT_DOT6, CONCAT_DOT5, CONCAT_DOT4, CONCAT_DOT3, CONCAT_DOT2, CONCAT_DOT1)(__VA_ARGS__) 52 53 /* concat to string connect with colon */ 54 #define CONCAT_STR1(a) TO_STR(a) 55 #define CONCAT_STR2(a,b) TO_STR(a:b) 56 #define CONCAT_STR3(a,b,c) TO_STR(a:b:c) 57 #define CONCAT_STR4(a,b,c,d) TO_STR(a:b:c:d) 58 #define CONCAT_STR5(a,b,c,d,e) TO_STR(a:b:c:d:e) 59 #define CONCAT_STR6(a,b,c,d,e,f) TO_STR(a:b:c:d:e:f) 60 61 #define CONCAT_STR_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME 62 #define CONCAT_STR(...) CONCAT_STR_HELPER(__VA_ARGS__, CONCAT_STR6, CONCAT_STR5, CONCAT_STR4, CONCAT_STR3, CONCAT_STR2, CONCAT_STR1)(__VA_ARGS__) 63 64 /* objdef struct name */ 65 #define KMPP_OBJ_DEF(x) CONCAT_US(x, def) 66 #define KMPP_OBJ_DEF_DEUBG(x) CONCAT_US(x, debug) 67 #define KMPP_OBJ_DBG_LOG(...) mpp_logi_c(KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME), __VA_ARGS__) 68 69 /* 70 * element update flag bits usage: 71 * bit 0 - 7 record / replay operation index bit 72 * bit 8 - 9 record / replay operation bit 73 * bit 10 - 11 update flag update operation invalid / start / update / hold 74 */ 75 typedef union ElemFlagDef_u { 76 rk_u32 val; 77 struct { 78 rk_u32 idx : 8; 79 rk_u32 slot : 4; 80 rk_u32 op : 4; 81 rk_u32 record : 1; 82 rk_u32 replay : 1; 83 rk_u32 reserved : 10; 84 }; 85 } ElemFlagDef; 86 87 #define ELEM_FLAG_OP_SHIFT 8 88 #define ELEM_FLAG_IDX_MASK ((1 << ELEM_FLAG_OP_SHIFT) - 1) 89 90 typedef enum ElemFlagType_e { 91 /* element without update flag (not available) */ 92 ELEM_FLAG_NONE, 93 /* element update flag will align to new 32bit */ 94 ELEM_FLAG_START, 95 /* element flag align up to 64bit */ 96 ELEM_FLAG_START64, 97 /* element flag increase by one */ 98 ELEM_FLAG_OFFSET, 99 /* element flag increase by one */ 100 ELEM_FLAG_INCR, 101 /* element flag equal to previous one */ 102 ELEM_FLAG_PREV, 103 104 ELEM_FLAG_RECORD_MAX = 16, 105 } ElemFlagType; 106 107 #define FLAG_NONE ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_NONE << 12) | (0 << 16) | (0 << 17)) 108 #define FLAG_BASE(x) ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_START << 12) | (0 << 16) | (0 << 17)) 109 #define FLAG_AT(x) ((x & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (0 << 16) | (0 << 17)) 110 #define FLAG_INCR ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_INCR << 12) | (0 << 16) | (0 << 17)) 111 #define FLAG_PREV ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_PREV << 12) | (0 << 16) | (0 << 17)) 112 #define FLAG_REC(s, x) ((x & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (1 << 16) | (0 << 17)) 113 #define FLAG_REC_INC(s) ((0 & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_INCR << 12) | (1 << 16) | (0 << 17)) 114 #define FLAG_REPLAY(s) ((0 & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (0 << 16) | (1 << 17)) 115 116 /* macro for register structure update flag type to offset */ 117 #define FLAG_TYPE_TO_OFFSET(name, flag, flag_str) \ 118 ({ \ 119 ElemFlagDef __flag = { .val = flag, }; \ 120 rk_u16 __offset; \ 121 switch (__flag.op) { \ 122 case ELEM_FLAG_START : { \ 123 /* NOTE: increase to next 32bit */ \ 124 if (__flag_prev > __flag_base) \ 125 __flag_base = (__flag_prev + 31) & (~31); \ 126 else if (__flag_prev == __flag_base) \ 127 __flag_base = ((__flag_base + 32) & (~31)); \ 128 __flag_step = 0; \ 129 __offset = __flag_prev = __flag_base; \ 130 } break; \ 131 case ELEM_FLAG_START64 : { \ 132 /* NOTE: increase to next 64bit */ \ 133 if (__flag_prev > __flag_base) \ 134 __flag_base = (__flag_prev + 63) & (~63); \ 135 else if (__flag_prev == __flag_base) \ 136 __flag_base = ((__flag_base + 64) & (~63)); \ 137 __flag_step = 0; \ 138 __offset = __flag_prev = __flag_base; \ 139 } break; \ 140 case ELEM_FLAG_OFFSET : { \ 141 /* define offset to the base */ \ 142 __offset = __flag_prev = __flag_base + __flag.idx; \ 143 if (__flag.idx > __flag_step) \ 144 __flag_step = __flag.idx; \ 145 } break; \ 146 case ELEM_FLAG_INCR : { \ 147 /* increase from the max step */ \ 148 __flag_step++; \ 149 __offset = __flag_prev = __flag_base + __flag_step; \ 150 } break; \ 151 case ELEM_FLAG_PREV : { \ 152 __offset = __flag_prev; \ 153 } break; \ 154 default : { \ 155 __offset = 0; \ 156 } break; \ 157 }; \ 158 if (__flag.record) { \ 159 __flag_record[__flag.slot] = __offset; \ 160 } \ 161 if (__flag.replay) { \ 162 __offset = __flag_record[__flag.slot]; \ 163 } \ 164 KMPP_OBJ_DBG_LOG("%-20s - (%x:%x:%02x) -> %#4x (%2d) - %s\n", \ 165 TO_STR(name), __flag_base, __flag_prev, __flag_step, \ 166 __offset, __offset ? __offset - __flag_base : 0, flag_str); \ 167 __offset; \ 168 }) 169 170 #define ENTRY_NOTHING(prefix, ftype, type, name, flag, ...) 171 172 #define GET_ARG0(val, ...) GET_ARG0_CHOOSER(dummy, ##__VA_ARGS__)(__VA_ARGS__) 173 #define GET_ARG0_1(_1) (-1) 174 #define GET_ARG0_2(_1, _2, ...) _1 175 #define GET_ARG0_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, N, ...) GET_ARG0_##N 176 #define GET_ARG0_CHOOSER(...) GET_ARG0_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 177 178 #endif /* __KMPP_OBJ_MACRO_H__ */ 179