xref: /rockchip-linux_mpp/kmpp/base/test/kmpp_buffer_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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_buffer_test"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include "mpp_debug.h"
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "kmpp_obj.h"
11*437bfbebSnyanmisaka #include "kmpp_buffer.h"
12*437bfbebSnyanmisaka 
main()13*437bfbebSnyanmisaka int main()
14*437bfbebSnyanmisaka {
15*437bfbebSnyanmisaka     KmppShmPtr    sptr;
16*437bfbebSnyanmisaka     KmppBufGrp    grp = NULL;
17*437bfbebSnyanmisaka     KmppBufGrpCfg grp_cfg = NULL;
18*437bfbebSnyanmisaka     KmppBuffer    buf = NULL;
19*437bfbebSnyanmisaka     KmppBufCfg    buf_cfg = NULL;
20*437bfbebSnyanmisaka     rk_s32        used = 0;
21*437bfbebSnyanmisaka     rk_s32        unused = 0;
22*437bfbebSnyanmisaka     rk_u32        size = 1920 * 1080 * 3 / 2;
23*437bfbebSnyanmisaka     rk_s32        ret = rk_ok;
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka     mpp_logi(MODULE_TAG " start\n");
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka     /* KmppBufGrp object ready */
28*437bfbebSnyanmisaka     ret = kmpp_buf_grp_get(&grp);
29*437bfbebSnyanmisaka     mpp_logi("object %s ready\n", kmpp_obj_get_name(grp));
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka     /* get KmppBufGrpCfg from KmppBufGrp to config */
32*437bfbebSnyanmisaka     grp_cfg = kmpp_buf_grp_to_cfg(grp);
33*437bfbebSnyanmisaka     mpp_logi("object %s ready\n", kmpp_obj_get_name(grp_cfg));
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka     /* write parameters to KmppBufGrpCfg */
36*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_flag(grp_cfg, 0);
37*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_count(grp_cfg, 10);
38*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_size(grp_cfg, size);
39*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_fd(grp_cfg, -1);
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     sptr.uptr = "rk dma heap";
42*437bfbebSnyanmisaka     sptr.kaddr = 0;
43*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_allocator(grp_cfg, &sptr);
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka     sptr.uptr = "test";
46*437bfbebSnyanmisaka     sptr.kaddr = 0;
47*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_set_name(grp_cfg, &sptr);
48*437bfbebSnyanmisaka     if (ret)
49*437bfbebSnyanmisaka         mpp_loge("set buf grp cfg failed\n");
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka     /* enable KmppBufGrpCfg by ioctl */
52*437bfbebSnyanmisaka     ret = kmpp_buf_grp_setup(grp);
53*437bfbebSnyanmisaka     if (ret)
54*437bfbebSnyanmisaka         mpp_loge("setup buf grp cfg failed\n");
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka     /* get KmppBuffer for buffer allocation */
57*437bfbebSnyanmisaka     ret = kmpp_buffer_get(&buf);
58*437bfbebSnyanmisaka     mpp_logi("object %s ready\n", kmpp_obj_get_name(buf));
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     /* get KmppBufCfg to setup */
61*437bfbebSnyanmisaka     buf_cfg = kmpp_buffer_to_cfg(buf);
62*437bfbebSnyanmisaka     mpp_logi("object %s ready\n", kmpp_obj_get_name(buf_cfg));
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka     /* setup buffer config parameters */
65*437bfbebSnyanmisaka     ret = kmpp_buf_cfg_set_group(buf_cfg, kmpp_obj_to_shm(grp));
66*437bfbebSnyanmisaka     if (ret)
67*437bfbebSnyanmisaka         mpp_loge("set kmpp_buf_cfg_set_group failed\n");
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka     /* set buffer size */
70*437bfbebSnyanmisaka     kmpp_buf_cfg_set_size(buf_cfg, size);
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     /* enable KmppBufCfg by ioctl */
73*437bfbebSnyanmisaka     kmpp_buffer_setup(buf);
74*437bfbebSnyanmisaka     if (ret)
75*437bfbebSnyanmisaka         mpp_loge("setup buf grp cfg failed\n");
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     /* get buffer group from buf_cfg */
78*437bfbebSnyanmisaka     ret = kmpp_buf_cfg_get_group(buf_cfg, &sptr);
79*437bfbebSnyanmisaka     if (ret)
80*437bfbebSnyanmisaka         mpp_loge("get buf cfg grp failed");
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     /* get buffer share pointer and access */
83*437bfbebSnyanmisaka     ret = kmpp_buf_cfg_get_sptr(buf_cfg, &sptr);
84*437bfbebSnyanmisaka     if (ret || !sptr.uptr)
85*437bfbebSnyanmisaka         mpp_loge("get buf cfg sptr failed");
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     ret = kmpp_buf_grp_cfg_get_used(grp_cfg, &used);
88*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_get_unused(grp_cfg, &unused);
89*437bfbebSnyanmisaka     if (ret)
90*437bfbebSnyanmisaka         mpp_loge("get buf grp cfg used failed");
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka     mpp_logi("buf grp cfg used %d unused %d after buffer_setup\n", used, unused);
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     mpp_assert(used == 1);
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     if (sptr.uptr) {
97*437bfbebSnyanmisaka         rk_u32 *val = sptr.uptr;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka         memset(sptr.uptr, 0xff, size);
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka         *val = 0x12345678;
102*437bfbebSnyanmisaka         if (*val != 0x12345678)
103*437bfbebSnyanmisaka             mpp_loge("buf cfg sptr access failed");
104*437bfbebSnyanmisaka         else
105*437bfbebSnyanmisaka             mpp_logi("buf sptr [u:k] %p:%llx access success", sptr.uptr, sptr.kaddr);
106*437bfbebSnyanmisaka     }
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     if (buf) {
109*437bfbebSnyanmisaka         kmpp_buffer_put(buf);
110*437bfbebSnyanmisaka         buf = NULL;
111*437bfbebSnyanmisaka     }
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     ret = kmpp_buf_grp_cfg_get_used(grp_cfg, &used);
114*437bfbebSnyanmisaka     ret |= kmpp_buf_grp_cfg_get_unused(grp_cfg, &unused);
115*437bfbebSnyanmisaka     if (ret)
116*437bfbebSnyanmisaka         mpp_loge("get buf grp cfg used failed");
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     mpp_logi("buf grp cfg used %d unused %d after buffer_put\n", used, unused);
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     if (grp) {
121*437bfbebSnyanmisaka         kmpp_buf_grp_put(grp);
122*437bfbebSnyanmisaka         grp = NULL;
123*437bfbebSnyanmisaka     }
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     mpp_logi(MODULE_TAG " %s\n", ret ? "failed" : "success");
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     return ret;
128*437bfbebSnyanmisaka }
129