diff options
author | Nathan Lynch <ntl@pobox.com> | 2008-12-10 09:46:04 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-12-20 22:21:14 -0500 |
commit | e523f723d69cde44e10116d7f49b277da0c6702c (patch) | |
tree | dc6443159ddfe4965264593c9f493f927e8b1d52 /arch | |
parent | 749820928a2fd47ff536773d869d2c3f8038b7d1 (diff) |
powerpc: Add of_find_next_cache_node()
We have more than one piece of code that looks up cache nodes manually
using the "l2-cache" property. Add a common helper routine which does
this and handles ePAPR's "next-level-cache" property as well as
powermac.
Signed-off-by: Nathan Lynch <ntl@pobox.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/include/asm/prom.h | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom.c | 31 |
2 files changed, 34 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h index eb3bd2e1c7f6..6ff04185d2aa 100644 --- a/arch/powerpc/include/asm/prom.h +++ b/arch/powerpc/include/asm/prom.h | |||
@@ -253,6 +253,9 @@ extern void kdump_move_device_tree(void); | |||
253 | /* CPU OF node matching */ | 253 | /* CPU OF node matching */ |
254 | struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); | 254 | struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); |
255 | 255 | ||
256 | /* cache lookup */ | ||
257 | struct device_node *of_find_next_cache_node(struct device_node *np); | ||
258 | |||
256 | /* Get the MAC address */ | 259 | /* Get the MAC address */ |
257 | extern const void *of_get_mac_address(struct device_node *np); | 260 | extern const void *of_get_mac_address(struct device_node *np); |
258 | 261 | ||
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 3a2dc7e6586a..d8266dd61dda 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1271,6 +1271,37 @@ struct device_node *of_find_node_by_phandle(phandle handle) | |||
1271 | EXPORT_SYMBOL(of_find_node_by_phandle); | 1271 | EXPORT_SYMBOL(of_find_node_by_phandle); |
1272 | 1272 | ||
1273 | /** | 1273 | /** |
1274 | * of_find_next_cache_node - Find a node's subsidiary cache | ||
1275 | * @np: node of type "cpu" or "cache" | ||
1276 | * | ||
1277 | * Returns a node pointer with refcount incremented, use | ||
1278 | * of_node_put() on it when done. Caller should hold a reference | ||
1279 | * to np. | ||
1280 | */ | ||
1281 | struct device_node *of_find_next_cache_node(struct device_node *np) | ||
1282 | { | ||
1283 | struct device_node *child; | ||
1284 | const phandle *handle; | ||
1285 | |||
1286 | handle = of_get_property(np, "l2-cache", NULL); | ||
1287 | if (!handle) | ||
1288 | handle = of_get_property(np, "next-level-cache", NULL); | ||
1289 | |||
1290 | if (handle) | ||
1291 | return of_find_node_by_phandle(*handle); | ||
1292 | |||
1293 | /* OF on pmac has nodes instead of properties named "l2-cache" | ||
1294 | * beneath CPU nodes. | ||
1295 | */ | ||
1296 | if (!strcmp(np->type, "cpu")) | ||
1297 | for_each_child_of_node(np, child) | ||
1298 | if (!strcmp(child->type, "cache")) | ||
1299 | return child; | ||
1300 | |||
1301 | return NULL; | ||
1302 | } | ||
1303 | |||
1304 | /** | ||
1274 | * of_find_all_nodes - Get next node in global list | 1305 | * of_find_all_nodes - Get next node in global list |
1275 | * @prev: Previous node or NULL to start iteration | 1306 | * @prev: Previous node or NULL to start iteration |
1276 | * of_node_put() will be called on it | 1307 | * of_node_put() will be called on it |