IOMMU Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
@ 2020-09-24 14:08 David Woodhouse
  2020-09-25  1:52 ` Lu Baolu
  0 siblings, 1 reply; 3+ messages in thread
From: David Woodhouse @ 2020-09-24 14:08 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: iommu

[-- Attachment #1.1: Type: text/plain, Size: 2731 bytes --]

From: David Woodhouse <dwmw@amazon.co.uk>

Instead of bailing out completely, such a unit can still be used for
interrupt remapping.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
 drivers/iommu/intel/dmar.c | 46 +++++++++++++++++++++++++-------------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 93e6345f3414..4420a759f095 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -1024,8 +1024,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 {
 	struct intel_iommu *iommu;
 	u32 ver, sts;
-	int agaw = 0;
-	int msagaw = 0;
+	int agaw = -1;
+	int msagaw = -1;
 	int err;
 
 	if (!drhd->reg_base_addr) {
@@ -1050,17 +1050,28 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 	}
 
 	err = -EINVAL;
-	agaw = iommu_calculate_agaw(iommu);
-	if (agaw < 0) {
-		pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
-			iommu->seq_id);
-		goto err_unmap;
-	}
-	msagaw = iommu_calculate_max_sagaw(iommu);
-	if (msagaw < 0) {
-		pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
-			iommu->seq_id);
-		goto err_unmap;
+	if (cap_sagaw(iommu->cap) == 0) {
+		pr_info("%s: No supported address widths. Not attempting DMA translation.\n",
+			iommu->name);
+		drhd->ignored = 1;
+	}
+
+	if (!drhd->ignored) {
+		agaw = iommu_calculate_agaw(iommu);
+		if (agaw < 0) {
+			pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
+			       iommu->seq_id);
+			drhd->ignored = 1;
+		}
+	}
+	if (!drhd->ignored) {
+		msagaw = iommu_calculate_max_sagaw(iommu);
+		if (msagaw < 0) {
+			pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
+			       iommu->seq_id);
+			drhd->ignored = 1;
+			agaw = -1;
+		}
 	}
 	iommu->agaw = agaw;
 	iommu->msagaw = msagaw;
@@ -1087,7 +1098,12 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 	raw_spin_lock_init(&iommu->register_lock);
 
-	if (intel_iommu_enabled) {
+	/*
+	 * This is only for hotplug; at boot time intel_iommu_enabled won't
+	 * be set yet. When intel_iommu_init() runs, it registers the units
+	 * present at boot time, then sets intel_iommu_enabled.
+	 */
+	if (intel_iommu_enabled && !drhd->ignored) {
 		err = iommu_device_sysfs_add(&iommu->iommu, NULL,
 					     intel_iommu_groups,
 					     "%s", iommu->name);
@@ -1117,7 +1133,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 static void free_iommu(struct intel_iommu *iommu)
 {
-	if (intel_iommu_enabled) {
+	if (intel_iommu_enabled && iommu->iommu.ops) {
 		iommu_device_unregister(&iommu->iommu);
 		iommu_device_sysfs_remove(&iommu->iommu);
 	}
-- 
2.17.1


[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]

[-- Attachment #2: Type: text/plain, Size: 156 bytes --]

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

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

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2020-09-24 14:08 [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths David Woodhouse
@ 2020-09-25  1:52 ` Lu Baolu
  2020-10-07  9:52   ` Joerg Roedel
  0 siblings, 1 reply; 3+ messages in thread
From: Lu Baolu @ 2020-09-25  1:52 UTC (permalink / raw)
  To: David Woodhouse, Joerg Roedel; +Cc: iommu


On 9/24/20 10:08 PM, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
> 
> Instead of bailing out completely, such a unit can still be used for
> interrupt remapping.

Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>

Best regards,
baolu

> 
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> ---
>   drivers/iommu/intel/dmar.c | 46 +++++++++++++++++++++++++-------------
>   1 file changed, 31 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
> index 93e6345f3414..4420a759f095 100644
> --- a/drivers/iommu/intel/dmar.c
> +++ b/drivers/iommu/intel/dmar.c
> @@ -1024,8 +1024,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   {
>   	struct intel_iommu *iommu;
>   	u32 ver, sts;
> -	int agaw = 0;
> -	int msagaw = 0;
> +	int agaw = -1;
> +	int msagaw = -1;
>   	int err;
>   
>   	if (!drhd->reg_base_addr) {
> @@ -1050,17 +1050,28 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   	}
>   
>   	err = -EINVAL;
> -	agaw = iommu_calculate_agaw(iommu);
> -	if (agaw < 0) {
> -		pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
> -			iommu->seq_id);
> -		goto err_unmap;
> -	}
> -	msagaw = iommu_calculate_max_sagaw(iommu);
> -	if (msagaw < 0) {
> -		pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
> -			iommu->seq_id);
> -		goto err_unmap;
> +	if (cap_sagaw(iommu->cap) == 0) {
> +		pr_info("%s: No supported address widths. Not attempting DMA translation.\n",
> +			iommu->name);
> +		drhd->ignored = 1;
> +	}
> +
> +	if (!drhd->ignored) {
> +		agaw = iommu_calculate_agaw(iommu);
> +		if (agaw < 0) {
> +			pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
> +			       iommu->seq_id);
> +			drhd->ignored = 1;
> +		}
> +	}
> +	if (!drhd->ignored) {
> +		msagaw = iommu_calculate_max_sagaw(iommu);
> +		if (msagaw < 0) {
> +			pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
> +			       iommu->seq_id);
> +			drhd->ignored = 1;
> +			agaw = -1;
> +		}
>   	}
>   	iommu->agaw = agaw;
>   	iommu->msagaw = msagaw;
> @@ -1087,7 +1098,12 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   
>   	raw_spin_lock_init(&iommu->register_lock);
>   
> -	if (intel_iommu_enabled) {
> +	/*
> +	 * This is only for hotplug; at boot time intel_iommu_enabled won't
> +	 * be set yet. When intel_iommu_init() runs, it registers the units
> +	 * present at boot time, then sets intel_iommu_enabled.
> +	 */
> +	if (intel_iommu_enabled && !drhd->ignored) {
>   		err = iommu_device_sysfs_add(&iommu->iommu, NULL,
>   					     intel_iommu_groups,
>   					     "%s", iommu->name);
> @@ -1117,7 +1133,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   
>   static void free_iommu(struct intel_iommu *iommu)
>   {
> -	if (intel_iommu_enabled) {
> +	if (intel_iommu_enabled && iommu->iommu.ops) {
>   		iommu_device_unregister(&iommu->iommu);
>   		iommu_device_sysfs_remove(&iommu->iommu);
>   	}
> 
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

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

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2020-09-25  1:52 ` Lu Baolu
@ 2020-10-07  9:52   ` Joerg Roedel
  0 siblings, 0 replies; 3+ messages in thread
From: Joerg Roedel @ 2020-10-07  9:52 UTC (permalink / raw)
  To: Lu Baolu; +Cc: iommu, David Woodhouse

On Fri, Sep 25, 2020 at 09:52:31AM +0800, Lu Baolu wrote:
> 
> On 9/24/20 10:08 PM, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@amazon.co.uk>
> > 
> > Instead of bailing out completely, such a unit can still be used for
> > interrupt remapping.
> 
> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>

Applied, thanks.

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

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

end of thread, back to index

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-24 14:08 [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths David Woodhouse
2020-09-25  1:52 ` Lu Baolu
2020-10-07  9:52   ` Joerg Roedel

IOMMU Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-iommu/0 linux-iommu/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-iommu linux-iommu/ https://lore.kernel.org/linux-iommu \
		iommu@lists.linux-foundation.org
	public-inbox-index linux-iommu

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.linux-foundation.lists.iommu


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