xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientMem.c (revision abdd24375050db7ce121b48477cc332d6c8c40f6)
1*abdd2437Shisping /*
2*abdd2437Shisping  * Copyright 2017, Rockchip Electronics Co., Ltd
3*abdd2437Shisping  * hisping lin, <hisping.lin@rock-chips.com>
4*abdd2437Shisping  *
5*abdd2437Shisping  * SPDX-License-Identifier:	GPL-2.0+
6*abdd2437Shisping  */
7*abdd2437Shisping #include <common.h>
8*abdd2437Shisping #include <stdlib.h>
9*abdd2437Shisping #include <optee_include/OpteeClientMem.h>
10*abdd2437Shisping 
11*abdd2437Shisping void *my_mem_start;
12*abdd2437Shisping uint32_t my_count;
13*abdd2437Shisping uint8_t *my_flag;
14*abdd2437Shisping typedef struct {
15*abdd2437Shisping 	void *addrBlock;
16*abdd2437Shisping 	uint32_t sizeBlock;
17*abdd2437Shisping 	uint8_t used;
18*abdd2437Shisping } ALLOC_FLAG;
19*abdd2437Shisping ALLOC_FLAG alloc_flags[50];
20*abdd2437Shisping 
21*abdd2437Shisping void my_malloc_init(void *start, uint32_t size)
22*abdd2437Shisping {
23*abdd2437Shisping 	memset(start, 0, size);
24*abdd2437Shisping 	my_mem_start = start;
25*abdd2437Shisping 	my_count = size/4096;
26*abdd2437Shisping 	my_flag = malloc(size/4096);
27*abdd2437Shisping 	memset(my_flag, 0, size/4096);
28*abdd2437Shisping 	memset(alloc_flags, 0, 50 * sizeof(ALLOC_FLAG));
29*abdd2437Shisping }
30*abdd2437Shisping 
31*abdd2437Shisping void write_usedblock(void *addr, uint32_t size)
32*abdd2437Shisping {
33*abdd2437Shisping 	uint8_t k;
34*abdd2437Shisping 	for (k = 0; k < 50; k++) {
35*abdd2437Shisping 		if (alloc_flags[k].used == 0) {
36*abdd2437Shisping 			alloc_flags[k].used = 1;
37*abdd2437Shisping 			alloc_flags[k].addrBlock = addr;
38*abdd2437Shisping 			alloc_flags[k].sizeBlock = size;
39*abdd2437Shisping 			break;
40*abdd2437Shisping 		}
41*abdd2437Shisping 	}
42*abdd2437Shisping }
43*abdd2437Shisping 
44*abdd2437Shisping uint32_t find_sizeblock(void *addr)
45*abdd2437Shisping {
46*abdd2437Shisping 	uint8_t k;
47*abdd2437Shisping 	for (k = 0; k < 50; k++)
48*abdd2437Shisping 		if (alloc_flags[k].used == 1 &&
49*abdd2437Shisping 				alloc_flags[k].addrBlock == addr)
50*abdd2437Shisping 			return alloc_flags[k].sizeBlock;
51*abdd2437Shisping 
52*abdd2437Shisping 	return 0;
53*abdd2437Shisping }
54*abdd2437Shisping 
55*abdd2437Shisping void free_usedblock(void *addr)
56*abdd2437Shisping {
57*abdd2437Shisping 	uint8_t k;
58*abdd2437Shisping 	for (k = 0; k < 50; k++) {
59*abdd2437Shisping 		if (alloc_flags[k].used == 1 &&
60*abdd2437Shisping 				alloc_flags[k].addrBlock == addr) {
61*abdd2437Shisping 			alloc_flags[k].used = 0;
62*abdd2437Shisping 			alloc_flags[k].addrBlock = 0;
63*abdd2437Shisping 			alloc_flags[k].sizeBlock = 0;
64*abdd2437Shisping 			break;
65*abdd2437Shisping 		}
66*abdd2437Shisping 	}
67*abdd2437Shisping }
68*abdd2437Shisping 
69*abdd2437Shisping void *my_malloc(uint32_t size)
70*abdd2437Shisping {
71*abdd2437Shisping 	uint32_t i, j, k, num;
72*abdd2437Shisping 
73*abdd2437Shisping 	num = (size - 1) / 4096 + 1;
74*abdd2437Shisping 
75*abdd2437Shisping 	for (i = 0; i < my_count - num; i++) {
76*abdd2437Shisping 		if (*(my_flag + i) == 0) {
77*abdd2437Shisping 			for (j = 0; j < num; j++) {
78*abdd2437Shisping 				if (*(my_flag + i + j) != 0)
79*abdd2437Shisping 					break;
80*abdd2437Shisping 			}
81*abdd2437Shisping 			if (j == num) {
82*abdd2437Shisping 				for (k = 0; k < num; k++) {
83*abdd2437Shisping 					*(my_flag + i + k) = 1;
84*abdd2437Shisping 					memset(my_mem_start +
85*abdd2437Shisping 						(i + k) * 4096, 0, 4096);
86*abdd2437Shisping 				}
87*abdd2437Shisping 				debug(" malloc is: 0x%X  0x%X\n",
88*abdd2437Shisping 					(int)i, (int)num);
89*abdd2437Shisping 				write_usedblock((my_mem_start + i * 4096),
90*abdd2437Shisping 					num * 4096);
91*abdd2437Shisping 
92*abdd2437Shisping 				return my_mem_start + (i * 4096);
93*abdd2437Shisping 			}
94*abdd2437Shisping 		}
95*abdd2437Shisping 	}
96*abdd2437Shisping 
97*abdd2437Shisping 	return 0;
98*abdd2437Shisping }
99*abdd2437Shisping 
100*abdd2437Shisping void my_free(void *ptr)
101*abdd2437Shisping {
102*abdd2437Shisping 	uint32_t i, j, num, size;
103*abdd2437Shisping 
104*abdd2437Shisping 	if (ptr < my_mem_start)
105*abdd2437Shisping 		return;
106*abdd2437Shisping 
107*abdd2437Shisping 	i = (ptr - my_mem_start) / 4096;
108*abdd2437Shisping 	size = find_sizeblock(ptr);
109*abdd2437Shisping 	free_usedblock(ptr);
110*abdd2437Shisping 	if (size == 0)
111*abdd2437Shisping 		return;
112*abdd2437Shisping 
113*abdd2437Shisping 	num = (size-1)/4096+1;
114*abdd2437Shisping 	debug(" free is: 0x%X  0x%X\n", i, num);
115*abdd2437Shisping 
116*abdd2437Shisping 	for (j = 0; j < num; j++) {
117*abdd2437Shisping 		*(my_flag + i + j) = 0;
118*abdd2437Shisping 		memset(my_mem_start + (i + j) * 4096, 0, 4096);
119*abdd2437Shisping 	}
120*abdd2437Shisping }
121*abdd2437Shisping 
122*abdd2437Shisping /*
123*abdd2437Shisping  * Initlialize the memory component, for example providing the
124*abdd2437Shisping  * containing drivers handle.
125*abdd2437Shisping  */
126*abdd2437Shisping void OpteeClientMemInit(void)
127*abdd2437Shisping {
128*abdd2437Shisping #ifdef CONFIG_ROCKCHIP_RK3328
129*abdd2437Shisping 	debug(" OpteeClientMemInit 64\n");
130*abdd2437Shisping 	my_malloc_init(0x09200000, 0x00200000);
131*abdd2437Shisping #endif
132*abdd2437Shisping #ifdef CONFIG_ROCKCHIP_RK322X
133*abdd2437Shisping 	debug(" OpteeClientMemInit 32\n");
134*abdd2437Shisping 	my_malloc_init((void *)0x6910a000, 0x000e0000);
135*abdd2437Shisping #endif
136*abdd2437Shisping }
137*abdd2437Shisping 
138*abdd2437Shisping /*
139*abdd2437Shisping  * Allocate a page aligned block of memory from the TrustZone
140*abdd2437Shisping  * shared memory block.
141*abdd2437Shisping  */
142*abdd2437Shisping void *OpteeClientMemAlloc(uint32_t length)
143*abdd2437Shisping {
144*abdd2437Shisping 	return my_malloc(length);
145*abdd2437Shisping }
146*abdd2437Shisping 
147*abdd2437Shisping /*
148*abdd2437Shisping  * Free a block of memory previously allocated using the
149*abdd2437Shisping  * OpteeClientMemAlloc function.
150*abdd2437Shisping  */
151*abdd2437Shisping void OpteeClientMemFree(void *mem)
152*abdd2437Shisping {
153*abdd2437Shisping 	my_free(mem);
154*abdd2437Shisping }
155