77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
#include <string.h>
|
|
#include "kmdw_memory.h"
|
|
#include "kmdw_console.h"
|
|
|
|
/* ddr malloc direction : from tail(bigger address) to head (smaller) */
|
|
|
|
static uint32_t s_ddr_addr_tail = 0;
|
|
static uint32_t s_ddr_addr_boundary = 0;
|
|
|
|
static uint32_t s_ddr_system_reserve_addr = 0;
|
|
static uint32_t s_ddr_system_reserve_size = 0;
|
|
|
|
void kmdw_ddr_init(uint32_t start_addr, uint32_t end_addr)
|
|
{
|
|
s_ddr_addr_boundary = start_addr; //(lower addr) ex. 0x11100000
|
|
s_ddr_addr_tail = end_addr; //(higher addr) ex. 0x1111FFFF
|
|
}
|
|
|
|
int kmdw_ddr_set_ddr_boundary(uint32_t boundary)
|
|
{
|
|
if (boundary >= s_ddr_addr_tail)
|
|
return -1;
|
|
else {
|
|
s_ddr_addr_boundary = boundary;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
uint32_t kmdw_ddr_reserve(uint32_t numbyte)
|
|
{
|
|
uint32_t aligned_numbyte;
|
|
uint32_t tail_tmp;
|
|
|
|
if(numbyte == 0)
|
|
return 0;
|
|
|
|
if(s_ddr_addr_boundary == 0)
|
|
return 0; //not initialized yet
|
|
|
|
aligned_numbyte = ALIGN16(numbyte);
|
|
tail_tmp = s_ddr_addr_tail;
|
|
tail_tmp = ALIGN16_FLOOR(tail_tmp - aligned_numbyte);
|
|
|
|
if(tail_tmp <= s_ddr_addr_boundary)
|
|
{
|
|
err_msg("Failed DDR allocation: %8d(before aligned) bytes [ 0x%x(<=0x%x) : 0x%x]\n",
|
|
numbyte, tail_tmp, s_ddr_addr_boundary, s_ddr_addr_tail);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
dbg_msg("[DBG] DDR allocated: %8d [ *0x%x : 0x%x]\n",
|
|
numbyte, tail_tmp, s_ddr_addr_tail);
|
|
|
|
s_ddr_addr_tail = tail_tmp - 1;
|
|
return tail_tmp; // aligned address
|
|
}
|
|
}
|
|
|
|
uint32_t kmdw_ddr_get_heap_tail()
|
|
{
|
|
return s_ddr_addr_tail;
|
|
}
|
|
|
|
void kmdw_ddr_store_system_reserve(uint32_t start_addr, uint32_t end_addr)
|
|
{
|
|
s_ddr_system_reserve_addr = start_addr;
|
|
s_ddr_system_reserve_size = (end_addr - start_addr + 1);
|
|
}
|
|
|
|
void kmdw_ddr_get_system_reserve(uint32_t *start_addr, uint32_t *ddr_size)
|
|
{
|
|
*start_addr = s_ddr_system_reserve_addr;
|
|
*ddr_size = s_ddr_system_reserve_size;
|
|
}
|