Ver Fonte

hw/arm/omap2: Create the RAM in the board

The SDRAM is incorrectly created in the OMAP2420 SoC.
Move its creation in the board code, this will later allow the
board to have the QOM ownership of the RAM.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-id: 20191021190653.9511-5-philmd@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Philippe Mathieu-Daudé há 5 anos atrás
pai
commit
e285e8678e
3 ficheiros alterados com 13 adições e 14 exclusões
  1. 7 3
      hw/arm/nseries.c
  2. 5 8
      hw/arm/omap2.c
  3. 1 3
      include/hw/arm/omap.h

+ 7 - 3
hw/arm/nseries.c

@@ -47,6 +47,7 @@
 
 
 /* Nokia N8x0 support */
 /* Nokia N8x0 support */
 struct n800_s {
 struct n800_s {
+    MemoryRegion sdram;
     struct omap_mpu_state_s *mpu;
     struct omap_mpu_state_s *mpu;
 
 
     struct rfbi_chip_s blizzard;
     struct rfbi_chip_s blizzard;
@@ -1311,11 +1312,14 @@ static int n810_atag_setup(const struct arm_boot_info *info, void *p)
 static void n8x0_init(MachineState *machine,
 static void n8x0_init(MachineState *machine,
                       struct arm_boot_info *binfo, int model)
                       struct arm_boot_info *binfo, int model)
 {
 {
-    MemoryRegion *sysmem = get_system_memory();
     struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
     struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
-    int sdram_size = binfo->ram_size;
+    uint64_t sdram_size = binfo->ram_size;
 
 
-    s->mpu = omap2420_mpu_init(sysmem, sdram_size, machine->cpu_type);
+    memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
+                                         sdram_size);
+    memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram);
+
+    s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
 
 
     /* Setup peripherals
     /* Setup peripherals
      *
      *

+ 5 - 8
hw/arm/omap2.c

@@ -22,6 +22,7 @@
 #include "qemu/error-report.h"
 #include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
 #include "cpu.h"
 #include "cpu.h"
+#include "exec/address-spaces.h"
 #include "sysemu/blockdev.h"
 #include "sysemu/blockdev.h"
 #include "sysemu/qtest.h"
 #include "sysemu/qtest.h"
 #include "sysemu/reset.h"
 #include "sysemu/reset.h"
@@ -2276,8 +2277,7 @@ static const struct dma_irq_map omap2_dma_irq_map[] = {
     { 0, OMAP_INT_24XX_SDMA_IRQ3 },
     { 0, OMAP_INT_24XX_SDMA_IRQ3 },
 };
 };
 
 
-struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
-                unsigned long sdram_size,
+struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
                 const char *cpu_type)
                 const char *cpu_type)
 {
 {
     struct omap_mpu_state_s *s = g_new0(struct omap_mpu_state_s, 1);
     struct omap_mpu_state_s *s = g_new0(struct omap_mpu_state_s, 1);
@@ -2286,11 +2286,11 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
     int i;
     int i;
     SysBusDevice *busdev;
     SysBusDevice *busdev;
     struct omap_target_agent_s *ta;
     struct omap_target_agent_s *ta;
+    MemoryRegion *sysmem = get_system_memory();
 
 
     /* Core */
     /* Core */
     s->mpu_model = omap2420;
     s->mpu_model = omap2420;
     s->cpu = ARM_CPU(cpu_create(cpu_type));
     s->cpu = ARM_CPU(cpu_create(cpu_type));
-    s->sdram_size = sdram_size;
     s->sram_size = OMAP242X_SRAM_SIZE;
     s->sram_size = OMAP242X_SRAM_SIZE;
 
 
     s->wakeup = qemu_allocate_irq(omap_mpu_wakeup, s, 0);
     s->wakeup = qemu_allocate_irq(omap_mpu_wakeup, s, 0);
@@ -2299,9 +2299,6 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
     omap_clk_init(s);
     omap_clk_init(s);
 
 
     /* Memory-mapped stuff */
     /* Memory-mapped stuff */
-    memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
-                                         s->sdram_size);
-    memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram);
     memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size,
     memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size,
                            &error_fatal);
                            &error_fatal);
     memory_region_add_subregion(sysmem, OMAP2_SRAM_BASE, &s->sram);
     memory_region_add_subregion(sysmem, OMAP2_SRAM_BASE, &s->sram);
@@ -2338,8 +2335,8 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
     s->port->addr_valid = omap2_validate_addr;
     s->port->addr_valid = omap2_validate_addr;
 
 
     /* Register SDRAM and SRAM ports for fast DMA transfers.  */
     /* Register SDRAM and SRAM ports for fast DMA transfers.  */
-    soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->sdram),
-                         OMAP2_Q2_BASE, s->sdram_size);
+    soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(sdram),
+                         OMAP2_Q2_BASE, memory_region_size(sdram));
     soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->sram),
     soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->sram),
                          OMAP2_SRAM_BASE, s->sram_size);
                          OMAP2_SRAM_BASE, s->sram_size);
 
 

+ 1 - 3
include/hw/arm/omap.h

@@ -824,7 +824,6 @@ struct omap_mpu_state_s {
     MemoryRegion tap_iomem;
     MemoryRegion tap_iomem;
     MemoryRegion imif_ram;
     MemoryRegion imif_ram;
     MemoryRegion emiff_ram;
     MemoryRegion emiff_ram;
-    MemoryRegion sdram;
     MemoryRegion sram;
     MemoryRegion sram;
 
 
     struct omap_dma_port_if_s {
     struct omap_dma_port_if_s {
@@ -938,8 +937,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
                 const char *core);
                 const char *core);
 
 
 /* omap2.c */
 /* omap2.c */
-struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
-                unsigned long sdram_size,
+struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
                 const char *core);
                 const char *core);
 
 
 uint32_t omap_badwidth_read8(void *opaque, hwaddr addr);
 uint32_t omap_badwidth_read8(void *opaque, hwaddr addr);