mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
iommu/amd: Factor out helper for manipulating IRTE GA/CPU info
Split the guts of amd_iommu_update_ga() to a dedicated helper so that the logic can be shared with flows that put the IRTE into posted mode. Opportunistically move amd_iommu_update_ga() and its new helper above amd_iommu_activate_guest_mode() so that it's all co-located. Link: https://lore.kernel.org/r/20250611224604.313496-43-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
@@ -3804,6 +3804,52 @@ static const struct irq_domain_ops amd_ir_domain_ops = {
|
||||
.deactivate = irq_remapping_deactivate,
|
||||
};
|
||||
|
||||
static void __amd_iommu_update_ga(struct irte_ga *entry, int cpu)
|
||||
{
|
||||
if (cpu >= 0) {
|
||||
entry->lo.fields_vapic.destination =
|
||||
APICID_TO_IRTE_DEST_LO(cpu);
|
||||
entry->hi.fields.destination =
|
||||
APICID_TO_IRTE_DEST_HI(cpu);
|
||||
entry->lo.fields_vapic.is_run = true;
|
||||
} else {
|
||||
entry->lo.fields_vapic.is_run = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the pCPU information for an IRTE that is configured to post IRQs to
|
||||
* a vCPU, without issuing an IOMMU invalidation for the IRTE.
|
||||
*
|
||||
* If the vCPU is associated with a pCPU (@cpu >= 0), configure the Destination
|
||||
* with the pCPU's APIC ID and set IsRun, else clear IsRun. I.e. treat vCPUs
|
||||
* that are associated with a pCPU as running. This API is intended to be used
|
||||
* when a vCPU is scheduled in/out (or stops running for any reason), to do a
|
||||
* fast update of IsRun and (conditionally) Destination.
|
||||
*
|
||||
* Per the IOMMU spec, the Destination, IsRun, and GATag fields are not cached
|
||||
* and thus don't require an invalidation to ensure the IOMMU consumes fresh
|
||||
* information.
|
||||
*/
|
||||
int amd_iommu_update_ga(int cpu, void *data)
|
||||
{
|
||||
struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
|
||||
struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
|
||||
|
||||
if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
|
||||
!entry || !entry->lo.fields_vapic.guest_mode)
|
||||
return 0;
|
||||
|
||||
if (!ir_data->iommu)
|
||||
return -ENODEV;
|
||||
|
||||
__amd_iommu_update_ga(entry, cpu);
|
||||
|
||||
return __modify_irte_ga(ir_data->iommu, ir_data->irq_2_irte.devid,
|
||||
ir_data->irq_2_irte.index, entry);
|
||||
}
|
||||
EXPORT_SYMBOL(amd_iommu_update_ga);
|
||||
|
||||
int amd_iommu_activate_guest_mode(void *data)
|
||||
{
|
||||
struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
|
||||
@@ -3985,45 +4031,4 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the pCPU information for an IRTE that is configured to post IRQs to
|
||||
* a vCPU, without issuing an IOMMU invalidation for the IRTE.
|
||||
*
|
||||
* If the vCPU is associated with a pCPU (@cpu >= 0), configure the Destination
|
||||
* with the pCPU's APIC ID and set IsRun, else clear IsRun. I.e. treat vCPUs
|
||||
* that are associated with a pCPU as running. This API is intended to be used
|
||||
* when a vCPU is scheduled in/out (or stops running for any reason), to do a
|
||||
* fast update of IsRun and (conditionally) Destination.
|
||||
*
|
||||
* Per the IOMMU spec, the Destination, IsRun, and GATag fields are not cached
|
||||
* and thus don't require an invalidation to ensure the IOMMU consumes fresh
|
||||
* information.
|
||||
*/
|
||||
int amd_iommu_update_ga(int cpu, void *data)
|
||||
{
|
||||
struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
|
||||
struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
|
||||
|
||||
if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
|
||||
!entry || !entry->lo.fields_vapic.guest_mode)
|
||||
return 0;
|
||||
|
||||
if (!ir_data->iommu)
|
||||
return -ENODEV;
|
||||
|
||||
if (cpu >= 0) {
|
||||
entry->lo.fields_vapic.destination =
|
||||
APICID_TO_IRTE_DEST_LO(cpu);
|
||||
entry->hi.fields.destination =
|
||||
APICID_TO_IRTE_DEST_HI(cpu);
|
||||
entry->lo.fields_vapic.is_run = true;
|
||||
} else {
|
||||
entry->lo.fields_vapic.is_run = false;
|
||||
}
|
||||
|
||||
return __modify_irte_ga(ir_data->iommu, ir_data->irq_2_irte.devid,
|
||||
ir_data->irq_2_irte.index, entry);
|
||||
}
|
||||
EXPORT_SYMBOL(amd_iommu_update_ga);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user