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