mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 16:12:02 +00:00
iommu/amd: Add support for using AMD IOMMU v2 page table for DMA-API
Introduce init function for setting up DMA domain for DMA-API with the IOMMU v2 page table. Co-developed-by: Vasant Hegde <vasant.hegde@amd.com> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Link: https://lore.kernel.org/r/20220825063939.8360-9-vasant.hegde@amd.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
643feb0072
commit
4db6c41f09
@ -1653,6 +1653,10 @@ static void do_attach(struct iommu_dev_data *dev_data,
|
|||||||
domain->dev_iommu[iommu->index] += 1;
|
domain->dev_iommu[iommu->index] += 1;
|
||||||
domain->dev_cnt += 1;
|
domain->dev_cnt += 1;
|
||||||
|
|
||||||
|
/* Override supported page sizes */
|
||||||
|
if (domain->flags & PD_GIOV_MASK)
|
||||||
|
domain->domain.pgsize_bitmap = AMD_IOMMU_PGSIZES_V2;
|
||||||
|
|
||||||
/* Update device table */
|
/* Update device table */
|
||||||
set_dte_entry(iommu, dev_data->devid, domain,
|
set_dte_entry(iommu, dev_data->devid, domain,
|
||||||
ats, dev_data->iommu_v2);
|
ats, dev_data->iommu_v2);
|
||||||
@ -2032,6 +2036,24 @@ static int protection_domain_init_v1(struct protection_domain *domain, int mode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int protection_domain_init_v2(struct protection_domain *domain)
|
||||||
|
{
|
||||||
|
spin_lock_init(&domain->lock);
|
||||||
|
domain->id = domain_id_alloc();
|
||||||
|
if (!domain->id)
|
||||||
|
return -ENOMEM;
|
||||||
|
INIT_LIST_HEAD(&domain->dev_list);
|
||||||
|
|
||||||
|
domain->flags |= PD_GIOV_MASK;
|
||||||
|
|
||||||
|
if (domain_enable_v2(domain, 1)) {
|
||||||
|
domain_id_free(domain->id);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct protection_domain *protection_domain_alloc(unsigned int type)
|
static struct protection_domain *protection_domain_alloc(unsigned int type)
|
||||||
{
|
{
|
||||||
struct io_pgtable_ops *pgtbl_ops;
|
struct io_pgtable_ops *pgtbl_ops;
|
||||||
@ -2059,6 +2081,9 @@ static struct protection_domain *protection_domain_alloc(unsigned int type)
|
|||||||
case AMD_IOMMU_V1:
|
case AMD_IOMMU_V1:
|
||||||
ret = protection_domain_init_v1(domain, mode);
|
ret = protection_domain_init_v1(domain, mode);
|
||||||
break;
|
break;
|
||||||
|
case AMD_IOMMU_V2:
|
||||||
|
ret = protection_domain_init_v2(domain);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user