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 "kmpp_obj_test"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include "mpp_log.h"
9*437bfbebSnyanmisaka #include "mpp_common.h"
10*437bfbebSnyanmisaka
11*437bfbebSnyanmisaka #include "kmpp_obj.h"
12*437bfbebSnyanmisaka #include "kmpp_buffer.h"
13*437bfbebSnyanmisaka
14*437bfbebSnyanmisaka #define TEST_DETAIL 1
15*437bfbebSnyanmisaka #define TEST_DEF_DUMP 2
16*437bfbebSnyanmisaka #define TEST_OBJ_UDUMP 4
17*437bfbebSnyanmisaka #define TEST_OBJ_KDUMP 8
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #define test_detail(fmt, ...) \
20*437bfbebSnyanmisaka do { \
21*437bfbebSnyanmisaka if (flag & TEST_DETAIL) \
22*437bfbebSnyanmisaka mpp_log(fmt, ##__VA_ARGS__); \
23*437bfbebSnyanmisaka } while (0)
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka typedef struct KmppObjTest_t {
26*437bfbebSnyanmisaka const char *name;
27*437bfbebSnyanmisaka rk_u32 flag;
28*437bfbebSnyanmisaka rk_s32 (*func)(const char *name, rk_u32 flag);
29*437bfbebSnyanmisaka } KmppObjTest;
30*437bfbebSnyanmisaka
kmpp_obj_std_test(const char * name,rk_u32 flag)31*437bfbebSnyanmisaka static rk_s32 kmpp_obj_std_test(const char *name, rk_u32 flag)
32*437bfbebSnyanmisaka {
33*437bfbebSnyanmisaka KmppObjDef def = NULL;
34*437bfbebSnyanmisaka KmppObj obj = NULL;
35*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka ret = kmpp_objdef_find(&def, name);
38*437bfbebSnyanmisaka if (ret) {
39*437bfbebSnyanmisaka mpp_log("kmpp_objdef_find %s failed\n", name);
40*437bfbebSnyanmisaka goto done;
41*437bfbebSnyanmisaka }
42*437bfbebSnyanmisaka
43*437bfbebSnyanmisaka if (flag & TEST_DEF_DUMP)
44*437bfbebSnyanmisaka kmpp_objdef_dump(def);
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka ret = kmpp_obj_get_f(&obj, def);
47*437bfbebSnyanmisaka if (ret) {
48*437bfbebSnyanmisaka mpp_log("kmpp_obj_get %s failed ret %d\n", name, ret);
49*437bfbebSnyanmisaka goto done;
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka
52*437bfbebSnyanmisaka if (flag & TEST_OBJ_UDUMP)
53*437bfbebSnyanmisaka kmpp_obj_udump(obj);
54*437bfbebSnyanmisaka if (flag & TEST_OBJ_KDUMP)
55*437bfbebSnyanmisaka kmpp_obj_kdump(obj);
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka ret = kmpp_obj_put_f(obj);
58*437bfbebSnyanmisaka if (ret) {
59*437bfbebSnyanmisaka mpp_log("kmpp_obj_put %s failed\n", name);
60*437bfbebSnyanmisaka }
61*437bfbebSnyanmisaka obj = NULL;
62*437bfbebSnyanmisaka def = NULL;
63*437bfbebSnyanmisaka
64*437bfbebSnyanmisaka done:
65*437bfbebSnyanmisaka if (obj)
66*437bfbebSnyanmisaka kmpp_obj_put_f(obj);
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka return ret;
69*437bfbebSnyanmisaka }
70*437bfbebSnyanmisaka
kmpp_obj_by_name_test(const char * name,rk_u32 flag)71*437bfbebSnyanmisaka static rk_s32 kmpp_obj_by_name_test(const char *name, rk_u32 flag)
72*437bfbebSnyanmisaka {
73*437bfbebSnyanmisaka KmppObj obj = NULL;
74*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
75*437bfbebSnyanmisaka
76*437bfbebSnyanmisaka ret = kmpp_obj_get_by_name_f(&obj, name);
77*437bfbebSnyanmisaka if (ret) {
78*437bfbebSnyanmisaka mpp_log("kmpp_obj_get_by_name %s failed ret %d\n", name, ret);
79*437bfbebSnyanmisaka goto done;
80*437bfbebSnyanmisaka }
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka if (flag & TEST_OBJ_UDUMP)
83*437bfbebSnyanmisaka kmpp_obj_udump(obj);
84*437bfbebSnyanmisaka if (flag & TEST_OBJ_KDUMP)
85*437bfbebSnyanmisaka kmpp_obj_kdump(obj);
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka ret = kmpp_obj_put_f(obj);
88*437bfbebSnyanmisaka if (ret) {
89*437bfbebSnyanmisaka mpp_log("kmpp_obj_put %s failed\n", name);
90*437bfbebSnyanmisaka goto done;
91*437bfbebSnyanmisaka }
92*437bfbebSnyanmisaka obj = NULL;
93*437bfbebSnyanmisaka
94*437bfbebSnyanmisaka done:
95*437bfbebSnyanmisaka if (obj)
96*437bfbebSnyanmisaka kmpp_obj_put_f(obj);
97*437bfbebSnyanmisaka
98*437bfbebSnyanmisaka return ret;
99*437bfbebSnyanmisaka }
100*437bfbebSnyanmisaka
kmpp_buffer_test(const char * name,rk_u32 flag)101*437bfbebSnyanmisaka static rk_s32 kmpp_buffer_test(const char *name, rk_u32 flag)
102*437bfbebSnyanmisaka {
103*437bfbebSnyanmisaka KmppShmPtr sptr;
104*437bfbebSnyanmisaka KmppObj grp = NULL;
105*437bfbebSnyanmisaka KmppObj grp_cfg = NULL;
106*437bfbebSnyanmisaka KmppObj buf = NULL;
107*437bfbebSnyanmisaka KmppObj buf_cfg = NULL;
108*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
109*437bfbebSnyanmisaka rk_u32 val = 0;
110*437bfbebSnyanmisaka
111*437bfbebSnyanmisaka ret = kmpp_obj_get_by_name_f(&grp, "KmppBufGrp");
112*437bfbebSnyanmisaka if (ret) {
113*437bfbebSnyanmisaka mpp_log("buf grp get obj failed ret %d\n", ret);
114*437bfbebSnyanmisaka goto done;
115*437bfbebSnyanmisaka }
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka /* KmppBufGrp object ready */
118*437bfbebSnyanmisaka test_detail("object %s ready\n", kmpp_obj_get_name(grp));
119*437bfbebSnyanmisaka
120*437bfbebSnyanmisaka /* get KmppBufGrpCfg from KmppBufGrp to config */
121*437bfbebSnyanmisaka grp_cfg = kmpp_buf_grp_to_cfg(grp);
122*437bfbebSnyanmisaka if (!grp_cfg) {
123*437bfbebSnyanmisaka mpp_log("buf grp to cfg failed ret %d\n", ret);
124*437bfbebSnyanmisaka ret = MPP_NOK;
125*437bfbebSnyanmisaka goto done;
126*437bfbebSnyanmisaka }
127*437bfbebSnyanmisaka
128*437bfbebSnyanmisaka /* KmppBufGrpCfg object ready */
129*437bfbebSnyanmisaka test_detail("object %s ready\n", kmpp_obj_get_name(grp_cfg));
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka if (flag & TEST_OBJ_UDUMP)
132*437bfbebSnyanmisaka kmpp_obj_udump(buf_cfg);
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka /* write parameters to KmppBufGrpCfg */
135*437bfbebSnyanmisaka ret = kmpp_obj_set_u32(grp_cfg, "flag", 0);
136*437bfbebSnyanmisaka if (ret) {
137*437bfbebSnyanmisaka mpp_log("grp cfg set flag failed ret %d\n", ret);
138*437bfbebSnyanmisaka goto done;
139*437bfbebSnyanmisaka }
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka ret = kmpp_obj_set_u32(grp_cfg, "count", 10);
142*437bfbebSnyanmisaka if (ret) {
143*437bfbebSnyanmisaka mpp_log("grp cfg set count failed ret %d\n", ret);
144*437bfbebSnyanmisaka goto done;
145*437bfbebSnyanmisaka }
146*437bfbebSnyanmisaka
147*437bfbebSnyanmisaka ret = kmpp_obj_set_u32(grp_cfg, "size", 4096);
148*437bfbebSnyanmisaka if (ret) {
149*437bfbebSnyanmisaka mpp_log("grp cfg set size failed ret %d\n", ret);
150*437bfbebSnyanmisaka goto done;
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka ret = kmpp_obj_set_s32(grp_cfg, "fd", -1);
154*437bfbebSnyanmisaka if (ret) {
155*437bfbebSnyanmisaka mpp_log("grp cfg set fd failed ret %d\n", ret);
156*437bfbebSnyanmisaka goto done;
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka /* set buffer group name to test */
160*437bfbebSnyanmisaka name = "allocator";
161*437bfbebSnyanmisaka sptr.kaddr = 0;
162*437bfbebSnyanmisaka sptr.uptr = "rk dma heap";
163*437bfbebSnyanmisaka
164*437bfbebSnyanmisaka ret = kmpp_obj_set_shm(grp_cfg, name, &sptr);
165*437bfbebSnyanmisaka if (ret) {
166*437bfbebSnyanmisaka mpp_log("grp cfg set %s failed ret %d\n", name, ret);
167*437bfbebSnyanmisaka goto done;
168*437bfbebSnyanmisaka }
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka /* set buffer group name to test */
171*437bfbebSnyanmisaka name = "name";
172*437bfbebSnyanmisaka sptr.kaddr = 0;
173*437bfbebSnyanmisaka sptr.uptr = "test";
174*437bfbebSnyanmisaka
175*437bfbebSnyanmisaka ret = kmpp_obj_set_shm(grp_cfg, name, &sptr);
176*437bfbebSnyanmisaka if (ret) {
177*437bfbebSnyanmisaka mpp_log("grp cfg set %s failed ret %d\n", name, ret);
178*437bfbebSnyanmisaka goto done;
179*437bfbebSnyanmisaka }
180*437bfbebSnyanmisaka
181*437bfbebSnyanmisaka test_detail("object %s write parameters ready\n", kmpp_obj_get_name(grp_cfg));
182*437bfbebSnyanmisaka
183*437bfbebSnyanmisaka /* enable KmppBufGrpCfg by ioctl */
184*437bfbebSnyanmisaka ret = kmpp_buf_grp_setup(grp);
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka test_detail("object %s ioctl ret %d\n", kmpp_obj_get_name(grp), ret);
187*437bfbebSnyanmisaka
188*437bfbebSnyanmisaka /* get KmppBuffer for buffer allocation */
189*437bfbebSnyanmisaka ret = kmpp_obj_get_by_name_f(&buf, "KmppBuffer");
190*437bfbebSnyanmisaka if (ret) {
191*437bfbebSnyanmisaka mpp_log("kmpp_obj_get_by_name failed ret %d\n", ret);
192*437bfbebSnyanmisaka goto done;
193*437bfbebSnyanmisaka }
194*437bfbebSnyanmisaka
195*437bfbebSnyanmisaka test_detail("object %s ready\n", kmpp_obj_get_name(buf));
196*437bfbebSnyanmisaka
197*437bfbebSnyanmisaka /* get KmppBufGrpCfg to setup */
198*437bfbebSnyanmisaka buf_cfg = kmpp_buffer_to_cfg(buf);
199*437bfbebSnyanmisaka if (!buf_cfg) {
200*437bfbebSnyanmisaka mpp_log("buf to cfg failed ret %d\n", ret);
201*437bfbebSnyanmisaka ret = MPP_NOK;
202*437bfbebSnyanmisaka goto done;
203*437bfbebSnyanmisaka }
204*437bfbebSnyanmisaka
205*437bfbebSnyanmisaka if (flag & TEST_OBJ_UDUMP)
206*437bfbebSnyanmisaka kmpp_obj_udump(buf_cfg);
207*437bfbebSnyanmisaka
208*437bfbebSnyanmisaka test_detail("object %s ready\n", kmpp_obj_get_name(buf_cfg));
209*437bfbebSnyanmisaka
210*437bfbebSnyanmisaka /* setup buffer config parameters */
211*437bfbebSnyanmisaka /* set buffer group */
212*437bfbebSnyanmisaka ret = kmpp_obj_set_shm_obj(buf_cfg, "group", grp);
213*437bfbebSnyanmisaka if (ret) {
214*437bfbebSnyanmisaka mpp_log("buf cfg set group failed ret %d\n", ret);
215*437bfbebSnyanmisaka goto done;
216*437bfbebSnyanmisaka }
217*437bfbebSnyanmisaka
218*437bfbebSnyanmisaka /* enable KmppBufferCfg by ioctl */
219*437bfbebSnyanmisaka ret = kmpp_buffer_setup(buf);
220*437bfbebSnyanmisaka
221*437bfbebSnyanmisaka test_detail("object %s ioctl ret %d\n", kmpp_obj_get_name(buf), ret);
222*437bfbebSnyanmisaka
223*437bfbebSnyanmisaka kmpp_obj_get_u32(buf_cfg, "size", &val);
224*437bfbebSnyanmisaka
225*437bfbebSnyanmisaka test_detail("object %s size %d\n", kmpp_obj_get_name(buf_cfg), val);
226*437bfbebSnyanmisaka
227*437bfbebSnyanmisaka done:
228*437bfbebSnyanmisaka if (grp)
229*437bfbebSnyanmisaka kmpp_obj_put_f(grp);
230*437bfbebSnyanmisaka
231*437bfbebSnyanmisaka if (buf)
232*437bfbebSnyanmisaka kmpp_obj_put_f(buf);
233*437bfbebSnyanmisaka
234*437bfbebSnyanmisaka return ret;
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka
kmpp_shm_test(const char * name,rk_u32 flag)237*437bfbebSnyanmisaka static rk_s32 kmpp_shm_test(const char *name, rk_u32 flag)
238*437bfbebSnyanmisaka {
239*437bfbebSnyanmisaka rk_u32 sizes[] = {512, SZ_4K, SZ_16K, SZ_128K, SZ_256K, SZ_1M, SZ_4M, SZ_16M};
240*437bfbebSnyanmisaka rk_u32 count = sizeof(sizes) / sizeof(sizes[0]);
241*437bfbebSnyanmisaka KmppShm shm[count];
242*437bfbebSnyanmisaka void *ptr;
243*437bfbebSnyanmisaka rk_s32 ret = rk_ok;
244*437bfbebSnyanmisaka rk_s32 i;
245*437bfbebSnyanmisaka (void)name;
246*437bfbebSnyanmisaka (void)flag;
247*437bfbebSnyanmisaka
248*437bfbebSnyanmisaka memset(shm, 0, sizeof(shm));
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(sizes); i++) {
251*437bfbebSnyanmisaka kmpp_shm_get_f(&shm[i], sizes[i]);
252*437bfbebSnyanmisaka if (!shm[i]) {
253*437bfbebSnyanmisaka mpp_log_f("shm get size %d failed\n", sizes[i]);
254*437bfbebSnyanmisaka ret = rk_nok;
255*437bfbebSnyanmisaka break;
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka
258*437bfbebSnyanmisaka test_detail("shm get size %d addr %p\n", sizes[i], kmpp_shm_to_entry_f(shm[i]));
259*437bfbebSnyanmisaka }
260*437bfbebSnyanmisaka
261*437bfbebSnyanmisaka for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(sizes); i++) {
262*437bfbebSnyanmisaka if (!shm[i])
263*437bfbebSnyanmisaka continue;
264*437bfbebSnyanmisaka
265*437bfbebSnyanmisaka if (kmpp_shm_put_f(shm[i])) {
266*437bfbebSnyanmisaka mpp_log_f("shm put size %d failed\n", sizes[i]);
267*437bfbebSnyanmisaka ret = rk_nok;
268*437bfbebSnyanmisaka break;
269*437bfbebSnyanmisaka }
270*437bfbebSnyanmisaka shm[i] = NULL;
271*437bfbebSnyanmisaka }
272*437bfbebSnyanmisaka
273*437bfbebSnyanmisaka if (ret)
274*437bfbebSnyanmisaka return ret;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka for (i = (RK_S32)MPP_ARRAY_ELEMS(sizes) - 1; i >= 0; i--) {
277*437bfbebSnyanmisaka kmpp_shm_get_f(&shm[i], sizes[i]);
278*437bfbebSnyanmisaka if (!shm[i]) {
279*437bfbebSnyanmisaka mpp_log_f("shm get size %d failed\n", sizes[i]);
280*437bfbebSnyanmisaka ret = rk_nok;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka
283*437bfbebSnyanmisaka if (ret)
284*437bfbebSnyanmisaka break;
285*437bfbebSnyanmisaka
286*437bfbebSnyanmisaka ptr = kmpp_shm_to_entry_f(shm[i]);
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka test_detail("shm get size %d addr %p\n", sizes[i], ptr);
289*437bfbebSnyanmisaka
290*437bfbebSnyanmisaka if (ptr)
291*437bfbebSnyanmisaka memset(ptr, 0, sizes[i]);
292*437bfbebSnyanmisaka
293*437bfbebSnyanmisaka if (kmpp_shm_put_f(shm[i])) {
294*437bfbebSnyanmisaka mpp_log_f("shm put size %d failed\n", sizes[i]);
295*437bfbebSnyanmisaka ret = rk_nok;
296*437bfbebSnyanmisaka }
297*437bfbebSnyanmisaka }
298*437bfbebSnyanmisaka
299*437bfbebSnyanmisaka return ret;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka
302*437bfbebSnyanmisaka static KmppObjTest obj_tests[] = {
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka "KmppFrame",
305*437bfbebSnyanmisaka 0,
306*437bfbebSnyanmisaka kmpp_obj_std_test,
307*437bfbebSnyanmisaka },
308*437bfbebSnyanmisaka {
309*437bfbebSnyanmisaka "KmppVencInitCfg",
310*437bfbebSnyanmisaka 0,
311*437bfbebSnyanmisaka kmpp_obj_by_name_test,
312*437bfbebSnyanmisaka },
313*437bfbebSnyanmisaka {
314*437bfbebSnyanmisaka "KmppBuffer",
315*437bfbebSnyanmisaka 0,
316*437bfbebSnyanmisaka kmpp_buffer_test,
317*437bfbebSnyanmisaka },
318*437bfbebSnyanmisaka {
319*437bfbebSnyanmisaka "kmpp_shm_test",
320*437bfbebSnyanmisaka 0,
321*437bfbebSnyanmisaka kmpp_shm_test,
322*437bfbebSnyanmisaka },
323*437bfbebSnyanmisaka };
324*437bfbebSnyanmisaka
main()325*437bfbebSnyanmisaka int main()
326*437bfbebSnyanmisaka {
327*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
328*437bfbebSnyanmisaka rk_u32 i;
329*437bfbebSnyanmisaka
330*437bfbebSnyanmisaka mpp_log("start\n");
331*437bfbebSnyanmisaka
332*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(obj_tests); i++) {
333*437bfbebSnyanmisaka const char *name = obj_tests[i].name;
334*437bfbebSnyanmisaka rk_u32 flag = obj_tests[i].flag;
335*437bfbebSnyanmisaka
336*437bfbebSnyanmisaka ret = obj_tests[i].func(name, flag);
337*437bfbebSnyanmisaka if (ret) {
338*437bfbebSnyanmisaka mpp_log("test %-16s failed ret %d\n", name, ret);
339*437bfbebSnyanmisaka goto done;
340*437bfbebSnyanmisaka }
341*437bfbebSnyanmisaka mpp_log("test %-16s success\n", name);
342*437bfbebSnyanmisaka }
343*437bfbebSnyanmisaka
344*437bfbebSnyanmisaka done:
345*437bfbebSnyanmisaka mpp_log("done %s \n", ret ? "failed" : "success");
346*437bfbebSnyanmisaka
347*437bfbebSnyanmisaka return ret;
348*437bfbebSnyanmisaka }
349