1*4882a593Smuzhiyun /* Copyright 2020 Rockchip Electronics Co. LTD
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
4*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
5*4882a593Smuzhiyun * You may obtain a copy of the License at
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
10*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
11*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4882a593Smuzhiyun * See the License for the specific language governing permissions and
13*4882a593Smuzhiyun * limitations under the License.
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include <stdint.h>
17*4882a593Smuzhiyun #include <inttypes.h>
18*4882a593Smuzhiyun #include <stdio.h>
19*4882a593Smuzhiyun #include <unistd.h>
20*4882a593Smuzhiyun #include <cstring>
21*4882a593Smuzhiyun #include <vector>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #include "rk_debug.h"
24*4882a593Smuzhiyun #include "rk_comm_mb.h"
25*4882a593Smuzhiyun #include "rk_mpi_mmz.h"
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #include "test_comm_argparse.h"
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define MB_POOL_COUNT 10
30*4882a593Smuzhiyun #define MB_POOL_MB_COUNT 10
31*4882a593Smuzhiyun #define MB_POOL_MB_SIZE 1280 * 720 * 2
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun typedef struct _rkTestMMZCtx {
34*4882a593Smuzhiyun RK_S32 s32MmzCount;
35*4882a593Smuzhiyun RK_S32 s32MmzSize;
36*4882a593Smuzhiyun RK_S32 s32PoolCount;
37*4882a593Smuzhiyun RK_S32 s32LoopCount;
38*4882a593Smuzhiyun RK_BOOL bExternal;
39*4882a593Smuzhiyun RK_BOOL bPreAlloc;
40*4882a593Smuzhiyun RK_S32 s32RemapMode;
41*4882a593Smuzhiyun RK_S32 s32AllocType;
42*4882a593Smuzhiyun } TEST_MMZ_CTX_S;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #define vaddr_to_fd_offset(vaddr, fd, offset) do {\
45*4882a593Smuzhiyun MB_BLK __blk = RK_MPI_MMZ_VirAddr2Handle(vaddr); \
46*4882a593Smuzhiyun if (__blk != (MB_BLK)RK_NULL) { \
47*4882a593Smuzhiyun RK_VOID* __vaddr = RK_MPI_MMZ_Handle2VirAddr(__blk); \
48*4882a593Smuzhiyun offset = vaddr - reinterpret_cast<RK_U8 *>(__vaddr); \
49*4882a593Smuzhiyun fd = RK_MPI_MMZ_Handle2Fd(__blk); \
50*4882a593Smuzhiyun } else { \
51*4882a593Smuzhiyun offset = -1; \
52*4882a593Smuzhiyun fd = -1; \
53*4882a593Smuzhiyun } \
54*4882a593Smuzhiyun } while (0);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define paddr_to_fd_offset(paddr, fd, offset) do {\
57*4882a593Smuzhiyun MB_BLK __blk = RK_MPI_MMZ_PhyAddr2Handle(paddr); \
58*4882a593Smuzhiyun if (__blk != (MB_BLK)RK_NULL) { \
59*4882a593Smuzhiyun RK_U64 __paddr = RK_MPI_MMZ_Handle2PhysAddr(__blk); \
60*4882a593Smuzhiyun offset = (RK_U8)paddr - (RK_U8)__paddr; \
61*4882a593Smuzhiyun fd = RK_MPI_MMZ_Handle2Fd(__blk); \
62*4882a593Smuzhiyun } else { \
63*4882a593Smuzhiyun offset = -1; \
64*4882a593Smuzhiyun fd = -1; \
65*4882a593Smuzhiyun } \
66*4882a593Smuzhiyun } while (0);
67*4882a593Smuzhiyun
unit_test_mpi_mmz(const TEST_MMZ_CTX_S * pCtx)68*4882a593Smuzhiyun RK_S32 unit_test_mpi_mmz(const TEST_MMZ_CTX_S *pCtx) {
69*4882a593Smuzhiyun MB_BLK mb;
70*4882a593Smuzhiyun RK_S32 len = 1048576;
71*4882a593Smuzhiyun RK_S32 ret = RK_SUCCESS;
72*4882a593Smuzhiyun RK_S32 flags = RK_MMZ_ALLOC_CACHEABLE | RK_MMZ_ALLOC_TYPE_CMA;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun ret = RK_MPI_MMZ_Alloc(&mb, len, flags);
75*4882a593Smuzhiyun if (ret < 0) {
76*4882a593Smuzhiyun RK_LOGI("alloc mmz fail");
77*4882a593Smuzhiyun return ret;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun RK_U8 *vaddr = reinterpret_cast<RK_U8 *>(RK_MPI_MMZ_Handle2VirAddr(mb));
81*4882a593Smuzhiyun RK_U64 paddr = RK_MPI_MMZ_Handle2PhysAddr(mb);
82*4882a593Smuzhiyun RK_S32 fd = RK_MPI_MMZ_Handle2Fd(mb);
83*4882a593Smuzhiyun len = RK_MPI_MMZ_GetSize(mb);
84*4882a593Smuzhiyun RK_S32 is_cacheable = RK_MPI_MMZ_IsCacheable(mb);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun RK_LOGI("alloc buffer: fd=%d, len=%d, paddr=0x%x, vaddr=%p, cacheable=%d", fd, len, paddr, vaddr, is_cacheable);
87*4882a593Smuzhiyun MB_BLK mb_by_fd = RK_MPI_MMZ_Fd2Handle(fd);
88*4882a593Smuzhiyun MB_BLK mb_by_vaddr = RK_MPI_MMZ_VirAddr2Handle(reinterpret_cast<RK_VOID *>(vaddr));
89*4882a593Smuzhiyun RK_LOGI("MB: %p %p %p", mb, mb_by_fd, mb_by_vaddr);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun RK_U8 *vaddr_temp = vaddr + 1;
92*4882a593Smuzhiyun RK_LOGI("vaddr+1: %p, mb: %p", vaddr_temp, RK_MPI_MMZ_VirAddr2Handle(reinterpret_cast<RK_VOID *>(vaddr_temp)));
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun vaddr_temp = vaddr-1;
95*4882a593Smuzhiyun RK_LOGI("vaddr-1: %p, mb: %p", vaddr_temp, RK_MPI_MMZ_VirAddr2Handle(reinterpret_cast<RK_VOID *>(vaddr_temp)));
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun vaddr_temp = vaddr+len;
98*4882a593Smuzhiyun RK_LOGI("vaddr+len: %p, mb: %p", vaddr_temp, RK_MPI_MMZ_VirAddr2Handle(reinterpret_cast<RK_VOID *>(vaddr_temp)));
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun vaddr_temp = vaddr+len-1;
101*4882a593Smuzhiyun RK_LOGI("vaddr+len-1: %p, mb: %p", vaddr_temp, RK_MPI_MMZ_VirAddr2Handle(reinterpret_cast<RK_VOID *>(vaddr_temp)));
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun RK_U64 paddr_temp = paddr+1;
104*4882a593Smuzhiyun RK_LOGI("paddr+1: 0x%x, mb: %p", paddr_temp, RK_MPI_MMZ_PhyAddr2Handle(paddr_temp));
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun paddr_temp = paddr-1;
107*4882a593Smuzhiyun RK_LOGI("paddr-1: 0x%x, mb: %p", paddr_temp, RK_MPI_MMZ_PhyAddr2Handle(paddr_temp));
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun paddr_temp = paddr+len;
110*4882a593Smuzhiyun RK_LOGI("paddr+len: 0x%x, mb: %p", paddr_temp, RK_MPI_MMZ_PhyAddr2Handle(paddr_temp));
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun paddr_temp = paddr+len-1;
113*4882a593Smuzhiyun RK_LOGI("paddr+len-1: 0x%x, mb: %p", paddr_temp, RK_MPI_MMZ_PhyAddr2Handle(paddr_temp));
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun RK_U32 offset;
116*4882a593Smuzhiyun vaddr_temp = vaddr+len-10;
117*4882a593Smuzhiyun vaddr_to_fd_offset(vaddr_temp, fd, offset);
118*4882a593Smuzhiyun RK_LOGI("vaddr+len-10: %p, fd: %d, offset: %d", vaddr_temp, fd, offset);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun paddr_temp = paddr+len-10;
121*4882a593Smuzhiyun paddr_to_fd_offset(paddr_temp, fd, offset);
122*4882a593Smuzhiyun RK_LOGI("paddr+len-10: 0x%x, fd: %d, offset: %d", paddr_temp, fd, offset);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheStart(mb, 0, 0, RK_MMZ_SYNC_WRITEONLY);
125*4882a593Smuzhiyun memset(vaddr, 0x5A, len);
126*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheEnd(mb, 0, 0, RK_MMZ_SYNC_WRITEONLY);
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheStart(mb, 4096, 4096, RK_MMZ_SYNC_RW);
129*4882a593Smuzhiyun memset(vaddr, 0x5A, len);
130*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheEnd(mb, 4096, 4096, RK_MMZ_SYNC_RW);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun vaddr_temp = vaddr+len-10;
133*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheVaddrStart(reinterpret_cast<RK_VOID *>(vaddr_temp), 4096, RK_MMZ_SYNC_WRITEONLY);
134*4882a593Smuzhiyun memset(vaddr_temp, 0x5A, 10);
135*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCacheVaddrEnd(reinterpret_cast<RK_VOID *>(vaddr_temp), 4096, RK_MMZ_SYNC_WRITEONLY);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun paddr_temp = paddr_temp+len-10;
138*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCachePaddrStart(paddr_temp, 4096, RK_MMZ_SYNC_WRITEONLY);
139*4882a593Smuzhiyun vaddr_temp = vaddr+len-10;
140*4882a593Smuzhiyun memset(vaddr_temp, 0x5A, 10);
141*4882a593Smuzhiyun ret = RK_MPI_MMZ_FlushCachePaddrEnd(paddr_temp, 4096, RK_MMZ_SYNC_WRITEONLY);
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun usleep(100000);
144*4882a593Smuzhiyun RK_MPI_MMZ_Free(mb);
145*4882a593Smuzhiyun return RK_SUCCESS;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun static const char *const usages[] = {
150*4882a593Smuzhiyun "./rk_mpi_mmz_test [-c MB_COUNT] [-s MB_SIZE]...",
151*4882a593Smuzhiyun NULL,
152*4882a593Smuzhiyun };
153*4882a593Smuzhiyun
main(RK_S32 argc,const char ** argv)154*4882a593Smuzhiyun RK_S32 main(RK_S32 argc, const char **argv) {
155*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
156*4882a593Smuzhiyun TEST_MMZ_CTX_S stMmzCtx;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun memset(&stMmzCtx, 0, sizeof(TEST_MMZ_CTX_S));
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun struct argparse_option options[] = {
161*4882a593Smuzhiyun OPT_HELP(),
162*4882a593Smuzhiyun OPT_GROUP("basic options:"),
163*4882a593Smuzhiyun OPT_END(),
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun struct argparse argparse;
167*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
168*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
169*4882a593Smuzhiyun "\nuse --help for details.");
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun s32Ret = unit_test_mpi_mmz(&stMmzCtx);
174*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
175*4882a593Smuzhiyun goto __FAILED;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun RK_LOGI("test running ok.");
179*4882a593Smuzhiyun return RK_SUCCESS;
180*4882a593Smuzhiyun __FAILED:
181*4882a593Smuzhiyun RK_LOGE("test running failed!");
182*4882a593Smuzhiyun return RK_ERR_MB_BUSY;
183*4882a593Smuzhiyun }
184