All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c
@ 2013-03-11 16:49 ` Simon Glass
  2013-03-11 16:49   ` [U-Boot] [PATCH v9 13/31] arm: Enable generic board support Simon Glass
                     ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Simon Glass @ 2013-03-11 16:49 UTC (permalink / raw)
  To: u-boot

This file handles common pre-relocation init for boards which use
the generic framework.

It starts up the console, DRAM, performs relocation and then jumps
to post-relocation init.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v9:
- Rebase x86 global_data patch on top of mainline

Changes in v8: None
Changes in v7: None
Changes in v6:
- Tidy up stack reservation code to separate out ARM
- Fix up ordering of dram init (specifically to get ARM SPL boards to boot)
- Add debug() to show RAM top
- Adjust the way the top of memory is calculated

Changes in v5:
- Add fdtdec header file to board_f.c
- Remove setup_global_data_ptr()
- Tidy up stack init
- Put global data on stack in board_init_f()
- Add fdt relocation
- Remove fdt relocation field from x86 arch_global_data
- Deal with change of board_init_f() semantics on ARM
- Save boot_flags in global_data in board_init_f()
- Add print_cpuinfo() prototype to include/common.h

Changes in v4:
- Use asm/sections.h instead of asm-generic/sections.h

Changes in v3:
- Cast away the volatile on gd for memcpy()

Changes in v2: None

 arch/x86/lib/board.c              |   2 +-
 arch/x86/lib/init_helpers.c       |   2 +-
 arch/x86/lib/relocate.c           |   8 +-
 common/Makefile                   |   3 +
 common/board_f.c                  | 579 ++++++++++++++++++++++++++++++++++++++
 include/asm-generic/global_data.h |   2 +
 include/common.h                  |   1 +
 7 files changed, 591 insertions(+), 6 deletions(-)
 create mode 100644 common/board_f.c

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 2441a66..555301a 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -219,7 +219,7 @@ static void do_init_loop(init_fnc_t **init_fnc_ptr)
 
 void board_init_f(ulong boot_flags)
 {
-	gd->fdt_blob = gd->arch.new_fdt = NULL;
+	gd->fdt_blob = gd->new_fdt = NULL;
 	gd->flags = boot_flags;
 
 	do_init_loop(init_sequence_f);
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
index 414fdcc..7df9536 100644
--- a/arch/x86/lib/init_helpers.c
+++ b/arch/x86/lib/init_helpers.c
@@ -111,7 +111,7 @@ int calculate_relocation_address(void)
 	 */
 	if (gd->fdt_blob) {
 		dest_addr -= fdt_size;
-		gd->arch.new_fdt = (void *)dest_addr;
+		gd->new_fdt = (void *)dest_addr;
 		dest_addr &= ~15;
 	}
 #endif
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
index 3e370f2..e893c2b 100644
--- a/arch/x86/lib/relocate.c
+++ b/arch/x86/lib/relocate.c
@@ -49,15 +49,15 @@ int copy_uboot_to_ram(void)
 
 int copy_fdt_to_ram(void)
 {
-	if (gd->arch.new_fdt) {
+	if (gd->new_fdt) {
 		ulong fdt_size;
 
 		fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
 
-		memcpy(gd->arch.new_fdt, gd->fdt_blob, fdt_size);
+		memcpy(gd->new_fdt, gd->fdt_blob, fdt_size);
 		debug("Relocated fdt from %p to %p, size %lx\n",
-		       gd->fdt_blob, gd->arch.new_fdt, fdt_size);
-		gd->fdt_blob = gd->arch.new_fdt;
+		       gd->fdt_blob, gd->new_fdt, fdt_size);
+		gd->fdt_blob = gd->new_fdt;
 	}
 
 	return 0;
diff --git a/common/Makefile b/common/Makefile
index 719fc23..a5f5b1a 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -36,6 +36,9 @@ COBJS-y += s_record.o
 COBJS-y += xyzModem.o
 COBJS-y += cmd_disk.o
 
+# boards
+COBJS-$(CONFIG_SYS_GENERIC_BOARD) += board_f.o
+
 # core command
 COBJS-y += cmd_boot.o
 COBJS-$(CONFIG_CMD_BOOTM) += cmd_bootm.o
diff --git a/common/board_f.c b/common/board_f.c
new file mode 100644
index 0000000..d674f9d
--- /dev/null
+++ b/common/board_f.c
@@ -0,0 +1,579 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2002-2006
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <linux/compiler.h>
+#include <version.h>
+#include <environment.h>
+#include <fdtdec.h>
+#include <initcall.h>
+#include <logbuff.h>
+#include <post.h>
+#include <asm/io.h>
+#include <asm/sections.h>
+#include <linux/compiler.h>
+
+/*
+ * Pointer to initial global data area
+ *
+ * Here we initialize it if needed.
+ */
+#ifdef XTRN_DECLARE_GLOBAL_DATA_PTR
+#undef	XTRN_DECLARE_GLOBAL_DATA_PTR
+#define XTRN_DECLARE_GLOBAL_DATA_PTR	/* empty = allocate here */
+DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_GD_ADDR);
+#else
+DECLARE_GLOBAL_DATA_PTR;
+#endif
+
+/*
+ * sjg: IMO this code should be
+ * refactored to a single function, something like:
+ *
+ * void led_set_state(enum led_colour_t colour, int on);
+ */
+/************************************************************************
+ * Coloured LED functionality
+ ************************************************************************
+ * May be supplied by boards if desired
+ */
+inline void __coloured_LED_init(void) {}
+void coloured_LED_init(void)
+	__attribute__((weak, alias("__coloured_LED_init")));
+inline void __red_led_on(void) {}
+void red_led_on(void) __attribute__((weak, alias("__red_led_on")));
+inline void __red_led_off(void) {}
+void red_led_off(void) __attribute__((weak, alias("__red_led_off")));
+inline void __green_led_on(void) {}
+void green_led_on(void) __attribute__((weak, alias("__green_led_on")));
+inline void __green_led_off(void) {}
+void green_led_off(void) __attribute__((weak, alias("__green_led_off")));
+inline void __yellow_led_on(void) {}
+void yellow_led_on(void) __attribute__((weak, alias("__yellow_led_on")));
+inline void __yellow_led_off(void) {}
+void yellow_led_off(void) __attribute__((weak, alias("__yellow_led_off")));
+inline void __blue_led_on(void) {}
+void blue_led_on(void) __attribute__((weak, alias("__blue_led_on")));
+inline void __blue_led_off(void) {}
+void blue_led_off(void) __attribute__((weak, alias("__blue_led_off")));
+
+/*
+ * Why is gd allocated a register? Prior to reloc it might be better to
+ * just pass it around to each function in this file?
+ *
+ * After reloc one could argue that it is hardly used and doesn't need
+ * to be in a register. Or if it is it should perhaps hold pointers to all
+ * global data for all modules, so that post-reloc we can avoid the massive
+ * literal pool we get on ARM. Or perhaps just encourage each module to use
+ * a structure...
+ */
+
+/*
+ * Could the CONFIG_SPL_BUILD infection become a flag in gd?
+ */
+
+static int init_baud_rate(void)
+{
+	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
+	return 0;
+}
+
+static int display_text_info(void)
+{
+	ulong bss_start, bss_end;
+
+	bss_start = _bss_start_ofs + _TEXT_BASE;
+	bss_end = _bss_end_ofs + _TEXT_BASE;
+	debug("U-Boot code: %08X -> %08lX  BSS: -> %08lX\n",
+	      CONFIG_SYS_TEXT_BASE, bss_start, bss_end);
+
+#ifdef CONFIG_MODEM_SUPPORT
+	debug("Modem Support enabled\n");
+#endif
+#ifdef CONFIG_USE_IRQ
+	debug("IRQ Stack: %08lx\n", IRQ_STACK_START);
+	debug("FIQ Stack: %08lx\n", FIQ_STACK_START);
+#endif
+
+	return 0;
+}
+
+static int announce_dram_init(void)
+{
+	puts("DRAM:  ");
+	return 0;
+}
+
+static int show_dram_config(void)
+{
+	ulong size;
+
+#ifdef CONFIG_NR_DRAM_BANKS
+	int i;
+
+	debug("\nRAM Configuration:\n");
+	for (i = size = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+		size += gd->bd->bi_dram[i].size;
+		debug("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
+#ifdef DEBUG
+		print_size(gd->bd->bi_dram[i].size, "\n");
+#endif
+	}
+	debug("\nDRAM:  ");
+#else
+	size = gd->ram_size;
+#endif
+
+	print_size(size, "\n");
+
+	return 0;
+}
+
+void __dram_init_banksize(void)
+{
+#if defined(CONFIG_NR_DRAM_BANKS) && defined(CONFIG_SYS_SDRAM_BASE)
+	gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
+	gd->bd->bi_dram[0].size = get_effective_memsize();
+#endif
+}
+
+void dram_init_banksize(void)
+	__attribute__((weak, alias("__dram_init_banksize")));
+
+static int zero_global_data(void)
+{
+	memset((void *)gd, '\0', sizeof(gd_t));
+
+	return 0;
+}
+
+static int setup_mon_len(void)
+{
+	gd->mon_len = _bss_end_ofs;
+	return 0;
+}
+
+__weak int arch_cpu_init(void)
+{
+	return 0;
+}
+
+static int setup_fdt(void)
+{
+#ifdef CONFIG_OF_EMBED
+	/* Get a pointer to the FDT */
+	gd->fdt_blob = _binary_dt_dtb_start;
+#elif defined CONFIG_OF_SEPARATE
+	/* FDT is at end of image */
+	gd->fdt_blob = (void *)(_end_ofs + CONFIG_SYS_TEXT_BASE);
+#endif
+	/* Allow the early environment to override the fdt address */
+	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
+						(uintptr_t)gd->fdt_blob);
+	return 0;
+}
+
+/* Get the top of usable RAM */
+__weak ulong board_get_usable_ram_top(ulong total_size)
+{
+	return gd->ram_top;
+}
+
+static int setup_dest_addr(void)
+{
+	debug("Monitor len: %08lX\n", gd->mon_len);
+	/*
+	 * Ram is setup, size stored in gd !!
+	 */
+	debug("Ram size: %08lX\n", (ulong)gd->ram_size);
+#if defined(CONFIG_SYS_MEM_TOP_HIDE)
+	/*
+	 * Subtract specified amount of memory to hide so that it won't
+	 * get "touched" at all by U-Boot. By fixing up gd->ram_size
+	 * the Linux kernel should now get passed the now "corrected"
+	 * memory size and won't touch it either. This should work
+	 * for arch/ppc and arch/powerpc. Only Linux board ports in
+	 * arch/powerpc with bootwrapper support, that recalculate the
+	 * memory size from the SDRAM controller setup will have to
+	 * get fixed.
+	 */
+	gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
+#endif
+#ifdef CONFIG_SYS_SDRAM_BASE
+	gd->ram_top = CONFIG_SYS_SDRAM_BASE;
+#endif
+	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
+	gd->dest_addr = gd->ram_top;
+	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
+	gd->dest_addr_sp = gd->dest_addr;
+	return 0;
+}
+
+#if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
+static int reserve_logbuffer(void)
+{
+	/* reserve kernel log buffer */
+	gd->dest_addr -= LOGBUFF_RESERVE;
+	debug("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN,
+		gd->dest_addr);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_PRAM
+/* reserve protected RAM */
+static int reserve_pram(void)
+{
+	ulong reg;
+
+	reg = getenv_ulong("pram", 10, CONFIG_PRAM);
+	gd->dest_addr -= (reg << 10);		/* size is in kB */
+	debug("Reserving %ldk for protected RAM@%08lx\n", reg,
+	      gd->dest_addr);
+	return 0;
+}
+#endif /* CONFIG_PRAM */
+
+/* Round memory pointer down to next 4 kB limit */
+static int reserve_round_4k(void)
+{
+	gd->dest_addr &= ~(4096 - 1);
+	return 0;
+}
+
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
+		defined(CONFIG_ARM)
+static int reserve_mmu(void)
+{
+	/* reserve TLB table */
+	gd->arch.tlb_size = 4096 * 4;
+	gd->dest_addr -= gd->arch.tlb_size;
+
+	/* round down to next 64 kB limit */
+	gd->dest_addr &= ~(0x10000 - 1);
+
+	gd->arch.tlb_addr = gd->dest_addr;
+	debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
+	      gd->arch.tlb_addr + gd->arch.tlb_size);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_LCD
+static int reserve_lcd(void)
+{
+#ifdef CONFIG_FB_ADDR
+	gd->fb_base = CONFIG_FB_ADDR;
+#else
+	/* reserve memory for LCD display (always full pages) */
+	gd->dest_addr = lcd_setmem(gd->dest_addr);
+	gd->fb_base = gd->dest_addr;
+#endif /* CONFIG_FB_ADDR */
+	return 0;
+}
+#endif /* CONFIG_LCD */
+
+static int reserve_uboot(void)
+{
+	/*
+	 * reserve memory for U-Boot code, data & bss
+	 * round down to next 4 kB limit
+	 */
+	gd->dest_addr -= gd->mon_len;
+	gd->dest_addr &= ~(4096 - 1);
+
+	debug("Reserving %ldk for U-Boot at: %08lx\n", gd->mon_len >> 10,
+	      gd->dest_addr);
+	return 0;
+}
+
+/* reserve memory for malloc() area */
+static int reserve_malloc(void)
+{
+	gd->dest_addr_sp = gd->dest_addr - TOTAL_MALLOC_LEN;
+	debug("Reserving %dk for malloc() at: %08lx\n",
+			TOTAL_MALLOC_LEN >> 10, gd->dest_addr_sp);
+	return 0;
+}
+
+/* (permanently) allocate a Board Info struct */
+static int reserve_board(void)
+{
+	gd->dest_addr_sp -= sizeof(bd_t);
+	gd->bd = (bd_t *)gd->dest_addr_sp;
+	memset(gd->bd, '\0', sizeof(bd_t));
+	debug("Reserving %zu Bytes for Board Info at: %08lx\n",
+			sizeof(bd_t), gd->dest_addr_sp);
+	return 0;
+}
+
+static int setup_machine(void)
+{
+#ifdef CONFIG_MACH_TYPE
+	gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* board id for Linux */
+#endif
+	return 0;
+}
+
+static int reserve_global_data(void)
+{
+	gd->dest_addr_sp -= sizeof(gd_t);
+	gd->new_gd = (gd_t *)gd->dest_addr_sp;
+	debug("Reserving %zu Bytes for Global Data at: %08lx\n",
+			sizeof(gd_t), gd->dest_addr_sp);
+	return 0;
+}
+
+static int reserve_fdt(void)
+{
+	/*
+	 * If the device tree is sitting immediate above our image then we
+	 * must relocate it. If it is embedded in the data section, then it
+	 * will be relocated with other data.
+	 */
+	if (gd->fdt_blob) {
+		gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
+
+		gd->dest_addr_sp -= gd->fdt_size;
+		gd->new_fdt = (void *)gd->dest_addr_sp;
+		debug("Reserving %lu Bytes for FDT at: %p\n",
+		      gd->fdt_size, gd->new_fdt);
+	}
+
+	return 0;
+}
+
+static int reserve_stacks(void)
+{
+	/* setup stack pointer for exceptions */
+	gd->dest_addr_sp -= 16;
+	gd->dest_addr_sp &= ~0xf;
+	gd->irq_sp = gd->dest_addr_sp;
+
+	/*
+	 * Handle architecture-specific things here
+	 * TODO(sjg at chromium.org): Perhaps create arch_reserve_stack()
+	 * to handle this and put in arch/xxx/lib/stack.c
+	 */
+# ifdef CONFIG_ARM
+#  ifdef CONFIG_USE_IRQ
+	gd->dest_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
+	debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
+		CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->dest_addr_sp);
+
+	/* 8-byte alignment for ARM ABI compliance */
+	gd->dest_addr_sp &= ~0x07;
+#  endif
+	/* leave 3 words for abort-stack, plus 1 for alignment */
+	gd->dest_addr_sp -= 16;
+
+	return 0;
+}
+
+static int display_new_sp(void)
+{
+	debug("New Stack Pointer is: %08lx\n", gd->dest_addr_sp);
+
+	return 0;
+}
+
+#ifdef CONFIG_POST
+static int init_post(void)
+{
+	post_bootmode_init();
+	post_run(NULL, POST_ROM | post_bootmode_get(0));
+
+	return 0;
+}
+#endif
+
+static int setup_baud_rate(void)
+{
+	/* Ick, can we get rid of this line? */
+	gd->bd->bi_baudrate = gd->baudrate;
+
+	return 0;
+}
+
+static int setup_dram_config(void)
+{
+	/* Ram is board specific, so move it to board code ... */
+	dram_init_banksize();
+
+	return 0;
+}
+
+static int reloc_fdt(void)
+{
+	if (gd->new_fdt) {
+		memcpy(gd->new_fdt, gd->fdt_blob, gd->fdt_size);
+		gd->fdt_blob = gd->new_fdt;
+	}
+
+	return 0;
+}
+
+static int setup_reloc(void)
+{
+	gd->relocaddr = gd->dest_addr;
+	gd->start_addr_sp = gd->dest_addr_sp;
+	gd->reloc_off = gd->dest_addr - CONFIG_SYS_TEXT_BASE;
+	memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
+
+	debug("Relocation Offset is: %08lx\n", gd->reloc_off);
+	debug("Relocating to %08lx, new gd at %p, sp at %08lx\n",
+	      gd->dest_addr, gd->new_gd, gd->dest_addr_sp);
+
+	return 0;
+}
+
+/* ARM calls relocate_code from its crt0.S */
+#if !defined(CONFIG_ARM)
+
+static int jump_to_copy(void)
+{
+	relocate_code(gd->dest_addr_sp, gd->new_gd, gd->dest_addr);
+
+	return 0;
+}
+#endif
+
+/* Record the board_init_f() bootstage (after arch_cpu_init()) */
+static int mark_bootstage(void)
+{
+	bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f");
+
+	return 0;
+}
+
+static init_fnc_t init_sequence_f[] = {
+	setup_fdt,
+	setup_mon_len,
+	arch_cpu_init,		/* basic arch cpu dependent setup */
+	mark_bootstage,
+#ifdef CONFIG_OF_CONTROL
+	fdtdec_check_fdt,
+#endif
+#if defined(CONFIG_BOARD_EARLY_INIT_F)
+	board_early_init_f,
+#endif
+	timer_init,		/* initialize timer */
+#ifdef CONFIG_BOARD_POSTCLK_INIT
+	board_postclk_init,
+#endif
+#ifdef CONFIG_FSL_ESDHC
+	get_clocks,
+#endif
+	env_init,		/* initialize environment */
+	init_baud_rate,		/* initialze baudrate settings */
+	serial_init,		/* serial communications setup */
+	console_init_f,		/* stage 1 init of console */
+	display_options,	/* say that we are here */
+	display_text_info,	/* show debugging info if required */
+#if defined(CONFIG_DISPLAY_CPUINFO)
+	print_cpuinfo,		/* display cpu info (and speed) */
+#endif
+#if defined(CONFIG_DISPLAY_BOARDINFO)
+	checkboard,		/* display board info */
+#endif
+	announce_dram_init,
+	/* TODO: unify all these dram functions? */
+#ifdef CONFIG_ARM
+	dram_init,		/* configure available RAM banks */
+#endif
+#ifdef CONFIG_POST
+	init_post,
+#endif
+	/*
+	 * Now that we have DRAM mapped and working, we can
+	 * relocate the code and continue running from DRAM.
+	 *
+	 * Reserve memory at end of RAM for (top down in that order):
+	 *  - area that won't get touched by U-Boot and Linux (optional)
+	 *  - kernel log buffer
+	 *  - protected RAM
+	 *  - LCD framebuffer
+	 *  - monitor code
+	 *  - board info struct
+	 */
+	setup_dest_addr,
+#if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
+	reserve_logbuffer,
+#endif
+#ifdef CONFIG_PRAM
+	reserve_pram,
+#endif
+	reserve_round_4k,
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
+		defined(CONFIG_ARM)
+	reserve_mmu,
+#endif
+#ifdef CONFIG_LCD
+	reserve_lcd,
+#endif
+	reserve_uboot,
+	reserve_malloc,
+	reserve_board,
+	setup_machine,
+	reserve_global_data,
+	reserve_fdt,
+	reserve_stacks,
+	setup_dram_config,
+	show_dram_config,
+	setup_baud_rate,
+	display_new_sp,
+	reloc_fdt,
+	setup_reloc,
+#ifndef CONFIG_ARM
+	jump_to_copy,
+#endif
+	NULL,
+};
+
+void board_init_f(ulong boot_flags)
+{
+	gd_t data;
+
+	gd = &data;
+
+	gd->flags = boot_flags;
+
+	if (initcall_run_list(init_sequence_f))
+		hang();
+
+#ifndef CONFIG_ARM
+	/* NOTREACHED - jump_to_copy() does not return */
+	hang();
+#endif
+}
+
+void hang(void)
+{
+	puts("### ERROR ### Please RESET the board ###\n");
+	for (;;);
+}
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index b8ac024..ebfe2a3 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -81,6 +81,8 @@ typedef struct global_data {
 	unsigned long reloc_off;
 	struct global_data *new_gd;	/* relocated global data */
 	const void *fdt_blob;	/* Our device tree, NULL if none */
+	void *new_fdt;		/* Relocated FDT */
+	unsigned long fdt_size;	/* Space reserved for relocated FDT */
 	void **jt;		/* jump table */
 	char env_buf[32];	/* buffer for getenv() before reloc. */
 	struct arch_global_data arch;	/* architecture-specific data */
diff --git a/include/common.h b/include/common.h
index 6d52924..2ff8db1 100644
--- a/include/common.h
+++ b/include/common.h
@@ -311,6 +311,7 @@ extern ulong monitor_flash_len;
 int mac_read_from_eeprom(void);
 extern u8 _binary_dt_dtb_start[];	/* embedded device tree blob */
 int set_cpu_clk_info(void);
+int print_cpuinfo(void);
 
 /**
  * Show the DRAM size in a board-specific way
-- 
1.8.1.3

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

* [U-Boot] [PATCH v9 13/31] arm: Enable generic board support
  2013-03-11 16:49 ` [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c Simon Glass
@ 2013-03-11 16:49   ` Simon Glass
  2013-03-11 16:50   ` [U-Boot] [PATCH v9 17/31] ppc: " Simon Glass
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2013-03-11 16:49 UTC (permalink / raw)
  To: u-boot

This enables generic board support so that ARM boards can define
CONFIG_SYS_GENERIC_BOARD.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v9:
- Use !CONFIG instead of nCONFIG

Changes in v8:
- Define __HAVE_ARCH_GENERIC_BOARD in ARM's config.mk

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/arm/config.mk            | 3 +++
 arch/arm/include/asm/u-boot.h | 9 +++++++++
 arch/arm/lib/Makefile         | 3 +++
 3 files changed, 15 insertions(+)

diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 24b9d7c..a0c89b7 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -31,6 +31,9 @@ CONFIG_STANDALONE_LOAD_ADDR = 0xc100000
 endif
 endif
 
+# Support generic board on ARM
+__HAVE_ARCH_GENERIC_BOARD := y
+
 PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
 
 # Choose between ARM/Thumb instruction sets
diff --git a/arch/arm/include/asm/u-boot.h b/arch/arm/include/asm/u-boot.h
index 2ba98bc..a33fefa 100644
--- a/arch/arm/include/asm/u-boot.h
+++ b/arch/arm/include/asm/u-boot.h
@@ -36,6 +36,12 @@
 #ifndef _U_BOOT_H_
 #define _U_BOOT_H_	1
 
+#ifdef CONFIG_SYS_GENERIC_BOARD
+/* Use the generic board which requires a unified bd_info */
+#include <asm-generic/u-boot.h>
+#else
+
+#ifndef __ASSEMBLY__
 typedef struct bd_info {
 	unsigned int	bi_baudrate;	/* serial console baudrate */
     ulong	        bi_arch_number;	/* unique id for this board */
@@ -49,6 +55,9 @@ typedef struct bd_info {
 	ulong size;
     }			bi_dram[CONFIG_NR_DRAM_BANKS];
 } bd_t;
+#endif
+
+#endif /* !CONFIG_SYS_GENERIC_BOARD */
 
 /* For image.h:image_check_target_arch() */
 #define IH_ARCH_DEFAULT IH_ARCH_ARM
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index 57111af..24c7e7a 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -39,7 +39,10 @@ GLCOBJS	+= div0.o
 SOBJS-y += crt0.o
 
 ifndef CONFIG_SPL_BUILD
+ifndef CONFIG_SYS_GENERIC_BOARD
 COBJS-y	+= board.o
+endif
+
 COBJS-y	+= bootm.o
 COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o
 SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o
-- 
1.8.1.3

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

* [U-Boot] [PATCH v9 17/31] ppc: Enable generic board support
  2013-03-11 16:49 ` [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c Simon Glass
  2013-03-11 16:49   ` [U-Boot] [PATCH v9 13/31] arm: Enable generic board support Simon Glass
@ 2013-03-11 16:50   ` Simon Glass
  2013-03-11 16:50   ` [U-Boot] [PATCH v9 21/31] x86: " Simon Glass
  2013-03-13  8:46   ` [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC Wolfgang Denk
  3 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2013-03-11 16:50 UTC (permalink / raw)
  To: u-boot

This enables generic board support so that ppc boards can define
CONFIG_SYS_GENERIC_BOARD.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v9:
- Use !CONFIG instead of nCONFIG

Changes in v8:
- Define __HAVE_ARCH_GENERIC_BOARD in PPC's config.mk

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/powerpc/config.mk            | 3 +++
 arch/powerpc/include/asm/u-boot.h | 7 +++++++
 arch/powerpc/lib/Makefile         | 2 ++
 3 files changed, 12 insertions(+)

diff --git a/arch/powerpc/config.mk b/arch/powerpc/config.mk
index b706281..e32d2bf 100644
--- a/arch/powerpc/config.mk
+++ b/arch/powerpc/config.mk
@@ -29,6 +29,9 @@ PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections
 PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__
 PLATFORM_LDFLAGS  += -n
 
+# Support generic board on PPC
+__HAVE_ARCH_GENERIC_BOARD := y
+
 #
 # When cross-compiling on NetBSD, we have to define __PPC__ or else we
 # will pick up a va_list declaration that is incompatible with the
diff --git a/arch/powerpc/include/asm/u-boot.h b/arch/powerpc/include/asm/u-boot.h
index 7229a98..cf972d2 100644
--- a/arch/powerpc/include/asm/u-boot.h
+++ b/arch/powerpc/include/asm/u-boot.h
@@ -34,6 +34,11 @@
  * include/asm-ppc/u-boot.h
  */
 
+#ifdef CONFIG_SYS_GENERIC_BOARD
+/* Use the generic board which requires a unified bd_info */
+#include <asm-generic/u-boot.h>
+#else
+
 #ifndef __ASSEMBLY__
 
 typedef struct bd_info {
@@ -144,6 +149,8 @@ typedef struct bd_info {
 
 #endif /* __ASSEMBLY__ */
 
+#endif /* !CONFIG_SYS_GENERIC_BOARD */
+
 /* For image.h:image_check_target_arch() */
 #define IH_ARCH_DEFAULT IH_ARCH_PPC
 
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index 86cf02a..59c723b 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -59,8 +59,10 @@ SOBJS-y	+= reloc.o
 
 COBJS-$(CONFIG_BAT_RW) += bat_rw.o
 ifndef CONFIG_SPL_BUILD
+ifndef CONFIG_SYS_GENERIC_BOARD
 COBJS-y	+= board.o
 endif
+endif
 COBJS-y	+= bootm.o
 COBJS-y	+= cache.o
 COBJS-y	+= extable.o
-- 
1.8.1.3

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

* [U-Boot] [PATCH v9 21/31] x86: Enable generic board support
  2013-03-11 16:49 ` [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c Simon Glass
  2013-03-11 16:49   ` [U-Boot] [PATCH v9 13/31] arm: Enable generic board support Simon Glass
  2013-03-11 16:50   ` [U-Boot] [PATCH v9 17/31] ppc: " Simon Glass
@ 2013-03-11 16:50   ` Simon Glass
  2013-03-13  8:46   ` [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC Wolfgang Denk
  3 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2013-03-11 16:50 UTC (permalink / raw)
  To: u-boot

This enables generic board support so that x86 boards can define
CONFIG_SYS_GENERIC_BOARD.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v9:
- Use !CONFIG instead of nCONFIG

Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5:
- Avoid setting up gd on x86 as it is already done

Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/x86/include/asm/u-boot.h | 11 +++++++++++
 arch/x86/lib/Makefile         |  3 +++
 common/board_r.c              |  2 ++
 3 files changed, 16 insertions(+)

diff --git a/arch/x86/include/asm/u-boot.h b/arch/x86/include/asm/u-boot.h
index 2f45c7b..df759fa 100644
--- a/arch/x86/include/asm/u-boot.h
+++ b/arch/x86/include/asm/u-boot.h
@@ -39,6 +39,13 @@
 #include <config.h>
 #include <compiler.h>
 
+#ifdef CONFIG_SYS_GENERIC_BOARD
+/* Use the generic board which requires a unified bd_info */
+#include <asm-generic/u-boot.h>
+#else
+
+#ifndef __ASSEMBLY__
+
 typedef struct bd_info {
 	unsigned long	bi_memstart;	/* start of DRAM memory */
 	phys_size_t	bi_memsize;	/* size	 of DRAM memory in bytes */
@@ -60,6 +67,10 @@ typedef struct bd_info {
 	}bi_dram[CONFIG_NR_DRAM_BANKS];
 } bd_t;
 
+#endif /* __ASSEMBLY__ */
+
+#endif /* !CONFIG_SYS_GENERIC_BOARD */
+
 /* For image.h:image_check_target_arch() */
 #define IH_ARCH_DEFAULT IH_ARCH_I386
 
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 9b24dc5..ee89354 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -25,7 +25,10 @@ include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(ARCH).o
 
+ifeq ($(CONFIG_SYS_GENERIC_BOARD),)
 COBJS-y	+= board.o
+endif
+
 COBJS-y	+= bootm.o
 COBJS-y	+= cmd_boot.o
 COBJS-y	+= gcc.o
diff --git a/common/board_r.c b/common/board_r.c
index 29eccdf..230887d 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -509,11 +509,13 @@ static int show_model_r(void)
 #endif
 
 /* enable exceptions */
+#ifdef CONFIG_ARM
 static int initr_enable_interrupts(void)
 {
 	enable_interrupts();
 	return 0;
 }
+#endif
 
 #ifdef CONFIG_CMD_NET
 static int initr_ethaddr(void)
-- 
1.8.1.3

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

* [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC
  2013-03-11 16:49 ` [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c Simon Glass
                     ` (2 preceding siblings ...)
  2013-03-11 16:50   ` [U-Boot] [PATCH v9 21/31] x86: " Simon Glass
@ 2013-03-13  8:46   ` Wolfgang Denk
  2013-03-15 22:23     ` Tom Rini
  2013-03-30 21:34     ` Simon Glass
  3 siblings, 2 replies; 7+ messages in thread
From: Wolfgang Denk @ 2013-03-13  8:46 UTC (permalink / raw)
  To: u-boot

Dear Simon Glass,

In message <1363020460-14307-1-git-send-email-sjg@chromium.org> you wrote:
> This series creates a generic board init implementation which contains
> the essential functions of the major arch/xxx/lib/board.c files. It is
> split into two parts: board_f.c for pre-relocation and board_r.c for
> post-relocation.
...
> ARM is a relatively large board.c file and one which I can test, therefore
> I think it is a good target for this series. On the other hand, x86 is
> relatively small and simple, but different enough that it introduces a
> few issues to be solved. So I have chosen both ARM and x86 for this series.
> After a suggestion from Wolfgang I have added PPC also. This is the
> largest and most feature-full board, so hopefully we have all bases
> covered in this series. Other archs are mostly a subset of these.

I did some testing on Power Architecture systems - to be precise:

CPU		Board
--------------------------
MPC860T		TQM860L
MPC5200		TQM5200S
PPC405EX	Kilauea
PPC440EP	Yosemite
PPC440EX	Sequoia
PPC440SPe	Katmai
PPC460EX	Canyonlands

On all boards I verified at least environment access (printenv,
saveenv) and network operation (TFTP download); where available also
PCI.  Everything appears to work fine, no problems noted.

A well done job, thanks a lot!

For the whole series:

Tested-by: Wolfgang Denk <wd@denx.de>
Acked-by: Wolfgang Denk <wd@denx.de>


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Certain old men prefer to rise at dawn, taking a cold bath and a long
walk with an empty stomach and otherwise mortifying the  flesh.  They
then point with pride to these practices as the cause of their sturdy
health  and ripe years; the truth being that they are hearty and old,
not because of their habits, but in spite of them. The reason we find
only robust persons doing this thing is that it has  killed  all  the
others who have tried it.  - Ambrose Bierce, "The Devil's Dictionary"

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

* [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC
  2013-03-13  8:46   ` [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC Wolfgang Denk
@ 2013-03-15 22:23     ` Tom Rini
  2013-03-30 21:34     ` Simon Glass
  1 sibling, 0 replies; 7+ messages in thread
From: Tom Rini @ 2013-03-15 22:23 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 13, 2013 at 09:46:26AM +0100, Wolfgang Denk wrote:
> Dear Simon Glass,
> 
> In message <1363020460-14307-1-git-send-email-sjg@chromium.org> you wrote:
> > This series creates a generic board init implementation which contains
> > the essential functions of the major arch/xxx/lib/board.c files. It is
> > split into two parts: board_f.c for pre-relocation and board_r.c for
> > post-relocation.
> ...
> > ARM is a relatively large board.c file and one which I can test, therefore
> > I think it is a good target for this series. On the other hand, x86 is
> > relatively small and simple, but different enough that it introduces a
> > few issues to be solved. So I have chosen both ARM and x86 for this series.
> > After a suggestion from Wolfgang I have added PPC also. This is the
> > largest and most feature-full board, so hopefully we have all bases
> > covered in this series. Other archs are mostly a subset of these.
> 
> I did some testing on Power Architecture systems - to be precise:
> 
> CPU		Board
> --------------------------
> MPC860T		TQM860L
> MPC5200		TQM5200S
> PPC405EX	Kilauea
> PPC440EP	Yosemite
> PPC440EX	Sequoia
> PPC440SPe	Katmai
> PPC460EX	Canyonlands
> 
> On all boards I verified at least environment access (printenv,
> saveenv) and network operation (TFTP download); where available also
> PCI.  Everything appears to work fine, no problems noted.
> 
> A well done job, thanks a lot!
> 
> For the whole series:
> 
> Tested-by: Wolfgang Denk <wd@denx.de>
> Acked-by: Wolfgang Denk <wd@denx.de>

OK, I've taken http://patchwork.ozlabs.org/bundle/sjg/us-board/ but with
http://patchwork.ozlabs.org/patch/228080/ for 2/31 and applied this to
u-boot/master now, thanks again!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20130315/da1bf0d1/attachment.pgp>

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

* [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC
  2013-03-13  8:46   ` [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC Wolfgang Denk
  2013-03-15 22:23     ` Tom Rini
@ 2013-03-30 21:34     ` Simon Glass
  1 sibling, 0 replies; 7+ messages in thread
From: Simon Glass @ 2013-03-30 21:34 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang,

On Wed, Mar 13, 2013 at 1:46 AM, Wolfgang Denk <wd@denx.de> wrote:

> Dear Simon Glass,
>
> In message <1363020460-14307-1-git-send-email-sjg@chromium.org> you wrote:
> > This series creates a generic board init implementation which contains
> > the essential functions of the major arch/xxx/lib/board.c files. It is
> > split into two parts: board_f.c for pre-relocation and board_r.c for
> > post-relocation.
> ...
> > ARM is a relatively large board.c file and one which I can test,
> therefore
> > I think it is a good target for this series. On the other hand, x86 is
> > relatively small and simple, but different enough that it introduces a
> > few issues to be solved. So I have chosen both ARM and x86 for this
> series.
> > After a suggestion from Wolfgang I have added PPC also. This is the
> > largest and most feature-full board, so hopefully we have all bases
> > covered in this series. Other archs are mostly a subset of these.
>
> I did some testing on Power Architecture systems - to be precise:
>
> CPU             Board
> --------------------------
> MPC860T         TQM860L
> MPC5200         TQM5200S
> PPC405EX        Kilauea
> PPC440EP        Yosemite
> PPC440EX        Sequoia
> PPC440SPe       Katmai
> PPC460EX        Canyonlands
>
> On all boards I verified at least environment access (printenv,
> saveenv) and network operation (TFTP download); where available also
> PCI.  Everything appears to work fine, no problems noted.
>
> A well done job, thanks a lot!
>

Thanks for your comments which are much appreciated. There is still work to
do, in cleaning up the implementation to reduce the differences between
arch code (e.g. all the #ifdefs in board_f/r.c). But this is a great first
step and I am pleased to get this in.


>
> For the whole series:
>
> Tested-by: Wolfgang Denk <wd@denx.de>
> Acked-by: Wolfgang Denk <wd@denx.de>
>
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> Certain old men prefer to rise at dawn, taking a cold bath and a long
> walk with an empty stomach and otherwise mortifying the  flesh.  They
> then point with pride to these practices as the cause of their sturdy
> health  and ripe years; the truth being that they are hearty and old,
> not because of their habits, but in spite of them. The reason we find
> only robust persons doing this thing is that it has  killed  all  the
> others who have tried it.  - Ambrose Bierce, "The Devil's Dictionary"
>

But I wonder if this is trying to tell me to stop these tricky refactors :-)

Regards,
Simon

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

end of thread, other threads:[~2013-03-30 21:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1363020460-14307-1-git-send-email-sjg@chromium.org>
2013-03-11 16:49 ` [U-Boot] [PATCH v9 09/31] Introduce generic pre-relocation board_f.c Simon Glass
2013-03-11 16:49   ` [U-Boot] [PATCH v9 13/31] arm: Enable generic board support Simon Glass
2013-03-11 16:50   ` [U-Boot] [PATCH v9 17/31] ppc: " Simon Glass
2013-03-11 16:50   ` [U-Boot] [PATCH v9 21/31] x86: " Simon Glass
2013-03-13  8:46   ` [U-Boot] [PATCH v9 0/31] Create generic board init for ARM, x86, PPC Wolfgang Denk
2013-03-15 22:23     ` Tom Rini
2013-03-30 21:34     ` Simon Glass

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.