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