Signed-off-by: Shawn Guo <shawn.guo@xxxxxxxxxx>
---
drivers/acpi/arm64/iort.c | 31 ++++++++-------------
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 6 +++-
drivers/iommu/arm/arm-smmu/arm-smmu.c | 9 ++++--
drivers/perf/arm_smmuv3_pmu.c | 8 ++++--
include/linux/acpi_iort.h | 11 ++++++--
5 files changed, 36 insertions(+), 29 deletions(-)
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 2494138a6905..e2a96d2d399a 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -1463,25 +1463,28 @@ static void __init arm_smmu_v3_pmcg_init_resources(struct resource *res,
ACPI_EDGE_SENSITIVE, &res[2]);
}
-static struct acpi_platform_list pmcg_plat_info[] __initdata = {
+static struct acpi_platform_list iort_plat_info[] __initdata = {
/* HiSilicon Hip08 Platform */
{"HISI ", "HIP08 ", 0, ACPI_SIG_IORT, greater_than_or_equal,
"Erratum #162001800", IORT_SMMU_V3_PMCG_HISI_HIP08},
{ }
};
-static int __init arm_smmu_v3_pmcg_add_platdata(struct platform_device *pdev)
+static int __init iort_smmu_add_platdata(struct platform_device *pdev,
+ struct acpi_iort_node *node)
{
- u32 model;
+ struct iort_smmu_pdata pdata;
int idx;
- idx = acpi_match_platform_list(pmcg_plat_info);
+ pdata.node = node;
+
+ idx = acpi_match_platform_list(iort_plat_info);
if (idx >= 0)
- model = pmcg_plat_info[idx].data;
+ pdata.model = iort_plat_info[idx].data;
else
- model = IORT_SMMU_V3_PMCG_GENERIC;
+ pdata.model = IORT_SMMU_GENERIC;
- return platform_device_add_data(pdev, &model, sizeof(model));
+ return platform_device_add_data(pdev, &pdata, sizeof(pdata));
}
struct iort_dev_config {
@@ -1494,7 +1497,6 @@ struct iort_dev_config {
struct acpi_iort_node *node);
int (*dev_set_proximity)(struct device *dev,
struct acpi_iort_node *node);
- int (*dev_add_platdata)(struct platform_device *pdev);
};
static const struct iort_dev_config iort_arm_smmu_v3_cfg __initconst = {
@@ -1516,7 +1518,6 @@ static const struct iort_dev_config iort_arm_smmu_v3_pmcg_cfg __initconst = {
.name = "arm-smmu-v3-pmcg",
.dev_count_resources = arm_smmu_v3_pmcg_count_resources,
.dev_init_resources = arm_smmu_v3_pmcg_init_resources,
- .dev_add_platdata = arm_smmu_v3_pmcg_add_platdata,
};
static __init const struct iort_dev_config *iort_get_dev_cfg(
@@ -1579,17 +1580,7 @@ static int __init iort_add_platform_device(struct acpi_iort_node *node,
if (ret)
goto dev_put;
- /*
- * Platform devices based on PMCG nodes uses platform_data to
- * pass the hardware model info to the driver. For others, add
- * a copy of IORT node pointer to platform_data to be used to
- * retrieve IORT data information.
- */
- if (ops->dev_add_platdata)
- ret = ops->dev_add_platdata(pdev);
- else
- ret = platform_device_add_data(pdev, &node, sizeof(node));
-
+ ret = iort_smmu_add_platdata(pdev, node);
if (ret)
goto dev_put;
diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index 8ca7415d785d..91c9a74d8ac6 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3397,9 +3397,13 @@ static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
{
struct acpi_iort_smmu_v3 *iort_smmu;
struct device *dev = smmu->dev;
+ struct iort_smmu_pdata *pdata = dev_get_platdata(dev);
struct acpi_iort_node *node;
- node = *(struct acpi_iort_node **)dev_get_platdata(dev);
+ if (pdata == NULL)
+ return -ENODEV;
+
+ node = pdata->node;
/* Retrieve SMMUv3 specific data */
iort_smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c
index d8c6bfde6a61..d53ab3927a30 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
@@ -1991,11 +1991,16 @@ static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
struct arm_smmu_device *smmu)
{
struct device *dev = smmu->dev;
- struct acpi_iort_node *node =
- *(struct acpi_iort_node **)dev_get_platdata(dev);
+ struct iort_smmu_pdata *pdata = dev_get_platdata(dev);
+ struct acpi_iort_node *node;
struct acpi_iort_smmu *iort_smmu;
int ret;
+ if (pdata == NULL)
+ return -ENODEV;
+
+ node = pdata->node;
+
/* Retrieve SMMU1/2 specific data */
iort_smmu = (struct acpi_iort_smmu *)node->node_data;
diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c
index 74474bb322c3..77fcf5e7413a 100644
--- a/drivers/perf/arm_smmuv3_pmu.c
+++ b/drivers/perf/arm_smmuv3_pmu.c
@@ -747,17 +747,19 @@ static void smmu_pmu_reset(struct smmu_pmu *smmu_pmu)
static void smmu_pmu_get_acpi_options(struct smmu_pmu *smmu_pmu)
{
- u32 model;
+ struct iort_smmu_pdata *pdata = dev_get_platdata(smmu_pmu->dev);
- model = *(u32 *)dev_get_platdata(smmu_pmu->dev);
+ if (pdata == NULL)
+ goto done;
- switch (model) {
+ switch (pdata->model) {
case IORT_SMMU_V3_PMCG_HISI_HIP08:
/* HiSilicon Erratum 162001800 */
smmu_pmu->options |= SMMU_PMCG_EVCNTR_RDONLY;
break;
}
+done:
dev_notice(smmu_pmu->dev, "option mask 0x%x\n", smmu_pmu->options);
}
diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h
index 1a12baa58e40..678cdf036948 100644
--- a/include/linux/acpi_iort.h
+++ b/include/linux/acpi_iort.h
@@ -15,12 +15,17 @@
#define IORT_IRQ_TRIGGER_MASK(irq) ((irq >> 32) & 0xffffffffULL)
/*
- * PMCG model identifiers for use in smmu pmu driver. Please note
+ * Model identifiers for use in SMMU drivers. Please note
* that this is purely for the use of software and has nothing to
* do with hardware or with IORT specification.
*/
-#define IORT_SMMU_V3_PMCG_GENERIC 0x00000000 /* Generic SMMUv3 PMCG */
-#define IORT_SMMU_V3_PMCG_HISI_HIP08 0x00000001 /* HiSilicon HIP08 PMCG */
+#define IORT_SMMU_GENERIC 0x00000000 /* Generic SMMU */
+#define IORT_SMMU_V3_PMCG_HISI_HIP08 0x00000001 /* HiSilicon HIP08 PMCG */
+
+struct iort_smmu_pdata {
+ struct acpi_iort_node *node;
+ u32 model;
+};
int iort_register_domain_token(int trans_id, phys_addr_t base,
struct fwnode_handle *fw_node);