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