@@ -118,10 +118,17 @@ void isa_register_portio_list(ISADevice *dev, uint16_t start,
portio_list_add(piolist, isabus->address_space_io, start);
}
+void isa_setup_iommu(ISABus *bus, ISADMAContextFunc fn, void *opaque)
+{
+ bus->dma_context_fn = fn;
+ bus->dma_context_opaque = opaque;
+}
+
static int isa_qdev_init(DeviceState *qdev)
{
ISADevice *dev = ISA_DEVICE(qdev);
ISADeviceClass *klass = ISA_DEVICE_GET_CLASS(dev);
+ ISABus *isabus;
dev->isairq[0] = -1;
dev->isairq[1] = -1;
@@ -132,6 +139,10 @@ static int isa_qdev_init(DeviceState *qdev)
/* iommu setup */
dev->dma = NULL;
+ isabus = FROM_QBUS(ISABus, qdev_get_parent_bus(qdev));
+ if (isabus->dma_context_fn) {
+ dev->dma = isabus->dma_context_fn(isabus, isabus->dma_context_opaque);
+ }
return 0;
}
@@ -26,10 +26,15 @@ typedef struct ISADeviceClass {
int (*init)(ISADevice *dev);
} ISADeviceClass;
+typedef DMAContext *(*ISADMAContextFunc)(ISABus *, void *);
+void isa_setup_iommu(ISABus *bus, ISADMAContextFunc fn, void *opaque);
+
struct ISABus {
BusState qbus;
MemoryRegion *address_space_io;
qemu_irq *irqs;
+ ISADMAContextFunc dma_context_fn;
+ void *dma_context_opaque;
};
struct ISADevice {
Introduce 'isa_setup_iommu()' to allow chipsets to associate an iommu mapping function with the isa bus. This allows isa devices which sit behind an iommu to be correctly configured. This is based on Benjamin Herrenschmidt's iommu series. It has no consumers for now. Signed-off-by: Jason Baron <jbaron@redhat.com> --- hw/isa-bus.c | 11 +++++++++++ hw/isa.h | 5 +++++ 2 files changed, 16 insertions(+), 0 deletions(-)