diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-12-19 12:53:20 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-12-19 12:54:53 +0100 |
commit | 94f3c2dbe9e7d70570a9159887a0cc08a144bdc7 (patch) | |
tree | acd8788dc4629314826d59769ccc79c137d73e79 | |
parent | bsp/altera-cyclone-v: Adjust work area (diff) | |
download | rtems-94f3c2dbe9e7d70570a9159887a0cc08a144bdc7.tar.bz2 |
bsp/altera-cyclone-v: Remove reserved memory
Removed reserved memory from work area, e.g. used by FPGA devices.
-rw-r--r-- | c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspgetworkarea.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspgetworkarea.c b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspgetworkarea.c index 5a3af5d762..a3c702de98 100644 --- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspgetworkarea.c +++ b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspgetworkarea.c @@ -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( |