>From b3dc8992bbea0358752efdd8ca8803c8f150f083 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Tue, 23 Oct 2012 18:26:51 +0100 Subject: [PATCH] dma: Define dma_context_memory and use by default 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. [PC] Use this dma context by default if NULL is passed to the dma API for DMAContext *dma Signed-off-by: Peter Maydell Signed-off-by: Peter Crosthwaite --- dma.h | 17 +++++++++++++++++ exec.c | 5 +++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/dma.h b/dma.h index 91ccdb5..defed50 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) { /* @@ -107,6 +112,9 @@ static inline bool dma_memory_valid(DMAContext *dma, dma_addr_t addr, dma_addr_t len, DMADirection dir) { + if (!dma) { + dma = &dma_context_memory; + } if (!dma_has_iommu(dma)) { return true; } else { @@ -120,6 +128,9 @@ static inline int dma_memory_rw_relaxed(DMAContext *dma, dma_addr_t addr, void *buf, dma_addr_t len, DMADirection dir) { + if (!dma) { + dma = &dma_context_memory; + } if (!dma_has_iommu(dma)) { /* Fast-path for no IOMMU */ address_space_rw(dma->as, addr, buf, len, dir == DMA_DIRECTION_FROM_DEVICE); @@ -176,6 +187,9 @@ static inline void *dma_memory_map(DMAContext *dma, dma_addr_t addr, dma_addr_t *len, DMADirection dir) { + if (!dma) { + dma = &dma_context_memory; + } if (!dma_has_iommu(dma)) { hwaddr xlen = *len; void *p; @@ -195,6 +209,9 @@ static inline void dma_memory_unmap(DMAContext *dma, void *buffer, dma_addr_t len, DMADirection dir, dma_addr_t access_len) { + if (!dma) { + dma = &dma_context_memory; + } if (!dma_has_iommu(dma)) { address_space_unmap(dma->as, buffer, (hwaddr)len, dir == DMA_DIRECTION_FROM_DEVICE, access_len); diff --git a/exec.c b/exec.c index b0ed593..d2f6e79 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 @@ -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) -- 1.7.0.4