diff options
-rw-r--r-- | bsps/arm/raspberrypi/include/bsp/vc.h | 11 | ||||
-rw-r--r-- | bsps/arm/raspberrypi/start/bspgetworkarea.c | 87 | ||||
-rw-r--r-- | bsps/arm/raspberrypi/start/bspstarthooks.c | 71 | ||||
-rw-r--r-- | bsps/arm/raspberrypi/start/mm_config_table.c | 96 | ||||
-rw-r--r-- | 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 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 # ############################################################################### |