1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "kmpp_vdec_cfg"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka #include <pthread.h>
10*437bfbebSnyanmisaka
11*437bfbebSnyanmisaka #include "mpp_env.h"
12*437bfbebSnyanmisaka #include "mpp_mem.h"
13*437bfbebSnyanmisaka #include "mpp_debug.h"
14*437bfbebSnyanmisaka #include "mpp_common.h"
15*437bfbebSnyanmisaka #include "mpp_singleton.h"
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #include "kmpp_obj.h"
18*437bfbebSnyanmisaka #include "rk_vdec_kcfg.h"
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #define VDEC_KCFG_DBG_FUNC (0x00000001)
21*437bfbebSnyanmisaka #define VDEC_KCFG_DBG_INFO (0x00000002)
22*437bfbebSnyanmisaka #define VDEC_KCFG_DBG_SET (0x00000004)
23*437bfbebSnyanmisaka #define VDEC_KCFG_DBG_GET (0x00000008)
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #define vdec_kcfg_dbg(flag, fmt, ...) _mpp_dbg_f(vdec_kcfg_debug, flag, fmt, ## __VA_ARGS__)
26*437bfbebSnyanmisaka
27*437bfbebSnyanmisaka #define vdec_kcfg_dbg_func(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_FUNC, fmt, ## __VA_ARGS__)
28*437bfbebSnyanmisaka #define vdec_kcfg_dbg_info(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_INFO, fmt, ## __VA_ARGS__)
29*437bfbebSnyanmisaka #define vdec_kcfg_dbg_set(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_SET, fmt, ## __VA_ARGS__)
30*437bfbebSnyanmisaka #define vdec_kcfg_dbg_get(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_GET, fmt, ## __VA_ARGS__)
31*437bfbebSnyanmisaka
32*437bfbebSnyanmisaka static RK_U32 vdec_kcfg_debug = 0;
33*437bfbebSnyanmisaka
34*437bfbebSnyanmisaka static char *kcfg_names[] = {
35*437bfbebSnyanmisaka [MPP_VDEC_KCFG_TYPE_INIT] = "KmppVdecInitCfg",
36*437bfbebSnyanmisaka [MPP_VDEC_KCFG_TYPE_DEINIT] = "KmppVdecDeinitCfg",
37*437bfbebSnyanmisaka [MPP_VDEC_KCFG_TYPE_RESET] = "KmppVdecResetCfg",
38*437bfbebSnyanmisaka [MPP_VDEC_KCFG_TYPE_START] = "KmppVdecStartCfg",
39*437bfbebSnyanmisaka [MPP_VDEC_KCFG_TYPE_STOP] = "KmppVdecStopCfg",
40*437bfbebSnyanmisaka };
41*437bfbebSnyanmisaka static KmppObjDef kcfg_defs[MPP_VDEC_KCFG_TYPE_BUTT] = {NULL};
42*437bfbebSnyanmisaka
mpp_vdec_kcfg_def_init(void)43*437bfbebSnyanmisaka static void mpp_vdec_kcfg_def_init(void)
44*437bfbebSnyanmisaka {
45*437bfbebSnyanmisaka RK_U32 i;
46*437bfbebSnyanmisaka
47*437bfbebSnyanmisaka for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
48*437bfbebSnyanmisaka kmpp_objdef_get(&kcfg_defs[i], 0, kcfg_names[i]);
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka
mpp_vdec_kcfg_def_deinit(void)52*437bfbebSnyanmisaka static void mpp_vdec_kcfg_def_deinit(void)
53*437bfbebSnyanmisaka {
54*437bfbebSnyanmisaka RK_U32 i;
55*437bfbebSnyanmisaka
56*437bfbebSnyanmisaka for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
57*437bfbebSnyanmisaka if (kcfg_defs[i]) {
58*437bfbebSnyanmisaka kmpp_objdef_put(kcfg_defs[i]);
59*437bfbebSnyanmisaka kcfg_defs[i] = NULL;
60*437bfbebSnyanmisaka }
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka }
63*437bfbebSnyanmisaka
MPP_SINGLETON(MPP_SGLN_KMPP_VDEC_CFG,kmpp_vdec_cfg,mpp_vdec_kcfg_def_init,mpp_vdec_kcfg_def_deinit)64*437bfbebSnyanmisaka MPP_SINGLETON(MPP_SGLN_KMPP_VDEC_CFG, kmpp_vdec_cfg, mpp_vdec_kcfg_def_init, mpp_vdec_kcfg_def_deinit)
65*437bfbebSnyanmisaka
66*437bfbebSnyanmisaka MPP_RET mpp_vdec_kcfg_init(MppVdecKcfg *cfg, MppVdecKcfgType type)
67*437bfbebSnyanmisaka {
68*437bfbebSnyanmisaka KmppObj obj = NULL;
69*437bfbebSnyanmisaka
70*437bfbebSnyanmisaka if (!cfg) {
71*437bfbebSnyanmisaka mpp_err_f("invalid NULL input config\n");
72*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka
75*437bfbebSnyanmisaka if (type >= MPP_VDEC_KCFG_TYPE_BUTT) {
76*437bfbebSnyanmisaka mpp_err_f("invalid config type %d\n", type);
77*437bfbebSnyanmisaka return MPP_ERR_VALUE;
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka
80*437bfbebSnyanmisaka mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0);
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka if (kcfg_defs[type])
83*437bfbebSnyanmisaka kmpp_obj_get_f(&obj, kcfg_defs[type]);
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka *cfg = obj;
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka return obj ? MPP_OK : MPP_NOK;
88*437bfbebSnyanmisaka }
89*437bfbebSnyanmisaka
mpp_vdec_kcfg_init_by_name(MppVdecKcfg * cfg,const char * name)90*437bfbebSnyanmisaka MPP_RET mpp_vdec_kcfg_init_by_name(MppVdecKcfg *cfg, const char *name)
91*437bfbebSnyanmisaka {
92*437bfbebSnyanmisaka KmppObj obj = NULL;
93*437bfbebSnyanmisaka MppVdecKcfgType type = MPP_VDEC_KCFG_TYPE_BUTT;
94*437bfbebSnyanmisaka RK_U32 i;
95*437bfbebSnyanmisaka
96*437bfbebSnyanmisaka if (!cfg) {
97*437bfbebSnyanmisaka mpp_err_f("invalid NULL input config\n");
98*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
99*437bfbebSnyanmisaka }
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
102*437bfbebSnyanmisaka if (!strncmp(name, kcfg_names[i], strlen(kcfg_names[i]))) {
103*437bfbebSnyanmisaka type = i;
104*437bfbebSnyanmisaka break;
105*437bfbebSnyanmisaka }
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka
108*437bfbebSnyanmisaka if (type >= MPP_VDEC_KCFG_TYPE_BUTT) {
109*437bfbebSnyanmisaka mpp_err_f("invalid config name %s\n", name);
110*437bfbebSnyanmisaka return MPP_ERR_VALUE;
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka
113*437bfbebSnyanmisaka mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0);
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka kmpp_obj_get_f(&obj, kcfg_defs[type]);
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka *cfg = obj;
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka return obj ? MPP_OK : MPP_NOK;
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka
mpp_vdec_kcfg_deinit(MppVdecKcfg cfg)122*437bfbebSnyanmisaka MPP_RET mpp_vdec_kcfg_deinit(MppVdecKcfg cfg)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka KmppObj obj = cfg;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka if (!cfg) {
127*437bfbebSnyanmisaka mpp_err_f("invalid NULL input config\n");
128*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
129*437bfbebSnyanmisaka }
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka return kmpp_obj_put_f(obj);
132*437bfbebSnyanmisaka }
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka #define MPP_VDEC_KCFG_ACCESS(set_type, get_type, cfg_type) \
135*437bfbebSnyanmisaka MPP_RET mpp_vdec_kcfg_set_##cfg_type(MppVdecKcfg cfg, const char *name, set_type val) \
136*437bfbebSnyanmisaka { \
137*437bfbebSnyanmisaka if (!cfg || !name) { \
138*437bfbebSnyanmisaka mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
139*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR; \
140*437bfbebSnyanmisaka } \
141*437bfbebSnyanmisaka KmppObj obj = (KmppObj)cfg; \
142*437bfbebSnyanmisaka MPP_RET ret = (MPP_RET)kmpp_obj_set_##cfg_type(obj, name, val); \
143*437bfbebSnyanmisaka return ret; \
144*437bfbebSnyanmisaka } \
145*437bfbebSnyanmisaka MPP_RET mpp_vdec_kcfg_get_##cfg_type(MppVdecKcfg cfg, const char *name, get_type val) \
146*437bfbebSnyanmisaka { \
147*437bfbebSnyanmisaka if (!cfg || !name) { \
148*437bfbebSnyanmisaka mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
149*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR; \
150*437bfbebSnyanmisaka } \
151*437bfbebSnyanmisaka KmppObj obj = (KmppObj)cfg; \
152*437bfbebSnyanmisaka MPP_RET ret = (MPP_RET)kmpp_obj_get_##cfg_type(obj, name, val); \
153*437bfbebSnyanmisaka return ret; \
154*437bfbebSnyanmisaka }
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(RK_S32, RK_S32*, s32);
157*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(RK_U32, RK_U32*, u32);
158*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(RK_S64, RK_S64*, s64);
159*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(RK_U64, RK_U64*, u64);
160*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(void *, void **, ptr);
161*437bfbebSnyanmisaka MPP_VDEC_KCFG_ACCESS(void *, void *, st);
162*437bfbebSnyanmisaka
mpp_vdec_kcfg_show(MppVdecKcfg cfg)163*437bfbebSnyanmisaka void mpp_vdec_kcfg_show(MppVdecKcfg cfg)
164*437bfbebSnyanmisaka {
165*437bfbebSnyanmisaka KmppObj obj = cfg;
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka if (!cfg) {
168*437bfbebSnyanmisaka mpp_err_f("invalid NULL input config\n");
169*437bfbebSnyanmisaka return;
170*437bfbebSnyanmisaka }
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka kmpp_obj_udump(obj);
173*437bfbebSnyanmisaka }
174