[PATCH 4/4] Code refactor xilinx-zynq BSP MMU initialization

Chris Johns chrisj at rtems.org
Sun Aug 16 05:22:34 UTC 2015


On 15/08/2015 8:14 pm, Rohini Kulkarni wrote:
> 
> 
> On Fri, Aug 14, 2015 at 12:41 PM, Rohini Kulkarni <krohini1593 at gmail.com
> <mailto:krohini1593 at gmail.com>> wrote:
> 
> 
> 
>     On Fri, Aug 14, 2015 at 8:33 AM, Chris Johns <chrisj at rtems.org
>     <mailto:chrisj at rtems.org>> wrote:
> 
>         On 14/08/2015 7:44 am, Rohini Kulkarni wrote:
>         > ---
>         >
>         > -BSP_START_DATA_SECTION static const arm_cp15_start_section_config
>         > -zynq_mmu_config_table[] = {
>         > +BSP_START_DATA_SECTION const arm_cp15_start_section_config
>         > +arm_cp15_start_mmu_config_table[] = {
>         >    ARMV7_CP15_START_DEFAULT_SECTIONS,
>         >    {
>         >      .begin = 0xe0000000U,
> 
>         Why not pass the table to the bsp_memory_management_initialize
>         call and
>         avoid making this table global ? Maybe all these tables should
>         be static
>         and local to their file's in all ARM bsps that do this type MMU
>         set up.
> 
>         This global table and referencing it in the call limits its use
>         and I
>         think makes things a little more fragile. See below.
> 
>     I saw Raspberry Pi and altera define
>     the arm_cp15_start_mmu_config_table. The table is declared in the
>     arm-cp15-start.h and mminit.c uses this as the default table. So I
>     didn't really understand why some had static tables while others didn't.
> 

This is confusing and we should settling on one specific way that
supports all use cases. Personally I think the table should not be
global and it should be private to the BSP. It is not clear to me what
advantage we get with this table being global.

>         Do all ARMs devices with MMUs have cp15 or is this limited to a
>         specific
>         family ? The only reason I ask is
>         bsp_memory_management_initialize is a
>         generic name. 
> 
>     Not all ARM devices have cp15. The existing definition of
>     bsp_memory_management_initialize supports only cp15. The definition
>     would not be useful to other devices. And this definition was being
>     replicated by some cp15 bsps again. So the reason for making these
>     changes.

>From what I could see the bsp_memory_management_initialize is at the
shared BSP level which implies this is generic. If it is specific to an
architecture and then specific to sub-set of that architecture I wonder
if should stay.

>      
> 
>         If something else exists does this call need to be updated ?
> 
>     Yes, a different definition will be required.
> 

I see this becoming complex quickly. Making all BSPs with an MMU
dependent means a change for one could break the other dependent BSPs
and this increases the testing on all effected BSPs.

> 
>         I am still a little confused what the changes gives us. Should
>         the RPi
>         not use the call and it be removed ? I do not know.
> 
>         > @@ -39,17 +40,15 @@ zynq_mmu_config_table[] = {
>         >  BSP_START_TEXT_SECTION void zynq_setup_mmu_and_cache(void) __attribute__ ((weak));
> 
>         If all this code is going to be touched I feel adding weak
>         versions for
>         all boards is a good thing.
> 
>         The Zynq and I suspect the Cyclone need this because the memory
>         mapped
>         can depend on what is loaded into the programmable logic (PL)
>         side of
>         these devices. I currently override the weak Zynq call in production
>         code based on the PL logic loaded at run time. I wonder if this
>         change
>         will break code. I am concerned it needs to get a clean link yet
>         we now
>         have globals and other code referencing those globals. If the
>         file is
>         not referenced and nothing else depends on it things are more
>         robust. 
> 
>     I still don't have the deeper insight needed so I don't see
>     dependencies. But if having static tables is much more robust then
>     we should apply that to all.
> 

Someone may add another call to bsp_memory_management_initialize for
some reason as it is a BSP level call and that code references the
global tables which also pulls in a weak version of the BSP call. What
happens to a user's application that has code to override the weak BSP
call to provide a custom MMU table ? We would have the weak and the
non-weak version being linked and I am not sure how the linker would
resolve this. I feel this makes the code fragile.

Having weak version of the MMU initialization is a good thing.

> 
>         >
>         >  BSP_START_TEXT_SECTION void zynq_setup_mmu_and_cache(void)
>         > -{
>         > -  uint32_t ctrl = arm_cp15_start_setup_mmu_and_cache(
>         > -    ARM_CP15_CTRL_A,
>         > -    ARM_CP15_CTRL_AFE | ARM_CP15_CTRL_Z
>         > -  );
>         > -
>         > - 
>         arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
>         > -    ctrl,
>         > -    (uint32_t *) bsp_translation_table_base,
>         > -    ARM_MMU_DEFAULT_CLIENT_DOMAIN,
>         > -    &zynq_mmu_config_table[0],
>         > -    RTEMS_ARRAY_SIZE(zynq_mmu_config_table)
>         > +{
>         > +  uint32_t bsp_initial_mmu_ctrl_set = ARM_CP15_CTRL_AFE |
>         ARM_CP15_CTRL_Z;
>         > +  uint32_t bsp_initial_mmu_ctrl_clear = ARM_CP15_CTRL_A;
>         > +
>         > +  bsp_memory_management_initialize(
>         > +    bsp_initial_mmu_ctrl_set,
>         > +    bsp_initial_mmu_ctrl_clear
>         >    );
>         >  }
>         > +
>         > +const size_t arm_cp15_start_mmu_config_table_size =
>         > +  RTEMS_ARRAY_SIZE(arm_cp15_start_mmu_config_table);
> 
>         Same here. I think we should avoid globals.
> 
>     Then I think raspberry Pi and altera should also follow this if this
>     is much more appropriate.
> 
> 
> So what is the way out here? 
> 

A few options...

1. Move all BSPs with an MMU to use bsp_memory_management_initialize and
make it support all set ups (this is difficult).
2. Make the RPi be like the Zynq and private and with a weak MMU set up
call and remove the call.
3. Make the bsp_memory_management_initialize take args to the table.
4. Something else ...

I do not think 1 is an option because it creates a change hot spot in
the code and 3 is not adding much given only the ARM devices with cp15
support would use this call and Sebastian has made a nice API here already.

I would also like to hear what Sebastian has to say.

Chris


More information about the devel mailing list