iommu/amd: Update amd_irte_ops functions
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Wed, 6 Jul 2022 11:38:08 +0000 (17:08 +0530)
committerJoerg Roedel <jroedel@suse.de>
Thu, 7 Jul 2022 07:37:44 +0000 (09:37 +0200)
Pass amd_iommu structure as one of the parameter to amd_irte_ops functions
since its needed to activate/deactivate the iommu.

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

index 693926a..67feb84 100644 (file)
@@ -1007,9 +1007,9 @@ struct amd_ir_data {
 
 struct amd_irte_ops {
        void (*prepare)(void *, u32, bool, u8, u32, int);
-       void (*activate)(void *, u16, u16);
-       void (*deactivate)(void *, u16, u16);
-       void (*set_affinity)(void *, u16, u16, u8, u32);
+       void (*activate)(struct amd_iommu *iommu, void *, u16, u16);
+       void (*deactivate)(struct amd_iommu *iommu, void *, u16, u16);
+       void (*set_affinity)(struct amd_iommu *iommu, void *, u16, u16, u8, u32);
        void *(*get)(struct irq_remap_table *, int);
        void (*set_allocated)(struct irq_remap_table *, int);
        bool (*is_allocated)(struct irq_remap_table *, int);
index 9f373b1..c4701fa 100644 (file)
@@ -2934,19 +2934,14 @@ out:
        return index;
 }
 
-static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte,
-                         struct amd_ir_data *data)
+static int modify_irte_ga(struct amd_iommu *iommu, u16 devid, int index,
+                         struct irte_ga *irte, struct amd_ir_data *data)
 {
        bool ret;
        struct irq_remap_table *table;
-       struct amd_iommu *iommu;
        unsigned long flags;
        struct irte_ga *entry;
 
-       iommu = amd_iommu_rlookup_table[devid];
-       if (iommu == NULL)
-               return -EINVAL;
-
        table = get_irq_table(iommu, devid);
        if (!table)
                return -ENOMEM;
@@ -2978,16 +2973,12 @@ static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte,
        return 0;
 }
 
-static int modify_irte(u16 devid, int index, union irte *irte)
+static int modify_irte(struct amd_iommu *iommu,
+                      u16 devid, int index, union irte *irte)
 {
        struct irq_remap_table *table;
-       struct amd_iommu *iommu;
        unsigned long flags;
 
-       iommu = amd_iommu_rlookup_table[devid];
-       if (iommu == NULL)
-               return -EINVAL;
-
        table = get_irq_table(iommu, devid);
        if (!table)
                return -ENOMEM;
@@ -3049,49 +3040,49 @@ static void irte_ga_prepare(void *entry,
        irte->lo.fields_remap.valid       = 1;
 }
 
-static void irte_activate(void *entry, u16 devid, u16 index)
+static void irte_activate(struct amd_iommu *iommu, void *entry, u16 devid, u16 index)
 {
        union irte *irte = (union irte *) entry;
 
        irte->fields.valid = 1;
-       modify_irte(devid, index, irte);
+       modify_irte(iommu, devid, index, irte);
 }
 
-static void irte_ga_activate(void *entry, u16 devid, u16 index)
+static void irte_ga_activate(struct amd_iommu *iommu, void *entry, u16 devid, u16 index)
 {
        struct irte_ga *irte = (struct irte_ga *) entry;
 
        irte->lo.fields_remap.valid = 1;
-       modify_irte_ga(devid, index, irte, NULL);
+       modify_irte_ga(iommu, devid, index, irte, NULL);
 }
 
-static void irte_deactivate(void *entry, u16 devid, u16 index)
+static void irte_deactivate(struct amd_iommu *iommu, void *entry, u16 devid, u16 index)
 {
        union irte *irte = (union irte *) entry;
 
        irte->fields.valid = 0;
-       modify_irte(devid, index, irte);
+       modify_irte(iommu, devid, index, irte);
 }
 
-static void irte_ga_deactivate(void *entry, u16 devid, u16 index)
+static void irte_ga_deactivate(struct amd_iommu *iommu, void *entry, u16 devid, u16 index)
 {
        struct irte_ga *irte = (struct irte_ga *) entry;
 
        irte->lo.fields_remap.valid = 0;
-       modify_irte_ga(devid, index, irte, NULL);
+       modify_irte_ga(iommu, devid, index, irte, NULL);
 }
 
-static void irte_set_affinity(void *entry, u16 devid, u16 index,
+static void irte_set_affinity(struct amd_iommu *iommu, void *entry, u16 devid, u16 index,
                              u8 vector, u32 dest_apicid)
 {
        union irte *irte = (union irte *) entry;
 
        irte->fields.vector = vector;
        irte->fields.destination = dest_apicid;
-       modify_irte(devid, index, irte);
+       modify_irte(iommu, devid, index, irte);
 }
 
-static void irte_ga_set_affinity(void *entry, u16 devid, u16 index,
+static void irte_ga_set_affinity(struct amd_iommu *iommu, void *entry, u16 devid, u16 index,
                                 u8 vector, u32 dest_apicid)
 {
        struct irte_ga *irte = (struct irte_ga *) entry;
@@ -3102,7 +3093,7 @@ static void irte_ga_set_affinity(void *entry, u16 devid, u16 index,
                                        APICID_TO_IRTE_DEST_LO(dest_apicid);
                irte->hi.fields.destination =
                                        APICID_TO_IRTE_DEST_HI(dest_apicid);
-               modify_irte_ga(devid, index, irte, NULL);
+               modify_irte_ga(iommu, devid, index, irte, NULL);
        }
 }
 
@@ -3391,7 +3382,7 @@ static int irq_remapping_activate(struct irq_domain *domain,
        if (!iommu)
                return 0;
 
-       iommu->irte_ops->activate(data->entry, irte_info->devid,
+       iommu->irte_ops->activate(iommu, data->entry, irte_info->devid,
                                  irte_info->index);
        amd_ir_update_irte(irq_data, iommu, data, irte_info, cfg);
        return 0;
@@ -3405,7 +3396,7 @@ static void irq_remapping_deactivate(struct irq_domain *domain,
        struct amd_iommu *iommu = data->iommu;
 
        if (iommu)
-               iommu->irte_ops->deactivate(data->entry, irte_info->devid,
+               iommu->irte_ops->deactivate(iommu, data->entry, irte_info->devid,
                                            irte_info->index);
 }
 
@@ -3460,7 +3451,7 @@ int amd_iommu_activate_guest_mode(void *data)
        entry->hi.fields.vector            = ir_data->ga_vector;
        entry->lo.fields_vapic.ga_tag      = ir_data->ga_tag;
 
-       return modify_irte_ga(ir_data->irq_2_irte.devid,
+       return modify_irte_ga(ir_data->iommu, ir_data->irq_2_irte.devid,
                              ir_data->irq_2_irte.index, entry, ir_data);
 }
 EXPORT_SYMBOL(amd_iommu_activate_guest_mode);
@@ -3490,7 +3481,7 @@ int amd_iommu_deactivate_guest_mode(void *data)
        entry->hi.fields.destination =
                                APICID_TO_IRTE_DEST_HI(cfg->dest_apicid);
 
-       return modify_irte_ga(ir_data->irq_2_irte.devid,
+       return modify_irte_ga(ir_data->iommu, ir_data->irq_2_irte.devid,
                              ir_data->irq_2_irte.index, entry, ir_data);
 }
 EXPORT_SYMBOL(amd_iommu_deactivate_guest_mode);
@@ -3562,7 +3553,7 @@ static void amd_ir_update_irte(struct irq_data *irqd, struct amd_iommu *iommu,
         * Atomically updates the IRTE with the new destination, vector
         * and flushes the interrupt entry cache.
         */
-       iommu->irte_ops->set_affinity(ir_data->entry, irte_info->devid,
+       iommu->irte_ops->set_affinity(iommu, ir_data->entry, irte_info->devid,
                                      irte_info->index, cfg->vector,
                                      cfg->dest_apicid);
 }