From patchwork Fri Dec 23 12:25:50 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Graeme Russ X-Patchwork-Id: 133030 X-Patchwork-Delegate: graeme.russ@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 186A9B7191 for ; Fri, 23 Dec 2011 23:28:43 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 001E728295; Fri, 23 Dec 2011 13:28:03 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id R1tTMq0HaAwq; Fri, 23 Dec 2011 13:28:03 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 162D22825F; Fri, 23 Dec 2011 13:27:21 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 80EB32821B for ; Fri, 23 Dec 2011 13:27:10 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sIVbgwgy4-UJ for ; Fri, 23 Dec 2011 13:27:09 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-yx0-f172.google.com (mail-yx0-f172.google.com [209.85.213.172]) by theia.denx.de (Postfix) with ESMTPS id 9A79928255 for ; Fri, 23 Dec 2011 13:26:53 +0100 (CET) Received: by mail-yx0-f172.google.com with SMTP id m7so5475111yen.3 for ; Fri, 23 Dec 2011 04:26:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=ETbL4AaoMMmw8xmxywMByn3f6uZ4RmSFShGhxqUh/BY=; b=f8RzGVshREgta3H6grRwOy7BSTd+jouhonxhvHBYtUev9JPrT6rUxfoWpRTj6PtZq0 T3h+IqvZ44OEQarSCUa3qVFjTVQ2yHCr9T/+A44n0DPxzGfJp5XvcZ811tdTRT4N7kKx 1/OAMxQ793WBPcg+w3qiQDxc6/kXFokQkn6Cs= Received: by 10.236.129.140 with SMTP id h12mr20253798yhi.47.1324643213312; Fri, 23 Dec 2011 04:26:53 -0800 (PST) Received: from localhost.localdomain (d58-106-90-149.sbr801.nsw.optusnet.com.au. [58.106.90.149]) by mx.google.com with ESMTPS id y17sm32624370anc.2.2011.12.23.04.26.50 (version=SSLv3 cipher=OTHER); Fri, 23 Dec 2011 04:26:52 -0800 (PST) From: Graeme Russ To: u-boot@lists.denx.de Date: Fri, 23 Dec 2011 23:25:50 +1100 Message-Id: <1324643151-23642-14-git-send-email-graeme.russ@gmail.com> X-Mailer: git-send-email 1.7.5.2.317.g391b14 In-Reply-To: <1324643151-23642-1-git-send-email-graeme.russ@gmail.com> References: <1324643151-23642-1-git-send-email-graeme.russ@gmail.com> Subject: [U-Boot] [RFC 13/14] x86: Simplify board.c X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de --- arch/x86/include/asm/init_helpers.h | 39 +++++ arch/x86/include/asm/init_wrappers.h | 42 +++++ arch/x86/lib/Makefile | 2 + arch/x86/lib/board.c | 289 +++++++++------------------------- arch/x86/lib/init_helpers.c | 140 ++++++++++++++++ arch/x86/lib/init_wrappers.c | 137 ++++++++++++++++ 6 files changed, 435 insertions(+), 214 deletions(-) create mode 100644 arch/x86/include/asm/init_helpers.h create mode 100644 arch/x86/include/asm/init_wrappers.h create mode 100644 arch/x86/lib/init_helpers.c create mode 100644 arch/x86/lib/init_wrappers.c diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h new file mode 100644 index 0000000..14ef11a --- /dev/null +++ b/arch/x86/include/asm/init_helpers.h @@ -0,0 +1,39 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, + * + * 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 + */ + +#ifndef _INIT_HELPERS_H_ +#define _INIT_HELPERS_H_ + +int display_banner(void); +int display_dram_config(void); +int init_baudrate_f(void); + +int mem_malloc_init_r(void); +int init_bd_struct_r(void); +int flash_init_r(void); +int init_ip_address_r(void); +int status_led_set_r(void); +int set_bootfile_r(void); +int set_load_addr_r(void); + +#endif /* !_INIT_HELPERS_H_ */ diff --git a/arch/x86/include/asm/init_wrappers.h b/arch/x86/include/asm/init_wrappers.h new file mode 100644 index 0000000..899ffb1 --- /dev/null +++ b/arch/x86/include/asm/init_wrappers.h @@ -0,0 +1,42 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, + * + * 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 + */ + +#ifndef _INIT_WRAPPERS_H_ +#define _INIT_WRAPPERS_H_ + +int serial_initialize_r(void); +int env_relocate_r(void); +int pci_init_r(void); +int jumptable_init_r(void); +int pcmcia_init_r(void); +int kgdb_init_r(void); +int enable_interrupts_r(void); +int eth_initialize_r(void); +int reset_phy_r(void); +int ide_init_r(void); +int scsi_init_r(void); +int doc_init_r(void); +int bb_miiphy_init_r(void); +int post_run_r(void); + +#endif /* !_INIT_WRAPPERS_H_ */ diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index 57b6896..51836da 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile @@ -34,6 +34,8 @@ COBJS-y += board.o COBJS-y += bootm.o COBJS-y += cmd_boot.o COBJS-y += gcc.o +COBJS-y += init_helpers.o +COBJS-y += init_wrappers.o COBJS-y += interrupts.o COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c index a6596ef..b06063a 100644 --- a/arch/x86/lib/board.c +++ b/arch/x86/lib/board.c @@ -33,18 +33,11 @@ #include #include -#include #include -#include -#include -#include -#include -#include #include -#ifdef CONFIG_BITBANGMII -#include -#endif +#include +#include /* * Pointer to initial global data area @@ -55,49 +48,6 @@ #define XTRN_DECLARE_GLOBAL_DATA_PTR /* empty = allocate here */ DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_GD_ADDR); -/************************************************************************ - * Init Utilities * - ************************************************************************ - * Some of this code should be moved into the core functions, - * or dropped completely, - * but let's get it working (again) first... - */ -static int init_baudrate(void) -{ - gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); - return 0; -} - -static int display_banner(void) -{ - - printf("\n\n%s\n\n", version_string); - - return 0; -} - -static int display_dram_config(void) -{ - int i; - - puts("DRAM Configuration:\n"); - - for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { - printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); - print_size(gd->bd->bi_dram[i].size, "\n"); - } - - return 0; -} - -#ifndef CONFIG_SYS_NO_FLASH -static void display_flash_config(ulong size) -{ - puts("Flash: "); - print_size(size, "\n"); -} -#endif - /* * Breath some life into the board... * @@ -127,7 +77,7 @@ init_fnc_t *init_sequence_f[] = { cpu_init_f, board_early_init_f, env_init, - init_baudrate, + init_baudrate_f, serial_init, console_init_f, dram_init_f, @@ -136,204 +86,115 @@ init_fnc_t *init_sequence_f[] = { }; init_fnc_t *init_sequence_r[] = { - cpu_init_r, /* basic cpu dependent setup */ - board_early_init_r, /* basic board dependent setup */ - dram_init, /* configure available RAM banks */ - interrupt_init, /* set up exceptions */ + init_bd_struct_r, + mem_malloc_init_r, + cpu_init_r, + board_early_init_r, + dram_init, + interrupt_init, timer_init, display_banner, display_dram_config, - - NULL, -}; - -gd_t *gd; - -/* Load U-Boot into RAM, initialize BSS, perform relocation adjustments */ -void board_init_f(ulong boot_flags) -{ - init_fnc_t **init_fnc_ptr; - - gd->flags = boot_flags; - - for (init_fnc_ptr = init_sequence_f; *init_fnc_ptr; ++init_fnc_ptr) { - if ((*init_fnc_ptr)() != 0) - hang(); - } - - /* SDRAM is now initialised setup a new stack in SDRAM */ - setup_sdram_environment(gd->ram_size, GENERATED_GBL_DATA_SIZE); - - /* NOTREACHED - relocate_code() does not return */ - while (1) - ; -} - -void board_init_r(gd_t *id, ulong dest_addr) -{ -#if defined(CONFIG_CMD_NET) - char *s; -#endif -#ifndef CONFIG_SYS_NO_FLASH - ulong size; -#endif - static bd_t bd_data; - init_fnc_t **init_fnc_ptr; - - show_boot_progress(0x21); - - /* Global data pointer is now writable */ - gd = id; - - gd->flags |= GD_FLG_RELOC; - - /* compiler optimization barrier needed for GCC >= 3.4 */ - __asm__ __volatile__("" : : : "memory"); - - gd->bd = &bd_data; - memset(gd->bd, 0, sizeof(bd_t)); - show_boot_progress(0x22); - - gd->baudrate = CONFIG_BAUDRATE; - - mem_malloc_init((((ulong)dest_addr - CONFIG_SYS_MALLOC_LEN)+3)&~3, - CONFIG_SYS_MALLOC_LEN); - - for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) { - if ((*init_fnc_ptr)() != 0) - hang(); - } - show_boot_progress(0x23); - #ifdef CONFIG_SERIAL_MULTI - serial_initialize(); + serial_initialize_r, #endif - #ifndef CONFIG_SYS_NO_FLASH - /* configure available FLASH banks */ - size = flash_init(); - display_flash_config(size); - show_boot_progress(0x24); + flash_init_r, #endif - - show_boot_progress(0x25); - - /* initialize environment */ - env_relocate(); - show_boot_progress(0x26); - - + env_relocate_r, #ifdef CONFIG_CMD_NET - /* IP Address */ - bd_data.bi_ip_addr = getenv_IPaddr("ipaddr"); + init_ip_address_r, #endif - -#if defined(CONFIG_PCI) - /* - * Do pci configuration - */ - pci_init(); +#ifdef CONFIG_PCI + pci_init_r, #endif - - show_boot_progress(0x27); - - - stdio_init(); - - jumptable_init(); - - /* Initialize the console (after the relocation and devices init) */ - console_init_r(); - + stdio_init, + jumptable_init_r, + console_init_r, #ifdef CONFIG_MISC_INIT_R - /* miscellaneous platform dependent initialisations */ - misc_init_r(); + misc_init_r, #endif - #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE) - WATCHDOG_RESET(); - puts("PCMCIA:"); - pcmcia_init(); + pci_init_r, #endif - #if defined(CONFIG_CMD_KGDB) - WATCHDOG_RESET(); - puts("KGDB: "); - kgdb_init(); + kgdb_init_r, #endif - - /* enable exceptions */ - enable_interrupts(); - show_boot_progress(0x28); - + enable_interrupts_r, #ifdef CONFIG_STATUS_LED - status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); + status_led_set_r, #endif - - udelay(20); - - /* Initialize from environment */ - load_addr = getenv_ulong("loadaddr", 16, load_addr); + set_load_addr_r, #if defined(CONFIG_CMD_NET) - s = getenv("bootfile"); - - if (s != NULL) - copy_filename(BootFile, s, sizeof(BootFile)); + set_bootfile_r, #endif - - WATCHDOG_RESET(); - #if defined(CONFIG_CMD_IDE) - WATCHDOG_RESET(); - puts("IDE: "); - ide_init(); + ide_init_r, #endif - #if defined(CONFIG_CMD_SCSI) - WATCHDOG_RESET(); - puts("SCSI: "); - scsi_init(); + scsi_init_r, #endif - #if defined(CONFIG_CMD_DOC) - WATCHDOG_RESET(); - puts("DOC: "); - doc_init(); + doc_init_r, #endif - #ifdef CONFIG_BITBANGMII - bb_miiphy_init(); + bb_miiphy_init_r, #endif #if defined(CONFIG_CMD_NET) - WATCHDOG_RESET(); - puts("Net: "); - eth_initialize(gd->bd); + eth_initialize_r, +#ifdef CONFIG_RESET_PHY_R + reset_phy_r, #endif - -#if (defined(CONFIG_CMD_NET)) && (0) - WATCHDOG_RESET(); -# ifdef DEBUG - puts("Reset Ethernet PHY\n"); -# endif - reset_phy(); #endif - #ifdef CONFIG_LAST_STAGE_INIT - WATCHDOG_RESET(); + last_stage_init, +#endif + NULL, +}; + +static void do_init_loop(init_fnc_t **init_fnc_ptr) +{ + for (; *init_fnc_ptr; ++init_fnc_ptr) { + WATCHDOG_RESET(); + if ((*init_fnc_ptr)() != 0) + hang(); + } +} + +/* Perform all steps necessary to get RAM initialised ready for relocation */ +void board_init_f(ulong boot_flags) +{ + gd->flags = boot_flags; + + do_init_loop(init_sequence_f); + /* - * Some parts can be only initialized if all others (like - * Interrupts) are up and running (i.e. the PC-style ISA - * keyboard). + * SDRAM is now initialised setup a new stack in SDRAM + * + * Code execution will continue in Flash, but with the stack + * in SDRAM. This allows us to copy global data out of the CPU + * cache prior to copying U-Boot into RAM which means we can + * enable caching for the copy operation (which speeds it up + * considerably) */ - last_stage_init(); -#endif + setup_sdram_environment(gd->ram_size, GENERATED_GBL_DATA_SIZE); + /* NOTREACHED - setup_sdram_environment() does not return */ + while (1) + ; +} -#ifdef CONFIG_POST - post_run(NULL, POST_RAM | post_bootmode_get(0)); -#endif +void board_init_r(gd_t *id, ulong dest_addr) +{ + /* Global data pointer is now writable */ + gd = id; + + gd->flags |= GD_FLG_RELOC; + + /* compiler optimization barrier needed for GCC >= 3.4 */ + __asm__ __volatile__("" : : : "memory"); - show_boot_progress(0x29); + do_init_loop(init_sequence_r); /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c new file mode 100644 index 0000000..a589fd3 --- /dev/null +++ b/arch/x86/lib/init_helpers.c @@ -0,0 +1,140 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +DECLARE_GLOBAL_DATA_PTR; + +/************************************************************************ + * Init Utilities * + ************************************************************************ + * Some of this code should be moved into the core functions, + * or dropped completely, + * but let's get it working (again) first... + */ + +int display_banner(void) +{ + printf("\n\n%s\n\n", version_string); + + return 0; +} + +int display_dram_config(void) +{ + int i; + + puts("DRAM Configuration:\n"); + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); + print_size(gd->bd->bi_dram[i].size, "\n"); + } + + return 0; +} + +int init_baudrate_f(void) +{ + gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); + return 0; +} + +int mem_malloc_init_r(void) +{ + mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3, + CONFIG_SYS_MALLOC_LEN); + + return 0; +} + +bd_t bd_data; + +int init_bd_struct_r(void) +{ + gd->bd = &bd_data; + memset(gd->bd, 0, sizeof(bd_t)); + + return 0; +} + +int flash_init_r(void) +{ + ulong size; + + puts("Flash: "); + + /* configure available FLASH banks */ + size = flash_init(); + + print_size(size, "\n"); + + return 0; +} + +int init_ip_address_r(void) +{ + /* IP Address */ + bd_data.bi_ip_addr = getenv_IPaddr("ipaddr"); + + return 0; +} + +#ifdef CONFIG_STATUS_LED +int status_led_set_r(void) +{ + status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); + + return 0; +} +#endif + +int set_bootfile_r(void) +{ + char *s; + + s = getenv("bootfile"); + + if (s != NULL) + copy_filename(BootFile, s, sizeof(BootFile)); + + return 0; +} + +int set_load_addr_r(void) +{ + /* Initialize from environment */ + load_addr = getenv_ulong("loadaddr", 16, load_addr); + + return 0; +} diff --git a/arch/x86/lib/init_wrappers.c b/arch/x86/lib/init_wrappers.c new file mode 100644 index 0000000..71449fe --- /dev/null +++ b/arch/x86/lib/init_wrappers.c @@ -0,0 +1,137 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, + * + * 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 +#include +#include +#include +#include +#include + +#include + +int serial_initialize_r(void) +{ + serial_initialize(); + + return 0; +} + +int env_relocate_r(void) +{ + /* initialize environment */ + env_relocate(); + + return 0; +} + + +int pci_init_r(void) +{ + /* Do pci configuration */ + pci_init(); + + return 0; +} + +int jumptable_init_r(void) +{ + jumptable_init(); + + return 0; +} + +int pcmcia_init_r(void) +{ + puts("PCMCIA:"); + pcmcia_init(); + + return 0; +} + +int kgdb_init_r(void) +{ + puts("KGDB: "); + kgdb_init(); + + return 0; +} + +int enable_interrupts_r(void) +{ + /* enable exceptions */ + enable_interrupts(); + + return 0; +} + +int eth_initialize_r(void) +{ + puts("Net: "); + eth_initialize(gd->bd); + + return 0; +} + +int reset_phy_r(void) +{ +#ifdef DEBUG + puts("Reset Ethernet PHY\n"); +#endif + reset_phy(); + + return 0; +} + +int ide_init_r(void) +{ + puts("IDE: "); + ide_init(); + + return 0; +} + +int scsi_init_r(void) +{ + puts("SCSI: "); + scsi_init(); + + return 0; +} + +#ifdef CONFIG_BITBANGMII +int bb_miiphy_init_r(void) +{ + bb_miiphy_init(); + + return 0; +} +#endif + +#ifdef CONFIG_POST +int post_run_r(void) +{ + post_run(NULL, POST_RAM | post_bootmode_get(0)); + + return 0; +} +#endif