Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1555180 > unrolled thread
| Started by | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| First post | 2017-01-10 12:50 +0100 |
| Last post | 2017-01-12 16:30 +0100 |
| Articles | 6 — 2 participants |
Back to article view | Back to linux.kernel
[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
| From | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| Date | 2017-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]
| From | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| Date | 2017-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]
| From | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| Date | 2017-01-10 13:00 +0100 |
| Subject | Re: [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]
| From | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| Date | 2017-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]
| From | Rob Herring <robh+dt@kernel.org> |
|---|---|
| Date | 2017-01-12 14:30 +0100 |
| Subject | Re: [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]
| From | Sudeep Holla <sudeep.holla@arm.com> |
|---|---|
| Date | 2017-01-12 16:30 +0100 |
| Subject | Re: [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