diff options
Diffstat (limited to 'arch/powerpc')
38 files changed, 1068 insertions, 183 deletions
diff --git a/arch/powerpc/config.mk b/arch/powerpc/config.mk index a30715459..b7062818b 100644 --- a/arch/powerpc/config.mk +++ b/arch/powerpc/config.mk @@ -42,3 +42,8 @@ endif  ifeq ($(CROSS_COMPILE),powerpc-openbsd-)  PLATFORM_CPPFLAGS+= -D__PPC__  endif + +# Only test once +ifneq ($(CONFIG_SPL_BUILD),y) +ALL-y += checkgcc4 +endif diff --git a/arch/powerpc/cpu/mpc5xxx/Makefile b/arch/powerpc/cpu/mpc5xxx/Makefile index 1a088b77b..8de2c1359 100644 --- a/arch/powerpc/cpu/mpc5xxx/Makefile +++ b/arch/powerpc/cpu/mpc5xxx/Makefile @@ -41,6 +41,10 @@ COBJS-y += speed.o  COBJS-$(CONFIG_CMD_USB) += usb_ohci.o  COBJS-$(CONFIG_CMD_USB) += usb.o +ifdef CONFIG_SPL_BUILD +COBJS-y += spl_boot.o +endif +  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))  START	:= $(addprefix $(obj),$(SSTART) $(CSTART)) diff --git a/arch/powerpc/cpu/mpc5xxx/spl_boot.c b/arch/powerpc/cpu/mpc5xxx/spl_boot.c new file mode 100644 index 000000000..9f14127dc --- /dev/null +++ b/arch/powerpc/cpu/mpc5xxx/spl_boot.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2012 Stefan Roese <sr@denx.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. + */ + +#include <common.h> +#include <spl.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Needed to align size SPL image to a 4-byte length + */ +u32 end_align __attribute__ ((section(".end_align"))); + +/* + * Return selected boot device. On MPC5200 its only NOR flash right now. + */ +u32 spl_boot_device(void) +{ +	return BOOT_DEVICE_NOR; +} + +/* + * SPL version of board_init_f() + */ +void board_init_f(ulong bootflag) +{ +	end_align = (u32)__spl_flash_end; + +	/* +	 * First we need to initialize the SDRAM, so that the real +	 * U-Boot or the OS (Linux) can be loaded +	 */ +	initdram(0); + +	/* Clear bss */ +	memset(__bss_start, '\0', __bss_end__ - __bss_start); + +	/* +	 * Init global_data pointer. Has to be done before calling +	 * get_clocks(), as it stores some clock values into gd needed +	 * later on in the serial driver. +	 */ +	/* Pointer is writable since we allocated a register for it */ +	gd = (gd_t *)(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET); +	/* Clear initial global data */ +	memset((void *)gd, 0, sizeof(gd_t)); + +	/* +	 * get_clocks() needs to be called so that the serial driver +	 * works correctly +	 */ +	get_clocks(); + +	/* +	 * Do rudimental console / serial setup +	 */ +	preloader_console_init(); + +	/* +	 * Call board_init_r() (SPL framework version) to load and boot +	 * real U-Boot or OS +	 */ +	board_init_r(NULL, 0); +	/* Does not return!!! */ +} diff --git a/arch/powerpc/cpu/mpc5xxx/start.S b/arch/powerpc/cpu/mpc5xxx/start.S index 51cc4e2a1..ad5bc0a17 100644 --- a/arch/powerpc/cpu/mpc5xxx/start.S +++ b/arch/powerpc/cpu/mpc5xxx/start.S @@ -50,6 +50,7 @@  #define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)  #endif +#ifndef CONFIG_SPL_BUILD  /*   * Set up GOT: Global Offset Table   * @@ -68,6 +69,7 @@  	GOT_ENTRY(__bss_end__)  	GOT_ENTRY(__bss_start)  	END_GOT +#endif  /*   * Version string @@ -84,6 +86,18 @@ version_string:  	. = EXC_OFF_SYS_RESET  	.globl	_start  _start: + +#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD) +	/* +	 * This is the entry of the real U-Boot from a board port +	 * that supports SPL booting on the MPC5200. We only need +	 * to call board_init_f() here. Everything else has already +	 * been done in the SPL u-boot version. +	 */ +	GET_GOT			/* initialize GOT access		*/ +	bl	board_init_f	/* run 1st part of board init code (in Flash)*/ +	/* NOTREACHED - board_init_f() does not return */ +#else  	mfmsr	r5			/* save msr contents		*/  	/* Move CSBoot and adjust instruction pointer                   */ @@ -152,7 +166,9 @@ lowboot_reentry:  	/* Be careful to keep code relocatable !			*/  	/*--------------------------------------------------------------*/ +#ifndef CONFIG_SPL_BUILD  	GET_GOT			/* initialize GOT access		*/ +#endif  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code (in Flash)*/ @@ -160,7 +176,9 @@ lowboot_reentry:  	bl	board_init_f	/* run 1st part of board init code (in Flash)*/  	/* NOTREACHED - board_init_f() does not return */ +#endif +#ifndef CONFIG_SPL_BUILD  /*   * Vector Table   */ @@ -333,6 +351,7 @@ int_return:  	lwz	r1,GPR1(r1)  	SYNC  	rfi +#endif /* CONFIG_SPL_BUILD */  /*   * This code initialises the MPC5xxx processor core @@ -522,6 +541,7 @@ get_pvr:  	mfspr	r3, PVR  	blr +#ifndef CONFIG_SPL_BUILD  /*------------------------------------------------------------------------------*/  /* @@ -759,3 +779,5 @@ trap_init:  	mtlr	r4			/* restore link register    */  	blr + +#endif /* CONFIG_SPL_BUILD */ diff --git a/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds b/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds new file mode 100644 index 000000000..cab9b9265 --- /dev/null +++ b/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds @@ -0,0 +1,57 @@ +/* + * Copyright 2012 Stefan Roese <sr@denx.de> + * + * 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 + */ + +MEMORY +{ +	sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, +		LENGTH = CONFIG_SPL_BSS_MAX_SIZE +	flash : ORIGIN = CONFIG_SPL_TEXT_BASE, +		LENGTH = CONFIG_SYS_SPL_MAX_LEN +} + +OUTPUT_ARCH(powerpc) +ENTRY(_start) +SECTIONS +{ +	.text : +	{ +		__start = .; +		arch/powerpc/cpu/mpc5xxx/start.o	(.text) +		*(.text*) +	} > flash + +	. = ALIGN(4); +	.data : { *(SORT_BY_ALIGNMENT(.data*)) } > flash + +	. = ALIGN(4); +	.rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } > flash + +	. = ALIGN(4); +	.end_align : { *(.end_align*) } > flash +	__spl_flash_end = .; + +	.bss : +	{ +		. = ALIGN(4); +		__bss_start = .; +		*(.bss*) +		. = ALIGN(4); +		__bss_end__ = .; +	} > sdram +} diff --git a/arch/powerpc/cpu/mpc5xxx/usb_ohci.c b/arch/powerpc/cpu/mpc5xxx/usb_ohci.c index 607034b7c..de07343d9 100644 --- a/arch/powerpc/cpu/mpc5xxx/usb_ohci.c +++ b/arch/powerpc/cpu/mpc5xxx/usb_ohci.c @@ -618,7 +618,7 @@ static ed_t * ep_add_ed (struct usb_device *usb_dev, unsigned long pipe)  			| usb_pipeendpoint (pipe) << 7  			| (usb_pipeisoc (pipe)? 0x8000: 0)  			| (usb_pipecontrol (pipe)? 0: (usb_pipeout (pipe)? 0x800: 0x1000)) -			| usb_pipeslow (pipe) << 13 +			| (usb_dev->speed == USB_SPEED_LOW) << 13  			| usb_maxpacket (usb_dev, pipe) << 16);  	return ed_ret; diff --git a/arch/powerpc/cpu/mpc85xx/Makefile b/arch/powerpc/cpu/mpc85xx/Makefile index 78c412d9f..4c2b1040d 100644 --- a/arch/powerpc/cpu/mpc85xx/Makefile +++ b/arch/powerpc/cpu/mpc85xx/Makefile @@ -28,7 +28,22 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(CPU).o -START	= start.o resetvec.o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +START = start.o resetvec.o + +ifdef MINIMAL + +COBJS-y	+= cpu_init_early.o tlb.o spl_minimal.o + +else +  SOBJS-$(CONFIG_MP)	+= release.o  SOBJS	= $(SOBJS-y) @@ -121,17 +136,20 @@ COBJS-$(CONFIG_PPC_P5040) += p5040_serdes.o  COBJS-$(CONFIG_PPC_T4240) += t4240_serdes.o  COBJS-$(CONFIG_PPC_B4860) += b4860_serdes.o -COBJS	= $(COBJS-y) -COBJS	+= cpu.o -COBJS	+= cpu_init.o -COBJS	+= cpu_init_early.o -COBJS	+= interrupts.o -COBJS	+= speed.o -COBJS	+= tlb.o -COBJS	+= traps.o +COBJS-y	+= cpu.o +COBJS-y	+= cpu_init.o +COBJS-y	+= cpu_init_early.o +COBJS-y	+= interrupts.o +COBJS-y	+= speed.o +COBJS-y	+= tlb.o +COBJS-y	+= traps.o  # Stub implementations of cache management functions for USB -COBJS += cache.o +COBJS-y += cache.o + +endif # not minimal + +COBJS	= $(COBJS-y)  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/arch/powerpc/cpu/mpc85xx/cmd_errata.c b/arch/powerpc/cpu/mpc85xx/cmd_errata.c index 2be192d57..e5ecf5dae 100644 --- a/arch/powerpc/cpu/mpc85xx/cmd_errata.c +++ b/arch/powerpc/cpu/mpc85xx/cmd_errata.c @@ -24,6 +24,109 @@  #include <command.h>  #include <linux/compiler.h>  #include <asm/processor.h> +#include "fsl_corenet_serdes.h" + +#ifdef CONFIG_SYS_FSL_ERRATUM_A004849 +/* + * This work-around is implemented in PBI, so just check to see if the + * work-around was actually applied.  To do this, we check for specific data + * at specific addresses in DCSR. + * + * Array offsets[] contains a list of offsets within DCSR.  According to the + * erratum document, the value at each offset should be 2. + */ +static void check_erratum_a4849(uint32_t svr) +{ +	void __iomem *dcsr = (void *)CONFIG_SYS_DCSRBAR + 0xb0000; +	unsigned int i; + +#if defined(CONFIG_PPC_P2041) || defined(CONFIG_PPC_P3041) +	static const uint8_t offsets[] = { +		0x50, 0x54, 0x58, 0x90, 0x94, 0x98 +	}; +#endif +#ifdef CONFIG_PPC_P4080 +	static const uint8_t offsets[] = { +		0x60, 0x64, 0x68, 0x6c, 0xa0, 0xa4, 0xa8, 0xac +	}; +#endif +	uint32_t x108; /* The value that should be at offset 0x108 */ + +	for (i = 0; i < ARRAY_SIZE(offsets); i++) { +		if (in_be32(dcsr + offsets[i]) != 2) { +			printf("Work-around for Erratum A004849 is not enabled\n"); +			return; +		} +	} + +#if defined(CONFIG_PPC_P2041) || defined(CONFIG_PPC_P3041) +	x108 = 0x12; +#endif + +#ifdef CONFIG_PPC_P4080 +	/* +	 * For P4080, the erratum document says that the value at offset 0x108 +	 * should be 0x12 on rev2, or 0x1c on rev3. +	 */ +	if (SVR_MAJ(svr) == 2) +		x108 = 0x12; +	if (SVR_MAJ(svr) == 3) +		x108 = 0x1c; +#endif + +	if (in_be32(dcsr + 0x108) != x108) { +		printf("Work-around for Erratum A004849 is not enabled\n"); +		return; +	} + +	/* Everything matches, so the erratum work-around was applied */ + +	printf("Work-around for Erratum A004849 enabled\n"); +} +#endif + +#ifdef CONFIG_SYS_FSL_ERRATUM_A004580 +/* + * This work-around is implemented in PBI, so just check to see if the + * work-around was actually applied.  To do this, we check for specific data + * at specific addresses in the SerDes register block. + * + * The work-around says that for each SerDes lane, write BnTTLCRy0 = + * 0x1B00_0001, Register 2 = 0x0088_0000, and Register 3 = 0x4000_0000. + + */ +static void check_erratum_a4580(uint32_t svr) +{ +	const serdes_corenet_t __iomem *srds_regs = +		(void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR; +	unsigned int lane; + +	for (lane = 0; lane < SRDS_MAX_LANES; lane++) { +		if (serdes_lane_enabled(lane)) { +			const struct serdes_lane __iomem *srds_lane = +				&srds_regs->lane[serdes_get_lane_idx(lane)]; + +			/* +			 * Verify that the values we were supposed to write in +			 * the PBI are actually there.  Also, the lower 15 +			 * bits of res4[3] should be the same as the upper 15 +			 * bits of res4[1]. +			 */ +			if ((in_be32(&srds_lane->ttlcr0) != 0x1b000001) || +			    (in_be32(&srds_lane->res4[1]) != 0x880000) || +			    (in_be32(&srds_lane->res4[3]) != 0x40000044)) { +				printf("Work-around for Erratum A004580 is " +				       "not enabled\n"); +				return; +			} +		} +	} + +	/* Everything matches, so the erratum work-around was applied */ + +	printf("Work-around for Erratum A004580 enabled\n"); +} +#endif  static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  { @@ -137,6 +240,17 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #ifdef CONFIG_SYS_FSL_ERRATUM_A_004934  	puts("Work-around for Erratum A004934 enabled\n");  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A004849 +	/* This work-around is implemented in PBI, so just check for it */ +	check_erratum_a4849(svr); +#endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A004580 +	/* This work-around is implemented in PBI, so just check for it */ +	check_erratum_a4580(svr); +#endif +#ifdef CONFIG_SYS_P4080_ERRATUM_PCIE_A003 +	puts("Work-around for Erratum PCIe-A003 enabled\n"); +#endif  	return 0;  } diff --git a/arch/powerpc/cpu/mpc85xx/cpu.c b/arch/powerpc/cpu/mpc85xx/cpu.c index db232e64f..9b9832cfc 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu.c +++ b/arch/powerpc/cpu/mpc85xx/cpu.c @@ -332,7 +332,8 @@ void mpc85xx_reginfo(void)  /* Common ddr init for non-corenet fsl 85xx platforms */  #ifndef CONFIG_FSL_CORENET -#if defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SYS_INIT_L2_ADDR) +#if (defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)) && \ +	!defined(CONFIG_SYS_INIT_L2_ADDR)  phys_size_t initdram(int board_type)  {  #if defined(CONFIG_SPD_EEPROM) || defined(CONFIG_DDR_SPD) @@ -450,21 +451,21 @@ static void dump_spd_ddr_reg(void)  	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {  		switch (i) {  		case 0: -			ddr[i] = (void *)CONFIG_SYS_MPC85xx_DDR_ADDR; +			ddr[i] = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR;  			break; -#if defined(CONFIG_SYS_MPC85xx_DDR2_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 1) +#if defined(CONFIG_SYS_MPC8xxx_DDR2_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 1)  		case 1: -			ddr[i] = (void *)CONFIG_SYS_MPC85xx_DDR2_ADDR; +			ddr[i] = (void *)CONFIG_SYS_MPC8xxx_DDR2_ADDR;  			break;  #endif -#if defined(CONFIG_SYS_MPC85xx_DDR3_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 2) +#if defined(CONFIG_SYS_MPC8xxx_DDR3_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 2)  		case 2: -			ddr[i] = (void *)CONFIG_SYS_MPC85xx_DDR3_ADDR; +			ddr[i] = (void *)CONFIG_SYS_MPC8xxx_DDR3_ADDR;  			break;  #endif -#if defined(CONFIG_SYS_MPC85xx_DDR4_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 3) +#if defined(CONFIG_SYS_MPC8xxx_DDR4_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 3)  		case 3: -			ddr[i] = (void *)CONFIG_SYS_MPC85xx_DDR4_ADDR; +			ddr[i] = (void *)CONFIG_SYS_MPC8xxx_DDR4_ADDR;  			break;  #endif  		default: diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c index f01804bbb..d1155e812 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c @@ -350,6 +350,10 @@ int cpu_init_r(void)  #elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2)  	struct ccsr_cluster_l2 * l2cache = (void __iomem *)CONFIG_SYS_FSL_CLUSTER_1_L2;  #endif +#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP) +	extern int spin_table_compat; +	const char *spin; +#endif  #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \  	defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011) @@ -395,6 +399,14 @@ int cpu_init_r(void)  	}  #endif +#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP) +	spin = getenv("spin_table_compat"); +	if (spin && (*spin == 'n')) +		spin_table_compat = 0; +	else +		spin_table_compat = 1; +#endif +  	puts ("L2:    ");  #if defined(CONFIG_L2_CACHE) @@ -470,7 +482,7 @@ int cpu_init_r(void)  				&& l2srbar >= CONFIG_SYS_FLASH_BASE) {  			l2srbar = CONFIG_SYS_INIT_L2_ADDR;  			l2cache->l2srbar0 = l2srbar; -			printf("moving to 0x%08x", CONFIG_SYS_INIT_L2_ADDR); +			printf(", moving to 0x%08x", CONFIG_SYS_INIT_L2_ADDR);  		}  #endif /* CONFIG_SYS_INIT_L2_ADDR */  		puts("\n"); diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen1.c b/arch/powerpc/cpu/mpc85xx/ddr-gen1.c index 54437dd0c..8a86819fb 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen1.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen1.c @@ -18,7 +18,7 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  			     unsigned int ctrl_num)  {  	unsigned int i; -	volatile ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC85xx_DDR_ADDR; +	volatile ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR;  	if (ctrl_num != 0) {  		printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num); @@ -73,7 +73,7 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  void  ddr_enable_ecc(unsigned int dram_size)  { -	volatile ccsr_ddr_t *ddr= (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR); +	volatile ccsr_ddr_t *ddr= (void *)(CONFIG_SYS_MPC8xxx_DDR_ADDR);  	dma_meminit(CONFIG_MEM_INIT_VALUE, dram_size); diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen2.c b/arch/powerpc/cpu/mpc85xx/ddr-gen2.c index 49000a19e..a70586252 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen2.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen2.c @@ -19,15 +19,12 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  			     unsigned int ctrl_num)  {  	unsigned int i; -#ifdef CONFIG_MPC83xx -	ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC83xx_DDR_ADDR; -#else -	ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC85xx_DDR_ADDR; -#ifdef CONFIG_SYS_FSL_ERRATUM_NMG_DDR120 +	ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR; + +#if defined(CONFIG_SYS_FSL_ERRATUM_NMG_DDR120) && defined(CONFIG_MPC85xx)  	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);  	uint svr;  #endif -#endif  	if (ctrl_num) {  		printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num); diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen3.c b/arch/powerpc/cpu/mpc85xx/ddr-gen3.c index f118dd5da..ef0dd1da6 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen3.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen3.c @@ -32,21 +32,21 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  	switch (ctrl_num) {  	case 0: -		ddr = (void *)CONFIG_SYS_MPC85xx_DDR_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR;  		break; -#if defined(CONFIG_SYS_MPC85xx_DDR2_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 1) +#if defined(CONFIG_SYS_MPC8xxx_DDR2_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 1)  	case 1: -		ddr = (void *)CONFIG_SYS_MPC85xx_DDR2_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR2_ADDR;  		break;  #endif -#if defined(CONFIG_SYS_MPC85xx_DDR3_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 2) +#if defined(CONFIG_SYS_MPC8xxx_DDR3_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 2)  	case 2: -		ddr = (void *)CONFIG_SYS_MPC85xx_DDR3_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR3_ADDR;  		break;  #endif -#if defined(CONFIG_SYS_MPC85xx_DDR4_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 3) +#if defined(CONFIG_SYS_MPC8xxx_DDR4_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 3)  	case 3: -		ddr = (void *)CONFIG_SYS_MPC85xx_DDR4_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR4_ADDR;  		break;  #endif  	default: diff --git a/arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.c b/arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.c index 7f466ac6a..5495dc59e 100644 --- a/arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.c +++ b/arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.c @@ -714,9 +714,13 @@ void fsl_serdes_init(void)  #ifdef CONFIG_SYS_P4080_ERRATUM_SERDES9  		/* -		 * Set BnTTLCRy0[FLT_SEL] = 000011 and set BnTTLCRy0[17] = 1 for -		 * each of the SerDes lanes selected as SGMII, XAUI, SRIO, or -		 * AURORA before the device is initialized. +		 * Set BnTTLCRy0[FLT_SEL] = 011011 and set BnTTLCRy0[31] = 1 +		 * for each of the SerDes lanes selected as SGMII, XAUI, SRIO, +		 * or AURORA before the device is initialized. +		 * +		 * Note that this part of the SERDES-9 work-around is +		 * redundant if the work-around for A-4580 has already been +		 * applied via PBI.  		 */  		switch (lane_prtcl) {  		case SGMII_FM1_DTSEC1: @@ -733,10 +737,12 @@ void fsl_serdes_init(void)  		case SRIO1:  		case SRIO2:  		case AURORA: -			clrsetbits_be32(&srds_regs->lane[idx].ttlcr0, -					SRDS_TTLCR0_FLT_SEL_MASK, -					SRDS_TTLCR0_FLT_SEL_750PPM | -					SRDS_TTLCR0_PM_DIS); +			out_be32(&srds_regs->lane[idx].ttlcr0, +				 SRDS_TTLCR0_FLT_SEL_KFR_26 | +				 SRDS_TTLCR0_FLT_SEL_KPH_28 | +				 SRDS_TTLCR0_FLT_SEL_750PPM | +				 SRDS_TTLCR0_FREQOVD_EN); +			break;  		default:  			break;  		} diff --git a/arch/powerpc/cpu/mpc85xx/mp.c b/arch/powerpc/cpu/mpc85xx/mp.c index e1197ac9e..43d483630 100644 --- a/arch/powerpc/cpu/mpc85xx/mp.c +++ b/arch/powerpc/cpu/mpc85xx/mp.c @@ -46,10 +46,8 @@ u32 get_my_id()   */  int hold_cores_in_reset(int verbose)  { -	const char *s = getenv("mp_holdoff"); -  	/* Default to no, overriden by 'y', 'yes', 'Y', 'Yes', or '1' */ -	if (s && (*s == 'y' || *s == 'Y' || *s == '1')) { +	if (getenv_yesno("mp_holdoff") == 1) {  		if (verbose) {  			puts("Secondary cores are being held in reset.\n");  			puts("See 'mp_holdoff' environment variable\n"); diff --git a/arch/powerpc/cpu/mpc85xx/release.S b/arch/powerpc/cpu/mpc85xx/release.S index 4ba44a902..5c4b1e3b7 100644 --- a/arch/powerpc/cpu/mpc85xx/release.S +++ b/arch/powerpc/cpu/mpc85xx/release.S @@ -351,7 +351,13 @@ __secondary_reset_vector:  	.align L1_CACHE_SHIFT  	.global __second_half_boot_page  __second_half_boot_page: -#define EPAPR_MAGIC		0x45504150 +#ifdef CONFIG_PPC_SPINTABLE_COMPATIBLE +	lis	r3,(spin_table_compat - __second_half_boot_page)@h +	ori	r3,r3,(spin_table_compat - __second_half_boot_page)@l +	add	r3,r3,r11 /* r11 has the address of __second_half_boot_page */ +	lwz	r14,0(r3) +#endif +  #define ENTRY_ADDR_UPPER	0  #define ENTRY_ADDR_LOWER	4  #define ENTRY_R3_UPPER		8 @@ -383,7 +389,24 @@ __second_half_boot_page:  	stw	r8,ENTRY_ADDR_LOWER(r10)  	/* spin waiting for addr */ -3:	lwz	r4,ENTRY_ADDR_LOWER(r10) +3: +/* + * To comply with ePAPR 1.1, the spin table has been moved to cache-enabled + * memory. Old OS may not work with this change. A patch is waiting to be + * accepted for Linux kernel. Other OS needs similar fix to spin table. + * For OSes with old spin table code, we can enable this temporary fix by + * setting environmental variable "spin_table_compat". For new OSes, set + * "spin_table_compat=no". After Linux is fixed, we can remove this macro + * and related code. For now, it is enabled by default. + */ +#ifdef CONFIG_PPC_SPINTABLE_COMPATIBLE +	cmpwi   r14,0 +	beq     4f +	dcbf    0, r10 +	sync +4: +#endif +	lwz	r4,ENTRY_ADDR_LOWER(r10)  	andi.	r11,r4,1  	bne	3b  	isync @@ -460,5 +483,14 @@ __second_half_boot_page:  	.globl __spin_table  __spin_table:  	.space CONFIG_MAX_CPUS*ENTRY_SIZE + +#ifdef CONFIG_PPC_SPINTABLE_COMPATIBLE +	.align L1_CACHE_SHIFT +	.global spin_table_compat +spin_table_compat: +	.long	1 + +#endif +  __spin_table_end:  	.space 4096 - (__spin_table_end - __spin_table) diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init_nand.c b/arch/powerpc/cpu/mpc85xx/spl_minimal.c index bf7a6f6be..c6b9cd0ac 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu_init_nand.c +++ b/arch/powerpc/cpu/mpc85xx/spl_minimal.c @@ -21,12 +21,16 @@   */  #include <common.h> +#include <asm/processor.h> +#include <asm/global_data.h>  #include <asm/fsl_ifc.h>  #include <asm/io.h> +DECLARE_GLOBAL_DATA_PTR; +  void cpu_init_f(void)  { -#if defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SYS_INIT_L2_ADDR) +#ifdef CONFIG_SYS_INIT_L2_ADDR  	ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR;  	out_be32(&l2cache->l2srbar0, CONFIG_SYS_INIT_L2_ADDR); @@ -40,3 +44,16 @@ void cpu_init_f(void)  		(MPC85xx_L2CTL_L2E | MPC85xx_L2CTL_L2SRAM_ENTIRE));  #endif  } + +#ifndef CONFIG_SYS_FSL_TBCLK_DIV +#define CONFIG_SYS_FSL_TBCLK_DIV 8 +#endif + +void udelay(unsigned long usec) +{ +	u32 ticks_per_usec = gd->bus_clk / (CONFIG_SYS_FSL_TBCLK_DIV * 1000000); +	u32 ticks = ticks_per_usec * usec; +	u32 s = mfspr(SPRN_TBRL); + +	while ((mfspr(SPRN_TBRL) - s) < ticks); +} diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index ac17f9d3c..bb0dc1a65 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -44,6 +44,15 @@  #undef	MSR_KERNEL  #define MSR_KERNEL ( MSR_ME )	/* Machine Check */ +#if defined(CONFIG_NAND_SPL) || \ +	(defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_INIT_MINIMAL)) +#define MINIMAL_SPL +#endif + +#if !defined(CONFIG_SPL) && !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) +#define NOR_BOOT +#endif +  /*   * Set up GOT: Global Offset Table   * @@ -53,7 +62,7 @@  	GOT_ENTRY(_GOT2_TABLE_)  	GOT_ENTRY(_FIXUP_TABLE_) -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	GOT_ENTRY(_start)  	GOT_ENTRY(_start_of_vectors)  	GOT_ENTRY(_end_of_vectors) @@ -282,51 +291,8 @@ l2_disabled:  	isync  	.endm -#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_NAND_SPL) -/* - * TLB entry for debuggging in AS1 - * Create temporary TLB entry in AS0 to handle debug exception - * As on debug exception MSR is cleared i.e. Address space is changed - * to 0. A TLB entry (in AS0) is required to handle debug exception generated - * in AS1. - */ - -#if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) -/* - * TLB entry is created for IVPR + IVOR15 to map on valid OP code address - * bacause flash's virtual address maps to 0xff800000 - 0xffffffff. - * and this window is outside of 4K boot window. - */ -	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ -		0, BOOKE_PAGESZ_4M, \ -		CONFIG_SYS_MONITOR_BASE & 0xffc00000,  MAS2_I|MAS2_G, \ -		0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, \ -		0, r6 - -#elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) -	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ -		0, BOOKE_PAGESZ_1M, \ -		CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ -		CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, \ -		0, r6 -#else -/* - * TLB entry is created for IVPR + IVOR15 to map on valid OP code address - * because "nexti" will resize TLB to 4K - */ -	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ -		0, BOOKE_PAGESZ_256K, \ -		CONFIG_SYS_MONITOR_BASE, MAS2_I, \ -		CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, \ -		0, r6 -#endif -#endif - -/* - * Ne need to setup interrupt vector for NAND SPL - * because NAND SPL never compiles it. - */ -#if !defined(CONFIG_NAND_SPL) +/* Interrupt vectors do not fit in minimal SPL. */ +#if !defined(MINIMAL_SPL)  	/* Setup interrupt vectors */  	lis	r1,CONFIG_SYS_MONITOR_BASE@h  	mtspr	IVPR,r1 @@ -534,10 +500,6 @@ nexti:	mflr	r1		/* R1 = our PC */  	li	r3, 0  	mtspr	MAS1, r3  1:	cmpw	r3, r14 -#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_NAND_SPL) -	cmpwi	cr1, r3, CONFIG_SYS_PPC_E500_DEBUG_TLB -	cror	cr0*4+eq, cr0*4+eq, cr1*4+eq -#endif  	rlwinm	r5, r3, 16, MAS0_ESEL_MSK  	addi	r3, r3, 1  	beq	2f		/* skip the entry we're executing from */ @@ -553,6 +515,46 @@ nexti:	mflr	r1		/* R1 = our PC */  2:	cmpw	r3, r4  	blt	1b +#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(MINIMAL_SPL) +/* + * TLB entry for debuggging in AS1 + * Create temporary TLB entry in AS0 to handle debug exception + * As on debug exception MSR is cleared i.e. Address space is changed + * to 0. A TLB entry (in AS0) is required to handle debug exception generated + * in AS1. + */ + +#ifdef NOR_BOOT +/* + * TLB entry is created for IVPR + IVOR15 to map on valid OP code address + * bacause flash's virtual address maps to 0xff800000 - 0xffffffff. + * and this window is outside of 4K boot window. + */ +	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ +		0, BOOKE_PAGESZ_4M, \ +		CONFIG_SYS_MONITOR_BASE & 0xffc00000,  MAS2_I|MAS2_G, \ +		0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, \ +		0, r6 + +#elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) +	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ +		0, BOOKE_PAGESZ_1M, \ +		CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ +		CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, \ +		0, r6 +#else +/* + * TLB entry is created for IVPR + IVOR15 to map on valid OP code address + * because "nexti" will resize TLB to 4K + */ +	create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, \ +		0, BOOKE_PAGESZ_256K, \ +		CONFIG_SYS_MONITOR_BASE & 0xfffc0000, MAS2_I, \ +		CONFIG_SYS_MONITOR_BASE & 0xfffc0000, MAS3_SX|MAS3_SW|MAS3_SR, \ +		0, r6 +#endif +#endif +  /*   * Relocate CCSR, if necessary.  We relocate CCSR if (obviously) the default   * location is not where we want it.  This typically happens on a 36-bit @@ -1036,7 +1038,7 @@ create_init_ram_area:  	lis     r6,FSL_BOOKE_MAS0(1, 15, 0)@h  	ori     r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l -#if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) +#ifdef NOR_BOOT  	/* create a temp mapping in AS=1 to the 4M boot window */  	create_tlb1_entry 15, \  		1, BOOKE_PAGESZ_4M, \ @@ -1050,8 +1052,8 @@ create_init_ram_area:  	*/  	create_tlb1_entry 15, \  		1, BOOKE_PAGESZ_1M, \ -		CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ -		CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, \ +		CONFIG_SYS_MONITOR_BASE & 0xfff00000, MAS2_I|MAS2_G, \ +		CONFIG_SYS_PBI_FLASH_WINDOW & 0xfff00000, MAS3_SX|MAS3_SW|MAS3_SR, \  		0, r6  #else  	/* @@ -1060,8 +1062,8 @@ create_init_ram_area:  	 */  	create_tlb1_entry 15, \  		1, BOOKE_PAGESZ_1M, \ -		CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ -		CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, \ +		CONFIG_SYS_MONITOR_BASE & 0xfff00000, MAS2_I|MAS2_G, \ +		CONFIG_SYS_MONITOR_BASE & 0xfff00000, MAS3_SX|MAS3_SW|MAS3_SR, \  		0, r6  #endif @@ -1111,7 +1113,8 @@ switch_as:  	bdnz	1b  	/* Jump out the last 4K page and continue to 'normal' start */ -#ifdef CONFIG_SYS_RAMBOOT +#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL) +	/* We assume that we're already running at the address we're linked at */  	b	_start_cont  #else  	/* Calculate absolute address in FLASH and jump there		*/ @@ -1157,7 +1160,7 @@ _start_cont:  	/* NOTREACHED - board_init_f() does not return */ -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	. = EXC_OFF_SYS_RESET  	.globl	_start_of_vectors  _start_of_vectors: @@ -1601,7 +1604,7 @@ in32:  in32r:  	lwbrx	r3,r0,r3  	blr -#endif  /* !CONFIG_NAND_SPL */ +#endif  /* !MINIMAL_SPL */  /*------------------------------------------------------------------------------*/ @@ -1798,7 +1801,7 @@ clear_bss:  	mr	r4,r10		/* Destination Address		*/  	bl	board_init_r -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	/*  	 * Copy exception vector code to low memory  	 * @@ -1971,4 +1974,4 @@ setup_ivors:  #include "fixed_ivor.S"  	blr -#endif /* !CONFIG_NAND_SPL */ +#endif /* !MINIMAL_SPL */ diff --git a/arch/powerpc/cpu/mpc85xx/tlb.c b/arch/powerpc/cpu/mpc85xx/tlb.c index a548dec9a..f44fadcff 100644 --- a/arch/powerpc/cpu/mpc85xx/tlb.c +++ b/arch/powerpc/cpu/mpc85xx/tlb.c @@ -55,7 +55,7 @@ void init_tlbs(void)  	return ;  } -#ifndef CONFIG_NAND_SPL +#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)  void read_tlbcam_entry(int idx, u32 *valid, u32 *tsize, unsigned long *epn,  		       phys_addr_t *rpn)  { @@ -332,4 +332,4 @@ void clear_ddr_tlbs(unsigned int memsize_in_meg)  } -#endif /* !CONFIG_NAND_SPL */ +#endif /* not SPL */ diff --git a/arch/powerpc/cpu/mpc85xx/u-boot-spl.lds b/arch/powerpc/cpu/mpc85xx/u-boot-spl.lds new file mode 100644 index 000000000..1c408e29f --- /dev/null +++ b/arch/powerpc/cpu/mpc85xx/u-boot-spl.lds @@ -0,0 +1,87 @@ +/* + * (C) Copyright 2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de + * + * Copyright 2009 Freescale Semiconductor, Inc. + * + * 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 "config.h"	/* CONFIG_BOARDDIR */ + +OUTPUT_ARCH(powerpc) +SECTIONS +{ +	. = CONFIG_SPL_TEXT_BASE; +	.text : { +		*(.text*) +	} +	_etext = .; + +	.reloc : { +		_GOT2_TABLE_ = .; +		KEEP(*(.got2)) +		KEEP(*(.got)) +		PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4); +		_FIXUP_TABLE_ = .; +		KEEP(*(.fixup)) +	} +	__got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1; +	__fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +	. = ALIGN(8); +	.data : { +		*(.rodata*) +		*(.data*) +		*(.sdata*) +	} +	_edata  =  .; + +	. = ALIGN(8); +	__init_begin = .; +	__init_end = .; +/* FIXME for non-NAND SPL */ +#if defined(CONFIG_FSL_IFC) /* Restrict bootpg at 4K boundry for IFC */ +	.bootpg ADDR(.text) + 0x1000 : +	{ +		start.o	(.bootpg) +	} +#define RESET_VECTOR_OFFSET 0x1ffc /* IFC has 8K sram */ +#elif defined(CONFIG_FSL_ELBC) +#define RESET_VECTOR_OFFSET 0xffc /* LBC has 4k sram */ +#else +#error unknown NAND controller +#endif +	.resetvec ADDR(.text) + RESET_VECTOR_OFFSET : { +		KEEP(*(.resetvec)) +	} = 0xffff + +	/* +	 * Make sure that the bss segment isn't linked at 0x0, otherwise its +	 * address won't be updated during relocation fixups. +	 */ +	. |= 0x10; + +	__bss_start = .; +	.bss : { +		*(.sbss*) +		*(.bss*) +	} +	__bss_end__ = .; +} diff --git a/arch/powerpc/cpu/mpc86xx/ddr-8641.c b/arch/powerpc/cpu/mpc86xx/ddr-8641.c index b8f2c9387..92ba26dc8 100644 --- a/arch/powerpc/cpu/mpc86xx/ddr-8641.c +++ b/arch/powerpc/cpu/mpc86xx/ddr-8641.c @@ -22,10 +22,10 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  	switch (ctrl_num) {  	case 0: -		ddr = (void *)CONFIG_SYS_MPC86xx_DDR_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR;  		break;  	case 1: -		ddr = (void *)CONFIG_SYS_MPC86xx_DDR2_ADDR; +		ddr = (void *)CONFIG_SYS_MPC8xxx_DDR2_ADDR;  		break;  	default:  		printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num); diff --git a/arch/powerpc/cpu/mpc8xxx/Makefile b/arch/powerpc/cpu/mpc8xxx/Makefile index 4ae26e421..3dc8e055b 100644 --- a/arch/powerpc/cpu/mpc8xxx/Makefile +++ b/arch/powerpc/cpu/mpc8xxx/Makefile @@ -10,6 +10,20 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib8xxx.o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifdef MINIMAL + +COBJS-$(CONFIG_FSL_LAW) += law.o + +else +  ifneq ($(CPU),mpc83xx)  COBJS-y	+= cpu.o  endif @@ -18,6 +32,9 @@ COBJS-$(CONFIG_OF_LIBFDT) += fdt.o  COBJS-$(CONFIG_FSL_IFC) += fsl_ifc.o  COBJS-$(CONFIG_FSL_LBC) += fsl_lbc.o  COBJS-$(CONFIG_SYS_SRIO) += srio.o +COBJS-$(CONFIG_FSL_LAW) += law.o + +endif  SRCS	:= $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c index 088cc0e85..8016bcdc2 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c @@ -18,15 +18,7 @@  #include "ddr.h" -#ifdef CONFIG_MPC83xx -	#define _DDR_ADDR CONFIG_SYS_MPC83xx_DDR_ADDR -#elif defined(CONFIG_MPC85xx) -	#define _DDR_ADDR CONFIG_SYS_MPC85xx_DDR_ADDR -#elif defined(CONFIG_MPC86xx) -	#define _DDR_ADDR CONFIG_SYS_MPC86xx_DDR_ADDR -#else -	#error "Undefined _DDR_ADDR" -#endif +#define _DDR_ADDR CONFIG_SYS_MPC8xxx_DDR_ADDR  static u32 fsl_ddr_get_version(void)  { diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/util.c b/arch/powerpc/cpu/mpc8xxx/ddr/util.c index 940ffff77..acfe1f095 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/util.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/util.c @@ -133,14 +133,8 @@ u32 fsl_ddr_get_intl3r(void)  void board_add_ram_info(int use_default)  { -#if defined(CONFIG_MPC83xx) -	immap_t *immap = (immap_t *) CONFIG_SYS_IMMR; -	ccsr_ddr_t *ddr = (void *)&immap->ddr; -#elif defined(CONFIG_MPC85xx) -	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR); -#elif defined(CONFIG_MPC86xx) -	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC86xx_DDR_ADDR); -#endif +	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC8xxx_DDR_ADDR); +  #if	defined(CONFIG_E6500) && (CONFIG_NUM_DDR_CONTROLLERS == 3)  	u32 *mcintl3r = (void *) (CONFIG_SYS_IMMR + 0x18004);  #endif @@ -152,13 +146,13 @@ void board_add_ram_info(int use_default)  #if CONFIG_NUM_DDR_CONTROLLERS >= 2  	if (!(sdram_cfg & SDRAM_CFG_MEM_EN)) { -		ddr = (void __iomem *)CONFIG_SYS_MPC85xx_DDR2_ADDR; +		ddr = (void __iomem *)CONFIG_SYS_MPC8xxx_DDR2_ADDR;  		sdram_cfg = in_be32(&ddr->sdram_cfg);  	}  #endif  #if CONFIG_NUM_DDR_CONTROLLERS >= 3  	if (!(sdram_cfg & SDRAM_CFG_MEM_EN)) { -		ddr = (void __iomem *)CONFIG_SYS_MPC85xx_DDR3_ADDR; +		ddr = (void __iomem *)CONFIG_SYS_MPC8xxx_DDR3_ADDR;  		sdram_cfg = in_be32(&ddr->sdram_cfg);  	}  #endif diff --git a/arch/powerpc/cpu/mpc8xxx/fdt.c b/arch/powerpc/cpu/mpc8xxx/fdt.c index 68db8e244..1986fea03 100644 --- a/arch/powerpc/cpu/mpc8xxx/fdt.c +++ b/arch/powerpc/cpu/mpc8xxx/fdt.c @@ -217,7 +217,7 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)  #if CONFIG_SYS_FSL_SEC_COMPAT == 2 /* SEC 2.x/3.x */  void fdt_fixup_crypto_node(void *blob, int sec_rev)  { -	const struct sec_rev_prop { +	static const struct sec_rev_prop {  		u32 sec_rev;  		u32 num_channels;  		u32 channel_fifo_len; @@ -232,8 +232,8 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev)  		{ 0x0301, 4, 24, 0xbfe, 0x03ab0ebf }, /* SEC 3.1 */  		{ 0x0303, 4, 24, 0x97c, 0x03a30abf }, /* SEC 3.3 */  	}; -	char compat_strlist[ARRAY_SIZE(sec_rev_prop_list) * -			    sizeof("fsl,secX.Y")]; +	static char compat_strlist[ARRAY_SIZE(sec_rev_prop_list) * +				   sizeof("fsl,secX.Y")];  	int crypto_node, sec_idx, err;  	char *p;  	u32 val; diff --git a/arch/powerpc/cpu/mpc8xxx/law.c b/arch/powerpc/cpu/mpc8xxx/law.c new file mode 100644 index 000000000..ce1d71e30 --- /dev/null +++ b/arch/powerpc/cpu/mpc8xxx/law.c @@ -0,0 +1,334 @@ +/* + * Copyright 2008-2011 Freescale Semiconductor, Inc. + * + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.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 <asm/fsl_law.h> +#include <asm/io.h> + +DECLARE_GLOBAL_DATA_PTR; + +#define FSL_HW_NUM_LAWS CONFIG_SYS_FSL_NUM_LAWS + +#ifdef CONFIG_FSL_CORENET +#define LAW_BASE (CONFIG_SYS_FSL_CORENET_CCM_ADDR) +#define LAWAR_ADDR(x) (&((ccsr_local_t *)LAW_BASE)->law[x].lawar) +#define LAWBARH_ADDR(x) (&((ccsr_local_t *)LAW_BASE)->law[x].lawbarh) +#define LAWBARL_ADDR(x) (&((ccsr_local_t *)LAW_BASE)->law[x].lawbarl) +#define LAWBAR_SHIFT 0 +#else +#define LAW_BASE (CONFIG_SYS_IMMR + 0xc08) +#define LAWAR_ADDR(x) ((u32 *)LAW_BASE + 8 * x + 2) +#define LAWBAR_ADDR(x) ((u32 *)LAW_BASE + 8 * x) +#define LAWBAR_SHIFT 12 +#endif + + +static inline phys_addr_t get_law_base_addr(int idx) +{ +#ifdef CONFIG_FSL_CORENET +	return (phys_addr_t) +		((u64)in_be32(LAWBARH_ADDR(idx)) << 32) | +		in_be32(LAWBARL_ADDR(idx)); +#else +	return (phys_addr_t)in_be32(LAWBAR_ADDR(idx)) << LAWBAR_SHIFT; +#endif +} + +static inline void set_law_base_addr(int idx, phys_addr_t addr) +{ +#ifdef CONFIG_FSL_CORENET +	out_be32(LAWBARL_ADDR(idx), addr & 0xffffffff); +	out_be32(LAWBARH_ADDR(idx), (u64)addr >> 32); +#else +	out_be32(LAWBAR_ADDR(idx), addr >> LAWBAR_SHIFT); +#endif +} + +void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if id) +{ +	gd->used_laws |= (1 << idx); + +	out_be32(LAWAR_ADDR(idx), 0); +	set_law_base_addr(idx, addr); +	out_be32(LAWAR_ADDR(idx), LAW_EN | ((u32)id << 20) | (u32)sz); + +	/* Read back so that we sync the writes */ +	in_be32(LAWAR_ADDR(idx)); +} + +void disable_law(u8 idx) +{ +	gd->used_laws &= ~(1 << idx); + +	out_be32(LAWAR_ADDR(idx), 0); +	set_law_base_addr(idx, 0); + +	/* Read back so that we sync the writes */ +	in_be32(LAWAR_ADDR(idx)); + +	return; +} + +#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD) +static int get_law_entry(u8 i, struct law_entry *e) +{ +	u32 lawar; + +	lawar = in_be32(LAWAR_ADDR(i)); + +	if (!(lawar & LAW_EN)) +		return 0; + +	e->addr = get_law_base_addr(i); +	e->size = lawar & 0x3f; +	e->trgt_id = (lawar >> 20) & 0xff; + +	return 1; +} +#endif + +int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id) +{ +	u32 idx = ffz(gd->used_laws); + +	if (idx >= FSL_HW_NUM_LAWS) +		return -1; + +	set_law(idx, addr, sz, id); + +	return idx; +} + +#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD) +int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id) +{ +	u32 idx; + +	/* we have no LAWs free */ +	if (gd->used_laws == -1) +		return -1; + +	/* grab the last free law */ +	idx = __ilog2(~(gd->used_laws)); + +	if (idx >= FSL_HW_NUM_LAWS) +		return -1; + +	set_law(idx, addr, sz, id); + +	return idx; +} + +struct law_entry find_law(phys_addr_t addr) +{ +	struct law_entry entry; +	int i; + +	entry.index = -1; +	entry.addr = 0; +	entry.size = 0; +	entry.trgt_id = 0; + +	for (i = 0; i < FSL_HW_NUM_LAWS; i++) { +		u64 upper; + +		if (!get_law_entry(i, &entry)) +			continue; + +		upper = entry.addr + (2ull << entry.size); +		if ((addr >= entry.addr) && (addr < upper)) { +			entry.index = i; +			break; +		} +	} + +	return entry; +} + +void print_laws(void) +{ +	int i; +	u32 lawar; + +	printf("\nLocal Access Window Configuration\n"); +	for (i = 0; i < FSL_HW_NUM_LAWS; i++) { +		lawar = in_be32(LAWAR_ADDR(i)); +#ifdef CONFIG_FSL_CORENET +		printf("LAWBARH%02d: 0x%08x LAWBARL%02d: 0x%08x", +		       i, in_be32(LAWBARH_ADDR(i)), +		       i, in_be32(LAWBARL_ADDR(i))); +#else +		printf("LAWBAR%02d: 0x%08x", i, in_be32(LAWBAR_ADDR(i))); +#endif +		printf(" LAWAR%02d: 0x%08x\n", i, lawar); +		printf("\t(EN: %d TGT: 0x%02x SIZE: ", +		       (lawar & LAW_EN) ? 1 : 0, (lawar >> 20) & 0xff); +		print_size(lawar_size(lawar), ")\n"); +	} + +	return; +} + +/* use up to 2 LAWs for DDR, used the last available LAWs */ +int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id) +{ +	u64 start_align, law_sz; +	int law_sz_enc; + +	if (start == 0) +		start_align = 1ull << (LAW_SIZE_32G + 1); +	else +		start_align = 1ull << (ffs64(start) - 1); +	law_sz = min(start_align, sz); +	law_sz_enc = __ilog2_u64(law_sz) - 1; + +	if (set_last_law(start, law_sz_enc, id) < 0) +		return -1; + +	/* recalculate size based on what was actually covered by the law */ +	law_sz = 1ull << __ilog2_u64(law_sz); + +	/* do we still have anything to map */ +	sz = sz - law_sz; +	if (sz) { +		start += law_sz; + +		start_align = 1ull << (ffs64(start) - 1); +		law_sz = min(start_align, sz); +		law_sz_enc = __ilog2_u64(law_sz) - 1; + +		if (set_last_law(start, law_sz_enc, id) < 0) +			return -1; +	} else { +		return 0; +	} + +	/* do we still have anything to map */ +	sz = sz - law_sz; +	if (sz) +		return 1; + +	return 0; +} +#endif /* not SPL */ + +void init_laws(void) +{ +	int i; + +#if FSL_HW_NUM_LAWS < 32 +	gd->used_laws = ~((1 << FSL_HW_NUM_LAWS) - 1); +#elif FSL_HW_NUM_LAWS == 32 +	gd->used_laws = 0; +#else +#error FSL_HW_NUM_LAWS can not be greater than 32 w/o code changes +#endif + +	/* +	 * Any LAWs that were set up before we booted assume they are meant to +	 * be around and mark them used. +	 */ +	for (i = 0; i < FSL_HW_NUM_LAWS; i++) { +		u32 lawar = in_be32(LAWAR_ADDR(i)); + +		if (lawar & LAW_EN) +			gd->used_laws |= (1 << i); +	} + +#if (defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)) || \ +	(defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)) +	/* +	 * in SPL boot we've already parsed the law_table and setup those LAWs +	 * so don't do it again. +	 */ +	return; +#endif + +	for (i = 0; i < num_law_entries; i++) { +		if (law_table[i].index == -1) +			set_next_law(law_table[i].addr, law_table[i].size, +					law_table[i].trgt_id); +		else +			set_law(law_table[i].index, law_table[i].addr, +				law_table[i].size, law_table[i].trgt_id); +	} + +#ifdef CONFIG_SRIO_PCIE_BOOT_SLAVE +	/* check RCW to get which port is used for boot */ +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; +	u32 bootloc = in_be32(&gur->rcwsr[6]); +	/* +	 * in SRIO or PCIE boot we need to set specail LAWs for +	 * SRIO or PCIE interfaces. +	 */ +	switch ((bootloc & FSL_CORENET_RCWSR6_BOOT_LOC) >> 23) { +	case 0x0: /* boot from PCIE1 */ +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_1); +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_1); +		break; +	case 0x1: /* boot from PCIE2 */ +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_2); +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_2); +		break; +	case 0x2: /* boot from PCIE3 */ +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_3); +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_PCIE_3); +		break; +	case 0x8: /* boot from SRIO1 */ +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_RIO_1); +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_RIO_1); +		break; +	case 0x9: /* boot from SRIO2 */ +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_RIO_2); +		set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +				LAW_SIZE_1M, +				LAW_TRGT_IF_RIO_2); +		break; +	default: +		break; +	} +#endif + +	return ; +} diff --git a/arch/powerpc/cpu/ppc4xx/usb_ohci.c b/arch/powerpc/cpu/ppc4xx/usb_ohci.c index 4ce272629..f820c37a8 100644 --- a/arch/powerpc/cpu/ppc4xx/usb_ohci.c +++ b/arch/powerpc/cpu/ppc4xx/usb_ohci.c @@ -621,7 +621,7 @@ static ed_t * ep_add_ed (struct usb_device *usb_dev, unsigned long pipe)  			| usb_pipeendpoint (pipe) << 7  			| (usb_pipeisoc (pipe)? 0x8000: 0)  			| (usb_pipecontrol (pipe)? 0: (usb_pipeout (pipe)? 0x800: 0x1000)) -			| usb_pipeslow (pipe) << 13 +			| (usb_dev->speed == USB_SPEED_LOW) << 13  			| usb_maxpacket (usb_dev, pipe) << 16);  	return ed_ret; diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index 03baaee1b..0b9638bce 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -27,6 +27,12 @@  #error "Do not define CONFIG_SYS_CCSRBAR_DEFAULT in the board header file."  #endif +/* + * This macro should be removed when we no longer care about backwards + * compatibility with older operating systems. + */ +#define CONFIG_PPC_SPINTABLE_COMPATIBLE +  #define FSL_DDR_VER_4_7	47  /* Number of TLB CAM entries we have on FSL Book-E chips */ @@ -131,7 +137,6 @@  #define CONFIG_SYS_PPC_E500_DEBUG_TLB	3  #define CONFIG_TSECV2  #define CONFIG_SYS_FSL_SEC_COMPAT	4 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111  #define CONFIG_NUM_DDR_CONTROLLERS	1  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000 @@ -175,7 +180,6 @@  #define CONFIG_SYS_PPC_E500_DEBUG_TLB	2  #define CONFIG_TSECV2  #define CONFIG_SYS_FSL_SEC_COMPAT	2 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000  #define CONFIG_SYS_FSL_ERRATUM_ELBC_A001  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111 @@ -188,7 +192,6 @@  #define CONFIG_SYS_PPC_E500_DEBUG_TLB	3  #define CONFIG_TSECV2  #define CONFIG_SYS_FSL_SEC_COMPAT	4 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111  #define CONFIG_NUM_DDR_CONTROLLERS	1  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000 @@ -242,7 +245,6 @@  #define CONFIG_SYS_PPC_E500_DEBUG_TLB	2  #define CONFIG_TSECV2  #define CONFIG_SYS_FSL_SEC_COMPAT	2 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000  #define CONFIG_SYS_FSL_ERRATUM_ELBC_A001  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111 @@ -318,7 +320,6 @@  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32  #define CONFIG_SYS_FSL_SEC_COMPAT	4 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_NUM_FMAN		1  #define CONFIG_SYS_NUM_FM1_DTSEC	5  #define CONFIG_SYS_NUM_FM1_10GEC	1 @@ -343,6 +344,7 @@  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV2	0x11  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034 +#define CONFIG_SYS_FSL_ERRATUM_A004849  #elif defined(CONFIG_PPC_P3041)  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 @@ -350,7 +352,6 @@  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32  #define CONFIG_SYS_FSL_SEC_COMPAT	4 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_NUM_FMAN		1  #define CONFIG_SYS_NUM_FM1_DTSEC	5  #define CONFIG_SYS_NUM_FM1_10GEC	1 @@ -375,6 +376,7 @@  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV2	0x11  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034 +#define CONFIG_SYS_FSL_ERRATUM_A004849  #elif defined(CONFIG_PPC_P4080) /* also supports P4040 */  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 @@ -417,6 +419,9 @@  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV	0x20  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xff000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034 +#define CONFIG_SYS_FSL_ERRATUM_A004849 +#define CONFIG_SYS_FSL_ERRATUM_A004580 +#define CONFIG_SYS_P4080_ERRATUM_PCIE_A003  #elif defined(CONFIG_PPC_P5020) /* also supports P5010 */  #define CONFIG_SYS_PPC64		/* 64-bit core */ @@ -425,7 +430,6 @@  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32  #define CONFIG_SYS_FSL_SEC_COMPAT	4 -#define CONFIG_FSL_SATA_V2  #define CONFIG_SYS_NUM_FMAN		1  #define CONFIG_SYS_NUM_FM1_DTSEC	5  #define CONFIG_SYS_NUM_FM1_10GEC	1 @@ -449,6 +453,7 @@  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034  #elif defined(CONFIG_PPC_P5040) +#define CONFIG_SYS_PPC64  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1  #define CONFIG_MAX_CPUS			4  #define CONFIG_SYS_FSL_NUM_CC_PLLS	3 @@ -472,7 +477,6 @@  #define CONFIG_SYS_FSL_ERRATUM_DDR_A003  #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474  #define CONFIG_SYS_FSL_ERRATUM_A004699 -#define CONFIG_SYS_FSL_ELBC_MULTIBIT_ECC  #define CONFIG_SYS_FSL_ERRATUM_A004510  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV	0x10  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000 diff --git a/arch/powerpc/include/asm/immap_83xx.h b/arch/powerpc/include/asm/immap_83xx.h index 679832cd6..8ac13fc05 100644 --- a/arch/powerpc/include/asm/immap_83xx.h +++ b/arch/powerpc/include/asm/immap_83xx.h @@ -1035,9 +1035,9 @@ typedef struct immap {  } immap_t;  #endif -#define CONFIG_SYS_MPC83xx_DDR_OFFSET	(0x2000) -#define CONFIG_SYS_MPC83xx_DDR_ADDR \ -			(CONFIG_SYS_IMMR + CONFIG_SYS_MPC83xx_DDR_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR_OFFSET	(0x2000) +#define CONFIG_SYS_MPC8xxx_DDR_ADDR \ +			(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR_OFFSET)  #define CONFIG_SYS_MPC83xx_DMA_OFFSET	(0x8000)  #define CONFIG_SYS_MPC83xx_DMA_ADDR \  			(CONFIG_SYS_IMMR + CONFIG_SYS_MPC83xx_DMA_OFFSET) diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h index 969f726c3..296b54977 100644 --- a/arch/powerpc/include/asm/immap_85xx.h +++ b/arch/powerpc/include/asm/immap_85xx.h @@ -2619,7 +2619,7 @@ typedef struct serdes_corenet {  #define SRDS_PCCR2_RST_XGMII1		0x00800000  #define SRDS_PCCR2_RST_XGMII2		0x00400000  	u32	res5[197]; -	struct { +	struct serdes_lane {  		u32	gcr0;	/* General Control Register 0 */  #define SRDS_GCR0_RRST			0x00400000  #define SRDS_GCR0_1STLANE		0x00010000 @@ -2637,8 +2637,11 @@ typedef struct serdes_corenet {  		u32	res3;  		u32	ttlcr0;	/* Transition Tracking Loop Ctrl 0 */  #define SRDS_TTLCR0_FLT_SEL_MASK	0x3f000000 +#define SRDS_TTLCR0_FLT_SEL_KFR_26	0x10000000 +#define SRDS_TTLCR0_FLT_SEL_KPH_28	0x08000000  #define SRDS_TTLCR0_FLT_SEL_750PPM	0x03000000  #define SRDS_TTLCR0_PM_DIS		0x00004000 +#define SRDS_TTLCR0_FREQOVD_EN		0x00000001  		u32	res4[7];  	} lane[24];  	u32 res6[384]; @@ -2867,9 +2870,9 @@ struct ccsr_pman {  #define CONFIG_SYS_FSL_CORENET_PMAN2_OFFSET	0x5000  #define CONFIG_SYS_FSL_CORENET_PMAN3_OFFSET	0x6000  #endif -#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x8000 -#define CONFIG_SYS_MPC85xx_DDR2_OFFSET		0x9000 -#define CONFIG_SYS_MPC85xx_DDR3_OFFSET		0xA000 +#define CONFIG_SYS_MPC8xxx_DDR_OFFSET		0x8000 +#define CONFIG_SYS_MPC8xxx_DDR2_OFFSET		0x9000 +#define CONFIG_SYS_MPC8xxx_DDR3_OFFSET		0xA000  #define CONFIG_SYS_FSL_CORENET_CLK_OFFSET	0xE1000  #define CONFIG_SYS_FSL_CORENET_RCPM_OFFSET	0xE2000  #define CONFIG_SYS_FSL_CORENET_SERDES_OFFSET	0xEA000 @@ -2929,9 +2932,9 @@ struct ccsr_pman {  #define CONFIG_SYS_FSL_CLUSTER_1_L2_OFFSET	0xC20000  #else  #define CONFIG_SYS_MPC85xx_ECM_OFFSET		0x0000 -#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x2000 +#define CONFIG_SYS_MPC8xxx_DDR_OFFSET		0x2000  #define CONFIG_SYS_MPC85xx_LBC_OFFSET		0x5000 -#define CONFIG_SYS_MPC85xx_DDR2_OFFSET		0x6000 +#define CONFIG_SYS_MPC8xxx_DDR2_OFFSET		0x6000  #define CONFIG_SYS_MPC85xx_ESPI_OFFSET		0x7000  #define CONFIG_SYS_MPC85xx_PCI1_OFFSET		0x8000  #define CONFIG_SYS_MPC85xx_PCIX_OFFSET		0x8000 @@ -2998,12 +3001,12 @@ struct ccsr_pman {  	(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_RCPM_OFFSET)  #define CONFIG_SYS_MPC85xx_ECM_ADDR \  	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_ECM_OFFSET) -#define CONFIG_SYS_MPC85xx_DDR_ADDR \ -	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_DDR_OFFSET) -#define CONFIG_SYS_MPC85xx_DDR2_ADDR \ -	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_DDR2_OFFSET) -#define CONFIG_SYS_MPC85xx_DDR3_ADDR \ -	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_DDR3_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR_ADDR \ +	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR2_ADDR \ +	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR2_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR3_ADDR \ +	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR3_OFFSET)  #define CONFIG_SYS_LBC_ADDR \  	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_LBC_OFFSET)  #define CONFIG_SYS_IFC_ADDR \ diff --git a/arch/powerpc/include/asm/immap_86xx.h b/arch/powerpc/include/asm/immap_86xx.h index cc338e473..2a704fe6b 100644 --- a/arch/powerpc/include/asm/immap_86xx.h +++ b/arch/powerpc/include/asm/immap_86xx.h @@ -1252,10 +1252,10 @@ typedef struct immap {  extern immap_t  *immr; -#define CONFIG_SYS_MPC86xx_DDR_OFFSET	0x2000 -#define CONFIG_SYS_MPC86xx_DDR_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC86xx_DDR_OFFSET) -#define CONFIG_SYS_MPC86xx_DDR2_OFFSET	0x6000 -#define CONFIG_SYS_MPC86xx_DDR2_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC86xx_DDR2_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR_OFFSET	0x2000 +#define CONFIG_SYS_MPC8xxx_DDR_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR_OFFSET) +#define CONFIG_SYS_MPC8xxx_DDR2_OFFSET	0x6000 +#define CONFIG_SYS_MPC8xxx_DDR2_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC8xxx_DDR2_OFFSET)  #define CONFIG_SYS_MPC86xx_DMA_OFFSET	0x21000  #define CONFIG_SYS_MPC86xx_DMA_ADDR	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC86xx_DMA_OFFSET)  #define CONFIG_SYS_MPC86xx_PIC_OFFSET	0x40000 diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 7aa3231ad..19fe25030 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -1342,4 +1342,10 @@ void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);  #endif  #endif /* CONFIG_MACH_SPECIFIC */ +#if defined(CONFIG_MPC85xx) || defined(CONFIG_440) + #define EPAPR_MAGIC	(0x45504150) +#else + #define EPAPR_MAGIC	(0x65504150) +#endif +  #endif /* __ASM_PPC_PROCESSOR_H */ diff --git a/arch/powerpc/include/asm/spl.h b/arch/powerpc/include/asm/spl.h new file mode 100644 index 000000000..f43bc23c9 --- /dev/null +++ b/arch/powerpc/include/asm/spl.h @@ -0,0 +1,31 @@ +/* + * (C) Copyright 2012 + * Texas Instruments, <www.ti.com> + * + * 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	_ASM_SPL_H_ +#define	_ASM_SPL_H_ + +#define BOOT_DEVICE_NOR		1 + +/* Linker symbols */ +extern char __bss_start[], __bss_end__[]; + +#endif diff --git a/arch/powerpc/include/asm/string.h b/arch/powerpc/include/asm/string.h index d912a6b5f..036805ede 100644 --- a/arch/powerpc/include/asm/string.h +++ b/arch/powerpc/include/asm/string.h @@ -14,7 +14,7 @@  #define __HAVE_ARCH_MEMCHR  extern int strcasecmp(const char *, const char *); -extern int strncasecmp(const char *, const char *, int); +extern int strncasecmp(const char *, const char *, __kernel_size_t);  extern char * strcpy(char *,const char *);  extern char * strncpy(char *,const char *, __kernel_size_t);  extern __kernel_size_t strlen(const char *); diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 808021c42..844fe8636 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -38,13 +38,28 @@ endif  LIB	= $(obj)lib$(ARCH).o -SOBJS-y	+= ppccache.o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifdef MINIMAL +COBJS-y += cache.o +else +  SOBJS-y	+= ppcstring.o + +SOBJS-y	+= ppccache.o  SOBJS-y	+= ticks.o  SOBJS-y	+= reloc.o  COBJS-$(CONFIG_BAT_RW) += bat_rw.o +ifndef CONFIG_SPL_BUILD  COBJS-y	+= board.o +endif  COBJS-y	+= bootm.o  COBJS-y	+= cache.o  COBJS-y	+= extable.o @@ -53,6 +68,11 @@ COBJS-$(CONFIG_CMD_KGDB) += kgdb.o  COBJS-${CONFIG_CMD_IDE} += ide.o  COBJS-y	+= time.o +# Don't include the MPC5xxx special memcpy into the +# SPL U-Boot image. memcpy is used in the SPL NOR +# flash driver. And we need the real, fast memcpy +# here. We have no problems with unaligned access. +ifndef CONFIG_SPL_BUILD  # Workaround for local bus unaligned access problems  # on MPC512x and MPC5200  ifdef CONFIG_MPC512X @@ -63,6 +83,13 @@ ifdef CONFIG_MPC5200  $(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy  COBJS-y += memcpy_mpc5200.o  endif +endif + +endif # not minimal + +ifdef CONFIG_SPL_BUILD +COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o +endif  COBJS	+= $(sort $(COBJS-y)) @@ -75,12 +102,6 @@ TARGETS += $(LIB)  all: $(TARGETS)  $(LIB):	$(obj).depend $(OBJS) -	@if ! $(CROSS_COMPILE)readelf -S $(OBJS) | grep -q '\.fixup.*PROGBITS';\ -	then \ -		echo "ERROR: Your compiler doesn't generate .fixup sections!";\ -		echo "       Upgrade to a recent toolchain."; \ -		exit 1; \ -	fi;  	$(call cmd_link_o_target, $(OBJS))  $(LIBGCC): $(obj).depend $(LGOBJS) diff --git a/arch/powerpc/lib/board.c b/arch/powerpc/lib/board.c index 1b051e11c..6a7bf4b6c 100644 --- a/arch/powerpc/lib/board.c +++ b/arch/powerpc/lib/board.c @@ -739,16 +739,13 @@ void board_init_r(gd_t *id, ulong dest_addr)  		flash_size = 0;  	} else if ((flash_size = flash_init()) > 0) {  #ifdef CONFIG_SYS_FLASH_CHECKSUM -		char *s; -  		print_size(flash_size, "");  		/*  		 * Compute and print flash CRC if flashchecksum is set to 'y'  		 *  		 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX  		 */ -		s = getenv("flashchecksum"); -		if (s && (*s == 'y')) { +		if (getenv_yesno("flashchecksum") == 1) {  			printf("  CRC: %08X",  			       crc32(0,  				     (const unsigned char *) @@ -841,9 +838,7 @@ void board_init_r(gd_t *id, ulong dest_addr)  	 * "i2cfast" into account  	 */  	{ -		char *s = getenv("i2cfast"); - -		if (s && ((*s == 'y') || (*s == 'Y'))) { +		if (getenv_yesno("i2cfast") == 1) {  			bd->bi_iic_fast[0] = 1;  			bd->bi_iic_fast[1] = 1;  		} diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c index ac5bd6d4f..7088293a3 100644 --- a/arch/powerpc/lib/bootm.c +++ b/arch/powerpc/lib/bootm.c @@ -87,12 +87,6 @@ static void boot_jump_linux(bootm_headers_t *images)  		 *   r8: 0  		 *   r9: 0  		 */ -#if defined(CONFIG_MPC85xx) || defined(CONFIG_440) - #define EPAPR_MAGIC	(0x45504150) -#else - #define EPAPR_MAGIC	(0x65504150) -#endif -  		debug ("   Booting using OF flat tree...\n");  		WATCHDOG_RESET ();  		(*kernel) ((bd_t *)of_flat_tree, 0, 0, EPAPR_MAGIC, diff --git a/arch/powerpc/lib/spl.c b/arch/powerpc/lib/spl.c new file mode 100644 index 000000000..502c93beb --- /dev/null +++ b/arch/powerpc/lib/spl.c @@ -0,0 +1,42 @@ +/* + * Copyright 2012 Stefan Roese <sr@denx.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. + */ +#include <common.h> +#include <config.h> +#include <spl.h> +#include <image.h> +#include <linux/compiler.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* + * This function jumps to an image with argument. Normally an FDT or ATAGS + * image. + * arg: Pointer to paramter image in RAM + */ +#ifdef CONFIG_SPL_OS_BOOT +void __noreturn jump_to_image_linux(void *arg) +{ +	debug("Entering kernel arg pointer: 0x%p\n", arg); +	typedef void (*image_entry_arg_t)(void *, ulong r4, ulong r5, ulong r6, +					  ulong r7, ulong r8, ulong r9) +		__attribute__ ((noreturn)); +	image_entry_arg_t image_entry = +		(image_entry_arg_t)spl_image.entry_point; + +	image_entry(arg, 0, 0, EPAPR_MAGIC, CONFIG_SYS_BOOTMAPSZ, 0, 0); +} +#endif /* CONFIG_SPL_OS_BOOT */  |