All of lore.kernel.org
 help / color / mirror / Atom feed
* RE: [RFC PATCH 1/2] The Device Tree Patch for MIPS
@ 2010-05-10 21:34 ` Dezhong Diao (dediao)
  0 siblings, 0 replies; 6+ messages in thread
From: Dezhong Diao (dediao) @ 2010-05-10 21:34 UTC (permalink / raw)
  To: linux-mips
  Cc: David VomLehn (dvomlehn), Tony Colclough (colclot), Grant Likely

Add common device tree support for MIPS.


---
 arch/mips/Kconfig                   |   20 ++++
 arch/mips/include/asm/of_device.h   |    3 +
 arch/mips/include/asm/of_platform.h |    9 ++
 arch/mips/include/asm/prom.h        |   64 ++++++++++++++
 arch/mips/kernel/Makefile           |    2 +
 arch/mips/kernel/prom.c             |  164
+++++++++++++++++++++++++++++++++++
 arch/mips/kernel/setup.c            |    2 +
 7 files changed, 264 insertions(+), 0 deletions(-)  create mode 100644
arch/mips/include/asm/of_device.h  create mode 100644
arch/mips/include/asm/of_platform.h
 create mode 100644 arch/mips/include/asm/prom.h  create mode 100644
arch/mips/kernel/prom.c

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index
29e8692..55d8331 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -2052,6 +2052,26 @@ config SECCOMP
 
 	  If unsure, say Y. Only embedded should say N here.
 
+config OF
+	bool "Device tree support"
+	select OF_FLATTREE
+	help
+	  Support for OpenFirmware-style device trees
+
+config PROC_DEVICETREE
+	bool "Support for device tree in /proc"
+	depends on PROC_FS && OF
+	help
+	  This option adds a device-tree directory under /proc which
contains
+	  an image of the device tree that the kernel copies from Open
+	  Firmware or other boot firmware. If unsure, say Y here.
+
+config ARCH_HAS_DEVTREE_MEM
+	bool "Support user-defined memory scan function in device tree"
+	depends on OF
+	help
+	  The user has a customized function to parse memory nodes.
+
 endmenu
 
 config LOCKDEP_SUPPORT
diff --git a/arch/mips/include/asm/of_device.h
b/arch/mips/include/asm/of_device.h
new file mode 100644
index 0000000..7a83477
--- /dev/null
+++ b/arch/mips/include/asm/of_device.h
@@ -0,0 +1,3 @@
+#ifndef _ASM_MIPS_OF_DEVICE_H
+#define _ASM_MIPS_OF_DEVICE_H
+#endif /* _ASM_MIPS_OF_DEVICE_H */
diff --git a/arch/mips/include/asm/of_platform.h
b/arch/mips/include/asm/of_platform.h
new file mode 100644
index 0000000..7a33827
--- /dev/null
+++ b/arch/mips/include/asm/of_platform.h
@@ -0,0 +1,9 @@
+#ifndef _ASM_MIPS_OF_PLATFORM_H
+#define _ASM_MIPS_OF_PLATFORM_H
+
+static inline void of_device_make_bus_id(struct device *dev) {
+	__of_device_make_bus_id(dev);
+}
+
+#endif /* _ASM_MIPS_OF_PLATFORM_H */
diff --git a/arch/mips/include/asm/prom.h b/arch/mips/include/asm/prom.h
new file mode 100644 index 0000000..e72b0df
--- /dev/null
+++ b/arch/mips/include/asm/prom.h
@@ -0,0 +1,64 @@
+/*
+ *  arch/mips/include/asm/prom.h
+ *
+ *  Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+#ifndef __ASM_MIPS_PROM_H
+#define __ASM_MIPS_PROM_H
+
+#ifdef CONFIG_OF
+#include <linux/init.h>
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+#include <asm/bootinfo.h>
+
+/* _ALIGN expects upwards alignment */
+#define _ALIGN(addr, size)	(((addr) + ((size) - 1)) & (~((size) -
1)))
+
+/* which is compatible with the flattened device tree (FDT) */ #define 
+cmd_line arcs_cmdline
+
+/*
+ * Use this value to indicate lack of interrupt
+ * capability
+ */
+#ifndef NO_IRQ
+#define NO_IRQ  ((unsigned int)(-1))
+#endif
+
+static inline unsigned long pci_address_to_pio(phys_addr_t address) {
+	return (unsigned long)-1;
+}
+
+struct device_node;
+
+static inline int of_node_to_nid(struct device_node *device) {
+	return 0;
+}
+
+static inline void __init early_init_dt_scan_chosen_arch(unsigned long
node)
+{
+}
+
+extern int __init early_init_dt_scan_memory_arch(unsigned long node,
+	const char *uname, int depth, void *data);
+
+extern int __init reserve_mem_mach(unsigned long addr, unsigned long
size);
+extern void __init free_mem_mach(unsigned long addr, unsigned long
size);
+
+extern void __init device_tree_init(void); #else /* CONFIG_OF */ static

+inline void __init device_tree_init(void) { } #endif /* CONFIG_OF */
+
+#endif /* _ASM_MIPS_PROM_H */
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index
ef20957..4b10545 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -95,6 +95,8 @@ obj-$(CONFIG_KEXEC)		+= machine_kexec.o
relocate_kernel.o
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 obj-$(CONFIG_SPINLOCK_TEST)	+= spinlock_test.o
 
+obj-$(CONFIG_OF)		+= prom.o
+
 CFLAGS_cpu-bugs64.o	= $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi
-c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo
"-DHAVE_AS_SET_DADDI"; fi)
 
 obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT)	+= 8250-platform.o
diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c new file
mode 100644 index 0000000..2cbd43f
--- /dev/null
+++ b/arch/mips/kernel/prom.c
@@ -0,0 +1,164 @@
+/*
+ *  linux/arch/mips/kernel/prom.c
+ *
+ *  Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/bootmem.h>
+#include <linux/initrd.h>
+#include <linux/debugfs.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+#include <asm/page.h>
+#include <asm/prom.h>
+
+/*
+ * The list of OF IDs below is used for matching bus types in the
+ * system whose devices are to be exposed as of_platform_devices.
+ *
+ * This is the default list valid for most platforms. This file
provides
+ * functions who can take an explicit list if necessary though
+ *
+ * The search is always performed recursively looking for children of
+ * the provided device_node and recursively if such a children matches
+ * a bus type in the list
+ */
+const struct of_device_id of_default_bus_ids[] = {
+	{},
+};
+
+#ifndef CONFIG_ARCH_HAS_DEVTREE_MEM
+int __init early_init_dt_scan_memory_arch(unsigned long node,
+					  const char *uname, int depth,
+					  void *data)
+{
+	return early_init_dt_scan_memory(node, uname, depth, data); }
+
+void __init early_init_dt_add_memory_arch(u64 base, u64 size) {
+	return add_memory_region(base, size, BOOT_MEM_RAM); }
+
+int __init reserve_mem_mach(unsigned long addr, unsigned long size) {
+	return reserve_bootmem(addr, size, BOOTMEM_DEFAULT); }
+
+void __init free_mem_mach(unsigned long addr, unsigned long size) {
+	return free_bootmem(addr, size);
+}
+#endif
+
+u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) {
+	return virt_to_phys(
+		__alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS))
+		);
+}
+
+#ifdef CONFIG_BLK_DEV_INITRD
+void __init early_init_dt_setup_initrd_arch(unsigned long start,
+					    unsigned long end)
+{
+	initrd_start = (unsigned long)__va(start);
+	initrd_end = (unsigned long)__va(end);
+	initrd_below_start_ok = 1;
+}
+#endif
+
+/*
+ * Interrupt remapper
+ */
+struct device_node *of_irq_find_parent_by_phandle(phandle p) {
+	return of_find_node_by_phandle(p);
+}
+
+int of_irq_map_one(struct device_node *device,
+		   int index, struct of_irq *out_irq) {
+	return __of_irq_map_one(device, index, out_irq); } 
+EXPORT_SYMBOL_GPL(of_irq_map_one);
+
+/*
+ * irq_create_of_mapping - Hook to resolve OF irq specifier into a
Linux irq#
+ *
+ * Currently the mapping mechanism is trivial; simple flat hwirq
numbers are
+ * mapped 1:1 onto Linux irq numbers.  Cascaded irq controllers are not
+ * supported.
+ */
+unsigned int irq_create_of_mapping(struct device_node *controller,
+				   const u32 *intspec, unsigned int
intsize)
+{
+	return intspec[0];
+}
+EXPORT_SYMBOL_GPL(irq_create_of_mapping);
+
+void __init early_init_devtree(void *params) {
+	/* Setup flat device-tree pointer */
+	initial_boot_params = params;
+
+	/* Retrieve various informations from the /chosen node of the
+	 * device-tree, including the platform type, initrd location and
+	 * size, and more ...
+	 */
+	of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
+
+	/* Scan memory nodes */
+	of_scan_flat_dt(early_init_dt_scan_root, NULL);
+	of_scan_flat_dt(early_init_dt_scan_memory_arch, NULL); }
+
+void __init device_tree_init(void)
+{
+	unsigned long base, size;
+
+	if (!initial_boot_params)
+		return;
+
+	base = virt_to_phys((void *)initial_boot_params);
+	size = initial_boot_params->totalsize;
+
+	/* Before we do anything, lets reserve the dt blob */
+	reserve_mem_mach(base, size);
+
+	unflatten_device_tree();
+
+	/* free the space reserved for the dt blob */
+	free_mem_mach(base, size);
+}
+
+#if defined(CONFIG_DEBUG_FS) && defined(DEBUG) static struct 
+debugfs_blob_wrapper flat_dt_blob;
+
+static int __init export_flat_device_tree(void) {
+	struct dentry *d;
+
+	flat_dt_blob.data = initial_boot_params;
+	flat_dt_blob.size = initial_boot_params->totalsize;
+
+	d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR,
+				powerpc_debugfs_root, &flat_dt_blob);
+	if (!d)
+		return 1;
+
+	return 0;
+}
+__initcall(export_flat_device_tree);
+#endif
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index
f9513f9..55a85e4 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -31,6 +31,7 @@
 #include <asm/setup.h>
 #include <asm/smp-ops.h>
 #include <asm/system.h>
+#include <asm/prom.h>
 
 struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
 
@@ -487,6 +488,7 @@ static void __init arch_mem_init(char **cmdline_p)
 	}
 
 	bootmem_init();
+	device_tree_init();
 	sparse_init();
 	paging_init();
 }
--
1.6.0.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* RE: [RFC PATCH 1/2] The Device Tree Patch for MIPS
@ 2010-05-10 21:34 ` Dezhong Diao (dediao)
  0 siblings, 0 replies; 6+ messages in thread
From: Dezhong Diao (dediao) @ 2010-05-10 21:34 UTC (permalink / raw)
  To: linux-mips
  Cc: David VomLehn (dvomlehn), Tony Colclough (colclot), Grant Likely

Add common device tree support for MIPS.


---
 arch/mips/Kconfig                   |   20 ++++
 arch/mips/include/asm/of_device.h   |    3 +
 arch/mips/include/asm/of_platform.h |    9 ++
 arch/mips/include/asm/prom.h        |   64 ++++++++++++++
 arch/mips/kernel/Makefile           |    2 +
 arch/mips/kernel/prom.c             |  164
+++++++++++++++++++++++++++++++++++
 arch/mips/kernel/setup.c            |    2 +
 7 files changed, 264 insertions(+), 0 deletions(-)  create mode 100644
arch/mips/include/asm/of_device.h  create mode 100644
arch/mips/include/asm/of_platform.h
 create mode 100644 arch/mips/include/asm/prom.h  create mode 100644
arch/mips/kernel/prom.c

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index
29e8692..55d8331 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -2052,6 +2052,26 @@ config SECCOMP
 
 	  If unsure, say Y. Only embedded should say N here.
 
+config OF
+	bool "Device tree support"
+	select OF_FLATTREE
+	help
+	  Support for OpenFirmware-style device trees
+
+config PROC_DEVICETREE
+	bool "Support for device tree in /proc"
+	depends on PROC_FS && OF
+	help
+	  This option adds a device-tree directory under /proc which
contains
+	  an image of the device tree that the kernel copies from Open
+	  Firmware or other boot firmware. If unsure, say Y here.
+
+config ARCH_HAS_DEVTREE_MEM
+	bool "Support user-defined memory scan function in device tree"
+	depends on OF
+	help
+	  The user has a customized function to parse memory nodes.
+
 endmenu
 
 config LOCKDEP_SUPPORT
diff --git a/arch/mips/include/asm/of_device.h
b/arch/mips/include/asm/of_device.h
new file mode 100644
index 0000000..7a83477
--- /dev/null
+++ b/arch/mips/include/asm/of_device.h
@@ -0,0 +1,3 @@
+#ifndef _ASM_MIPS_OF_DEVICE_H
+#define _ASM_MIPS_OF_DEVICE_H
+#endif /* _ASM_MIPS_OF_DEVICE_H */
diff --git a/arch/mips/include/asm/of_platform.h
b/arch/mips/include/asm/of_platform.h
new file mode 100644
index 0000000..7a33827
--- /dev/null
+++ b/arch/mips/include/asm/of_platform.h
@@ -0,0 +1,9 @@
+#ifndef _ASM_MIPS_OF_PLATFORM_H
+#define _ASM_MIPS_OF_PLATFORM_H
+
+static inline void of_device_make_bus_id(struct device *dev) {
+	__of_device_make_bus_id(dev);
+}
+
+#endif /* _ASM_MIPS_OF_PLATFORM_H */
diff --git a/arch/mips/include/asm/prom.h b/arch/mips/include/asm/prom.h
new file mode 100644 index 0000000..e72b0df
--- /dev/null
+++ b/arch/mips/include/asm/prom.h
@@ -0,0 +1,64 @@
+/*
+ *  arch/mips/include/asm/prom.h
+ *
+ *  Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+#ifndef __ASM_MIPS_PROM_H
+#define __ASM_MIPS_PROM_H
+
+#ifdef CONFIG_OF
+#include <linux/init.h>
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+#include <asm/bootinfo.h>
+
+/* _ALIGN expects upwards alignment */
+#define _ALIGN(addr, size)	(((addr) + ((size) - 1)) & (~((size) -
1)))
+
+/* which is compatible with the flattened device tree (FDT) */ #define 
+cmd_line arcs_cmdline
+
+/*
+ * Use this value to indicate lack of interrupt
+ * capability
+ */
+#ifndef NO_IRQ
+#define NO_IRQ  ((unsigned int)(-1))
+#endif
+
+static inline unsigned long pci_address_to_pio(phys_addr_t address) {
+	return (unsigned long)-1;
+}
+
+struct device_node;
+
+static inline int of_node_to_nid(struct device_node *device) {
+	return 0;
+}
+
+static inline void __init early_init_dt_scan_chosen_arch(unsigned long
node)
+{
+}
+
+extern int __init early_init_dt_scan_memory_arch(unsigned long node,
+	const char *uname, int depth, void *data);
+
+extern int __init reserve_mem_mach(unsigned long addr, unsigned long
size);
+extern void __init free_mem_mach(unsigned long addr, unsigned long
size);
+
+extern void __init device_tree_init(void); #else /* CONFIG_OF */ static

+inline void __init device_tree_init(void) { } #endif /* CONFIG_OF */
+
+#endif /* _ASM_MIPS_PROM_H */
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index
ef20957..4b10545 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -95,6 +95,8 @@ obj-$(CONFIG_KEXEC)		+= machine_kexec.o
relocate_kernel.o
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 obj-$(CONFIG_SPINLOCK_TEST)	+= spinlock_test.o
 
+obj-$(CONFIG_OF)		+= prom.o
+
 CFLAGS_cpu-bugs64.o	= $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi
-c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo
"-DHAVE_AS_SET_DADDI"; fi)
 
 obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT)	+= 8250-platform.o
diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c new file
mode 100644 index 0000000..2cbd43f
--- /dev/null
+++ b/arch/mips/kernel/prom.c
@@ -0,0 +1,164 @@
+/*
+ *  linux/arch/mips/kernel/prom.c
+ *
+ *  Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/bootmem.h>
+#include <linux/initrd.h>
+#include <linux/debugfs.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+#include <asm/page.h>
+#include <asm/prom.h>
+
+/*
+ * The list of OF IDs below is used for matching bus types in the
+ * system whose devices are to be exposed as of_platform_devices.
+ *
+ * This is the default list valid for most platforms. This file
provides
+ * functions who can take an explicit list if necessary though
+ *
+ * The search is always performed recursively looking for children of
+ * the provided device_node and recursively if such a children matches
+ * a bus type in the list
+ */
+const struct of_device_id of_default_bus_ids[] = {
+	{},
+};
+
+#ifndef CONFIG_ARCH_HAS_DEVTREE_MEM
+int __init early_init_dt_scan_memory_arch(unsigned long node,
+					  const char *uname, int depth,
+					  void *data)
+{
+	return early_init_dt_scan_memory(node, uname, depth, data); }
+
+void __init early_init_dt_add_memory_arch(u64 base, u64 size) {
+	return add_memory_region(base, size, BOOT_MEM_RAM); }
+
+int __init reserve_mem_mach(unsigned long addr, unsigned long size) {
+	return reserve_bootmem(addr, size, BOOTMEM_DEFAULT); }
+
+void __init free_mem_mach(unsigned long addr, unsigned long size) {
+	return free_bootmem(addr, size);
+}
+#endif
+
+u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) {
+	return virt_to_phys(
+		__alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS))
+		);
+}
+
+#ifdef CONFIG_BLK_DEV_INITRD
+void __init early_init_dt_setup_initrd_arch(unsigned long start,
+					    unsigned long end)
+{
+	initrd_start = (unsigned long)__va(start);
+	initrd_end = (unsigned long)__va(end);
+	initrd_below_start_ok = 1;
+}
+#endif
+
+/*
+ * Interrupt remapper
+ */
+struct device_node *of_irq_find_parent_by_phandle(phandle p) {
+	return of_find_node_by_phandle(p);
+}
+
+int of_irq_map_one(struct device_node *device,
+		   int index, struct of_irq *out_irq) {
+	return __of_irq_map_one(device, index, out_irq); } 
+EXPORT_SYMBOL_GPL(of_irq_map_one);
+
+/*
+ * irq_create_of_mapping - Hook to resolve OF irq specifier into a
Linux irq#
+ *
+ * Currently the mapping mechanism is trivial; simple flat hwirq
numbers are
+ * mapped 1:1 onto Linux irq numbers.  Cascaded irq controllers are not
+ * supported.
+ */
+unsigned int irq_create_of_mapping(struct device_node *controller,
+				   const u32 *intspec, unsigned int
intsize)
+{
+	return intspec[0];
+}
+EXPORT_SYMBOL_GPL(irq_create_of_mapping);
+
+void __init early_init_devtree(void *params) {
+	/* Setup flat device-tree pointer */
+	initial_boot_params = params;
+
+	/* Retrieve various informations from the /chosen node of the
+	 * device-tree, including the platform type, initrd location and
+	 * size, and more ...
+	 */
+	of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
+
+	/* Scan memory nodes */
+	of_scan_flat_dt(early_init_dt_scan_root, NULL);
+	of_scan_flat_dt(early_init_dt_scan_memory_arch, NULL); }
+
+void __init device_tree_init(void)
+{
+	unsigned long base, size;
+
+	if (!initial_boot_params)
+		return;
+
+	base = virt_to_phys((void *)initial_boot_params);
+	size = initial_boot_params->totalsize;
+
+	/* Before we do anything, lets reserve the dt blob */
+	reserve_mem_mach(base, size);
+
+	unflatten_device_tree();
+
+	/* free the space reserved for the dt blob */
+	free_mem_mach(base, size);
+}
+
+#if defined(CONFIG_DEBUG_FS) && defined(DEBUG) static struct 
+debugfs_blob_wrapper flat_dt_blob;
+
+static int __init export_flat_device_tree(void) {
+	struct dentry *d;
+
+	flat_dt_blob.data = initial_boot_params;
+	flat_dt_blob.size = initial_boot_params->totalsize;
+
+	d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR,
+				powerpc_debugfs_root, &flat_dt_blob);
+	if (!d)
+		return 1;
+
+	return 0;
+}
+__initcall(export_flat_device_tree);
+#endif
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index
f9513f9..55a85e4 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -31,6 +31,7 @@
 #include <asm/setup.h>
 #include <asm/smp-ops.h>
 #include <asm/system.h>
+#include <asm/prom.h>
 
 struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
 
@@ -487,6 +488,7 @@ static void __init arch_mem_init(char **cmdline_p)
 	}
 
 	bootmem_init();
+	device_tree_init();
 	sparse_init();
 	paging_init();
 }
--
1.6.0.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH 1/2] The Device Tree Patch for MIPS
  2010-05-10 21:34 ` Dezhong Diao (dediao)
  (?)
@ 2010-05-12 17:24 ` David Daney
  2010-05-13 18:50     ` Dezhong Diao (dediao)
  -1 siblings, 1 reply; 6+ messages in thread
From: David Daney @ 2010-05-12 17:24 UTC (permalink / raw)
  To: Dezhong Diao (dediao)
  Cc: linux-mips, David VomLehn (dvomlehn), Tony Colclough (colclot),
	Grant Likely

On 05/10/2010 02:34 PM, Dezhong Diao (dediao) wrote:
> Add common device tree support for MIPS.
>

You are missing a 'Signed-off-by:' here.


>
> ---
>   arch/mips/Kconfig                   |   20 ++++
>   arch/mips/include/asm/of_device.h   |    3 +
>   arch/mips/include/asm/of_platform.h |    9 ++
>   arch/mips/include/asm/prom.h        |   64 ++++++++++++++
>   arch/mips/kernel/Makefile           |    2 +
>   arch/mips/kernel/prom.c             |  164
> +++++++++++++++++++++++++++++++++++
>   arch/mips/kernel/setup.c            |    2 +
>   7 files changed, 264 insertions(+), 0 deletions(-)  create mode 100644
> arch/mips/include/asm/of_device.h  create mode 100644
> arch/mips/include/asm/of_platform.h
>   create mode 100644 arch/mips/include/asm/prom.h  create mode 100644
> arch/mips/kernel/prom.c
>
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index
> 29e8692..55d8331 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -2052,6 +2052,26 @@ config SECCOMP
>
>   	  If unsure, say Y. Only embedded should say N here.
>
> +config OF
> +	bool "Device tree support"
> +	select OF_FLATTREE
> +	help
> +	  Support for OpenFirmware-style device trees
> +
> +config PROC_DEVICETREE
> +	bool "Support for device tree in /proc"
> +	depends on PROC_FS&&  OF
> +	help
> +	  This option adds a device-tree directory under /proc which
> contains
> +	  an image of the device tree that the kernel copies from Open
> +	  Firmware or other boot firmware. If unsure, say Y here.
> +
> +config ARCH_HAS_DEVTREE_MEM
> +	bool "Support user-defined memory scan function in device tree"
> +	depends on OF
> +	help
> +	  The user has a customized function to parse memory nodes.
> +
>   endmenu
>
>   config LOCKDEP_SUPPORT
> diff --git a/arch/mips/include/asm/of_device.h
> b/arch/mips/include/asm/of_device.h
> new file mode 100644
> index 0000000..7a83477
> --- /dev/null
> +++ b/arch/mips/include/asm/of_device.h
> @@ -0,0 +1,3 @@
> +#ifndef _ASM_MIPS_OF_DEVICE_H
> +#define _ASM_MIPS_OF_DEVICE_H
> +#endif /* _ASM_MIPS_OF_DEVICE_H */
> diff --git a/arch/mips/include/asm/of_platform.h
> b/arch/mips/include/asm/of_platform.h
> new file mode 100644
> index 0000000..7a33827
> --- /dev/null
> +++ b/arch/mips/include/asm/of_platform.h
> @@ -0,0 +1,9 @@
> +#ifndef _ASM_MIPS_OF_PLATFORM_H
> +#define _ASM_MIPS_OF_PLATFORM_H
> +
> +static inline void of_device_make_bus_id(struct device *dev) {
> +	__of_device_make_bus_id(dev);
> +}
> +
> +#endif /* _ASM_MIPS_OF_PLATFORM_H */
> diff --git a/arch/mips/include/asm/prom.h b/arch/mips/include/asm/prom.h
> new file mode 100644 index 0000000..e72b0df
> --- /dev/null
> +++ b/arch/mips/include/asm/prom.h
> @@ -0,0 +1,64 @@
> +/*
> + *  arch/mips/include/asm/prom.h
> + *
> + *  Copyright (C) 2010 Cisco Systems Inc.<dediao@cisco.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + */
> +#ifndef __ASM_MIPS_PROM_H
> +#define __ASM_MIPS_PROM_H
> +
> +#ifdef CONFIG_OF
> +#include<linux/init.h>
> +
> +#include<asm/setup.h>
> +#include<asm/irq.h>
> +#include<asm/bootinfo.h>
> +
> +/* _ALIGN expects upwards alignment */
> +#define _ALIGN(addr, size)	(((addr) + ((size) - 1))&  (~((size) -
> 1)))
> +
> +/* which is compatible with the flattened device tree (FDT) */ #define
> +cmd_line arcs_cmdline


What is this #define floating in space?




> +
> +/*
> + * Use this value to indicate lack of interrupt
> + * capability
> + */
> +#ifndef NO_IRQ
> +#define NO_IRQ  ((unsigned int)(-1))
> +#endif



> +
> +static inline unsigned long pci_address_to_pio(phys_addr_t address) {
> +	return (unsigned long)-1;
> +}
> +
> +struct device_node;
> +
> +static inline int of_node_to_nid(struct device_node *device) {
> +	return 0;
> +}
> +
> +static inline void __init early_init_dt_scan_chosen_arch(unsigned long
> node)
> +{
> +}
> +
> +extern int __init early_init_dt_scan_memory_arch(unsigned long node,
> +	const char *uname, int depth, void *data);
> +
> +extern int __init reserve_mem_mach(unsigned long addr, unsigned long
> size);
> +extern void __init free_mem_mach(unsigned long addr, unsigned long
> size);
> +
> +extern void __init device_tree_init(void); #else /* CONFIG_OF */ static
>
> +inline void __init device_tree_init(void) { } #endif /* CONFIG_OF */
> +
> +#endif /* _ASM_MIPS_PROM_H */
> diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index
> ef20957..4b10545 100644
> --- a/arch/mips/kernel/Makefile
> +++ b/arch/mips/kernel/Makefile
> @@ -95,6 +95,8 @@ obj-$(CONFIG_KEXEC)		+= machine_kexec.o
> relocate_kernel.o
>   obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
>   obj-$(CONFIG_SPINLOCK_TEST)	+= spinlock_test.o
>
> +obj-$(CONFIG_OF)		+= prom.o
> +
>   CFLAGS_cpu-bugs64.o	= $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi
> -c -o /dev/null -xc /dev/null>/dev/null 2>&1; then echo
> "-DHAVE_AS_SET_DADDI"; fi)
>
>   obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT)	+= 8250-platform.o
> diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c new file
> mode 100644 index 0000000..2cbd43f
> --- /dev/null
> +++ b/arch/mips/kernel/prom.c
> @@ -0,0 +1,164 @@
> +/*
> + *  linux/arch/mips/kernel/prom.c
> + *
> + *  Copyright (C) 2010 Cisco Systems Inc.<dediao@cisco.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include<linux/init.h>
> +#include<linux/module.h>
> +#include<linux/errno.h>
> +#include<linux/types.h>
> +#include<linux/bootmem.h>
> +#include<linux/initrd.h>
> +#include<linux/debugfs.h>
> +#include<linux/of.h>
> +#include<linux/of_fdt.h>
> +#include<linux/of_irq.h>
> +#include<linux/of_platform.h>
> +
> +#include<asm/page.h>
> +#include<asm/prom.h>
> +
> +/*
> + * The list of OF IDs below is used for matching bus types in the
> + * system whose devices are to be exposed as of_platform_devices.
> + *
> + * This is the default list valid for most platforms. This file
> provides
> + * functions who can take an explicit list if necessary though
> + *
> + * The search is always performed recursively looking for children of
> + * the provided device_node and recursively if such a children matches
> + * a bus type in the list
> + */
> +const struct of_device_id of_default_bus_ids[] = {
> +	{},
> +};
> +
> +#ifndef CONFIG_ARCH_HAS_DEVTREE_MEM
> +int __init early_init_dt_scan_memory_arch(unsigned long node,
> +					  const char *uname, int depth,
> +					  void *data)
> +{
> +	return early_init_dt_scan_memory(node, uname, depth, data); }
> +
> +void __init early_init_dt_add_memory_arch(u64 base, u64 size) {
> +	return add_memory_region(base, size, BOOT_MEM_RAM); }
> +
> +int __init reserve_mem_mach(unsigned long addr, unsigned long size) {
> +	return reserve_bootmem(addr, size, BOOTMEM_DEFAULT); }
> +
> +void __init free_mem_mach(unsigned long addr, unsigned long size) {
> +	return free_bootmem(addr, size);
> +}
> +#endif
> +
> +u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) {
> +	return virt_to_phys(
> +		__alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS))
> +		);
> +}
> +
> +#ifdef CONFIG_BLK_DEV_INITRD
> +void __init early_init_dt_setup_initrd_arch(unsigned long start,
> +					    unsigned long end)
> +{
> +	initrd_start = (unsigned long)__va(start);
> +	initrd_end = (unsigned long)__va(end);
> +	initrd_below_start_ok = 1;
> +}
> +#endif
> +
> +/*
> + * Interrupt remapper
> + */
> +struct device_node *of_irq_find_parent_by_phandle(phandle p) {
> +	return of_find_node_by_phandle(p);
> +}
> +
> +int of_irq_map_one(struct device_node *device,
> +		   int index, struct of_irq *out_irq) {
> +	return __of_irq_map_one(device, index, out_irq); }
> +EXPORT_SYMBOL_GPL(of_irq_map_one);
> +
> +/*
> + * irq_create_of_mapping - Hook to resolve OF irq specifier into a
> Linux irq#
> + *
> + * Currently the mapping mechanism is trivial; simple flat hwirq
> numbers are
> + * mapped 1:1 onto Linux irq numbers.  Cascaded irq controllers are not
> + * supported.
> + */
> +unsigned int irq_create_of_mapping(struct device_node *controller,
> +				   const u32 *intspec, unsigned int
> intsize)
> +{
> +	return intspec[0];
> +}
> +EXPORT_SYMBOL_GPL(irq_create_of_mapping);
> +
> +void __init early_init_devtree(void *params) {
> +	/* Setup flat device-tree pointer */
> +	initial_boot_params = params;
> +
> +	/* Retrieve various informations from the /chosen node of the
> +	 * device-tree, including the platform type, initrd location and
> +	 * size, and more ...
> +	 */
> +	of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
> +
> +	/* Scan memory nodes */
> +	of_scan_flat_dt(early_init_dt_scan_root, NULL);
> +	of_scan_flat_dt(early_init_dt_scan_memory_arch, NULL); }
> +
> +void __init device_tree_init(void)
> +{
> +	unsigned long base, size;
> +
> +	if (!initial_boot_params)
> +		return;
> +
> +	base = virt_to_phys((void *)initial_boot_params);
> +	size = initial_boot_params->totalsize;
> +
> +	/* Before we do anything, lets reserve the dt blob */
> +	reserve_mem_mach(base, size);
> +
> +	unflatten_device_tree();
> +
> +	/* free the space reserved for the dt blob */
> +	free_mem_mach(base, size);
> +}
> +
> +#if defined(CONFIG_DEBUG_FS)&&  defined(DEBUG) static struct
> +debugfs_blob_wrapper flat_dt_blob;
> +

This looks fubar as well.



Please make sure that it for the most part passes checkpatch.pl, and 
test your patch mailing procedure so that things don't get mangled.

Other than that, I would like to say thanks for working on this.  It has 
been needed for quite some time.

Thanks,
David Daney

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [RFC PATCH 1/2] The Device Tree Patch for MIPS
@ 2010-05-13 18:50     ` Dezhong Diao (dediao)
  0 siblings, 0 replies; 6+ messages in thread
From: Dezhong Diao (dediao) @ 2010-05-13 18:50 UTC (permalink / raw)
  To: David Daney
  Cc: linux-mips, David VomLehn (dvomlehn), Tony Colclough (colclot),
	Grant Likely

>> +/* which is compatible with the flattened device tree (FDT) */ 
>> +#define cmd_line arcs_cmdline

>What is this #define floating in space?

The variable "cmd_line" is being used in generic code of device tree,
most of platforms (ARM, POWERPC
, etc) have its definition, but it isn't present in MIPS. Actually there
is a variable "arcs_cmdline" to be used as the same purpose in MIPS,
that is the reason "arcs_cmdline" is given a new name.


Thanks


Dezhong

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [RFC PATCH 1/2] The Device Tree Patch for MIPS
@ 2010-05-13 18:50     ` Dezhong Diao (dediao)
  0 siblings, 0 replies; 6+ messages in thread
From: Dezhong Diao (dediao) @ 2010-05-13 18:50 UTC (permalink / raw)
  To: David Daney
  Cc: linux-mips, David VomLehn (dvomlehn), Tony Colclough (colclot),
	Grant Likely

>> +/* which is compatible with the flattened device tree (FDT) */ 
>> +#define cmd_line arcs_cmdline

>What is this #define floating in space?

The variable "cmd_line" is being used in generic code of device tree,
most of platforms (ARM, POWERPC
, etc) have its definition, but it isn't present in MIPS. Actually there
is a variable "arcs_cmdline" to be used as the same purpose in MIPS,
that is the reason "arcs_cmdline" is given a new name.


Thanks


Dezhong

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH 1/2] The Device Tree Patch for MIPS
  2010-05-13 18:50     ` Dezhong Diao (dediao)
  (?)
@ 2010-05-13 20:24     ` David Daney
  -1 siblings, 0 replies; 6+ messages in thread
From: David Daney @ 2010-05-13 20:24 UTC (permalink / raw)
  To: Dezhong Diao (dediao)
  Cc: linux-mips, David VomLehn (dvomlehn), Tony Colclough (colclot),
	Grant Likely

On 05/13/2010 11:50 AM, Dezhong Diao (dediao) wrote:
>>> +/* which is compatible with the flattened device tree (FDT) */
>>> +#define cmd_line arcs_cmdline
>
>> What is this #define floating in space?
>
> The variable "cmd_line" is being used in generic code of device tree,
> most of platforms (ARM, POWERPC
> , etc) have its definition, but it isn't present in MIPS. Actually there
> is a variable "arcs_cmdline" to be used as the same purpose in MIPS,
> that is the reason "arcs_cmdline" is given a new name.
>

Really I was referring to the way the patch got horked up when you 
e-mailed it.  It was very difficult to understand what the intent was.

I have no problem using #define, just make sure it doesn't have other 
garbage preceding the '#'

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-05-13 20:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-10 21:34 [RFC PATCH 1/2] The Device Tree Patch for MIPS Dezhong Diao (dediao)
2010-05-10 21:34 ` Dezhong Diao (dediao)
2010-05-12 17:24 ` David Daney
2010-05-13 18:50   ` Dezhong Diao (dediao)
2010-05-13 18:50     ` Dezhong Diao (dediao)
2010-05-13 20:24     ` David Daney

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.