All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Xingang <wangxingang5@huawei.com>
To: <will@kernel.org>, <joro@8bytes.org>, <robh+dt@kernel.org>,
	<frowand.list@gmail.com>
Cc: <helgaas@kernel.org>, <gregkh@linuxfoundation.org>,
	<iommu@lists.linux-foundation.org>,
	<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <xieyingtai@huawei.com>,
	<wangxingang5@huawei.com>
Subject: [PATCH v2] iommu/of: Fix pci_request_acs() before enumerating PCI devices
Date: Mon, 17 May 2021 13:17:05 +0000	[thread overview]
Message-ID: <1621257425-37856-1-git-send-email-wangxingang5@huawei.com> (raw)

From: Xingang Wang <wangxingang5@huawei.com>

When booting with devicetree, the pci_request_acs() is called after the
enumeration and initialization of PCI devices, thus the ACS is not
enabled. This patch add check for IOMMU in of_core_init(), and call
pci_request_acs() when iommu is detected, making sure that the ACS will
be enabled.

Fixes: 6bf6c24720d33 ("iommu/of: Request ACS from the PCI core when
configuring IOMMU linkage")
Signed-off-by: Xingang Wang <wangxingang5@huawei.com>
---
 drivers/iommu/of_iommu.c | 1 -
 drivers/of/base.c        | 9 ++++++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

Change log:
v1->v2:
 - remove pci_request_acs() in of_iommu_configure
 - check and call pci_request_acs() in of_core_init()

diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index a9d2df001149..54a14da242cc 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -205,7 +205,6 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
 			.np = master_np,
 		};
 
-		pci_request_acs();
 		err = pci_for_each_dma_alias(to_pci_dev(dev),
 					     of_pci_iommu_init, &info);
 	} else {
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 48e941f99558..95cd8f0e5435 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -24,6 +24,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
+#include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -166,7 +167,7 @@ void __of_phandle_cache_inv_entry(phandle handle)
 void __init of_core_init(void)
 {
 	struct device_node *np;
-
+	bool of_iommu_detect = false;
 
 	/* Create the kset, and register existing nodes */
 	mutex_lock(&of_mutex);
@@ -180,6 +181,12 @@ void __init of_core_init(void)
 		__of_attach_node_sysfs(np);
 		if (np->phandle && !phandle_cache[of_phandle_cache_hash(np->phandle)])
 			phandle_cache[of_phandle_cache_hash(np->phandle)] = np;
+
+		/* Detect IOMMU and make sure ACS will be enabled */
+		if (!of_iommu_detect && of_get_property(np, "iommu-map", NULL)) {
+			of_iommu_detect = true;
+			pci_request_acs();
+		}
 	}
 	mutex_unlock(&of_mutex);
 
-- 
2.19.1


WARNING: multiple messages have this Message-ID (diff)
From: Wang Xingang <wangxingang5@huawei.com>
To: <will@kernel.org>, <joro@8bytes.org>, <robh+dt@kernel.org>,
	<frowand.list@gmail.com>
Cc: xieyingtai@huawei.com, devicetree@vger.kernel.org,
	wangxingang5@huawei.com, gregkh@linuxfoundation.org,
	linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org,
	helgaas@kernel.org, linux-pci@vger.kernel.org
Subject: [PATCH v2] iommu/of: Fix pci_request_acs() before enumerating PCI devices
Date: Mon, 17 May 2021 13:17:05 +0000	[thread overview]
Message-ID: <1621257425-37856-1-git-send-email-wangxingang5@huawei.com> (raw)

From: Xingang Wang <wangxingang5@huawei.com>

When booting with devicetree, the pci_request_acs() is called after the
enumeration and initialization of PCI devices, thus the ACS is not
enabled. This patch add check for IOMMU in of_core_init(), and call
pci_request_acs() when iommu is detected, making sure that the ACS will
be enabled.

Fixes: 6bf6c24720d33 ("iommu/of: Request ACS from the PCI core when
configuring IOMMU linkage")
Signed-off-by: Xingang Wang <wangxingang5@huawei.com>
---
 drivers/iommu/of_iommu.c | 1 -
 drivers/of/base.c        | 9 ++++++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

Change log:
v1->v2:
 - remove pci_request_acs() in of_iommu_configure
 - check and call pci_request_acs() in of_core_init()

diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index a9d2df001149..54a14da242cc 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -205,7 +205,6 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
 			.np = master_np,
 		};
 
-		pci_request_acs();
 		err = pci_for_each_dma_alias(to_pci_dev(dev),
 					     of_pci_iommu_init, &info);
 	} else {
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 48e941f99558..95cd8f0e5435 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -24,6 +24,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
+#include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -166,7 +167,7 @@ void __of_phandle_cache_inv_entry(phandle handle)
 void __init of_core_init(void)
 {
 	struct device_node *np;
-
+	bool of_iommu_detect = false;
 
 	/* Create the kset, and register existing nodes */
 	mutex_lock(&of_mutex);
@@ -180,6 +181,12 @@ void __init of_core_init(void)
 		__of_attach_node_sysfs(np);
 		if (np->phandle && !phandle_cache[of_phandle_cache_hash(np->phandle)])
 			phandle_cache[of_phandle_cache_hash(np->phandle)] = np;
+
+		/* Detect IOMMU and make sure ACS will be enabled */
+		if (!of_iommu_detect && of_get_property(np, "iommu-map", NULL)) {
+			of_iommu_detect = true;
+			pci_request_acs();
+		}
 	}
 	mutex_unlock(&of_mutex);
 
-- 
2.19.1

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

             reply	other threads:[~2021-05-17 13:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-17 13:17 Wang Xingang [this message]
2021-05-17 13:17 ` [PATCH v2] iommu/of: Fix pci_request_acs() before enumerating PCI devices Wang Xingang
2021-05-19 19:14 ` Rob Herring
2021-05-19 19:14   ` Rob Herring
2021-05-20  3:29   ` Xingang Wang
2021-05-20  3:29     ` Xingang Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1621257425-37856-1-git-send-email-wangxingang5@huawei.com \
    --to=wangxingang5@huawei.com \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=helgaas@kernel.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=will@kernel.org \
    --cc=xieyingtai@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.