xref: /rockchip-linux_mpp/mpp/base/mpp_sys_cfg.c (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 #define MODULE_TAG "mpp_sys_cfg"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "rk_mpp_cfg.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "mpp_env.h"
13*437bfbebSnyanmisaka #include "mpp_mem.h"
14*437bfbebSnyanmisaka #include "mpp_list.h"
15*437bfbebSnyanmisaka #include "mpp_time.h"
16*437bfbebSnyanmisaka #include "mpp_debug.h"
17*437bfbebSnyanmisaka #include "mpp_common.h"
18*437bfbebSnyanmisaka #include "mpp_thread.h"
19*437bfbebSnyanmisaka #include "mpp_singleton.h"
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_cfg.h"
22*437bfbebSnyanmisaka #include "mpp_soc.h"
23*437bfbebSnyanmisaka #include "mpp_trie.h"
24*437bfbebSnyanmisaka #include "mpp_sys_cfg.h"
25*437bfbebSnyanmisaka #include "mpp_mem_pool.h"
26*437bfbebSnyanmisaka #include "mpp_compat_impl.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define SYS_CFG_DBG_FUNC                (0x00000001)
29*437bfbebSnyanmisaka #define SYS_CFG_DBG_INFO                (0x00000002)
30*437bfbebSnyanmisaka #define SYS_CFG_DBG_SET                 (0x00000004)
31*437bfbebSnyanmisaka #define SYS_CFG_DBG_GET                 (0x00000008)
32*437bfbebSnyanmisaka #define SYS_CFG_DBG_DEC_BUF             (0x00000010)
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka #define sys_cfg_dbg(flag, fmt, ...)     _mpp_dbg_f(mpp_sys_cfg_debug, flag, fmt, ## __VA_ARGS__)
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #define sys_cfg_dbg_func(fmt, ...)      sys_cfg_dbg(SYS_CFG_DBG_FUNC, fmt, ## __VA_ARGS__)
37*437bfbebSnyanmisaka #define sys_cfg_dbg_info(fmt, ...)      sys_cfg_dbg(SYS_CFG_DBG_INFO, fmt, ## __VA_ARGS__)
38*437bfbebSnyanmisaka #define sys_cfg_dbg_set(fmt, ...)       sys_cfg_dbg(SYS_CFG_DBG_SET, fmt, ## __VA_ARGS__)
39*437bfbebSnyanmisaka #define sys_cfg_dbg_get(fmt, ...)       sys_cfg_dbg(SYS_CFG_DBG_GET, fmt, ## __VA_ARGS__)
40*437bfbebSnyanmisaka #define sys_cfg_dbg_dec_buf(fmt, ...)   sys_cfg_dbg(SYS_CFG_DBG_DEC_BUF, fmt, ## __VA_ARGS__)
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka #define get_srv_sys_cfg_f() \
43*437bfbebSnyanmisaka     ({ \
44*437bfbebSnyanmisaka         MppSysCfgSrv *__tmp; \
45*437bfbebSnyanmisaka         if (srv_sys_cfg) { \
46*437bfbebSnyanmisaka             __tmp = srv_sys_cfg; \
47*437bfbebSnyanmisaka         } else { \
48*437bfbebSnyanmisaka             mpp_sys_cfg_srv_init(); \
49*437bfbebSnyanmisaka             __tmp = srv_sys_cfg; \
50*437bfbebSnyanmisaka             if (!__tmp) \
51*437bfbebSnyanmisaka                 mpp_err("mpp sys cfg srv not init at %s\n", __FUNCTION__); \
52*437bfbebSnyanmisaka         } \
53*437bfbebSnyanmisaka         __tmp; \
54*437bfbebSnyanmisaka     })
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka typedef struct MppSysCfgSrv_t {
57*437bfbebSnyanmisaka     MppTrie trie;
58*437bfbebSnyanmisaka     MppMemPool pool;
59*437bfbebSnyanmisaka } MppSysCfgSrv;
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka static MppSysCfgSrv *srv_sys_cfg = NULL;
62*437bfbebSnyanmisaka static RK_U32 mpp_sys_cfg_debug = 0;
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka #define EXPAND_AS_TRIE(base, name, cfg_type, in_type, flag, field_change, field_data) \
65*437bfbebSnyanmisaka     do { \
66*437bfbebSnyanmisaka         MppCfgInfo tmp = { \
67*437bfbebSnyanmisaka             CFG_FUNC_TYPE_##cfg_type, \
68*437bfbebSnyanmisaka             (RK_U32)((long)&(((MppSysCfgSet *)0)->field_change.change)), \
69*437bfbebSnyanmisaka             (RK_U32)((long)&(((MppSysCfgSet *)0)->field_change.field_data)), \
70*437bfbebSnyanmisaka             sizeof((((MppSysCfgSet *)0)->field_change.field_data)), \
71*437bfbebSnyanmisaka         }; \
72*437bfbebSnyanmisaka         mpp_trie_add_info(srv->trie, #base":"#name, &tmp, sizeof(tmp)); \
73*437bfbebSnyanmisaka     } while (0);
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka #define ENTRY_TABLE(ENTRY)  \
76*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, enable,      u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_ENABLE,          dec_buf_chk, enable) \
77*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, type,        u32, MppCodingType,     MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_TYPE,            dec_buf_chk, type) \
78*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, fmt_codec,   u32, MppFrameFormat,    MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_FMT_CODEC,       dec_buf_chk, fmt_codec) \
79*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, fmt_fbc,     u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_FMT_FBC,         dec_buf_chk, fmt_fbc) \
80*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, fmt_hdr,     u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_FMT_HDR,         dec_buf_chk, fmt_hdr) \
81*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, width,       u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_WIDTH,           dec_buf_chk, width) \
82*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, height,      u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_HEIGHT,          dec_buf_chk, height) \
83*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, crop_top,    u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_CROP_TOP,        dec_buf_chk, crop_top) \
84*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, crop_bottom, u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_CROP_BOTTOM,     dec_buf_chk, crop_bottom) \
85*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, crop_left,   u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_CROP_LEFT,       dec_buf_chk, crop_left) \
86*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, crop_right,  u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_CROP_RIGHT,      dec_buf_chk, crop_right) \
87*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, unit_size,   u32, RK_U32,            MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_CROP_RIGHT,      dec_buf_chk, unit_size) \
88*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, has_metadata,    u32, RK_U32,        MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_FLAG_METADATA,   dec_buf_chk, has_metadata) \
89*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, has_thumbnail,   u32, RK_U32,        MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_FLAG_THUMBNAIL,  dec_buf_chk, has_thumbnail) \
90*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, h_stride_by_byte,  u32, RK_U32,      MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_H_STRIDE_BYTE,   dec_buf_chk, h_stride_by_byte) \
91*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, v_stride,          u32, RK_U32,      MPP_SYS_DEC_BUF_CHK_CFG_CHANGE_V_STRIDE,        dec_buf_chk, v_stride) \
92*437bfbebSnyanmisaka     /* read-only config */ \
93*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, cap_fbc,     u32, RK_U32,            0,                                              dec_buf_chk, cap_fbc) \
94*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, cap_tile,    u32, RK_U32,            0,                                              dec_buf_chk, cap_tile) \
95*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, h_stride_by_pixel,   u32, RK_U32,    0,                                              dec_buf_chk, h_stride_by_pixel) \
96*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, offset_y,    u32, RK_U32,            0,                                              dec_buf_chk, offset_y) \
97*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, size_total,  u32, RK_U32,            0,                                              dec_buf_chk, size_total) \
98*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, size_fbc_hdr, u32, RK_U32,           0,                                              dec_buf_chk, size_fbc_hdr) \
99*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, size_fbc_bdy, u32, RK_U32,           0,                                              dec_buf_chk, size_fbc_bdy) \
100*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, size_metadata,   u32, RK_U32,        0,                                              dec_buf_chk, size_metadata) \
101*437bfbebSnyanmisaka     ENTRY(dec_buf_chk, size_thumbnail,  u32, RK_U32,        0,                                              dec_buf_chk, size_thumbnail)
102*437bfbebSnyanmisaka 
mpp_sys_cfg_srv_init()103*437bfbebSnyanmisaka static void mpp_sys_cfg_srv_init()
104*437bfbebSnyanmisaka {
105*437bfbebSnyanmisaka     MppSysCfgSrv *srv = srv_sys_cfg;
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     mpp_env_get_u32("mpp_sys_cfg_debug", &mpp_sys_cfg_debug, mpp_sys_cfg_debug);
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     if (srv)
110*437bfbebSnyanmisaka         return ;
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     srv = mpp_calloc(MppSysCfgSrv, 1);
113*437bfbebSnyanmisaka     if (!srv) {
114*437bfbebSnyanmisaka         mpp_err_f("failed to allocate sys cfg set service\n");
115*437bfbebSnyanmisaka         return ;
116*437bfbebSnyanmisaka     }
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     mpp_trie_init(&srv->trie, "MppSysCfg");
119*437bfbebSnyanmisaka     srv->pool = mpp_mem_pool_init_f(MODULE_TAG, sizeof(MppSysCfgSet));
120*437bfbebSnyanmisaka     if (!srv->trie || !srv->pool) {
121*437bfbebSnyanmisaka         mpp_err_f("failed to init sys cfg set service\n");
122*437bfbebSnyanmisaka         if (srv->trie) {
123*437bfbebSnyanmisaka             mpp_trie_deinit(srv->trie);
124*437bfbebSnyanmisaka             srv->trie = NULL;
125*437bfbebSnyanmisaka         }
126*437bfbebSnyanmisaka         if (srv->pool) {
127*437bfbebSnyanmisaka             mpp_mem_pool_deinit_f(srv->pool);
128*437bfbebSnyanmisaka             srv->pool = NULL;
129*437bfbebSnyanmisaka         }
130*437bfbebSnyanmisaka         MPP_FREE(srv);
131*437bfbebSnyanmisaka         return ;
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     srv_sys_cfg = srv;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     ENTRY_TABLE(EXPAND_AS_TRIE)
137*437bfbebSnyanmisaka     mpp_trie_add_info(srv->trie, NULL, NULL, 0);
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     sys_cfg_dbg_func("info cnt %d node cnt %d size %d\n",
140*437bfbebSnyanmisaka                      mpp_trie_get_info_count(srv->trie),
141*437bfbebSnyanmisaka                      mpp_trie_get_node_count(srv->trie),
142*437bfbebSnyanmisaka                      mpp_trie_get_buf_size(srv->trie));
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka 
mpp_sys_cfg_srv_deinit()145*437bfbebSnyanmisaka static void mpp_sys_cfg_srv_deinit()
146*437bfbebSnyanmisaka {
147*437bfbebSnyanmisaka     MppSysCfgSrv *srv = srv_sys_cfg;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     if (!srv)
150*437bfbebSnyanmisaka         return ;
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     if (srv->trie) {
153*437bfbebSnyanmisaka         mpp_trie_deinit(srv->trie);
154*437bfbebSnyanmisaka         srv->trie = NULL;
155*437bfbebSnyanmisaka     }
156*437bfbebSnyanmisaka     if (srv->pool) {
157*437bfbebSnyanmisaka         mpp_mem_pool_deinit_f(srv->pool);
158*437bfbebSnyanmisaka         srv->pool = NULL;
159*437bfbebSnyanmisaka     }
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka     MPP_FREE(srv_sys_cfg);
162*437bfbebSnyanmisaka }
163*437bfbebSnyanmisaka 
MPP_SINGLETON(MPP_SGLN_SYS_CFG,mpp_sys_cfg,mpp_sys_cfg_srv_init,mpp_sys_cfg_srv_deinit)164*437bfbebSnyanmisaka MPP_SINGLETON(MPP_SGLN_SYS_CFG, mpp_sys_cfg, mpp_sys_cfg_srv_init, mpp_sys_cfg_srv_deinit)
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka static MppSysCfgSet *srv_get_cfg(MppSysCfgSrv *srv)
167*437bfbebSnyanmisaka {
168*437bfbebSnyanmisaka     MppSysCfgSet *node = (MppSysCfgSet*)mpp_mem_pool_get_f(srv->pool);
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     node->dec_buf_chk.type = MPP_VIDEO_CodingUnused;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka     return node;
173*437bfbebSnyanmisaka }
174*437bfbebSnyanmisaka 
srv_put_cfg(MppSysCfgSrv * srv,MppSysCfgSet * node)175*437bfbebSnyanmisaka static MPP_RET srv_put_cfg(MppSysCfgSrv *srv, MppSysCfgSet *node)
176*437bfbebSnyanmisaka {
177*437bfbebSnyanmisaka     mpp_mem_pool_put_f(srv->pool, node);
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka     return MPP_OK;
180*437bfbebSnyanmisaka }
181*437bfbebSnyanmisaka 
mpp_sys_cfg_get(MppSysCfg * cfg)182*437bfbebSnyanmisaka MPP_RET mpp_sys_cfg_get(MppSysCfg *cfg)
183*437bfbebSnyanmisaka {
184*437bfbebSnyanmisaka     MppSysCfgSrv *srv = get_srv_sys_cfg_f();
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     if (!cfg) {
187*437bfbebSnyanmisaka         mpp_err_f("invalid NULL input config\n");
188*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
189*437bfbebSnyanmisaka     }
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     *cfg = NULL;
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     if (!srv)
194*437bfbebSnyanmisaka         return MPP_NOK;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka     mpp_env_get_u32("mpp_sys_cfg_debug", &mpp_sys_cfg_debug, mpp_sys_cfg_debug);
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     *cfg = srv_get_cfg(srv);
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka     return *cfg ? MPP_OK : MPP_NOK;
201*437bfbebSnyanmisaka }
202*437bfbebSnyanmisaka 
mpp_sys_cfg_put(MppSysCfg cfg)203*437bfbebSnyanmisaka MPP_RET mpp_sys_cfg_put(MppSysCfg cfg)
204*437bfbebSnyanmisaka {
205*437bfbebSnyanmisaka     MppSysCfgSrv *srv = get_srv_sys_cfg_f();
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     if (!srv)
208*437bfbebSnyanmisaka         return MPP_NOK;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     return srv_put_cfg(srv, (MppSysCfgSet *)cfg);
211*437bfbebSnyanmisaka }
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka typedef enum SysCfgAlignType_e {
214*437bfbebSnyanmisaka     SYS_CFG_ALIGN_8,
215*437bfbebSnyanmisaka     SYS_CFG_ALIGN_16,
216*437bfbebSnyanmisaka     SYS_CFG_ALIGN_32,
217*437bfbebSnyanmisaka     SYS_CFG_ALIGN_64,
218*437bfbebSnyanmisaka     SYS_CFG_ALIGN_128,
219*437bfbebSnyanmisaka     SYS_CFG_ALIGN_256,
220*437bfbebSnyanmisaka     SYS_CFG_ALIGN_256_ODD,
221*437bfbebSnyanmisaka     SYS_CFG_ALIGN_128_ODD_PLUS_64,
222*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_DEFAULT,
223*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_420,
224*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_422,
225*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_444,
226*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_422_AVC,
227*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_420_AV1,
228*437bfbebSnyanmisaka     SYS_CFG_ALIGN_LEN_422_AV1,
229*437bfbebSnyanmisaka     SYS_CFG_ALIGN_BUTT,
230*437bfbebSnyanmisaka } SysCfgAlignType;
231*437bfbebSnyanmisaka 
mpp_sys_cfg_align(SysCfgAlignType type,RK_U32 val)232*437bfbebSnyanmisaka static RK_U32 mpp_sys_cfg_align(SysCfgAlignType type, RK_U32 val)
233*437bfbebSnyanmisaka {
234*437bfbebSnyanmisaka     switch (type) {
235*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_8: { return MPP_ALIGN(val, 8);};
236*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_16: { return MPP_ALIGN(val, 16);};
237*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_32: { return MPP_ALIGN(val, 32);};
238*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_64: { return MPP_ALIGN(val, 64);};
239*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_128: { return MPP_ALIGN(val, 128);};
240*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_256: { return MPP_ALIGN(val, 256);};
241*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_256_ODD: {return MPP_ALIGN(val, 256) | 256;};
242*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_128_ODD_PLUS_64: {
243*437bfbebSnyanmisaka         val = MPP_ALIGN(val, 64);
244*437bfbebSnyanmisaka         if (((val - 64) % 256 == 128))
245*437bfbebSnyanmisaka             return val;
246*437bfbebSnyanmisaka         else
247*437bfbebSnyanmisaka             return ((MPP_ALIGN(val, 128) | 128) + 64);
248*437bfbebSnyanmisaka     };
249*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_DEFAULT: { return (9 * MPP_ALIGN(val, 16) / 5);};
250*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_420:
251*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_422: { return (2 * MPP_ALIGN(val, 16));};
252*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_444: { return (3 * MPP_ALIGN(val, 16));};
253*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_422_AVC: { return ((5 * MPP_ALIGN(val, 16)) / 2);};
254*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_420_AV1: { return (2 * MPP_ALIGN(val, 128));};
255*437bfbebSnyanmisaka     case SYS_CFG_ALIGN_LEN_422_AV1: { return ((5 * MPP_ALIGN(val, 64)) / 2);};
256*437bfbebSnyanmisaka     default: {
257*437bfbebSnyanmisaka         mpp_err("Specifying the align type is necessary");
258*437bfbebSnyanmisaka         return MPP_NOK;
259*437bfbebSnyanmisaka     };
260*437bfbebSnyanmisaka     }
261*437bfbebSnyanmisaka }
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka /* Based on drm_gem_framebuffer_helper.c drm_gem_afbc_min_size() */
get_afbc_min_size(RK_S32 width,RK_S32 height,RK_S32 bpp)264*437bfbebSnyanmisaka static RK_S32 get_afbc_min_size(RK_S32 width, RK_S32 height, RK_S32 bpp)
265*437bfbebSnyanmisaka {
266*437bfbebSnyanmisaka #define AFBC_HEADER_SIZE 16
267*437bfbebSnyanmisaka #define AFBC_HDR_ALIGN 64
268*437bfbebSnyanmisaka #define AFBC_SUPERBLOCK_PIXELS 256
269*437bfbebSnyanmisaka #define AFBC_SUPERBLOCK_ALIGNMENT 128
270*437bfbebSnyanmisaka 
271*437bfbebSnyanmisaka     RK_S32 n_blocks, hdr_alignment, size;
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka     /* AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 and !AFBC_FORMAT_MOD_TILED */
274*437bfbebSnyanmisaka     width = MPP_ALIGN(width, 16);
275*437bfbebSnyanmisaka     height = MPP_ALIGN(height, 16);
276*437bfbebSnyanmisaka     hdr_alignment = AFBC_HDR_ALIGN;
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka     n_blocks = (width * height) / AFBC_SUPERBLOCK_PIXELS;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     size = MPP_ALIGN(n_blocks * AFBC_HEADER_SIZE, hdr_alignment);
281*437bfbebSnyanmisaka     size += n_blocks * MPP_ALIGN(bpp * AFBC_SUPERBLOCK_PIXELS / 8,
282*437bfbebSnyanmisaka                                  AFBC_SUPERBLOCK_ALIGNMENT);
283*437bfbebSnyanmisaka     return size;
284*437bfbebSnyanmisaka }
285*437bfbebSnyanmisaka 
286*437bfbebSnyanmisaka /*
287*437bfbebSnyanmisaka  * in:  fmt_fbc,type,width,h_stride
288*437bfbebSnyanmisaka  * out: stride_w
289*437bfbebSnyanmisaka  *
290*437bfbebSnyanmisaka  * in:  fmt_fbc,type,height,v_stride
291*437bfbebSnyanmisaka  * out: stride_h
292*437bfbebSnyanmisaka  *
293*437bfbebSnyanmisaka  * in:  fmt_fbc,type,fmt_codec,width,h_stride
294*437bfbebSnyanmisaka  * out: h_stride_by_byte
295*437bfbebSnyanmisaka  *
296*437bfbebSnyanmisaka  * in:  fmt_fbc,type,fmt_codec,width,height,h_stride,v_stride
297*437bfbebSnyanmisaka  * out: buffer_size
298*437bfbebSnyanmisaka  */
mpp_sys_dec_buf_chk_proc(MppSysDecBufChkCfg * cfg)299*437bfbebSnyanmisaka MPP_RET mpp_sys_dec_buf_chk_proc(MppSysDecBufChkCfg *cfg)
300*437bfbebSnyanmisaka {
301*437bfbebSnyanmisaka     MppCodingType type = cfg->type;
302*437bfbebSnyanmisaka     MppFrameFormat fmt = (MppFrameFormat)(((RK_U32)cfg->fmt_codec & MPP_FRAME_FMT_MASK) |
303*437bfbebSnyanmisaka                                           (cfg->fmt_fbc & MPP_FRAME_FBC_MASK) |
304*437bfbebSnyanmisaka                                           (cfg->fmt_hdr & MPP_FRAME_HDR_MASK));
305*437bfbebSnyanmisaka     MppFrameFormat fmt_raw = cfg->fmt_codec;
306*437bfbebSnyanmisaka 
307*437bfbebSnyanmisaka     RK_U32 aligned_pixel = 0;
308*437bfbebSnyanmisaka     RK_U32 aligned_pixel_byte = 0;
309*437bfbebSnyanmisaka     RK_U32 aligned_byte = 0;
310*437bfbebSnyanmisaka     RK_U32 aligned_height = 0;
311*437bfbebSnyanmisaka     RK_U32 size_total = 0;
312*437bfbebSnyanmisaka     RK_U32 size_total_old = 0;
313*437bfbebSnyanmisaka     RK_U32 depth = MPP_FRAME_FMT_IS_YUV_10BIT(fmt) ? 10 : 8;
314*437bfbebSnyanmisaka 
315*437bfbebSnyanmisaka     if (type == MPP_VIDEO_CodingUnused) {
316*437bfbebSnyanmisaka         mpp_err("The coding type is invalid");
317*437bfbebSnyanmisaka         return MPP_NOK;
318*437bfbebSnyanmisaka     }
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka     /* use codec stride */
321*437bfbebSnyanmisaka     if (cfg->h_stride_by_byte)
322*437bfbebSnyanmisaka         aligned_pixel = cfg->h_stride_by_byte * 8 / depth;
323*437bfbebSnyanmisaka     if (cfg->v_stride)
324*437bfbebSnyanmisaka         aligned_height = cfg->v_stride;
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka     sys_cfg_dbg_dec_buf("org pixel wxh: [%d %d]\n", cfg->width, cfg->height);
327*437bfbebSnyanmisaka     sys_cfg_dbg_dec_buf("outside stride wxh: [%d %d]\n",
328*437bfbebSnyanmisaka                         cfg->h_stride_by_byte, cfg->v_stride);
329*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(fmt)) {
330*437bfbebSnyanmisaka         /* fbc case */
331*437bfbebSnyanmisaka         switch (type) {
332*437bfbebSnyanmisaka         case MPP_VIDEO_CodingHEVC :
333*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAV1 : {
334*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 64);
335*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(aligned_height ? aligned_height : cfg->height, 16);
336*437bfbebSnyanmisaka         } break;
337*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVC :
338*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVSPLUS :
339*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVS :
340*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVS2 : {
341*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 64);
342*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(aligned_height ? aligned_height : cfg->height, 16);
343*437bfbebSnyanmisaka         } break;
344*437bfbebSnyanmisaka         case MPP_VIDEO_CodingVP9 : {
345*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 64);
346*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(aligned_height ? aligned_height : cfg->height, 64);
347*437bfbebSnyanmisaka         } break;
348*437bfbebSnyanmisaka         default : {
349*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 16);
350*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(aligned_height ? aligned_height : cfg->height, 16);
351*437bfbebSnyanmisaka         } break;
352*437bfbebSnyanmisaka         }
353*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("spec aligned pixel wxh: [%d %d]\n", aligned_pixel, aligned_height);
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka         /*fbc stride default 64 align*/
356*437bfbebSnyanmisaka         if (*compat_ext_fbc_hdr_256_odd)
357*437bfbebSnyanmisaka             aligned_pixel_byte = (MPP_ALIGN(aligned_pixel, 256) | 256) * depth >> 3;
358*437bfbebSnyanmisaka         else
359*437bfbebSnyanmisaka             aligned_pixel_byte = MPP_ALIGN(aligned_pixel, 64) * depth >> 3;
360*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("need 256 odd align: %d\n", *compat_ext_fbc_hdr_256_odd);
361*437bfbebSnyanmisaka 
362*437bfbebSnyanmisaka         switch (type) {
363*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVC :
364*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVSPLUS :
365*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVS :
366*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVS2 : {
367*437bfbebSnyanmisaka             aligned_byte = MPP_ALIGN(aligned_pixel_byte, 64);
368*437bfbebSnyanmisaka         } break;
369*437bfbebSnyanmisaka         case MPP_VIDEO_CodingHEVC : {
370*437bfbebSnyanmisaka             aligned_byte = MPP_ALIGN(aligned_pixel_byte, 64);
371*437bfbebSnyanmisaka         } break;
372*437bfbebSnyanmisaka         case MPP_VIDEO_CodingVP9 : {
373*437bfbebSnyanmisaka             aligned_byte = MPP_ALIGN(aligned_pixel_byte, 64);
374*437bfbebSnyanmisaka         } break;
375*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAV1 : {
376*437bfbebSnyanmisaka             aligned_byte = MPP_ALIGN(aligned_pixel_byte, 16);
377*437bfbebSnyanmisaka         } break;
378*437bfbebSnyanmisaka         default : {
379*437bfbebSnyanmisaka             aligned_byte = MPP_ALIGN(aligned_pixel_byte, 16);
380*437bfbebSnyanmisaka         } break;
381*437bfbebSnyanmisaka         }
382*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("dec hw aligned hor_byte: [%d]\n", aligned_byte);
383*437bfbebSnyanmisaka 
384*437bfbebSnyanmisaka         cfg->h_stride_by_byte = aligned_byte;
385*437bfbebSnyanmisaka         cfg->h_stride_by_pixel = aligned_pixel;
386*437bfbebSnyanmisaka         cfg->v_stride = aligned_height;
387*437bfbebSnyanmisaka 
388*437bfbebSnyanmisaka         switch ((fmt_raw & MPP_FRAME_FMT_MASK)) {
389*437bfbebSnyanmisaka         case MPP_FMT_YUV420SP_10BIT : {
390*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 15);
391*437bfbebSnyanmisaka         } break;
392*437bfbebSnyanmisaka         case MPP_FMT_YUV422SP_10BIT : {
393*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 20);
394*437bfbebSnyanmisaka         } break;
395*437bfbebSnyanmisaka         case MPP_FMT_YUV420SP : {
396*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 12);
397*437bfbebSnyanmisaka         } break;
398*437bfbebSnyanmisaka         case MPP_FMT_YUV422SP : {
399*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 16);
400*437bfbebSnyanmisaka         } break;
401*437bfbebSnyanmisaka         case MPP_FMT_YUV444SP : {
402*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 24);
403*437bfbebSnyanmisaka         } break;
404*437bfbebSnyanmisaka         case MPP_FMT_YUV444SP_10BIT : {
405*437bfbebSnyanmisaka             size_total = get_afbc_min_size(aligned_pixel, aligned_height, 30);
406*437bfbebSnyanmisaka         } break;
407*437bfbebSnyanmisaka         default : {
408*437bfbebSnyanmisaka             size_total = aligned_byte * aligned_height * 3 / 2;
409*437bfbebSnyanmisaka             mpp_err("dec out fmt 0x%x is no support", fmt_raw & MPP_FRAME_FMT_MASK);
410*437bfbebSnyanmisaka         } break;
411*437bfbebSnyanmisaka         }
412*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_pixel %d\n", aligned_pixel);
413*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_byte %d\n", aligned_byte);
414*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_height %d\n", aligned_height);
415*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res GPU aligned size_total: [%d]\n", size_total);
416*437bfbebSnyanmisaka 
417*437bfbebSnyanmisaka         cfg->size_total = size_total;
418*437bfbebSnyanmisaka     } else {
419*437bfbebSnyanmisaka         /* tile case */
420*437bfbebSnyanmisaka         /* raster case */
421*437bfbebSnyanmisaka         RockchipSocType soc_type = mpp_get_soc_type();
422*437bfbebSnyanmisaka 
423*437bfbebSnyanmisaka         aligned_pixel = cfg->width;
424*437bfbebSnyanmisaka         switch (type) {
425*437bfbebSnyanmisaka         case MPP_VIDEO_CodingHEVC : {
426*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 64);
427*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 8);
428*437bfbebSnyanmisaka         } break;
429*437bfbebSnyanmisaka         /*
430*437bfbebSnyanmisaka          * avc aligned to ctu
431*437bfbebSnyanmisaka          * p_Vid->width = p_Vid->PicWidthInMbs * 16
432*437bfbebSnyanmisaka          * p_Vid->height = p_Vid->FrameHeightInMbs * 16
433*437bfbebSnyanmisaka          */
434*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVC : {
435*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 16);
436*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 16);
437*437bfbebSnyanmisaka         } break;
438*437bfbebSnyanmisaka         case MPP_VIDEO_CodingVP9 : {
439*437bfbebSnyanmisaka             if (soc_type == ROCKCHIP_SOC_RK3399)
440*437bfbebSnyanmisaka                 aligned_height = MPP_ALIGN(cfg->height, 64);
441*437bfbebSnyanmisaka             else if (soc_type == ROCKCHIP_SOC_RK3588)
442*437bfbebSnyanmisaka                 aligned_height = MPP_ALIGN(cfg->height, 16);
443*437bfbebSnyanmisaka             else
444*437bfbebSnyanmisaka                 aligned_height = MPP_ALIGN(cfg->height, 8);
445*437bfbebSnyanmisaka         } break;
446*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAV1 : {
447*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 8);
448*437bfbebSnyanmisaka         } break;
449*437bfbebSnyanmisaka         case MPP_VIDEO_CodingVP8 :
450*437bfbebSnyanmisaka         case MPP_VIDEO_CodingH263 :
451*437bfbebSnyanmisaka         case MPP_VIDEO_CodingMPEG2 :
452*437bfbebSnyanmisaka         case MPP_VIDEO_CodingMPEG4 : {
453*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 16);
454*437bfbebSnyanmisaka         } break;
455*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAVS2 : {
456*437bfbebSnyanmisaka             aligned_pixel = MPP_ALIGN(cfg->width, 64);
457*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 8);
458*437bfbebSnyanmisaka         } break;
459*437bfbebSnyanmisaka         default : {
460*437bfbebSnyanmisaka             aligned_height = MPP_ALIGN(cfg->height, 8);
461*437bfbebSnyanmisaka         } break;
462*437bfbebSnyanmisaka         }
463*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("spec aligned pixel wxh: [%d %d]\n", aligned_pixel, aligned_height);
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka         aligned_pixel_byte = cfg->h_stride_by_byte ? cfg->h_stride_by_byte :
466*437bfbebSnyanmisaka                              aligned_pixel * depth / 8;
467*437bfbebSnyanmisaka         aligned_height = cfg->v_stride ? cfg->v_stride : aligned_height;
468*437bfbebSnyanmisaka 
469*437bfbebSnyanmisaka         switch (type) {
470*437bfbebSnyanmisaka         case MPP_VIDEO_CodingHEVC : {
471*437bfbebSnyanmisaka             aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_64, aligned_pixel_byte);
472*437bfbebSnyanmisaka         } break;
473*437bfbebSnyanmisaka         case MPP_VIDEO_CodingVP9 : {
474*437bfbebSnyanmisaka             if (soc_type == ROCKCHIP_SOC_RK3576)
475*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_128_ODD_PLUS_64,
476*437bfbebSnyanmisaka                                                  aligned_pixel_byte);
477*437bfbebSnyanmisaka             else
478*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_256_ODD, aligned_pixel_byte);
479*437bfbebSnyanmisaka         } break;
480*437bfbebSnyanmisaka         case MPP_VIDEO_CodingAV1 : {
481*437bfbebSnyanmisaka             if (soc_type == ROCKCHIP_SOC_RK3588)
482*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_16, aligned_pixel_byte);
483*437bfbebSnyanmisaka             else
484*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_128, aligned_pixel_byte);
485*437bfbebSnyanmisaka         } break;
486*437bfbebSnyanmisaka         default : {
487*437bfbebSnyanmisaka             aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_16, aligned_pixel_byte);
488*437bfbebSnyanmisaka         } break;
489*437bfbebSnyanmisaka         }
490*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("dec hw aligned hor_byte: [%d %d]\n", aligned_byte);
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka         /*
493*437bfbebSnyanmisaka          * NOTE: rk3576 use 128 odd plus 64 for all non jpeg format
494*437bfbebSnyanmisaka          * all the other socs use 256 odd on larger than 1080p
495*437bfbebSnyanmisaka          */
496*437bfbebSnyanmisaka         if ((aligned_byte > 1920 || soc_type == ROCKCHIP_SOC_RK3576)
497*437bfbebSnyanmisaka             && type != MPP_VIDEO_CodingMJPEG) {
498*437bfbebSnyanmisaka             rk_s32 update = 0;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka             switch (soc_type) {
501*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3399 :
502*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3568 :
503*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3562 :
504*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3528 :
505*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3588 : {
506*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_256_ODD, aligned_byte);
507*437bfbebSnyanmisaka                 update = 1;
508*437bfbebSnyanmisaka             } break;
509*437bfbebSnyanmisaka             case ROCKCHIP_SOC_RK3576 : {
510*437bfbebSnyanmisaka                 aligned_byte = mpp_sys_cfg_align(SYS_CFG_ALIGN_128_ODD_PLUS_64, aligned_byte);
511*437bfbebSnyanmisaka                 update = 1;
512*437bfbebSnyanmisaka             } break;
513*437bfbebSnyanmisaka             default : {
514*437bfbebSnyanmisaka             } break;
515*437bfbebSnyanmisaka             }
516*437bfbebSnyanmisaka 
517*437bfbebSnyanmisaka             /*
518*437bfbebSnyanmisaka              * recalc aligned_pixel here
519*437bfbebSnyanmisaka              * NOTE: no RGB format here in fact
520*437bfbebSnyanmisaka              */
521*437bfbebSnyanmisaka             if (update) {
522*437bfbebSnyanmisaka                 switch (fmt & MPP_FRAME_FMT_MASK) {
523*437bfbebSnyanmisaka                 case MPP_FMT_YUV420SP_10BIT:
524*437bfbebSnyanmisaka                 case MPP_FMT_YUV422SP_10BIT:
525*437bfbebSnyanmisaka                 case MPP_FMT_YUV444SP_10BIT: {
526*437bfbebSnyanmisaka                     aligned_pixel = aligned_byte * 8 / 10;
527*437bfbebSnyanmisaka                 } break;
528*437bfbebSnyanmisaka                 case MPP_FMT_YUV422_YVYU:
529*437bfbebSnyanmisaka                 case MPP_FMT_YUV422_YUYV:
530*437bfbebSnyanmisaka                 case MPP_FMT_RGB565:
531*437bfbebSnyanmisaka                 case MPP_FMT_BGR565: {
532*437bfbebSnyanmisaka                     aligned_pixel = aligned_byte / 2;
533*437bfbebSnyanmisaka                 } break;
534*437bfbebSnyanmisaka                 case MPP_FMT_RGB888:
535*437bfbebSnyanmisaka                 case MPP_FMT_BGR888: {
536*437bfbebSnyanmisaka                     aligned_pixel = aligned_byte / 3;
537*437bfbebSnyanmisaka                 } break;
538*437bfbebSnyanmisaka                 default : {
539*437bfbebSnyanmisaka                     aligned_pixel = aligned_byte;
540*437bfbebSnyanmisaka                 } break;
541*437bfbebSnyanmisaka                 }
542*437bfbebSnyanmisaka             }
543*437bfbebSnyanmisaka         }
544*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("dec hw performance aligned hor_byte: [%d]\n", aligned_pixel);
545*437bfbebSnyanmisaka 
546*437bfbebSnyanmisaka         cfg->h_stride_by_byte = aligned_byte;
547*437bfbebSnyanmisaka         cfg->h_stride_by_pixel = aligned_pixel;
548*437bfbebSnyanmisaka         cfg->v_stride = aligned_height;
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka         size_total = aligned_byte * aligned_height;
551*437bfbebSnyanmisaka         size_total_old = size_total;
552*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("fmt_raw %x\n", fmt_raw);
553*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_pixel %d\n", aligned_pixel);
554*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_byte %d\n", aligned_byte);
555*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res aligned_height %d\n", aligned_height);
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka         switch (fmt_raw) {
558*437bfbebSnyanmisaka         case MPP_FMT_YUV420SP :
559*437bfbebSnyanmisaka         case MPP_FMT_YUV420SP_10BIT :
560*437bfbebSnyanmisaka         case MPP_FMT_YUV420P :
561*437bfbebSnyanmisaka         case MPP_FMT_YUV420SP_VU : {
562*437bfbebSnyanmisaka             SysCfgAlignType align_type = SYS_CFG_ALIGN_LEN_DEFAULT;
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka             /* hevc and vp9 - SYS_CFG_ALIGN_LEN_DEFAULT */
565*437bfbebSnyanmisaka             if (type == MPP_VIDEO_CodingAV1)
566*437bfbebSnyanmisaka                 align_type = SYS_CFG_ALIGN_LEN_420_AV1;
567*437bfbebSnyanmisaka             else if (type == MPP_VIDEO_CodingAVC)
568*437bfbebSnyanmisaka                 align_type = SYS_CFG_ALIGN_LEN_420;
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka             size_total = mpp_sys_cfg_align(align_type, size_total);
571*437bfbebSnyanmisaka         } break;
572*437bfbebSnyanmisaka         case MPP_FMT_YUV422SP :
573*437bfbebSnyanmisaka         case MPP_FMT_YUV422SP_10BIT :
574*437bfbebSnyanmisaka         case MPP_FMT_YUV422P :
575*437bfbebSnyanmisaka         case MPP_FMT_YUV422SP_VU :
576*437bfbebSnyanmisaka         case MPP_FMT_YUV422_YUYV :
577*437bfbebSnyanmisaka         case MPP_FMT_YUV422_YVYU :
578*437bfbebSnyanmisaka         case MPP_FMT_YUV422_UYVY :
579*437bfbebSnyanmisaka         case MPP_FMT_YUV422_VYUY :
580*437bfbebSnyanmisaka         case MPP_FMT_YUV440SP :
581*437bfbebSnyanmisaka         case MPP_FMT_YUV411SP : {
582*437bfbebSnyanmisaka             SysCfgAlignType align_type;
583*437bfbebSnyanmisaka 
584*437bfbebSnyanmisaka             if (type == MPP_VIDEO_CodingAVC)
585*437bfbebSnyanmisaka                 align_type = SYS_CFG_ALIGN_LEN_422_AVC;
586*437bfbebSnyanmisaka             else if (type == MPP_VIDEO_CodingAV1)
587*437bfbebSnyanmisaka                 align_type = SYS_CFG_ALIGN_LEN_422_AV1;
588*437bfbebSnyanmisaka             else
589*437bfbebSnyanmisaka                 align_type = SYS_CFG_ALIGN_LEN_422;
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka             size_total = mpp_sys_cfg_align(align_type, size_total);
592*437bfbebSnyanmisaka         } break;
593*437bfbebSnyanmisaka         case MPP_FMT_YUV400 : {
594*437bfbebSnyanmisaka             /* do nothing */
595*437bfbebSnyanmisaka         } break;
596*437bfbebSnyanmisaka         case MPP_FMT_YUV444SP :
597*437bfbebSnyanmisaka         case MPP_FMT_YUV444P :
598*437bfbebSnyanmisaka         case MPP_FMT_YUV444SP_10BIT : {
599*437bfbebSnyanmisaka             size_total = mpp_sys_cfg_align(SYS_CFG_ALIGN_LEN_444, size_total);
600*437bfbebSnyanmisaka         } break;
601*437bfbebSnyanmisaka         default : {
602*437bfbebSnyanmisaka             size_total = size_total * 3 / 2;
603*437bfbebSnyanmisaka         }
604*437bfbebSnyanmisaka         }
605*437bfbebSnyanmisaka         sys_cfg_dbg_dec_buf("res size total %d -> %d\n", size_total_old, size_total);
606*437bfbebSnyanmisaka 
607*437bfbebSnyanmisaka         cfg->size_total = size_total;
608*437bfbebSnyanmisaka     }
609*437bfbebSnyanmisaka 
610*437bfbebSnyanmisaka     return MPP_OK;
611*437bfbebSnyanmisaka }
612*437bfbebSnyanmisaka 
mpp_sys_cfg_ioctl(MppSysCfg cfg)613*437bfbebSnyanmisaka MPP_RET mpp_sys_cfg_ioctl(MppSysCfg cfg)
614*437bfbebSnyanmisaka {
615*437bfbebSnyanmisaka     MppSysCfgSet *p = (MppSysCfgSet *)cfg;
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka     if (!cfg) {
618*437bfbebSnyanmisaka         mpp_err_f("invalid NULL input config\n");
619*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
620*437bfbebSnyanmisaka     }
621*437bfbebSnyanmisaka 
622*437bfbebSnyanmisaka     if (p->dec_buf_chk.enable) {
623*437bfbebSnyanmisaka         mpp_sys_dec_buf_chk_proc(&p->dec_buf_chk);
624*437bfbebSnyanmisaka         p->dec_buf_chk.enable = 0;
625*437bfbebSnyanmisaka     }
626*437bfbebSnyanmisaka 
627*437bfbebSnyanmisaka     return MPP_OK;
628*437bfbebSnyanmisaka }
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka #define MPP_CFG_SET_ACCESS(func_name, in_type, cfg_type) \
631*437bfbebSnyanmisaka     MPP_RET func_name(MppSysCfg cfg, const char *name, in_type val) \
632*437bfbebSnyanmisaka     { \
633*437bfbebSnyanmisaka         MppSysCfgSrv *srv = get_srv_sys_cfg_f(); \
634*437bfbebSnyanmisaka         MppSysCfgSet *p; \
635*437bfbebSnyanmisaka         MppTrieInfo *node; \
636*437bfbebSnyanmisaka         MppCfgInfo *info; \
637*437bfbebSnyanmisaka         if (!srv) \
638*437bfbebSnyanmisaka             return MPP_NOK; \
639*437bfbebSnyanmisaka         if (!cfg || !name) { \
640*437bfbebSnyanmisaka             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
641*437bfbebSnyanmisaka             return MPP_ERR_NULL_PTR; \
642*437bfbebSnyanmisaka         } \
643*437bfbebSnyanmisaka         p = (MppSysCfgSet *)cfg; \
644*437bfbebSnyanmisaka         node = mpp_trie_get_info(srv->trie, name); \
645*437bfbebSnyanmisaka         info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
646*437bfbebSnyanmisaka         if (CHECK_CFG_INFO(info, name, CFG_FUNC_TYPE_##cfg_type)) { \
647*437bfbebSnyanmisaka             return MPP_NOK; \
648*437bfbebSnyanmisaka         } \
649*437bfbebSnyanmisaka         if (!info->flag_offset) { \
650*437bfbebSnyanmisaka             mpp_log_f("can not set readonly cfg %s\n", mpp_trie_info_name(node)); \
651*437bfbebSnyanmisaka             return MPP_NOK; \
652*437bfbebSnyanmisaka         } \
653*437bfbebSnyanmisaka         sys_cfg_dbg_set("name %s type %s\n", mpp_trie_info_name(node), \
654*437bfbebSnyanmisaka                         strof_cfg_type(info->data_type)); \
655*437bfbebSnyanmisaka         MPP_RET ret = MPP_CFG_SET_##cfg_type(info, p, val); \
656*437bfbebSnyanmisaka         return ret; \
657*437bfbebSnyanmisaka     }
658*437bfbebSnyanmisaka 
659*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_s32, RK_S32, s32);
660*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_u32, RK_U32, u32);
661*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_s64, RK_S64, s64);
662*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_u64, RK_U64, u64);
663*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_ptr, void *, ptr);
664*437bfbebSnyanmisaka MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_st,  void *, st);
665*437bfbebSnyanmisaka 
666*437bfbebSnyanmisaka #define MPP_CFG_GET_ACCESS(func_name, in_type, cfg_type) \
667*437bfbebSnyanmisaka     MPP_RET func_name(MppSysCfg cfg, const char *name, in_type *val) \
668*437bfbebSnyanmisaka     { \
669*437bfbebSnyanmisaka         MppSysCfgSrv *srv = get_srv_sys_cfg_f(); \
670*437bfbebSnyanmisaka         MppSysCfgSet *p; \
671*437bfbebSnyanmisaka         MppTrieInfo *node; \
672*437bfbebSnyanmisaka         MppCfgInfo *info; \
673*437bfbebSnyanmisaka         if (!srv) \
674*437bfbebSnyanmisaka             return MPP_NOK; \
675*437bfbebSnyanmisaka         if (!cfg || !name) { \
676*437bfbebSnyanmisaka             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
677*437bfbebSnyanmisaka             return MPP_ERR_NULL_PTR; \
678*437bfbebSnyanmisaka         } \
679*437bfbebSnyanmisaka         p = (MppSysCfgSet *)cfg; \
680*437bfbebSnyanmisaka         node = mpp_trie_get_info(srv->trie, name); \
681*437bfbebSnyanmisaka         info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
682*437bfbebSnyanmisaka         if (CHECK_CFG_INFO(info, name, CFG_FUNC_TYPE_##cfg_type)) { \
683*437bfbebSnyanmisaka             return MPP_NOK; \
684*437bfbebSnyanmisaka         } \
685*437bfbebSnyanmisaka         sys_cfg_dbg_set("name %s type %s\n", mpp_trie_info_name(node), \
686*437bfbebSnyanmisaka                             strof_cfg_type(info->data_type)); \
687*437bfbebSnyanmisaka         MPP_RET ret = MPP_CFG_GET_##cfg_type(info, p, val); \
688*437bfbebSnyanmisaka         return ret; \
689*437bfbebSnyanmisaka     }
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_s32, RK_S32, s32);
692*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_u32, RK_U32, u32);
693*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_s64, RK_S64, s64);
694*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_u64, RK_U64, u64);
695*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_ptr, void *, ptr);
696*437bfbebSnyanmisaka MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_st,  void  , st);
697*437bfbebSnyanmisaka 
mpp_sys_cfg_show(void)698*437bfbebSnyanmisaka void mpp_sys_cfg_show(void)
699*437bfbebSnyanmisaka {
700*437bfbebSnyanmisaka     MppSysCfgSrv *srv = get_srv_sys_cfg_f();
701*437bfbebSnyanmisaka     MppTrieInfo *root;
702*437bfbebSnyanmisaka     MppTrie trie;
703*437bfbebSnyanmisaka 
704*437bfbebSnyanmisaka     if (!srv)
705*437bfbebSnyanmisaka         return ;
706*437bfbebSnyanmisaka 
707*437bfbebSnyanmisaka     trie = srv->trie;
708*437bfbebSnyanmisaka     root = mpp_trie_get_info_first(trie);
709*437bfbebSnyanmisaka 
710*437bfbebSnyanmisaka     mpp_log("dumping valid configure string start\n");
711*437bfbebSnyanmisaka 
712*437bfbebSnyanmisaka     if (root) {
713*437bfbebSnyanmisaka         MppTrieInfo *node = root;
714*437bfbebSnyanmisaka         rk_s32 len = mpp_trie_get_name_max(trie);
715*437bfbebSnyanmisaka 
716*437bfbebSnyanmisaka         do {
717*437bfbebSnyanmisaka             if (mpp_trie_info_is_self(node))
718*437bfbebSnyanmisaka                 continue;
719*437bfbebSnyanmisaka 
720*437bfbebSnyanmisaka             if (node->ctx_len == sizeof(MppCfgInfo)) {
721*437bfbebSnyanmisaka                 MppCfgInfo *info = (MppCfgInfo *)mpp_trie_info_ctx(node);
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka                 mpp_log("%-*s type %s - %d:%d\n", len, mpp_trie_info_name(node),
724*437bfbebSnyanmisaka                         strof_cfg_type(info->data_type), info->data_offset, info->data_size);
725*437bfbebSnyanmisaka             } else {
726*437bfbebSnyanmisaka                 mpp_log("%-*s size - %d\n", len, mpp_trie_info_name(node), node->ctx_len);
727*437bfbebSnyanmisaka             }
728*437bfbebSnyanmisaka         } while ((node = mpp_trie_get_info_next(trie, node)));
729*437bfbebSnyanmisaka     }
730*437bfbebSnyanmisaka     mpp_log("dumping valid configure string done\n");
731*437bfbebSnyanmisaka 
732*437bfbebSnyanmisaka     mpp_log("sys cfg size %d count %d with trie node %d size %d\n",
733*437bfbebSnyanmisaka             sizeof(MppSysCfgSet), mpp_trie_get_info_count(trie),
734*437bfbebSnyanmisaka             mpp_trie_get_node_count(trie), mpp_trie_get_buf_size(trie));
735*437bfbebSnyanmisaka }
736