Re: [PATCH v4 4/7] iommu/vt-d: Setup pasid entries for iova over first level

2019-12-20 Thread Lu Baolu

Hi Yi,

On 12/20/19 7:44 PM, Liu, Yi L wrote:

From: Lu Baolu [mailto:baolu...@linux.intel.com]
Sent: Thursday, December 19, 2019 11:17 AM
To: Joerg Roedel ; David Woodhouse ;
Alex Williamson 
Subject: [PATCH v4 4/7] iommu/vt-d: Setup pasid entries for iova over first 
level

Intel VT-d in scalable mode supports two types of page tables for IOVA 
translation:
first level and second level. The IOMMU driver can choose one from both for IOVA
translation according to the use case. This sets up the pasid entry if a domain 
is
selected to use the first-level page table for iova translation.

Signed-off-by: Lu Baolu 
---
  drivers/iommu/intel-iommu.c | 48 +++--
  include/linux/intel-iommu.h | 16 -
  2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index
2b5a47584baf..f0813997dea2 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -571,6 +571,11 @@ static inline int domain_type_is_si(struct dmar_domain
*domain)
return domain->flags & DOMAIN_FLAG_STATIC_IDENTITY;  }

+static inline bool domain_use_first_level(struct dmar_domain *domain) {
+   return domain->flags & DOMAIN_FLAG_USE_FIRST_LEVEL; }
+
  static inline int domain_pfn_supported(struct dmar_domain *domain,
   unsigned long pfn)
  {
@@ -2288,6 +2293,8 @@ static int __domain_mapping(struct dmar_domain
*domain, unsigned long iov_pfn,
return -EINVAL;

prot &= DMA_PTE_READ | DMA_PTE_WRITE | DMA_PTE_SNP;
+   if (domain_use_first_level(domain))
+   prot |= DMA_FL_PTE_PRESENT | DMA_FL_PTE_XD;

if (!sg) {
sg_res = nr_pages;
@@ -2515,6 +2522,36 @@ dmar_search_domain_by_dev_info(int segment, int bus,
int devfn)
return NULL;
  }

+static int domain_setup_first_level(struct intel_iommu *iommu,
+   struct dmar_domain *domain,
+   struct device *dev,
+   int pasid)
+{
+   int flags = PASID_FLAG_SUPERVISOR_MODE;


Hi Baolu,

Could you explain a bit why PASID_FLAG_SUPERVISOR_MODE is
required?



This flag indicates a PASID which can be used for access to kernel
addresses (static 1:1 only). Otherwise, DMA requests requesting
supervisor level privilege level will be blocked.


Regards,
Yi Liu



Best regards,
baolu
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


RE: [PATCH v4 4/7] iommu/vt-d: Setup pasid entries for iova over first level

2019-12-20 Thread Liu, Yi L
> From: Lu Baolu [mailto:baolu...@linux.intel.com]
> Sent: Thursday, December 19, 2019 11:17 AM
> To: Joerg Roedel ; David Woodhouse ;
> Alex Williamson 
> Subject: [PATCH v4 4/7] iommu/vt-d: Setup pasid entries for iova over first 
> level
> 
> Intel VT-d in scalable mode supports two types of page tables for IOVA 
> translation:
> first level and second level. The IOMMU driver can choose one from both for 
> IOVA
> translation according to the use case. This sets up the pasid entry if a 
> domain is
> selected to use the first-level page table for iova translation.
> 
> Signed-off-by: Lu Baolu 
> ---
>  drivers/iommu/intel-iommu.c | 48 +++--
>  include/linux/intel-iommu.h | 16 -
>  2 files changed, 56 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index
> 2b5a47584baf..f0813997dea2 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -571,6 +571,11 @@ static inline int domain_type_is_si(struct dmar_domain
> *domain)
>   return domain->flags & DOMAIN_FLAG_STATIC_IDENTITY;  }
> 
> +static inline bool domain_use_first_level(struct dmar_domain *domain) {
> + return domain->flags & DOMAIN_FLAG_USE_FIRST_LEVEL; }
> +
>  static inline int domain_pfn_supported(struct dmar_domain *domain,
>  unsigned long pfn)
>  {
> @@ -2288,6 +2293,8 @@ static int __domain_mapping(struct dmar_domain
> *domain, unsigned long iov_pfn,
>   return -EINVAL;
> 
>   prot &= DMA_PTE_READ | DMA_PTE_WRITE | DMA_PTE_SNP;
> + if (domain_use_first_level(domain))
> + prot |= DMA_FL_PTE_PRESENT | DMA_FL_PTE_XD;
> 
>   if (!sg) {
>   sg_res = nr_pages;
> @@ -2515,6 +2522,36 @@ dmar_search_domain_by_dev_info(int segment, int bus,
> int devfn)
>   return NULL;
>  }
> 
> +static int domain_setup_first_level(struct intel_iommu *iommu,
> + struct dmar_domain *domain,
> + struct device *dev,
> + int pasid)
> +{
> + int flags = PASID_FLAG_SUPERVISOR_MODE;

Hi Baolu,

Could you explain a bit why PASID_FLAG_SUPERVISOR_MODE is
required?

Regards,
Yi Liu

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu