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