x86: OLPC: add OLPC device-tree support
Subsystems (3)
PATCH 5/5 x86: OLPC: add OLPC device-tree support
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.
--- 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
arch/x86/Kconfig +2 -0
@@ -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.
arch/x86/include/asm/olpc_ofw.h +4 -0
@@ -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 */
arch/x86/include/asm/prom.h new file +1 -0
@@ -0,0 +1 @@ +/* dummy prom.h; here to make linux/of.h's #includes happy */
arch/x86/kernel/Makefile +1 -0
@@ -107,6 +107,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
arch/x86/kernel/olpc_ofw.c +8 -0
@@ -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,
arch/x86/kernel/olpc_prom.c new file +152 -0
152 lines not on this page · raw message
drivers/of/pdt.c +2 -0
@@ -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 ;
fs/proc/proc_devtree.c +4 -0
@@ -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 ;
include/linux/of_pdt.h +1 -0
@@ -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);
Signature · 1 line
1.5.6.5
Quoted 5 lines · Andres Salomon
Make use of
PROC_DEVICETREEto export the tree, and sparc's PROMTREE code to call into OLPC's Open Firmware to build the tree.Signed-off-by Andres Salomon <[email protected]>
Holding off on this one until I hear from the x86 maintainers [cc'd].
g.
Quoted 292 lines
--- 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.carch/x86/Kconfig +2
-0@@ -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.arch/x86/include/asm/olpc_ofw.h +4
-0@@ -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 */ arch/x86/include/asm/prom.h new file +1
-0@@ -0,0 +1 @@ +/* dummy prom.h; here to make linux/of.h's #includes happy */ arch/x86/kernel/Makefile +1
-0@@ -107,6 +107,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.oarch/x86/kernel/olpc_ofw.c +8
-0@@ -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,arch/x86/kernel/olpc_prom.c new file +152
-0@@ -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 [email protected] +* Adapted for x86/OLPC by Andres Salomon <[email protected]> +* +* 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,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); +}drivers/of/pdt.c +2
-0@@ -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 ;fs/proc/proc_devtree.c +4
-0@@ -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 ;include/linux/of_pdt.h +1
-0@@ -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);Signature · 1 line
1.5.6.5
Quoted 8 lines · Grant Likely
Quoted 5 lines · Andres Salomon
Make use of
PROC_DEVICETREEto export the tree, and sparc's PROMTREE code to call into OLPC's Open Firmware to build the tree.Signed-off-by Andres Salomon <[email protected]>Holding off on this one until I hear from the x86 maintainers [cc'd].
Oops, and it appears that patch breaks the build on other architectures when CONFIG_OF is enabled and CONFIG_PROMTREE is not due to how of_pdt_init_devicetree is defined.
g.
Quoted 296 lines
g.
Quoted 292 lines
---
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 100644arch/x86/kernel/olpc_prom.carch/x86/Kconfig +0
-0@@ -2069,6 +2069,8 @@ config OLPC_OPENFIRMWAREbool "Support for OLPC's Open Firmware"
depends on !X86_64 && !X86_PAE
default y if OLPC
+ select OF
+ selectOF_PROMTREE
help
This option adds support for the implementation of Open Firmware that is used on the OLPC XO-1 Children's Machine.arch/x86/include/asm/olpc_ofw.h +4
-0@@ -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 */arch/x86/include/asm/prom.h new file +1
-0@@ -0,0 +1 @@ +/* dummy prom.h; here to make linux/of.h's #includes happy */ arch/x86/kernel/Makefile +0
-0@@ -107,6 +107,7 @@ scx200-y += scx200_32.oobj-$(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
arch/x86/kernel/olpc_ofw.c +8
-0@@ -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,arch/x86/kernel/olpc_prom.c new file +152
-0@@ -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/[email protected] +* Adapted for x86/OLPC by Andres Salomon <[email protected]> +* +* 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,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); +}drivers/of/pdt.c +2
-0@@ -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;fs/proc/proc_devtree.c +4
-0@@ -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;include/linux/of_pdt.h +1
-1@@ -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
Signature · 2 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd.
Quoted 9 lines · On Wed, 20 Oct 2010 12:56:21 -0600 Grant Likely <[email protected]>…
Quoted 7 lines · Grant Likely
Quoted 5 lines · Andres Salomon
Make use of
PROC_DEVICETREEto export the tree, and sparc's PROMTREE code to call into OLPC's Open Firmware to build the tree.Signed-off-by Andres Salomon <[email protected]>
Quoted 9 lines
Quoted 2 lines
Holding off on this one until I hear from the x86 maintainers [cc'd].
Oops, and it appears that patch breaks the build on other architectures when
CONFIG_OFis enabled andCONFIG_PROMTREEis not due to howof_pdt_init_devicetreeis defined.g.
D'oh. Do you have any preferences for what we should be using here? Generic OF hook? PDT-specific hook? Forget the hook and just call a PDT function? I'm leaning towards that last option.
Quoted 300 lines
Quoted 300 lines
g.
Quoted 297 lines
---
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 100644arch/x86/kernel/olpc_prom.carch/x86/Kconfig +0
-0@@ -2069,6 +2069,8 @@ config OLPC_OPENFIRMWAREbool "Support for OLPC's Open Firmware"
depends on !X86_64 && !X86_PAE
default y if OLPC
+ select OF
+ selectOF_PROMTREE
help
This option adds support for the implementation of Open Firmware that is used on the OLPC XO-1 Children's Machine.(quoted diff) +0
-0
b/arch/x86/include/asm/olpc_ofw.hindex 08fde47..13075df 100644arch/x86/include/asm/olpc_ofw.h +4
-0@@ -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 */(quoted diff) +0
-0
b/arch/x86/include/asm/prom.hnew file mode 100644 index 0000000..b4ec95farch/x86/include/asm/prom.h new file +1
-0@@ -0,0 +1 @@ +/* dummy prom.h; here to make linux/of.h's #includes happy */ arch/x86/kernel/Makefile +0
-0@@ -107,6 +107,7 @@ scx200-y += scx200_32.oobj-$(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
(quoted diff) +0
-0
b/arch/x86/kernel/olpc_ofw.cindex 3218aa7..6c4d243 100644arch/x86/kernel/olpc_ofw.c +2
-0@@ -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 uninlinefunction return */
early_iounmap(base, sizeof(olpc_ofw_pgd) * PTRS_PER_PGD);arch/x86/kernel/olpc_ofw.c +6
-0+ +#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, intnr_res, diff --gita/arch/x86/kernel/olpc_prom.cb/arch/x86/kernel/olpc_prom.cnew file mode 100644 index 0000000..e2ecaf2arch/x86/kernel/olpc_prom.c new file +7
-0@@ -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 [email protected]
+ * Adapted for x86/OLPC by Andres Salomon <[email protected]>
+ *
+ * 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.
+ */arch/x86/kernel/olpc_prom.c new file +33
-0+ +#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;
+ }arch/x86/kernel/olpc_prom.c new file +5
-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 };arch/x86/kernel/olpc_prom.c new file +13
-0+ + 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)arch/x86/kernel/olpc_prom.c new file +8
-0+{ + 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;
+ }
+ }arch/x86/kernel/olpc_prom.c new file +5
-0+ + return plen; +} + +static int __init olpc_prom_nextprop(phandle node, char *prev,char *buf) +{
+ const void *args[] = { (void *)node, prev, buf };
+ int success;
+ void *res[] = { &success };arch/x86/kernel/olpc_prom.c new file +53
-0+ + 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); +}drivers/of/pdt.c +0
-0@@ -29,6 +29,8 @@ static struct of_pdt_ops *of_pdt_prom_ops
__initdata; void__initdata(*of_pdt_build_more)(structdevice_node*dp, structdevice_node***nextp);drivers/of/pdt.c +2
-0+void __initdata (*of_pdt_init_devicetree)(void ); +#if
defined(CONFIG_SPARC)
unsigned intof_pdt_unique_id__initdata;fs/proc/proc_devtree.c +4
-0@@ -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;include/linux/of_pdt.h +0
-0@@ -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);
Quoted 9 lines
Quoted 6 lines
Quoted 5 lines
extern void (*of_pdt_build_more)(struct
device_node*dp, structdevice_node***nextp);
--
1.5.6.5
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html