summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-12-19 12:53:20 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-12-19 12:54:53 +0100
commit94f3c2dbe9e7d70570a9159887a0cc08a144bdc7 (patch)
treeacd8788dc4629314826d59769ccc79c137d73e79
parentbsp/altera-cyclone-v: Adjust work area (diff)
downloadrtems-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.c83
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(