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.he...@amd.com>
---
 drivers/iommu/amd/amd_iommu_types.h | 2 +-
 drivers/iommu/amd/iommu.c           | 2 +-
 drivers/iommu/amd/iommu_v2.c        | 9 +++++----
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/amd/amd_iommu_types.h 
b/drivers/iommu/amd/amd_iommu_types.h
index 1ca54803702a..40f52d02c5b9 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -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 */
 
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 6a1db8f9f453..a56a9ad3273e 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -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]);
 
diff --git a/drivers/iommu/amd/iommu_v2.c b/drivers/iommu/amd/iommu_v2.c
index 40484af2ffc2..696d5555be57 100644
--- a/drivers/iommu/amd/iommu_v2.c
+++ b/drivers/iommu/amd/iommu_v2.c
@@ -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;
 
-- 
2.31.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to