Thread (3 messages) 3 messages, 2 authors, 2021-11-05

Re: [PATCH] ACPI/IORT: Add 'smmu=off' command line option

flat view

From: Robin Murphy <robin.murphy@arm.com>
Date: 2021-09-15 20:13:06
Also in: lkml

On 2021-09-15 13:00, Yao Hongbo wrote:
Add a generic command line option to disable arm smmu drivers.
iommu.passthrough can only bypass the IOMMU for DMA, but
sometimes we need to ignore all available SMMUs.
Please elaborate on "sometimes" - what's the use-case for this which can't already be achieved by other means like module_blacklist, switching kernel images, ACPI table overrides, and so on?
This patch is only used for acpi on arm64.
And yet the documentation implies that it works for all arm64 systems :/

And furthermore, why? If it's genuinely useful to disable SMMUs on ACPI-based systems, surely it must be equally useful to disable SMMUs on DT-based systems?
quoted hunk ↗ jump to hunk
Signed-off-by: Yao Hongbo <redacted>
---
  Documentation/admin-guide/kernel-parameters.txt |  4 ++++
  drivers/acpi/arm64/iort.c                       | 18 +++++++++++++++++-
  2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 91ba391f..6cffd91 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5198,6 +5198,10 @@
  	smart2=		[HW]
  			Format: <io1>[,<io2>[,...,<io8>]]
  
+	smmu=           [ARM64]
+			Format: {off}
+			off: Disable arm smmu driver.
There are at least two Arm SMMU drivers; as a user I might be wondering about the ambiguity there.
quoted hunk ↗ jump to hunk
+
  	smsc-ircc2.nopnp	[HW] Don't use PNP to discover SMC devices
  	smsc-ircc2.ircc_cfg=	[HW] Device configuration I/O port
  	smsc-ircc2.ircc_sir=	[HW] SIR base I/O port
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 3b23fb7..70f92e7 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -40,6 +40,22 @@ struct iort_fwnode {
  static LIST_HEAD(iort_fwnode_list);
  static DEFINE_SPINLOCK(iort_fwnode_lock);
  
+static bool acpi_smmu_disabled;
+
+static int __init acpi_smmu_parse(char *str)
+{
+	if (!str)
+		return -EINVAL;
+
+	if (!strncmp(str, "off", 3)) {
+		acpi_smmu_disabled = true;
+		pr_info("SMMU disabled\n");
+	}
+
+	return 0;
+}
+__setup("smmu=", acpi_smmu_parse);
+
  /**
   * iort_set_fwnode() - Create iort_fwnode and use it to register
   *		       iommu data in the iort_fwnode_list
@@ -1596,7 +1612,7 @@ static void __init iort_init_platform_devices(void)
  		iort_enable_acs(iort_node);
  
  		ops = iort_get_dev_cfg(iort_node);
-		if (ops) {
+		if (ops && !acpi_smmu_disabled) {
This will also effectively disable PMCGs, which is an undocumented side-effect, and not necessarily desirable - PMCG functionality is largely orthogonal, and may potentially be used to monitor traffic even when the associated SMMU instance is disabled.

TBH there's really nothing SMMU-specific about this at all. I know I've had a number of debugging situations where it would have been handy to have a way to prevent a specific built-in driver from binding automatically during boot, so if you really have got a compelling reason to need it for SMMU, then you could still implement it generically in a way that everyone could benefit from.

Thanks,
Robin.
  			fwnode = acpi_alloc_fwnode_static();
  			if (!fwnode)
  				return;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help