[U-Boot] [PATCH v3 4/4] ARM: bcm283x: Set memory map at run-time

Matthias Brugger mbrugger at suse.com
Wed Nov 13 10:49:14 UTC 2019



On 13/11/2019 11:44, Alexander Graf wrote:
> 
> On 12.11.19 13:00, matthias.bgg at kernel.org wrote:
>> From: Matthias Brugger <mbrugger at suse.com>
>>
>> For bcm283x based on arm64 we also have to change the mm_region.
>> Add assign this in mach_cpu_init() so we can create now one binary
>> for RPi3 and RPi4.
>>
>> Signed-off-by: Matthias Brugger <mbrugger at suse.com>
> 
> 
> For the future, can you think of a reason why we could not always generate the
> map at runtime?
> 

The only reason I can think of, is that the core of U-Boot changes so that
mach_cpu_init() would be too late. But in this case we would only need to update
the mem_map earlier, which shouldn't be an issue.

Regards,
Matthias

> 
> Alex
> 
> 
>>
>> ---
>>
>> Changes in v3: None
>> Changes in v2:
>> - Move mem_map out of assembly file
>> - push mem_map into the .data section
>> - update the members of mem_map inestead of the pointer
>>
>>   arch/arm/mach-bcm283x/init.c | 74 ++++++++++++++++++++++++++++++++++++
>>   board/raspberrypi/rpi/rpi.c  | 45 ----------------------
>>   2 files changed, 74 insertions(+), 45 deletions(-)
>>
>> diff --git a/arch/arm/mach-bcm283x/init.c b/arch/arm/mach-bcm283x/init.c
>> index d374fb60ba..639a5cf975 100644
>> --- a/arch/arm/mach-bcm283x/init.c
>> +++ b/arch/arm/mach-bcm283x/init.c
>> @@ -8,6 +8,9 @@
>>     #include <common.h>
>>   #include <dm/device.h>
>> +#ifdef CONFIG_ARM64
>> +#include <asm/armv8/mmu.h>
>> +#endif
>>     #define PDATA_BCM2835    0
>>   #define PDATA_BCM2836    1
>> @@ -16,23 +19,77 @@
>>     unsigned long rpi_bcm283x_base = 0x3f000000;
>>   +#ifdef CONFIG_ARM64
>> +static struct mm_region bcm283x_mem_map[] = {
>> +    {
>> +        .virt = 0x00000000UL,
>> +        .phys = 0x00000000UL,
>> +        .size = 0x3f000000UL,
>> +        .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>> +             PTE_BLOCK_INNER_SHARE
>> +    }, {
>> +        .virt = 0x3f000000UL,
>> +        .phys = 0x3f000000UL,
>> +        .size = 0x01000000UL,
>> +        .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>> +             PTE_BLOCK_NON_SHARE |
>> +             PTE_BLOCK_PXN | PTE_BLOCK_UXN
>> +    }, {
>> +        /* List terminator */
>> +        0,
>> +    }
>> +};
>> +
>> +static struct mm_region bcm2711_mem_map[] = {
>> +    {
>> +        .virt = 0x00000000UL,
>> +        .phys = 0x00000000UL,
>> +        .size = 0xfe000000UL,
>> +        .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>> +             PTE_BLOCK_INNER_SHARE
>> +    }, {
>> +        .virt = 0xfe000000UL,
>> +        .phys = 0xfe000000UL,
>> +        .size = 0x01800000UL,
>> +        .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>> +             PTE_BLOCK_NON_SHARE |
>> +             PTE_BLOCK_PXN | PTE_BLOCK_UXN
>> +    }, {
>> +        /* List terminator */
>> +        0,
>> +    }
>> +};
>> +
>> +struct mm_region *mem_map = bcm283x_mem_map;
>> +
>> +#else
>> +struct mm_region {
>> +    /* dummy struct */
>> +};
>> +#endif
>> +
>>   struct bcm283x_pdata {
>>       unsigned long io_base;
>> +    struct mm_region *m_map;
>>   };
>>     struct bcm283x_pdata pdata_bcm283x[] = {
>>       [PDATA_BCM2835] = {
>>           .io_base = 0x20000000,
>> +        .m_map = NULL,
>>       },
>>       [PDATA_BCM2836] = {
>>           .io_base = 0x3f000000,
>> +        .m_map = NULL,
>>       },
>>   #ifdef CONFIG_ARM64
>>       [PDATA_BCM2837] = {
>>           .io_base = 0x3f000000,
>> +        .m_map = bcm283x_mem_map,
>>       },
>>       [PDATA_BCM2711] = {
>>           .io_base = 0xfe000000,
>> +        .m_map = bcm2711_mem_map
>>       },
>>   #endif
>>   };
>> @@ -57,6 +114,22 @@ int arch_cpu_init(void)
>>       return 0;
>>   }
>>   +#ifdef CONFIG_ARM64
>> +static void rpi_updated_mem_map(struct mm_region *pd)
>> +{
>> +    int i;
>> +
>> +    for (i = 0; i < 2; i++) {
>> +        mem_map[i].virt = pd[i].virt;
>> +        mem_map[i].phys = pd[i].phys;
>> +        mem_map[i].size = pd[i].size;
>> +        mem_map[i].attrs = pd[i].attrs;
>> +    }
>> +}
>> +#else
>> +static void rpi_updated_mem_map(struct mm_region *pd) {}
>> +#endif
>> +
>>   int mach_cpu_init(void)
>>   {
>>       const struct udevice_id *of_match = board_ids;
>> @@ -72,6 +145,7 @@ int mach_cpu_init(void)
>>           if (!ret) {
>>               pdat = pdata_bcm283x[of_match->data];
>>               rpi_bcm283x_base = pdat.io_base;
>> +            rpi_updated_mem_map(pdat.m_map);
>>               break;
>>           }
>>   diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
>> index 0e05d59e1f..248d04bfd2 100644
>> --- a/board/raspberrypi/rpi/rpi.c
>> +++ b/board/raspberrypi/rpi/rpi.c
>> @@ -248,51 +248,6 @@ static uint32_t rev_scheme;
>>   static uint32_t rev_type;
>>   static const struct rpi_model *model;
>>   -#ifdef CONFIG_ARM64
>> -#ifndef CONFIG_BCM2711
>> -static struct mm_region bcm283x_mem_map[] = {
>> -    {
>> -        .virt = 0x00000000UL,
>> -        .phys = 0x00000000UL,
>> -        .size = 0x3f000000UL,
>> -        .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>> -             PTE_BLOCK_INNER_SHARE
>> -    }, {
>> -        .virt = 0x3f000000UL,
>> -        .phys = 0x3f000000UL,
>> -        .size = 0x01000000UL,
>> -        .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>> -             PTE_BLOCK_NON_SHARE |
>> -             PTE_BLOCK_PXN | PTE_BLOCK_UXN
>> -    }, {
>> -        /* List terminator */
>> -        0,
>> -    }
>> -};
>> -#else
>> -static struct mm_region bcm283x_mem_map[] = {
>> -    {
>> -        .virt = 0x00000000UL,
>> -        .phys = 0x00000000UL,
>> -        .size = 0xfe000000UL,
>> -        .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>> -             PTE_BLOCK_INNER_SHARE
>> -    }, {
>> -        .virt = 0xfe000000UL,
>> -        .phys = 0xfe000000UL,
>> -        .size = 0x01800000UL,
>> -        .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>> -             PTE_BLOCK_NON_SHARE |
>> -             PTE_BLOCK_PXN | PTE_BLOCK_UXN
>> -    }, {
>> -        /* List terminator */
>> -        0,
>> -    }
>> -};
>> -#endif
>> -struct mm_region *mem_map = bcm283x_mem_map;
>> -#endif
>> -
>>   int dram_init(void)
>>   {
>>       ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1);


More information about the U-Boot mailing list