diff options
Diffstat (limited to 'lib_ppc')
| -rw-r--r-- | lib_ppc/board.c | 164 | ||||
| -rw-r--r-- | lib_ppc/bootm.c | 288 | ||||
| -rw-r--r-- | lib_ppc/cache.c | 36 | ||||
| -rw-r--r-- | lib_ppc/extable.c | 4 | ||||
| -rw-r--r-- | lib_ppc/interrupts.c | 13 | ||||
| -rw-r--r-- | lib_ppc/time.c | 2 | 
6 files changed, 321 insertions, 186 deletions
| diff --git a/lib_ppc/board.c b/lib_ppc/board.c index c8f075f5a..289a32a64 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -52,7 +52,7 @@  #endif  #include <net.h>  #include <serial.h> -#ifdef CFG_ALLOC_DPRAM +#ifdef CONFIG_SYS_ALLOC_DPRAM  #if !defined(CONFIG_CPM2)  #include <commproc.h>  #endif @@ -68,14 +68,14 @@  #if defined(CONFIG_LOGBUFFER)  #include <logbuff.h>  #endif -#if defined(CFG_INIT_RAM_LOCK) && defined(CONFIG_E500) +#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)  #include <asm/cache.h>  #endif  #ifdef CONFIG_PS2KBD  #include <keyboard.h>  #endif -#ifdef CFG_UPDATE_FLASH_SIZE +#ifdef CONFIG_SYS_UPDATE_FLASH_SIZE  extern int update_flash_size (int flash_size);  #endif @@ -106,18 +106,18 @@ extern int board_start_ide(void);  DECLARE_GLOBAL_DATA_PTR; -#if defined(CFG_ENV_IS_EMBEDDED) -#define TOTAL_MALLOC_LEN	CFG_MALLOC_LEN -#elif ( ((CFG_ENV_ADDR+CFG_ENV_SIZE) < CFG_MONITOR_BASE) || \ -	(CFG_ENV_ADDR >= (CFG_MONITOR_BASE + CFG_MONITOR_LEN)) ) || \ -      defined(CFG_ENV_IS_IN_NVRAM) -#define	TOTAL_MALLOC_LEN	(CFG_MALLOC_LEN + CFG_ENV_SIZE) +#if defined(CONFIG_ENV_IS_EMBEDDED) +#define TOTAL_MALLOC_LEN	CONFIG_SYS_MALLOC_LEN +#elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \ +	(CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \ +      defined(CONFIG_ENV_IS_IN_NVRAM) +#define	TOTAL_MALLOC_LEN	(CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)  #else -#define	TOTAL_MALLOC_LEN	CFG_MALLOC_LEN +#define	TOTAL_MALLOC_LEN	CONFIG_SYS_MALLOC_LEN  #endif -#if !defined(CFG_MEM_TOP_HIDE) -#define CFG_MEM_TOP_HIDE	0 +#if !defined(CONFIG_SYS_MEM_TOP_HIDE) +#define CONFIG_SYS_MEM_TOP_HIDE	0  #endif  extern ulong __init_end; @@ -146,7 +146,7 @@ static	ulong	mem_malloc_brk	 = 0;  static void mem_malloc_init (void)  {  #if !defined(CONFIG_RELOC_FIXUP_WORKS) -	mem_malloc_end = CFG_MONITOR_BASE + gd->reloc_off; +	mem_malloc_end = CONFIG_SYS_MONITOR_BASE + gd->reloc_off;  #endif  	mem_malloc_start = mem_malloc_end - TOTAL_MALLOC_LEN;  	mem_malloc_brk = mem_malloc_start; @@ -234,7 +234,7 @@ static int init_func_ram (void)  static int init_func_i2c (void)  {  	puts ("I2C:   "); -	i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE); +	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);  	puts ("ready\n");  	return (0);  } @@ -291,7 +291,7 @@ init_fnc_t *init_sequence[] = {  #endif  	init_timebase,  #endif -#ifdef CFG_ALLOC_DPRAM +#ifdef CONFIG_SYS_ALLOC_DPRAM  #if !defined(CONFIG_CPM2)  	dpram_init,  #endif @@ -343,9 +343,9 @@ init_fnc_t *init_sequence[] = {  #endif  	INIT_FUNC_WATCHDOG_RESET  	init_func_ram, -#if defined(CFG_DRAM_TEST) +#if defined(CONFIG_SYS_DRAM_TEST)  	testdram, -#endif /* CFG_DRAM_TEST */ +#endif /* CONFIG_SYS_DRAM_TEST */  	INIT_FUNC_WATCHDOG_RESET  	NULL,			/* Terminate this list */ @@ -384,7 +384,7 @@ ulong get_effective_memsize(void)  #ifdef CONFIG_LOGBUFFER  unsigned long logbuffer_base(void)  { -	return CFG_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN; +	return CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN;  }  #endif @@ -402,7 +402,7 @@ void board_init_f (ulong bootflag)  #endif  	/* Pointer is writable since we allocated a register for it */ -	gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET); +	gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);  	/* compiler optimization barrier needed for GCC >= 3.4 */  	__asm__ __volatile__("": : :"memory"); @@ -430,7 +430,7 @@ void board_init_f (ulong bootflag)  	 *  - monitor code  	 *  - board info struct  	 */ -	len = (ulong)&_end - CFG_MONITOR_BASE; +	len = (ulong)&_end - CONFIG_SYS_MONITOR_BASE;  	/*  	 * Subtract specified amount of memory to hide so that it won't @@ -442,9 +442,9 @@ void board_init_f (ulong bootflag)  	 * memory size from the SDRAM controller setup will have to  	 * get fixed.  	 */ -	gd->ram_size -= CFG_MEM_TOP_HIDE; +	gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE; -	addr = CFG_SDRAM_BASE + get_effective_memsize(); +	addr = CONFIG_SYS_SDRAM_BASE + get_effective_memsize();  #ifdef CONFIG_LOGBUFFER  #ifndef CONFIG_ALT_LB_ADDR @@ -536,15 +536,15 @@ void board_init_f (ulong bootflag)  	 * Save local variables to board info struct  	 */ -	bd->bi_memstart  = CFG_SDRAM_BASE;	/* start of  DRAM memory	*/ +	bd->bi_memstart  = CONFIG_SYS_SDRAM_BASE;	/* start of  DRAM memory	*/  	bd->bi_memsize   = gd->ram_size;	/* size  of  DRAM memory in bytes */  #ifdef CONFIG_IP860  	bd->bi_sramstart = SRAM_BASE;	/* start of  SRAM memory	*/  	bd->bi_sramsize  = SRAM_SIZE;	/* size  of  SRAM memory	*/  #elif defined CONFIG_MPC8220 -	bd->bi_sramstart = CFG_SRAM_BASE;	/* start of  SRAM memory	*/ -	bd->bi_sramsize  = CFG_SRAM_SIZE;	/* size  of  SRAM memory	*/ +	bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;	/* start of  SRAM memory	*/ +	bd->bi_sramsize  = CONFIG_SYS_SRAM_SIZE;	/* size  of  SRAM memory	*/  #else  	bd->bi_sramstart = 0;		/* FIXME */ /* start of  SRAM memory	*/  	bd->bi_sramsize  = 0;		/* FIXME */ /* size  of  SRAM memory	*/ @@ -552,16 +552,16 @@ void board_init_f (ulong bootflag)  #if defined(CONFIG_8xx) || defined(CONFIG_8260) || defined(CONFIG_5xx) || \      defined(CONFIG_E500) || defined(CONFIG_MPC86xx) -	bd->bi_immr_base = CFG_IMMR;	/* base  of IMMR register     */ +	bd->bi_immr_base = CONFIG_SYS_IMMR;	/* base  of IMMR register     */  #endif  #if defined(CONFIG_MPC5xxx) -	bd->bi_mbar_base = CFG_MBAR;	/* base of internal registers */ +	bd->bi_mbar_base = CONFIG_SYS_MBAR;	/* base of internal registers */  #endif  #if defined(CONFIG_MPC83XX) -	bd->bi_immrbar = CFG_IMMR; +	bd->bi_immrbar = CONFIG_SYS_IMMR;  #endif  #if defined(CONFIG_MPC8220) -	bd->bi_mbar_base = CFG_MBAR;	/* base of internal registers */ +	bd->bi_mbar_base = CONFIG_SYS_MBAR;	/* base of internal registers */  	bd->bi_inpfreq   = gd->inp_clk;  	bd->bi_pcifreq   = gd->pci_clk;  	bd->bi_vcofreq   = gd->vco_clk; @@ -570,7 +570,7 @@ void board_init_f (ulong bootflag)  	/* store bootparam to sram (backward compatible), here? */  	{ -		u32 *sram = (u32 *)CFG_SRAM_BASE; +		u32 *sram = (u32 *)CONFIG_SYS_SRAM_BASE;  		*sram++ = gd->ram_size;  		*sram++ = gd->bus_clk;  		*sram++ = gd->inp_clk; @@ -601,7 +601,7 @@ void board_init_f (ulong bootflag)  #endif /* CONFIG_MPC5xxx */  	bd->bi_baudrate = gd->baudrate;	/* Console Baudrate     */ -#ifdef CFG_EXTBDINFO +#ifdef CONFIG_SYS_EXTBDINFO  	strncpy ((char *)bd->bi_s_version, "1.2", sizeof (bd->bi_s_version));  	strncpy ((char *)bd->bi_r_version, U_BOOT_VERSION, sizeof (bd->bi_r_version)); @@ -635,6 +635,16 @@ void board_init_f (ulong bootflag)  	/* NOTREACHED - relocate_code() does not return */  } +int __is_sata_supported(void) +{ +	/* For some boards, when sata disabled by the switch, and the +	 * driver still access the sata registers, the cpu will hangup. +	 * please define platform specific is_sata_supported() if your +	 * board have such issue.*/ +	return 1; +} +int is_sata_supported(void) __attribute__((weak, alias("__is_sata_supported"))); +  /************************************************************************   *   * This is the next part if the initialization sequence: we are now @@ -651,11 +661,11 @@ void board_init_r (gd_t *id, ulong dest_addr)  	bd_t *bd;  	int i;  	extern void malloc_bin_reloc (void); -#ifndef CFG_ENV_IS_NOWHERE +#ifndef CONFIG_ENV_IS_NOWHERE  	extern char * env_name_spec;  #endif -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	ulong flash_size;  #endif @@ -668,7 +678,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  	gd->reloc_off = 0;  	mem_malloc_end = dest_addr;  #else -	gd->reloc_off = dest_addr - CFG_MONITOR_BASE; +	gd->reloc_off = dest_addr - CONFIG_SYS_MONITOR_BASE;  #endif  #ifdef CONFIG_SERIAL_MULTI @@ -679,6 +689,11 @@ void board_init_r (gd_t *id, ulong dest_addr)  	WATCHDOG_RESET (); +	/* +	 * Setup trap handlers +	 */ +	trap_init (dest_addr); +  #if defined(CONFIG_BOARD_EARLY_INIT_R)  	board_early_init_r ();  #endif @@ -705,7 +720,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  			addr = (ulong)(cmdtp->usage) + gd->reloc_off;  			cmdtp->usage = (char *)addr;  		} -#ifdef	CFG_LONGHELP +#ifdef	CONFIG_SYS_LONGHELP  		if (cmdtp->help) {  			addr = (ulong)(cmdtp->help) + gd->reloc_off;  			cmdtp->help = (char *)addr; @@ -713,7 +728,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  #endif  	}  	/* there are some other pointer constants we must deal with */ -#ifndef CFG_ENV_IS_NOWHERE +#ifndef CONFIG_ENV_IS_NOWHERE  	env_name_spec += gd->reloc_off;  #endif @@ -734,7 +749,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  	icache_enable ();	/* it's time to enable the instruction cache */  #endif -#if defined(CFG_INIT_RAM_LOCK) && defined(CONFIG_E500) +#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)  	unlock_ram_in_cache();	/* it's time to unlock D-cache in e500 */  #endif @@ -755,16 +770,11 @@ void board_init_r (gd_t *id, ulong dest_addr)  	asm ("sync ; isync"); -	/* -	 * Setup trap handlers -	 */ -	trap_init (dest_addr); - -#if !defined(CFG_NO_FLASH) +#if !defined(CONFIG_SYS_NO_FLASH)  	puts ("FLASH: ");  	if ((flash_size = flash_init ()) > 0) { -# ifdef CFG_FLASH_CHECKSUM +# ifdef CONFIG_SYS_FLASH_CHECKSUM  		print_size (flash_size, "");  		/*  		 * Compute and print flash CRC if flashchecksum is set to 'y' @@ -774,22 +784,22 @@ void board_init_r (gd_t *id, ulong dest_addr)  		s = getenv ("flashchecksum");  		if (s && (*s == 'y')) {  			printf ("  CRC: %08X", -				crc32 (0, (const unsigned char *) CFG_FLASH_BASE, flash_size) +				crc32 (0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size)  			);  		}  		putc ('\n'); -# else	/* !CFG_FLASH_CHECKSUM */ +# else	/* !CONFIG_SYS_FLASH_CHECKSUM */  		print_size (flash_size, "\n"); -# endif /* CFG_FLASH_CHECKSUM */ +# endif /* CONFIG_SYS_FLASH_CHECKSUM */  	} else {  		puts (failed);  		hang ();  	} -	bd->bi_flashstart = CFG_FLASH_BASE;	/* update start of FLASH memory    */ +	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;	/* update start of FLASH memory    */  	bd->bi_flashsize = flash_size;	/* size of FLASH memory (final value) */ -#if defined(CFG_UPDATE_FLASH_SIZE) +#if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)  	/* Make a update of the Memctrl. */  	update_flash_size (flash_size);  #endif @@ -798,17 +808,17 @@ void board_init_r (gd_t *id, ulong dest_addr)  # if defined(CONFIG_PCU_E) || defined(CONFIG_OXC) || defined(CONFIG_RMU)  	/* flash mapped at end of memory map */  	bd->bi_flashoffset = TEXT_BASE + flash_size; -# elif CFG_MONITOR_BASE == CFG_FLASH_BASE +# elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE  	bd->bi_flashoffset = monitor_flash_len;	/* reserved area for startup monitor  */  # else  	bd->bi_flashoffset = 0;  # endif -#else	/* CFG_NO_FLASH */ +#else	/* CONFIG_SYS_NO_FLASH */  	bd->bi_flashsize = 0;  	bd->bi_flashstart = 0;  	bd->bi_flashoffset = 0; -#endif /* !CFG_NO_FLASH */ +#endif /* !CONFIG_SYS_NO_FLASH */  	WATCHDOG_RESET (); @@ -822,7 +832,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  	malloc_bin_reloc ();  #ifdef CONFIG_SPI -# if !defined(CFG_ENV_IS_IN_EEPROM) +# if !defined(CONFIG_ENV_IS_IN_EEPROM)  	spi_init_f ();  # endif  	spi_init_r (); @@ -845,7 +855,7 @@ void board_init_r (gd_t *id, ulong dest_addr)  	 * the environment is in EEPROM.  	 */ -#if defined(CFG_EXTBDINFO) +#if defined(CONFIG_SYS_EXTBDINFO)  #if defined(CONFIG_405GP) || defined(CONFIG_405EP)  #if defined(CONFIG_I2CFAST)  	/* @@ -867,13 +877,13 @@ void board_init_r (gd_t *id, ulong dest_addr)  	bd->bi_iic_fast[1] = 0;  #endif	/* CONFIG_I2CFAST */  #endif	/* CONFIG_405GP, CONFIG_405EP */ -#endif	/* CFG_EXTBDINFO */ +#endif	/* CONFIG_SYS_EXTBDINFO */  #if defined(CONFIG_SC3)  	sc3_read_eeprom();  #endif -#if defined (CFG_ID_EEPROM) || defined (CFG_I2C_MAC_OFFSET) +#if defined (CONFIG_ID_EEPROM) || defined (CONFIG_SYS_I2C_MAC_OFFSET)  	mac_read_from_eeprom();  #endif @@ -944,6 +954,36 @@ void board_init_r (gd_t *id, ulong dest_addr)  	}  #endif +#ifdef CONFIG_HAS_ETH4 +	/* handle 5th ethernet address */ +	s = getenv("eth4addr"); +#if defined(CONFIG_XPEDITE1K) || defined(CONFIG_METROBOX) || defined(CONFIG_KAREF) +	if (s == NULL) +		board_get_enetaddr(bd->bi_enet4addr); +	else +#endif +	for (i = 0; i < 6; ++i) { +		bd->bi_enet4addr[i] = s ? simple_strtoul (s, &e, 16) : 0; +		if (s) +			s = (*e) ? e + 1 : e; +	} +#endif + +#ifdef CONFIG_HAS_ETH5 +	/* handle 6th ethernet address */ +	s = getenv("eth5addr"); +#if defined(CONFIG_XPEDITE1K) || defined(CONFIG_METROBOX) || defined(CONFIG_KAREF) +	if (s == NULL) +		board_get_enetaddr(bd->bi_enet5addr); +	else +#endif +	for (i = 0; i < 6; ++i) { +		bd->bi_enet5addr[i] = s ? simple_strtoul (s, &e, 16) : 0; +		if (s) +			s = (*e) ? e + 1 : e; +	} +#endif +  #if defined(CONFIG_TQM8xxL) || defined(CONFIG_TQM8260) || \      defined(CONFIG_TQM8272) || \      defined(CONFIG_CCM) || defined(CONFIG_KUP4K) || \ @@ -1105,8 +1145,10 @@ void board_init_r (gd_t *id, ulong dest_addr)  #endif  #if defined(CONFIG_CMD_SATA) -	puts ("SATA:  "); -	sata_initialize (); +	if (is_sata_supported()) { +		puts("SATA:  "); +		sata_initialize(); +	}  #endif  #ifdef CONFIG_LAST_STAGE_INIT @@ -1245,7 +1287,7 @@ int mdm_init (void)  			serial_puts(init_str);  			serial_puts("\n");  			for(;;) { -				mdm_readline(console_buffer, CFG_CBSIZE); +				mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);  				dbg("ini%d: [%s]", i, console_buffer);  				if ((strcmp(console_buffer, "OK") == 0) || @@ -1269,7 +1311,7 @@ int mdm_init (void)  	/* final stage - wait for connect */  	for(;i > 1;) { /* if 'i' > 1 - wait for connection  				  message from modem */ -		mdm_readline(console_buffer, CFG_CBSIZE); +		mdm_readline(console_buffer, CONFIG_SYS_CBSIZE);  		dbg("ini_f: [%s]", console_buffer);  		if (strncmp(console_buffer, "CONNECT", 7) == 0) {  			dbg("ini_f: connected"); @@ -1290,7 +1332,7 @@ int mdm_init (void)   */  #undef	XTRN_DECLARE_GLOBAL_DATA_PTR  #define XTRN_DECLARE_GLOBAL_DATA_PTR	/* empty = allocate here */ -DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET); +DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);  #endif  /* 0 */  /************************************************************************/ diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index 348421fd3..e03d76390 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -41,58 +41,107 @@  #endif -#ifdef CFG_INIT_RAM_LOCK +#ifdef CONFIG_SYS_INIT_RAM_LOCK  #include <asm/cache.h>  #endif  DECLARE_GLOBAL_DATA_PTR; +extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);  extern ulong get_effective_memsize(void);  static ulong get_sp (void);  static void set_clocks_in_mhz (bd_t *kbd); -#ifndef CFG_LINUX_LOWMEM_MAX_SIZE -#define CFG_LINUX_LOWMEM_MAX_SIZE	(768*1024*1024) +#ifndef CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE +#define CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE	(768*1024*1024)  #endif -__attribute__((noinline)) -int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) +static void boot_jump_linux(bootm_headers_t *images)  { -	ulong	sp; - -	ulong	initrd_start, initrd_end; -	ulong	rd_len; -	ulong	size; -	phys_size_t bootm_size; - -	ulong	cmd_start, cmd_end, bootmap_base; -	bd_t	*kbd;  	void	(*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,  			  ulong r7, ulong r8, ulong r9); -	int	ret; -	ulong	of_size = images->ft_len; -	struct lmb *lmb = &images->lmb; - -#if defined(CONFIG_OF_LIBFDT) -	char	*of_flat_tree = images->ft_addr; +#ifdef CONFIG_OF_LIBFDT +	char *of_flat_tree = images->ft_addr;  #endif  	kernel = (void (*)(bd_t *, ulong, ulong, ulong,  			   ulong, ulong, ulong))images->ep; +	debug ("## Transferring control to Linux (at address %08lx) ...\n", +		(ulong)kernel); + +	show_boot_progress (15); + +#if defined(CONFIG_SYS_INIT_RAM_LOCK) && !defined(CONFIG_E500) +	unlock_ram_in_cache(); +#endif + +#if defined(CONFIG_OF_LIBFDT) +	if (of_flat_tree) {	/* device tree; boot new style */ +		/* +		 * Linux Kernel Parameters (passing device tree): +		 *   r3: pointer to the fdt +		 *   r4: 0 +		 *   r5: 0 +		 *   r6: epapr magic +		 *   r7: size of IMA in bytes +		 *   r8: 0 +		 *   r9: 0 +		 */ +#if defined(CONFIG_85xx) || defined(CONFIG_440) + #define EPAPR_MAGIC	(0x45504150) +#else + #define EPAPR_MAGIC	(0x65504150) +#endif + +		debug ("   Booting using OF flat tree...\n"); +		(*kernel) ((bd_t *)of_flat_tree, 0, 0, EPAPR_MAGIC, +			   CONFIG_SYS_BOOTMAPSZ, 0, 0); +		/* does not return */ +	} else +#endif +	{ +		/* +		 * Linux Kernel Parameters (passing board info data): +		 *   r3: ptr to board info data +		 *   r4: initrd_start or 0 if no initrd +		 *   r5: initrd_end - unused if r4 is 0 +		 *   r6: Start of command line string +		 *   r7: End   of command line string +		 *   r8: 0 +		 *   r9: 0 +		 */ +		ulong cmd_start = images->cmdline_start; +		ulong cmd_end = images->cmdline_end; +		ulong initrd_start = images->initrd_start; +		ulong initrd_end = images->initrd_end; +		bd_t *kbd = images->kbd; + +		debug ("   Booting using board info...\n"); +		(*kernel) (kbd, initrd_start, initrd_end, +			   cmd_start, cmd_end, 0, 0); +		/* does not return */ +	} +	return ; +} + +void arch_lmb_reserve(struct lmb *lmb) +{ +	phys_size_t bootm_size; +	ulong size, sp, bootmap_base;  	bootmap_base = getenv_bootm_low();  	bootm_size = getenv_bootm_size();  #ifdef DEBUG  	if (((u64)bootmap_base + bootm_size) > -	    (CFG_SDRAM_BASE + (u64)gd->ram_size)) +	    (CONFIG_SYS_SDRAM_BASE + (u64)gd->ram_size))  		puts("WARNING: bootm_low + bootm_size exceed total memory\n");  	if ((bootmap_base + bootm_size) > get_effective_memsize())  		puts("WARNING: bootm_low + bootm_size exceed eff. memory\n");  #endif  	size = min(bootm_size, get_effective_memsize()); -	size = min(size, CFG_LINUX_LOWMEM_MAX_SIZE); +	size = min(size, CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE);  	if (size < bootm_size) {  		ulong base = bootmap_base + size; @@ -105,7 +154,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)  	 *  	 * Allocate space for command line and board info - the  	 * address should be as high as possible within the reach of -	 * the kernel (see CFG_BOOTMAPSZ settings), but in unused +	 * the kernel (see CONFIG_SYS_BOOTMAPSZ settings), but in unused  	 * memory, which means far enough below the current stack  	 * pointer.  	 */ @@ -114,128 +163,169 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)  	/* adjust sp by 1K to be safe */  	sp -= 1024; -	lmb_reserve(lmb, sp, (CFG_SDRAM_BASE + get_effective_memsize() - sp)); +	lmb_reserve(lmb, sp, (CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - sp)); + +	return ; +} + +static void boot_prep_linux(void) +{ +#if (CONFIG_NUM_CPUS > 1) +	/* if we are MP make sure to flush the dcache() to any changes are made +	 * visibile to all other cores */ +	flush_dcache(); +#endif +	return ; +} + +static int boot_cmdline_linux(bootm_headers_t *images) +{ +	ulong bootmap_base = getenv_bootm_low(); +	ulong of_size = images->ft_len; +	struct lmb *lmb = &images->lmb; +	ulong *cmd_start = &images->cmdline_start; +	ulong *cmd_end = &images->cmdline_end; + +	int ret = 0;  	if (!of_size) {  		/* allocate space and init command line */ -		ret = boot_get_cmdline (lmb, &cmd_start, &cmd_end, bootmap_base); +		ret = boot_get_cmdline (lmb, cmd_start, cmd_end, bootmap_base);  		if (ret) {  			puts("ERROR with allocation of cmdline\n"); -			goto error; +			return ret;  		} +	} + +	return ret; +} + +static int boot_bd_t_linux(bootm_headers_t *images) +{ +	ulong bootmap_base = getenv_bootm_low(); +	ulong of_size = images->ft_len; +	struct lmb *lmb = &images->lmb; +	bd_t **kbd = &images->kbd; + +	int ret = 0; +	if (!of_size) {  		/* allocate space for kernel copy of board info */ -		ret = boot_get_kbd (lmb, &kbd, bootmap_base); +		ret = boot_get_kbd (lmb, kbd, bootmap_base);  		if (ret) {  			puts("ERROR with allocation of kernel bd\n"); -			goto error; +			return ret;  		} -		set_clocks_in_mhz(kbd); +		set_clocks_in_mhz(*kbd);  	} +	return ret; +} + +static int boot_body_linux(bootm_headers_t *images) +{ +	ulong rd_len; +	struct lmb *lmb = &images->lmb; +	ulong *initrd_start = &images->initrd_start; +	ulong *initrd_end = &images->initrd_end; +#if defined(CONFIG_OF_LIBFDT) +	ulong bootmap_base = getenv_bootm_low(); +	ulong of_size = images->ft_len; +	char **of_flat_tree = &images->ft_addr; +#endif + +	int ret; + +	/* allocate space and init command line */ +	ret = boot_cmdline_linux(images); +	if (ret) +		return ret; + +	/* allocate space for kernel copy of board info */ +	ret = boot_bd_t_linux(images); +	if (ret) +		return ret; +  	rd_len = images->rd_end - images->rd_start; +	ret = boot_ramdisk_high (lmb, images->rd_start, rd_len, initrd_start, initrd_end); +	if (ret) +		return ret;  #if defined(CONFIG_OF_LIBFDT) -	ret = boot_relocate_fdt(lmb, bootmap_base, &of_flat_tree, &of_size); +	ret = boot_relocate_fdt(lmb, bootmap_base, of_flat_tree, &of_size);  	if (ret) -		goto error; +		return ret;  	/*  	 * Add the chosen node if it doesn't exist, add the env and bd_t  	 * if the user wants it (the logic is in the subroutines).  	 */  	if (of_size) { -		/* pass in dummy initrd info, we'll fix up later */ -		if (fdt_chosen(of_flat_tree, images->rd_start, images->rd_end, 0) < 0) { +		if (fdt_chosen(*of_flat_tree, 1) < 0) {  			puts ("ERROR: ");  			puts ("/chosen node create failed");  			puts (" - must RESET the board to recover.\n"); -			goto error; +			return -1;  		}  #ifdef CONFIG_OF_BOARD_SETUP  		/* Call the board-specific fixup routine */ -		ft_board_setup(of_flat_tree, gd->bd); +		ft_board_setup(*of_flat_tree, gd->bd);  #endif -	} -	/* Fixup the fdt memreserve now that we know how big it is */ -	if (of_flat_tree) {  		/* Delete the old LMB reservation */ -		lmb_free(lmb, (phys_addr_t)(u32)of_flat_tree, -				(phys_size_t)fdt_totalsize(of_flat_tree)); +		lmb_free(lmb, (phys_addr_t)(u32)*of_flat_tree, +				(phys_size_t)fdt_totalsize(*of_flat_tree)); -		ret = fdt_resize(of_flat_tree); +		ret = fdt_resize(*of_flat_tree);  		if (ret < 0) -			goto error; +			return ret;  		of_size = ret; +		if (*initrd_start && *initrd_end) +			of_size += FDT_RAMDISK_OVERHEAD;  		/* Create a new LMB reservation */ -		lmb_reserve(lmb, (ulong)of_flat_tree, of_size); +		lmb_reserve(lmb, (ulong)*of_flat_tree, of_size); + +		/* fixup the initrd now that we know where it should be */ +		if (*initrd_start && *initrd_end) +			fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);  	}  #endif	/* CONFIG_OF_LIBFDT */ +	return 0; +} -	ret = boot_ramdisk_high (lmb, images->rd_start, rd_len, &initrd_start, &initrd_end); -	if (ret) -		goto error; - -#if defined(CONFIG_OF_LIBFDT) -	/* fixup the initrd now that we know where it should be */ -	if ((of_flat_tree) && (initrd_start && initrd_end)) -		fdt_initrd(of_flat_tree, initrd_start, initrd_end, 1); -#endif -	debug ("## Transferring control to Linux (at address %08lx) ...\n", -		(ulong)kernel); +__attribute__((noinline)) +int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) +{ +	int	ret; -	show_boot_progress (15); +	if (flag & BOOTM_STATE_OS_CMDLINE) { +		boot_cmdline_linux(images); +		return 0; +	} -#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500) -	unlock_ram_in_cache(); -#endif +	if (flag & BOOTM_STATE_OS_BD_T) { +		boot_bd_t_linux(images); +		return 0; +	} -#if defined(CONFIG_OF_LIBFDT) -	if (of_flat_tree) {	/* device tree; boot new style */ -		/* -		 * Linux Kernel Parameters (passing device tree): -		 *   r3: pointer to the fdt -		 *   r4: 0 -		 *   r5: 0 -		 *   r6: epapr magic -		 *   r7: size of IMA in bytes -		 *   r8: 0 -		 *   r9: 0 -		 */ -#if defined(CONFIG_85xx) || defined(CONFIG_440) - #define EPAPR_MAGIC	(0x45504150) -#else - #define EPAPR_MAGIC	(0x65504150) -#endif +	if (flag & BOOTM_STATE_OS_PREP) { +		boot_prep_linux(); +		return 0; +	} -		debug ("   Booting using OF flat tree...\n"); -		(*kernel) ((bd_t *)of_flat_tree, 0, 0, EPAPR_MAGIC, -			   CFG_BOOTMAPSZ, 0, 0); -		/* does not return */ -	} else -#endif -	{ -		/* -		 * Linux Kernel Parameters (passing board info data): -		 *   r3: ptr to board info data -		 *   r4: initrd_start or 0 if no initrd -		 *   r5: initrd_end - unused if r4 is 0 -		 *   r6: Start of command line string -		 *   r7: End   of command line string -		 *   r8: 0 -		 *   r9: 0 -		 */ -		debug ("   Booting using board info...\n"); -		(*kernel) (kbd, initrd_start, initrd_end, -			   cmd_start, cmd_end, 0, 0); -		/* does not return */ +	if (flag & BOOTM_STATE_OS_GO) { +		boot_jump_linux(images); +		return 0;  	} -	return 1; -error: -	return 1; +	boot_prep_linux(); +	ret = boot_body_linux(images); +	if (ret) +		return ret; +	boot_jump_linux(images); + +	return 0;  }  static ulong get_sp (void) diff --git a/lib_ppc/cache.c b/lib_ppc/cache.c index 5bfb22070..1292b71e6 100644 --- a/lib_ppc/cache.c +++ b/lib_ppc/cache.c @@ -25,29 +25,27 @@  #include <asm/cache.h>  #include <watchdog.h> -void flush_cache (ulong start_addr, ulong size) +void flush_cache(ulong start_addr, ulong size)  {  #ifndef CONFIG_5xx -	ulong addr, end_addr = start_addr + size; +	ulong addr, start, end; -	if (CFG_CACHELINE_SIZE) { -		addr = start_addr & (CFG_CACHELINE_SIZE - 1); -		for (addr = start_addr; -		     addr < end_addr; -		     addr += CFG_CACHELINE_SIZE) { -			asm ("dcbst 0,%0": :"r" (addr)); -			WATCHDOG_RESET(); -		} -		asm ("sync");	/* Wait for all dcbst to complete on bus */ +	start = start_addr & ~(CONFIG_SYS_CACHELINE_SIZE - 1); +	end = start_addr + size - 1; -		for (addr = start_addr; -		     addr < end_addr; -		     addr += CFG_CACHELINE_SIZE) { -			asm ("icbi 0,%0": :"r" (addr)); -			WATCHDOG_RESET(); -		} +	for (addr = start; addr <= end; addr += CONFIG_SYS_CACHELINE_SIZE) { +		asm volatile("dcbst 0,%0" : : "r" (addr) : "memory"); +		WATCHDOG_RESET();  	} -	asm ("sync");		/* Always flush prefetch queue in any case */ -	asm ("isync"); +	/* wait for all dcbst to complete on bus */ +	asm volatile("sync" : : : "memory"); + +	for (addr = start; addr <= end; addr += CONFIG_SYS_CACHELINE_SIZE) { +		asm volatile("icbi 0,%0" : : "r" (addr) : "memory"); +		WATCHDOG_RESET(); +	} +	asm volatile("sync" : : : "memory"); +	/* flush prefetch queue */ +	asm volatile("isync" : : : "memory");  #endif  } diff --git a/lib_ppc/extable.c b/lib_ppc/extable.c index 2d995fa30..91e2b3d24 100644 --- a/lib_ppc/extable.c +++ b/lib_ppc/extable.c @@ -53,7 +53,7 @@ search_one_table(const struct exception_table_entry *first,  		 unsigned long value)  {  	long diff; -	if ((ulong) first > CFG_MONITOR_BASE) { +	if ((ulong) first > CONFIG_SYS_MONITOR_BASE) {  		/* exception occurs in FLASH, before u-boot relocation.  		 * No relocation offset is needed.  		 */ @@ -87,7 +87,7 @@ search_exception_table(unsigned long addr)  	/* There is only the kernel to search.  */  	ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);  	/* if the serial port does not hang in exception, printf can be used */ -#if !defined(CFG_SERIAL_HANG_IN_EXCEPTION) +#if !defined(CONFIG_SYS_SERIAL_HANG_IN_EXCEPTION)  	if (ex_tab_message)  		debug("Bus Fault @ 0x%08lx, fixup 0x%08lx\n", addr, ret);  #endif diff --git a/lib_ppc/interrupts.c b/lib_ppc/interrupts.c index b803952ba..f6031707a 100644 --- a/lib_ppc/interrupts.c +++ b/lib_ppc/interrupts.c @@ -32,11 +32,16 @@  #endif  #ifdef CONFIG_SHOW_ACTIVITY -	extern void board_show_activity (ulong); +void board_show_activity (ulong) __attribute__((weak, alias("__board_show_activity"))); + +void __board_show_activity (ulong dummy) +{ +	return; +}  #endif /* CONFIG_SHOW_ACTIVITY */ -#ifndef CFG_WATCHDOG_FREQ -#define CFG_WATCHDOG_FREQ (CFG_HZ / 2) +#ifndef CONFIG_SYS_WATCHDOG_FREQ +#define CONFIG_SYS_WATCHDOG_FREQ (CONFIG_SYS_HZ / 2)  #endif  extern int interrupt_init_cpu (unsigned *); @@ -119,7 +124,7 @@ void timer_interrupt (struct pt_regs *regs)  	timestamp++;  #if defined(CONFIG_WATCHDOG) || defined (CONFIG_HW_WATCHDOG) -	if ((timestamp % (CFG_WATCHDOG_FREQ)) == 0) +	if ((timestamp % (CONFIG_SYS_WATCHDOG_FREQ)) == 0)  		WATCHDOG_RESET ();  #endif    /* CONFIG_WATCHDOG || CONFIG_HW_WATCHDOG */ diff --git a/lib_ppc/time.c b/lib_ppc/time.c index f093a5785..173ffab3e 100644 --- a/lib_ppc/time.c +++ b/lib_ppc/time.c @@ -89,7 +89,7 @@ unsigned long ticks2usec(unsigned long ticks)  int init_timebase (void)  {  #if defined(CONFIG_5xx) || defined(CONFIG_8xx) -	volatile immap_t *immap = (immap_t *) CFG_IMMR; +	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;  	/* unlock */  	immap->im_sitk.sitk_tbk = KAPWR_KEY; |