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