From: Andres Salomon <dilinger@queued.net>
To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: pgf-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org,
x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Mitch Bradley <wmb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org>,
mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org,
sparclinux-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org,
cjb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org,
davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org
Subject: [PATCH 9/9] x86: OLPC: add OLPC device-tree support
Date: Mon, 30 Aug 2010 04:07:51 +0000 [thread overview]
Message-ID: <20100830000751.2b845d05@debxo> (raw)
In-Reply-To: <20100829235100.6dcedcb8@debxo>
Make use of PROC_DEVICETREE to export the tree, and sparc's PROMTREE code to
call into OLPC's Open Firmware to build the tree.
This also adds an init hook to proc_device_tree_init so that we can ensure
the device tree has been built prior to the proc_root_init stuff attempting
to populate /proc/device-tree.
Signed-off-by: Andres Salomon <dilinger@queued.net>
---
arch/x86/Kconfig | 2 +
arch/x86/include/asm/olpc_ofw.h | 4 +
arch/x86/include/asm/prom.h | 1 +
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/olpc_ofw.c | 8 ++
arch/x86/kernel/olpc_prom.c | 152 +++++++++++++++++++++++++++++++++++++++
drivers/of/pdt.c | 2 +
fs/proc/proc_devtree.c | 4 +
include/linux/of_pdt.h | 1 +
9 files changed, 175 insertions(+), 0 deletions(-)
create mode 100644 arch/x86/include/asm/prom.h
create mode 100644 arch/x86/kernel/olpc_prom.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index cea0cd9..7d4ef72 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2069,6 +2069,8 @@ config OLPC_OPENFIRMWARE
bool "Support for OLPC's Open Firmware"
depends on !X86_64 && !X86_PAE
default y if OLPC
+ select OF
+ select OF_PROMTREE
help
This option adds support for the implementation of Open Firmware
that is used on the OLPC XO-1 Children's Machine.
diff --git a/arch/x86/include/asm/olpc_ofw.h b/arch/x86/include/asm/olpc_ofw.h
index 08fde47..13075df 100644
--- a/arch/x86/include/asm/olpc_ofw.h
+++ b/arch/x86/include/asm/olpc_ofw.h
@@ -28,4 +28,8 @@ static inline void setup_olpc_ofw_pgd(void) { }
#endif /* !CONFIG_OLPC_OPENFIRMWARE */
+#ifdef CONFIG_PROC_DEVICETREE
+extern void olpc_prom_build_devicetree(void);
+#endif /* CONFIG_PROC_DEVICETREE */
+
#endif /* _ASM_X86_OLPC_OFW_H */
diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h
new file mode 100644
index 0000000..b4ec95f
--- /dev/null
+++ b/arch/x86/include/asm/prom.h
@@ -0,0 +1 @@
+/* dummy prom.h; here to make linux/of.h's #includes happy */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 0925676..3d7e535 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -105,6 +105,7 @@ scx200-y += scx200_32.o
obj-$(CONFIG_OLPC) += olpc.o
obj-$(CONFIG_OLPC_OPENFIRMWARE) += olpc_ofw.o
+obj-$(CONFIG_PROC_DEVICETREE) += olpc_prom.o
obj-$(CONFIG_X86_MRST) += mrst.o
microcode-y := microcode_core.o
diff --git a/arch/x86/kernel/olpc_ofw.c b/arch/x86/kernel/olpc_ofw.c
index 3218aa7..6c4d243 100644
--- a/arch/x86/kernel/olpc_ofw.c
+++ b/arch/x86/kernel/olpc_ofw.c
@@ -1,5 +1,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/init.h>
#include <asm/page.h>
#include <asm/setup.h>
@@ -38,6 +40,12 @@ void __init setup_olpc_ofw_pgd(void)
/* implicit optimization barrier here due to uninline function return */
early_iounmap(base, sizeof(olpc_ofw_pgd) * PTRS_PER_PGD);
+
+#ifdef CONFIG_PROC_DEVICETREE
+ /* OFW set up succesfully; use it for the device tree */
+ of_pdt_init_devicetree = olpc_prom_build_devicetree;
+#endif
+
}
int __olpc_ofw(const char *name, int nr_args, const void **args, int nr_res,
diff --git a/arch/x86/kernel/olpc_prom.c b/arch/x86/kernel/olpc_prom.c
new file mode 100644
index 0000000..fb04d8a
--- /dev/null
+++ b/arch/x86/kernel/olpc_prom.c
@@ -0,0 +1,152 @@
+/*
+ * olpc_prom.c: OLPC-specific OFW device tree support code.
+ *
+ * Paul Mackerras August 1996.
+ * Copyright (C) 1996-2005 Paul Mackerras.
+ *
+ * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
+ * {engebret|bergner}@us.ibm.com
+ *
+ * Adapted for sparc by David S. Miller davem@davemloft.net
+ * Adapted for x86/OLPC by Andres Salomon <dilinger@queued.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
+#include <asm/olpc_ofw.h>
+
+static phandle __init olpc_prom_getsibling(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node = -1)
+ return 0;
+
+ if (olpc_ofw("peer", args, res) || node = -1)
+ return 0;
+
+ return node;
+}
+
+static phandle __init olpc_prom_getchild(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node = -1)
+ return 0;
+
+ if (olpc_ofw("child", args, res) || node = -1) {
+ pr_err("PROM: %s: fetching child failed!\n", __func__);
+ return 0;
+ }
+
+ return node;
+}
+
+static int __init olpc_prom_getproplen(phandle node, const char *prop)
+{
+ const void *args[] = { (void *)node, prop };
+ int len;
+ void *res[] = { &len };
+
+ if (node = -1)
+ return -1;
+
+ if (olpc_ofw("getproplen", args, res)) {
+ pr_err("PROM: %s: getproplen failed!\n", __func__);
+ return -1;
+ }
+
+ return len;
+}
+
+static int __init olpc_prom_getproperty(phandle node, const char *prop,
+ char *buf, int bufsize)
+{
+ int plen;
+
+ plen = olpc_prom_getproplen(node, prop);
+ if (plen > bufsize || plen < 1)
+ return -1;
+ else {
+ const void *args[] = { (void *)node, prop, buf, (void *)plen };
+ void *res[] = { &plen };
+
+ if (olpc_ofw("getprop", args, res)) {
+ pr_err("PROM: %s: getprop failed!\n", __func__);
+ return -1;
+ }
+ }
+
+ return plen;
+}
+
+static int __init olpc_prom_nextprop(phandle node, const char *prev, char *buf)
+{
+ const void *args[] = { (void *)node, prev, buf };
+ int success;
+ void *res[] = { &success };
+
+ buf[0] = '\0';
+
+ if (node = -1)
+ return -1;
+
+ if (olpc_ofw("nextprop", args, res) || success != 1)
+ return -1;
+
+ return 0;
+}
+
+static int __init olpc_prom_pkg2path(phandle node, char *buf,
+ const int buflen, int *len)
+{
+ const void *args[] = { (void *)node, buf, (void *)buflen };
+ void *res[] = { len };
+
+ if (node = -1)
+ return -1;
+
+ if (olpc_ofw("package-to-path", args, res) || *len < 1)
+ return -1;
+
+ return 0;
+}
+
+void * __init prom_early_alloc(unsigned long size)
+{
+ /* this is called late enough that we can alloc normally */
+ return kzalloc(size, GFP_KERNEL);
+}
+
+static struct of_pdt_ops prom_olpc_ops __initdata = {
+ .nextprop = olpc_prom_nextprop,
+ .getproplen = olpc_prom_getproplen,
+ .getproperty = olpc_prom_getproperty,
+ .getchild = olpc_prom_getchild,
+ .getsibling = olpc_prom_getsibling,
+ .pkg2path = olpc_prom_pkg2path,
+};
+
+void __init olpc_prom_build_devicetree(void)
+{
+ phandle root;
+
+ root = olpc_prom_getsibling(0);
+ if (root < 0) {
+ pr_err("PROM: unable to get root node from OFW!\n");
+ return;
+ }
+ of_pdt_build_devicetree(root, &prom_olpc_ops);
+}
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c
index 28295d0..07e3daa 100644
--- a/drivers/of/pdt.c
+++ b/drivers/of/pdt.c
@@ -29,6 +29,8 @@ static struct of_pdt_ops *of_pdt_prom_ops __initdata;
void __initdata (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
+void __initdata (*of_pdt_init_devicetree)(void);
+
#if defined(CONFIG_SPARC)
unsigned int of_pdt_unique_id __initdata;
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c
index d9396a4..9779039 100644
--- a/fs/proc/proc_devtree.c
+++ b/fs/proc/proc_devtree.c
@@ -11,6 +11,7 @@
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <asm/prom.h>
@@ -228,6 +229,9 @@ void __init proc_device_tree_init(void)
{
struct device_node *root;
+ if (of_pdt_init_devicetree)
+ of_pdt_init_devicetree();
+
proc_device_tree = proc_mkdir("device-tree", NULL);
if (proc_device_tree = NULL)
return;
diff --git a/include/linux/of_pdt.h b/include/linux/of_pdt.h
index 9945e58..b4bd0ee 100644
--- a/include/linux/of_pdt.h
+++ b/include/linux/of_pdt.h
@@ -38,6 +38,7 @@ extern void *prom_early_alloc(unsigned long size);
/* for building the device tree */
extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops);
+extern void (*of_pdt_init_devicetree)(void);
extern void (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
--
1.5.6.5
WARNING: multiple messages have this Message-ID (diff)
From: Andres Salomon <dilinger@queued.net>
To: devicetree-discuss@lists.ozlabs.org
Cc: sparclinux@vger.kernel.org, x86@kernel.org, tglx@linutronix.de,
mingo@redhat.com, hpa@zytor.com, cjb@laptop.org,
Mitch Bradley <wmb@laptop.org>,
pgf@laptop.org, linux-kernel@vger.kernel.org,
davem@davemloft.net, grant.likely@secretlab.ca,
Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Subject: [PATCH 9/9] x86: OLPC: add OLPC device-tree support
Date: Mon, 30 Aug 2010 00:07:51 -0400 [thread overview]
Message-ID: <20100830000751.2b845d05@debxo> (raw)
In-Reply-To: <20100829235100.6dcedcb8@debxo>
Make use of PROC_DEVICETREE to export the tree, and sparc's PROMTREE code to
call into OLPC's Open Firmware to build the tree.
This also adds an init hook to proc_device_tree_init so that we can ensure
the device tree has been built prior to the proc_root_init stuff attempting
to populate /proc/device-tree.
Signed-off-by: Andres Salomon <dilinger@queued.net>
---
arch/x86/Kconfig | 2 +
arch/x86/include/asm/olpc_ofw.h | 4 +
arch/x86/include/asm/prom.h | 1 +
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/olpc_ofw.c | 8 ++
arch/x86/kernel/olpc_prom.c | 152 +++++++++++++++++++++++++++++++++++++++
drivers/of/pdt.c | 2 +
fs/proc/proc_devtree.c | 4 +
include/linux/of_pdt.h | 1 +
9 files changed, 175 insertions(+), 0 deletions(-)
create mode 100644 arch/x86/include/asm/prom.h
create mode 100644 arch/x86/kernel/olpc_prom.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index cea0cd9..7d4ef72 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2069,6 +2069,8 @@ config OLPC_OPENFIRMWARE
bool "Support for OLPC's Open Firmware"
depends on !X86_64 && !X86_PAE
default y if OLPC
+ select OF
+ select OF_PROMTREE
help
This option adds support for the implementation of Open Firmware
that is used on the OLPC XO-1 Children's Machine.
diff --git a/arch/x86/include/asm/olpc_ofw.h b/arch/x86/include/asm/olpc_ofw.h
index 08fde47..13075df 100644
--- a/arch/x86/include/asm/olpc_ofw.h
+++ b/arch/x86/include/asm/olpc_ofw.h
@@ -28,4 +28,8 @@ static inline void setup_olpc_ofw_pgd(void) { }
#endif /* !CONFIG_OLPC_OPENFIRMWARE */
+#ifdef CONFIG_PROC_DEVICETREE
+extern void olpc_prom_build_devicetree(void);
+#endif /* CONFIG_PROC_DEVICETREE */
+
#endif /* _ASM_X86_OLPC_OFW_H */
diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h
new file mode 100644
index 0000000..b4ec95f
--- /dev/null
+++ b/arch/x86/include/asm/prom.h
@@ -0,0 +1 @@
+/* dummy prom.h; here to make linux/of.h's #includes happy */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 0925676..3d7e535 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -105,6 +105,7 @@ scx200-y += scx200_32.o
obj-$(CONFIG_OLPC) += olpc.o
obj-$(CONFIG_OLPC_OPENFIRMWARE) += olpc_ofw.o
+obj-$(CONFIG_PROC_DEVICETREE) += olpc_prom.o
obj-$(CONFIG_X86_MRST) += mrst.o
microcode-y := microcode_core.o
diff --git a/arch/x86/kernel/olpc_ofw.c b/arch/x86/kernel/olpc_ofw.c
index 3218aa7..6c4d243 100644
--- a/arch/x86/kernel/olpc_ofw.c
+++ b/arch/x86/kernel/olpc_ofw.c
@@ -1,5 +1,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/init.h>
#include <asm/page.h>
#include <asm/setup.h>
@@ -38,6 +40,12 @@ void __init setup_olpc_ofw_pgd(void)
/* implicit optimization barrier here due to uninline function return */
early_iounmap(base, sizeof(olpc_ofw_pgd) * PTRS_PER_PGD);
+
+#ifdef CONFIG_PROC_DEVICETREE
+ /* OFW set up succesfully; use it for the device tree */
+ of_pdt_init_devicetree = olpc_prom_build_devicetree;
+#endif
+
}
int __olpc_ofw(const char *name, int nr_args, const void **args, int nr_res,
diff --git a/arch/x86/kernel/olpc_prom.c b/arch/x86/kernel/olpc_prom.c
new file mode 100644
index 0000000..fb04d8a
--- /dev/null
+++ b/arch/x86/kernel/olpc_prom.c
@@ -0,0 +1,152 @@
+/*
+ * olpc_prom.c: OLPC-specific OFW device tree support code.
+ *
+ * Paul Mackerras August 1996.
+ * Copyright (C) 1996-2005 Paul Mackerras.
+ *
+ * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
+ * {engebret|bergner}@us.ibm.com
+ *
+ * Adapted for sparc by David S. Miller davem@davemloft.net
+ * Adapted for x86/OLPC by Andres Salomon <dilinger@queued.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
+#include <asm/olpc_ofw.h>
+
+static phandle __init olpc_prom_getsibling(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node == -1)
+ return 0;
+
+ if (olpc_ofw("peer", args, res) || node == -1)
+ return 0;
+
+ return node;
+}
+
+static phandle __init olpc_prom_getchild(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node == -1)
+ return 0;
+
+ if (olpc_ofw("child", args, res) || node == -1) {
+ pr_err("PROM: %s: fetching child failed!\n", __func__);
+ return 0;
+ }
+
+ return node;
+}
+
+static int __init olpc_prom_getproplen(phandle node, const char *prop)
+{
+ const void *args[] = { (void *)node, prop };
+ int len;
+ void *res[] = { &len };
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("getproplen", args, res)) {
+ pr_err("PROM: %s: getproplen failed!\n", __func__);
+ return -1;
+ }
+
+ return len;
+}
+
+static int __init olpc_prom_getproperty(phandle node, const char *prop,
+ char *buf, int bufsize)
+{
+ int plen;
+
+ plen = olpc_prom_getproplen(node, prop);
+ if (plen > bufsize || plen < 1)
+ return -1;
+ else {
+ const void *args[] = { (void *)node, prop, buf, (void *)plen };
+ void *res[] = { &plen };
+
+ if (olpc_ofw("getprop", args, res)) {
+ pr_err("PROM: %s: getprop failed!\n", __func__);
+ return -1;
+ }
+ }
+
+ return plen;
+}
+
+static int __init olpc_prom_nextprop(phandle node, const char *prev, char *buf)
+{
+ const void *args[] = { (void *)node, prev, buf };
+ int success;
+ void *res[] = { &success };
+
+ buf[0] = '\0';
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("nextprop", args, res) || success != 1)
+ return -1;
+
+ return 0;
+}
+
+static int __init olpc_prom_pkg2path(phandle node, char *buf,
+ const int buflen, int *len)
+{
+ const void *args[] = { (void *)node, buf, (void *)buflen };
+ void *res[] = { len };
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("package-to-path", args, res) || *len < 1)
+ return -1;
+
+ return 0;
+}
+
+void * __init prom_early_alloc(unsigned long size)
+{
+ /* this is called late enough that we can alloc normally */
+ return kzalloc(size, GFP_KERNEL);
+}
+
+static struct of_pdt_ops prom_olpc_ops __initdata = {
+ .nextprop = olpc_prom_nextprop,
+ .getproplen = olpc_prom_getproplen,
+ .getproperty = olpc_prom_getproperty,
+ .getchild = olpc_prom_getchild,
+ .getsibling = olpc_prom_getsibling,
+ .pkg2path = olpc_prom_pkg2path,
+};
+
+void __init olpc_prom_build_devicetree(void)
+{
+ phandle root;
+
+ root = olpc_prom_getsibling(0);
+ if (root < 0) {
+ pr_err("PROM: unable to get root node from OFW!\n");
+ return;
+ }
+ of_pdt_build_devicetree(root, &prom_olpc_ops);
+}
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c
index 28295d0..07e3daa 100644
--- a/drivers/of/pdt.c
+++ b/drivers/of/pdt.c
@@ -29,6 +29,8 @@ static struct of_pdt_ops *of_pdt_prom_ops __initdata;
void __initdata (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
+void __initdata (*of_pdt_init_devicetree)(void);
+
#if defined(CONFIG_SPARC)
unsigned int of_pdt_unique_id __initdata;
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c
index d9396a4..9779039 100644
--- a/fs/proc/proc_devtree.c
+++ b/fs/proc/proc_devtree.c
@@ -11,6 +11,7 @@
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <asm/prom.h>
@@ -228,6 +229,9 @@ void __init proc_device_tree_init(void)
{
struct device_node *root;
+ if (of_pdt_init_devicetree)
+ of_pdt_init_devicetree();
+
proc_device_tree = proc_mkdir("device-tree", NULL);
if (proc_device_tree == NULL)
return;
diff --git a/include/linux/of_pdt.h b/include/linux/of_pdt.h
index 9945e58..b4bd0ee 100644
--- a/include/linux/of_pdt.h
+++ b/include/linux/of_pdt.h
@@ -38,6 +38,7 @@ extern void *prom_early_alloc(unsigned long size);
/* for building the device tree */
extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops);
+extern void (*of_pdt_init_devicetree)(void);
extern void (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
--
1.5.6.5
WARNING: multiple messages have this Message-ID (diff)
From: Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>
To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: pgf-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org,
x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Mitch Bradley <wmb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org>,
mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org,
sparclinux-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org,
cjb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org,
davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org
Subject: [PATCH 9/9] x86: OLPC: add OLPC device-tree support
Date: Mon, 30 Aug 2010 00:07:51 -0400 [thread overview]
Message-ID: <20100830000751.2b845d05@debxo> (raw)
In-Reply-To: <20100829235100.6dcedcb8@debxo>
Make use of PROC_DEVICETREE to export the tree, and sparc's PROMTREE code to
call into OLPC's Open Firmware to build the tree.
This also adds an init hook to proc_device_tree_init so that we can ensure
the device tree has been built prior to the proc_root_init stuff attempting
to populate /proc/device-tree.
Signed-off-by: Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>
---
arch/x86/Kconfig | 2 +
arch/x86/include/asm/olpc_ofw.h | 4 +
arch/x86/include/asm/prom.h | 1 +
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/olpc_ofw.c | 8 ++
arch/x86/kernel/olpc_prom.c | 152 +++++++++++++++++++++++++++++++++++++++
drivers/of/pdt.c | 2 +
fs/proc/proc_devtree.c | 4 +
include/linux/of_pdt.h | 1 +
9 files changed, 175 insertions(+), 0 deletions(-)
create mode 100644 arch/x86/include/asm/prom.h
create mode 100644 arch/x86/kernel/olpc_prom.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index cea0cd9..7d4ef72 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2069,6 +2069,8 @@ config OLPC_OPENFIRMWARE
bool "Support for OLPC's Open Firmware"
depends on !X86_64 && !X86_PAE
default y if OLPC
+ select OF
+ select OF_PROMTREE
help
This option adds support for the implementation of Open Firmware
that is used on the OLPC XO-1 Children's Machine.
diff --git a/arch/x86/include/asm/olpc_ofw.h b/arch/x86/include/asm/olpc_ofw.h
index 08fde47..13075df 100644
--- a/arch/x86/include/asm/olpc_ofw.h
+++ b/arch/x86/include/asm/olpc_ofw.h
@@ -28,4 +28,8 @@ static inline void setup_olpc_ofw_pgd(void) { }
#endif /* !CONFIG_OLPC_OPENFIRMWARE */
+#ifdef CONFIG_PROC_DEVICETREE
+extern void olpc_prom_build_devicetree(void);
+#endif /* CONFIG_PROC_DEVICETREE */
+
#endif /* _ASM_X86_OLPC_OFW_H */
diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h
new file mode 100644
index 0000000..b4ec95f
--- /dev/null
+++ b/arch/x86/include/asm/prom.h
@@ -0,0 +1 @@
+/* dummy prom.h; here to make linux/of.h's #includes happy */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 0925676..3d7e535 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -105,6 +105,7 @@ scx200-y += scx200_32.o
obj-$(CONFIG_OLPC) += olpc.o
obj-$(CONFIG_OLPC_OPENFIRMWARE) += olpc_ofw.o
+obj-$(CONFIG_PROC_DEVICETREE) += olpc_prom.o
obj-$(CONFIG_X86_MRST) += mrst.o
microcode-y := microcode_core.o
diff --git a/arch/x86/kernel/olpc_ofw.c b/arch/x86/kernel/olpc_ofw.c
index 3218aa7..6c4d243 100644
--- a/arch/x86/kernel/olpc_ofw.c
+++ b/arch/x86/kernel/olpc_ofw.c
@@ -1,5 +1,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/init.h>
#include <asm/page.h>
#include <asm/setup.h>
@@ -38,6 +40,12 @@ void __init setup_olpc_ofw_pgd(void)
/* implicit optimization barrier here due to uninline function return */
early_iounmap(base, sizeof(olpc_ofw_pgd) * PTRS_PER_PGD);
+
+#ifdef CONFIG_PROC_DEVICETREE
+ /* OFW set up succesfully; use it for the device tree */
+ of_pdt_init_devicetree = olpc_prom_build_devicetree;
+#endif
+
}
int __olpc_ofw(const char *name, int nr_args, const void **args, int nr_res,
diff --git a/arch/x86/kernel/olpc_prom.c b/arch/x86/kernel/olpc_prom.c
new file mode 100644
index 0000000..fb04d8a
--- /dev/null
+++ b/arch/x86/kernel/olpc_prom.c
@@ -0,0 +1,152 @@
+/*
+ * olpc_prom.c: OLPC-specific OFW device tree support code.
+ *
+ * Paul Mackerras August 1996.
+ * Copyright (C) 1996-2005 Paul Mackerras.
+ *
+ * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
+ * {engebret|bergner}@us.ibm.com
+ *
+ * Adapted for sparc by David S. Miller davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org
+ * Adapted for x86/OLPC by Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_pdt.h>
+#include <asm/olpc_ofw.h>
+
+static phandle __init olpc_prom_getsibling(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node == -1)
+ return 0;
+
+ if (olpc_ofw("peer", args, res) || node == -1)
+ return 0;
+
+ return node;
+}
+
+static phandle __init olpc_prom_getchild(phandle node)
+{
+ const void *args[] = { (void *)node };
+ void *res[] = { &node };
+
+ if (node == -1)
+ return 0;
+
+ if (olpc_ofw("child", args, res) || node == -1) {
+ pr_err("PROM: %s: fetching child failed!\n", __func__);
+ return 0;
+ }
+
+ return node;
+}
+
+static int __init olpc_prom_getproplen(phandle node, const char *prop)
+{
+ const void *args[] = { (void *)node, prop };
+ int len;
+ void *res[] = { &len };
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("getproplen", args, res)) {
+ pr_err("PROM: %s: getproplen failed!\n", __func__);
+ return -1;
+ }
+
+ return len;
+}
+
+static int __init olpc_prom_getproperty(phandle node, const char *prop,
+ char *buf, int bufsize)
+{
+ int plen;
+
+ plen = olpc_prom_getproplen(node, prop);
+ if (plen > bufsize || plen < 1)
+ return -1;
+ else {
+ const void *args[] = { (void *)node, prop, buf, (void *)plen };
+ void *res[] = { &plen };
+
+ if (olpc_ofw("getprop", args, res)) {
+ pr_err("PROM: %s: getprop failed!\n", __func__);
+ return -1;
+ }
+ }
+
+ return plen;
+}
+
+static int __init olpc_prom_nextprop(phandle node, const char *prev, char *buf)
+{
+ const void *args[] = { (void *)node, prev, buf };
+ int success;
+ void *res[] = { &success };
+
+ buf[0] = '\0';
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("nextprop", args, res) || success != 1)
+ return -1;
+
+ return 0;
+}
+
+static int __init olpc_prom_pkg2path(phandle node, char *buf,
+ const int buflen, int *len)
+{
+ const void *args[] = { (void *)node, buf, (void *)buflen };
+ void *res[] = { len };
+
+ if (node == -1)
+ return -1;
+
+ if (olpc_ofw("package-to-path", args, res) || *len < 1)
+ return -1;
+
+ return 0;
+}
+
+void * __init prom_early_alloc(unsigned long size)
+{
+ /* this is called late enough that we can alloc normally */
+ return kzalloc(size, GFP_KERNEL);
+}
+
+static struct of_pdt_ops prom_olpc_ops __initdata = {
+ .nextprop = olpc_prom_nextprop,
+ .getproplen = olpc_prom_getproplen,
+ .getproperty = olpc_prom_getproperty,
+ .getchild = olpc_prom_getchild,
+ .getsibling = olpc_prom_getsibling,
+ .pkg2path = olpc_prom_pkg2path,
+};
+
+void __init olpc_prom_build_devicetree(void)
+{
+ phandle root;
+
+ root = olpc_prom_getsibling(0);
+ if (root < 0) {
+ pr_err("PROM: unable to get root node from OFW!\n");
+ return;
+ }
+ of_pdt_build_devicetree(root, &prom_olpc_ops);
+}
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c
index 28295d0..07e3daa 100644
--- a/drivers/of/pdt.c
+++ b/drivers/of/pdt.c
@@ -29,6 +29,8 @@ static struct of_pdt_ops *of_pdt_prom_ops __initdata;
void __initdata (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
+void __initdata (*of_pdt_init_devicetree)(void);
+
#if defined(CONFIG_SPARC)
unsigned int of_pdt_unique_id __initdata;
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c
index d9396a4..9779039 100644
--- a/fs/proc/proc_devtree.c
+++ b/fs/proc/proc_devtree.c
@@ -11,6 +11,7 @@
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/of.h>
+#include <linux/of_pdt.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <asm/prom.h>
@@ -228,6 +229,9 @@ void __init proc_device_tree_init(void)
{
struct device_node *root;
+ if (of_pdt_init_devicetree)
+ of_pdt_init_devicetree();
+
proc_device_tree = proc_mkdir("device-tree", NULL);
if (proc_device_tree == NULL)
return;
diff --git a/include/linux/of_pdt.h b/include/linux/of_pdt.h
index 9945e58..b4bd0ee 100644
--- a/include/linux/of_pdt.h
+++ b/include/linux/of_pdt.h
@@ -38,6 +38,7 @@ extern void *prom_early_alloc(unsigned long size);
/* for building the device tree */
extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops);
+extern void (*of_pdt_init_devicetree)(void);
extern void (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
--
1.5.6.5
next prev parent reply other threads:[~2010-08-30 4:07 UTC|newest]
Thread overview: 130+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-29 1:54 [PATCH 0/4] RFC: OLPC/x86 device tree code Andres Salomon
2010-06-29 1:54 ` Andres Salomon
2010-06-29 2:00 ` [PATCH 1/4] x86: OLPC: constify an olpc_ofw() arg Andres Salomon
2010-06-29 2:00 ` Andres Salomon
2010-07-31 1:10 ` [tip:x86/olpc] x86, olpc: Constify " tip-bot for Andres Salomon
2010-06-29 2:00 ` [PATCH 2/4] sparc: break out some prom device-tree building code Andres Salomon
2010-06-29 2:00 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Andres Salomon
2010-06-29 3:11 ` [PATCH 2/4] sparc: break out some prom device-tree building David Miller
2010-06-29 3:11 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of David Miller
2010-06-29 3:11 ` David Miller
2010-06-29 6:15 ` [PATCH 2/4] sparc: break out some prom device-tree building Stephen Rothwell
2010-06-29 6:15 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Stephen Rothwell
2010-06-29 7:50 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-06-29 7:50 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-06-29 7:50 ` Grant Likely
2010-06-29 15:03 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-06-29 15:03 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Andres Salomon
2010-06-29 21:42 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-06-29 21:42 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-06-29 21:42 ` Grant Likely
2010-06-29 23:36 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-06-29 23:36 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Andres Salomon
2010-06-30 21:52 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-06-30 21:52 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-06-30 21:52 ` Grant Likely
[not found] ` <AANLkTilme2uAoXjorUEzam9j_xosR8kl70W8PS71d-Th-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-06 2:17 ` Andres Salomon
2010-07-07 4:07 ` Andres Salomon
2010-07-06 2:17 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-07-06 2:22 ` David Miller
2010-07-06 2:22 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of David Miller
[not found] ` <20100705.192221.241453945.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2010-07-06 3:24 ` Andres Salomon
2010-07-07 5:15 ` Andres Salomon
2010-07-06 3:25 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-07-06 10:17 ` Benjamin Herrenschmidt
2010-07-06 10:17 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Benjamin Herrenschmidt
2010-07-06 10:17 ` Benjamin Herrenschmidt
2010-07-06 3:25 ` Andres Salomon
2010-07-06 3:25 ` Andres Salomon
2010-07-06 7:00 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-07-06 7:00 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-07-06 7:00 ` Grant Likely
2010-07-06 7:16 ` [PATCH 2/4] sparc: break out some prom device-tree building David Miller
2010-07-06 7:16 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of David Miller
2010-07-06 8:17 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-07-06 8:17 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-07-06 8:17 ` Grant Likely
2010-07-06 8:17 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-07-06 8:17 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-07-06 8:17 ` Grant Likely
2010-07-06 2:17 ` Andres Salomon
2010-07-06 2:17 ` Andres Salomon
2010-07-06 9:21 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-07-06 9:21 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-07-06 9:21 ` Grant Likely
2010-07-06 21:54 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-07-06 21:54 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Andres Salomon
2010-07-06 21:54 ` Andres Salomon
2010-07-06 22:06 ` [PATCH 2/4] sparc: break out some prom device-tree building code Grant Likely
2010-07-06 22:06 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Grant Likely
2010-07-06 22:06 ` Grant Likely
2010-07-07 1:15 ` [PATCH 2/4] sparc: break out some prom device-tree building Andres Salomon
2010-07-07 1:15 ` [PATCH 2/4] sparc: break out some prom device-tree building code out into drivers/of Andres Salomon
2010-06-29 2:00 ` [PATCH 3/4] proc: unify PROC_DEVICETREE config Andres Salomon
2010-06-29 2:00 ` Andres Salomon
2010-06-29 7:33 ` Grant Likely
2010-06-29 7:33 ` Grant Likely
2010-06-29 7:33 ` Grant Likely
2010-06-29 2:00 ` [PATCH 4/4] x86: OLPC: add OLPC device-tree support Andres Salomon
2010-06-29 2:00 ` Andres Salomon
2010-06-29 8:12 ` Grant Likely
2010-06-29 8:12 ` Grant Likely
2010-06-29 8:12 ` Grant Likely
[not found] ` <AANLkTinUy_FGuN9DiF5KtMCsqYUbByfS6g2Mdw0ATvtQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-29 8:33 ` Stephen Rothwell
2010-06-29 8:33 ` Stephen Rothwell
2010-06-29 8:33 ` Stephen Rothwell
2010-06-29 14:23 ` Andres Salomon
2010-06-29 14:23 ` Andres Salomon
2010-06-29 14:23 ` Andres Salomon
[not found] ` <20100629102339.5e8a30b6-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>
2010-06-30 21:13 ` Grant Likely
2010-06-30 21:13 ` Grant Likely
2010-06-30 21:13 ` Grant Likely
[not found] ` <AANLkTik7rqaGz7RtsOlhoSZw_-6bhv43YlWETsB17__4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-30 21:32 ` Andres Salomon
2010-06-30 21:32 ` Andres Salomon
2010-06-30 21:32 ` Andres Salomon
2010-08-30 3:51 ` [PATCH 0/9] " Andres Salomon
2010-08-30 3:51 ` Andres Salomon
2010-08-30 3:53 ` [PATCH 1/9] of: move phandle/ihandle into types.h Andres Salomon
2010-08-30 3:53 ` Andres Salomon
2010-08-30 5:06 ` Sam Ravnborg
2010-08-30 5:06 ` Sam Ravnborg
2010-09-03 7:33 ` Andres Salomon
2010-09-03 8:17 ` Andres Salomon
2010-09-05 6:22 ` Sam Ravnborg
2010-09-05 6:22 ` Sam Ravnborg
2010-08-30 3:55 ` [PATCH 2/9] sparc: convert various prom_* functions to use phandle Andres Salomon
2010-08-30 3:55 ` Andres Salomon
2010-08-30 3:57 ` [PATCH 3/9] sparc: break out some PROM device-tree building code Andres Salomon
2010-08-30 3:57 ` [PATCH 3/9] sparc: break out some PROM device-tree building code out into drivers/of Andres Salomon
2010-08-30 3:58 ` [PATCH 5/9] of: no longer call prom_ functions directly; use an ops Andres Salomon
2010-08-30 4:00 ` [PATCH 5/9] of: no longer call prom_ functions directly; use an ops structure Andres Salomon
2010-08-30 3:59 ` [PATCH 4/9] sparc: make drivers/of/pdt.c no longer sparc-only Andres Salomon
2010-08-30 3:59 ` Andres Salomon
2010-08-30 4:02 ` [PATCH 6/9] of: add of_pdt namespace to pdt code Andres Salomon
2010-08-30 4:02 ` Andres Salomon
2010-08-30 4:04 ` [PATCH 7/9] of: add package-to-path support to pdt Andres Salomon
2010-08-30 4:04 ` Andres Salomon
2010-08-30 4:06 ` [PATCH 8/9] x86: of: irq additions to make drivers/of/* build on Andres Salomon
2010-08-30 4:06 ` [PATCH 8/9] x86: of: irq additions to make drivers/of/* build on x86 Andres Salomon
2010-08-30 4:06 ` Andres Salomon
2010-08-30 15:58 ` Stephen Neuendorffer
2010-08-30 15:58 ` Stephen Neuendorffer
2010-08-30 15:58 ` Stephen Neuendorffer
[not found] ` <c7823e09-3ce8-434f-98f4-6a84a996c942-RaUQJvECHitZbvUCbuG1mrjjLBE8jN/0@public.gmane.org>
2010-08-30 17:31 ` Grant Likely
2010-08-30 17:31 ` Grant Likely
2010-08-30 17:31 ` Grant Likely
2010-08-30 4:07 ` Andres Salomon [this message]
2010-08-30 4:07 ` [PATCH 9/9] x86: OLPC: add OLPC device-tree support Andres Salomon
2010-08-30 4:07 ` Andres Salomon
2010-08-30 18:14 ` Grant Likely
2010-08-30 18:14 ` Grant Likely
2010-08-30 18:14 ` Grant Likely
[not found] ` <AANLkTi=EMkZLiAG7-ni8_7K=qtAriv=AfSUZ58661jNY-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-08-30 18:49 ` Andres Salomon
2010-08-30 18:49 ` Andres Salomon
2010-08-30 18:49 ` Andres Salomon
2010-08-31 5:49 ` Grant Likely
2010-08-31 5:49 ` Grant Likely
2010-08-31 5:49 ` Grant Likely
2010-08-30 17:58 ` [PATCH 0/9] " Grant Likely
2010-08-30 17:58 ` Grant Likely
2010-08-30 17:58 ` Grant Likely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100830000751.2b845d05@debxo \
--to=dilinger@queued.net \
--cc=cjb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org \
--cc=davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=pgf-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org \
--cc=sparclinux-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org \
--cc=wmb-2X9k7bc8m7Mdnm+yROfE0A@public.gmane.org \
--cc=x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.