[rtems commit] bsp/raspberrypi: Fix size of work area.

Christian Mauderer christianm at rtems.org
Tue Jan 7 17:24:22 UTC 2020


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

Author:    Christian Mauderer <christian.mauderer at embedded-brains.de>
Date:      Fri Dec 27 22:08:12 2019 +0100

bsp/raspberrypi: Fix size of work area.

The BSP tried to get the size of the SDRAM based on the revision code.
Unfortunately the code had some bugs so that the default size has been
used. Beneath that the MMU table hasn't been adapted.

This patch queries the SDRAM size via a special VC Mailbox call instead.
For the MMU adaption a simmilar method to the one in the imx BSP is
used.

---

 bsps/arm/raspberrypi/include/bsp/vc.h        | 11 ++++
 bsps/arm/raspberrypi/start/bspgetworkarea.c  | 87 -------------------------
 bsps/arm/raspberrypi/start/bspstarthooks.c   | 71 +++++++++++++++++++-
 bsps/arm/raspberrypi/start/mm_config_table.c | 96 ----------------------------
 c/src/lib/libbsp/arm/raspberrypi/Makefile.am |  4 --
 5 files changed, 80 insertions(+), 189 deletions(-)

diff --git a/bsps/arm/raspberrypi/include/bsp/vc.h b/bsps/arm/raspberrypi/include/bsp/vc.h
index 107b6ac..422d28c 100644
--- a/bsps/arm/raspberrypi/include/bsp/vc.h
+++ b/bsps/arm/raspberrypi/include/bsp/vc.h
@@ -138,6 +138,17 @@ int bcm2835_mailbox_get_board_model( bcm2835_get_board_spec_entries *_entries );
 int bcm2835_mailbox_get_board_revision(
   bcm2835_get_board_spec_entries *_entries );
 
+/*
+ * See the official documentation for the format of the revision codes:
+ * https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
+ */
+#define BCM2835_REVISION_IS_NEW_STYLE(revision) ((revision & (1 << 23)) != 0)
+#define BCM2835_REVISION_MEMORY_SIZE(revision) ((revision >> 20) & 0x7)
+#define BCM2835_REVISION_MANUFACTURER(revision) ((revision >> 16) & 0xf)
+#define BCM2835_REVISION_PROCESSOR(revision) ((revision >> 12) & 0xf)
+#define BCM2835_REVISION_TYPE(revision) ((revision >> 4) & 0xff)
+#define BCM2835_REVISION_REVISION(revision) ((revision >> 0) & 0xf)
+
 typedef struct {
   uint64_t board_serial;
 } bcm2835_get_board_serial_entries;
diff --git a/bsps/arm/raspberrypi/start/bspgetworkarea.c b/bsps/arm/raspberrypi/start/bspgetworkarea.c
deleted file mode 100644
index 6521dcf..0000000
--- a/bsps/arm/raspberrypi/start/bspgetworkarea.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * @file
- *
- * @ingroup arm_start
- *
- * @brief Raspberry pi workarea initialization.
- */
-
-/*
- * COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
- *
- * Copyright (c) 2011-2012 embedded brains GmbH.
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- *
- * Copyright (c) 2015 YANG Qiao
- *
- * Code is based on c/src/lib/libbsp/shared/bspgetworkarea.c
- */
-
-#include <string.h>
-#include <bsp.h>
-#include <bsp/bootcard.h>
-#include <bsp/vc.h>
-
-#if defined(HAS_UBOOT) && !defined(BSP_DISABLE_UBOOT_WORK_AREA_CONFIG)
-  #define USE_UBOOT
-#endif
-
-/*
- *  These are provided by the linkcmds for ALL of the BSPs which use this file.
- */
-extern char WorkAreaBase[];
-
-/*
- *  We may get the size information from U-Boot or the linker scripts.
- */
-#ifdef USE_UBOOT
-  #include <bsp/u-boot.h>
-#else
-  extern char RamBase[];
-  extern char RamSize[];
-#endif
-
-void bsp_work_area_initialize(void)
-{
-  uintptr_t                      work_base;
-  uintptr_t                      ram_end;
-  bcm2835_get_board_spec_entries spec = { 0 };
-
-  work_base = (uintptr_t) WorkAreaBase;
-
-  /*
-   * Get the board revision and use it to determine the size of the
-   * SDRAM. Get the VC memory entry to determine the size of the VC
-   * memory needed.
-   */
-
-  #ifdef USE_UBOOT
-    ram_end = (uintptr_t) bsp_uboot_board_info.bi_memstart +
-                          bsp_uboot_board_info.bi_memsize;
-  #else
-    ram_end = (uintptr_t)RamBase + (uintptr_t)RamSize;
-  #endif
-
-  if (bcm2835_mailbox_get_board_revision( &spec ) >= 0) {
-    uint32_t mem = (spec.spec >> (4 + 4 + 8 + 4)) & 0xf;
-    if (mem < 5) {
-      bcm2835_get_vc_memory_entries vc = { 0 };
-      const uint32_t rpi_mem[5] = {
-        256 * 1024,
-        512 * 1024,
-        1 * 1024,
-        2 * 1024,
-        4 * 1024
-      };
-      ram_end = work_base + rpi_mem[mem];
-      if (bcm2835_mailbox_get_vc_memory( &vc ) >= 0)
-        ram_end -= vc.size;
-    }
-  }
-
-  bsp_work_area_initialize_default( (void *) work_base, ram_end - work_base );
-}
diff --git a/bsps/arm/raspberrypi/start/bspstarthooks.c b/bsps/arm/raspberrypi/start/bspstarthooks.c
index 3f8c680..c2a9707 100644
--- a/bsps/arm/raspberrypi/start/bspstarthooks.c
+++ b/bsps/arm/raspberrypi/start/bspstarthooks.c
@@ -27,6 +27,7 @@
 #include <bsp/raspberrypi.h>
 #include <libcpu/arm-cp15.h>
 #include <bsp.h>
+#include <bsp/bootcard.h>
 #include <bsp/linker-symbols.h>
 #include <bsp/arm-cp15-start.h>
 
@@ -34,6 +35,34 @@
 #include <rtems/score/smp.h>
 #endif
 
+#if defined(HAS_UBOOT) && !defined(BSP_DISABLE_UBOOT_WORK_AREA_CONFIG)
+  #define USE_UBOOT
+#endif
+
+#ifdef USE_UBOOT
+  #include <bsp/u-boot.h>
+#else
+  #include <bsp/vc.h>
+#endif
+
+BSP_START_DATA_SECTION static arm_cp15_start_section_config
+raspberrypi_mmu_config_table[] = {
+  ARMV7_CP15_START_DEFAULT_SECTIONS,
+  {
+    .begin = RPI_PERIPHERAL_BASE,
+    .end =   RPI_PERIPHERAL_BASE + RPI_PERIPHERAL_SIZE,
+    .flags = ARMV7_MMU_DEVICE
+  }
+#if (BSP_IS_RPI2 == 1)
+  /* Core local peripherals area - timer, mailboxes */
+  , {
+    .begin = BCM2836_CORE_LOCAL_PERIPH_BASE,
+    .end =   BCM2836_CORE_LOCAL_PERIPH_BASE + BCM2836_CORE_LOCAL_PERIPH_SIZE,
+    .flags = ARMV7_MMU_DEVICE
+  }
+#endif
+};
+
 void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
 {
   uint32_t sctlr_val;
@@ -98,18 +127,43 @@ void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
 #endif
 }
 
+BSP_START_TEXT_SECTION static uintptr_t raspberrypi_get_ram_end(void)
+{
+  uintptr_t ram_end;
+
+#ifdef USE_UBOOT
+  ram_end = (uintptr_t) bsp_uboot_board_info.bi_memstart +
+                        bsp_uboot_board_info.bi_memsize;
+#else
+  bcm2835_get_arm_memory_entries spec;
+
+  if (bcm2835_mailbox_get_arm_memory( &spec ) >= 0) {
+    ram_end = spec.base + spec.size;
+  } else {
+    /* Use the workspace end from the linker command file for fallback. */
+    ram_end = (uintptr_t) bsp_section_work_end;
+  }
+#endif
+
+  return ram_end;
+}
+
 BSP_START_TEXT_SECTION static void bsp_memory_management_initialize(void)
 {
+  uintptr_t ram_end = raspberrypi_get_ram_end();
   uint32_t ctrl = arm_cp15_get_control();
 
   ctrl |= ARM_CP15_CTRL_AFE | ARM_CP15_CTRL_S | ARM_CP15_CTRL_XP;
 
+  raspberrypi_mmu_config_table[ARMV7_CP15_START_WORKSPACE_ENTRY_INDEX].end =
+    ram_end;
+
   arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
     ctrl,
     (uint32_t *) bsp_translation_table_base,
     ARM_MMU_DEFAULT_CLIENT_DOMAIN,
-    &arm_cp15_start_mmu_config_table[0],
-    arm_cp15_start_mmu_config_table_size
+    &raspberrypi_mmu_config_table[0],
+    RTEMS_ARRAY_SIZE(raspberrypi_mmu_config_table)
   );
 }
 
@@ -121,3 +175,16 @@ void BSP_START_TEXT_SECTION bsp_start_hook_1(void)
 
   rpi_video_init();
 }
+
+void bsp_work_area_initialize(void)
+{
+  uintptr_t begin;
+  uintptr_t end;
+
+  begin = raspberrypi_mmu_config_table[ARMV7_CP15_START_WORKSPACE_ENTRY_INDEX]
+          .begin;
+  end = raspberrypi_mmu_config_table[ARMV7_CP15_START_WORKSPACE_ENTRY_INDEX]
+        .end;
+
+  bsp_work_area_initialize_default((void *) begin, end - begin);
+}
diff --git a/bsps/arm/raspberrypi/start/mm_config_table.c b/bsps/arm/raspberrypi/start/mm_config_table.c
deleted file mode 100644
index 27fa76b..0000000
--- a/bsps/arm/raspberrypi/start/mm_config_table.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * @file
- *
- * @ingroup arm_start
- *
- * @brief Raspberry Pi low level start
- */
-
-/*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  82178 Puchheim
- *  Germany
- *  <info at embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include <bsp.h>
-#include <bsp/arm-cp15-start.h>
-
-/*
- * Pagetable initialization data
- *
- * Keep all read-only sections before read-write ones.
- * This ensures that write is allowed if one page/region
- * is partially filled by read-only section contentent
- * and rest is used for writeable section
- */
-
-const arm_cp15_start_section_config arm_cp15_start_mmu_config_table[] = {
-  {
-    .begin = (uint32_t) bsp_section_fast_text_begin,
-    .end = (uint32_t) bsp_section_fast_text_end,
-    .flags = ARMV7_MMU_CODE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_start_begin,
-    .end = (uint32_t) bsp_section_start_end,
-    .flags = ARMV7_MMU_CODE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_text_begin,
-    .end = (uint32_t) bsp_section_text_end,
-    .flags = ARMV7_MMU_CODE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_rodata_begin,
-    .end = (uint32_t) bsp_section_rodata_end,
-    .flags = ARMV7_MMU_DATA_READ_ONLY_CACHED
-  }, {
-    .begin = (uint32_t) bsp_translation_table_base,
-    .end = (uint32_t) bsp_translation_table_base + 0x4000,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_fast_data_begin,
-    .end = (uint32_t) bsp_section_fast_data_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_vector_begin,
-    .end = (uint32_t) bsp_section_vector_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_data_begin,
-    .end = (uint32_t) bsp_section_data_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_bss_begin,
-    .end = (uint32_t) bsp_section_bss_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_work_begin,
-    .end = (uint32_t) bsp_section_work_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = (uint32_t) bsp_section_stack_begin,
-    .end = (uint32_t) bsp_section_stack_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED
-  }, {
-    .begin = RPI_PERIPHERAL_BASE,
-    .end =   RPI_PERIPHERAL_BASE + RPI_PERIPHERAL_SIZE,
-    .flags = ARMV7_MMU_DEVICE
-  }
-#if (BSP_IS_RPI2 == 1)
-  /* Core local peripherals area - timer, mailboxes */
-  , {
-    .begin = BCM2836_CORE_LOCAL_PERIPH_BASE,
-    .end =   BCM2836_CORE_LOCAL_PERIPH_BASE + BCM2836_CORE_LOCAL_PERIPH_SIZE,
-    .flags = ARMV7_MMU_DEVICE
-  }
-#endif
-};
-
-const size_t arm_cp15_start_mmu_config_table_size =
-  RTEMS_ARRAY_SIZE(arm_cp15_start_mmu_config_table);
diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
index 11a22f8..5326deb 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
+++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
@@ -49,7 +49,6 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/cp15/arm-cp15-set-ttb
 # Startup
 librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspstart.c
 librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/cmdline.c
-librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspgetworkarea.c
 if HAS_SMP
 librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspsmp.c
 librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspsmp_init.c
@@ -105,9 +104,6 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/cache/cache-v7ar-disa
 # Start hooks
 librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/bspstarthooks.c
 
-# LIBMM
-librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/start/mm_config_table.c
-
 ###############################################################################
 #                  Special Rules                                              #
 ###############################################################################



More information about the vc mailing list