[v3] iommu/arm-smmu-qcom: hook up qcom_smmu_impl for ACPI boot

Message ID 20210509022607.17534-1-shawn.guo@linaro.org
State Accepted
Commit a51627c5df58480543b0feefbde27d622a49361f
Headers show
Series
  • [v3] iommu/arm-smmu-qcom: hook up qcom_smmu_impl for ACPI boot
Related show

Commit Message

Shawn Guo May 9, 2021, 2:26 a.m.
The hookup with qcom_smmu_impl is required to do ACPI boot on SC8180X
based devices like Lenovo Flex 5G laptop and Microsoft Surface Pro X.
Define acpi_platform_list for these platforms and match them using
acpi_match_platform_list() call, and create qcom_smmu_impl accordingly.

(np == NULL) is used to check ACPI boot, because fwnode of SMMU device
is a static allocation and thus helpers like has_acpi_companion() don't
work here.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

---
Changes for v3:
 - Call acpi_match_platform_list() to match platform in qcom smmu
   driver rather than IORT code.

Changes for v2:
 - Rather than using asl_compiler_id in IORT table, follow suggestion
   from Robin Murphy to use acpi_match_platform_list() to match platform.

 drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

-- 
2.17.1

Comments

Shawn Guo May 23, 2021, 6:05 a.m. | #1
On Sun, May 09, 2021 at 10:26:07AM +0800, Shawn Guo wrote:
> The hookup with qcom_smmu_impl is required to do ACPI boot on SC8180X

> based devices like Lenovo Flex 5G laptop and Microsoft Surface Pro X.

> Define acpi_platform_list for these platforms and match them using

> acpi_match_platform_list() call, and create qcom_smmu_impl accordingly.

> 

> (np == NULL) is used to check ACPI boot, because fwnode of SMMU device

> is a static allocation and thus helpers like has_acpi_companion() don't

> work here.

> 

> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

> ---

> Changes for v3:

>  - Call acpi_match_platform_list() to match platform in qcom smmu

>    driver rather than IORT code.


Hi Robin,

How does this version look?

Shawn

> 

> Changes for v2:

>  - Rather than using asl_compiler_id in IORT table, follow suggestion

>    from Robin Murphy to use acpi_match_platform_list() to match platform.

> 

>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 13 +++++++++++++

>  1 file changed, 13 insertions(+)

> 

> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> index 98b3a1c2a181..f7e187f3fa66 100644

> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> @@ -3,6 +3,7 @@

>   * Copyright (c) 2019, The Linux Foundation. All rights reserved.

>   */

>  

> +#include <linux/acpi.h>

>  #include <linux/adreno-smmu-priv.h>

>  #include <linux/of_device.h>

>  #include <linux/qcom_scm.h>

> @@ -339,10 +340,22 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {

>  	{ }

>  };

>  

> +static struct acpi_platform_list qcom_acpi_platlist[] = {

> +	{ "LENOVO", "CB-01   ", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

> +	{ "QCOM  ", "QCOMEDK2", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

> +	{ }

> +};

> +

>  struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)

>  {

>  	const struct device_node *np = smmu->dev->of_node;

>  

> +	if (np == NULL) {

> +		/* Match platform for ACPI boot */

> +		if (acpi_match_platform_list(qcom_acpi_platlist) >= 0)

> +			return qcom_smmu_create(smmu, &qcom_smmu_impl);

> +	}

> +

>  	if (of_match_node(qcom_smmu_impl_of_match, np))

>  		return qcom_smmu_create(smmu, &qcom_smmu_impl);

>  

> -- 

> 2.17.1

>
Robin Murphy May 24, 2021, 12:09 p.m. | #2
On 2021-05-23 07:05, Shawn Guo wrote:
> On Sun, May 09, 2021 at 10:26:07AM +0800, Shawn Guo wrote:

>> The hookup with qcom_smmu_impl is required to do ACPI boot on SC8180X

>> based devices like Lenovo Flex 5G laptop and Microsoft Surface Pro X.

>> Define acpi_platform_list for these platforms and match them using

>> acpi_match_platform_list() call, and create qcom_smmu_impl accordingly.

>>

>> (np == NULL) is used to check ACPI boot, because fwnode of SMMU device

>> is a static allocation and thus helpers like has_acpi_companion() don't

>> work here.

>>

>> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

>> ---

>> Changes for v3:

>>   - Call acpi_match_platform_list() to match platform in qcom smmu

>>     driver rather than IORT code.

> 

> Hi Robin,

> 

> How does this version look?


So good that I glanced at it, thought "nice!", then having no remaining 
concerns promptly moved on to something else forgot about it. Sorry 
about that!

Reviewed-by: Robin Murphy <robin.murphy@arm.com>


Cheers,
Robin.

> Shawn

> 

>>

>> Changes for v2:

>>   - Rather than using asl_compiler_id in IORT table, follow suggestion

>>     from Robin Murphy to use acpi_match_platform_list() to match platform.

>>

>>   drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 13 +++++++++++++

>>   1 file changed, 13 insertions(+)

>>

>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

>> index 98b3a1c2a181..f7e187f3fa66 100644

>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

>> @@ -3,6 +3,7 @@

>>    * Copyright (c) 2019, The Linux Foundation. All rights reserved.

>>    */

>>   

>> +#include <linux/acpi.h>

>>   #include <linux/adreno-smmu-priv.h>

>>   #include <linux/of_device.h>

>>   #include <linux/qcom_scm.h>

>> @@ -339,10 +340,22 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {

>>   	{ }

>>   };

>>   

>> +static struct acpi_platform_list qcom_acpi_platlist[] = {

>> +	{ "LENOVO", "CB-01   ", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

>> +	{ "QCOM  ", "QCOMEDK2", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

>> +	{ }

>> +};

>> +

>>   struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)

>>   {

>>   	const struct device_node *np = smmu->dev->of_node;

>>   

>> +	if (np == NULL) {

>> +		/* Match platform for ACPI boot */

>> +		if (acpi_match_platform_list(qcom_acpi_platlist) >= 0)

>> +			return qcom_smmu_create(smmu, &qcom_smmu_impl);

>> +	}

>> +

>>   	if (of_match_node(qcom_smmu_impl_of_match, np))

>>   		return qcom_smmu_create(smmu, &qcom_smmu_impl);

>>   

>> -- 

>> 2.17.1

>>
Bjorn Andersson May 25, 2021, 3:58 a.m. | #3
On Sat 08 May 21:26 CDT 2021, Shawn Guo wrote:

> The hookup with qcom_smmu_impl is required to do ACPI boot on SC8180X

> based devices like Lenovo Flex 5G laptop and Microsoft Surface Pro X.

> Define acpi_platform_list for these platforms and match them using

> acpi_match_platform_list() call, and create qcom_smmu_impl accordingly.

> 

> (np == NULL) is used to check ACPI boot, because fwnode of SMMU device

> is a static allocation and thus helpers like has_acpi_companion() don't

> work here.

> 


Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>


Regards,
Bjorn

> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

> ---

> Changes for v3:

>  - Call acpi_match_platform_list() to match platform in qcom smmu

>    driver rather than IORT code.

> 

> Changes for v2:

>  - Rather than using asl_compiler_id in IORT table, follow suggestion

>    from Robin Murphy to use acpi_match_platform_list() to match platform.

> 

>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 13 +++++++++++++

>  1 file changed, 13 insertions(+)

> 

> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> index 98b3a1c2a181..f7e187f3fa66 100644

> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

> @@ -3,6 +3,7 @@

>   * Copyright (c) 2019, The Linux Foundation. All rights reserved.

>   */

>  

> +#include <linux/acpi.h>

>  #include <linux/adreno-smmu-priv.h>

>  #include <linux/of_device.h>

>  #include <linux/qcom_scm.h>

> @@ -339,10 +340,22 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {

>  	{ }

>  };

>  

> +static struct acpi_platform_list qcom_acpi_platlist[] = {

> +	{ "LENOVO", "CB-01   ", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

> +	{ "QCOM  ", "QCOMEDK2", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },

> +	{ }

> +};

> +

>  struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)

>  {

>  	const struct device_node *np = smmu->dev->of_node;

>  

> +	if (np == NULL) {

> +		/* Match platform for ACPI boot */

> +		if (acpi_match_platform_list(qcom_acpi_platlist) >= 0)

> +			return qcom_smmu_create(smmu, &qcom_smmu_impl);

> +	}

> +

>  	if (of_match_node(qcom_smmu_impl_of_match, np))

>  		return qcom_smmu_create(smmu, &qcom_smmu_impl);

>  

> -- 

> 2.17.1

>
Will Deacon June 8, 2021, 11:42 a.m. | #4
On Sun, 9 May 2021 10:26:07 +0800, Shawn Guo wrote:
> The hookup with qcom_smmu_impl is required to do ACPI boot on SC8180X

> based devices like Lenovo Flex 5G laptop and Microsoft Surface Pro X.

> Define acpi_platform_list for these platforms and match them using

> acpi_match_platform_list() call, and create qcom_smmu_impl accordingly.

> 

> (np == NULL) is used to check ACPI boot, because fwnode of SMMU device

> is a static allocation and thus helpers like has_acpi_companion() don't

> work here.


Applied to will (for-joerg/arm-smmu/updates), thanks!

[1/1] iommu/arm-smmu-qcom: hook up qcom_smmu_impl for ACPI boot
      https://git.kernel.org/will/c/a51627c5df58

Cheers,
-- 
Will

https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev

Patch

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
index 98b3a1c2a181..f7e187f3fa66 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
@@ -3,6 +3,7 @@ 
  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
  */
 
+#include <linux/acpi.h>
 #include <linux/adreno-smmu-priv.h>
 #include <linux/of_device.h>
 #include <linux/qcom_scm.h>
@@ -339,10 +340,22 @@  static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
 	{ }
 };
 
+static struct acpi_platform_list qcom_acpi_platlist[] = {
+	{ "LENOVO", "CB-01   ", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },
+	{ "QCOM  ", "QCOMEDK2", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },
+	{ }
+};
+
 struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
 {
 	const struct device_node *np = smmu->dev->of_node;
 
+	if (np == NULL) {
+		/* Match platform for ACPI boot */
+		if (acpi_match_platform_list(qcom_acpi_platlist) >= 0)
+			return qcom_smmu_create(smmu, &qcom_smmu_impl);
+	}
+
 	if (of_match_node(qcom_smmu_impl_of_match, np))
 		return qcom_smmu_create(smmu, &qcom_smmu_impl);