bsp/altera-cyclone-v: Remove reserved memory

Removed reserved memory from work area, e.g. used by FPGA devices.
This commit is contained in:
Sebastian Huber
2017-12-19 12:53:20 +01:00
parent f0e5e17c44
commit 94f3c2dbe9

View File

@@ -19,6 +19,8 @@
static const char memory_path[] = "/memory";
static const char reserved_memory_path[] = "/reserved-memory";
static void adjust_memory_size(const void *fdt, Heap_Area *area)
{
int node;
@@ -65,6 +67,86 @@ static void adjust_memory_size(const void *fdt, Heap_Area *area)
}
}
static Heap_Area *find_area(
Heap_Area *areas,
size_t area_count,
uint32_t begin
)
{
size_t i;
for (i = 0; i < area_count; ++i) {
uintptr_t b;
uintptr_t e;
b = (uintptr_t) areas[i].begin;
e = b + (uintptr_t) areas[i].size;
if (b <= begin && begin < e) {
return &areas[i];
}
}
return NULL;
}
static size_t remove_reserved_memory(
const void *fdt,
Heap_Area *areas,
size_t area_count
)
{
int node;
node = fdt_path_offset_namelen(
fdt,
reserved_memory_path,
(int) sizeof(reserved_memory_path) - 1
);
if (node >= 0) {
node = fdt_first_subnode(fdt, node);
while (node >= 0) {
int len;
const void *val;
uintptr_t area_begin;
uintptr_t area_end;
uintptr_t hole_begin;
uintptr_t hole_end;
Heap_Area *area;
val = fdt_getprop(fdt, node, "reg", &len);
if (len == 8) {
hole_begin = fdt32_to_cpu(((fdt32_t *) val)[0]);
hole_end = hole_begin + fdt32_to_cpu(((fdt32_t *) val)[1]);
} else {
rtems_panic("unexpected reserved memory area");
}
area = find_area(areas, area_count, hole_begin);
area_begin = (uintptr_t) area->begin;
area_end = area_begin + (uintptr_t) area->size;
area->size = hole_begin - area_begin;
if (hole_end <= area_end) {
if (area_count >= AREA_COUNT_MAX) {
rtems_panic("too many reserved memory areas");
}
area = &areas[area_count];
++area_count;
area->begin = (void *) hole_end;
area->size = area_end - hole_end;
}
node = fdt_next_subnode(fdt, node);
}
}
return area_count;
}
void bsp_work_area_initialize(void)
{
const void *fdt;
@@ -79,6 +161,7 @@ void bsp_work_area_initialize(void)
fdt = bsp_fdt_get();
adjust_memory_size(fdt, &areas[0]);
area_count = remove_reserved_memory(fdt, areas, area_count);
for (i = 0; i < area_count; ++i) {
arm_cp15_set_translation_table_entries(