summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsps/arm/raspberrypi/include/bsp/vc.h11
-rw-r--r--bsps/arm/raspberrypi/start/bspgetworkarea.c87
-rw-r--r--bsps/arm/raspberrypi/start/bspstarthooks.c71
-rw-r--r--bsps/arm/raspberrypi/start/mm_config_table.c96
-rw-r--r--c/src/lib/libbsp/arm/raspberrypi/Makefile.am4
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 107b6acf0c..422d28cdd9 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 6521dcf352..0000000000
--- 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 3f8c680bc0..c2a9707d71 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 27fa76b355..0000000000
--- 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@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 11a22f89e3..5326deb8a3 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 #
###############################################################################