diff mbox

[v2,22/22] petalogix-ml605: Make the LMB visible only to the CPU

Message ID 1387432293-17711-23-git-send-email-edgar.iglesias@gmail.com
State New
Headers show

Commit Message

Edgar E. Iglesias Dec. 19, 2013, 5:51 a.m. UTC
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 hw/microblaze/petalogix_ml605_mmu.c |   17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Peter Crosthwaite Dec. 19, 2013, 6:37 a.m. UTC | #1
On Thu, Dec 19, 2013 at 3:51 PM,  <edgar.iglesias@gmail.com> wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
>
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
>  hw/microblaze/petalogix_ml605_mmu.c |   17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
> index 4009ff5..0a13b0e 100644
> --- a/hw/microblaze/petalogix_ml605_mmu.c
> +++ b/hw/microblaze/petalogix_ml605_mmu.c
> @@ -88,10 +88,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
>      hwaddr ddr_base = MEMORY_BASEADDR;
>      MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
>      MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
> +    MemoryRegion *sysmem_alias = g_new(MemoryRegion, 1);
> +    MemoryRegion *mr_cpu_root = g_new(MemoryRegion, 1);
> +    AddressSpace *as_cpu = g_malloc0(sizeof(*as_cpu));
>      qemu_irq irq[32], *cpu_irq;
>
> +    /* Setup the CPU specific address-space.  */
> +    memory_region_init(mr_cpu_root, NULL, "as-cpu-root", INT64_MAX);
> +    address_space_init(as_cpu, mr_cpu_root, "as/cpu");
> +
>      /* init CPUs */
>      cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
> +    qdev_prop_set_address_space(DEVICE(cpu), "address-space", as_cpu);
>      object_property_set_bool(OBJECT(cpu), true, "realized", &err);
>      if (err) {
>          error_report("%s", error_get_pretty(err));
> @@ -100,11 +108,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
>
>      env = &cpu->env;
>
> +    /* Populate the CPU AS with the LMB only visible to the CPU.  */
> +    memory_region_init_alias(sysmem_alias, NULL, "sysmem_alias",
> +                             address_space_mem, 0,
> +                             memory_region_size(address_space_mem));

Can we patch sysbus MMIO APIs to accept an AS to remove the machine's
reliance on the global address_space_mem completely?

Regards,
Peter

> +    memory_region_add_subregion(mr_cpu_root, 0x00000000, sysmem_alias);
> +
>      /* Attach emulated BRAM through the LMB.  */
>      memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
>                             LMB_BRAM_SIZE);
>      vmstate_register_ram_global(phys_lmb_bram);
> -    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
> +    memory_region_add_subregion_overlap(mr_cpu_root, 0x00000000,
> +                                        phys_lmb_bram, 2);
>
>      memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
>      vmstate_register_ram_global(phys_ram);
> --
> 1.7.10.4
>
>
Edgar E. Iglesias Dec. 19, 2013, 7:10 a.m. UTC | #2
On Thu, Dec 19, 2013 at 04:37:22PM +1000, Peter Crosthwaite wrote:
> On Thu, Dec 19, 2013 at 3:51 PM,  <edgar.iglesias@gmail.com> wrote:
> > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> >
> > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> > ---
> >  hw/microblaze/petalogix_ml605_mmu.c |   17 ++++++++++++++++-
> >  1 file changed, 16 insertions(+), 1 deletion(-)
> >
> > diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
> > index 4009ff5..0a13b0e 100644
> > --- a/hw/microblaze/petalogix_ml605_mmu.c
> > +++ b/hw/microblaze/petalogix_ml605_mmu.c
> > @@ -88,10 +88,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
> >      hwaddr ddr_base = MEMORY_BASEADDR;
> >      MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
> >      MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
> > +    MemoryRegion *sysmem_alias = g_new(MemoryRegion, 1);
> > +    MemoryRegion *mr_cpu_root = g_new(MemoryRegion, 1);
> > +    AddressSpace *as_cpu = g_malloc0(sizeof(*as_cpu));
> >      qemu_irq irq[32], *cpu_irq;
> >
> > +    /* Setup the CPU specific address-space.  */
> > +    memory_region_init(mr_cpu_root, NULL, "as-cpu-root", INT64_MAX);
> > +    address_space_init(as_cpu, mr_cpu_root, "as/cpu");
> > +
> >      /* init CPUs */
> >      cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
> > +    qdev_prop_set_address_space(DEVICE(cpu), "address-space", as_cpu);
> >      object_property_set_bool(OBJECT(cpu), true, "realized", &err);
> >      if (err) {
> >          error_report("%s", error_get_pretty(err));
> > @@ -100,11 +108,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
> >
> >      env = &cpu->env;
> >
> > +    /* Populate the CPU AS with the LMB only visible to the CPU.  */
> > +    memory_region_init_alias(sysmem_alias, NULL, "sysmem_alias",
> > +                             address_space_mem, 0,
> > +                             memory_region_size(address_space_mem));
> 
> Can we patch sysbus MMIO APIs to accept an AS to remove the machine's
> reliance on the global address_space_mem completely?

Yes good point, thats part of the future work that needs to be done. I've split
the stuff into multiple rounds as the patch series will be easily become
unmanageable with stuff that touches big parts of the tree.

Thanks,
Edgar


> 
> Regards,
> Peter
> 
> > +    memory_region_add_subregion(mr_cpu_root, 0x00000000, sysmem_alias);
> > +
> >      /* Attach emulated BRAM through the LMB.  */
> >      memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
> >                             LMB_BRAM_SIZE);
> >      vmstate_register_ram_global(phys_lmb_bram);
> > -    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
> > +    memory_region_add_subregion_overlap(mr_cpu_root, 0x00000000,
> > +                                        phys_lmb_bram, 2);
> >
> >      memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
> >      vmstate_register_ram_global(phys_ram);
> > --
> > 1.7.10.4
> >
> >
Peter Crosthwaite Dec. 19, 2013, 12:46 p.m. UTC | #3
On Thu, Dec 19, 2013 at 5:10 PM, Edgar E. Iglesias
<edgar.iglesias@gmail.com> wrote:
> On Thu, Dec 19, 2013 at 04:37:22PM +1000, Peter Crosthwaite wrote:
>> On Thu, Dec 19, 2013 at 3:51 PM,  <edgar.iglesias@gmail.com> wrote:
>> > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
>> >
>> > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
>> > ---
>> >  hw/microblaze/petalogix_ml605_mmu.c |   17 ++++++++++++++++-
>> >  1 file changed, 16 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
>> > index 4009ff5..0a13b0e 100644
>> > --- a/hw/microblaze/petalogix_ml605_mmu.c
>> > +++ b/hw/microblaze/petalogix_ml605_mmu.c
>> > @@ -88,10 +88,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
>> >      hwaddr ddr_base = MEMORY_BASEADDR;
>> >      MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
>> >      MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
>> > +    MemoryRegion *sysmem_alias = g_new(MemoryRegion, 1);
>> > +    MemoryRegion *mr_cpu_root = g_new(MemoryRegion, 1);
>> > +    AddressSpace *as_cpu = g_malloc0(sizeof(*as_cpu));
>> >      qemu_irq irq[32], *cpu_irq;
>> >
>> > +    /* Setup the CPU specific address-space.  */
>> > +    memory_region_init(mr_cpu_root, NULL, "as-cpu-root", INT64_MAX);
>> > +    address_space_init(as_cpu, mr_cpu_root, "as/cpu");
>> > +
>> >      /* init CPUs */
>> >      cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
>> > +    qdev_prop_set_address_space(DEVICE(cpu), "address-space", as_cpu);
>> >      object_property_set_bool(OBJECT(cpu), true, "realized", &err);
>> >      if (err) {
>> >          error_report("%s", error_get_pretty(err));
>> > @@ -100,11 +108,18 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
>> >
>> >      env = &cpu->env;
>> >
>> > +    /* Populate the CPU AS with the LMB only visible to the CPU.  */
>> > +    memory_region_init_alias(sysmem_alias, NULL, "sysmem_alias",
>> > +                             address_space_mem, 0,
>> > +                             memory_region_size(address_space_mem));
>>
>> Can we patch sysbus MMIO APIs to accept an AS to remove the machine's
>> reliance on the global address_space_mem completely?
>
> Yes good point, thats part of the future work that needs to be done. I've split
> the stuff into multiple rounds as the patch series will be easily become
> unmanageable with stuff that touches big parts of the tree.
>

Playing with this too see where it goes. Patches tmrw hopefully.

Regards,
Peter

> Thanks,
> Edgar
>
>
>>
>> Regards,
>> Peter
>>
>> > +    memory_region_add_subregion(mr_cpu_root, 0x00000000, sysmem_alias);
>> > +
>> >      /* Attach emulated BRAM through the LMB.  */
>> >      memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
>> >                             LMB_BRAM_SIZE);
>> >      vmstate_register_ram_global(phys_lmb_bram);
>> > -    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
>> > +    memory_region_add_subregion_overlap(mr_cpu_root, 0x00000000,
>> > +                                        phys_lmb_bram, 2);
>> >
>> >      memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
>> >      vmstate_register_ram_global(phys_ram);
>> > --
>> > 1.7.10.4
>> >
>> >
>
diff mbox

Patch

diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 4009ff5..0a13b0e 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -88,10 +88,18 @@  petalogix_ml605_init(QEMUMachineInitArgs *args)
     hwaddr ddr_base = MEMORY_BASEADDR;
     MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
     MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
+    MemoryRegion *sysmem_alias = g_new(MemoryRegion, 1);
+    MemoryRegion *mr_cpu_root = g_new(MemoryRegion, 1);
+    AddressSpace *as_cpu = g_malloc0(sizeof(*as_cpu));
     qemu_irq irq[32], *cpu_irq;
 
+    /* Setup the CPU specific address-space.  */
+    memory_region_init(mr_cpu_root, NULL, "as-cpu-root", INT64_MAX);
+    address_space_init(as_cpu, mr_cpu_root, "as/cpu");
+
     /* init CPUs */
     cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
+    qdev_prop_set_address_space(DEVICE(cpu), "address-space", as_cpu);
     object_property_set_bool(OBJECT(cpu), true, "realized", &err);
     if (err) {
         error_report("%s", error_get_pretty(err));
@@ -100,11 +108,18 @@  petalogix_ml605_init(QEMUMachineInitArgs *args)
 
     env = &cpu->env;
 
+    /* Populate the CPU AS with the LMB only visible to the CPU.  */
+    memory_region_init_alias(sysmem_alias, NULL, "sysmem_alias",
+                             address_space_mem, 0,
+                             memory_region_size(address_space_mem));
+    memory_region_add_subregion(mr_cpu_root, 0x00000000, sysmem_alias);
+
     /* Attach emulated BRAM through the LMB.  */
     memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
                            LMB_BRAM_SIZE);
     vmstate_register_ram_global(phys_lmb_bram);
-    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
+    memory_region_add_subregion_overlap(mr_cpu_root, 0x00000000,
+                                        phys_lmb_bram, 2);
 
     memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
     vmstate_register_ram_global(phys_ram);