Commit 5fa23530 authored by Sudeep Holla's avatar Sudeep Holla Committed by Will Deacon

of: base: add support to find the level of the last cache

It is useful to have helper function just to get the number of cache
levels for a given logical cpu. We can obtain the same by just checking
the level at which the last cache is present. This patch adds support
to find the level of the last cache for a given cpu.

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: Mark Rutland <mark.rutland@arm.com>
Suggested-by: default avatarRob Herring <robh+dt@kernel.org>
Acked-by: default avatarRob Herring <robh+dt@kernel.org>
Tested-by: default avatarTan Xiaojun <tanxiaojun@huawei.com>
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
[will: use u32 instead of int for cache_level]
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent fa5ce3d1
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_graph.h> #include <linux/of_graph.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -2267,6 +2268,31 @@ struct device_node *of_find_next_cache_node(const struct device_node *np) ...@@ -2267,6 +2268,31 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
return NULL; return NULL;
} }
/**
* of_find_last_cache_level - Find the level at which the last cache is
* present for the given logical cpu
*
* @cpu: cpu number(logical index) for which the last cache level is needed
*
* Returns the the level at which the last cache is present. It is exactly
* same as the total number of cache levels for the given logical cpu.
*/
int of_find_last_cache_level(unsigned int cpu)
{
u32 cache_level = 0;
struct device_node *prev = NULL, *np = of_cpu_device_node_get(cpu);
while (np) {
prev = np;
of_node_put(np);
np = of_find_next_cache_node(np);
}
of_property_read_u32(prev, "cache-level", &cache_level);
return cache_level;
}
/** /**
* of_graph_parse_endpoint() - parse common endpoint node properties * of_graph_parse_endpoint() - parse common endpoint node properties
* @node: pointer to endpoint device_node * @node: pointer to endpoint device_node
......
...@@ -280,6 +280,7 @@ extern struct device_node *of_get_child_by_name(const struct device_node *node, ...@@ -280,6 +280,7 @@ extern struct device_node *of_get_child_by_name(const struct device_node *node,
/* cache lookup */ /* cache lookup */
extern struct device_node *of_find_next_cache_node(const struct device_node *); extern struct device_node *of_find_next_cache_node(const struct device_node *);
extern int of_find_last_cache_level(unsigned int cpu);
extern struct device_node *of_find_node_with_property( extern struct device_node *of_find_node_with_property(
struct device_node *from, const char *prop_name); struct device_node *from, const char *prop_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment