mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
iommu/amd: Introduce per device DTE update function
Consolidate per device update and flush logic into separate function. Also make it as global function as it will be used in subsequent series to update the DTE. Signed-off-by: Vasant Hegde <vasant.hegde@amd.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/20240418103400.6229-3-vasant.hegde@amd.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
9433d5b2ac
commit
c5ebd09625
|
|
@ -56,6 +56,7 @@ int amd_iommu_clear_gcr3(struct iommu_dev_data *dev_data, ioasid_t pasid);
|
|||
void amd_iommu_flush_all_caches(struct amd_iommu *iommu);
|
||||
void amd_iommu_update_and_flush_device_table(struct protection_domain *domain);
|
||||
void amd_iommu_domain_update(struct protection_domain *domain);
|
||||
void amd_iommu_dev_update_dte(struct iommu_dev_data *dev_data, bool set);
|
||||
void amd_iommu_domain_flush_complete(struct protection_domain *domain);
|
||||
void amd_iommu_domain_flush_pages(struct protection_domain *domain,
|
||||
u64 address, size_t size);
|
||||
|
|
|
|||
|
|
@ -2002,6 +2002,21 @@ static void clear_dte_entry(struct amd_iommu *iommu, u16 devid)
|
|||
amd_iommu_apply_erratum_63(iommu, devid);
|
||||
}
|
||||
|
||||
/* Update and flush DTE for the given device */
|
||||
void amd_iommu_dev_update_dte(struct iommu_dev_data *dev_data, bool set)
|
||||
{
|
||||
struct amd_iommu *iommu = get_amd_iommu_from_dev(dev_data->dev);
|
||||
|
||||
if (set)
|
||||
set_dte_entry(iommu, dev_data);
|
||||
else
|
||||
clear_dte_entry(iommu, dev_data->devid);
|
||||
|
||||
clone_aliases(iommu, dev_data->dev);
|
||||
device_flush_dte(dev_data);
|
||||
iommu_completion_wait(iommu);
|
||||
}
|
||||
|
||||
static int do_attach(struct iommu_dev_data *dev_data,
|
||||
struct protection_domain *domain)
|
||||
{
|
||||
|
|
@ -2036,10 +2051,7 @@ static int do_attach(struct iommu_dev_data *dev_data,
|
|||
}
|
||||
|
||||
/* Update device table */
|
||||
set_dte_entry(iommu, dev_data);
|
||||
clone_aliases(iommu, dev_data->dev);
|
||||
|
||||
device_flush_dte(dev_data);
|
||||
amd_iommu_dev_update_dte(dev_data, true);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2058,11 +2070,9 @@ static void do_detach(struct iommu_dev_data *dev_data)
|
|||
/* Update data structures */
|
||||
dev_data->domain = NULL;
|
||||
list_del(&dev_data->list);
|
||||
clear_dte_entry(iommu, dev_data->devid);
|
||||
clone_aliases(iommu, dev_data->dev);
|
||||
|
||||
/* Flush the DTE entry */
|
||||
device_flush_dte(dev_data);
|
||||
/* Clear DTE and flush the entry */
|
||||
amd_iommu_dev_update_dte(dev_data, false);
|
||||
|
||||
/* Flush IOTLB and wait for the flushes to finish */
|
||||
amd_iommu_domain_flush_all(domain);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user