diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2022-01-18 15:06:08 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2022-01-18 15:06:08 +0000 |
| commit | 8b846207151955a7d4de2d33d07645991824e345 (patch) | |
| tree | d9e80da7eb15170d386d6555f24f6b422b0bd732 /include | |
| parent | 6621441db50d5bae7e34dbd04bf3c57a27a71b32 (diff) | |
| parent | 9d696cd50442327fd71ec7309e7b0c6fee693b1d (diff) | |
| download | focaccia-qemu-8b846207151955a7d4de2d33d07645991824e345.tar.gz focaccia-qemu-8b846207151955a7d4de2d33d07645991824e345.zip | |
Merge remote-tracking branch 'remotes/philmd/tags/memory-api-20220118' into staging
Memory API patches - Directly dispatch MemoryRegion alias accesses - Remove duplicated Address Space information in 'info mtree' - Cleanups around memory_region_is_mapped() - Fix incorrect calls of log_global_start/stop() - Use dma_addr_t type definition when relevant - Let dma_buf_read() / dma_buf_write() propagate MemTxResult - Clarify MemoryRegion aliases documentation # gpg: Signature made Tue 18 Jan 2022 12:01:10 GMT # gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE # gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: FAAB E75E 1291 7221 DCFD 6BB2 E3E3 2C2C DEAD C0DE * remotes/philmd/tags/memory-api-20220118: docs/devel: add some clarifying text for aliases hw/dma: Let dma_buf_read() / dma_buf_write() propagate MemTxResult hw/dma: Use dma_addr_t type definition when relevant hw/dma: Move ScatterGatherEntry / QEMUSGList declarations around hw/dma: Fix format string issues using dma_addr_t hw/scsi: Rename SCSIRequest::resid as 'residual' hw/rdma/rdma_utils: Rename rdma_pci_dma_map 'len' argument hw/dma: Remove CONFIG_USER_ONLY check hw/pci: Document pci_dma_map() hw/pci: Restrict pci-bus stub to sysemu hw/nvram: Restrict fw_cfg QOM interface to sysemu and tools stubs: Restrict fw_cfg to system emulation memory: Fix incorrect calls of log_global_start/stop memory: Update description of memory_region_is_mapped() memory: Make memory_region_is_mapped() succeed when mapped via an alias machine: Use host_memory_backend_is_mapped() in machine_consume_memdev() memory: Have 'info mtree' remove duplicated Address Space information memory: Split mtree_info() as mtree_info_flatview() + mtree_info_as() memory: Directly dispatch alias accesses on origin memory region Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/exec/memory.h | 4 | ||||
| -rw-r--r-- | include/hw/pci/pci.h | 12 | ||||
| -rw-r--r-- | include/hw/scsi/scsi.h | 4 | ||||
| -rw-r--r-- | include/sysemu/dma.h | 31 |
4 files changed, 32 insertions, 19 deletions
diff --git a/include/exec/memory.h b/include/exec/memory.h index 20f1b27377..63be794a06 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -738,6 +738,7 @@ struct MemoryRegion { const MemoryRegionOps *ops; void *opaque; MemoryRegion *container; + int mapped_via_alias; /* Mapped via an alias, container might be NULL */ Int128 size; hwaddr addr; void (*destructor)(MemoryRegion *mr); @@ -2296,7 +2297,8 @@ bool memory_region_present(MemoryRegion *container, hwaddr addr); /** * memory_region_is_mapped: returns true if #MemoryRegion is mapped - * into any address space. + * into another memory region, which does not necessarily imply that it is + * mapped into an address space. * * @mr: a #MemoryRegion which should be checked if it's mapped */ diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index 483d5c7c72..023abc0f79 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -881,6 +881,18 @@ PCI_DMA_DEFINE_LDST(q_be, q_be, 64); #undef PCI_DMA_DEFINE_LDST +/** + * pci_dma_map: Map device PCI address space range into host virtual address + * @dev: #PCIDevice to be accessed + * @addr: address within that device's address space + * @plen: pointer to length of buffer; updated on return to indicate + * if only a subset of the requested range has been mapped + * @dir: indicates the transfer direction + * + * Return: A host pointer, or %NULL if the resources needed to + * perform the mapping are exhausted (in that case *@plen + * is set to zero). + */ static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t *plen, DMADirection dir) { diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index 2ef80af6dc..1ffb367f94 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -30,7 +30,7 @@ struct SCSIRequest { int16_t status; int16_t host_status; void *hba_private; - size_t resid; + uint64_t residual; SCSICommand cmd; NotifierList cancel_notifiers; @@ -125,7 +125,7 @@ struct SCSIBusInfo { void *hba_private); void (*transfer_data)(SCSIRequest *req, uint32_t arg); void (*fail)(SCSIRequest *req); - void (*complete)(SCSIRequest *req, size_t resid); + void (*complete)(SCSIRequest *req, size_t residual); void (*cancel)(SCSIRequest *req); void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense); QEMUSGList *(*get_sg_list)(SCSIRequest *req); diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h index b3faef41b2..a1ac5bc1b5 100644 --- a/include/sysemu/dma.h +++ b/include/sysemu/dma.h @@ -15,24 +15,11 @@ #include "block/block.h" #include "block/accounting.h" -typedef struct ScatterGatherEntry ScatterGatherEntry; - typedef enum { DMA_DIRECTION_TO_DEVICE = 0, DMA_DIRECTION_FROM_DEVICE = 1, } DMADirection; -struct QEMUSGList { - ScatterGatherEntry *sg; - int nsg; - int nalloc; - size_t size; - DeviceState *dev; - AddressSpace *as; -}; - -#ifndef CONFIG_USER_ONLY - /* * When an IOMMU is present, bus addresses become distinct from * CPU/memory physical addresses and may be a different size. Because @@ -45,6 +32,17 @@ typedef uint64_t dma_addr_t; #define DMA_ADDR_BITS 64 #define DMA_ADDR_FMT "%" PRIx64 +typedef struct ScatterGatherEntry ScatterGatherEntry; + +struct QEMUSGList { + ScatterGatherEntry *sg; + int nsg; + int nalloc; + dma_addr_t size; + DeviceState *dev; + AddressSpace *as; +}; + static inline void dma_barrier(AddressSpace *as, DMADirection dir) { /* @@ -288,7 +286,6 @@ void qemu_sglist_init(QEMUSGList *qsg, DeviceState *dev, int alloc_hint, AddressSpace *as); void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len); void qemu_sglist_destroy(QEMUSGList *qsg); -#endif typedef BlockAIOCB *DMAIOFunc(int64_t offset, QEMUIOVector *iov, BlockCompletionFunc *cb, void *cb_opaque, @@ -304,8 +301,10 @@ BlockAIOCB *dma_blk_read(BlockBackend *blk, BlockAIOCB *dma_blk_write(BlockBackend *blk, QEMUSGList *sg, uint64_t offset, uint32_t align, BlockCompletionFunc *cb, void *opaque); -uint64_t dma_buf_read(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs); -uint64_t dma_buf_write(void *ptr, int32_t len, QEMUSGList *sg, MemTxAttrs attrs); +MemTxResult dma_buf_read(void *ptr, dma_addr_t len, dma_addr_t *residual, + QEMUSGList *sg, MemTxAttrs attrs); +MemTxResult dma_buf_write(void *ptr, dma_addr_t len, dma_addr_t *residual, + QEMUSGList *sg, MemTxAttrs attrs); void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie, QEMUSGList *sg, enum BlockAcctType type); |