[U-Boot,v3,4/4] ARM: bcm283x: Set memory map at run-time
diff mbox series

Message ID 20191112110029.847-5-matthias.bgg@kernel.org
State Superseded
Delegated to: Matthias Brugger
Headers show
Series
  • RPi one binary for RPi3/4 and RPi1/2
Related show

Commit Message

Matthias Brugger Nov. 12, 2019, 11 a.m. UTC
From: Matthias Brugger <mbrugger@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@suse.com>

---

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(-)

Comments

Alexander Graf Nov. 13, 2019, 10:44 a.m. UTC | #1
On 12.11.19 13:00, matthias.bgg@kernel.org wrote:
> From: Matthias Brugger <mbrugger@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@suse.com>


For the future, can you think of a reason why we could not always 
generate the map at runtime?


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);
Matthias Brugger Nov. 13, 2019, 10:49 a.m. UTC | #2
On 13/11/2019 11:44, Alexander Graf wrote:
> 
> On 12.11.19 13:00, matthias.bgg@kernel.org wrote:
>> From: Matthias Brugger <mbrugger@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@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);

Patch
diff mbox series

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);