xref: /rockchip-linux_mpp/kmpp/base/test/kmpp_obj_test.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 "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