[PATCH 2/2] Shared MMU initialization for ARM BSPs and RaspberryPi MMU support
Alan Cudmore
alan.cudmore at gmail.com
Thu Oct 3 21:26:47 UTC 2013
I updated my git repo, recompiled, and ran my rki image on the raspberry pi.
Looks good.
Alan
On 10/3/2013 8:56 AM, Gedare Bloom wrote:
> Thanks Alan.
>
> Patch committed with the fix for the struct definition, and also I
> reworded the commit message a little bit.
>
> Please verify,
> Gedare
>
> On Wed, Oct 2, 2013 at 10:53 AM, Alan Cudmore <alan.cudmore at gmail.com> wrote:
>> It looks good to me. I updated my RTEMS git and tools, then I compiled and
>> ran it on the raspberry Pi.
>>
>> The only thing that did not work:
>>
>> In the file arm-cp15-start.h, I had to move
>> typedef struct {
>> uint32_t begin;
>> uint32_t end;
>> uint32_t flags;
>> } arm_cp15_start_section_config;
>>
>> to be before
>> extern const arm_cp15_start_section_config bsp_mm_config_table[];
>>
>> It did not compile if the bsp_mm_config_table declaration was first.
>>
>>
>> Alan
>>
>>
>> On 9/28/2013 12:07 PM, Gedare Bloom wrote:
>>> Looks good on my end. Alan or Sebastian have any comments?
>>> -Gedare
>>>
>>> On Sat, Sep 28, 2013 at 4:08 AM, Hesham AL-Matary
>>> <heshamelmatary at gmail.com> wrote:
>>>> The newly added ORed flag: ARM_CP15_CTRL_XP is vital to get RaspberryPi
>>>> MMU working properly and to share the container function between various
>>>> ARM BSPs. The new ORed flags do not affect the current BSPs that make use
>>>> of arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache
>>>> function.
>>>>
>>>> The rest is of the patch targets MMU initialization for ARM
>>>> architectures,
>>>> desgined to be shared. Later patches make use of shared mminit
>>>> implementation.
>>>>
>>>> ---
>>>> c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 9 ++-
>>>> c/src/lib/libbsp/arm/raspberrypi/preinstall.am | 8 +++
>>>> .../libbsp/arm/raspberrypi/startup/bspstarthooks.c | 22 +------
>>>> c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds | 4 +-
>>>> .../arm/raspberrypi/startup/mm_config_table.c | 70
>>>> ++++++++++++++++++++++
>>>> .../lib/libbsp/arm/shared/include/arm-cp15-start.h | 15 +++--
>>>> c/src/lib/libbsp/arm/shared/mminit.c | 24 ++++++++
>>>> c/src/lib/libbsp/shared/include/mm.h | 25 ++++++++
>>>> 8 files changed, 151 insertions(+), 26 deletions(-)
>>>> create mode 100644
>>>> c/src/lib/libbsp/arm/raspberrypi/startup/mm_config_table.c
>>>> create mode 100644 c/src/lib/libbsp/arm/shared/mminit.c
>>>> create mode 100644 c/src/lib/libbsp/shared/include/mm.h
>>>>
>>>> diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>>>> b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>>>> index 24d396c..a06979a 100644
>>>> --- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>>>> +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>>>> @@ -27,6 +27,7 @@ nodist_include_HEADERS = ../../shared/include/coverhd.h
>>>> \
>>>> nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
>>>>
>>>> include_bsp_HEADERS =
>>>> +include_bsp_HEADERS += ../../../libbsp/shared/include/mm.h
>>>> include_bsp_HEADERS += ../../shared/include/utility.h
>>>> include_bsp_HEADERS += ../../shared/include/irq-generic.h
>>>> include_bsp_HEADERS += ../../shared/include/irq-info.h
>>>> @@ -35,6 +36,7 @@ include_bsp_HEADERS +=
>>>> ../../shared/include/uart-output-char.h
>>>> include_bsp_HEADERS += ../../shared/tod.h
>>>> include_bsp_HEADERS += ../shared/include/linker-symbols.h
>>>> include_bsp_HEADERS += ../shared/include/start.h
>>>> +include_bsp_HEADERS += ../shared/include/arm-cp15-start.h
>>>> include_bsp_HEADERS += ../shared/lpc/include/lpc-timer.h
>>>> include_bsp_HEADERS += ../shared/lpc/include/lpc-dma.h
>>>> include_bsp_HEADERS += include/irq.h
>>>> @@ -83,7 +85,7 @@ libbsp_a_SOURCES += ../../shared/sbrk.c
>>>> libbsp_a_SOURCES += ../../shared/src/stackalloc.c
>>>> libbsp_a_SOURCES += ../shared/abort/simple_abort.c
>>>> libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
>>>> -
>>>> +libbsp_a_SOURCES += ../shared/arm-cp15-set-ttb-entries.c
>>>>
>>>> # Startup
>>>> libbsp_a_SOURCES += startup/bspreset.c
>>>> @@ -91,6 +93,7 @@ libbsp_a_SOURCES += startup/bspstart.c
>>>>
>>>> # IRQ
>>>> libbsp_a_SOURCES += ../../shared/src/irq-default-handler.c
>>>> +libbsp_a_SOURCES += ../shared/arm-cp15-set-exception-handler.c
>>>> libbsp_a_SOURCES += ../../shared/src/irq-generic.c
>>>> libbsp_a_SOURCES += ../../shared/src/irq-info.c
>>>> libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
>>>> @@ -127,6 +130,10 @@ libbsp_a_CPPFLAGS +=
>>>> -I$(srcdir)/../../../libcpu/arm/shared/include
>>>> # Start hooks
>>>> libbsp_a_SOURCES += startup/bspstarthooks.c
>>>>
>>>> +# LIBMM
>>>> +libbsp_a_SOURCES += startup/mm_config_table.c
>>>> +libbsp_a_SOURCES += ../shared/mminit.c
>>>> +
>>>>
>>>> ###############################################################################
>>>> # Network #
>>>>
>>>> ###############################################################################
>>>> diff --git a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
>>>> b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
>>>> index 056c5f1..a638e64 100644
>>>> --- a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
>>>> +++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am
>>>> @@ -62,6 +62,10 @@ $(PROJECT_INCLUDE)/bsp/bootcard.h:
>>>> ../../shared/include/bootcard.h $(PROJECT_INC
>>>> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h
>>>> PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h
>>>>
>>>> +$(PROJECT_INCLUDE)/bsp/mm.h: ../../../libbsp/shared/include/mm.h
>>>> $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>>>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mm.h
>>>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mm.h
>>>> +
>>>> $(PROJECT_INCLUDE)/bsp/utility.h: ../../shared/include/utility.h
>>>> $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>>>> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/utility.h
>>>> PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/utility.h
>>>> @@ -94,6 +98,10 @@ $(PROJECT_INCLUDE)/bsp/start.h:
>>>> ../shared/include/start.h $(PROJECT_INCLUDE)/bsp
>>>> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h
>>>> PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h
>>>>
>>>> +$(PROJECT_INCLUDE)/bsp/arm-cp15-start.h:
>>>> ../shared/include/arm-cp15-start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>>>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-cp15-start.h
>>>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-cp15-start.h
>>>> +
>>>> $(PROJECT_INCLUDE)/bsp/lpc-timer.h: ../shared/lpc/include/lpc-timer.h
>>>> $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>>>> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-timer.h
>>>> PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-timer.h
>>>> diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c
>>>> b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c
>>>> index a224168..71b2ff1 100644
>>>> --- a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c
>>>> +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c
>>>> @@ -7,6 +7,7 @@
>>>> */
>>>>
>>>> /*
>>>> + * Copyright (c) 2013. Hesham AL-Matary
>>>> * Copyright (c) 2013 by Alan Cudmore
>>>> * based on work by:
>>>> * Copyright (c) 2009
>>>> @@ -24,33 +25,16 @@
>>>> #include <bspopts.h>
>>>> #include <bsp/start.h>
>>>> #include <bsp/raspberrypi.h>
>>>> -#include <bsp/mmu.h>
>>>> -
>>>> -static void BSP_START_TEXT_SECTION raspberrypi_cache_setup(void)
>>>> -{
>>>> - uint32_t ctrl = 0;
>>>> -
>>>> - /* Disable MMU and cache, basic settings */
>>>> - ctrl = arm_cp15_get_control();
>>>> - ctrl &= ~(ARM_CP15_CTRL_I | ARM_CP15_CTRL_R | ARM_CP15_CTRL_C
>>>> - | ARM_CP15_CTRL_V | ARM_CP15_CTRL_M);
>>>> - ctrl |= ARM_CP15_CTRL_S;
>>>> - arm_cp15_set_control(ctrl);
>>>> -
>>>> - arm_cp15_cache_invalidate();
>>>> - arm_cp15_tlb_invalidate();
>>>> -
>>>> -}
>>>> -
>>>> +#include <bsp/mm.h>
>>>>
>>>> void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
>>>> {
>>>> - raspberrypi_cache_setup();
>>>> }
>>>>
>>>>
>>>> void BSP_START_TEXT_SECTION bsp_start_hook_1(void)
>>>> {
>>>> bsp_start_copy_sections();
>>>> + bsp_memory_management_initialize();
>>>> bsp_start_clear_bss();
>>>> }
>>>> diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
>>>> b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
>>>> index b9a0dd8..c12b348 100644
>>>> --- a/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
>>>> +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
>>>> @@ -35,7 +35,8 @@
>>>>
>>>> MEMORY {
>>>> VECTOR_RAM (AIW) : ORIGIN = 0x0 , LENGTH = 0x8000
>>>> - RAM (AIW) : ORIGIN = 0x00008000, LENGTH = 128M -
>>>> 0x8000
>>>> + RAM (AIW) : ORIGIN = 0x00008000, LENGTH = 128M - 48K
>>>> + RAM_MMU (AIW) : ORIGIN = 128M - 16k, LENGTH = 16k
>>>> }
>>>>
>>>> REGION_ALIAS ("REGION_START", RAM);
>>>> @@ -58,5 +59,6 @@ bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ?
>>>> bsp_stack_irq_size : 4096;
>>>> bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size
>>>> : 1024;
>>>>
>>>> bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ?
>>>> bsp_section_robarrier_align : 1M;
>>>> +bsp_translation_table_base = ORIGIN (RAM_MMU);
>>>>
>>>> INCLUDE linkcmds.armv4
>>>> diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/mm_config_table.c
>>>> b/c/src/lib/libbsp/arm/raspberrypi/startup/mm_config_table.c
>>>> new file mode 100644
>>>> index 0000000..fd85513
>>>> --- /dev/null
>>>> +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/mm_config_table.c
>>>> @@ -0,0 +1,70 @@
>>>> +/*
>>>> + * 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.com/license/LICENSE.
>>>> + */
>>>> +
>>>> +#include <bsp/start.h>
>>>> +#include <bsp/arm-cp15-start.h>
>>>> +
>>>> +#ifdef RTEMS_SMP
>>>> + #define MMU_DATA_READ_WRITE ARMV7_MMU_DATA_READ_WRITE_SHAREABLE
>>>> +#else
>>>> + #define MMU_DATA_READ_WRITE ARMV7_MMU_DATA_READ_WRITE_CACHED
>>>> +#endif
>>>> +
>>>> +BSP_START_DATA_SECTION const arm_cp15_start_section_config
>>>> +bsp_mm_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_fast_data_begin,
>>>> + .end = (uint32_t) bsp_section_fast_data_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }, {
>>>> + .begin = (uint32_t) bsp_section_start_begin,
>>>> + .end = (uint32_t) bsp_section_start_end,
>>>> + .flags = ARMV7_MMU_CODE_CACHED
>>>> + }, {
>>>> + .begin = (uint32_t) bsp_section_vector_begin,
>>>> + .end = (uint32_t) bsp_section_vector_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }, {
>>>> + .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_section_data_begin,
>>>> + .end = (uint32_t) bsp_section_data_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }, {
>>>> + .begin = (uint32_t) bsp_section_bss_begin,
>>>> + .end = (uint32_t) bsp_section_bss_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }, {
>>>> + .begin = (uint32_t) bsp_section_work_begin,
>>>> + .end = (uint32_t) bsp_section_work_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }, {
>>>> + .begin = (uint32_t) bsp_section_stack_begin,
>>>> + .end = (uint32_t) bsp_section_stack_end,
>>>> + .flags = MMU_DATA_READ_WRITE
>>>> + }
>>>> +};
>>>> +
>>>> +BSP_START_DATA_SECTION const size_t bsp_mm_config_table_size =
>>>> +RTEMS_ARRAY_SIZE(&bsp_mm_config_table);
>>>> diff --git a/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
>>>> b/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
>>>> index 01f3104..6a2598b 100644
>>>> --- a/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
>>>> +++ b/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
>>>> @@ -1,4 +1,5 @@
>>>> -/*
>>>> +/*
>>>> + * Copyright (c) 2013 Hesham AL-Matary.
>>>> * Copyright (c) 2009-2013 embedded brains GmbH. All rights reserved.
>>>> *
>>>> * embedded brains GmbH
>>>> @@ -16,13 +17,15 @@
>>>> #define LIBBSP_ARM_SHARED_ARM_CP15_START_H
>>>>
>>>> #include <libcpu/arm-cp15.h>
>>>> -
>>>> #include <bsp/start.h>
>>>>
>>>> #ifdef __cplusplus
>>>> extern "C" {
>>>> #endif /* __cplusplus */
>>>>
>>>> +extern const arm_cp15_start_section_config bsp_mm_config_table[];
>>>> +extern const size_t bsp_mm_config_table_size;
>>>> +
>>>> BSP_START_TEXT_SECTION static inline void
>>>> arm_cp15_set_domain_access_control(uint32_t val);
>>>>
>>>> @@ -87,9 +90,9 @@
>>>> arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
>>>> arm_cp15_set_domain_access_control(dac);
>>>> arm_cp15_set_translation_table_base(ttb);
>>>>
>>>> - /* Initialize translation table with invalid entries */
>>>> + /* Initialize translation table with fixed-map read-write entries */
>>>> for (i = 0; i < ARM_MMU_TRANSLATION_TABLE_ENTRY_COUNT; ++i) {
>>>> - ttb [i] = 0;
>>>> + ttb [i] = (i << ARM_MMU_SECT_BASE_SHIFT) |
>>>> ARMV7_MMU_DATA_READ_WRITE;
>>>> }
>>>>
>>>> for (i = 0; i < config_count; ++i) {
>>>> @@ -97,7 +100,9 @@
>>>> arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
>>>> }
>>>>
>>>> /* Enable MMU and cache */
>>>> - ctrl |= ARM_CP15_CTRL_I | ARM_CP15_CTRL_C | ARM_CP15_CTRL_M;
>>>> + ctrl |= ARM_CP15_CTRL_AFE | ARM_CP15_CTRL_S | ARM_CP15_CTRL_I |
>>>> + ARM_CP15_CTRL_C | ARM_CP15_CTRL_M | ARM_CP15_CTRL_XP;
>>>> +
>>>> arm_cp15_set_control(ctrl);
>>>> }
>>>>
>>>> diff --git a/c/src/lib/libbsp/arm/shared/mminit.c
>>>> b/c/src/lib/libbsp/arm/shared/mminit.c
>>>> new file mode 100644
>>>> index 0000000..0ea9805
>>>> --- /dev/null
>>>> +++ b/c/src/lib/libbsp/arm/shared/mminit.c
>>>> @@ -0,0 +1,24 @@
>>>> +/*
>>>> + * Copyright (c) 2013 Hesham AL-Matary.
>>>> + *
>>>> + * The license and distribution terms for this file may be
>>>> + * found in the file LICENSE in this distribution or at
>>>> + * http://www.rtems.com/license/LICENSE.
>>>> + */
>>>> +#include <bsp/arm-cp15-start.h>
>>>> +#include <bsp/linker-symbols.h>
>>>> +#include <bsp/mm.h>
>>>> +#include <bsp/start.h>
>>>> +
>>>> +BSP_START_TEXT_SECTION void bsp_memory_management_initialize(void)
>>>> +{
>>>> + uint32_t ctrl = arm_cp15_get_control();
>>>> +
>>>> + arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
>>>> + ctrl,
>>>> + (uint32_t *) bsp_translation_table_base,
>>>> + ARM_MMU_DEFAULT_CLIENT_DOMAIN,
>>>> + &bsp_mm_config_table[0],
>>>> + bsp_mm_config_table_size
>>>> + );
>>>> +}
>>>> diff --git a/c/src/lib/libbsp/shared/include/mm.h
>>>> b/c/src/lib/libbsp/shared/include/mm.h
>>>> new file mode 100644
>>>> index 0000000..1a1eb7f
>>>> --- /dev/null
>>>> +++ b/c/src/lib/libbsp/shared/include/mm.h
>>>> @@ -0,0 +1,25 @@
>>>> +/*
>>>> + * Copyright (c) 2013 Hesham AL-Matary.
>>>> + * Copyright (c) 2013 Gedare Bloom.
>>>> + *
>>>> + * The license and distribution terms for this file may be
>>>> + * found in the file LICENSE in this distribution or at
>>>> + * http://www.rtems.com/license/LICENSE.
>>>> + */
>>>> +
>>>> +#ifndef __LIBBSP_MM_H
>>>> +#define __LIBBSP_MM_H
>>>> +
>>>> +#include <stdint.h>
>>>> +#include <stdlib.h>
>>>> +
>>>> +#ifdef __cplusplus
>>>> +extern "C" {
>>>> +#endif
>>>> +
>>>> +void bsp_memory_management_initialize(void);
>>>> +
>>>> +#ifdef __cplusplus
>>>> +}
>>>> +#endif
>>>> +#endif
>>>> --
>>>> 1.8.3.1
>>>>
>>>> _______________________________________________
>>>> rtems-devel mailing list
>>>> rtems-devel at rtems.org
>>>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>
More information about the devel
mailing list