iommu/amd: Update amd_iommu_fault structure to include PCI seg ID
authorVasant Hegde <vasant.hegde@amd.com>
Wed, 6 Jul 2022 11:38:25 +0000 (17:08 +0530)
committerJoerg Roedel <jroedel@suse.de>
Thu, 7 Jul 2022 07:37:54 +0000 (09:37 +0200)
Rename 'device_id' as 'sbdf' and extend it to 32bit so that we can
pass PCI segment ID to ppr_notifier(). Also pass PCI segment ID to
pci_get_domain_bus_and_slot() instead of default value.

Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Link: https://lore.kernel.org/r/20220706113825.25582-36-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/amd_iommu_types.h
drivers/iommu/amd/iommu.c
drivers/iommu/amd/iommu_v2.c

index 1ca5480..40f52d0 100644 (file)
@@ -486,7 +486,7 @@ extern struct kmem_cache *amd_iommu_irq_cache;
 struct amd_iommu_fault {
        u64 address;    /* IO virtual address of the fault*/
        u32 pasid;      /* Address space identifier */
-       u16 device_id;  /* Originating PCI device id */
+       u32 sbdf;       /* Originating PCI device id */
        u16 tag;        /* PPR tag */
        u16 flags;      /* Fault flags */
 
index 6a1db8f..a56a9ad 100644 (file)
@@ -701,7 +701,7 @@ static void iommu_handle_ppr_entry(struct amd_iommu *iommu, u64 *raw)
 
        fault.address   = raw[1];
        fault.pasid     = PPR_PASID(raw[0]);
-       fault.device_id = PPR_DEVID(raw[0]);
+       fault.sbdf      = PCI_SEG_DEVID_TO_SBDF(iommu->pci_seg->id, PPR_DEVID(raw[0]));
        fault.tag       = PPR_TAG(raw[0]);
        fault.flags     = PPR_FLAGS(raw[0]);
 
index 40484af..696d555 100644 (file)
@@ -518,15 +518,16 @@ static int ppr_notifier(struct notifier_block *nb, unsigned long e, void *data)
        unsigned long flags;
        struct fault *fault;
        bool finish;
-       u16 tag, devid;
+       u16 tag, devid, seg_id;
        int ret;
 
        iommu_fault = data;
        tag         = iommu_fault->tag & 0x1ff;
        finish      = (iommu_fault->tag >> 9) & 1;
 
-       devid = iommu_fault->device_id;
-       pdev = pci_get_domain_bus_and_slot(0, PCI_BUS_NUM(devid),
+       seg_id = PCI_SBDF_TO_SEGID(iommu_fault->sbdf);
+       devid = PCI_SBDF_TO_DEVID(iommu_fault->sbdf);
+       pdev = pci_get_domain_bus_and_slot(seg_id, PCI_BUS_NUM(devid),
                                           devid & 0xff);
        if (!pdev)
                return -ENODEV;
@@ -540,7 +541,7 @@ static int ppr_notifier(struct notifier_block *nb, unsigned long e, void *data)
                goto out;
        }
 
-       dev_state = get_device_state(iommu_fault->device_id);
+       dev_state = get_device_state(iommu_fault->sbdf);
        if (dev_state == NULL)
                goto out;