Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1555180 > unrolled thread

[PATCH 1/2] of: base: add support to get the number of cache levels

Started bySudeep Holla <sudeep.holla@arm.com>
First post2017-01-10 12:50 +0100
Last post2017-01-12 16:30 +0100
Articles 6 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/2] of: base: add support to get the number of cache levels Sudeep Holla <sudeep.holla@arm.com> - 2017-01-10 12:50 +0100
    [PATCH 2/2] arm64: cacheinfo: add support to override cache levels via device tree Sudeep Holla <sudeep.holla@arm.com> - 2017-01-10 12:50 +0100
    Re: [PATCH 1/2] of: base: add support to get the number of cache  levels Sudeep Holla <sudeep.holla@arm.com> - 2017-01-10 13:00 +0100
    [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels Sudeep Holla <sudeep.holla@arm.com> - 2017-01-10 13:10 +0100
      Re: [PATCH 1/2][UPDATE] of: base: add support to get the number of  cache levels Rob Herring <robh+dt@kernel.org> - 2017-01-12 14:30 +0100
        Re: [PATCH 1/2][UPDATE] of: base: add support to get the number of  cache levels Sudeep Holla <sudeep.holla@arm.com> - 2017-01-12 16:30 +0100

#1555180 — [PATCH 1/2] of: base: add support to get the number of cache levels

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-01-10 12:50 +0100
Subject[PATCH 1/2] of: base: add support to get the number of cache levels
Message-ID<sY369-N3-5@gated-at.bofh.it>
It is useful to have helper function just to get the number of cache
levels for a given logical cpu. This patch adds the support for the
same.

It will be used on ARM64 platform where the device tree provides the
information for the additional non-architected/transparent/external
last level caches that are not integrated with the processors.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/of/base.c  | 22 ++++++++++++++++++++++
 include/linux/of.h |  1 +
 2 files changed, 23 insertions(+)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index d4bea3c797d6..f7a2b47b3c77 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2268,6 +2268,28 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
 }
 
 /**
+ * of_count_cache_levels - Find the total number of cache levels for the
+ *			   given logical cpu
+ *
+ * @cpu: cpu number(logical index) for which cache levels is being counted
+ *
+ * Returns the total number of cache levels for the given logical cpu
+ */
+int of_count_cache_levels(unsigned int cpu)
+{
+	int level = 0;
+	struct device_node *np = of_cpu_device_node_get(cpu);
+
+	while (np) {
+		level++;
+		of_node_put(np);
+		np = of_find_next_cache_node(np);
+	}
+
+	return level;
+}
+
+/**
  * of_graph_parse_endpoint() - parse common endpoint node properties
  * @node: pointer to endpoint device_node
  * @endpoint: pointer to the OF endpoint data structure
diff --git a/include/linux/of.h b/include/linux/of.h
index d72f01009297..c8597ae71ff3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -280,6 +280,7 @@ extern struct device_node *of_get_child_by_name(const struct device_node *node,
 
 /* cache lookup */
 extern struct device_node *of_find_next_cache_node(const struct device_node *);
+extern int of_count_cache_levels(unsigned int cpu);
 extern struct device_node *of_find_node_with_property(
 	struct device_node *from, const char *prop_name);
 
-- 
2.7.4

[toc] | [next] | [standalone]


#1555186 — [PATCH 2/2] arm64: cacheinfo: add support to override cache levels via device tree

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-01-10 12:50 +0100
Subject[PATCH 2/2] arm64: cacheinfo: add support to override cache levels via device tree
Message-ID<sY36a-N3-31@gated-at.bofh.it>
In reply to#1555180
The cache hierarchy can be identified through Cache Level ID(CLIDR)
architected system register. However in some cases it will provide
only the number of cache levels that are integrated into the processor
itself. In other words, it can't provide any information about the
caches that are external and/or transparent.

Some platforms require to export the information about all such external
caches to the userspace applications via the sysfs interface.

This patch adds support to override the cache levels using device tree
to take such external non-architected caches into account.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 arch/arm64/kernel/cacheinfo.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/cacheinfo.c b/arch/arm64/kernel/cacheinfo.c
index 9617301f76b5..fe7738a8c5b1 100644
--- a/arch/arm64/kernel/cacheinfo.c
+++ b/arch/arm64/kernel/cacheinfo.c
@@ -84,7 +84,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
 
 static int __init_cache_level(unsigned int cpu)
 {
-	unsigned int ctype, level, leaves;
+	unsigned int ctype, level, leaves, of_level;
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
 
 	for (level = 1, leaves = 0; level <= MAX_CACHE_LEVEL; level++) {
@@ -97,6 +97,17 @@ static int __init_cache_level(unsigned int cpu)
 		leaves += (ctype == CACHE_TYPE_SEPARATE) ? 2 : 1;
 	}
 
+	of_level = of_count_cache_levels(cpu);
+	if (level < of_level) {
+		/*
+		 * some external caches not specified in CLIDR_EL1
+		 * the information may be available in the device tree
+		 * only unified external caches are considered here
+		 */
+		leaves += (of_level - level);
+		level = of_level;
+	}
+
 	this_cpu_ci->num_levels = level;
 	this_cpu_ci->num_leaves = leaves;
 	return 0;
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1555198 — Re: [PATCH 1/2] of: base: add support to get the number of cache levels

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-01-10 13:00 +0100
SubjectRe: [PATCH 1/2] of: base: add support to get the number of cache levels
Message-ID<sY3fP-R8-17@gated-at.bofh.it>
In reply to#1555180

On 10/01/17 11:41, Sudeep Holla wrote:
> It is useful to have helper function just to get the number of cache
> levels for a given logical cpu. This patch adds the support for the
> same.
> 
> It will be used on ARM64 platform where the device tree provides the
> information for the additional non-architected/transparent/external
> last level caches that are not integrated with the processors.
> 
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
>  drivers/of/base.c  | 22 ++++++++++++++++++++++
>  include/linux/of.h |  1 +
>  2 files changed, 23 insertions(+)
> 

I seem to have missed to generate patch after I fixed the build error.
I will send updated version of this patch.

-- 
Regards,
Sudeep

[toc] | [prev] | [next] | [standalone]


#1555206 — [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-01-10 13:10 +0100
Subject[PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels
Message-ID<sY3pw-1at-25@gated-at.bofh.it>
In reply to#1555180
It is useful to have helper function just to get the number of cache
levels for a given logical cpu. This patch adds the support for the
same.

It will be used on ARM64 platform where the device tree provides the
information for the additional non-architected/transparent/external
last level caches that are not integrated with the processors.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/of/base.c  | 23 +++++++++++++++++++++++
 include/linux/of.h |  1 +
 2 files changed, 24 insertions(+)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index d4bea3c797d6..80e557eca858 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -25,6 +25,7 @@
 #include <linux/cpu.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
@@ -2268,6 +2269,28 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
 }
 
 /**
+ * of_count_cache_levels - Find the total number of cache levels for the
+ *			   given logical cpu
+ *
+ * @cpu: cpu number(logical index) for which cache levels is being counted
+ *
+ * Returns the total number of cache levels for the given logical cpu
+ */
+int of_count_cache_levels(unsigned int cpu)
+{
+	int level = 0;
+	struct device_node *np = of_cpu_device_node_get(cpu);
+
+	while (np) {
+		level++;
+		of_node_put(np);
+		np = of_find_next_cache_node(np);
+	}
+
+	return level;
+}
+
+/**
  * of_graph_parse_endpoint() - parse common endpoint node properties
  * @node: pointer to endpoint device_node
  * @endpoint: pointer to the OF endpoint data structure
diff --git a/include/linux/of.h b/include/linux/of.h
index d72f01009297..c8597ae71ff3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -280,6 +280,7 @@ extern struct device_node *of_get_child_by_name(const struct device_node *node,
 
 /* cache lookup */
 extern struct device_node *of_find_next_cache_node(const struct device_node *);
+extern int of_count_cache_levels(unsigned int cpu);
 extern struct device_node *of_find_node_with_property(
 	struct device_node *from, const char *prop_name);
 
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1557446 — Re: [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels

FromRob Herring <robh+dt@kernel.org>
Date2017-01-12 14:30 +0100
SubjectRe: [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels
Message-ID<sYNC2-4tG-21@gated-at.bofh.it>
In reply to#1555206
On Tue, Jan 10, 2017 at 6:00 AM, Sudeep Holla <sudeep.holla@arm.com> wrote:
> It is useful to have helper function just to get the number of cache
> levels for a given logical cpu. This patch adds the support for the
> same.
>
> It will be used on ARM64 platform where the device tree provides the
> information for the additional non-architected/transparent/external
> last level caches that are not integrated with the processors.
>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
>  drivers/of/base.c  | 23 +++++++++++++++++++++++
>  include/linux/of.h |  1 +
>  2 files changed, 24 insertions(+)
>
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index d4bea3c797d6..80e557eca858 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -25,6 +25,7 @@
>  #include <linux/cpu.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/of_graph.h>
>  #include <linux/spinlock.h>
>  #include <linux/slab.h>
> @@ -2268,6 +2269,28 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
>  }
>
>  /**
> + * of_count_cache_levels - Find the total number of cache levels for the
> + *                        given logical cpu
> + *
> + * @cpu: cpu number(logical index) for which cache levels is being counted
> + *
> + * Returns the total number of cache levels for the given logical cpu
> + */
> +int of_count_cache_levels(unsigned int cpu)
> +{
> +       int level = 0;
> +       struct device_node *np = of_cpu_device_node_get(cpu);
> +
> +       while (np) {
> +               level++;

This will return 1 if you have a cpu node and no cache nodes. Are you
assuming the cpu has a cache?

Perhaps you should just find the last level cache node and then just
read "cache-level".

Rob

[toc] | [prev] | [next] | [standalone]


#1557507 — Re: [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-01-12 16:30 +0100
SubjectRe: [PATCH 1/2][UPDATE] of: base: add support to get the number of cache levels
Message-ID<sYPu9-5B2-11@gated-at.bofh.it>
In reply to#1557446

On 12/01/17 13:24, Rob Herring wrote:
> On Tue, Jan 10, 2017 at 6:00 AM, Sudeep Holla <sudeep.holla@arm.com> wrote:
>> It is useful to have helper function just to get the number of cache
>> levels for a given logical cpu. This patch adds the support for the
>> same.
>>
>> It will be used on ARM64 platform where the device tree provides the
>> information for the additional non-architected/transparent/external
>> last level caches that are not integrated with the processors.
>>
>> Cc: Rob Herring <robh+dt@kernel.org>
>> Cc: Mark Rutland <mark.rutland@arm.com>
>> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
>> ---
>>  drivers/of/base.c  | 23 +++++++++++++++++++++++
>>  include/linux/of.h |  1 +
>>  2 files changed, 24 insertions(+)
>>

[...]

>> +int of_count_cache_levels(unsigned int cpu)
>> +{
>> +       int level = 0;
>> +       struct device_node *np = of_cpu_device_node_get(cpu);
>> +
>> +       while (np) {
>> +               level++;
> 
> This will return 1 if you have a cpu node and no cache nodes. Are you
> assuming the cpu has a cache?
> 

Ah right, that's completely wrong assumption.

> Perhaps you should just find the last level cache node and then just
> read "cache-level".
> 

Yes, sounds better. I will update accordingly. Thanks for the suggestion.

-- 
Regards,
Sudeep

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web