xref: /rockchip-linux_mpp/kmpp/base/inc/kmpp_obj_macro.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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