[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 16/25] spapr: make IOMMU translation go through IOMM
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 16/25] spapr: make IOMMU translation go through IOMMUTLBEntry |
Date: |
Thu, 20 Jun 2013 16:44:44 +0200 |
The next step is to introduce the translation code that will be used for
IOMMU MemoryRegions, but still do the actual translation in a DMAContext.
Acked-by: David Gibson <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/ppc/spapr_iommu.c | 60 ++++++++++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 25 deletions(-)
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 7a507e0..cf5ccb1 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -68,15 +68,8 @@ static sPAPRTCETable *spapr_tce_find_by_liobn(uint32_t liobn)
return NULL;
}
-static int spapr_tce_translate(DMAContext *dma,
- dma_addr_t addr,
- hwaddr *paddr,
- hwaddr *len,
- DMADirection dir)
+static IOMMUTLBEntry spapr_tce_translate_iommu(sPAPRTCETable *tcet, hwaddr
addr)
{
- sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, dma);
- enum sPAPRTCEAccess access = (dir == DMA_DIRECTION_FROM_DEVICE)
- ? SPAPR_TCE_WO : SPAPR_TCE_RO;
uint64_t tce;
#ifdef DEBUG_TCE
@@ -85,9 +78,13 @@ static int spapr_tce_translate(DMAContext *dma,
#endif
if (tcet->bypass) {
- *paddr = addr;
- *len = (hwaddr)-1;
- return 0;
+ return (IOMMUTLBEntry) {
+ .target_as = &address_space_memory,
+ .iova = 0,
+ .translated_addr = 0,
+ .addr_mask = ~(hwaddr)0,
+ .perm = IOMMU_RW,
+ };
}
/* Check if we are in bound */
@@ -95,28 +92,41 @@ static int spapr_tce_translate(DMAContext *dma,
#ifdef DEBUG_TCE
fprintf(stderr, "spapr_tce_translate out of bounds\n");
#endif
- return -EFAULT;
+ return (IOMMUTLBEntry) { .perm = IOMMU_NONE };
}
tce = tcet->table[addr >> SPAPR_TCE_PAGE_SHIFT].tce;
- /* Check TCE */
- if (!(tce & access)) {
+#ifdef DEBUG_TCE
+ fprintf(stderr, " -> *paddr=0x%llx, *len=0x%llx\n",
+ (tce & ~SPAPR_TCE_PAGE_MASK), SPAPR_TCE_PAGE_MASK + 1);
+#endif
+
+ return (IOMMUTLBEntry) {
+ .target_as = &address_space_memory,
+ .iova = addr & ~SPAPR_TCE_PAGE_MASK,
+ .translated_addr = tce & ~SPAPR_TCE_PAGE_MASK,
+ .addr_mask = SPAPR_TCE_PAGE_MASK,
+ .perm = tce,
+ };
+}
+
+static int spapr_tce_translate(DMAContext *dma,
+ dma_addr_t addr,
+ hwaddr *paddr,
+ hwaddr *len,
+ DMADirection dir)
+ {
+ sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, dma);
+ bool is_write = (dir == DMA_DIRECTION_FROM_DEVICE);
+ IOMMUTLBEntry entry = spapr_tce_translate_iommu(tcet, addr);
+ if (!(entry.perm & (1 << is_write))) {
return -EPERM;
}
- /* How much til end of page ? */
- *len = ((~addr) & SPAPR_TCE_PAGE_MASK) + 1;
-
/* Translate */
- *paddr = (tce & ~SPAPR_TCE_PAGE_MASK) |
- (addr & SPAPR_TCE_PAGE_MASK);
-
-#ifdef DEBUG_TCE
- fprintf(stderr, " -> *paddr=0x" TARGET_FMT_plx ", *len=0x"
- TARGET_FMT_plx "\n", *paddr, *len);
-#endif
-
+ *paddr = entry.translated_addr | (addr & entry.addr_mask);
+ *len = (addr | entry.addr_mask) - addr + 1;
return 0;
}
--
1.8.1.4
- [Qemu-devel] [PATCH 05/25] exec: Resolve subpages in one step except for IOTLB fills, (continued)
- [Qemu-devel] [PATCH 05/25] exec: Resolve subpages in one step except for IOTLB fills, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 06/25] exec: Implement subpage_read/write via address_space_rw, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 07/25] exec: return MemoryRegion from address_space_translate, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 08/25] Revert "memory: limit sections in the radix tree to the actual address space size", Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 09/25] Revert "s390x: reduce TARGET_PHYS_ADDR_SPACE_BITS to 62", Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 10/25] exec: reorganize mem_add to match Int128 version, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 12/25] memory: iommu support, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 13/25] memory: Add iommu map/unmap notifiers, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 11/25] memory: make section size a 128-bit integer, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 14/25] vfio: abort if an emulated iommu is used, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 16/25] spapr: make IOMMU translation go through IOMMUTLBEntry,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 15/25] spapr: convert TCE API to use an opaque type, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 17/25] spapr: use memory core for iommu support, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 18/25] dma: eliminate old-style IOMMU support, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 19/25] pci: use memory core for iommu support, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 20/25] spapr_vio: take care of creating our own AddressSpace/DMAContext, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 22/25] memory: give name to every AddressSpace, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 23/25] memory: Fix comment typo, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 24/25] memory: as_update_topology_pass: Improve comments, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 21/25] dma: eliminate DMAContext, Paolo Bonzini, 2013/06/20
- [Qemu-devel] [PATCH 25/25] memory: render_memory_region: factor out fr constant setters, Paolo Bonzini, 2013/06/20