Patchwork [22/23] sysbus: add MemoryRegion based memory management API

login
register
mail settings
Submitter Avi Kivity
Date July 25, 2011, 2:03 p.m.
Message ID <1311602584-23409-23-git-send-email-avi@redhat.com>
Download mbox | patch
Permalink /patch/106683/
State New
Headers show

Comments

Avi Kivity - July 25, 2011, 2:03 p.m.
Allow registering sysbus device memory using a MemoryRegion.  Once all users
are converted, sysbus_init_mmio() and sysbus_init_mmio_cb() will be removed.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 hw/sysbus.c |   27 ++++++++++++++++++++++++---
 hw/sysbus.h |    3 +++
 2 files changed, 27 insertions(+), 3 deletions(-)
Anthony Liguori - July 25, 2011, 8:21 p.m.
On 07/25/2011 09:03 AM, Avi Kivity wrote:
> Allow registering sysbus device memory using a MemoryRegion.  Once all users
> are converted, sysbus_init_mmio() and sysbus_init_mmio_cb() will be removed.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>   hw/sysbus.c |   27 ++++++++++++++++++++++++---
>   hw/sysbus.h |    3 +++
>   2 files changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/hw/sysbus.c b/hw/sysbus.c
> index 2e22be7..ea442ac 100644
> --- a/hw/sysbus.c
> +++ b/hw/sysbus.c
> @@ -19,6 +19,7 @@
>
>   #include "sysbus.h"
>   #include "monitor.h"
> +#include "exec-memory.h"
>
>   static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent);
>   static char *sysbus_get_fw_dev_path(DeviceState *dev);
> @@ -49,11 +50,20 @@ void sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr)
>       }
>       if (dev->mmio[n].addr != (target_phys_addr_t)-1) {
>           /* Unregister previous mapping.  */
> -        cpu_register_physical_memory(dev->mmio[n].addr, dev->mmio[n].size,
> -                                     IO_MEM_UNASSIGNED);
> +        if (dev->mmio[n].memory) {
> +            memory_region_del_subregion(get_system_memory(),
> +                                        dev->mmio[n].memory);
> +        } else {
> +            cpu_register_physical_memory(dev->mmio[n].addr, dev->mmio[n].size,
> +                                         IO_MEM_UNASSIGNED);
> +        }
>       }
>       dev->mmio[n].addr = addr;
> -    if (dev->mmio[n].cb) {
> +    if (dev->mmio[n].memory) {
> +        memory_region_add_subregion(get_system_memory(),
> +                                    addr,
> +                                    dev->mmio[n].memory);
> +    } else if (dev->mmio[n].cb) {
>           dev->mmio[n].cb(dev, addr);
>       } else {
>           cpu_register_physical_memory(addr, dev->mmio[n].size,
> @@ -107,6 +117,17 @@ void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
>       dev->mmio[n].cb = cb;
>   }
>
> +void sysbus_init_mmio_region(SysBusDevice *dev, MemoryRegion *memory)
> +{
> +    int n;
> +
> +    assert(dev->num_mmio<  QDEV_MAX_MMIO);
> +    n = dev->num_mmio++;
> +    dev->mmio[n].addr = -1;
> +    dev->mmio[n].size = memory_region_size(memory);
> +    dev->mmio[n].memory = memory;
> +}
> +
>   void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size)
>   {
>       pio_addr_t i;
> diff --git a/hw/sysbus.h b/hw/sysbus.h
> index 4e8cb16..5f62e2d 100644
> --- a/hw/sysbus.h
> +++ b/hw/sysbus.h
> @@ -4,6 +4,7 @@
>   /* Devices attached directly to the main system bus.  */
>
>   #include "qdev.h"
> +#include "memory.h"
>
>   #define QDEV_MAX_MMIO 32
>   #define QDEV_MAX_PIO 32
> @@ -23,6 +24,7 @@ struct SysBusDevice {
>           target_phys_addr_t size;
>           mmio_mapfunc cb;
>           ram_addr_t iofunc;
> +        MemoryRegion *memory;
>       } mmio[QDEV_MAX_MMIO];
>       int num_pio;
>       pio_addr_t pio[QDEV_MAX_PIO];
> @@ -46,6 +48,7 @@ void sysbus_init_mmio(SysBusDevice *dev, target_phys_addr_t size,
>                         ram_addr_t iofunc);
>   void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
>                               mmio_mapfunc cb);
> +void sysbus_init_mmio_region(SysBusDevice *dev, MemoryRegion *memory);
>   void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
>   void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
>   void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);

Patch

diff --git a/hw/sysbus.c b/hw/sysbus.c
index 2e22be7..ea442ac 100644
--- a/hw/sysbus.c
+++ b/hw/sysbus.c
@@ -19,6 +19,7 @@ 
 
 #include "sysbus.h"
 #include "monitor.h"
+#include "exec-memory.h"
 
 static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent);
 static char *sysbus_get_fw_dev_path(DeviceState *dev);
@@ -49,11 +50,20 @@  void sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr)
     }
     if (dev->mmio[n].addr != (target_phys_addr_t)-1) {
         /* Unregister previous mapping.  */
-        cpu_register_physical_memory(dev->mmio[n].addr, dev->mmio[n].size,
-                                     IO_MEM_UNASSIGNED);
+        if (dev->mmio[n].memory) {
+            memory_region_del_subregion(get_system_memory(),
+                                        dev->mmio[n].memory);
+        } else {
+            cpu_register_physical_memory(dev->mmio[n].addr, dev->mmio[n].size,
+                                         IO_MEM_UNASSIGNED);
+        }
     }
     dev->mmio[n].addr = addr;
-    if (dev->mmio[n].cb) {
+    if (dev->mmio[n].memory) {
+        memory_region_add_subregion(get_system_memory(),
+                                    addr,
+                                    dev->mmio[n].memory);
+    } else if (dev->mmio[n].cb) {
         dev->mmio[n].cb(dev, addr);
     } else {
         cpu_register_physical_memory(addr, dev->mmio[n].size,
@@ -107,6 +117,17 @@  void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
     dev->mmio[n].cb = cb;
 }
 
+void sysbus_init_mmio_region(SysBusDevice *dev, MemoryRegion *memory)
+{
+    int n;
+
+    assert(dev->num_mmio < QDEV_MAX_MMIO);
+    n = dev->num_mmio++;
+    dev->mmio[n].addr = -1;
+    dev->mmio[n].size = memory_region_size(memory);
+    dev->mmio[n].memory = memory;
+}
+
 void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size)
 {
     pio_addr_t i;
diff --git a/hw/sysbus.h b/hw/sysbus.h
index 4e8cb16..5f62e2d 100644
--- a/hw/sysbus.h
+++ b/hw/sysbus.h
@@ -4,6 +4,7 @@ 
 /* Devices attached directly to the main system bus.  */
 
 #include "qdev.h"
+#include "memory.h"
 
 #define QDEV_MAX_MMIO 32
 #define QDEV_MAX_PIO 32
@@ -23,6 +24,7 @@  struct SysBusDevice {
         target_phys_addr_t size;
         mmio_mapfunc cb;
         ram_addr_t iofunc;
+        MemoryRegion *memory;
     } mmio[QDEV_MAX_MMIO];
     int num_pio;
     pio_addr_t pio[QDEV_MAX_PIO];
@@ -46,6 +48,7 @@  void sysbus_init_mmio(SysBusDevice *dev, target_phys_addr_t size,
                       ram_addr_t iofunc);
 void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
                             mmio_mapfunc cb);
+void sysbus_init_mmio_region(SysBusDevice *dev, MemoryRegion *memory);
 void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
 void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
 void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);