Discussion:
[PATCH v3 0/2] acpi/iort,
Ganapatrao Kulkarni
2017-06-08 04:44:17 UTC
Permalink
ARM IORT specification(rev. C) has added provision to define proximity
domain in SMMUv3 IORT table. Adding required code to parse Proximity
domain and set numa_node of smmv3 platform devices.

v3:
- Addressed Lorenzo Pieralisi comment.

v2:
- Changed as per Lorenzo Pieralisi and Hanjun Guo suggestions.

v1:
- Initial patch

Ganapatrao Kulkarni (2):
acpica: iort: Update SMMUv3 header for proximity domain mapping
acpi/iort: numa: Add numa node mapping for smmuv3 devices

drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
include/acpi/actbl2.h | 4 ++++
2 files changed, 30 insertions(+), 2 deletions(-)
--
1.8.1.4
Ganapatrao Kulkarni
2017-06-08 04:44:18 UTC
Permalink
ARM IORT specification (rev. C) has added two new fields to define
proximity domain for the SMMUv3 node in the IORT table.

Proximity Domain Valid:
Set to 1 if the value provided in the Proximity Domain field is
valid. Set to 0 otherwise.

Proximity domain:
If the Proximity Domain Valid flag is set to 1, this entry
provides the proximity domain to which this SMMU
instance belongs.

Update header file to reflect this.

Signed-off-by: Ganapatrao Kulkarni <***@cavium.com>
---
include/acpi/actbl2.h | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 4b306a6..389e91f 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -805,6 +805,9 @@ struct acpi_iort_smmu_v3 {
u32 pri_gsiv;
u32 gerr_gsiv;
u32 sync_gsiv;
+ u8 pxm;
+ u8 reserved1;
+ u16 reserved2;
};

/* Values for Model field above */
@@ -817,6 +820,7 @@ struct acpi_iort_smmu_v3 {

#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (1<<1)
+#define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3)

/*******************************************************************************
*
--
1.8.1.4
Robin Murphy
2017-06-19 17:54:52 UTC
Permalink
Post by Ganapatrao Kulkarni
ARM IORT specification (rev. C) has added two new fields to define
proximity domain for the SMMUv3 node in the IORT table.
Set to 1 if the value provided in the Proximity Domain field is
valid. Set to 0 otherwise.
If the Proximity Domain Valid flag is set to 1, this entry
provides the proximity domain to which this SMMU
instance belongs.
Update header file to reflect this.
---
include/acpi/actbl2.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 4b306a6..389e91f 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -805,6 +805,9 @@ struct acpi_iort_smmu_v3 {
u32 pri_gsiv;
u32 gerr_gsiv;
u32 sync_gsiv;
+ u8 pxm;
+ u8 reserved1;
+ u16 reserved2;
Why add the padding if you're not also adding the following field that
it aligns? (side note: could it not just be a u8[3]?)

If the actual structure definition is changing, do there not need to be
corresponding IASL changes too?
Post by Ganapatrao Kulkarni
};
/* Values for Model field above */
@@ -817,6 +820,7 @@ struct acpi_iort_smmu_v3 {
#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (1<<1)
+#define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3)
Maybe it's just me, but "PXM" seems incredibly cryptic.

Robin.
Post by Ganapatrao Kulkarni
/*******************************************************************************
*
Ganapatrao Kulkarni
2017-06-20 02:27:09 UTC
Permalink
Post by Robin Murphy
Post by Ganapatrao Kulkarni
ARM IORT specification (rev. C) has added two new fields to define
proximity domain for the SMMUv3 node in the IORT table.
Set to 1 if the value provided in the Proximity Domain field is
valid. Set to 0 otherwise.
If the Proximity Domain Valid flag is set to 1, this entry
provides the proximity domain to which this SMMU
instance belongs.
Update header file to reflect this.
---
include/acpi/actbl2.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 4b306a6..389e91f 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -805,6 +805,9 @@ struct acpi_iort_smmu_v3 {
u32 pri_gsiv;
u32 gerr_gsiv;
u32 sync_gsiv;
+ u8 pxm;
+ u8 reserved1;
+ u16 reserved2;
Why add the padding if you're not also adding the following field that
it aligns? (side note: could it not just be a u8[3]?)
added to align as well to comply with the spec.
Post by Robin Murphy
If the actual structure definition is changing, do there not need to be
corresponding IASL changes too?
yes, it is been added and sent to acpica devel ML.
https://lists.acpica.org/pipermail/devel/2017-June/001243.html
Post by Robin Murphy
Post by Ganapatrao Kulkarni
};
/* Values for Model field above */
@@ -817,6 +820,7 @@ struct acpi_iort_smmu_v3 {
#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (1<<1)
+#define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3)
Maybe it's just me, but "PXM" seems incredibly cryptic.
PXM stands for proximity(refer ACPI spec)
it is widely used in spec and also in Linux kernel.
Post by Robin Murphy
Robin.
Post by Ganapatrao Kulkarni
/*******************************************************************************
*
thanks
Ganapat
Ganapatrao Kulkarni
2017-06-08 04:44:19 UTC
Permalink
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.

Signed-off-by: Ganapatrao Kulkarni <***@cavium.com>
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}

+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
+ pr_info("SMMUV3[%llx] Mapped to Proximity domain %d\n",
+ smmu->base_address,
+ smmu->pxm);
+ }
+}
+
static int __init arm_smmu_count_resources(struct acpi_iort_node *node)
{
struct acpi_iort_smmu *smmu;
@@ -951,20 +968,24 @@ struct iort_iommu_config {
int (*iommu_count_resources)(struct acpi_iort_node *node);
void (*iommu_init_resources)(struct resource *res,
struct acpi_iort_node *node);
+ void (*iommu_set_proximity)(struct acpi_iort_node *node,
+ struct device *dev);
};

static const struct iort_iommu_config iort_arm_smmu_v3_cfg __initconst = {
.name = "arm-smmu-v3",
.iommu_is_coherent = arm_smmu_v3_is_coherent,
.iommu_count_resources = arm_smmu_v3_count_resources,
- .iommu_init_resources = arm_smmu_v3_init_resources
+ .iommu_init_resources = arm_smmu_v3_init_resources,
+ .iommu_set_proximity = arm_smmu_v3_set_proximity
};

static const struct iort_iommu_config iort_arm_smmu_cfg __initconst = {
.name = "arm-smmu",
.iommu_is_coherent = arm_smmu_is_coherent,
.iommu_count_resources = arm_smmu_count_resources,
- .iommu_init_resources = arm_smmu_init_resources
+ .iommu_init_resources = arm_smmu_init_resources,
+ .iommu_set_proximity = NULL
};

static __init
@@ -1002,6 +1023,9 @@ static int __init iort_add_smmu_platform_device(struct acpi_iort_node *node)
if (!pdev)
return -ENOMEM;

+ if (ops->iommu_set_proximity)
+ ops->iommu_set_proximity(node, &pdev->dev);
+
count = ops->iommu_count_resources(node);

r = kcalloc(count, sizeof(*r), GFP_KERNEL);
--
1.8.1.4
Lorenzo Pieralisi
2017-06-15 13:46:03 UTC
Permalink
Hi,
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
I am happy to take this but I want to know what we shall do with
patch 1 and related ACPICA changes first.

Thanks,
Lorenzo
Post by Ganapatrao Kulkarni
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
+ pr_info("SMMUV3[%llx] Mapped to Proximity domain %d\n",
+ smmu->base_address,
+ smmu->pxm);
+ }
+}
+
static int __init arm_smmu_count_resources(struct acpi_iort_node *node)
{
struct acpi_iort_smmu *smmu;
@@ -951,20 +968,24 @@ struct iort_iommu_config {
int (*iommu_count_resources)(struct acpi_iort_node *node);
void (*iommu_init_resources)(struct resource *res,
struct acpi_iort_node *node);
+ void (*iommu_set_proximity)(struct acpi_iort_node *node,
+ struct device *dev);
};
static const struct iort_iommu_config iort_arm_smmu_v3_cfg __initconst = {
.name = "arm-smmu-v3",
.iommu_is_coherent = arm_smmu_v3_is_coherent,
.iommu_count_resources = arm_smmu_v3_count_resources,
- .iommu_init_resources = arm_smmu_v3_init_resources
+ .iommu_init_resources = arm_smmu_v3_init_resources,
+ .iommu_set_proximity = arm_smmu_v3_set_proximity
};
static const struct iort_iommu_config iort_arm_smmu_cfg __initconst = {
.name = "arm-smmu",
.iommu_is_coherent = arm_smmu_is_coherent,
.iommu_count_resources = arm_smmu_count_resources,
- .iommu_init_resources = arm_smmu_init_resources
+ .iommu_init_resources = arm_smmu_init_resources,
+ .iommu_set_proximity = NULL
};
static __init
@@ -1002,6 +1023,9 @@ static int __init iort_add_smmu_platform_device(struct acpi_iort_node *node)
if (!pdev)
return -ENOMEM;
+ if (ops->iommu_set_proximity)
+ ops->iommu_set_proximity(node, &pdev->dev);
+
count = ops->iommu_count_resources(node);
r = kcalloc(count, sizeof(*r), GFP_KERNEL);
--
1.8.1.4
Robert Richter
2017-06-28 17:47:50 UTC
Permalink
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
I am happy to take this but I want to know what we shall do with
patch 1 and related ACPICA changes first.
The change is now in acpica:

https://github.com/acpica/acpica/commit/8cadc4fb500e2aa52241e367c87a0f95d9760c58

So we could guard the code with an #ifdef until that patch is pulled
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
#ifdef ACPI_IORT_SMMU_V3_PXM_VALID
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
+ pr_info("SMMUV3[%llx] Mapped to Proximity domain %d\n",
+ smmu->base_address,
+ smmu->pxm);
+ }
#endif
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+}
+
Could the patch be applied with this change?

Thanks,

-Robert
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
static int __init arm_smmu_count_resources(struct acpi_iort_node *node)
{
struct acpi_iort_smmu *smmu;
@@ -951,20 +968,24 @@ struct iort_iommu_config {
int (*iommu_count_resources)(struct acpi_iort_node *node);
void (*iommu_init_resources)(struct resource *res,
struct acpi_iort_node *node);
+ void (*iommu_set_proximity)(struct acpi_iort_node *node,
+ struct device *dev);
};
static const struct iort_iommu_config iort_arm_smmu_v3_cfg __initconst = {
.name = "arm-smmu-v3",
.iommu_is_coherent = arm_smmu_v3_is_coherent,
.iommu_count_resources = arm_smmu_v3_count_resources,
- .iommu_init_resources = arm_smmu_v3_init_resources
+ .iommu_init_resources = arm_smmu_v3_init_resources,
+ .iommu_set_proximity = arm_smmu_v3_set_proximity
};
static const struct iort_iommu_config iort_arm_smmu_cfg __initconst = {
.name = "arm-smmu",
.iommu_is_coherent = arm_smmu_is_coherent,
.iommu_count_resources = arm_smmu_count_resources,
- .iommu_init_resources = arm_smmu_init_resources
+ .iommu_init_resources = arm_smmu_init_resources,
+ .iommu_set_proximity = NULL
};
static __init
@@ -1002,6 +1023,9 @@ static int __init iort_add_smmu_platform_device(struct acpi_iort_node *node)
if (!pdev)
return -ENOMEM;
+ if (ops->iommu_set_proximity)
+ ops->iommu_set_proximity(node, &pdev->dev);
+
count = ops->iommu_count_resources(node);
r = kcalloc(count, sizeof(*r), GFP_KERNEL);
--
1.8.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
More majordomo info at http://vger.kernel.org/majordomo-info.html
Lorenzo Pieralisi
2017-07-04 10:07:59 UTC
Permalink
Hi Robert,
Post by Robert Richter
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
I am happy to take this but I want to know what we shall do with
patch 1 and related ACPICA changes first.
https://github.com/acpica/acpica/commit/8cadc4fb500e2aa52241e367c87a0f95d9760c58
So we could guard the code with an #ifdef until that patch is pulled
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
#ifdef ACPI_IORT_SMMU_V3_PXM_VALID
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
+ pr_info("SMMUV3[%llx] Mapped to Proximity domain %d\n",
+ smmu->base_address,
+ smmu->pxm);
+ }
#endif
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+}
+
Could the patch be applied with this change?
Sorry I was away (and the ARM64 tree was not accepting any new code last
week anyway), I will send the patch upstream for 4.14 (with your change
above - or whatever ACPICA guard make it safe - since we will depend on
ACPICA changes merge timing anyway - they won't be merged this cycle).

Bad timing, apologies, I hope it is not a burden to carry it for one
cycle.

Thanks,
Lorenzo
Post by Robert Richter
Thanks,
-Robert
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
static int __init arm_smmu_count_resources(struct acpi_iort_node *node)
{
struct acpi_iort_smmu *smmu;
@@ -951,20 +968,24 @@ struct iort_iommu_config {
int (*iommu_count_resources)(struct acpi_iort_node *node);
void (*iommu_init_resources)(struct resource *res,
struct acpi_iort_node *node);
+ void (*iommu_set_proximity)(struct acpi_iort_node *node,
+ struct device *dev);
};
static const struct iort_iommu_config iort_arm_smmu_v3_cfg __initconst = {
.name = "arm-smmu-v3",
.iommu_is_coherent = arm_smmu_v3_is_coherent,
.iommu_count_resources = arm_smmu_v3_count_resources,
- .iommu_init_resources = arm_smmu_v3_init_resources
+ .iommu_init_resources = arm_smmu_v3_init_resources,
+ .iommu_set_proximity = arm_smmu_v3_set_proximity
};
static const struct iort_iommu_config iort_arm_smmu_cfg __initconst = {
.name = "arm-smmu",
.iommu_is_coherent = arm_smmu_is_coherent,
.iommu_count_resources = arm_smmu_count_resources,
- .iommu_init_resources = arm_smmu_init_resources
+ .iommu_init_resources = arm_smmu_init_resources,
+ .iommu_set_proximity = NULL
};
static __init
@@ -1002,6 +1023,9 @@ static int __init iort_add_smmu_platform_device(struct acpi_iort_node *node)
if (!pdev)
return -ENOMEM;
+ if (ops->iommu_set_proximity)
+ ops->iommu_set_proximity(node, &pdev->dev);
+
count = ops->iommu_count_resources(node);
r = kcalloc(count, sizeof(*r), GFP_KERNEL);
--
1.8.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
More majordomo info at http://vger.kernel.org/majordomo-info.html
Robert Richter
2017-07-06 11:20:17 UTC
Permalink
Post by Lorenzo Pieralisi
Post by Robert Richter
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
I am happy to take this but I want to know what we shall do with
patch 1 and related ACPICA changes first.
https://github.com/acpica/acpica/commit/8cadc4fb500e2aa52241e367c87a0f95d9760c58
So we could guard the code with an #ifdef until that patch is pulled
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
#ifdef ACPI_IORT_SMMU_V3_PXM_VALID
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
+ pr_info("SMMUV3[%llx] Mapped to Proximity domain %d\n",
+ smmu->base_address,
+ smmu->pxm);
+ }
#endif
Post by Lorenzo Pieralisi
Post by Ganapatrao Kulkarni
+}
+
Could the patch be applied with this change?
Sorry I was away (and the ARM64 tree was not accepting any new code last
week anyway), I will send the patch upstream for 4.14 (with your change
above - or whatever ACPICA guard make it safe - since we will depend on
ACPICA changes merge timing anyway - they won't be merged this cycle).
Bad timing, apologies, I hope it is not a burden to carry it for one
cycle.
No problem. Good to hear this is accepted for 4.14.

Thanks,

-Robert
Hanjun Guo
2017-07-22 03:23:59 UTC
Permalink
Hi Ganapat,
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
^^
Will have compile error in !CONFIG_NUMA, I think we need to introduce
a stub function in acpi_numa.h.

Thanks
Hanjun
Ganapatrao Kulkarni
2017-07-22 13:05:43 UTC
Permalink
Post by Hanjun Guo
Hi Ganapat,
Post by Ganapatrao Kulkarni
Add code to parse proximity domain in SMMUv3 IORT table to
set numa node mapping for smmuv3 devices.
---
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index bba2b59..e804386 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -882,6 +882,23 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
return smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE;
}
+/*
+ * set numa proximity domain for smmuv3 device
+ */
+static void __init arm_smmu_v3_set_proximity(struct acpi_iort_node *node,
+ struct device *dev)
+{
+ struct acpi_iort_smmu_v3 *smmu;
+
+ smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
+ if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
+ set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
^^
Will have compile error in !CONFIG_NUMA, I think we need to introduce
a stub function in acpi_numa.h.
thanks Hanjun, i thought it is already there in header file, however,
there is stub for acpi_map_pxm_to_online_node and not for this
function.
it is better to have ifdef. will do it in next version.
Post by Hanjun Guo
Thanks
Hanjun
thanks
Ganapat

John Garry
2017-06-08 09:04:11 UTC
Permalink
Post by Ganapatrao Kulkarni
ARM IORT specification(rev. C) has added provision to define proximity
domain in SMMUv3 IORT table. Adding required code to parse Proximity
domain and set numa_node of smmv3 platform devices.
- Addressed Lorenzo Pieralisi comment.
- Changed as per Lorenzo Pieralisi and Hanjun Guo suggestions.
- Initial patch
acpica: iort: Update SMMUv3 header for proximity domain mapping
acpi/iort: numa: Add numa node mapping for smmuv3 devices
drivers/acpi/arm64/iort.c | 28 ++++++++++++++++++++++++++--
include/acpi/actbl2.h | 4 ++++
2 files changed, 30 insertions(+), 2 deletions(-)
We'll try and test this in the next day or so.

John
Loading...