[rtems commit] bsp/altera-cyclone-v: Remove reserved memory

Sebastian Huber sebh at rtems.org
Tue Dec 19 11:56:22 UTC 2017


Module:    rtems
Branch:    master
Commit:    94f3c2dbe9e7d70570a9159887a0cc08a144bdc7
Changeset: http://git.rtems.org/rtems/commit/?id=94f3c2dbe9e7d70570a9159887a0cc08a144bdc7

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Dec 19 12:53:20 2017 +0100

bsp/altera-cyclone-v: Remove reserved memory

Removed reserved memory from work area, e.g. used by FPGA devices.

---

 .../arm/altera-cyclone-v/startup/bspgetworkarea.c  | 83 ++++++++++++++++++++++
 1 file changed, 83 insertions(+)

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 5a3af5d..a3c702d 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(



More information about the vc mailing list