From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56957) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZWqcc-0007Bu-NP for qemu-devel@nongnu.org; Tue, 01 Sep 2015 14:49:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZWqcb-0000Qe-F0 for qemu-devel@nongnu.org; Tue, 01 Sep 2015 14:49:30 -0400 From: Knut Omang Date: Tue, 1 Sep 2015 20:48:21 +0200 Message-Id: <1441133302-18950-2-git-send-email-knut.omang@oracle.com> In-Reply-To: <1441133302-18950-1-git-send-email-knut.omang@oracle.com> References: <1441133302-18950-1-git-send-email-knut.omang@oracle.com> Subject: [Qemu-devel] [PATCH v2 1/2] iommu: Replace bus+devfn arguments with PCIDevice* in PCIIOMMUFunc List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alex Williamson , Eduardo Habkost , "Michael S. Tsirkin" , Knut Omang , Alexander Graf , Le Tan , =?UTF-8?q?Andreas=20F=C3=A4rber?= , qemu-ppc@nongnu.org, Jan Kiszka , Paolo Bonzini , Richard Henderson , David Gibson The dev pointer is needed by intel_iommu to enable it to store the dma address pointer with the device. Signed-off-by: Knut Omang --- hw/alpha/typhoon.c | 2 +- hw/pci-host/apb.c | 2 +- hw/pci-host/prep.c | 3 +-- hw/pci-host/q35.c | 5 +++-- hw/pci/pci.c | 7 +++---- hw/ppc/spapr_pci.c | 2 +- include/hw/pci/pci.h | 4 +++- 7 files changed, 13 insertions(+), 12 deletions(-) diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index 421162e..7e9a521 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -726,7 +726,7 @@ static const MemoryRegionIOMMUOps typhoon_iommu_ops = { .translate = typhoon_translate_iommu, }; -static AddressSpace *typhoon_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *typhoon_pci_dma_iommu(PCIDevice *dev, void *opaque) { TyphoonState *s = opaque; return &s->pchip.iommu_as; diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c index 599768e..6c78887 100644 --- a/hw/pci-host/apb.c +++ b/hw/pci-host/apb.c @@ -198,7 +198,7 @@ static inline void pbm_clear_request(APBState *s, unsigned int irq_num) s->irq_request = NO_IRQ_REQUEST; } -static AddressSpace *pbm_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *pbm_pci_dma_iommu(PCIDevice *dev, void *opaque) { IOMMUState *is = opaque; diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c index c63f45d..cfe5594 100644 --- a/hw/pci-host/prep.c +++ b/hw/pci-host/prep.c @@ -196,8 +196,7 @@ static void raven_set_irq(void *opaque, int irq_num, int level) qemu_set_irq(pic[irq_num] , level); } -static AddressSpace *raven_pcihost_set_iommu(PCIBus *bus, void *opaque, - int devfn) +static AddressSpace *raven_pcihost_set_iommu(PCIDevice *dev, void *opaque) { PREPPCIState *s = opaque; diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c index bd74094..7892482 100644 --- a/hw/pci-host/q35.c +++ b/hw/pci-host/q35.c @@ -423,11 +423,12 @@ static void mch_reset(DeviceState *qdev) mch_update(mch); } -static AddressSpace *q35_host_dma_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *q35_host_dma_iommu(PCIDevice *dev, void *opaque) { IntelIOMMUState *s = opaque; VTDAddressSpace **pvtd_as; - int bus_num = pci_bus_num(bus); + int bus_num = pci_bus_num(dev->bus); + int devfn = dev->devfn; assert(0 <= bus_num && bus_num <= VTD_PCI_BUS_MAX); assert(0 <= devfn && devfn <= VTD_PCI_DEVFN_MAX); diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 251bcbf..5ece4c0 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -870,7 +870,6 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, PCIConfigReadFunc *config_read = pc->config_read; PCIConfigWriteFunc *config_write = pc->config_write; Error *local_err = NULL; - AddressSpace *dma_as; if (devfn < 0) { for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices); @@ -892,11 +891,11 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, pci_dev->bus = bus; pci_dev->devfn = devfn; - dma_as = pci_device_iommu_address_space(pci_dev); + pci_dev->dma_as = pci_device_iommu_address_space(pci_dev); memory_region_init_alias(&pci_dev->bus_master_enable_region, OBJECT(pci_dev), "bus master", - dma_as->root, 0, memory_region_size(dma_as->root)); + pci_dev->dma_as->root, 0, memory_region_size(pci_dev->dma_as->root)); memory_region_set_enabled(&pci_dev->bus_master_enable_region, false); address_space_init(&pci_dev->bus_master_as, &pci_dev->bus_master_enable_region, name); @@ -2442,7 +2441,7 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) PCIBus *bus = PCI_BUS(dev->bus); if (bus->iommu_fn) { - return bus->iommu_fn(bus, bus->iommu_opaque, dev->devfn); + return bus->iommu_fn(dev, bus->iommu_opaque); } if (bus->parent_dev) { diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index a8f79d8..7d39317 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -747,7 +747,7 @@ static const MemoryRegionOps spapr_msi_ops = { /* * PHB PCI device */ -static AddressSpace *spapr_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *spapr_pci_dma_iommu(PCIDevice *dev, void *opaque) { sPAPRPHBState *phb = opaque; diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index 2e9d8ba..e142641 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -247,6 +247,7 @@ struct PCIDevice { char name[64]; PCIIORegion io_regions[PCI_NUM_REGIONS]; AddressSpace bus_master_as; + AddressSpace *dma_as; MemoryRegion bus_master_enable_region; /* do not access the following fields */ @@ -415,7 +416,8 @@ void pci_bus_get_w64_range(PCIBus *bus, Range *range); void pci_device_deassert_intx(PCIDevice *dev); -typedef AddressSpace *(*PCIIOMMUFunc)(PCIBus *, void *, int); +typedef AddressSpace *(*PCIIOMMUFunc)(PCIDevice *, void *); +void pci_set_dma_address_space(AddressSpace *dma_address_space); AddressSpace *pci_device_iommu_address_space(PCIDevice *dev); void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque); -- 2.4.3