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