diff options
Diffstat (limited to 'board')
31 files changed, 1233 insertions, 54 deletions
| diff --git a/board/ait/cam_enc_4xx/cam_enc_4xx.c b/board/ait/cam_enc_4xx/cam_enc_4xx.c index 644c44569..80a78221b 100644 --- a/board/ait/cam_enc_4xx/cam_enc_4xx.c +++ b/board/ait/cam_enc_4xx/cam_enc_4xx.c @@ -120,7 +120,7 @@ int board_eth_init(bd_t *bis)  #ifdef CONFIG_NAND_DAVINCI  static int  davinci_std_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, -				   uint8_t *buf, int page) +				   uint8_t *buf, int oob_required, int page)  {  	struct nand_chip *this = mtd->priv;  	int i, eccsize = chip->ecc.size; @@ -167,8 +167,9 @@ davinci_std_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,  	return 0;  } -static void davinci_std_write_page_syndrome(struct mtd_info *mtd, -				    struct nand_chip *chip, const uint8_t *buf) +static int davinci_std_write_page_syndrome(struct mtd_info *mtd, +				    struct nand_chip *chip, const uint8_t *buf, +				    int oob_required)  {  	unsigned char davinci_ecc_buf[NAND_MAX_OOBSIZE];  	struct nand_chip *this = mtd->priv; @@ -218,6 +219,7 @@ static void davinci_std_write_page_syndrome(struct mtd_info *mtd,  	i = mtd->oobsize - (oob - chip->oob_poi);  	if (i)  		chip->write_buf(mtd, oob, i); +	return 0;  }  static int davinci_std_write_oob_syndrome(struct mtd_info *mtd, @@ -239,7 +241,7 @@ static int davinci_std_write_oob_syndrome(struct mtd_info *mtd,  }  static int davinci_std_read_oob_syndrome(struct mtd_info *mtd, -	struct nand_chip *chip, int page, int sndcmd) +	struct nand_chip *chip, int page)  {  	struct nand_chip *this = mtd->priv;  	uint8_t *buf = chip->oob_poi; @@ -249,7 +251,7 @@ static int davinci_std_read_oob_syndrome(struct mtd_info *mtd,  	chip->read_buf(mtd, bufpoi, mtd->oobsize); -	return 1; +	return 0;  }  static void nand_dm365evm_select_chip(struct mtd_info *mtd, int chip) diff --git a/board/atmel/at91sam9n12ek/at91sam9n12ek.c b/board/atmel/at91sam9n12ek/at91sam9n12ek.c index 8752794c8..3013a42a2 100644 --- a/board/atmel/at91sam9n12ek/at91sam9n12ek.c +++ b/board/atmel/at91sam9n12ek/at91sam9n12ek.c @@ -33,6 +33,7 @@  #include <lcd.h>  #include <atmel_hlcdc.h>  #include <atmel_mci.h> +#include <netdev.h>  #ifdef CONFIG_LCD_INFO  #include <nand.h> @@ -190,6 +191,30 @@ int board_mmc_init(bd_t *bd)  }  #endif +#ifdef CONFIG_KS8851_MLL +void at91sam9n12ek_ks8851_hw_init(void) +{ +	struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC; + +	writel(AT91_SMC_SETUP_NWE(2) | AT91_SMC_SETUP_NCS_WR(0) | +	       AT91_SMC_SETUP_NRD(1) | AT91_SMC_SETUP_NCS_RD(0), +	       &smc->cs[2].setup); +	writel(AT91_SMC_PULSE_NWE(7) | AT91_SMC_PULSE_NCS_WR(7) | +	       AT91_SMC_PULSE_NRD(7) | AT91_SMC_PULSE_NCS_RD(7), +	       &smc->cs[2].pulse); +	writel(AT91_SMC_CYCLE_NWE(9) | AT91_SMC_CYCLE_NRD(9), +	       &smc->cs[2].cycle); +	writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE | +	       AT91_SMC_MODE_EXNW_DISABLE | +	       AT91_SMC_MODE_BAT | AT91_SMC_MODE_DBW_16 | +	       AT91_SMC_MODE_TDF_CYCLE(1), +	       &smc->cs[2].mode); + +	/* Configure NCS2 PIN */ +	at91_set_b_periph(AT91_PIO_PORTD, 19, 0); +} +#endif +  int board_early_init_f(void)  {  	/* Enable clocks for all PIOs */ @@ -217,9 +242,20 @@ int board_init(void)  	at91_lcd_hw_init();  #endif +#ifdef CONFIG_KS8851_MLL +	at91sam9n12ek_ks8851_hw_init(); +#endif +  	return 0;  } +#ifdef CONFIG_KS8851_MLL +int board_eth_init(bd_t *bis) +{ +	return ks8851_mll_initialize(0, CONFIG_KS8851_MLL_BASEADDR); +} +#endif +  int dram_init(void)  {  	gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, diff --git a/board/compulab/cm_t35/cm_t35.c b/board/compulab/cm_t35/cm_t35.c index b0b80e5bc..95098af02 100644 --- a/board/compulab/cm_t35/cm_t35.c +++ b/board/compulab/cm_t35/cm_t35.c @@ -120,7 +120,7 @@ static inline int splash_load_from_nand(void)  }  #endif /* CONFIG_CMD_NAND */ -int board_splash_screen_prepare(void) +int splash_screen_prepare(void)  {  	char *env_splashimage_value;  	u32 bmp_load_addr; diff --git a/board/eltec/elppc/misc.c b/board/eltec/elppc/misc.c index 89f1b1d35..4c3656e24 100644 --- a/board/eltec/elppc/misc.c +++ b/board/eltec/elppc/misc.c @@ -207,9 +207,14 @@ int misc_init_r (void)  		buf[4] = eerev.etheraddr[5];  		buf[5] = eerev.etheraddr[4]; -		*(unsigned short *) &buf[20] = 0x48B2; -		*(unsigned short *) &buf[22] = 0x0004; -		*(unsigned short *) &buf[24] = 0x1433; +		buf[20] = 0x48; +		buf[21] = 0xB2; + +		buf[22] = 0x00; +		buf[23] = 0x04; + +		buf[24] = 0x14; +		buf[25] = 0x33;  		printf ("\nSRom:  Writing i82559 info ........ ");  		if (eepro100_srom_store ((unsigned short *) buf) == -1) diff --git a/board/freescale/b4860qds/tlb.c b/board/freescale/b4860qds/tlb.c index 29cc41bfa..1416f98dc 100644 --- a/board/freescale/b4860qds/tlb.c +++ b/board/freescale/b4860qds/tlb.c @@ -52,6 +52,15 @@ struct fsl_e_tlb_entry tlb_table[] = {  	SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L3_ADDR, CONFIG_SYS_INIT_L3_ADDR,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 0, BOOKE_PAGESZ_1M, 1), +#elif defined(CONFIG_SRIO_PCIE_BOOT_SLAVE) +	/* +	 * SRIO_PCIE_BOOT-SLAVE. When slave boot, the address of the +	 * space is at 0xfff00000, it covered the 0xfffff000. +	 */ +	SET_TLB_ENTRY(1, CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR, +		      CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_W|MAS2_G, +		      0, 0, BOOKE_PAGESZ_1M, 1),  #else  	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,  		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, @@ -137,6 +146,16 @@ struct fsl_e_tlb_entry tlb_table[] = {  		MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  		      0, 16, BOOKE_PAGESZ_256M, 1),  #endif +#ifdef CONFIG_SRIO_PCIE_BOOT_SLAVE +	/* +	 * SRIO_PCIE_BOOT-SLAVE. 1M space from 0xffe00000 for +	 * fetching ucode and ENV from master +	 */ +	SET_TLB_ENTRY(1, CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR, +		      CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_G, +		      0, 17, BOOKE_PAGESZ_1M, 1), +#endif  };  int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/board/freescale/bsc9131rdb/Makefile b/board/freescale/bsc9131rdb/Makefile index 6f4cb268f..2e829ad2e 100644 --- a/board/freescale/bsc9131rdb/Makefile +++ b/board/freescale/bsc9131rdb/Makefile @@ -24,12 +24,28 @@ include $(TOPDIR)/config.mk  LIB    = $(obj)lib$(BOARD).o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifdef MINIMAL + +COBJS-y	+= spl_minimal.o tlb.o law.o + +else +  COBJS-y        += $(BOARD).o  COBJS-y        += ddr.o  COBJS-y        += law.o  COBJS-y        += tlb.o  #COBJS-y		+= bsc9131rdb_mux.o +endif +  SRCS   := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS   := $(addprefix $(obj),$(COBJS-y))  SOBJS  := $(addprefix $(obj),$(SOBJS)) diff --git a/board/freescale/bsc9131rdb/README b/board/freescale/bsc9131rdb/README index 065faa378..4902b98ba 100644 --- a/board/freescale/bsc9131rdb/README +++ b/board/freescale/bsc9131rdb/README @@ -89,10 +89,14 @@ NAND boot  Building U-boot  --------------  To build the u-boot for BSC9131RDB: -1. NAND Flash +1. NAND Flash with sysclk 66MHz(J16 on RDB closed, default)  	make BSC9131RDB_NAND -2. SPI Flash +2. NAND Flash with sysclk 100MHz(J16 on RDB open) +	make BSC9131RDB_NAND_SYSCLK100 +3. SPI Flash with sysclk 66MHz(J16 on RDB closed, default)  	make BSC9131RDB_SPIFLASH +4. SPI Flash with sysclk 100MHz(J16 on RDB open) +	make BSC9131RDB_SPIFLASH_SYSCLK100  Memory map  ----------- @@ -107,6 +111,16 @@ Memory map   0xFF70_0000	0xFF7F_FFFF	PA CCSR			1M   0xFF80_0000	0xFFFF_FFFF	Boot Page & NAND Buffer 8M +DDR Memory map +--------------- + 0x0000_0000	0x36FF_FFFF	Memory passed onto Linux + 0x3700_0000	0x37FF_FFFF	PowerPC-DSP shared control area + 0x3800_0000	0x4FFF_FFFF	DSP Private area + + Out of 880M, passed onto Linux, 1hugetlb page of 256M is reserved for + data communcation between PowerPC and DSP core. + Rest is PowerPC private area. +  Flashing Images  ---------------  To place a new u-boot image in the NAND flash and then boot diff --git a/board/freescale/bsc9131rdb/law.c b/board/freescale/bsc9131rdb/law.c index 201c14707..0432780f9 100644 --- a/board/freescale/bsc9131rdb/law.c +++ b/board/freescale/bsc9131rdb/law.c @@ -26,6 +26,10 @@  struct law_entry law_table[] = {  	SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_IFC), +	SET_LAW(CONFIG_SYS_FSL_DSP_CCSRBAR_PHYS, LAW_SIZE_1M, +		LAW_TRGT_IF_DSP_CCSR), +	SET_LAW(CONFIG_SYS_FSL_DSP_M2_RAM_ADDR, LAW_SIZE_16M, +		LAW_TRGT_IF_OCN_DSP),  };  int num_law_entries = ARRAY_SIZE(law_table); diff --git a/board/freescale/bsc9131rdb/spl_minimal.c b/board/freescale/bsc9131rdb/spl_minimal.c new file mode 100644 index 000000000..301115e5e --- /dev/null +++ b/board/freescale/bsc9131rdb/spl_minimal.c @@ -0,0 +1,118 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * + * 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 <ns16550.h> +#include <asm/io.h> +#include <nand.h> +#include <linux/compiler.h> +#include <asm/fsl_law.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/global_data.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Fixed sdram init -- doesn't use serial presence detect. + */ +static void sdram_init(void) +{ +	ccsr_ddr_t *ddr = (ccsr_ddr_t *)CONFIG_SYS_MPC8xxx_DDR_ADDR; + +	__raw_writel(CONFIG_SYS_DDR_CS0_BNDS, &ddr->cs0_bnds); +	__raw_writel(CONFIG_SYS_DDR_CS0_CONFIG, &ddr->cs0_config); +#if CONFIG_CHIP_SELECTS_PER_CTRL > 1 +	__raw_writel(CONFIG_SYS_DDR_CS1_BNDS, &ddr->cs1_bnds); +	__raw_writel(CONFIG_SYS_DDR_CS1_CONFIG, &ddr->cs1_config); +#endif +	__raw_writel(CONFIG_SYS_DDR_TIMING_3_800, &ddr->timing_cfg_3); +	__raw_writel(CONFIG_SYS_DDR_TIMING_0_800, &ddr->timing_cfg_0); +	__raw_writel(CONFIG_SYS_DDR_TIMING_1_800, &ddr->timing_cfg_1); +	__raw_writel(CONFIG_SYS_DDR_TIMING_2_800, &ddr->timing_cfg_2); + +	__raw_writel(CONFIG_SYS_DDR_CONTROL_2, &ddr->sdram_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_MODE_1_800, &ddr->sdram_mode); +	__raw_writel(CONFIG_SYS_DDR_MODE_2_800, &ddr->sdram_mode_2); + +	__raw_writel(CONFIG_SYS_DDR_INTERVAL_800, &ddr->sdram_interval); +	__raw_writel(CONFIG_SYS_DDR_DATA_INIT, &ddr->sdram_data_init); +	__raw_writel(CONFIG_SYS_DDR_CLK_CTRL_800, &ddr->sdram_clk_cntl); + +	__raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL_800, &ddr->ddr_wrlvl_cntl); +	__raw_writel(CONFIG_SYS_DDR_TIMING_4, &ddr->timing_cfg_4); +	__raw_writel(CONFIG_SYS_DDR_TIMING_5, &ddr->timing_cfg_5); +	__raw_writel(CONFIG_SYS_DDR_ZQ_CONTROL, &ddr->ddr_zq_cntl); + +	/* Set, but do not enable the memory */ +	__raw_writel(CONFIG_SYS_DDR_CONTROL & ~SDRAM_CFG_MEM_EN, &ddr->sdram_cfg); + +	asm volatile("sync;isync"); +	udelay(500); + +	/* Let the controller go */ +	out_be32(&ddr->sdram_cfg, in_be32(&ddr->sdram_cfg) | SDRAM_CFG_MEM_EN); + +	set_next_law(CONFIG_SYS_NAND_DDR_LAW, LAW_SIZE_1G, LAW_TRGT_IF_DDR_1); +} + +void board_init_f(ulong bootflag) +{ +	u32 plat_ratio; +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; + +	/* initialize selected port with appropriate baud rate */ +	plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO; +	plat_ratio >>= 1; +	gd->bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio; + +	NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1, +		     gd->bus_clk / 16 / CONFIG_BAUDRATE); + +	puts("\nNAND boot... "); + +	/* Initialize the DDR3 */ +	sdram_init(); + +	/* copy code to RAM and jump to it - this should not return */ +	/* NOTE - code has to be copied out of NAND buffer before +	 * other blocks can be read. +	 */ +	relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE); +} + +void board_init_r(gd_t *gd, ulong dest_addr) +{ +	nand_boot(); +} + +void putc(char c) +{ +	if (c == '\n') +		NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r'); + +	NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c); +} + +void puts(const char *str) +{ +	while (*str) +		putc(*str++); +} diff --git a/board/freescale/bsc9131rdb/tlb.c b/board/freescale/bsc9131rdb/tlb.c index 5b68f4af3..c05a556a3 100644 --- a/board/freescale/bsc9131rdb/tlb.c +++ b/board/freescale/bsc9131rdb/tlb.c @@ -44,15 +44,26 @@ struct fsl_e_tlb_entry tlb_table[] = {  	/* TLB 1 */  	/* *I*** - Covers boot page */  	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, -			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, -			0, 0, BOOKE_PAGESZ_4K, 1), +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 0, BOOKE_PAGESZ_4K, 1), +#ifdef CONFIG_SPL_NAND_MINIMAL +	SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 10, BOOKE_PAGESZ_4K, 1), +#endif  	/* *I*G* - CCSRBAR (PA) */  	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 1, BOOKE_PAGESZ_1M, 1), -#if defined(CONFIG_SYS_RAMBOOT) +	/* CCSRBAR (DSP) */ +	SET_TLB_ENTRY(1, CONFIG_SYS_FSL_DSP_CCSRBAR, +		      CONFIG_SYS_FSL_DSP_CCSRBAR_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 2, BOOKE_PAGESZ_1M, 1), + +#if  defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)  	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,  			MAS3_SX|MAS3_SW|MAS3_SR, 0,  			0, 8, BOOKE_PAGESZ_1G, 1), diff --git a/board/freescale/bsc9132qds/Makefile b/board/freescale/bsc9132qds/Makefile index 267400bec..72b19174b 100644 --- a/board/freescale/bsc9132qds/Makefile +++ b/board/freescale/bsc9132qds/Makefile @@ -24,11 +24,28 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifdef MINIMAL + +COBJS-y	+= spl_minimal.o tlb.o law.o + +else + +  COBJS-y	+= $(BOARD).o  COBJS-y	+= ddr.o  COBJS-y	+= law.o  COBJS-y	+= tlb.o +endif +  SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y))  SOBJS	:= $(addprefix $(obj),$(SOBJS)) diff --git a/board/freescale/bsc9132qds/bsc9132qds.c b/board/freescale/bsc9132qds/bsc9132qds.c index 6e1b55816..ddc9d0a16 100644 --- a/board/freescale/bsc9132qds/bsc9132qds.c +++ b/board/freescale/bsc9132qds/bsc9132qds.c @@ -258,7 +258,7 @@ int misc_init_r(void)  	u8 val;  	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);  	u32 porbmsr = in_be32(&gur->porbmsr); -	u32 romloc = (porbmsr >> MPC85XX_PORBMSR_ROMLOC_SHIFT) & 0xf; +	u32 romloc = (porbmsr >> MPC85xx_PORBMSR_ROMLOC_SHIFT) & 0xf;  	/*Configure 1588 clock-in source from RF Card*/  	val = QIXIS_READ_I2C(brdcfg[5]); @@ -360,7 +360,7 @@ void ft_board_setup(void *blob, bd_t *bd)  	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);  	u32 porbmsr = in_be32(&gur->porbmsr); -	u32 romloc = (porbmsr >> MPC85XX_PORBMSR_ROMLOC_SHIFT) & 0xf; +	u32 romloc = (porbmsr >> MPC85xx_PORBMSR_ROMLOC_SHIFT) & 0xf;  	if (!(hwconfig("uart2") && hwconfig("usb1"))) {  		/* If uart2 is there in hwconfig remove usb node from diff --git a/board/freescale/bsc9132qds/law.c b/board/freescale/bsc9132qds/law.c index dc2365851..b4bce99d3 100644 --- a/board/freescale/bsc9132qds/law.c +++ b/board/freescale/bsc9132qds/law.c @@ -25,11 +25,13 @@  #include <asm/mmu.h>  struct law_entry law_table[] = { -#ifndef CONFIG_SYS_NO_FLASH  	SET_LAW(CONFIG_SYS_FLASH_BASE_PHYS, LAW_SIZE_128M, LAW_TRGT_IF_IFC), -#endif +#ifdef CONFIG_SYS_NAND_BASE_PHYS  	SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_IFC), +#endif +#ifdef CONFIG_SYS_FPGA_BASE_PHYS  	SET_LAW(CONFIG_SYS_FPGA_BASE_PHYS, LAW_SIZE_128K, LAW_TRGT_IF_IFC), +#endif  };  int num_law_entries = ARRAY_SIZE(law_table); diff --git a/board/freescale/bsc9132qds/spl_minimal.c b/board/freescale/bsc9132qds/spl_minimal.c new file mode 100644 index 000000000..62dee52b1 --- /dev/null +++ b/board/freescale/bsc9132qds/spl_minimal.c @@ -0,0 +1,130 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * + * 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 <ns16550.h> +#include <asm/io.h> +#include <nand.h> +#include <linux/compiler.h> +#include <asm/fsl_law.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/global_data.h> + +DECLARE_GLOBAL_DATA_PTR; + +static void sdram_init(void) +{ +	ccsr_ddr_t *ddr = (ccsr_ddr_t *)CONFIG_SYS_MPC8xxx_DDR_ADDR; +#if CONFIG_DDR_CLK_FREQ == 100000000 +	__raw_writel(CONFIG_SYS_DDR_CS0_BNDS, &ddr->cs0_bnds); +	__raw_writel(CONFIG_SYS_DDR_CS0_CONFIG, &ddr->cs0_config); +	__raw_writel(CONFIG_SYS_DDR_CONTROL_800 | SDRAM_CFG_32_BE, &ddr->sdram_cfg); +	__raw_writel(CONFIG_SYS_DDR_CONTROL_2_800, &ddr->sdram_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_DATA_INIT, &ddr->sdram_data_init); + +	__raw_writel(CONFIG_SYS_DDR_TIMING_3_800, &ddr->timing_cfg_3); +	__raw_writel(CONFIG_SYS_DDR_TIMING_0_800, &ddr->timing_cfg_0); +	__raw_writel(CONFIG_SYS_DDR_TIMING_1_800, &ddr->timing_cfg_1); +	__raw_writel(CONFIG_SYS_DDR_TIMING_2_800, &ddr->timing_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_MODE_1_800, &ddr->sdram_mode); +	__raw_writel(CONFIG_SYS_DDR_MODE_2_800, &ddr->sdram_mode_2); +	__raw_writel(CONFIG_SYS_DDR_INTERVAL_800, &ddr->sdram_interval); +	__raw_writel(CONFIG_SYS_DDR_CLK_CTRL_800, &ddr->sdram_clk_cntl); +	__raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL_800, &ddr->ddr_wrlvl_cntl); + +	__raw_writel(CONFIG_SYS_DDR_TIMING_4_800, &ddr->timing_cfg_4); +	__raw_writel(CONFIG_SYS_DDR_TIMING_5_800, &ddr->timing_cfg_5); +	__raw_writel(CONFIG_SYS_DDR_ZQ_CONTROL, &ddr->ddr_zq_cntl); +#elif CONFIG_DDR_CLK_FREQ == 133000000 +	__raw_writel(CONFIG_SYS_DDR_CS0_BNDS, &ddr->cs0_bnds); +	__raw_writel(CONFIG_SYS_DDR_CS0_CONFIG, &ddr->cs0_config); +	__raw_writel(CONFIG_SYS_DDR_CONTROL_1333 | SDRAM_CFG_32_BE, &ddr->sdram_cfg); +	__raw_writel(CONFIG_SYS_DDR_CONTROL_2_1333, &ddr->sdram_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_DATA_INIT, &ddr->sdram_data_init); + +	__raw_writel(CONFIG_SYS_DDR_TIMING_3_1333, &ddr->timing_cfg_3); +	__raw_writel(CONFIG_SYS_DDR_TIMING_0_1333, &ddr->timing_cfg_0); +	__raw_writel(CONFIG_SYS_DDR_TIMING_1_1333, &ddr->timing_cfg_1); +	__raw_writel(CONFIG_SYS_DDR_TIMING_2_1333, &ddr->timing_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_MODE_1_1333, &ddr->sdram_mode); +	__raw_writel(CONFIG_SYS_DDR_MODE_2_1333, &ddr->sdram_mode_2); +	__raw_writel(CONFIG_SYS_DDR_INTERVAL_1333, &ddr->sdram_interval); +	__raw_writel(CONFIG_SYS_DDR_CLK_CTRL_1333, &ddr->sdram_clk_cntl); +	__raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL_1333, &ddr->ddr_wrlvl_cntl); + +	__raw_writel(CONFIG_SYS_DDR_TIMING_4_1333, &ddr->timing_cfg_4); +	__raw_writel(CONFIG_SYS_DDR_TIMING_5_1333, &ddr->timing_cfg_5); +	__raw_writel(CONFIG_SYS_DDR_ZQ_CONTROL, &ddr->ddr_zq_cntl); +#else +	puts("Not a valid DDR Freq Found! Please Reset\n"); +#endif +	asm volatile("sync;isync"); +	udelay(500); + +	/* Let the controller go */ +	out_be32(&ddr->sdram_cfg, in_be32(&ddr->sdram_cfg) | SDRAM_CFG_MEM_EN); + +	set_next_law(CONFIG_SYS_NAND_DDR_LAW, LAW_SIZE_1G, LAW_TRGT_IF_DDR_1); +} + +void board_init_f(ulong bootflag) +{ +	u32 plat_ratio; +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; + +	/* initialize selected port with appropriate baud rate */ +	plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO; +	plat_ratio >>= 1; +	gd->bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio; + +	NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1, +		     gd->bus_clk / 16 / CONFIG_BAUDRATE); + +	puts("\nNAND boot... "); + +	/* Initialize the DDR3 */ +	sdram_init(); + +	/* copy code to RAM and jump to it - this should not return */ +	/* NOTE - code has to be copied out of NAND buffer before +	 * other blocks can be read. +	 */ +	relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE); +} + +void board_init_r(gd_t *gd, ulong dest_addr) +{ +	nand_boot(); +} + +void putc(char c) +{ +	if (c == '\n') +		NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r'); + +	NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c); +} + +void puts(const char *str) +{ +	while (*str) +		putc(*str++); +} diff --git a/board/freescale/bsc9132qds/tlb.c b/board/freescale/bsc9132qds/tlb.c index 0e4545fb1..0ec9a851a 100644 --- a/board/freescale/bsc9132qds/tlb.c +++ b/board/freescale/bsc9132qds/tlb.c @@ -44,14 +44,20 @@ struct fsl_e_tlb_entry tlb_table[] = {  	/* TLB 1 */  	/* *I*** - Covers boot page */  	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, -			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, -			0, 0, BOOKE_PAGESZ_4K, 1), +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 0, BOOKE_PAGESZ_4K, 1), +#ifdef CONFIG_SPL_NAND_MINIMAL +	SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 10, BOOKE_PAGESZ_4K, 1), +#endif  	/* *I*G* - CCSRBAR (PA) */  	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 1, BOOKE_PAGESZ_1M, 1), +#ifndef CONFIG_SPL_BUILD  	SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS,  			MAS3_SX|MAS3_SR, MAS2_W|MAS2_G,  			0, 3, BOOKE_PAGESZ_64M, 1), @@ -61,12 +67,6 @@ struct fsl_e_tlb_entry tlb_table[] = {  			MAS3_SX|MAS3_SR, MAS2_W|MAS2_G,  			0, 4, BOOKE_PAGESZ_64M, 1), -#if defined(CONFIG_SYS_RAMBOOT) -	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE, -			MAS3_SX|MAS3_SW|MAS3_SR, 0, -			0, 8, BOOKE_PAGESZ_1G, 1), -#endif -  #ifdef CONFIG_PCI  	/* *I*G* - PCI */  	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_PHYS, @@ -78,15 +78,26 @@ struct fsl_e_tlb_entry tlb_table[] = {  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 7, BOOKE_PAGESZ_64K, 1),  #endif +#endif + +#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL) +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 8, BOOKE_PAGESZ_1G, 1), +#endif +#ifdef CONFIG_SYS_FPGA_BASE  		/* *I*G - Board FPGA  */  	SET_TLB_ENTRY(1, CONFIG_SYS_FPGA_BASE, CONFIG_SYS_FPGA_BASE_PHYS,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 9, BOOKE_PAGESZ_256K, 1), +#endif +#ifdef CONFIG_SYS_NAND_BASE_PHYS  	SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 5, BOOKE_PAGESZ_1M, 1), +#endif  };  int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/board/freescale/common/Makefile b/board/freescale/common/Makefile index 72bb56cac..37236d072 100644 --- a/board/freescale/common/Makefile +++ b/board/freescale/common/Makefile @@ -29,6 +29,15 @@ endif  LIB	= $(obj)libfreescale.o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifndef MINIMAL  COBJS-$(CONFIG_FSL_CADMUS)	+= cadmus.o  COBJS-$(CONFIG_FSL_VIA)		+= cds_via.o  COBJS-$(CONFIG_FMAN_ENET)	+= fman.o @@ -68,6 +77,7 @@ SUBLIB-$(CONFIG_P3041DS)	+= p_corenet/libp_corenet.o  SUBLIB-$(CONFIG_P4080DS)	+= p_corenet/libp_corenet.o  SUBLIB-$(CONFIG_P5020DS)	+= p_corenet/libp_corenet.o  SUBLIB-$(CONFIG_P5040DS)	+= p_corenet/libp_corenet.o +endif  SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y)) diff --git a/board/freescale/common/pixis.c b/board/freescale/common/pixis.c index 8d07061c3..fbb709de1 100644 --- a/board/freescale/common/pixis.c +++ b/board/freescale/common/pixis.c @@ -480,6 +480,7 @@ static int pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const ar  	    ||	unknown_param) {  #ifdef CONFIG_SYS_LONGHELP  		puts(cmdtp->help); +		putc('\n');  #endif  		return 1;  	} @@ -512,6 +513,7 @@ static int pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const ar  		      && set_px_mpxpll(mpxpll))) {  #ifdef CONFIG_SYS_LONGHELP  			puts(cmdtp->help); +			putc('\n');  #endif  			return 1;  		} diff --git a/board/freescale/p1010rdb/Makefile b/board/freescale/p1010rdb/Makefile index 4c705b627..e6563be09 100644 --- a/board/freescale/p1010rdb/Makefile +++ b/board/freescale/p1010rdb/Makefile @@ -24,11 +24,27 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif + +ifdef MINIMAL + +COBJS-y	+= spl_minimal.o tlb.o law.o + +else +  COBJS-y	+= $(BOARD).o  COBJS-y	+= ddr.o  COBJS-y	+= law.o  COBJS-y	+= tlb.o +endif +  SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y))  SOBJS	:= $(addprefix $(obj),$(SOBJS)) diff --git a/board/freescale/p1010rdb/spl_minimal.c b/board/freescale/p1010rdb/spl_minimal.c new file mode 100644 index 000000000..c909e0ee3 --- /dev/null +++ b/board/freescale/p1010rdb/spl_minimal.c @@ -0,0 +1,143 @@ +/* + * Copyright 2011 Freescale Semiconductor, Inc. + * + * 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 <mpc85xx.h> +#include <asm/io.h> +#include <ns16550.h> +#include <nand.h> +#include <asm/mmu.h> +#include <asm/immap_85xx.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/fsl_law.h> +#include <asm/global_data.h> + +DECLARE_GLOBAL_DATA_PTR; + + +void sdram_init(void) +{ +	ccsr_ddr_t *ddr = (ccsr_ddr_t *)CONFIG_SYS_MPC8xxx_DDR_ADDR; +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; +	u32 ddr_ratio; +	unsigned long ddr_freq_mhz; + +	ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO; +	ddr_ratio = ddr_ratio >> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT; +	ddr_freq_mhz = (CONFIG_SYS_CLK_FREQ * ddr_ratio) / 0x1000000; + +	/* mask off E bit */ +	u32 svr = SVR_SOC_VER(mfspr(SPRN_SVR)); + +	__raw_writel(CONFIG_SYS_DDR_CONTROL | SDRAM_CFG_32_BE, &ddr->sdram_cfg); +	__raw_writel(CONFIG_SYS_DDR_CS0_BNDS, &ddr->cs0_bnds); +	__raw_writel(CONFIG_SYS_DDR_CS0_CONFIG, &ddr->cs0_config); +	__raw_writel(CONFIG_SYS_DDR_CONTROL_2, &ddr->sdram_cfg_2); +	__raw_writel(CONFIG_SYS_DDR_DATA_INIT, &ddr->sdram_data_init); + +	if (ddr_freq_mhz < 700) { +		__raw_writel(CONFIG_SYS_DDR_TIMING_3_667, &ddr->timing_cfg_3); +		__raw_writel(CONFIG_SYS_DDR_TIMING_0_667, &ddr->timing_cfg_0); +		__raw_writel(CONFIG_SYS_DDR_TIMING_1_667, &ddr->timing_cfg_1); +		__raw_writel(CONFIG_SYS_DDR_TIMING_2_667, &ddr->timing_cfg_2); +		__raw_writel(CONFIG_SYS_DDR_MODE_1_667, &ddr->sdram_mode); +		__raw_writel(CONFIG_SYS_DDR_MODE_2_667, &ddr->sdram_mode_2); +		__raw_writel(CONFIG_SYS_DDR_INTERVAL_667, &ddr->sdram_interval); +		__raw_writel(CONFIG_SYS_DDR_CLK_CTRL_667, &ddr->sdram_clk_cntl); +		__raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL_667, &ddr->ddr_wrlvl_cntl); +	} else { +		__raw_writel(CONFIG_SYS_DDR_TIMING_3_800, &ddr->timing_cfg_3); +		__raw_writel(CONFIG_SYS_DDR_TIMING_0_800, &ddr->timing_cfg_0); +		__raw_writel(CONFIG_SYS_DDR_TIMING_1_800, &ddr->timing_cfg_1); +		__raw_writel(CONFIG_SYS_DDR_TIMING_2_800, &ddr->timing_cfg_2); +		__raw_writel(CONFIG_SYS_DDR_MODE_1_800, &ddr->sdram_mode); +		__raw_writel(CONFIG_SYS_DDR_MODE_2_800, &ddr->sdram_mode_2); +		__raw_writel(CONFIG_SYS_DDR_INTERVAL_800, &ddr->sdram_interval); +		__raw_writel(CONFIG_SYS_DDR_CLK_CTRL_800, &ddr->sdram_clk_cntl); +		__raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL_800, &ddr->ddr_wrlvl_cntl); +	} + +	__raw_writel(CONFIG_SYS_DDR_TIMING_4, &ddr->timing_cfg_4); +	__raw_writel(CONFIG_SYS_DDR_TIMING_5, &ddr->timing_cfg_5); +	__raw_writel(CONFIG_SYS_DDR_ZQ_CONTROL, &ddr->ddr_zq_cntl); + +	/* P1014 and it's derivatives support max 16bit DDR width */ +	if (svr == SVR_P1014) { +		__raw_writel(ddr->sdram_cfg & ~SDRAM_CFG_DBW_MASK, &ddr->sdram_cfg); +		__raw_writel(ddr->sdram_cfg | SDRAM_CFG_16_BE, &ddr->sdram_cfg); +		/* For CS0_BNDS we divide the start and end address by 2, so we can just +		 * shift the entire register to achieve the desired result and the mask +		 * the value so we don't write reserved fields */ +		__raw_writel((CONFIG_SYS_DDR_CS0_BNDS >> 1) & 0x0fff0fff, &ddr->cs0_bnds); +	} + +	asm volatile("sync;isync"); +	udelay(500); + +	/* Let the controller go */ +	out_be32(&ddr->sdram_cfg, in_be32(&ddr->sdram_cfg) | SDRAM_CFG_MEM_EN); + +	set_next_law(CONFIG_SYS_NAND_DDR_LAW, LAW_SIZE_1G, LAW_TRGT_IF_DDR_1); +} + +void board_init_f(ulong bootflag) +{ +	u32 plat_ratio; +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; + +	/* initialize selected port with appropriate baud rate */ +	plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO; +	plat_ratio >>= 1; +	gd->bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio; + +	NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1, +			gd->bus_clk / 16 / CONFIG_BAUDRATE); + +	puts("\nNAND boot... "); + +	/* Initialize the DDR3 */ +	sdram_init(); + +	/* copy code to RAM and jump to it - this should not return */ +	/* NOTE - code has to be copied out of NAND buffer before +	 * other blocks can be read. +	 */ + +	relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE); +} + +void board_init_r(gd_t *gd, ulong dest_addr) +{ +	nand_boot(); +} + +void putc(char c) +{ +	if (c == '\n') +		NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r'); + +	NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c); +} + +void puts(const char *str) +{ +	while (*str) +		putc(*str++); +} diff --git a/board/freescale/p1010rdb/tlb.c b/board/freescale/p1010rdb/tlb.c index 4256bf4e5..078717a5b 100644 --- a/board/freescale/p1010rdb/tlb.c +++ b/board/freescale/p1010rdb/tlb.c @@ -44,15 +44,20 @@ struct fsl_e_tlb_entry tlb_table[] = {  	/* TLB 1 */  	/* *I*** - Covers boot page */  	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, -			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, -			0, 0, BOOKE_PAGESZ_4K, 1), +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 0, BOOKE_PAGESZ_4K, 1), +#ifdef CONFIG_SPL_NAND_MINIMAL +	SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 10, BOOKE_PAGESZ_4K, 1), +#endif  	/* *I*G* - CCSRBAR */  	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,  			MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 1, BOOKE_PAGESZ_1M, 1), -#ifndef CONFIG_NAND_SPL +#ifndef CONFIG_SPL_BUILD  #ifndef CONFIG_SDCARD  	SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS,  			MAS3_SX|MAS3_SR, MAS2_W|MAS2_G, @@ -88,7 +93,7 @@ struct fsl_e_tlb_entry tlb_table[] = {  			0, 7, BOOKE_PAGESZ_1M, 1),  #endif -#if defined(CONFIG_SYS_RAMBOOT) +#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)  	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,  			MAS3_SX|MAS3_SW|MAS3_SR, 0,  			0, 8, BOOKE_PAGESZ_1G, 1) diff --git a/board/freescale/p1023rdb/Makefile b/board/freescale/p1023rdb/Makefile new file mode 100644 index 000000000..45c4f8b7c --- /dev/null +++ b/board/freescale/p1023rdb/Makefile @@ -0,0 +1,33 @@ +# +# Copyright 2013 Freescale Semiconductor, Inc. +# +# 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. +# + +include $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(BOARD).o + +COBJS-y	+= $(BOARD).o +COBJS-y	+= ddr.o +COBJS-y	+= law.o +COBJS-y	+= tlb.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS-y)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/p1023rdb/ddr.c b/board/freescale/p1023rdb/ddr.c new file mode 100644 index 000000000..7ed275ade --- /dev/null +++ b/board/freescale/p1023rdb/ddr.c @@ -0,0 +1,105 @@ +/* + * Copyright 2013 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 <common.h> +#include <asm/mmu.h> +#include <asm/immap_85xx.h> +#include <asm/processor.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/fsl_ddr_dimm_params.h> +#include <asm/io.h> +#include <asm/fsl_law.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* CONFIG_SYS_DDR_RAW_TIMING */ +/* + * Hynix H5TQ1G83TFR-H9C + */ +dimm_params_t ddr_raw_timing = { +	.n_ranks = 1, +	.rank_density = 536870912u, +	.capacity = 536870912u, +	.primary_sdram_width = 32, +	.ec_sdram_width = 0, +	.registered_dimm = 0, +	.mirrored_dimm = 0, +	.n_row_addr = 14, +	.n_col_addr = 10, +	.n_banks_per_sdram_device = 8, +	.edc_config = 0, +	.burst_lengths_bitmask = 0x0c, + +	.tCKmin_X_ps = 1875, +	.caslat_X = 0x1e << 4,	/* 5,6,7,8 */ +	.tAA_ps = 13125, +	.tWR_ps = 18000, +	.tRCD_ps = 13125, +	.tRRD_ps = 7500, +	.tRP_ps = 13125, +	.tRAS_ps = 37500, +	.tRC_ps = 50625, +	.tRFC_ps = 160000, +	.tWTR_ps = 7500, +	.tRTP_ps = 7500, +	.refresh_rate_ps = 7800000, +	.tFAW_ps = 37500, +}; + +int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, +		unsigned int controller_number, +		unsigned int dimm_number) +{ +	const char dimm_model[] = "Fixed DDR on board"; + +	if ((controller_number == 0) && (dimm_number == 0)) { +		memcpy(pdimm, &ddr_raw_timing, sizeof(dimm_params_t)); +		memset(pdimm->mpart, 0, sizeof(pdimm->mpart)); +		memcpy(pdimm->mpart, dimm_model, sizeof(dimm_model) - 1); +	} + +	return 0; +} + +void fsl_ddr_board_options(memctl_options_t *popts, +				dimm_params_t *pdimm, +				unsigned int ctrl_num) +{ +	int i; +	popts->clk_adjust = 6; +	popts->cpo_override = 0x1f; +	popts->write_data_delay = 2; +	popts->half_strength_driver_enable = 1; +	/* Write leveling override */ +	popts->wrlvl_en = 1; +	popts->wrlvl_override = 1; +	popts->wrlvl_sample = 0xf; +	popts->wrlvl_start = 0x8; +	popts->trwt_override = 1; +	popts->trwt = 0; + +	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { +		popts->cs_local_opts[i].odt_rd_cfg = FSL_DDR_ODT_NEVER; +		popts->cs_local_opts[i].odt_wr_cfg = FSL_DDR_ODT_CS; +	} +} + diff --git a/board/freescale/p1023rdb/law.c b/board/freescale/p1023rdb/law.c new file mode 100644 index 000000000..331662cfc --- /dev/null +++ b/board/freescale/p1023rdb/law.c @@ -0,0 +1,34 @@ +/* + * Copyright 2013 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 <common.h> +#include <asm/fsl_law.h> +#include <asm/mmu.h> + +struct law_entry law_table[] = { +	SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_LBC), +	SET_LAW(CONFIG_SYS_QMAN_MEM_PHYS, LAW_SIZE_4M, +		LAW_TRGT_IF_DPAA_SWP_SRAM), +	SET_LAW(CONFIG_SYS_FLASH_BASE_PHYS, LAW_SIZE_256M, LAW_TRGT_IF_LBC), +}; + +int num_law_entries = ARRAY_SIZE(law_table); diff --git a/board/freescale/p1023rdb/p1023rdb.c b/board/freescale/p1023rdb/p1023rdb.c new file mode 100644 index 000000000..918398bd8 --- /dev/null +++ b/board/freescale/p1023rdb/p1023rdb.c @@ -0,0 +1,161 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * + * Authors:  Roy Zang <tie-fei.zang@freescale.com> + *           Chunhe Lan <Chunhe.Lan@freescale.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 + */ + +#include <common.h> +#include <command.h> +#include <pci.h> +#include <asm/io.h> +#include <asm/cache.h> +#include <asm/processor.h> +#include <asm/mmu.h> +#include <asm/immap_85xx.h> +#include <asm/fsl_pci.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/fsl_portals.h> +#include <libfdt.h> +#include <fdt_support.h> +#include <netdev.h> +#include <malloc.h> +#include <fm_eth.h> +#include <fsl_mdio.h> +#include <miiphy.h> +#include <phy.h> +#include <asm/fsl_dtsec.h> + +DECLARE_GLOBAL_DATA_PTR; + +int board_early_init_f(void) +{ +	fsl_lbc_t *lbc = LBC_BASE_ADDR; + +	/* Set ABSWP to implement conversion of addresses in the LBC */ +	setbits_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR); + +	return 0; +} + +int checkboard(void) +{ +	printf("Board: P1023 RDB\n"); + +	return 0; +} + +#ifdef CONFIG_PCI +void pci_init_board(void) +{ +	fsl_pcie_init_board(0); +} +#endif + +int board_early_init_r(void) +{ +	const unsigned int flashbase = CONFIG_SYS_FLASH_BASE; +	const u8 flash_esel = find_tlb_idx((void *)flashbase, 1); + +	/* +	 * Remap Boot flash + PROMJET region to caching-inhibited +	 * so that flash can be erased properly. +	 */ + +	/* Flush d-cache and invalidate i-cache of any FLASH data */ +	flush_dcache(); +	invalidate_icache(); + +	/* invalidate existing TLB entry for flash + promjet */ +	disable_tlb(flash_esel); + +	set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, +		MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		0, flash_esel, BOOKE_PAGESZ_256M, 1); + +	setup_portals(); + +	return 0; +} + +unsigned long get_board_sys_clk(ulong dummy) +{ +	return gd->bus_clk; +} + +unsigned long get_board_ddr_clk(ulong dummy) +{ +	return gd->mem_clk; +} + +int board_eth_init(bd_t *bis) +{ +	ccsr_gur_t *gur = (ccsr_gur_t *)CONFIG_SYS_MPC85xx_GUTS_ADDR; +	struct fsl_pq_mdio_info dtsec_mdio_info; + +	/* +	 * Need to set dTSEC 1 pin multiplexing to TSEC. The default setting +	 * is not correct. +	 */ +	setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_TSEC1_1); + +	dtsec_mdio_info.regs = +		(struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; +	dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; + +	/* Register the 1G MDIO bus */ +	fsl_pq_mdio_init(bis, &dtsec_mdio_info); + +	fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); +	fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); + +	fm_info_set_mdio(FM1_DTSEC1, +			 miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); +	fm_info_set_mdio(FM1_DTSEC2, +			 miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); + +#ifdef CONFIG_FMAN_ENET +	cpu_eth_init(bis); +#endif + +	return pci_eth_init(bis); +} + +#if defined(CONFIG_OF_BOARD_SETUP) +void ft_board_setup(void *blob, bd_t *bd) +{ +	phys_addr_t base; +	phys_size_t size; + +	ft_cpu_setup(blob, bd); + +	base = getenv_bootm_low(); +	size = getenv_bootm_size(); + +	fdt_fixup_memory(blob, (u64)base, (u64)size); + +#ifdef CONFIG_HAS_FSL_DR_USB +	fdt_fixup_dr_usb(blob, bd); +#endif + +	fdt_fixup_fman_ethernet(blob); +} +#endif diff --git a/board/freescale/p1023rdb/tlb.c b/board/freescale/p1023rdb/tlb.c new file mode 100644 index 000000000..3417c0f01 --- /dev/null +++ b/board/freescale/p1023rdb/tlb.c @@ -0,0 +1,115 @@ +/* + * Copyright 2013 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 <common.h> +#include <asm/mmu.h> + +struct fsl_e_tlb_entry tlb_table[] = { +	/* TLB 0 - for temp stack in cache */ +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 0, BOOKE_PAGESZ_4K, 0), +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024, +		      CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 0, BOOKE_PAGESZ_4K, 0), +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024, +		      CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 0, BOOKE_PAGESZ_4K, 0), +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024, +		      CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 0, BOOKE_PAGESZ_4K, 0), + +	/* TLB 1 */ +	/* *I*** - Covers boot page */ +	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I, +		      0, 0, BOOKE_PAGESZ_4K, 1), + +	/* *I*G* - CCSRBAR */ +	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 1, BOOKE_PAGESZ_4M, 1), + +	/* W**G* - Flash, localbus */ +	/* This will be changed to *I*G* after relocation to RAM. */ +	SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_W|MAS2_G, +		      0, 2, BOOKE_PAGESZ_256M, 1), + +	/* *I*G* - PCI */ +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 3, BOOKE_PAGESZ_1G, 1), + +	/* *I*G* - PCI */ +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT + 0x40000000, +		      CONFIG_SYS_PCIE3_MEM_PHYS + 0x40000000, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 4, BOOKE_PAGESZ_256M, 1), + +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT + 0x50000000, +		      CONFIG_SYS_PCIE3_MEM_PHYS + 0x50000000, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 5, BOOKE_PAGESZ_256M, 1), + +	/* *I*G* - PCI I/O */ +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 6, BOOKE_PAGESZ_256K, 1), + +	/* Bman/Qman */ +	SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE, CONFIG_SYS_BMAN_MEM_PHYS, +		      MAS3_SW|MAS3_SR, 0, +		      0, 7, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE + 0x00100000, +		      CONFIG_SYS_BMAN_MEM_PHYS + 0x00100000, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 8, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE, CONFIG_SYS_QMAN_MEM_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_M, +		      0, 9, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE + 0x00100000, +		      CONFIG_SYS_QMAN_MEM_PHYS + 0x00100000, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 10, BOOKE_PAGESZ_1M, 1), + +	SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS, +		      MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 11, BOOKE_PAGESZ_16K, 1), + +#ifdef CONFIG_SYS_RAMBOOT +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, +		      CONFIG_SYS_DDR_SDRAM_BASE, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 12, BOOKE_PAGESZ_256M, 1), + +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000, +		      CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 13, BOOKE_PAGESZ_256M, 1), +#endif +}; + +int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/board/freescale/t4qds/tlb.c b/board/freescale/t4qds/tlb.c index 92c01cf95..a138d5a9e 100644 --- a/board/freescale/t4qds/tlb.c +++ b/board/freescale/t4qds/tlb.c @@ -55,6 +55,15 @@ struct fsl_e_tlb_entry tlb_table[] = {  	SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L3_ADDR, CONFIG_SYS_INIT_L3_ADDR,  			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  			0, 0, BOOKE_PAGESZ_1M, 1), +#elif defined(CONFIG_SRIO_PCIE_BOOT_SLAVE) +	/* +	 * SRIO_PCIE_BOOT-SLAVE. When slave boot, the address of the +	 * space is at 0xfff00000, it covered the 0xfffff000. +	 */ +	SET_TLB_ENTRY(1, CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR, +		      CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_W|MAS2_G, +		      0, 0, BOOKE_PAGESZ_1M, 1),  #else  	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,  		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, @@ -130,6 +139,16 @@ struct fsl_e_tlb_entry tlb_table[] = {  	SET_TLB_ENTRY(1, QIXIS_BASE, QIXIS_BASE_PHYS,  		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,  		      0, 17, BOOKE_PAGESZ_4K, 1), +#ifdef CONFIG_SRIO_PCIE_BOOT_SLAVE +	/* +	 * SRIO_PCIE_BOOT-SLAVE. 1M space from 0xffe00000 for +	 * fetching ucode and ENV from master +	 */ +	SET_TLB_ENTRY(1, CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR, +		      CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_G, +		      0, 18, BOOKE_PAGESZ_1M, 1), +#endif  }; diff --git a/board/ifm/ac14xx/ac14xx.c b/board/ifm/ac14xx/ac14xx.c index 74425912d..dc2aff099 100644 --- a/board/ifm/ac14xx/ac14xx.c +++ b/board/ifm/ac14xx/ac14xx.c @@ -23,6 +23,10 @@  #include <i2c.h>  #endif +static int eeprom_diag; +static int mac_diag; +static int gpio_diag; +  DECLARE_GLOBAL_DATA_PTR;  static void gpio_configure(void) @@ -37,7 +41,7 @@ static void gpio_configure(void)  	/*  	 * out_be32(&gpioregs->gpdir, 0xC2293020); -	 * workaround for a hardware affect: configure direction in pieces, +	 * workaround for a hardware effect: configure direction in pieces,  	 * setting all outputs at once drops the reset line too low and  	 * makes us lose the MII connection (breaks ethernet for us)  	 */ @@ -126,8 +130,6 @@ static u32 gpio_querykbd(void)  /* excerpt from the recovery's hw_info.h */ -static int eeprom_diag = 1; -  struct __attribute__ ((__packed__)) eeprom_layout {  	char	magic[3];	/** 'ifm' */  	u8	len[2];		/** content length without magic/len fields */ @@ -209,6 +211,7 @@ static int read_eeprom(void)  int mac_read_from_eeprom(void)  {  	const u8 *mac; +	const char *mac_txt;  	if (read_eeprom()) {  		printf("I2C EEPROM read failed.\n"); @@ -230,8 +233,13 @@ int mac_read_from_eeprom(void)  	if (mac && is_valid_ether_addr(mac)) {  		eth_setenv_enetaddr("ethaddr", mac); -		printf("DIAG: %s() MAC value [%s]\n", -			__func__, getenv("ethaddr")); +		if (mac_diag) { +			mac_txt = getenv("ethaddr"); +			if (mac_txt) +				printf("DIAG: MAC value [%s]\n", mac_txt); +			else +				printf("DIAG: failed to setup MAC env\n"); +		}  	}  	return 0; @@ -326,42 +334,38 @@ int misc_init_r(void)  	gpio_configure();  	/* -	 * check the GPIO keyboard, -	 * enforced start of the recovery when +	 * enforce the start of the recovery system when  	 * - the appropriate keys were pressed -	 * - a previous installation was aborted or has failed  	 * - "some" external software told us to +	 * - a previous installation was aborted or has failed  	 */  	want_recovery = 0;  	keys = gpio_querykbd(); -	printf("GPIO keyboard status [0x%08X]\n", keys); -	/* XXX insist in the _exact_ combination? */ +	if (gpio_diag) +		printf("GPIO keyboard status [0x%02X]\n", keys);  	if ((keys & GPIOKEY_BITS_RECOVERY) == GPIOKEY_BITS_RECOVERY) { -		printf("GPIO keyboard requested RECOVERY\n"); -		/* XXX TODO -		 * refine the logic to detect the first keypress, and -		 * wait to recheck IF it was the recovery combination? -		 */ +		printf("detected recovery request (keyboard)\n");  		want_recovery = 1;  	} -	s = getenv("install_in_progress"); +	s = getenv("want_recovery");  	if ((s != NULL) && (*s != '\0')) { -		printf("previous installation aborted, running RECOVERY\n"); +		printf("detected recovery request (environment)\n");  		want_recovery = 1;  	} -	s = getenv("install_failed"); +	s = getenv("install_in_progress");  	if ((s != NULL) && (*s != '\0')) { -		printf("previous installation FAILED, running RECOVERY\n"); +		printf("previous installation has not completed\n");  		want_recovery = 1;  	} -	s = getenv("want_recovery"); +	s = getenv("install_failed");  	if ((s != NULL) && (*s != '\0')) { -		printf("running RECOVERY according to the request\n"); +		printf("previous installation has failed\n");  		want_recovery = 1;  	} - -	if (want_recovery) +	if (want_recovery) { +		printf("enforced start of the recovery system\n");  		setenv("bootcmd", "run recovery"); +	}  	/*  	 * boot the recovery system without waiting; boot the diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c index 6b3e095ba..16d442aa6 100644 --- a/board/raspberrypi/rpi_b/rpi_b.c +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -1,5 +1,5 @@  /* - * (C) Copyright 2012 Stephen Warren + * (C) Copyright 2012-2013 Stephen Warren   *   * See file CREDITS for list of people who contributed to this   * project. @@ -15,6 +15,8 @@   */  #include <common.h> +#include <config.h> +#include <lcd.h>  #include <asm/arch/mbox.h>  #include <asm/arch/sdhci.h>  #include <asm/global_data.h> @@ -77,3 +79,13 @@ int board_mmc_init(void)  	return bcm2835_sdhci_init(BCM2835_SDHCI_BASE,  				  msg_clk->get_clock_rate.body.resp.rate_hz);  } + +void ft_board_setup(void *blob, bd_t *bd) +{ +	/* +	 * For now, we simply always add the simplefb DT node. Later, we +	 * should be more intelligent, and e.g. only do this if no enabled DT +	 * node exists for the "real" graphics driver. +	 */ +	lcd_dt_simplefb_add_node(blob); +} diff --git a/board/samsung/dts/exynos5250-snow.dts b/board/samsung/dts/exynos5250-snow.dts index fdc047a14..dca3386cf 100644 --- a/board/samsung/dts/exynos5250-snow.dts +++ b/board/samsung/dts/exynos5250-snow.dts @@ -38,6 +38,33 @@  		console = "/serial@12C30000";  	}; +	i2c4: i2c@12ca0000 { +		cros-ec@1e { +			reg = <0x1e>; +			compatible = "google,cros-ec"; +			i2c-max-frequency = <100000>; +			ec-interrupt = <&gpio 782 1>; +		}; + +		power-regulator@48 { +			compatible = "ti,tps65090"; +			reg = <0x48>; +		}; +	}; + +	spi@131b0000 { +		spi-max-frequency = <1000000>; +		spi-deactivate-delay = <100>; +		cros-ec@0 { +			reg = <0>; +			compatible = "google,cros-ec"; +			spi-max-frequency = <5000000>; +			ec-interrupt = <&gpio 782 1>; +			optimise-flash-write; +			status = "disabled"; +		}; +	}; +  	sound@12d60000 {  		samsung,i2s-epll-clock-frequency = <192000000>;  		samsung,i2s-sampling-rate = <48000>; @@ -95,4 +122,58 @@  		samsung,dc-value	= <25>;  	}; +	cros-ec-keyb { +		compatible = "google,cros-ec-keyb"; +		google,key-rows = <8>; +		google,key-columns = <13>; +		google,repeat-delay-ms = <240>; +		google,repeat-rate-ms = <30>; +		google,ghost-filter; +		/* +		 * Keymap entries take the form of 0xRRCCKKKK where +		 * RR=Row CC=Column KKKK=Key Code +		 * The values below are for a US keyboard layout and +		 * are taken from the Linux driver. Note that the +		 * 102ND key is not used for US keyboards. +		 */ +		linux,keymap = < +			/* CAPSLCK F1         B          F10     */ +			0x0001003a 0x0002003b 0x00030030 0x00040044 +			/* N       =          R_ALT      ESC     */ +			0x00060031 0x0008000d 0x000a0064 0x01010001 +			/* F4      G          F7         H       */ +			0x0102003e 0x01030022 0x01040041 0x01060023 +			/* '       F9         BKSPACE    L_CTRL  */ +			0x01080028 0x01090043 0x010b000e 0x0200001d +			/* TAB     F3         T          F6      */ +			0x0201000f 0x0202003d 0x02030014 0x02040040 +			/* ]       Y          102ND      [       */ +			0x0205001b 0x02060015 0x02070056 0x0208001a +			/* F8      GRAVE      F2         5       */ +			0x02090042 0x03010029 0x0302003c 0x03030006 +			/* F5      6          -          \       */ +			0x0304003f 0x03060007 0x0308000c 0x030b002b +			/* R_CTRL  A          D          F       */ +			0x04000061 0x0401001e 0x04020020 0x04030021 +			/* S       K          J          ;       */ +			0x0404001f 0x04050025 0x04060024 0x04080027 +			/* L       ENTER      Z          C       */ +			0x04090026 0x040b001c 0x0501002c 0x0502002e +			/* V       X          ,          M       */ +			0x0503002f 0x0504002d 0x05050033 0x05060032 +			/* L_SHIFT /          .          SPACE   */ +			0x0507002a 0x05080035 0x05090034 0x050B0039 +			/* 1       3          4          2       */ +			0x06010002 0x06020004 0x06030005 0x06040003 +			/* 8       7          0          9       */ +			0x06050009 0x06060008 0x0608000b 0x0609000a +			/* L_ALT   DOWN       RIGHT      Q       */ +			0x060a0038 0x060b006c 0x060c006a 0x07010010 +			/* E       R          W          I       */ +			0x07020012 0x07030013 0x07040011 0x07050017 +			/* U       R_SHIFT    P          O       */ +			0x07060016 0x07070036 0x07080019 0x07090018 +			/* UP      LEFT    */ +			0x070b0067 0x070c0069>; +	};  }; diff --git a/board/samsung/smdk5250/exynos5-dt.c b/board/samsung/smdk5250/exynos5-dt.c index 813150586..aacf43eaa 100644 --- a/board/samsung/smdk5250/exynos5-dt.c +++ b/board/samsung/smdk5250/exynos5-dt.c @@ -21,6 +21,7 @@   */  #include <common.h> +#include <cros_ec.h>  #include <fdtdec.h>  #include <asm/io.h>  #include <errno.h> @@ -69,6 +70,13 @@ static void boot_temp_check(void)  }  #endif +struct local_info { +	struct cros_ec_dev *cros_ec_dev;	/* Pointer to cros_ec device */ +	int cros_ec_err;			/* Error for cros_ec, 0 if ok */ +}; + +static struct local_info local; +  #ifdef CONFIG_USB_EHCI_EXYNOS  int board_usb_vbus_init(void)  { @@ -97,6 +105,20 @@ static void  board_enable_audio_codec(void)  }  #endif +struct cros_ec_dev *board_get_cros_ec_dev(void) +{ +	return local.cros_ec_dev; +} + +static int board_init_cros_ec_devices(const void *blob) +{ +	local.cros_ec_err = cros_ec_init(blob, &local.cros_ec_dev); +	if (local.cros_ec_err) +		return -1;  /* Will report in board_late_init() */ + +	return 0; +} +  int board_init(void)  {  	gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); @@ -112,6 +134,10 @@ int board_init(void)  #ifdef CONFIG_EXYNOS_SPI  	spi_init();  #endif + +	if (board_init_cros_ec_devices(gd->fdt_blob)) +		return -1; +  #ifdef CONFIG_USB_EHCI_EXYNOS  	board_usb_vbus_init();  #endif @@ -421,3 +447,22 @@ void exynos_set_dp_phy(unsigned int onoff)  	set_dp_phy_ctrl(onoff);  }  #endif + +#ifdef CONFIG_BOARD_LATE_INIT +int board_late_init(void) +{ +	stdio_print_current_devices(); + +	if (local.cros_ec_err) { +		/* Force console on */ +		gd->flags &= ~GD_FLG_SILENT; + +		printf("cros-ec communications failure %d\n", +		       local.cros_ec_err); +		puts("\nPlease reset with Power+Refresh\n\n"); +		panic("Cannot init cros-ec device"); +		return -1; +	} +	return 0; +} +#endif diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c index fb98df0f8..fdbe26cde 100644 --- a/board/ti/am335x/board.c +++ b/board/ti/am335x/board.c @@ -273,6 +273,15 @@ static struct emif_regs ddr3_evm_emif_reg_data = {  	.emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY |  				PHY_EN_DYN_PWRDN,  }; + +#ifdef CONFIG_SPL_OS_BOOT +int spl_start_uboot(void) +{ +	/* break into full u-boot on 'c' */ +	return (serial_tstc() && serial_getc() == 'c'); +} +#endif +  #endif  /* |