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