[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/40] spapr: use memory core for iommu support
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 18/40] spapr: use memory core for iommu support |
Date: |
Tue, 7 May 2013 16:16:56 +0200 |
Now we can stop using a "translating" DMAContext, but we do not yet modify
the sPAPRTCETable users to get an AddressSpace; they keep using the table
via a DMAContext.
Acked-by: David Gibson <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/ppc/spapr_iommu.c | 42 ++++++++++++++++++++----------------------
include/hw/ppc/spapr.h | 1 +
2 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 45fb81d..75d8370 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -37,12 +37,16 @@ enum sPAPRTCEAccess {
};
struct sPAPRTCETable {
+ /* temporary until everyone has its own AddressSpace */
DMAContext dma;
+ AddressSpace as;
+
uint32_t liobn;
uint32_t window_size;
sPAPRTCE *table;
bool bypass;
int fd;
+ MemoryRegion iommu;
QLIST_ENTRY(sPAPRTCETable) list;
};
@@ -68,8 +72,9 @@ static sPAPRTCETable *spapr_tce_find_by_liobn(uint32_t liobn)
return NULL;
}
-static IOMMUTLBEntry spapr_tce_translate_iommu(sPAPRTCETable *tcet, hwaddr
addr)
+static IOMMUTLBEntry spapr_tce_translate_iommu(MemoryRegion *iommu, hwaddr
addr)
{
+ sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu);
uint64_t tce;
#ifdef DEBUG_TCE
@@ -107,25 +112,9 @@ static IOMMUTLBEntry
spapr_tce_translate_iommu(sPAPRTCETable *tcet, hwaddr addr)
};
}
-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[is_write]) {
- return -EPERM;
- }
-
- /* Translate */
- *paddr = entry.translated_addr | (addr & entry.addr_mask);
- *len = (addr | entry.addr_mask) - addr + 1;
- return 0;
-}
+static MemoryRegionIOMMUOps spapr_iommu_ops = {
+ .translate = spapr_tce_translate_iommu,
+};
sPAPRTCETable *spapr_tce_new_table(uint32_t liobn, size_t window_size)
{
@@ -142,8 +131,6 @@ sPAPRTCETable *spapr_tce_new_table(uint32_t liobn, size_t
window_size)
}
tcet = g_malloc0(sizeof(*tcet));
- dma_context_init(&tcet->dma, &address_space_memory, spapr_tce_translate,
NULL, NULL);
-
tcet->liobn = liobn;
tcet->window_size = window_size;
@@ -164,6 +151,12 @@ sPAPRTCETable *spapr_tce_new_table(uint32_t liobn, size_t
window_size)
"table @ %p, fd=%d\n", tcet, liobn, tcet->table, tcet->fd);
#endif
+ memory_region_init_iommu(&tcet->iommu, &spapr_iommu_ops,
+ &address_space_memory,
+ "iommu-spapr", INT64_MAX);
+ address_space_init(&tcet->as, &tcet->iommu);
+ dma_context_init(&tcet->dma, &tcet->as, NULL, NULL, NULL);
+
QLIST_INSERT_HEAD(&spapr_tce_tables, tcet, list);
return tcet;
@@ -187,6 +180,11 @@ DMAContext *spapr_tce_get_dma(sPAPRTCETable *tcet)
return &tcet->dma;
}
+MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet)
+{
+ return &tcet->iommu;
+}
+
void spapr_tce_set_bypass(sPAPRTCETable *tcet, bool bypass)
{
tcet->bypass = bypass;
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index e8d617b..142abb7 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -349,6 +349,7 @@ void spapr_events_init(sPAPREnvironment *spapr);
void spapr_events_fdt_skel(void *fdt, uint32_t epow_irq);
sPAPRTCETable *spapr_tce_new_table(uint32_t liobn, size_t window_size);
DMAContext *spapr_tce_get_dma(sPAPRTCETable *tcet);
+MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet);
void spapr_tce_free(sPAPRTCETable *tcet);
void spapr_tce_reset(sPAPRTCETable *tcet);
void spapr_tce_set_bypass(sPAPRTCETable *tcet, bool bypass);
--
1.7.1
- Re: [Qemu-devel] [PATCH 08/40] memory: limit sections in the radix tree to the actual address space size, (continued)
- [Qemu-devel] [PATCH 15/40] vfio: abort if an emulated iommu is used, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 05/40] memory: do not duplicate memory_region_destructor_none, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 30/40] misc: add memory_region_set_owner calls, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 22/40] dma: eliminate DMAContext, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 32/40] vga: add memory_region_set_owner calls, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 02/40] memory: allow memory_region_find() to run on non-root memory regions, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 18/40] spapr: use memory core for iommu support,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 24/40] memory: add getter/setter for owner, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 07/40] memory: fix address space initialization/destruction, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 17/40] spapr: make IOMMU translation go through IOMMUTLBEntry, Paolo Bonzini, 2013/05/07
- [Qemu-devel] [PATCH 40/40] memory: add reference counting to FlatView, Paolo Bonzini, 2013/05/07
[Qemu-devel] [PATCH 09/40] memory: create FlatView for new address spaces, Paolo Bonzini, 2013/05/07