linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/8] Basic ARM devicetree support
@ 2011-04-29  7:15 Grant Likely
  2011-04-29  7:15 ` [PATCH v5 1/8] arm/dt: Make __vet_atags also accept a dtb image Grant Likely
                   ` (7 more replies)
  0 siblings, 8 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

Well, it's been a while since I've posted these, so it's probably
about time to circulate them again.

v5 rebases on top of 2.6.39-rc5 plus one patch to allow arch code
to pass in a pointer to the command_line buffer, and the virq rework
series that (finally!) implements devicetree irq mapping support for
all architectures.  All prerequisite patches were posted earlier today,
I've also pushed them out to:

    git://git.secretlab.ca/git/linux-2.6 devicetree/irq-domain.

Patch 5 in this series cleans up for the irq-domain change, but this
series can be used on a vanilla 2.6.39-rc5 by dropping patch #5, and
adding the cmd_line prerequisite patch.

Both devicetree/arm and devicetree/test branches on
git://git.secretlab.ca/git/linux-2.6 reflect the current state of this
patch series (although there is all kinds of crud committed on top of
them in devicetree/test)

I'm not asking for these patches to be merged into mainline yet, but
I'm fairly confident that they should be pretty close to their final
form.

Please test.

Thanks,
g.

---

 This patch series allows CONFIG_OF to be enabled on ARM and allows the
 kernel to accept a dtb pointer from boot firmware instead of atags.
 If a dtb is passed, then the kernel will use the root 'compatible'
 property to find a matching machine_desc, and it will use it to obtain
 the memory layout, initrd location and kernel parameters string.

 Only limited device tree support is enabled here.  It does not perform
 any kind of device registration from device tree data.  That support
 will be enabled in a later patch set.  Rather, this series is a stable
 base that other engineers can use to start working on device tree
 support for their platforms.

---

Grant Likely (8):
      arm/dt: Make __vet_atags also accept a dtb image
      arm/dt: Allow CONFIG_OF on ARM
      arm/dt: consolidate atags setup into setup_machine_atags
      arm/dt: probe for platforms via the device tree
      arm/dt: Drop irq_create_of_mapping() from arm code.
      arm/dt: Basic versatile devicetree support
      arm/dt: Basic tegra devicetree support
      dt: add documentation of ARM dt boot interface


 Documentation/arm/Booting                       |   33 +++++-
 Documentation/devicetree/booting-without-of.txt |   48 ++++++++
 arch/arm/Kconfig                                |    7 +
 arch/arm/boot/dts/omap4-panda.dts               |   11 ++
 arch/arm/boot/dts/skeleton.dtsi                 |   13 ++
 arch/arm/boot/dts/tegra-harmony.dts             |    7 +
 arch/arm/boot/dts/versatile-ab.dts              |    7 +
 arch/arm/boot/dts/versatile-pb.dts              |    7 +
 arch/arm/include/asm/mach/arch.h                |    9 ++
 arch/arm/include/asm/prom.h                     |   37 ++++++
 arch/arm/include/asm/setup.h                    |    4 +
 arch/arm/kernel/Makefile                        |    1 
 arch/arm/kernel/devtree.c                       |  131 +++++++++++++++++++++++
 arch/arm/kernel/head-common.S                   |   24 +++-
 arch/arm/kernel/head.S                          |    8 +
 arch/arm/kernel/setup.c                         |   90 ++++++++++------
 arch/arm/mach-omap2/board-omap4panda.c          |    6 +
 arch/arm/mach-tegra/board-harmony.c             |    6 +
 arch/arm/mach-versatile/versatile_ab.c          |    6 +
 arch/arm/mach-versatile/versatile_pb.c          |    6 +
 arch/arm/mm/init.c                              |   11 ++
 21 files changed, 422 insertions(+), 50 deletions(-)
 create mode 100644 arch/arm/boot/dts/omap4-panda.dts
 create mode 100644 arch/arm/boot/dts/skeleton.dtsi
 create mode 100644 arch/arm/boot/dts/tegra-harmony.dts
 create mode 100644 arch/arm/boot/dts/versatile-ab.dts
 create mode 100644 arch/arm/boot/dts/versatile-pb.dts
 create mode 100644 arch/arm/include/asm/prom.h
 create mode 100644 arch/arm/kernel/devtree.c

-- 
Signature

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

* [PATCH v5 1/8] arm/dt: Make __vet_atags also accept a dtb image
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-04-29  7:15 ` [PATCH v5 2/8] arm/dt: Allow CONFIG_OF on ARM Grant Likely
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

The dtb is passed to the kernel via register r2, which is the same
method that is used to pass an atags pointer.  This patch modifies
__vet_atags to not clear r2 when it encounters a dtb image.

v2: fixed bugs pointed out by Nicolas Pitre

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/kernel/head-common.S |   24 ++++++++++++++++++------
 arch/arm/kernel/head.S        |    8 ++++----
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
index c84b57d..854bd22 100644
--- a/arch/arm/kernel/head-common.S
+++ b/arch/arm/kernel/head-common.S
@@ -15,6 +15,12 @@
 #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
 #define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
 
+#ifdef CONFIG_CPU_BIG_ENDIAN
+#define OF_DT_MAGIC 0xd00dfeed
+#else
+#define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */
+#endif
+
 /*
  * Exception handling.  Something went wrong and we can't proceed.  We
  * ought to tell the user, but since we don't have any guarantee that
@@ -28,20 +34,26 @@
 
 /* Determine validity of the r2 atags pointer.  The heuristic requires
  * that the pointer be aligned, in the first 16k of physical RAM and
- * that the ATAG_CORE marker is first and present.  Future revisions
+ * that the ATAG_CORE marker is first and present.  If CONFIG_OF_FLATTREE
+ * is selected, then it will also accept a dtb pointer.  Future revisions
  * of this function may be more lenient with the physical address and
  * may also be able to move the ATAGS block if necessary.
  *
  * Returns:
- *  r2 either valid atags pointer, or zero
+ *  r2 either valid atags pointer, valid dtb pointer, or zero
  *  r5, r6 corrupted
  */
 __vet_atags:
 	tst	r2, #0x3			@ aligned?
 	bne	1f
 
-	ldr	r5, [r2, #0]			@ is first tag ATAG_CORE?
-	cmp	r5, #ATAG_CORE_SIZE
+	ldr	r5, [r2, #0]
+#ifdef CONFIG_OF_FLATTREE
+	ldr	r6, =OF_DT_MAGIC		@ is it a DTB?
+	cmp	r5, r6
+	beq	2f
+#endif
+	cmp	r5, #ATAG_CORE_SIZE		@ is first tag ATAG_CORE?
 	cmpne	r5, #ATAG_CORE_SIZE_EMPTY
 	bne	1f
 	ldr	r5, [r2, #4]
@@ -49,7 +61,7 @@ __vet_atags:
 	cmp	r5, r6
 	bne	1f
 
-	mov	pc, lr				@ atag pointer is ok
+2:	mov	pc, lr				@ atag/dtb pointer is ok
 
 1:	mov	r2, #0
 	mov	pc, lr
@@ -61,7 +73,7 @@ ENDPROC(__vet_atags)
  *
  *  r0  = cp#15 control register
  *  r1  = machine ID
- *  r2  = atags pointer
+ *  r2  = atags/dtb pointer
  *  r9  = processor ID
  */
 	__INIT
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index c9173cf..a5e5c5b 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -59,7 +59,7 @@
  *
  * This is normally called from the decompressor code.  The requirements
  * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
- * r1 = machine nr, r2 = atags pointer.
+ * r1 = machine nr, r2 = atags or dtb pointer.
  *
  * This code is mostly position independent, so if you link the kernel at
  * 0xc0008000, you call this at __pa(0xc0008000).
@@ -91,7 +91,7 @@ ENTRY(stext)
 #endif
 
 	/*
-	 * r1 = machine no, r2 = atags,
+	 * r1 = machine no, r2 = atags or dtb,
 	 * r8 = phys_offset, r9 = cpuid, r10 = procinfo
 	 */
 	bl	__vet_atags
@@ -339,7 +339,7 @@ __secondary_data:
  *
  *  r0  = cp#15 control register
  *  r1  = machine ID
- *  r2  = atags pointer
+ *  r2  = atags or dtb pointer
  *  r4  = page table pointer
  *  r9  = processor ID
  *  r13 = *virtual* address to jump to upon completion
@@ -376,7 +376,7 @@ ENDPROC(__enable_mmu)
  *
  *  r0  = cp#15 control register
  *  r1  = machine ID
- *  r2  = atags pointer
+ *  r2  = atags or dtb pointer
  *  r9  = processor ID
  *  r13 = *virtual* address to jump to upon completion
  *

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

* [PATCH v5 2/8] arm/dt: Allow CONFIG_OF on ARM
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
  2011-04-29  7:15 ` [PATCH v5 1/8] arm/dt: Make __vet_atags also accept a dtb image Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-04-29  7:15 ` [PATCH v5 3/8] arm/dt: consolidate atags setup into setup_machine_atags Grant Likely
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

Add some basic empty infrastructure for DT support on ARM.

v5: - Fix off-by-one error in size calculation of initrd
    - Stop mucking with cmd_line, and load command line from dt into
      boot_command_line instead which matches the behaviour of ATAGS booting
v3: - moved cmd_line export and initrd setup to this patch to make the
      series bisectable.
    - switched to alloc_bootmem_align() for allocation when
      unflattening the device tree.  memblock_alloc() was not the
      right interface.

Signed-off-by: Jeremy Kerr <jeremy.kerr@canonical.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/Kconfig             |    7 ++++++
 arch/arm/include/asm/prom.h  |   25 ++++++++++++++++++++++
 arch/arm/include/asm/setup.h |    2 ++
 arch/arm/kernel/Makefile     |    1 +
 arch/arm/kernel/devtree.c    |   47 ++++++++++++++++++++++++++++++++++++++++++
 arch/arm/kernel/setup.c      |    2 +-
 arch/arm/mm/init.c           |    9 ++++++++
 7 files changed, 92 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/include/asm/prom.h
 create mode 100644 arch/arm/kernel/devtree.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 377a7a5..efc7f3c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1687,6 +1687,13 @@ endmenu
 
 menu "Boot options"
 
+config USE_OF
+	bool "Flattened Device Tree support"
+	select OF
+	select OF_EARLY_FLATTREE
+	help
+	  Include support for flattened device tree machine descriptions.
+
 # Compressed boot loader in ROM.  Yes, we really want to ask about
 # TEXT and BSS so we preserve their values in the config files.
 config ZBOOT_ROM_TEXT
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h
new file mode 100644
index 0000000..8f1037f
--- /dev/null
+++ b/arch/arm/include/asm/prom.h
@@ -0,0 +1,25 @@
+/*
+ *  arch/arm/include/asm/prom.h
+ *
+ *  Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.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 __ASMARM_PROM_H
+#define __ASMARM_PROM_H
+
+#ifdef CONFIG_OF
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+
+static inline void irq_dispose_mapping(unsigned int virq)
+{
+	return;
+}
+
+#endif /* CONFIG_OF */
+#endif /* ASMARM_PROM_H */
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h
index 95176af..93b4702 100644
--- a/arch/arm/include/asm/setup.h
+++ b/arch/arm/include/asm/setup.h
@@ -217,6 +217,8 @@ extern struct meminfo meminfo;
 #define bank_phys_end(bank)	((bank)->start + (bank)->size)
 #define bank_phys_size(bank)	(bank)->size
 
+extern int arm_add_memory(phys_addr_t start, unsigned long size);
+
 #endif  /*  __KERNEL__  */
 
 #endif
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 8d95446..908c78c 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -44,6 +44,7 @@ obj-$(CONFIG_ARM_THUMBEE)	+= thumbee.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
 obj-$(CONFIG_ARM_UNWIND)	+= unwind.o
 obj-$(CONFIG_HAVE_TCM)		+= tcm.o
+obj-$(CONFIG_OF)		+= devtree.o
 obj-$(CONFIG_CRASH_DUMP)	+= crash_dump.o
 obj-$(CONFIG_SWP_EMULATE)	+= swp_emulate.o
 CFLAGS_swp_emulate.o		:= -Wa,-march=armv7-a
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
new file mode 100644
index 0000000..75e3df8
--- /dev/null
+++ b/arch/arm/kernel/devtree.c
@@ -0,0 +1,47 @@
+/*
+ *  linux/arch/arm/kernel/devtree.c
+ *
+ *  Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.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/memblock.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+#include <asm/setup.h>
+#include <asm/page.h>
+
+void __init early_init_dt_add_memory_arch(u64 base, u64 size)
+{
+	arm_add_memory(base, size);
+}
+
+void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
+{
+	return alloc_bootmem_align(size, align);
+}
+
+/**
+ * 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);
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 006c1e8..109997e 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -466,7 +466,7 @@ static struct machine_desc * __init setup_machine(unsigned int nr)
 		/* can't use cpu_relax() here as it may require MMU setup */;
 }
 
-static int __init arm_add_memory(phys_addr_t start, unsigned long size)
+int __init arm_add_memory(phys_addr_t start, unsigned long size)
 {
 	struct membank *bank = &meminfo.bank[meminfo.nr_banks];
 
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index e5f6fc4..26c4054 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -15,6 +15,7 @@
 #include <linux/mman.h>
 #include <linux/nodemask.h>
 #include <linux/initrd.h>
+#include <linux/of_fdt.h>
 #include <linux/highmem.h>
 #include <linux/gfp.h>
 #include <linux/memblock.h>
@@ -71,6 +72,14 @@ static int __init parse_tag_initrd2(const struct tag *tag)
 
 __tagtable(ATAG_INITRD2, parse_tag_initrd2);
 
+#ifdef CONFIG_OF_FLATTREE
+void __init early_init_dt_setup_initrd_arch(unsigned long start, unsigned long end)
+{
+	phys_initrd_start = start;
+	phys_initrd_size = end - start;
+}
+#endif /* CONFIG_OF_FLATTREE */
+
 /*
  * This keeps memory configuration data used by a couple memory
  * initialization functions, as well as show_mem() for the skipping

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

* [PATCH v5 3/8] arm/dt: consolidate atags setup into setup_machine_atags
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
  2011-04-29  7:15 ` [PATCH v5 1/8] arm/dt: Make __vet_atags also accept a dtb image Grant Likely
  2011-04-29  7:15 ` [PATCH v5 2/8] arm/dt: Allow CONFIG_OF on ARM Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-04-29  7:15 ` [PATCH v5 4/8] arm/dt: probe for platforms via the device tree Grant Likely
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

In preparation for adding device tree support, this patch consolidates
all of the atag-specific setup into a single function.

v5: - drop double printk("Machine; %s\n", ...); call.
    - leave copying boot_command_line in setup_arch() since it isn't
      atags specific.
v4: - adapt to the removal of lookup_machine_type()
    - break out dump of machine_desc table into dump_machine_table()
      because the device tree probe code will use it.
    - Add for_each_machine_desc() macro

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/include/asm/mach/arch.h |    7 ++++
 arch/arm/kernel/setup.c          |   69 ++++++++++++++++++++++----------------
 2 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index bf13b81..4764e67 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -48,6 +48,13 @@ struct machine_desc {
 extern struct machine_desc *machine_desc;
 
 /*
+ * Machine type table - also only accessible during boot
+ */
+extern struct machine_desc __arch_info_begin[], __arch_info_end[];
+#define for_each_machine_desc(p)			\
+	for (p = __arch_info_begin; p < __arch_info_end; p++)
+
+/*
  * Set of macros to define architecture features.  This is built into
  * a table by the linker.
  */
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 109997e..42c2f0c 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -439,25 +439,12 @@ void cpu_init(void)
 	    : "r14");
 }
 
-static struct machine_desc * __init setup_machine(unsigned int nr)
+static void __init dump_machine_table(void)
 {
-	extern struct machine_desc __arch_info_begin[], __arch_info_end[];
 	struct machine_desc *p;
 
-	/*
-	 * locate machine in the list of supported machines.
-	 */
-	for (p = __arch_info_begin; p < __arch_info_end; p++)
-		if (nr == p->nr) {
-			printk("Machine: %s\n", p->name);
-			return p;
-		}
-
-	early_print("\n"
-		"Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n"
-		"Available machine support:\n\nID (hex)\tNAME\n", nr);
-
-	for (p = __arch_info_begin; p < __arch_info_end; p++)
+	early_print("Available machine support:\n\nID (hex)\tNAME\n");
+	for_each_machine_desc(p)
 		early_print("%08x\t%s\n", p->nr, p->name);
 
 	early_print("\nPlease check your kernel config and/or bootloader.\n");
@@ -796,23 +783,29 @@ static void __init squash_mem_tags(struct tag *tag)
 			tag->hdr.tag = ATAG_NONE;
 }
 
-void __init setup_arch(char **cmdline_p)
+static struct machine_desc * __init setup_machine_tags(unsigned int nr)
 {
 	struct tag *tags = (struct tag *)&init_tags;
-	struct machine_desc *mdesc;
+	struct machine_desc *mdesc = NULL, *p;
 	char *from = default_command_line;
 
 	init_tags.mem.start = PHYS_OFFSET;
 
-	unwind_init();
-
-	setup_processor();
-	mdesc = setup_machine(machine_arch_type);
-	machine_desc = mdesc;
-	machine_name = mdesc->name;
+	/*
+	 * locate machine in the list of supported machines.
+	 */
+	for_each_machine_desc(p)
+		if (nr == p->nr) {
+			printk("Machine: %s\n", p->name);
+			mdesc = p;
+			break;
+		}
 
-	if (mdesc->soft_reboot)
-		reboot_setup("s");
+	if (!mdesc) {
+		early_print("\nError: unrecognized/unsupported machine ID"
+			" (r1 = 0x%08x).\n\n", nr);
+		dump_machine_table(); /* does not return */
+	}
 
 	if (__atags_pointer)
 		tags = phys_to_virt(__atags_pointer);
@@ -857,14 +850,32 @@ void __init setup_arch(char **cmdline_p)
 		parse_tags(tags);
 	}
 
+	/* parse_early_param needs a boot_command_line */
+	strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
+
+	return mdesc;
+}
+
+
+void __init setup_arch(char **cmdline_p)
+{
+	struct machine_desc *mdesc;
+
+	unwind_init();
+
+	setup_processor();
+	mdesc = setup_machine_tags(machine_arch_type);
+	machine_desc = mdesc;
+	machine_name = mdesc->name;
+
+	if (mdesc->soft_reboot)
+		reboot_setup("s");
+
 	init_mm.start_code = (unsigned long) _text;
 	init_mm.end_code   = (unsigned long) _etext;
 	init_mm.end_data   = (unsigned long) _edata;
 	init_mm.brk	   = (unsigned long) _end;
 
-	/* parse_early_param needs a boot_command_line */
-	strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
-
 	/* populate cmd_line too for later use, preserving boot_command_line */
 	strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
 	*cmdline_p = cmd_line;

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
                   ` (2 preceding siblings ...)
  2011-04-29  7:15 ` [PATCH v5 3/8] arm/dt: consolidate atags setup into setup_machine_atags Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-05-02 15:15   ` Tony Lindgren
  2011-04-29  7:15 ` [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code Grant Likely
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

If a dtb is passed to the kernel then the kernel needs to iterate
through compiled-in mdescs looking for one that matches and move the
dtb data to a safe location before it gets accidentally overwritten by
the kernel.

This patch creates a new function, setup_machine_fdt() which is
analogous to the setup_machine_atags() created in the previous patch.
It does all the early setup needed to use a device tree machine
description.

v5: - Print warning with neither dtb nor atags are passed to the kernel
    - Fix bug in setting of __machine_arch_type to the selected machine,
      not just the last machine in the list.
      Reported-by: Tixy <tixy@yxit.co.uk>
    - Copy command line directly into boot_command_line instead of cmd_line
v4: - Dump some output when a matching machine_desc cannot be found
v3: - Added processing of reserved list.
    - Backed out the v2 change that copied instead of reserved the
      dtb.  dtb is reserved again and the real problem was fixed by
      using alloc_bootmem_align() for early allocation of RAM for
      unflattening the tree.
    - Moved cmd_line and initrd changes to earlier patch to make series
      bisectable.
v2: Changed to save the dtb by copying into an allocated buffer.
    - Since the dtb will very likely be passed in the first 16k of ram
      where the interrupt vectors live, memblock_reserve() is
      insufficient to protect the dtb data.
[based on work originally written by Jeremy Kerr <jeremy.kerr@canonical.com>]
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/include/asm/mach/arch.h |    2 +
 arch/arm/include/asm/prom.h      |   12 +++++
 arch/arm/include/asm/setup.h     |    2 +
 arch/arm/kernel/devtree.c        |   98 ++++++++++++++++++++++++++++++++++++++
 arch/arm/kernel/setup.c          |   23 +++++++--
 arch/arm/mm/init.c               |    2 +
 6 files changed, 135 insertions(+), 4 deletions(-)

diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index 4764e67..946f4d7 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -18,6 +18,8 @@ struct machine_desc {
 	unsigned int		nr;		/* architecture number	*/
 	const char		*name;		/* architecture name	*/
 	unsigned long		boot_params;	/* tagged list		*/
+	const char		**dt_compat;	/* array of device tree
+						 * 'compatible' strings	*/
 
 	unsigned int		nr_irqs;	/* number of IRQs */
 
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h
index 8f1037f..11b8708 100644
--- a/arch/arm/include/asm/prom.h
+++ b/arch/arm/include/asm/prom.h
@@ -21,5 +21,17 @@ static inline void irq_dispose_mapping(unsigned int virq)
 	return;
 }
 
+extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
+extern void arm_dt_memblock_reserve(void);
+
+#else /* CONFIG_OF */
+
+static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys)
+{
+	return NULL;
+}
+
+static inline void arm_dt_memblock_reserve(void) { }
+
 #endif /* CONFIG_OF */
 #endif /* ASMARM_PROM_H */
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h
index 93b4702..ee2ad8a 100644
--- a/arch/arm/include/asm/setup.h
+++ b/arch/arm/include/asm/setup.h
@@ -218,6 +218,8 @@ extern struct meminfo meminfo;
 #define bank_phys_size(bank)	(bank)->size
 
 extern int arm_add_memory(phys_addr_t start, unsigned long size);
+extern void early_print(const char *str, ...);
+extern void dump_machine_table(void);
 
 #endif  /*  __KERNEL__  */
 
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index 75e3df8..a701e42 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -21,6 +21,8 @@
 
 #include <asm/setup.h>
 #include <asm/page.h>
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
 
 void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 {
@@ -32,6 +34,102 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
 	return alloc_bootmem_align(size, align);
 }
 
+void __init arm_dt_memblock_reserve(void)
+{
+	u64 *reserve_map, base, size;
+
+	if (!initial_boot_params)
+		return;
+
+	/* Reserve the dtb region */
+	memblock_reserve(virt_to_phys(initial_boot_params),
+			 be32_to_cpu(initial_boot_params->totalsize));
+
+	/*
+	 * Process the reserve map.  This will probably overlap the initrd
+	 * and dtb locations which are already reserved, but overlaping
+	 * doesn't hurt anything
+	 */
+	reserve_map = ((void*)initial_boot_params) +
+			be32_to_cpu(initial_boot_params->off_mem_rsvmap);
+	while (1) {
+		base = be64_to_cpup(reserve_map++);
+		size = be64_to_cpup(reserve_map++);
+		if (!size)
+			break;
+		memblock_reserve(base, size);
+	}
+}
+
+/**
+ * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
+ * @dt_phys: physical address of dt blob
+ *
+ * If a dtb was passed to the kernel in r2, then use it to choose the
+ * correct machine_desc and to setup the system.
+ */
+struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
+{
+	struct boot_param_header *devtree;
+	struct machine_desc *mdesc, *mdesc_best = NULL;
+	unsigned int score, mdesc_score = ~1;
+	unsigned long dt_root;
+	const char *model;
+
+	devtree = phys_to_virt(dt_phys);
+
+	/* check device tree validity */
+	if (be32_to_cpu(devtree->magic) != OF_DT_HEADER)
+		return NULL;
+
+	/* Search the mdescs for the 'best' compatible value match */
+	initial_boot_params = devtree;
+	dt_root = of_get_flat_dt_root();
+	for_each_machine_desc(mdesc) {
+		score = of_flat_dt_match(dt_root, mdesc->dt_compat);
+		if (score > 0 && score < mdesc_score) {
+			mdesc_best = mdesc;
+			mdesc_score = score;
+		}
+	}
+	if (!mdesc_best) {
+		const char *prop;
+		long size;
+
+		early_print("\nError: unrecognized/unsupported "
+			    "device tree compatible list:\n[ ");
+
+		prop = of_get_flat_dt_prop(dt_root, "compatible", &size);
+		while (size > 0) {
+			early_print("'%s' ", prop);
+			size -= strlen(prop) + 1;
+			prop += strlen(prop) + 1;
+		}
+		early_print("]\n\n");
+
+		dump_machine_table(); /* does not return */
+	}
+
+	model = of_get_flat_dt_prop(dt_root, "model", NULL);
+	if (!model)
+		model = of_get_flat_dt_prop(dt_root, "compatible", NULL);
+	if (!model)
+		model = "<unknown>";
+	pr_info("Machine: %s, model: %s\n", mdesc_best->name, model);
+
+	/* Retrieve various information from the /chosen node */
+	of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
+	/* Initialize {size,address}-cells info */
+	of_scan_flat_dt(early_init_dt_scan_root, NULL);
+	/* Setup memory, calling early_init_dt_add_memory_arch */
+	of_scan_flat_dt(early_init_dt_scan_memory, NULL);
+
+	/* Change machine number to match the mdesc we're using */
+	__machine_arch_type = mdesc_best->nr;
+
+	return mdesc_best;
+}
+
 /**
  * irq_create_of_mapping - Hook to resolve OF irq specifier into a Linux irq#
  *
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 42c2f0c..05db25e 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -20,6 +20,7 @@
 #include <linux/screen_info.h>
 #include <linux/init.h>
 #include <linux/kexec.h>
+#include <linux/of_fdt.h>
 #include <linux/crash_dump.h>
 #include <linux/root_dev.h>
 #include <linux/cpu.h>
@@ -42,6 +43,7 @@
 #include <asm/cachetype.h>
 #include <asm/tlbflush.h>
 
+#include <asm/prom.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/time.h>
@@ -309,7 +311,7 @@ static void __init cacheid_init(void)
  */
 extern struct proc_info_list *lookup_processor_type(unsigned int);
 
-static void __init early_print(const char *str, ...)
+void __init early_print(const char *str, ...)
 {
 	extern void printascii(const char *);
 	char buf[256];
@@ -439,7 +441,7 @@ void cpu_init(void)
 	    : "r14");
 }
 
-static void __init dump_machine_table(void)
+void __init dump_machine_table(void)
 {
 	struct machine_desc *p;
 
@@ -837,8 +839,17 @@ static struct machine_desc * __init setup_machine_tags(unsigned int nr)
 	if (tags->hdr.tag != ATAG_CORE)
 		convert_to_tag_list(tags);
 #endif
-	if (tags->hdr.tag != ATAG_CORE)
+
+	if (tags->hdr.tag != ATAG_CORE) {
+#if defined(CONFIG_OF)
+		/*
+		 * If CONFIG_OF is set, then assume this is a reasonably
+		 * modern system that should pass boot parameters
+		 */
+		early_print("Warning: Neither atags nor dtb found\n");
+#endif
 		tags = (struct tag *)&init_tags;
+	}
 
 	if (mdesc->fixup)
 		mdesc->fixup(mdesc, tags, &from, &meminfo);
@@ -864,7 +875,9 @@ void __init setup_arch(char **cmdline_p)
 	unwind_init();
 
 	setup_processor();
-	mdesc = setup_machine_tags(machine_arch_type);
+	mdesc = setup_machine_fdt(__atags_pointer);
+	if (!mdesc)
+		mdesc = setup_machine_tags(machine_arch_type);
 	machine_desc = mdesc;
 	machine_name = mdesc->name;
 
@@ -887,6 +900,8 @@ void __init setup_arch(char **cmdline_p)
 	paging_init(mdesc);
 	request_standard_resources(mdesc);
 
+	unflatten_device_tree();
+
 #ifdef CONFIG_SMP
 	if (is_smp())
 		smp_init_cpus();
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 26c4054..b265975 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -22,6 +22,7 @@
 #include <linux/sort.h>
 
 #include <asm/mach-types.h>
+#include <asm/prom.h>
 #include <asm/sections.h>
 #include <asm/setup.h>
 #include <asm/sizes.h>
@@ -322,6 +323,7 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
 #endif
 
 	arm_mm_memblock_reserve();
+	arm_dt_memblock_reserve();
 
 	/* reserve any platform specific memblock areas */
 	if (mdesc->reserve)

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

* [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code.
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
                   ` (3 preceding siblings ...)
  2011-04-29  7:15 ` [PATCH v5 4/8] arm/dt: probe for platforms via the device tree Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-04-30  0:28   ` Nicolas Pitre
  2011-04-29  7:15 ` [PATCH v5 6/8] arm/dt: Basic versatile devicetree support Grant Likely
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

It is now implemented by core code.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/kernel/devtree.c |   14 --------------
 1 files changed, 0 insertions(+), 14 deletions(-)

diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index a701e42..1e0b613 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -129,17 +129,3 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
 
 	return mdesc_best;
 }
-
-/**
- * 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);

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

* [PATCH v5 6/8] arm/dt: Basic versatile devicetree support
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
                   ` (4 preceding siblings ...)
  2011-04-29  7:15 ` [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code Grant Likely
@ 2011-04-29  7:15 ` Grant Likely
  2011-04-29  7:16 ` [PATCH v5 7/8] arm/dt: Basic tegra " Grant Likely
  2011-04-29  7:16 ` [PATCH v5 8/8] dt: add documentation of ARM dt boot interface Grant Likely
  7 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:15 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds adds very basic support for booting versatile with a
device tree.  It simply allows the existing machine_descs to match
against the versatile ab & pb compatible values so that the kernel can
boot.  Kernel parameters and the initrd pointer is read out of the
tree instead of atags.

This is not complete device tree support.  This change will be
reverted when a new machine_desc is added that can populate the
versatile device registrations directly from data in the tree instead
of using hard coded data.  That change will be made in a future patch.

v5: - Add skeleton device tree for versatile AB and PB.  Bare minimum needed
      for booting.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/boot/dts/skeleton.dtsi        |   13 +++++++++++++
 arch/arm/boot/dts/versatile-ab.dts     |    7 +++++++
 arch/arm/boot/dts/versatile-pb.dts     |    7 +++++++
 arch/arm/mach-versatile/versatile_ab.c |    6 ++++++
 arch/arm/mach-versatile/versatile_pb.c |    6 ++++++
 5 files changed, 39 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/boot/dts/skeleton.dtsi
 create mode 100644 arch/arm/boot/dts/versatile-ab.dts
 create mode 100644 arch/arm/boot/dts/versatile-pb.dts

diff --git a/arch/arm/boot/dts/skeleton.dtsi b/arch/arm/boot/dts/skeleton.dtsi
new file mode 100644
index 0000000..b41d241
--- /dev/null
+++ b/arch/arm/boot/dts/skeleton.dtsi
@@ -0,0 +1,13 @@
+/*
+ * Skeleton device tree; the bare minimum needed to boot; just include and
+ * add a compatible value.  The bootloader will typically populate the memory
+ * node.
+ */
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+	chosen { };
+	aliases { };
+	memory { device_type = "memory"; reg = <0 0>; };
+};
diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts
new file mode 100644
index 0000000..705a88f
--- /dev/null
+++ b/arch/arm/boot/dts/versatile-ab.dts
@@ -0,0 +1,7 @@
+/dts-v1/;
+/include/ "skeleton.dtsi"
+
+/ {
+	model = "ARM Versatile AB";
+	compatible = "arm,versatile-ab";
+};
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
new file mode 100644
index 0000000..d8aabef
--- /dev/null
+++ b/arch/arm/boot/dts/versatile-pb.dts
@@ -0,0 +1,7 @@
+/dts-v1/;
+/include/ "skeleton.dtsi"
+
+/ {
+	model = "ARM Versatile PB";
+	compatible = "arm,versatile-pb";
+};
diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c
index f8ae64b..b7b49ad 100644
--- a/arch/arm/mach-versatile/versatile_ab.c
+++ b/arch/arm/mach-versatile/versatile_ab.c
@@ -33,6 +33,11 @@
 
 #include "core.h"
 
+static const char *versatile_ab_match[] __initdata = {
+	"arm,versatile-ab",
+	NULL,
+};
+
 MACHINE_START(VERSATILE_AB, "ARM-Versatile AB")
 	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
 	.boot_params	= 0x00000100,
@@ -41,4 +46,5 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB")
 	.init_irq	= versatile_init_irq,
 	.timer		= &versatile_timer,
 	.init_machine	= versatile_init,
+	.dt_compat	= versatile_ab_match,
 MACHINE_END
diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c
index 37c23df..9d0bc5a 100644
--- a/arch/arm/mach-versatile/versatile_pb.c
+++ b/arch/arm/mach-versatile/versatile_pb.c
@@ -101,6 +101,11 @@ static void __init versatile_pb_init(void)
 	}
 }
 
+static const char *versatile_pb_match[] __initdata = {
+	"arm,versatile-pb",
+	NULL,
+};
+
 MACHINE_START(VERSATILE_PB, "ARM-Versatile PB")
 	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
 	.boot_params	= 0x00000100,
@@ -109,4 +114,5 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB")
 	.init_irq	= versatile_init_irq,
 	.timer		= &versatile_timer,
 	.init_machine	= versatile_pb_init,
+	.dt_compat	= versatile_pb_match,
 MACHINE_END

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

* [PATCH v5 7/8] arm/dt: Basic tegra devicetree support
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
                   ` (5 preceding siblings ...)
  2011-04-29  7:15 ` [PATCH v5 6/8] arm/dt: Basic versatile devicetree support Grant Likely
@ 2011-04-29  7:16 ` Grant Likely
  2011-04-29  7:16 ` [PATCH v5 8/8] dt: add documentation of ARM dt boot interface Grant Likely
  7 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:16 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds adds very basic support for booting tegra with a
device tree.  It simply allows the existing machine_descs to match
against the tegra compatible values so that the kernel can boot.
Kernel parameters and the initrd pointer is read out of the tree
instead of atags.

This is not complete device tree support.  This change will be
reverted when a new machine_desc is added that can populate the
device registrations directly from data in the tree instead of using
hard coded data.  That change will be made in a future patch.

v2: Fixed cut-and-paste error in commit text

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 arch/arm/boot/dts/tegra-harmony.dts |    7 +++++++
 arch/arm/mach-tegra/board-harmony.c |    6 ++++++
 2 files changed, 13 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/boot/dts/tegra-harmony.dts

diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts
new file mode 100644
index 0000000..81032e7
--- /dev/null
+++ b/arch/arm/boot/dts/tegra-harmony.dts
@@ -0,0 +1,7 @@
+/dts-v1/;
+/include/ "skeleton.dtsi"
+
+/ {
+	model = "NVIDIA Tegra2 Harmony evaluation board";
+	compatible = "nvidia,harmony", "nvidia,tegra250";
+};
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c
index 75c918a..adbdb87 100644
--- a/arch/arm/mach-tegra/board-harmony.c
+++ b/arch/arm/mach-tegra/board-harmony.c
@@ -199,6 +199,11 @@ static void __init tegra_harmony_init(void)
 	harmony_regulator_init();
 }
 
+static const char * tegra_harmony_board_compat[] = {
+	"nvidia,harmony",
+	NULL
+};
+
 MACHINE_START(HARMONY, "harmony")
 	.boot_params  = 0x00000100,
 	.fixup		= tegra_harmony_fixup,
@@ -207,4 +212,5 @@ MACHINE_START(HARMONY, "harmony")
 	.init_irq       = tegra_init_irq,
 	.timer          = &tegra_timer,
 	.init_machine   = tegra_harmony_init,
+	.dt_compat      = tegra_harmony_board_compat,
 MACHINE_END

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

* [PATCH v5 8/8] dt: add documentation of ARM dt boot interface
  2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
                   ` (6 preceding siblings ...)
  2011-04-29  7:16 ` [PATCH v5 7/8] arm/dt: Basic tegra " Grant Likely
@ 2011-04-29  7:16 ` Grant Likely
  2011-04-30  0:37   ` Nicolas Pitre
  7 siblings, 1 reply; 19+ messages in thread
From: Grant Likely @ 2011-04-29  7:16 UTC (permalink / raw)
  To: linux-arm-kernel

v5: clarified that dtb should be aligned on a 64 bit boundary in RAM.
v3: added details to Documentation/arm/Booting

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
 Documentation/arm/Booting                       |   33 ++++++++++++++--
 Documentation/devicetree/booting-without-of.txt |   48 +++++++++++++++++++++--
 2 files changed, 73 insertions(+), 8 deletions(-)

diff --git a/Documentation/arm/Booting b/Documentation/arm/Booting
index 7685029..4e686a2 100644
--- a/Documentation/arm/Booting
+++ b/Documentation/arm/Booting
@@ -65,13 +65,19 @@ looks at the connected hardware is beyond the scope of this document.
 The boot loader must ultimately be able to provide a MACH_TYPE_xxx
 value to the kernel. (see linux/arch/arm/tools/mach-types).
 
-
-4. Setup the kernel tagged list
--------------------------------
+4. Setup boot data
+------------------
 
 Existing boot loaders:		OPTIONAL, HIGHLY RECOMMENDED
 New boot loaders:		MANDATORY
 
+The boot loader must provide either a tagged list or a dtb image for
+passing configuration data to the kernel.  The physical address of the
+boot data is passed to the kernel in register r2.
+
+4a. Setup the kernel tagged list
+--------------------------------
+
 The boot loader must create and initialise the kernel tagged list.
 A valid tagged list starts with ATAG_CORE and ends with ATAG_NONE.
 The ATAG_CORE tag may or may not be empty.  An empty ATAG_CORE tag
@@ -101,6 +107,24 @@ The tagged list must be placed in a region of memory where neither
 the kernel decompressor nor initrd 'bootp' program will overwrite
 it.  The recommended placement is in the first 16KiB of RAM.
 
+4b. Setup the device tree
+-------------------------
+
+The boot loader must load a device tree image (dtb) into system ram
+at a 64bit aligned address and initialize it with the boot data.  The
+dtb format is documented in Documentation/devicetree/booting-without-of.txt.
+The kernel will look for the dtb magic value of 0xd00dfeed at the dtb
+physical address to determine if a dtb has been passed instead of a
+tagged list.
+
+The boot loader must pass at a minimum the size and location of the
+system memory, and the root filesystem location.  The dtb must be
+placed in a region of memory where the kernel decompressor will not
+overwrite it.  The recommended placement is in the first 16KiB of RAM
+with the caveat that it may not be located at physical address 0 since
+the kernel interprets a value of 0 in r2 to mean neither a tagged list
+nor a dtb were passed.
+
 5. Calling the kernel image
 ---------------------------
 
@@ -125,7 +149,8 @@ In either case, the following conditions must be met:
 - CPU register settings
   r0 = 0,
   r1 = machine type number discovered in (3) above.
-  r2 = physical address of tagged list in system RAM.
+  r2 = physical address of tagged list in system RAM, or
+       physical address of device tree block (dtb) in system RAM
 
 - CPU mode
   All forms of interrupts must be disabled (IRQs and FIQs)
diff --git a/Documentation/devicetree/booting-without-of.txt b/Documentation/devicetree/booting-without-of.txt
index 50619a0..31d7e8a 100644
--- a/Documentation/devicetree/booting-without-of.txt
+++ b/Documentation/devicetree/booting-without-of.txt
@@ -12,8 +12,9 @@ Table of Contents
 =================
 
   I - Introduction
-    1) Entry point for arch/powerpc
-    2) Entry point for arch/x86
+    1) Entry point for arch/arm
+    2) Entry point for arch/powerpc
+    3) Entry point for arch/x86
 
   II - The DT block format
     1) Header
@@ -148,7 +149,46 @@ upgrades without significantly impacting the kernel code or cluttering
 it with special cases.
 
 
-1) Entry point for arch/powerpc
+1) Entry point for arch/arm
+---------------------------
+
+   There is one single entry point to the kernel, at the start
+   of the kernel image. That entry point supports two calling
+   conventions.  A summary of the interface is described here.  A full
+   description of the boot requirements is documented in
+   Documentation/arm/Booting
+
+        a) ATAGS interface.  Minimal information is passed from firmware
+        to the kernel with a tagged list of predefined parameters.
+
+                r0 : 0
+
+                r1 : Machine type number
+
+                r2 : Physical address of tagged list in system RAM
+
+        b) Entry with a flattened device-tree block.  Firmware loads the
+        physical address of the flattened device tree block (dtb) into r2,
+        r1 is not used, but it is considered good practise to use a valid
+        machine number as described in Documentation/arm/Booting.
+
+                r0 : 0
+
+                r1 : Valid machine type number.  When using a device tree,
+                a single machine type number will often be assigned to
+                represent a class or family of SoCs.
+
+                r2 : physical pointer to the device-tree block
+                (defined in chapter II) in RAM.  Device tree can be located
+                anywhere in system RAM, but it should be aligned on a 64 bit
+                boundary.
+
+   The kernel will differentiate between ATAGS and device tree booting by
+   reading the memory pointed to by r1 and looking for either the flattened
+   device tree block magic value (0xd00dfeed) or the ATAG_CORE value at
+   offset 0x4 from r2 (0x54410001).
+
+2) Entry point for arch/powerpc
 -------------------------------
 
    There is one single entry point to the kernel, at the start
@@ -226,7 +266,7 @@ it with special cases.
   cannot support both configurations with Book E and configurations
   with classic Powerpc architectures.
 
-2) Entry point for arch/x86
+3) Entry point for arch/x86
 -------------------------------
 
   There is one single 32bit entry point to the kernel at code32_start,

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

* [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code.
  2011-04-29  7:15 ` [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code Grant Likely
@ 2011-04-30  0:28   ` Nicolas Pitre
  2011-04-30  6:28     ` Grant Likely
  0 siblings, 1 reply; 19+ messages in thread
From: Nicolas Pitre @ 2011-04-30  0:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 29 Apr 2011, Grant Likely wrote:

> It is now implemented by core code.
> 
> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
> ---
>  arch/arm/kernel/devtree.c |   14 --------------
>  1 files changed, 0 insertions(+), 14 deletions(-)

Maybe this should be folded in the patch that introduced this instead?


Nicolas

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

* [PATCH v5 8/8] dt: add documentation of ARM dt boot interface
  2011-04-29  7:16 ` [PATCH v5 8/8] dt: add documentation of ARM dt boot interface Grant Likely
@ 2011-04-30  0:37   ` Nicolas Pitre
  2011-04-30  6:30     ` Grant Likely
  0 siblings, 1 reply; 19+ messages in thread
From: Nicolas Pitre @ 2011-04-30  0:37 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 29 Apr 2011, Grant Likely wrote:

> diff --git a/Documentation/devicetree/booting-without-of.txt b/Documentation/devicetree/booting-without-of.txt
> index 50619a0..31d7e8a 100644
> --- a/Documentation/devicetree/booting-without-of.txt
> +++ b/Documentation/devicetree/booting-without-of.txt
[...]
> +1) Entry point for arch/arm
> +---------------------------
> +
> +   There is one single entry point to the kernel, at the start
> +   of the kernel image. That entry point supports two calling
> +   conventions.  A summary of the interface is described here.  A full
> +   description of the boot requirements is documented in
> +   Documentation/arm/Booting
> +
> +        a) ATAGS interface.  Minimal information is passed from firmware
> +        to the kernel with a tagged list of predefined parameters.
> +
> +                r0 : 0
> +
> +                r1 : Machine type number
> +
> +                r2 : Physical address of tagged list in system RAM
> +
> +        b) Entry with a flattened device-tree block.  Firmware loads the
> +        physical address of the flattened device tree block (dtb) into r2,
> +        r1 is not used, but it is considered good practise to use a valid
> +        machine number as described in Documentation/arm/Booting.
> +
> +                r0 : 0
> +
> +                r1 : Valid machine type number.  When using a device tree,
> +                a single machine type number will often be assigned to
> +                represent a class or family of SoCs.
> +
> +                r2 : physical pointer to the device-tree block
> +                (defined in chapter II) in RAM.  Device tree can be located
> +                anywhere in system RAM, but it should be aligned on a 64 bit
> +                boundary.
> +
> +   The kernel will differentiate between ATAGS and device tree booting by
> +   reading the memory pointed to by r1 and looking for either the flattened

s/r1/r2/


Nicolas

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

* [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code.
  2011-04-30  0:28   ` Nicolas Pitre
@ 2011-04-30  6:28     ` Grant Likely
  0 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-30  6:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Apr 29, 2011 at 08:28:47PM -0400, Nicolas Pitre wrote:
> On Fri, 29 Apr 2011, Grant Likely wrote:
> 
> > It is now implemented by core code.
> > 
> > Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
> > ---
> >  arch/arm/kernel/devtree.c |   14 --------------
> >  1 files changed, 0 insertions(+), 14 deletions(-)
> 
> Maybe this should be folded in the patch that introduced this instead?

Yes, it should; but I've kept it separate for now because I don't have
an ack from benh to merge the core changes that do this yet.  When
that happens I'll squish the two patches together.

g.

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

* [PATCH v5 8/8] dt: add documentation of ARM dt boot interface
  2011-04-30  0:37   ` Nicolas Pitre
@ 2011-04-30  6:30     ` Grant Likely
  0 siblings, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-04-30  6:30 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Apr 29, 2011 at 08:37:24PM -0400, Nicolas Pitre wrote:
> On Fri, 29 Apr 2011, Grant Likely wrote:
> 
> > diff --git a/Documentation/devicetree/booting-without-of.txt b/Documentation/devicetree/booting-without-of.txt
> > index 50619a0..31d7e8a 100644
> > --- a/Documentation/devicetree/booting-without-of.txt
> > +++ b/Documentation/devicetree/booting-without-of.txt
> [...]
> > +1) Entry point for arch/arm
> > +---------------------------
> > +
> > +   There is one single entry point to the kernel, at the start
> > +   of the kernel image. That entry point supports two calling
> > +   conventions.  A summary of the interface is described here.  A full
> > +   description of the boot requirements is documented in
> > +   Documentation/arm/Booting
> > +
> > +        a) ATAGS interface.  Minimal information is passed from firmware
> > +        to the kernel with a tagged list of predefined parameters.
> > +
> > +                r0 : 0
> > +
> > +                r1 : Machine type number
> > +
> > +                r2 : Physical address of tagged list in system RAM
> > +
> > +        b) Entry with a flattened device-tree block.  Firmware loads the
> > +        physical address of the flattened device tree block (dtb) into r2,
> > +        r1 is not used, but it is considered good practise to use a valid
> > +        machine number as described in Documentation/arm/Booting.
> > +
> > +                r0 : 0
> > +
> > +                r1 : Valid machine type number.  When using a device tree,
> > +                a single machine type number will often be assigned to
> > +                represent a class or family of SoCs.
> > +
> > +                r2 : physical pointer to the device-tree block
> > +                (defined in chapter II) in RAM.  Device tree can be located
> > +                anywhere in system RAM, but it should be aligned on a 64 bit
> > +                boundary.
> > +
> > +   The kernel will differentiate between ATAGS and device tree booting by
> > +   reading the memory pointed to by r1 and looking for either the flattened
> 
> s/r1/r2/

Good catch. Thanks.

g.

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-04-29  7:15 ` [PATCH v5 4/8] arm/dt: probe for platforms via the device tree Grant Likely
@ 2011-05-02 15:15   ` Tony Lindgren
  2011-05-02 15:34     ` Grant Likely
  2011-05-02 21:51     ` Grant Likely
  0 siblings, 2 replies; 19+ messages in thread
From: Tony Lindgren @ 2011-05-02 15:15 UTC (permalink / raw)
  To: linux-arm-kernel

* Grant Likely <grant.likely@secretlab.ca> [110429 00:13]:
> +
> +/**
> + * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
> + * @dt_phys: physical address of dt blob
> + *
> + * If a dtb was passed to the kernel in r2, then use it to choose the
> + * correct machine_desc and to setup the system.
> + */
> +struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
> +{
...

> +
> +	/* Retrieve various information from the /chosen node */
> +	of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

Just to make sure we're considering properly what this change means..

Does this patch require using CONFIG_CMDLINE_FORCE for older bootloaders
with the device tree append patch?

Or should we still somehow get ATAG_CMDLINE let's say in the uncompress
code and use that if nothing else is found?

Otherwise booting old boards with the same kernel will be painful as
it requires a kernel recompile to set the cmdline..

Also, not counting the separate DT append issues, I got things booting
with these patches (and the dts files) on omaps. So for patches 1 - 5,
and patch 8:

Tested-by: Tony Lindgren <tony@atomide.com>

I don't have versatile or tegra, so can't test those :)

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-05-02 15:15   ` Tony Lindgren
@ 2011-05-02 15:34     ` Grant Likely
  2011-05-02 16:39       ` Tony Lindgren
  2011-05-02 21:51     ` Grant Likely
  1 sibling, 1 reply; 19+ messages in thread
From: Grant Likely @ 2011-05-02 15:34 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, May 2, 2011 at 9:15 AM, Tony Lindgren <tony@atomide.com> wrote:
> * Grant Likely <grant.likely@secretlab.ca> [110429 00:13]:
>> +
>> +/**
>> + * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
>> + * @dt_phys: physical address of dt blob
>> + *
>> + * If a dtb was passed to the kernel in r2, then use it to choose the
>> + * correct machine_desc and to setup the system.
>> + */
>> +struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
>> +{
> ...
>
>> +
>> + ? ? /* Retrieve various information from the /chosen node */
>> + ? ? of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
>
> Just to make sure we're considering properly what this change means..
>
> Does this patch require using CONFIG_CMDLINE_FORCE for older bootloaders
> with the device tree append patch?

With the current patch?  Yes, but there is a follow-on patch that was
posted a while ago[1] that will copy ATAG data into the device tree in
the bootloader.  I've not been pushing to include that change since it
adds a lot of code to the wrapper and I'm not sure how deeply we want
to support that use case.  Basically I want to have a better idea what
the supported use cases are before pushing something like that.

Adding a default command line to the .dts file instead of using
CONFIG_CMDLINE_FORCE also works.

[1] http://lists.ozlabs.org/pipermail/devicetree-discuss/2011-March/004652.html

> Or should we still somehow get ATAG_CMDLINE let's say in the uncompress
> code and use that if nothing else is found?
>
> Otherwise booting old boards with the same kernel will be painful as
> it requires a kernel recompile to set the cmdline..
>
> Also, not counting the separate DT append issues, I got things booting
> with these patches (and the dts files) on omaps. So for patches 1 - 5,
> and patch 8:
>
> Tested-by: Tony Lindgren <tony@atomide.com>
>
> I don't have versatile or tegra, so can't test those :)

Awesome, thanks.

g.

>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-05-02 15:34     ` Grant Likely
@ 2011-05-02 16:39       ` Tony Lindgren
  2011-05-02 21:55         ` Grant Likely
  0 siblings, 1 reply; 19+ messages in thread
From: Tony Lindgren @ 2011-05-02 16:39 UTC (permalink / raw)
  To: linux-arm-kernel

* Grant Likely <grant.likely@secretlab.ca> [110502 18:31]:
> On Mon, May 2, 2011 at 9:15 AM, Tony Lindgren <tony@atomide.com> wrote:
> > * Grant Likely <grant.likely@secretlab.ca> [110429 00:13]:
> >> +
> >> +/**
> >> + * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
> >> + * @dt_phys: physical address of dt blob
> >> + *
> >> + * If a dtb was passed to the kernel in r2, then use it to choose the
> >> + * correct machine_desc and to setup the system.
> >> + */
> >> +struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
> >> +{
> > ...
> >
> >> +
> >> + ? ? /* Retrieve various information from the /chosen node */
> >> + ? ? of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
> >
> > Just to make sure we're considering properly what this change means..
> >
> > Does this patch require using CONFIG_CMDLINE_FORCE for older bootloaders
> > with the device tree append patch?
> 
> With the current patch?  Yes, but there is a follow-on patch that was
> posted a while ago[1] that will copy ATAG data into the device tree in
> the bootloader.  I've not been pushing to include that change since it
> adds a lot of code to the wrapper and I'm not sure how deeply we want
> to support that use case.  Basically I want to have a better idea what
> the supported use cases are before pushing something like that.

OK. Maybe that could be made simpler if we only copy the cmdline?

The cmdline is something that bootloaders typically allow to configure,
while the other ATAGs are static and should be in the .dts file.
 
> Adding a default command line to the .dts file instead of using
> CONFIG_CMDLINE_FORCE also works.

But that requires carrying extra patches for something that should
be user configured.. So not so nice for distros.

Tony
 
> [1] http://lists.ozlabs.org/pipermail/devicetree-discuss/2011-March/004652.html

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-05-02 15:15   ` Tony Lindgren
  2011-05-02 15:34     ` Grant Likely
@ 2011-05-02 21:51     ` Grant Likely
  1 sibling, 0 replies; 19+ messages in thread
From: Grant Likely @ 2011-05-02 21:51 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, May 02, 2011 at 08:15:42AM -0700, Tony Lindgren wrote:
> Also, not counting the separate DT append issues, I got things booting
> with these patches (and the dts files) on omaps. So for patches 1 - 5,
> and patch 8:
> 
> Tested-by: Tony Lindgren <tony@atomide.com>

Seeing as Documentation isn't actually executable, I'll interpret that
as an "Acked-by" for the 8th patch.  :-)

g.

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-05-02 16:39       ` Tony Lindgren
@ 2011-05-02 21:55         ` Grant Likely
  2011-05-03 10:44           ` Tony Lindgren
  0 siblings, 1 reply; 19+ messages in thread
From: Grant Likely @ 2011-05-02 21:55 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, May 02, 2011 at 07:39:54PM +0300, Tony Lindgren wrote:
> * Grant Likely <grant.likely@secretlab.ca> [110502 18:31]:
> > On Mon, May 2, 2011 at 9:15 AM, Tony Lindgren <tony@atomide.com> wrote:
> > > * Grant Likely <grant.likely@secretlab.ca> [110429 00:13]:
> > >> +
> > >> +/**
> > >> + * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
> > >> + * @dt_phys: physical address of dt blob
> > >> + *
> > >> + * If a dtb was passed to the kernel in r2, then use it to choose the
> > >> + * correct machine_desc and to setup the system.
> > >> + */
> > >> +struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
> > >> +{
> > > ...
> > >
> > >> +
> > >> + ? ? /* Retrieve various information from the /chosen node */
> > >> + ? ? of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
> > >
> > > Just to make sure we're considering properly what this change means..
> > >
> > > Does this patch require using CONFIG_CMDLINE_FORCE for older bootloaders
> > > with the device tree append patch?
> > 
> > With the current patch?  Yes, but there is a follow-on patch that was
> > posted a while ago[1] that will copy ATAG data into the device tree in
> > the bootloader.  I've not been pushing to include that change since it
> > adds a lot of code to the wrapper and I'm not sure how deeply we want
> > to support that use case.  Basically I want to have a better idea what
> > the supported use cases are before pushing something like that.
> 
> OK. Maybe that could be made simpler if we only copy the cmdline?
> 
> The cmdline is something that bootloaders typically allow to configure,
> while the other ATAGs are static and should be in the .dts file.

Once the libfdt code is pulled into to manipulate the command line,
it becomes trivial to parse the rest of the atags too, so this
probably won't make much difference (unless work is done to preparse
the devicetree and provide to the zimage wrapper a direct offset to
the cmdline buffer in the dtb, but that gets hairy and I really don't
want to go down that path).

>  
> > Adding a default command line to the .dts file instead of using
> > CONFIG_CMDLINE_FORCE also works.
> 
> But that requires carrying extra patches for something that should
> be user configured.. So not so nice for distros.

Right, so this is only a stop-gap solution.  I'll add this to the list
of topics to discuss in the device tree session at Linaro at UDS next
week.

g.

> 
> Tony
>  
> > [1] http://lists.ozlabs.org/pipermail/devicetree-discuss/2011-March/004652.html

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

* [PATCH v5 4/8] arm/dt: probe for platforms via the device tree
  2011-05-02 21:55         ` Grant Likely
@ 2011-05-03 10:44           ` Tony Lindgren
  0 siblings, 0 replies; 19+ messages in thread
From: Tony Lindgren @ 2011-05-03 10:44 UTC (permalink / raw)
  To: linux-arm-kernel

* Grant Likely <grant.likely@secretlab.ca> [110502 14:52]:
> On Mon, May 02, 2011 at 07:39:54PM +0300, Tony Lindgren wrote:
> > 
> > The cmdline is something that bootloaders typically allow to configure,
> > while the other ATAGs are static and should be in the .dts file.
> 
> Once the libfdt code is pulled into to manipulate the command line,
> it becomes trivial to parse the rest of the atags too, so this
> probably won't make much difference (unless work is done to preparse
> the devicetree and provide to the zimage wrapper a direct offset to
> the cmdline buffer in the dtb, but that gets hairy and I really don't
> want to go down that path).
 
OK, makes sense.
  
> > > Adding a default command line to the .dts file instead of using
> > > CONFIG_CMDLINE_FORCE also works.
> > 
> > But that requires carrying extra patches for something that should
> > be user configured.. So not so nice for distros.
> 
> Right, so this is only a stop-gap solution.  I'll add this to the list
> of topics to discuss in the device tree session at Linaro at UDS next
> week.

Thanks

Tony

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

end of thread, other threads:[~2011-05-03 10:44 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-29  7:15 [PATCH v5 0/8] Basic ARM devicetree support Grant Likely
2011-04-29  7:15 ` [PATCH v5 1/8] arm/dt: Make __vet_atags also accept a dtb image Grant Likely
2011-04-29  7:15 ` [PATCH v5 2/8] arm/dt: Allow CONFIG_OF on ARM Grant Likely
2011-04-29  7:15 ` [PATCH v5 3/8] arm/dt: consolidate atags setup into setup_machine_atags Grant Likely
2011-04-29  7:15 ` [PATCH v5 4/8] arm/dt: probe for platforms via the device tree Grant Likely
2011-05-02 15:15   ` Tony Lindgren
2011-05-02 15:34     ` Grant Likely
2011-05-02 16:39       ` Tony Lindgren
2011-05-02 21:55         ` Grant Likely
2011-05-03 10:44           ` Tony Lindgren
2011-05-02 21:51     ` Grant Likely
2011-04-29  7:15 ` [PATCH v5 5/8] arm/dt: Drop irq_create_of_mapping() from arm code Grant Likely
2011-04-30  0:28   ` Nicolas Pitre
2011-04-30  6:28     ` Grant Likely
2011-04-29  7:15 ` [PATCH v5 6/8] arm/dt: Basic versatile devicetree support Grant Likely
2011-04-29  7:16 ` [PATCH v5 7/8] arm/dt: Basic tegra " Grant Likely
2011-04-29  7:16 ` [PATCH v5 8/8] dt: add documentation of ARM dt boot interface Grant Likely
2011-04-30  0:37   ` Nicolas Pitre
2011-04-30  6:30     ` Grant Likely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).