|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] AMD IOMMU: drop amd_iommu_setup_hwdom_device()
commit 7c275549f46c5c46611592f7107c1345e93ed457
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu Aug 10 12:34:21 2017 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Aug 10 12:34:21 2017 +0200
AMD IOMMU: drop amd_iommu_setup_hwdom_device()
By moving its bridge special casing to amd_iommu_add_device(), we can
pass the latter to setup_hwdom_pci_devices() and at once consistently
handle bridges discovered at boot time as well as such reported by Dom0
later on.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/drivers/passthrough/amd/pci_amd_iommu.c | 47 ++++++++++-------------------
1 file changed, 16 insertions(+), 31 deletions(-)
diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c
b/xen/drivers/passthrough/amd/pci_amd_iommu.c
index 8c25110..12d2695 100644
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -168,33 +168,6 @@ static void amd_iommu_setup_domain_device(
}
}
-static int __hwdom_init amd_iommu_setup_hwdom_device(
- u8 devfn, struct pci_dev *pdev)
-{
- int bdf = PCI_BDF2(pdev->bus, pdev->devfn);
- struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf);
-
- if ( unlikely(!iommu) )
- {
- /* Filter the bridge devices */
- if ( pdev->type == DEV_TYPE_PCI_HOST_BRIDGE )
- {
- AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n",
- pdev->seg, PCI_BUS(bdf), PCI_SLOT(bdf),
- PCI_FUNC(bdf));
- return 0;
- }
-
- AMD_IOMMU_DEBUG("No iommu for device %04x:%02x:%02x.%u\n",
- pdev->seg, pdev->bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
- return -ENODEV;
- }
-
- amd_iommu_setup_domain_device(pdev->domain, iommu, devfn, pdev);
- return 0;
-}
-
int __init amd_iov_detect(void)
{
INIT_LIST_HEAD(&amd_iommu_head);
@@ -273,6 +246,8 @@ static int amd_iommu_domain_init(struct domain *d)
return 0;
}
+static int amd_iommu_add_device(u8 devfn, struct pci_dev *pdev);
+
static void __hwdom_init amd_iommu_hwdom_init(struct domain *d)
{
unsigned long i;
@@ -318,7 +293,7 @@ static void __hwdom_init amd_iommu_hwdom_init(struct domain
*d)
IOMMU_MMIO_REGION_LENGTH - 1)) )
BUG();
- setup_hwdom_pci_devices(d, amd_iommu_setup_hwdom_device);
+ setup_hwdom_pci_devices(d, amd_iommu_add_device);
}
void amd_iommu_disable_domain_device(struct domain *domain,
@@ -490,15 +465,25 @@ static int amd_iommu_add_device(u8 devfn, struct pci_dev
*pdev)
{
struct amd_iommu *iommu;
u16 bdf;
+
if ( !pdev->domain )
return -EINVAL;
bdf = PCI_BDF2(pdev->bus, pdev->devfn);
iommu = find_iommu_for_device(pdev->seg, bdf);
- if ( !iommu )
+ if ( unlikely(!iommu) )
{
- AMD_IOMMU_DEBUG("Fail to find iommu."
- " %04x:%02x:%02x.%u cannot be assigned to dom%d\n",
+ /* Filter bridge devices. */
+ if ( pdev->type == DEV_TYPE_PCI_HOST_BRIDGE &&
+ is_hardware_domain(pdev->domain) )
+ {
+ AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n",
+ pdev->seg, pdev->bus, PCI_SLOT(devfn),
+ PCI_FUNC(devfn));
+ return 0;
+ }
+
+ AMD_IOMMU_DEBUG("No iommu for %04x:%02x:%02x.%u; cannot be handed to
d%d\n",
pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
pdev->domain->domain_id);
return -ENODEV;
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |