diff mbox

[1/3] add of_find_next_cache_node()

Message ID 1228956366-17593-1-git-send-email-ntl@pobox.com (mailing list archive)
State Accepted, archived
Commit e523f723d69cde44e10116d7f49b277da0c6702c
Delegated to: Paul Mackerras
Headers show

Commit Message

Nathan Lynch Dec. 11, 2008, 12:46 a.m. UTC
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>
---
 arch/powerpc/include/asm/prom.h |    3 +++
 arch/powerpc/kernel/prom.c      |   31 +++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

Comments

Benjamin Herrenschmidt Dec. 14, 2008, 11:11 p.m. UTC | #1
On Wed, 2008-12-10 at 18:46 -0600, Nathan Lynch wrote:
> +       /* OF on pmac has nodes instead of properties named "l2-cache"
> +        * beneath CPU nodes.
> +        */
> +       if (!strcmp(np->type, "cpu"))
> +               for_each_child_of_node(np, child)
> +                       if (!strcmp(child->type, "cache"))
> +                               return child;
> +

pmac has both actually. And the property points to the node. It's a
problem for /proc/device-tree so we rename them iirc, but only in /proc,
ie, they should still be intact in the tree I think.

Cheers,
Ben.
Nathan Lynch Dec. 14, 2008, 11:19 p.m. UTC | #2
Benjamin Herrenschmidt wrote:
> On Wed, 2008-12-10 at 18:46 -0600, Nathan Lynch wrote:
> > +       /* OF on pmac has nodes instead of properties named "l2-cache"
> > +        * beneath CPU nodes.
> > +        */
> > +       if (!strcmp(np->type, "cpu"))
> > +               for_each_child_of_node(np, child)
> > +                       if (!strcmp(child->type, "cache"))
> > +                               return child;
> > +
> 
> pmac has both actually. And the property points to the node. It's a
> problem for /proc/device-tree so we rename them iirc, but only in /proc,
> ie, they should still be intact in the tree I think.

Okay, I'll check on this.
Nathan Lynch Dec. 15, 2008, 10:33 p.m. UTC | #3
Benjamin Herrenschmidt wrote:
> On Wed, 2008-12-10 at 18:46 -0600, Nathan Lynch wrote:
> > +       /* OF on pmac has nodes instead of properties named "l2-cache"
> > +        * beneath CPU nodes.
> > +        */
> > +       if (!strcmp(np->type, "cpu"))
> > +               for_each_child_of_node(np, child)
> > +                       if (!strcmp(child->type, "cache"))
> > +                               return child;
> > +
> 
> pmac has both actually. And the property points to the node. It's a
> problem for /proc/device-tree so we rename them iirc, but only in /proc,
> ie, they should still be intact in the tree I think.

I see the 'l2-cache' property (renamed to 'l2-cache#1' in /proc) on a
G4 iBook, but it is not present on the two G5 models I've checked.
Benjamin Herrenschmidt Dec. 15, 2008, 11:33 p.m. UTC | #4
On Mon, 2008-12-15 at 16:33 -0600, Nathan Lynch wrote:
> Benjamin Herrenschmidt wrote:
> > On Wed, 2008-12-10 at 18:46 -0600, Nathan Lynch wrote:
> > > +       /* OF on pmac has nodes instead of properties named "l2-cache"
> > > +        * beneath CPU nodes.
> > > +        */
> > > +       if (!strcmp(np->type, "cpu"))
> > > +               for_each_child_of_node(np, child)
> > > +                       if (!strcmp(child->type, "cache"))
> > > +                               return child;
> > > +
> > 
> > pmac has both actually. And the property points to the node. It's a
> > problem for /proc/device-tree so we rename them iirc, but only in /proc,
> > ie, they should still be intact in the tree I think.
> 
> I see the 'l2-cache' property (renamed to 'l2-cache#1' in /proc) on a
> G4 iBook, but it is not present on the two G5 models I've checked.

Ah crap.

Oh well, keep your fallback then.

Don't 970MP have a shared L2 tho ? That will make it look like it's not,
I suppose there isn't much we can do about it tho...

Cheers,
Ben.
Nathan Lynch Dec. 16, 2008, 12:07 a.m. UTC | #5
Benjamin Herrenschmidt wrote:
> 
> Don't 970MP have a shared L2 tho ?

The 970MP UM describes 1MB L2 per core, and the device tree on the
quad G5 reflects that... might be interesting to know what it looks
like on IBM JS21 for comparison's sake, but I think we're okay.
diff mbox

Patch

diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h
index eb3bd2e..6ff0418 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);
 /* CPU OF node matching */
 struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
 
+/* cache lookup */
+struct device_node *of_find_next_cache_node(struct device_node *np);
+
 /* Get the MAC address */
 extern const void *of_get_mac_address(struct device_node *np);
 
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 3a2dc7e..d8266dd 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)
 EXPORT_SYMBOL(of_find_node_by_phandle);
 
 /**
+ *	of_find_next_cache_node - Find a node's subsidiary cache
+ *	@np:	node of type "cpu" or "cache"
+ *
+ *	Returns a node pointer with refcount incremented, use
+ *	of_node_put() on it when done.  Caller should hold a reference
+ *	to np.
+ */
+struct device_node *of_find_next_cache_node(struct device_node *np)
+{
+	struct device_node *child;
+	const phandle *handle;
+
+	handle = of_get_property(np, "l2-cache", NULL);
+	if (!handle)
+		handle = of_get_property(np, "next-level-cache", NULL);
+
+	if (handle)
+		return of_find_node_by_phandle(*handle);
+
+	/* OF on pmac has nodes instead of properties named "l2-cache"
+	 * beneath CPU nodes.
+	 */
+	if (!strcmp(np->type, "cpu"))
+		for_each_child_of_node(np, child)
+			if (!strcmp(child->type, "cache"))
+				return child;
+
+	return NULL;
+}
+
+/**
  *	of_find_all_nodes - Get next node in global list
  *	@prev:	Previous node or NULL to start iteration
  *		of_node_put() will be called on it