iommu/amd: Update amd_irte_ops functions
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>
This commit is contained in:
parent
9457d75c05
commit
c4649a45f6
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue