Linux-PCI Archive on lore.kernel.org
 help / Atom feed
* [PATCH v1 0/2] Add page alignment check in Intel IOMMU.
@ 2019-02-07 18:41 sathyanarayanan.kuppuswamy
  2019-02-07 18:41 ` [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status sathyanarayanan.kuppuswamy
  2019-02-07 18:41 ` [PATCH v1 2/2] iommu/vt-d: Enable ATS only if the device uses page aligned address sathyanarayanan.kuppuswamy
  0 siblings, 2 replies; 13+ messages in thread
From: sathyanarayanan.kuppuswamy @ 2019-02-07 18:41 UTC (permalink / raw)
  To: bhelgaas, joro, dwmw2; +Cc: linux-pci, iommu, linux-kernel

From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>

As per Intel vt-d specification, Rev 3.0 (section 7.5.1.1, title
"Page Request Descriptor"), Intel IOMMU page request descriptor
only uses bits[63:12] of the page address. Hence its required to
enforce that the device will only send page request with
page-aligned address. So, this patch set adds support to verify
whether the device uses page aligned address before enabling the
ATS service in Intel IOMMU driver.

Kuppuswamy Sathyanarayanan (2):
  PCI: ATS: Add function to check ATS page aligned request status.
  iommu/vt-d: Enable ATS only if the device uses page aligned address.

 drivers/iommu/intel-iommu.c   |  1 +
 drivers/pci/ats.c             | 22 ++++++++++++++++++++++
 include/linux/pci.h           |  2 ++
 include/uapi/linux/pci_regs.h |  1 +
 4 files changed, 26 insertions(+)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 18:41 [PATCH v1 0/2] Add page alignment check in Intel IOMMU sathyanarayanan.kuppuswamy
@ 2019-02-07 18:41 ` sathyanarayanan.kuppuswamy
  2019-02-07 20:07   ` Bjorn Helgaas
  2019-02-07 20:38   ` Sinan Kaya
  2019-02-07 18:41 ` [PATCH v1 2/2] iommu/vt-d: Enable ATS only if the device uses page aligned address sathyanarayanan.kuppuswamy
  1 sibling, 2 replies; 13+ messages in thread
From: sathyanarayanan.kuppuswamy @ 2019-02-07 18:41 UTC (permalink / raw)
  To: bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan,
	Keith Busch, Kuppuswamy Sathyanarayanan

From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>

Add a new function to return the status of ATS page aligned request
bit in ATS capability register. This function will be used by
drivers like IOMMU, if it is required to enforce page-aligned
requests in ATS.

Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
Cc: Keith Busch <keith.busch@intel.com>
Suggested-by: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
---
 drivers/pci/ats.c             | 22 ++++++++++++++++++++++
 include/linux/pci.h           |  2 ++
 include/uapi/linux/pci_regs.h |  1 +
 3 files changed, 25 insertions(+)

diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c
index 5b78f3b1b918..7d14b9a1981e 100644
--- a/drivers/pci/ats.c
+++ b/drivers/pci/ats.c
@@ -142,6 +142,28 @@ int pci_ats_queue_depth(struct pci_dev *dev)
 }
 EXPORT_SYMBOL_GPL(pci_ats_queue_depth);
 
+/**
+ * pci_ats_page_aligned - Return ATS page aligned request bit status.
+ * @pdev: the PCI device
+ *
+ * Returns  value > 0 if address is aligned or 0 otherwise.
+ *
+ * As per PCI spec, If page aligned request bit is set, it indicates
+ * the untranslated address is always aligned to a 4096 byte boundary.
+ */
+int pci_ats_page_aligned(struct pci_dev *pdev)
+{
+	u16 cap;
+
+	if (!pdev->ats_cap)
+		return 0;
+
+	pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap);
+
+	return PCI_ATS_CAP_PAGE_ALIGNED(cap);
+}
+EXPORT_SYMBOL_GPL(pci_ats_page_aligned);
+
 #ifdef CONFIG_PCI_PRI
 /**
  * pci_enable_pri - Enable PRI capability
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 65f1d8c2f082..9724a8c0496b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1524,11 +1524,13 @@ void pci_ats_init(struct pci_dev *dev);
 int pci_enable_ats(struct pci_dev *dev, int ps);
 void pci_disable_ats(struct pci_dev *dev);
 int pci_ats_queue_depth(struct pci_dev *dev);
+int pci_ats_page_aligned(struct pci_dev *dev);
 #else
 static inline void pci_ats_init(struct pci_dev *d) { }
 static inline int pci_enable_ats(struct pci_dev *d, int ps) { return -ENODEV; }
 static inline void pci_disable_ats(struct pci_dev *d) { }
 static inline int pci_ats_queue_depth(struct pci_dev *d) { return -ENODEV; }
+static inline int pci_ats_page_aligned(struct pci_dev *dev) { return 0; }
 #endif
 
 #ifdef CONFIG_PCIE_PTM
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index e1e9888c85e6..d42a759867b8 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -866,6 +866,7 @@
 #define PCI_ATS_CAP		0x04	/* ATS Capability Register */
 #define  PCI_ATS_CAP_QDEP(x)	((x) & 0x1f)	/* Invalidate Queue Depth */
 #define  PCI_ATS_MAX_QDEP	32	/* Max Invalidate Queue Depth */
+#define  PCI_ATS_CAP_PAGE_ALIGNED(x)	0x0020 /* Page Aligned Request */
 #define PCI_ATS_CTRL		0x06	/* ATS Control Register */
 #define  PCI_ATS_CTRL_ENABLE	0x8000	/* ATS Enable */
 #define  PCI_ATS_CTRL_STU(x)	((x) & 0x1f)	/* Smallest Translation Unit */
-- 
2.20.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 2/2] iommu/vt-d: Enable ATS only if the device uses page aligned address.
  2019-02-07 18:41 [PATCH v1 0/2] Add page alignment check in Intel IOMMU sathyanarayanan.kuppuswamy
  2019-02-07 18:41 ` [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status sathyanarayanan.kuppuswamy
@ 2019-02-07 18:41 ` sathyanarayanan.kuppuswamy
  1 sibling, 0 replies; 13+ messages in thread
From: sathyanarayanan.kuppuswamy @ 2019-02-07 18:41 UTC (permalink / raw)
  To: bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan,
	Keith Busch, Kuppuswamy Sathyanarayanan

From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>

As per Intel vt-d specification, Rev 3.0 (section 7.5.1.1, title "Page
Request Descriptor"), Intel IOMMU page request descriptor only uses
bits[63:12] of the page address. Hence Intel IOMMU driver would only
permit devices that advertise they would only send page aligned requests
to participate in ATS service.

Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
Cc: Keith Busch <keith.busch@intel.com>
Suggested-by: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
---
 drivers/iommu/intel-iommu.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 1457f931218e..6a0b5270cd2e 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1406,6 +1406,7 @@ static void iommu_enable_dev_iotlb(struct device_domain_info *info)
 		info->pri_enabled = 1;
 #endif
 	if (!pdev->untrusted && info->ats_supported &&
+	    pci_ats_page_aligned(pdev) &&
 	    !pci_enable_ats(pdev, VTD_PAGE_SHIFT)) {
 		info->ats_enabled = 1;
 		domain_update_iotlb(info->domain);
-- 
2.20.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 18:41 ` [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status sathyanarayanan.kuppuswamy
@ 2019-02-07 20:07   ` Bjorn Helgaas
  2019-02-07 20:39     ` sathyanarayanan kuppuswamy
  2019-02-07 20:38   ` Sinan Kaya
  1 sibling, 1 reply; 13+ messages in thread
From: Bjorn Helgaas @ 2019-02-07 20:07 UTC (permalink / raw)
  To: sathyanarayanan.kuppuswamy
  Cc: joro, dwmw2, linux-pci, iommu, linux-kernel, Ashok Raj,
	Jacob Pan, Keith Busch

Hi Kuppuswamy,

Previous changes to ats.c used subject lines starting with just
"PCI:".

I think it does make sense to include "ATS", but please do it in
the way we do it for other PCI features, e.g.,

  PCI/ATS: Add pci_ats_page_aligned() interface

On Thu, Feb 07, 2019 at 10:41:13AM -0800, sathyanarayanan.kuppuswamy@linux.intel.com wrote:
> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
> 
> Add a new function to return the status of ATS page aligned request
> bit in ATS capability register. This function will be used by
> drivers like IOMMU, if it is required to enforce page-aligned
> requests in ATS.

"return the Page Aligned Request bit in the ATS Capability Register"

This is just to make the terminology match the PCIe spec exactly so
it's easier to look up.

> Cc: Ashok Raj <ashok.raj@intel.com>
> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
> Cc: Keith Busch <keith.busch@intel.com>
> Suggested-by: Ashok Raj <ashok.raj@intel.com>
> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
> ---
>  drivers/pci/ats.c             | 22 ++++++++++++++++++++++
>  include/linux/pci.h           |  2 ++
>  include/uapi/linux/pci_regs.h |  1 +
>  3 files changed, 25 insertions(+)
> 
> diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c
> index 5b78f3b1b918..7d14b9a1981e 100644
> --- a/drivers/pci/ats.c
> +++ b/drivers/pci/ats.c
> @@ -142,6 +142,28 @@ int pci_ats_queue_depth(struct pci_dev *dev)
>  }
>  EXPORT_SYMBOL_GPL(pci_ats_queue_depth);
>  
> +/**
> + * pci_ats_page_aligned - Return ATS page aligned request bit status.

Capitalize name of bit as above.

> + * @pdev: the PCI device
> + *
> + * Returns  value > 0 if address is aligned or 0 otherwise.

s/  / /

"if Untranslated Addresses generated by the device are always
aligned or ..."

> + *
> + * As per PCI spec, If page aligned request bit is set, it indicates
> + * the untranslated address is always aligned to a 4096 byte boundary.

"Per PCIe r4.0, sec 10.5.1.2, if the Page Aligned Request bit,
Untranslated Addresses generated by the device are always aligned to a
4096 byte boundary."

> + */
> +int pci_ats_page_aligned(struct pci_dev *pdev)
> +{
> +	u16 cap;
> +
> +	if (!pdev->ats_cap)
> +		return 0;
> +
> +	pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap);
> +
> +	return PCI_ATS_CAP_PAGE_ALIGNED(cap);
> +}
> +EXPORT_SYMBOL_GPL(pci_ats_page_aligned);
> +
>  #ifdef CONFIG_PCI_PRI
>  /**
>   * pci_enable_pri - Enable PRI capability
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 65f1d8c2f082..9724a8c0496b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1524,11 +1524,13 @@ void pci_ats_init(struct pci_dev *dev);
>  int pci_enable_ats(struct pci_dev *dev, int ps);
>  void pci_disable_ats(struct pci_dev *dev);
>  int pci_ats_queue_depth(struct pci_dev *dev);
> +int pci_ats_page_aligned(struct pci_dev *dev);
>  #else
>  static inline void pci_ats_init(struct pci_dev *d) { }
>  static inline int pci_enable_ats(struct pci_dev *d, int ps) { return -ENODEV; }
>  static inline void pci_disable_ats(struct pci_dev *d) { }
>  static inline int pci_ats_queue_depth(struct pci_dev *d) { return -ENODEV; }
> +static inline int pci_ats_page_aligned(struct pci_dev *dev) { return 0; }
>  #endif
>  
>  #ifdef CONFIG_PCIE_PTM
> diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
> index e1e9888c85e6..d42a759867b8 100644
> --- a/include/uapi/linux/pci_regs.h
> +++ b/include/uapi/linux/pci_regs.h
> @@ -866,6 +866,7 @@
>  #define PCI_ATS_CAP		0x04	/* ATS Capability Register */
>  #define  PCI_ATS_CAP_QDEP(x)	((x) & 0x1f)	/* Invalidate Queue Depth */
>  #define  PCI_ATS_MAX_QDEP	32	/* Max Invalidate Queue Depth */
> +#define  PCI_ATS_CAP_PAGE_ALIGNED(x)	0x0020 /* Page Aligned Request */

This is wrong because it *always* returns "true", regardless of the
value of the ATS Capability register.

I would prefer this:

  #define  PCI_ATS_CAP_PAGE_ALIGNED   0x0020

and then test it like this:

  if (cap & PCI_ATS_CAP_PAGE_ALIGNED)
    return 1;
  return 0;

>  #define PCI_ATS_CTRL		0x06	/* ATS Control Register */
>  #define  PCI_ATS_CTRL_ENABLE	0x8000	/* ATS Enable */
>  #define  PCI_ATS_CTRL_STU(x)	((x) & 0x1f)	/* Smallest Translation Unit */
> -- 
> 2.20.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 18:41 ` [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status sathyanarayanan.kuppuswamy
  2019-02-07 20:07   ` Bjorn Helgaas
@ 2019-02-07 20:38   ` Sinan Kaya
  2019-02-07 22:16     ` sathyanarayanan kuppuswamy
  1 sibling, 1 reply; 13+ messages in thread
From: Sinan Kaya @ 2019-02-07 20:38 UTC (permalink / raw)
  To: sathyanarayanan.kuppuswamy, bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan, Keith Busch


On 2/7/2019 1:41 PM, sathyanarayanan.kuppuswamy@linux.intel.com wrote:
> + * As per PCI spec, If page aligned request bit is set, it indicates
> + * the untranslated address is always aligned to a 4096 byte boundary.
> + */
> +int pci_ats_page_aligned(struct pci_dev *pdev)
> +{
> +	u16 cap;
> +
> +	if (!pdev->ats_cap)
> +		return 0;
> +
> +	pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap);

If I remember this right, aligned request is only supported on ATS v1.1
but not supported on v1.0.

Can you please check the spec?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 20:07   ` Bjorn Helgaas
@ 2019-02-07 20:39     ` sathyanarayanan kuppuswamy
  0 siblings, 0 replies; 13+ messages in thread
From: sathyanarayanan kuppuswamy @ 2019-02-07 20:39 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: joro, dwmw2, linux-pci, iommu, linux-kernel, Ashok Raj,
	Jacob Pan, Keith Busch


On 2/7/19 12:07 PM, Bjorn Helgaas wrote:
> Hi Kuppuswamy,
>
> Previous changes to ats.c used subject lines starting with just
> "PCI:".
>
> I think it does make sense to include "ATS", but please do it in
> the way we do it for other PCI features, e.g.,
>
>    PCI/ATS: Add pci_ats_page_aligned() interface
Got it. I will follow PCI/ATS format.
>
> On Thu, Feb 07, 2019 at 10:41:13AM -0800, sathyanarayanan.kuppuswamy@linux.intel.com wrote:
>> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
>>
>> Add a new function to return the status of ATS page aligned request
>> bit in ATS capability register. This function will be used by
>> drivers like IOMMU, if it is required to enforce page-aligned
>> requests in ATS.
> "return the Page Aligned Request bit in the ATS Capability Register"
>
> This is just to make the terminology match the PCIe spec exactly so
> it's easier to look up.
Will fix it in next version.
>
>> Cc: Ashok Raj <ashok.raj@intel.com>
>> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
>> Cc: Keith Busch <keith.busch@intel.com>
>> Suggested-by: Ashok Raj <ashok.raj@intel.com>
>> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
>> ---
>>   drivers/pci/ats.c             | 22 ++++++++++++++++++++++
>>   include/linux/pci.h           |  2 ++
>>   include/uapi/linux/pci_regs.h |  1 +
>>   3 files changed, 25 insertions(+)
>>
>> diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c
>> index 5b78f3b1b918..7d14b9a1981e 100644
>> --- a/drivers/pci/ats.c
>> +++ b/drivers/pci/ats.c
>> @@ -142,6 +142,28 @@ int pci_ats_queue_depth(struct pci_dev *dev)
>>   }
>>   EXPORT_SYMBOL_GPL(pci_ats_queue_depth);
>>   
>> +/**
>> + * pci_ats_page_aligned - Return ATS page aligned request bit status.
> Capitalize name of bit as above.
Agreed.
>
>> + * @pdev: the PCI device
>> + *
>> + * Returns  value > 0 if address is aligned or 0 otherwise.
> s/  / /
>
> "if Untranslated Addresses generated by the device are always
> aligned or ..."
>
>> + *
>> + * As per PCI spec, If page aligned request bit is set, it indicates
>> + * the untranslated address is always aligned to a 4096 byte boundary.
> "Per PCIe r4.0, sec 10.5.1.2, if the Page Aligned Request bit,
> Untranslated Addresses generated by the device are always aligned to a
> 4096 byte boundary."
>
>> + */
>> +int pci_ats_page_aligned(struct pci_dev *pdev)
>> +{
>> +	u16 cap;
>> +
>> +	if (!pdev->ats_cap)
>> +		return 0;
>> +
>> +	pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap);
>> +
>> +	return PCI_ATS_CAP_PAGE_ALIGNED(cap);
>> +}
>> +EXPORT_SYMBOL_GPL(pci_ats_page_aligned);
>> +
>>   #ifdef CONFIG_PCI_PRI
>>   /**
>>    * pci_enable_pri - Enable PRI capability
>> diff --git a/include/linux/pci.h b/include/linux/pci.h
>> index 65f1d8c2f082..9724a8c0496b 100644
>> --- a/include/linux/pci.h
>> +++ b/include/linux/pci.h
>> @@ -1524,11 +1524,13 @@ void pci_ats_init(struct pci_dev *dev);
>>   int pci_enable_ats(struct pci_dev *dev, int ps);
>>   void pci_disable_ats(struct pci_dev *dev);
>>   int pci_ats_queue_depth(struct pci_dev *dev);
>> +int pci_ats_page_aligned(struct pci_dev *dev);
>>   #else
>>   static inline void pci_ats_init(struct pci_dev *d) { }
>>   static inline int pci_enable_ats(struct pci_dev *d, int ps) { return -ENODEV; }
>>   static inline void pci_disable_ats(struct pci_dev *d) { }
>>   static inline int pci_ats_queue_depth(struct pci_dev *d) { return -ENODEV; }
>> +static inline int pci_ats_page_aligned(struct pci_dev *dev) { return 0; }
>>   #endif
>>   
>>   #ifdef CONFIG_PCIE_PTM
>> diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
>> index e1e9888c85e6..d42a759867b8 100644
>> --- a/include/uapi/linux/pci_regs.h
>> +++ b/include/uapi/linux/pci_regs.h
>> @@ -866,6 +866,7 @@
>>   #define PCI_ATS_CAP		0x04	/* ATS Capability Register */
>>   #define  PCI_ATS_CAP_QDEP(x)	((x) & 0x1f)	/* Invalidate Queue Depth */
>>   #define  PCI_ATS_MAX_QDEP	32	/* Max Invalidate Queue Depth */
>> +#define  PCI_ATS_CAP_PAGE_ALIGNED(x)	0x0020 /* Page Aligned Request */
> This is wrong because it *always* returns "true", regardless of the
> value of the ATS Capability register.
>
> I would prefer this:
>
>    #define  PCI_ATS_CAP_PAGE_ALIGNED   0x0020
Good catch. it looks like I messed it when I did some cleanup. Sorry 
about it. Initially it was (x & 0x0020).
>
> and then test it like this:
>
>    if (cap & PCI_ATS_CAP_PAGE_ALIGNED)
>      return 1;
>    return 0;
Ok.
>>   #define PCI_ATS_CTRL		0x06	/* ATS Control Register */
>>   #define  PCI_ATS_CTRL_ENABLE	0x8000	/* ATS Enable */
>>   #define  PCI_ATS_CTRL_STU(x)	((x) & 0x1f)	/* Smallest Translation Unit */
>> -- 
>> 2.20.1
>>
-- 
Sathyanarayanan Kuppuswamy
Linux kernel developer


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 20:38   ` Sinan Kaya
@ 2019-02-07 22:16     ` sathyanarayanan kuppuswamy
  2019-02-08  1:58       ` Sinan Kaya
  0 siblings, 1 reply; 13+ messages in thread
From: sathyanarayanan kuppuswamy @ 2019-02-07 22:16 UTC (permalink / raw)
  To: Sinan Kaya, bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan, Keith Busch


On 2/7/19 12:38 PM, Sinan Kaya wrote:
>
> On 2/7/2019 1:41 PM, sathyanarayanan.kuppuswamy@linux.intel.com wrote:
>> + * As per PCI spec, If page aligned request bit is set, it indicates
>> + * the untranslated address is always aligned to a 4096 byte boundary.
>> + */
>> +int pci_ats_page_aligned(struct pci_dev *pdev)
>> +{
>> +    u16 cap;
>> +
>> +    if (!pdev->ats_cap)
>> +        return 0;
>> +
>> +    pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap);
>
> If I remember this right, aligned request is only supported on ATS v1.1
> but not supported on v1.0.
Its added in v1.1.
>
> Can you please check the spec?
>
-- 
Sathyanarayanan Kuppuswamy
Linux kernel developer


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-07 22:16     ` sathyanarayanan kuppuswamy
@ 2019-02-08  1:58       ` Sinan Kaya
  2019-02-09  1:02         ` sathyanarayanan kuppuswamy
  0 siblings, 1 reply; 13+ messages in thread
From: Sinan Kaya @ 2019-02-08  1:58 UTC (permalink / raw)
  To: sathyanarayanan.kuppuswamy, bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan, Keith Busch


On 2/7/2019 5:16 PM, sathyanarayanan kuppuswamy wrote:
>> If I remember this right, aligned request is only supported on ATS v1.1
>> but not supported on v1.0.
> Its added in v1.1.

This means that you should probably have some kind of version check
here.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-08  1:58       ` Sinan Kaya
@ 2019-02-09  1:02         ` sathyanarayanan kuppuswamy
  2019-02-09  4:49           ` Sinan Kaya
  0 siblings, 1 reply; 13+ messages in thread
From: sathyanarayanan kuppuswamy @ 2019-02-09  1:02 UTC (permalink / raw)
  To: Sinan Kaya, bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan, Keith Busch


On 2/7/19 5:58 PM, Sinan Kaya wrote:
>
> On 2/7/2019 5:16 PM, sathyanarayanan kuppuswamy wrote:
>>> If I remember this right, aligned request is only supported on ATS v1.1
>>> but not supported on v1.0.
>> Its added in v1.1.
>
> This means that you should probably have some kind of version check
> here.

There is no version field in ATS v1.0 spec. Also, If I follow the 
history log in PCI spec, I think ATS if first added at v1.2. Please 
correct me if I am wrong.

-- 
Sathyanarayanan Kuppuswamy
Linux kernel developer


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-09  1:02         ` sathyanarayanan kuppuswamy
@ 2019-02-09  4:49           ` Sinan Kaya
  2019-02-11 19:15             ` Raj, Ashok
  0 siblings, 1 reply; 13+ messages in thread
From: Sinan Kaya @ 2019-02-09  4:49 UTC (permalink / raw)
  To: sathyanarayanan.kuppuswamy, bhelgaas, joro, dwmw2
  Cc: linux-pci, iommu, linux-kernel, Ashok Raj, Jacob Pan, Keith Busch

On 2/8/2019 8:02 PM, sathyanarayanan kuppuswamy wrote:
>> This means that you should probably have some kind of version check
>> here.
> 
> There is no version field in ATS v1.0 spec. Also, If I follow the 
> history log in PCI spec, I think ATS if first added at v1.2. Please 
> correct me if I am wrong.

v1.2 was incorporated into PCIe spec at that time. However, the ATS spec
is old and there could be some HW that could claim to be ATS compatible.
I know AMD GPUs declare ATS capability.

See this ECN

https://composter.com.ua/documents/ats_r1.1_26Jan09.pdf

You need to validate the version field from ATS capability header to be
1 before reading this register.

See Table 5-1:  ATS Extended Capability Header

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-09  4:49           ` Sinan Kaya
@ 2019-02-11 19:15             ` Raj, Ashok
  2019-02-11 19:24               ` sathyanarayanan kuppuswamy
  2019-02-11 20:35               ` Sinan Kaya
  0 siblings, 2 replies; 13+ messages in thread
From: Raj, Ashok @ 2019-02-11 19:15 UTC (permalink / raw)
  To: Sinan Kaya
  Cc: sathyanarayanan.kuppuswamy, bhelgaas, joro, dwmw2, linux-pci,
	iommu, linux-kernel, Jacob Pan, Keith Busch, Ashok Raj

On Fri, Feb 08, 2019 at 11:49:55PM -0500, Sinan Kaya wrote:
> On 2/8/2019 8:02 PM, sathyanarayanan kuppuswamy wrote:
> >>This means that you should probably have some kind of version check
> >>here.
> >
> >There is no version field in ATS v1.0 spec. Also, If I follow the history
> >log in PCI spec, I think ATS if first added at v1.2. Please correct me if
> >I am wrong.
> 
> v1.2 was incorporated into PCIe spec at that time. However, the ATS spec
> is old and there could be some HW that could claim to be ATS compatible.
> I know AMD GPUs declare ATS capability.

It seems rather odd we have to check for ATS version.

I always assumed unspecified bits (Reserved) must be 0. We only check
this if ATS is enabled, and this particular bit wasn't given away for another
feature.

Is it really required to check for ATS version before consuming this?


> 
> See this ECN
> 
> https://composter.com.ua/documents/ats_r1.1_26Jan09.pdf
> 
> You need to validate the version field from ATS capability header to be
> 1 before reading this register.
> 
> See Table 5-1:  ATS Extended Capability Header

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-11 19:15             ` Raj, Ashok
@ 2019-02-11 19:24               ` sathyanarayanan kuppuswamy
  2019-02-11 20:35               ` Sinan Kaya
  1 sibling, 0 replies; 13+ messages in thread
From: sathyanarayanan kuppuswamy @ 2019-02-11 19:24 UTC (permalink / raw)
  To: Raj, Ashok, Sinan Kaya
  Cc: bhelgaas, joro, dwmw2, linux-pci, iommu, linux-kernel, Jacob Pan,
	Keith Busch


On 2/11/19 11:15 AM, Raj, Ashok wrote:
> On Fri, Feb 08, 2019 at 11:49:55PM -0500, Sinan Kaya wrote:
>> On 2/8/2019 8:02 PM, sathyanarayanan kuppuswamy wrote:
>>>> This means that you should probably have some kind of version check
>>>> here.
>>> There is no version field in ATS v1.0 spec. Also, If I follow the history
>>> log in PCI spec, I think ATS if first added at v1.2. Please correct me if
>>> I am wrong.
>> v1.2 was incorporated into PCIe spec at that time. However, the ATS spec
>> is old and there could be some HW that could claim to be ATS compatible.
>> I know AMD GPUs declare ATS capability.
> It seems rather odd we have to check for ATS version.
>
> I always assumed unspecified bits (Reserved) must be 0. We only check
> this if ATS is enabled, and this particular bit wasn't given away for another
> feature.
>
> Is it really required to check for ATS version before consuming this?
If the version check is required then, it needs to be added before 
reading "Invalidate Queue Depth" value as well.
>
>
>> See this ECN
>>
>> https://composter.com.ua/documents/ats_r1.1_26Jan09.pdf
>>
>> You need to validate the version field from ATS capability header to be
>> 1 before reading this register.
>>
>> See Table 5-1:  ATS Extended Capability Header

-- 
Sathyanarayanan Kuppuswamy
Linux kernel developer


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status.
  2019-02-11 19:15             ` Raj, Ashok
  2019-02-11 19:24               ` sathyanarayanan kuppuswamy
@ 2019-02-11 20:35               ` Sinan Kaya
  1 sibling, 0 replies; 13+ messages in thread
From: Sinan Kaya @ 2019-02-11 20:35 UTC (permalink / raw)
  To: Raj, Ashok
  Cc: sathyanarayanan.kuppuswamy, bhelgaas, joro, dwmw2, linux-pci,
	iommu, linux-kernel, Jacob Pan, Keith Busch

On 2/11/2019 2:15 PM, Raj, Ashok wrote:
> It seems rather odd we have to check for ATS version.
> 
> I always assumed unspecified bits (Reserved) must be 0. We only check
> this if ATS is enabled, and this particular bit wasn't given away for another
> feature.
> 
> Is it really required to check for ATS version before consuming this?

Reading again, it looks like version check is not necessary since it
is implied by the presence of this bit per this paragraph.

Page Aligned Request – If Set, indicates the Untranslated Address is 
always aligned to a 4096 byte boundary.  Setting this bit is 
recommended.  This bit permits software to distinguish between 
implementations compatible with earlier version of this specification 
that permitted a requester to supply anything in bits [11:2].

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, back to index

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-07 18:41 [PATCH v1 0/2] Add page alignment check in Intel IOMMU sathyanarayanan.kuppuswamy
2019-02-07 18:41 ` [PATCH v1 1/2] PCI: ATS: Add function to check ATS page aligned request status sathyanarayanan.kuppuswamy
2019-02-07 20:07   ` Bjorn Helgaas
2019-02-07 20:39     ` sathyanarayanan kuppuswamy
2019-02-07 20:38   ` Sinan Kaya
2019-02-07 22:16     ` sathyanarayanan kuppuswamy
2019-02-08  1:58       ` Sinan Kaya
2019-02-09  1:02         ` sathyanarayanan kuppuswamy
2019-02-09  4:49           ` Sinan Kaya
2019-02-11 19:15             ` Raj, Ashok
2019-02-11 19:24               ` sathyanarayanan kuppuswamy
2019-02-11 20:35               ` Sinan Kaya
2019-02-07 18:41 ` [PATCH v1 2/2] iommu/vt-d: Enable ATS only if the device uses page aligned address sathyanarayanan.kuppuswamy

Linux-PCI Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-pci/0 linux-pci/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-pci linux-pci/ https://lore.kernel.org/linux-pci \
		linux-pci@vger.kernel.org linux-pci@archiver.kernel.org
	public-inbox-index linux-pci


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-pci


AGPL code for this site: git clone https://public-inbox.org/ public-inbox