diff mbox series

hw/arm/vexpress-a9: Remove useless mapping of RAM at address 0

Message ID 20231103185602.875849-1-peter.maydell@linaro.org
State Superseded
Headers show
Series hw/arm/vexpress-a9: Remove useless mapping of RAM at address 0 | expand

Commit Message

Peter Maydell Nov. 3, 2023, 6:56 p.m. UTC
On the vexpress-a9 board we try to map both RAM and flash to address 0,
as seen in "info mtree":

address-space: memory
  0000000000000000-ffffffffffffffff (prio 0, i/o): system
    0000000000000000-0000000003ffffff (prio 0, romd): alias vexpress.flashalias @vexpress.flash0 0000000000000000-0000000003ffffff
    0000000000000000-0000000003ffffff (prio 0, ram): alias vexpress.lowmem @vexpress.highmem 0000000000000000-0000000003ffffff
    0000000010000000-0000000010000fff (prio 0, i/o): arm-sysctl
    0000000010004000-0000000010004fff (prio 0, i/o): pl041
(etc)

The flash "wins" and the RAM mapping is useless (but also harmless).

This happened as a result of commit 6ec1588e in 2014, which changed
"we always map the RAM to the low addresses for vexpress-a9" to "we
always map flash in the low addresses", but forgot to stop mapping
the RAM.

In real hardware, this low part of memory is remappable, both at
runtime by the guest writing to a control register, and configurably
as to what you get out of reset -- you can have the first flash
device, or the second, or the DDR2 RAM, or the external AXI bus
(which for QEMU means "nothing there").  In an ideal world we would
support that remapping both at runtime and via a machine property to
select the out-of-reset behaviour.

Pending anybody caring enough to implement the full remapping
behaviour:
 * remove the useless mapped-but-inaccessible lowram MR
 * document that QEMU doesn't support remapping of low memory

Fixes: 6ec1588e ("hw/arm/vexpress: Alias NOR flash at 0 for vexpress-a9")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1761
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 docs/system/arm/vexpress.rst |  3 +++
 hw/arm/vexpress.c            | 14 +++-----------
 2 files changed, 6 insertions(+), 11 deletions(-)

Comments

Philippe Mathieu-Daudé Nov. 5, 2023, 5:13 p.m. UTC | #1
On 3/11/23 19:56, Peter Maydell wrote:
> On the vexpress-a9 board we try to map both RAM and flash to address 0,
> as seen in "info mtree":
> 
> address-space: memory
>    0000000000000000-ffffffffffffffff (prio 0, i/o): system
>      0000000000000000-0000000003ffffff (prio 0, romd): alias vexpress.flashalias @vexpress.flash0 0000000000000000-0000000003ffffff
>      0000000000000000-0000000003ffffff (prio 0, ram): alias vexpress.lowmem @vexpress.highmem 0000000000000000-0000000003ffffff
>      0000000010000000-0000000010000fff (prio 0, i/o): arm-sysctl
>      0000000010004000-0000000010004fff (prio 0, i/o): pl041
> (etc)
> 
> The flash "wins" and the RAM mapping is useless (but also harmless).
> 
> This happened as a result of commit 6ec1588e in 2014, which changed
> "we always map the RAM to the low addresses for vexpress-a9" to "we
> always map flash in the low addresses", but forgot to stop mapping
> the RAM.
> 
> In real hardware, this low part of memory is remappable, both at
> runtime by the guest writing to a control register, and configurably
> as to what you get out of reset -- you can have the first flash
> device, or the second, or the DDR2 RAM, or the external AXI bus
> (which for QEMU means "nothing there").  In an ideal world we would
> support that remapping both at runtime and via a machine property to
> select the out-of-reset behaviour.
> 
> Pending anybody caring enough to implement the full remapping
> behaviour:
>   * remove the useless mapped-but-inaccessible lowram MR
>   * document that QEMU doesn't support remapping of low memory
> 
> Fixes: 6ec1588e ("hw/arm/vexpress: Alias NOR flash at 0 for vexpress-a9")
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1761
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   docs/system/arm/vexpress.rst |  3 +++
>   hw/arm/vexpress.c            | 14 +++-----------
>   2 files changed, 6 insertions(+), 11 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Richard Henderson Nov. 5, 2023, 5:33 p.m. UTC | #2
On 11/3/23 11:56, Peter Maydell wrote:
> On the vexpress-a9 board we try to map both RAM and flash to address 0,
> as seen in "info mtree":
> 
> address-space: memory
>    0000000000000000-ffffffffffffffff (prio 0, i/o): system
>      0000000000000000-0000000003ffffff (prio 0, romd): alias vexpress.flashalias @vexpress.flash0 0000000000000000-0000000003ffffff
>      0000000000000000-0000000003ffffff (prio 0, ram): alias vexpress.lowmem @vexpress.highmem 0000000000000000-0000000003ffffff
>      0000000010000000-0000000010000fff (prio 0, i/o): arm-sysctl
>      0000000010004000-0000000010004fff (prio 0, i/o): pl041
> (etc)
> 
> The flash "wins" and the RAM mapping is useless (but also harmless).
> 
> This happened as a result of commit 6ec1588e in 2014, which changed
> "we always map the RAM to the low addresses for vexpress-a9" to "we
> always map flash in the low addresses", but forgot to stop mapping
> the RAM.
> 
> In real hardware, this low part of memory is remappable, both at
> runtime by the guest writing to a control register, and configurably
> as to what you get out of reset -- you can have the first flash
> device, or the second, or the DDR2 RAM, or the external AXI bus
> (which for QEMU means "nothing there").  In an ideal world we would
> support that remapping both at runtime and via a machine property to
> select the out-of-reset behaviour.
> 
> Pending anybody caring enough to implement the full remapping
> behaviour:
>   * remove the useless mapped-but-inaccessible lowram MR
>   * document that QEMU doesn't support remapping of low memory
> 
> Fixes: 6ec1588e ("hw/arm/vexpress: Alias NOR flash at 0 for vexpress-a9")
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1761
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
diff mbox series

Patch

diff --git a/docs/system/arm/vexpress.rst b/docs/system/arm/vexpress.rst
index 3e3839e9231..38f29c73e71 100644
--- a/docs/system/arm/vexpress.rst
+++ b/docs/system/arm/vexpress.rst
@@ -58,6 +58,9 @@  Other differences between the hardware and the QEMU model:
   ``vexpress-a15``, and have IRQs from 40 upwards. If a dtb is
   provided on the command line then QEMU will edit it to include
   suitable entries describing these transports for the guest.
+- QEMU does not currently support either dynamic or static remapping
+  of the area of memory at address 0: it is always mapped to alias
+  the first flash bank
 
 Booting a Linux kernel
 ----------------------
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 8ff37f52ca1..c08ea34e924 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -177,7 +177,6 @@  struct VexpressMachineState {
     MemoryRegion vram;
     MemoryRegion sram;
     MemoryRegion flashalias;
-    MemoryRegion lowram;
     MemoryRegion a15sram;
     bool secure;
     bool virt;
@@ -276,7 +275,6 @@  static void a9_daughterboard_init(VexpressMachineState *vms,
 {
     MachineState *machine = MACHINE(vms);
     MemoryRegion *sysmem = get_system_memory();
-    ram_addr_t low_ram_size;
 
     if (ram_size > 0x40000000) {
         /* 1GB is the maximum the address space permits */
@@ -284,17 +282,11 @@  static void a9_daughterboard_init(VexpressMachineState *vms,
         exit(1);
     }
 
-    low_ram_size = ram_size;
-    if (low_ram_size > 0x4000000) {
-        low_ram_size = 0x4000000;
-    }
-    /* RAM is from 0x60000000 upwards. The bottom 64MB of the
+    /*
+     * RAM is from 0x60000000 upwards. The bottom 64MB of the
      * address space should in theory be remappable to various
-     * things including ROM or RAM; we always map the RAM there.
+     * things including ROM or RAM; we always map the flash there.
      */
-    memory_region_init_alias(&vms->lowram, NULL, "vexpress.lowmem",
-                             machine->ram, 0, low_ram_size);
-    memory_region_add_subregion(sysmem, 0x0, &vms->lowram);
     memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
 
     /* 0x1e000000 A9MPCore (SCU) private memory region */