[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] dma: Define dma_context_memory and use in sysbu
From: |
Peter Crosthwaite |
Subject: |
Re: [Qemu-devel] [PATCH] dma: Define dma_context_memory and use in sysbus-ohci |
Date: |
Thu, 25 Oct 2012 20:33:13 +1000 |
On Oct 24, 2012 3:27 AM, "Peter Maydell" <address@hidden> wrote:
>
> Define a new global dma_context_memory which is a DMAContext corresponding
> to the global address_space_memory AddressSpace. This can be used by
> sysbus peripherals like sysbus-ohci which need to do DMA.
>
> In particular, use it in the sysbus-ohci device, which fixes a
> segfault when attempting to use that device.
>
> Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Peter Crosthwaite <address@hidden>
> ---
> As suggested by Avi. I could have split this patch into one defining
> the new global and one actually using it, but since the hcd-ohci
> change would be a one-liner it didn't seem worthwhile.
>
> dma.h | 5 +++++
> exec.c | 5 +++++
> hw/usb/hcd-ohci.c | 2 +-
> 3 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/dma.h b/dma.h
> index 1bd6f4a..f7cf5e7 100644
> --- a/dma.h
> +++ b/dma.h
> @@ -68,6 +68,11 @@ struct DMAContext {
> DMAUnmapFunc *unmap;
> };
>
> +/* A global DMA context corresponding to the address_space_memory
> + * AddressSpace, for sysbus devices which do DMA.
> + */
> +extern DMAContext dma_context_memory;
> +
> static inline void dma_barrier(DMAContext *dma, DMADirection dir)
> {
> /*
> diff --git a/exec.c b/exec.c
> index 750008c..a59ed31 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -34,6 +34,7 @@
> #include "hw/xen.h"
> #include "qemu-timer.h"
> #include "memory.h"
> +#include "dma.h"
> #include "exec-memory.h"
> #if defined(CONFIG_USER_ONLY)
> #include <qemu.h>
> @@ -103,6 +104,7 @@ static MemoryRegion *system_io;
>
> AddressSpace address_space_io;
> AddressSpace address_space_memory;
> +DMAContext dma_context_memory;
>
> MemoryRegion io_mem_ram, io_mem_rom, io_mem_unassigned, io_mem_notdirty;
> static MemoryRegion io_mem_subpage_ram;
> @@ -3276,6 +3278,9 @@ static void memory_map_init(void)
> memory_listener_register(&core_memory_listener, &address_space_memory);
> memory_listener_register(&io_memory_listener, &address_space_io);
> memory_listener_register(&tcg_memory_listener, &address_space_memory);
> +
> + dma_context_init(&dma_context_memory, &address_space_memory,
> + NULL, NULL, NULL);
> }
>
> MemoryRegion *get_system_memory(void)
> diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
> index 59c7055..eb1cb70 100644
> --- a/hw/usb/hcd-ohci.c
> +++ b/hw/usb/hcd-ohci.c
> @@ -1846,7 +1846,7 @@ static int ohci_init_pxa(SysBusDevice *dev)
>
> /* Cannot fail as we pass NULL for masterbus */
> usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset, NULL, 0,
> - NULL);
> + &dma_context_memory);
> sysbus_init_irq(dev, &s->ohci.irq);
> sysbus_init_mmio(dev, &s->ohci.mem);
>
> --
> 1.7.9.5
>
>