Re: [RFC PATCH 7/7] iommu/amd: Add support for using AMD IOMMU v2 page table for DMA-API
On Fri, Mar 12, 2021 at 03:04:11AM -0600, Suravee Suthikulpanit wrote: > Introduce init function for setting up DMA domain for DMA-API with > the IOMMU v2 page table. > > Signed-off-by: Suravee Suthikulpanit > --- > drivers/iommu/amd/iommu.c | 21 + > 1 file changed, 21 insertions(+) > > diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c > index e29ece6e1e68..bd26de8764bd 100644 > --- a/drivers/iommu/amd/iommu.c > +++ b/drivers/iommu/amd/iommu.c > @@ -1937,6 +1937,24 @@ static int protection_domain_init_v1(struct > protection_domain *domain, int mode) > return 0; > } > > +static int protection_domain_init_v2(struct protection_domain *domain) > +{ > + spin_lock_init(>lock); > + domain->id = domain_id_alloc(); > + if (!domain->id) > + return -ENOMEM; > + INIT_LIST_HEAD(>dev_list); > + > + domain->giov = true; > + > + if (amd_iommu_pgtable == AMD_IOMMU_V2 && > + domain_enable_v2(domain, 1, false)) { > + return -ENOMEM; > + } > + > + return 0; > +} > + You also need to advertise a different aperture size and a different pgsize-bitmap. The host page-table can only map a 48 bit address space, not a 64 bit one like with v1 page-tables. Regards, Joerg
[RFC PATCH 7/7] 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. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/iommu.c | 21 + 1 file changed, 21 insertions(+) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index e29ece6e1e68..bd26de8764bd 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -1937,6 +1937,24 @@ static int protection_domain_init_v1(struct protection_domain *domain, int mode) return 0; } +static int protection_domain_init_v2(struct protection_domain *domain) +{ + spin_lock_init(>lock); + domain->id = domain_id_alloc(); + if (!domain->id) + return -ENOMEM; + INIT_LIST_HEAD(>dev_list); + + domain->giov = true; + + if (amd_iommu_pgtable == AMD_IOMMU_V2 && + domain_enable_v2(domain, 1, false)) { + return -ENOMEM; + } + + return 0; +} + static struct protection_domain *protection_domain_alloc(unsigned int type) { struct io_pgtable_ops *pgtbl_ops; @@ -1964,6 +1982,9 @@ static struct protection_domain *protection_domain_alloc(unsigned int type) case AMD_IOMMU_V1: ret = protection_domain_init_v1(domain, mode); break; + case AMD_IOMMU_V2: + ret = protection_domain_init_v2(domain); + break; default: ret = -EINVAL; } -- 2.17.1