diff options
| -rw-r--r-- | README | 9 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xxx/cpu.c | 2 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/Makefile | 56 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/cpld.c | 171 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/cpld.h | 53 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/ddr.c | 115 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/law.c | 37 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/p2041rdb.c | 203 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/pci.c | 39 | ||||
| -rw-r--r-- | board/freescale/p2041rdb/tlb.c | 119 | ||||
| -rw-r--r-- | boards.cfg | 3 | ||||
| -rw-r--r-- | common/fdt_support.c | 107 | ||||
| -rw-r--r-- | common/image.c | 60 | ||||
| -rw-r--r-- | doc/README.p2041rdb | 123 | ||||
| -rw-r--r-- | include/configs/MPC8548CDS.h | 1 | ||||
| -rw-r--r-- | include/configs/P2041RDB.h | 624 | ||||
| -rw-r--r-- | include/fdt_support.h | 6 | ||||
| -rw-r--r-- | include/libfdt.h | 103 | ||||
| -rw-r--r-- | lib/libfdt/fdt.c | 9 | ||||
| -rw-r--r-- | lib/libfdt/fdt_ro.c | 154 | ||||
| -rw-r--r-- | lib/libfdt/libfdt_internal.h | 1 | 
21 files changed, 1941 insertions, 54 deletions
| @@ -3315,6 +3315,15 @@ List of environment variables (most likely not complete):  		  This can be used to load and uncompress arbitrary  		  data. +  fdt_high	- if set this restricts the maximum address that the +		  flattened device tree will be copied into upon boot. +		  If this is set to the special value 0xFFFFFFFF then +		  the fdt will not be copied at all on boot.  For this +		  to work it must reside in writable memory, have +		  sufficient padding on the end of it for u-boot to +		  add the information it needs into it, and the memory +		  must be accessible by the kernel. +    i2cfast	- (PPC405GP|PPC405EP only)  		  if set to 'y' configures Linux I2C driver for fast  		  mode (400kHZ). This environment variable is used in diff --git a/arch/powerpc/cpu/mpc8xxx/cpu.c b/arch/powerpc/cpu/mpc8xxx/cpu.c index 85ebcc94c..767bc524d 100644 --- a/arch/powerpc/cpu/mpc8xxx/cpu.c +++ b/arch/powerpc/cpu/mpc8xxx/cpu.c @@ -79,7 +79,7 @@ struct cpu_type cpu_type_list [] = {  	CPU_TYPE_ENTRY(P1016, P1016_E, 1),  	CPU_TYPE_ENTRY(P1016, P1016, 1),  	CPU_TYPE_ENTRY(P1017, P1017, 1), -	CPU_TYPE_ENTRY(P1017, P1017, 1), +	CPU_TYPE_ENTRY(P1017, P1017_E, 1),  	CPU_TYPE_ENTRY(P1020, P1020, 2),  	CPU_TYPE_ENTRY(P1020, P1020_E, 2),  	CPU_TYPE_ENTRY(P1021, P1021, 2), diff --git a/board/freescale/p2041rdb/Makefile b/board/freescale/p2041rdb/Makefile new file mode 100644 index 000000000..65f348fe3 --- /dev/null +++ b/board/freescale/p2041rdb/Makefile @@ -0,0 +1,56 @@ +# +# Copyright 2011 Freescale Semiconductor, Inc. +# (C) Copyright 2001-2006 +# 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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(BOARD).o + +COBJS-y	+= $(BOARD).o +COBJS-y += cpld.o +COBJS-y	+= ddr.o +COBJS-y	+= law.o +COBJS-y	+= tlb.o +COBJS-$(CONFIG_PCI) += pci.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)) + +clean: +	rm -f $(OBJS) $(SOBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/p2041rdb/cpld.c b/board/freescale/p2041rdb/cpld.c new file mode 100644 index 000000000..8e1f46e79 --- /dev/null +++ b/board/freescale/p2041rdb/cpld.c @@ -0,0 +1,171 @@ +/** + * Copyright 2011 Freescale Semiconductor + * Author: Mingkai Hu <Mingkai.hu@freescale.com> + * + * 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 file provides support for the board-specific CPLD used on some Freescale + * reference boards. + * + * The following macros need to be defined: + * + * CPLD_BASE - The virtual address of the base of the CPLD register map + * + */ + +#include <common.h> +#include <command.h> +#include <asm/io.h> + +#include "cpld.h" + +static u8 __cpld_read(unsigned int reg) +{ +	void *p = (void *)CPLD_BASE; + +	return in_8(p + reg); +} +u8 cpld_read(unsigned int reg) __attribute__((weak, alias("__cpld_read"))); + +static void __cpld_write(unsigned int reg, u8 value) +{ +	void *p = (void *)CPLD_BASE; + +	out_8(p + reg, value); +} +void cpld_write(unsigned int reg, u8 value) +	__attribute__((weak, alias("__cpld_write"))); + +/* + * Reset the board. This honors the por_cfg registers. + */ +void __cpld_reset(void) +{ +	CPLD_WRITE(system_rst, 1); +} +void cpld_reset(void) __attribute__((weak, alias("__cpld_reset"))); + +/** + * Set the boot bank to the alternate bank + */ +void __cpld_set_altbank(void) +{ +	CPLD_WRITE(fbank_sel, 1); +} +void cpld_set_altbank(void) +	__attribute__((weak, alias("__cpld_set_altbank"))); + +/** + * Set the boot bank to the default bank + */ +void __cpld_clear_altbank(void) +{ +	CPLD_WRITE(fbank_sel, 0); +} +void cpld_clear_altbank(void) +	__attribute__((weak, alias("__cpld_clear_altbank"))); + +#ifdef DEBUG +static void cpld_dump_regs(void) +{ +	printf("cpld_ver	= 0x%02x\n", CPLD_READ(cpld_ver)); +	printf("cpld_ver_sub	= 0x%02x\n", CPLD_READ(cpld_ver_sub)); +	printf("pcba_ver	= 0x%02x\n", CPLD_READ(pcba_ver)); +	printf("system_rst	= 0x%02x\n", CPLD_READ(system_rst)); +	printf("wd_cfg		= 0x%02x\n", CPLD_READ(wd_cfg)); +	printf("sw_ctl_on	= 0x%02x\n", CPLD_READ(sw_ctl_on)); +	printf("por_cfg		= 0x%02x\n", CPLD_READ(por_cfg)); +	printf("switch_strobe	= 0x%02x\n", CPLD_READ(switch_strobe)); +	printf("jtag_sel	= 0x%02x\n", CPLD_READ(jtag_sel)); +	printf("sdbank1_clk	= 0x%02x\n", CPLD_READ(sdbank1_clk)); +	printf("sdbank2_clk	= 0x%02x\n", CPLD_READ(sdbank2_clk)); +	printf("fbank_sel	= 0x%02x\n", CPLD_READ(fbank_sel)); +	printf("serdes_mux	= 0x%02x\n", CPLD_READ(serdes_mux)); +	printf("SW[2]		= 0x%02x\n", in_8(&CPLD_SW(2))); +	putc('\n'); +} +#endif + +int cpld_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	int rc = 0; +	unsigned int i; + +	if (argc <= 1) +		return cmd_usage(cmdtp); + +	if (strcmp(argv[1], "reset") == 0) { +		if (strcmp(argv[2], "altbank") == 0) +			cpld_set_altbank(); +		else +			cpld_clear_altbank(); + +		cpld_reset(); +	} else if (strcmp(argv[1], "watchdog") == 0) { +		static char *period[8] = {"1ms", "10ms", "30ms", "disable", +			"100ms", "1s", "10s", "60s"}; +		for (i = 0; i < ARRAY_SIZE(period); i++) { +			if (strcmp(argv[2], period[i]) == 0) +				CPLD_WRITE(wd_cfg, i); +		} +	} else if (strcmp(argv[1], "lane_mux") == 0) { +		u32 lane = simple_strtoul(argv[2], NULL, 16); +		u8 val = (u8)simple_strtoul(argv[3], NULL, 16); +		u8 reg = CPLD_READ(serdes_mux); + +		switch (lane) { +		case 0x6: +			reg &= ~SERDES_MUX_LANE_6_MASK; +			reg |= val << SERDES_MUX_LANE_6_SHIFT; +			break; +		case 0xa: +			reg &= ~SERDES_MUX_LANE_A_MASK; +			reg |= val << SERDES_MUX_LANE_A_SHIFT; +			break; +		case 0xc: +			reg &= ~SERDES_MUX_LANE_C_MASK; +			reg |= val << SERDES_MUX_LANE_C_SHIFT; +			break; +		case 0xd: +			reg &= ~SERDES_MUX_LANE_D_MASK; +			reg |= val << SERDES_MUX_LANE_D_SHIFT; +			break; +		default: +			printf("Invalid value\n"); +			break; +		} + +		CPLD_WRITE(serdes_mux, reg); +#ifdef DEBUG +	} else if (strcmp(argv[1], "dump") == 0) { +		cpld_dump_regs(); +#endif +	} else +		rc = cmd_usage(cmdtp); + +	return rc; +} + +U_BOOT_CMD( +	cpld_cmd, CONFIG_SYS_MAXARGS, 1, cpld_cmd, +	"Reset the board or pin mulexing selection using the CPLD sequencer", +	"reset - hard reset to default bank\n" +	"cpld_cmd reset altbank - reset to alternate bank\n" +	"cpld_cmd watchdog <watchdog_period> - set the watchdog period\n" +	"	period: 1ms 10ms 30ms 100ms 1s 10s 60s disable\n" +	"cpld_cmd lane_mux <lane> <mux_value> - set multiplexed lane pin\n" +	"	lane 6: 0 -> slot1 (Default)\n" +	"		1 -> SGMII\n" +	"	lane a: 0 -> slot2 (Default)\n" +	"		1 -> AURORA\n" +	"	lane c: 0 -> slot2 (Default)\n" +	"		1 -> SATA0\n" +	"	lane d: 0 -> slot2 (Default)\n" +	"		1 -> SATA1\n" +#ifdef DEBUG +	"cpld_cmd dump - display the CPLD registers\n" +#endif +	); diff --git a/board/freescale/p2041rdb/cpld.h b/board/freescale/p2041rdb/cpld.h new file mode 100644 index 000000000..3b24cb048 --- /dev/null +++ b/board/freescale/p2041rdb/cpld.h @@ -0,0 +1,53 @@ +/** + * Copyright 2011 Freescale Semiconductor + * Author: Mingkai Hu <Mingkai.hu@freescale.com> + * + * 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 file provides support for the ngPIXIS, a board-specific FPGA used on + * some Freescale reference boards. + */ + +/* + * CPLD register set. Feel free to add board-specific #ifdefs where necessary. + */ +typedef struct cpld_data { +	u8 cpld_ver;		/* 0x0 - CPLD Major Revision Register */ +	u8 cpld_ver_sub;	/* 0x1 - CPLD Minor Revision Register */ +	u8 pcba_ver;		/* 0x2 - PCBA Revision Register */ +	u8 system_rst;		/* 0x3 - system reset register */ +	u8 wd_cfg;		/* 0x4 - Watchdog Period Setting Register */ +	u8 sw_ctl_on;		/* 0x5 - Switch Control Enable Register */ +	u8 por_cfg;		/* 0x6 - POR Control Register */ +	u8 switch_strobe;	/* 0x7 - Multiplexed pin Select Register */ +	u8 jtag_sel;		/* 0x8 - JTAG or AURORA Selection */ +	u8 sdbank1_clk;		/* 0x9 - SerDes Bank1 Reference clock */ +	u8 sdbank2_clk;		/* 0xa - SerDes Bank2 Reference clock */ +	u8 fbank_sel;		/* 0xb - Flash bank selection */ +	u8 serdes_mux;		/* 0xc - Multiplexed pin Select Register */ +	u8 sw[1];		/* 0xd - SW2 Status */ +} __attribute__ ((packed)) cpld_data_t; + +#define SERDES_MUX_LANE_6_MASK	0x2 +#define SERDES_MUX_LANE_6_SHIFT	1 +#define SERDES_MUX_LANE_A_MASK	0x1 +#define SERDES_MUX_LANE_A_SHIFT	0 +#define SERDES_MUX_LANE_C_MASK	0x4 +#define SERDES_MUX_LANE_C_SHIFT	2 +#define SERDES_MUX_LANE_D_MASK	0x8 +#define SERDES_MUX_LANE_D_SHIFT	3 + +/* Pointer to the CPLD register set */ +#define cpld ((cpld_data_t *)CPLD_BASE) + +/* The CPLD SW register that corresponds to board switch X, where x >= 1 */ +#define CPLD_SW(x)		(cpld->sw[(x) - 2]) + +u8 cpld_read(unsigned int reg); +void cpld_write(unsigned int reg, u8 value); + +#define CPLD_READ(reg) cpld_read(offsetof(cpld_data_t, reg)) +#define CPLD_WRITE(reg, value) cpld_write(offsetof(cpld_data_t, reg), value) diff --git a/board/freescale/p2041rdb/ddr.c b/board/freescale/p2041rdb/ddr.c new file mode 100644 index 000000000..46de9109d --- /dev/null +++ b/board/freescale/p2041rdb/ddr.c @@ -0,0 +1,115 @@ +/* + * 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 + * Version 2 as published by the Free Software Foundation. + */ + +#include <common.h> +#include <i2c.h> +#include <hwconfig.h> +#include <asm/mmu.h> +#include <asm/fsl_ddr_sdram.h> +#include <asm/fsl_ddr_dimm_params.h> +#include <asm/fsl_law.h> + +typedef struct { +	u32 datarate_mhz_low; +	u32 datarate_mhz_high; +	u32 n_ranks; +	u32 clk_adjust; +	u32 wrlvl_start; +	u32 cpo; +	u32 write_data_delay; +	u32 force_2T; +} board_specific_parameters_t; + +/* + * ranges for parameters: + *  wr_data_delay = 0-6 + *  clk adjust = 0-8 + *  cpo 2-0x1E (30) + */ +const board_specific_parameters_t board_specific_parameters[] = { +	/* +	 * memory controller 0 +	 *  lo|  hi|  num|  clk| wrlvl | cpo  |wrdata|2T +	 * mhz| mhz|ranks|adjst| start | delay| +	 */ +	{  1017, 1116,    2,    4,     6,   0xff,    2,  0}, +}; + +void fsl_ddr_board_options(memctl_options_t *popts, +				dimm_params_t *pdimm, +				unsigned int ctrl_num) +{ +	const board_specific_parameters_t *pbsp = +				&board_specific_parameters[0]; +	u32 num_params = ARRAY_SIZE(board_specific_parameters); +	u32 i; +	ulong ddr_freq; + +	/* +	 * Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr +	 * freqency and n_banks specified in board_specific_parameters table. +	 */ +	ddr_freq = get_ddr_freq(0) / 1000000; +	for (i = 0; i < num_params; i++) { +		if (ddr_freq >= pbsp->datarate_mhz_low && +			ddr_freq <= pbsp->datarate_mhz_high && +			pdimm[0].n_ranks == pbsp->n_ranks) { +			popts->cpo_override = pbsp->cpo; +			popts->write_data_delay = pbsp->write_data_delay; +			popts->clk_adjust = pbsp->clk_adjust; +			popts->wrlvl_start = pbsp->wrlvl_start; +			popts->twoT_en = pbsp->force_2T; +			break; +		} +		pbsp++; +	} + +	if (i == num_params) { +		printf("Warning: board specific timing not found " +			"for data rate %lu MT/s!\n", ddr_freq); +	} + +	/* +	 * Factors to consider for half-strength driver enable: +	 *	- number of DIMMs installed +	 */ +	popts->half_strength_driver_enable = 0; +	/* Write leveling override */ +	popts->wrlvl_override = 1; +	popts->wrlvl_sample = 0xf; + +	/* Rtt and Rtt_WR override */ +	popts->rtt_override = 0; + +	/* Enable ZQ calibration */ +	popts->zq_en = 1; + +	/* DHC_EN =1, ODT = 60 Ohm */ +	popts->ddr_cdr1 = DDR_CDR1_DHC_EN; +} + +phys_size_t initdram(int board_type) +{ +	phys_size_t dram_size = 0; + +	puts("Initializing...."); + +	if (fsl_use_spd()) { +		puts("using SPD\n"); +		dram_size = fsl_ddr_sdram(); +	} else { +		puts("no SPD and fixed parameters\n"); +		return dram_size; +	} + +	dram_size = setup_ddr_tlbs(dram_size / 0x100000); +	dram_size *= 0x100000; + +	puts("    DDR: "); +	return dram_size; +} diff --git a/board/freescale/p2041rdb/law.c b/board/freescale/p2041rdb/law.c new file mode 100644 index 000000000..127a478e4 --- /dev/null +++ b/board/freescale/p2041rdb/law.c @@ -0,0 +1,37 @@ +/* + * Copyright 2011 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_FLASH_BASE_PHYS, LAW_SIZE_256M, LAW_TRGT_IF_LBC), +	SET_LAW(CONFIG_SYS_BMAN_MEM_PHYS, LAW_SIZE_2M, LAW_TRGT_IF_BMAN), +	SET_LAW(CONFIG_SYS_QMAN_MEM_PHYS, LAW_SIZE_2M, LAW_TRGT_IF_QMAN), +	SET_LAW(CPLD_BASE_PHYS, LAW_SIZE_4K, LAW_TRGT_IF_LBC), +#ifdef CONFIG_SYS_DCSRBAR_PHYS +	SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_32M, LAW_TRGT_IF_DCSR), +#endif +}; + +int num_law_entries = ARRAY_SIZE(law_table); diff --git a/board/freescale/p2041rdb/p2041rdb.c b/board/freescale/p2041rdb/p2041rdb.c new file mode 100644 index 000000000..52269d3ce --- /dev/null +++ b/board/freescale/p2041rdb/p2041rdb.c @@ -0,0 +1,203 @@ +/* + * Copyright 2011 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 <command.h> +#include <netdev.h> +#include <linux/compiler.h> +#include <asm/mmu.h> +#include <asm/processor.h> +#include <asm/cache.h> +#include <asm/immap_85xx.h> +#include <asm/fsl_law.h> +#include <asm/fsl_serdes.h> +#include <asm/fsl_portals.h> +#include <asm/fsl_liodn.h> + +extern void pci_of_setup(void *blob, bd_t *bd); + +#include "cpld.h" + +DECLARE_GLOBAL_DATA_PTR; + +int checkboard(void) +{ +	u8 sw; +	struct cpu_type *cpu = gd->cpu; +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; +	unsigned int i; + +	printf("Board: %sRDB, ", cpu->name); +	printf("CPLD version: %d.%d ", CPLD_READ(cpld_ver), +			CPLD_READ(cpld_ver_sub)); + +	sw = CPLD_READ(fbank_sel); +	printf("vBank: %d\n", sw & 0x1); + +#ifdef CONFIG_PHYS_64BIT +	puts("36-bit Addressing\n"); +#endif + +	/* +	 * Display the RCW, so that no one gets confused as to what RCW +	 * we're actually using for this boot. +	 */ +	puts("Reset Configuration Word (RCW):"); +	for (i = 0; i < ARRAY_SIZE(gur->rcwsr); i++) { +		u32 rcw = in_be32(&gur->rcwsr[i]); + +		if ((i % 4) == 0) +			printf("\n       %08x:", i * 4); +		printf(" %08x", rcw); +	} +	puts("\n"); + +	/* +	 * Display the actual SERDES reference clocks as configured by the +	 * dip switches on the board.  Note that the SWx registers could +	 * technically be set to force the reference clocks to match the +	 * values that the SERDES expects (or vice versa).  For now, however, +	 * we just display both values and hope the user notices when they +	 * don't match. +	 */ +	puts("SERDES Reference Clocks: "); +	sw = in_8(&CPLD_SW(2)) >> 2; +	for (i = 0; i < 2; i++) { +		static const char * const freq[] = {"0", "100", "125"}; +		unsigned int clock = (sw >> (2 * i)) & 3; + +		printf("Bank%u=%sMhz ", i+1, freq[clock]); +	} +	puts("\n"); + +	return 0; +} + +int board_early_init_f(void) +{ +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); + +	/* board only uses the DDR_MCK0/1, so disable the DDR_MCK2/3 */ +	setbits_be32(&gur->ddrclkdr, 0x000f000f); + +	return 0; +} + +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_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +			0, flash_esel, BOOKE_PAGESZ_256M, 1); + +	set_liodns(); +	setup_portals(); + +	return 0; +} + +static const char *serdes_clock_to_string(u32 clock) +{ +	switch (clock) { +	case SRDS_PLLCR0_RFCK_SEL_100: +		return "100"; +	case SRDS_PLLCR0_RFCK_SEL_125: +		return "125"; +	case SRDS_PLLCR0_RFCK_SEL_156_25: +		return "156.25"; +	default: +		return "150"; +	} +} + +#define NUM_SRDS_BANKS	2 + +int misc_init_r(void) +{ +	serdes_corenet_t *regs = (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR; +	u32 actual[NUM_SRDS_BANKS]; +	unsigned int i; +	u8 sw; + +	sw = in_8(&CPLD_SW(2)) >> 2; +	for (i = 0; i < NUM_SRDS_BANKS; i++) { +		unsigned int clock = (sw >> (2 * i)) & 3; +		switch (clock) { +		case 1: +			actual[i] = SRDS_PLLCR0_RFCK_SEL_100; +			break; +		case 2: +			actual[i] = SRDS_PLLCR0_RFCK_SEL_125; +			break; +		default: +			printf("Warning: SDREFCLK%u switch setting of '11' is " +			       "unsupported\n", i + 1); +			break; +		} +	} + +	for (i = 0; i < NUM_SRDS_BANKS; i++) { +		u32 expected = in_be32(®s->bank[i].pllcr0); +		expected &= SRDS_PLLCR0_RFCK_SEL_MASK; +		if (expected != actual[i]) { +			printf("Warning: SERDES bank %u expects reference clock" +			       " %sMHz, but actual is %sMHz\n", i + 1, +			       serdes_clock_to_string(expected), +			       serdes_clock_to_string(actual[i])); +		} +	} + +	return 0; +} + +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_PCI +	pci_of_setup(blob, bd); +#endif + +	fdt_fixup_liodn(blob); +} diff --git a/board/freescale/p2041rdb/pci.c b/board/freescale/p2041rdb/pci.c new file mode 100644 index 000000000..1ab4cdf5f --- /dev/null +++ b/board/freescale/p2041rdb/pci.c @@ -0,0 +1,39 @@ +/* + * Copyright 2011 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 <command.h> +#include <pci.h> +#include <asm/fsl_pci.h> +#include <libfdt.h> +#include <fdt_support.h> +#include <asm/fsl_serdes.h> + +void pci_init_board(void) +{ +	fsl_pcie_init_board(0); +} + +void pci_of_setup(void *blob, bd_t *bd) +{ +	FT_FSL_PCI_SETUP; +} diff --git a/board/freescale/p2041rdb/tlb.c b/board/freescale/p2041rdb/tlb.c new file mode 100644 index 000000000..43f28ed14 --- /dev/null +++ b/board/freescale/p2041rdb/tlb.c @@ -0,0 +1,119 @@ +/* + * Copyright 2011 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_PHYS, +		      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_PHYS + 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_PHYS + 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_PHYS + 12 * 1024, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 0, BOOKE_PAGESZ_4K, 0), + +	SET_TLB_ENTRY(0, CPLD_BASE, CPLD_BASE_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 0, BOOKE_PAGESZ_4K, 0), + +	/* TLB 1 */ +	/* *I*** - Covers boot page */ +#if defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SYS_INIT_L3_ADDR) +	/* +	 * *I*G - L3SRAM. When L3 is used as 1M SRAM, the address of the +	 * SRAM is at 0xfff00000, it covered the 0xfffff000. +	 */ +	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), +#else +	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 0, BOOKE_PAGESZ_4K, 1), +#endif + +	/* *I*G* - CCSRBAR */ +	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_16M, 1), + +	/* *I*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_SR, MAS2_W|MAS2_G, +		      0, 2, BOOKE_PAGESZ_256M, 1), + +	/* *I*G* - PCI */ +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 3, BOOKE_PAGESZ_1G, 1), + +	/* *I*G* - PCI */ +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x40000000, +		      CONFIG_SYS_PCIE1_MEM_PHYS + 0x40000000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 4, BOOKE_PAGESZ_256M, 1), + +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x50000000, +		      CONFIG_SYS_PCIE1_MEM_PHYS + 0x50000000, +		      MAS3_SX|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_PCIE1_IO_VIRT, CONFIG_SYS_PCIE1_IO_PHYS, +		      MAS3_SX|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_SX|MAS3_SW|MAS3_SR, 0, +		      0, 9, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE + 0x00100000, +		      CONFIG_SYS_BMAN_MEM_PHYS + 0x00100000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 10, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE, CONFIG_SYS_QMAN_MEM_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, 0, +		      0, 11, BOOKE_PAGESZ_1M, 1), +	SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE + 0x00100000, +		      CONFIG_SYS_QMAN_MEM_PHYS + 0x00100000, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 12, BOOKE_PAGESZ_1M, 1), +#ifdef CONFIG_SYS_DCSRBAR_PHYS +	SET_TLB_ENTRY(1, CONFIG_SYS_DCSRBAR, CONFIG_SYS_DCSRBAR_PHYS, +		      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +		      0, 13, BOOKE_PAGESZ_4M, 1), +#endif +}; + +int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/boards.cfg b/boards.cfg index 41af6e2b4..5cfaa789f 100644 --- a/boards.cfg +++ b/boards.cfg @@ -598,6 +598,9 @@ P2020RDB_36BIT_SPIFLASH      powerpc     mpc85xx     p1_p2_rdb           freesca  P2020RDB_NAND                powerpc     mpc85xx     p1_p2_rdb           freescale      -           P1_P2_RDB:P2020RDB,NAND  P2020RDB_SDCARD              powerpc     mpc85xx     p1_p2_rdb           freescale      -           P1_P2_RDB:P2020RDB,SDCARD  P2020RDB_SPIFLASH            powerpc     mpc85xx     p1_p2_rdb           freescale      -           P1_P2_RDB:P2020RDB,SPIFLASH +P2041RDB                     powerpc     mpc85xx     p2041rdb            freescale +P2041RDB_SDCARD              powerpc     mpc85xx     p2041rdb            freescale      -           P2041RDB:RAMBOOT_PBL,SDCARD,SYS_TEXT_BASE=0xFFF80000 +P2041RDB_SPIFLASH            powerpc     mpc85xx     p2041rdb            freescale      -           P2041RDB:RAMBOOT_PBL,SPIFLASH,SYS_TEXT_BASE=0xFFF80000  P3041DS                      powerpc     mpc85xx     corenet_ds          freescale  P3041DS_NAND		     powerpc     mpc85xx     corenet_ds          freescale      -           P3041DS:RAMBOOT_PBL,NAND,SYS_TEXT_BASE=0xFFF80000  P3041DS_SDCARD		     powerpc     mpc85xx     corenet_ds          freescale      -           P3041DS:RAMBOOT_PBL,SDCARD,SYS_TEXT_BASE=0xFFF80000 diff --git a/common/fdt_support.c b/common/fdt_support.c index 496040b54..19b2ef6ea 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -1195,6 +1195,46 @@ int fdt_alloc_phandle(void *blob)  	return phandle + 1;  } +/* + * fdt_create_phandle: Create a phandle property for the given node + * + * @fdt: ptr to device tree + * @nodeoffset: node to update + * @phandle: phandle value to set (must be unique) +*/ +int fdt_create_phandle(void *fdt, int nodeoffset, uint32_t phandle) +{ +	int ret; + +#ifdef DEBUG +	int off = fdt_node_offset_by_phandle(fdt, phandle); + +	if ((off >= 0) && (off != nodeoffset)) { +		char buf[64]; + +		fdt_get_path(fdt, nodeoffset, buf, sizeof(buf)); +		printf("Trying to update node %s with phandle %u ", +		       buf, phandle); + +		fdt_get_path(fdt, off, buf, sizeof(buf)); +		printf("that already exists in node %s.\n", buf); +		return -FDT_ERR_BADPHANDLE; +	} +#endif + +	ret = fdt_setprop_cell(fdt, nodeoffset, "phandle", phandle); +	if (ret < 0) +		return ret; + +	/* +	 * For now, also set the deprecated "linux,phandle" property, so that we +	 * don't break older kernels. +	 */ +	ret = fdt_setprop_cell(fdt, nodeoffset, "linux,phandle", phandle); + +	return ret; +} +  #if defined(CONFIG_VIDEO)  int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf)  { @@ -1223,3 +1263,70 @@ err_size:  	return ret;  }  #endif + +/* + * Verify the physical address of device tree node for a given alias + * + * This function locates the device tree node of a given alias, and then + * verifies that the physical address of that device matches the given + * parameter.  It displays a message if there is a mismatch. + * + * Returns 1 on success, 0 on failure + */ +int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr) +{ +	const char *path; +	const u32 *reg; +	int node, len; +	u64 dt_addr; + +	path = fdt_getprop(fdt, anode, alias, NULL); +	if (!path) { +		/* If there's no such alias, then it's not a failure */ +		return 1; +	} + +	node = fdt_path_offset(fdt, path); +	if (node < 0) { +		printf("Warning: device tree alias '%s' points to invalid " +		       "node %s.\n", alias, path); +		return 0; +	} + +	reg = fdt_getprop(fdt, node, "reg", &len); +	if (!reg) { +		printf("Warning: device tree node '%s' has no address.\n", +		       path); +		return 0; +	} + +	dt_addr = fdt_translate_address(fdt, node, reg); +	if (addr != dt_addr) { +		printf("Warning: U-Boot configured device %s at address %llx,\n" +		       " but the device tree has it address %llx.\n", +		       alias, addr, dt_addr); +		return 0; +	} + +	return 1; +} + +/* + * Returns the base address of an SOC or PCI node + */ +u64 fdt_get_base_address(void *fdt, int node) +{ +	int size; +	u32 naddr; +	const u32 *prop; + +	prop = fdt_getprop(fdt, node, "#address-cells", &size); +	if (prop && size == 4) +		naddr = *prop; +	else +		naddr = 2; + +	prop = fdt_getprop(fdt, node, "ranges", &size); + +	return prop ? fdt_translate_address(fdt, node, prop + naddr) : 0; +} diff --git a/common/image.c b/common/image.c index e542a5736..c6cd85ef9 100644 --- a/common/image.c +++ b/common/image.c @@ -1234,8 +1234,10 @@ int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)  {  	void	*fdt_blob = *of_flat_tree;  	void	*of_start = 0; +	char	*fdt_high;  	ulong	of_len = 0;  	int	err; +	int	disable_relocation = 0;  	/* nothing to do */  	if (*of_size == 0) @@ -1249,26 +1251,62 @@ int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)  	/* position on a 4K boundary before the alloc_current */  	/* Pad the FDT by a specified amount */  	of_len = *of_size + CONFIG_SYS_FDT_PAD; -	of_start = (void *)(unsigned long)lmb_alloc_base(lmb, of_len, 0x1000, -			getenv_bootm_mapsize() + getenv_bootm_low()); + +	/* If fdt_high is set use it to select the relocation address */ +	fdt_high = getenv("fdt_high"); +	if (fdt_high) { +		void *desired_addr = (void *)simple_strtoul(fdt_high, NULL, 16); + +		if (((ulong) desired_addr) == ~0UL) { +			/* All ones means use fdt in place */ +			desired_addr = fdt_blob; +			disable_relocation = 1; +		} +		if (desired_addr) { +			of_start = +			    (void *)(ulong) lmb_alloc_base(lmb, of_len, 0x1000, +							   ((ulong) +							    desired_addr) +							   + of_len); +			if (desired_addr && of_start != desired_addr) { +				puts("Failed using fdt_high value for Device Tree"); +				goto error; +			} +		} else { +			of_start = +			    (void *)(ulong) mb_alloc(lmb, of_len, 0x1000); +		} +	} else { +		of_start = +		    (void *)(ulong) lmb_alloc_base(lmb, of_len, 0x1000, +						   getenv_bootm_mapsize() +						   + getenv_bootm_low()); +	}  	if (of_start == 0) {  		puts("device tree - allocation error\n");  		goto error;  	} -	debug ("## device tree at %p ... %p (len=%ld [0x%lX])\n", -		fdt_blob, fdt_blob + *of_size - 1, of_len, of_len); +	if (disable_relocation) { +		/* We assume there is space after the existing fdt to use for padding */ +		fdt_set_totalsize(of_start, of_len); +		printf("   Using Device Tree in place at %p, end %p\n", +		       of_start, of_start + of_len - 1); +	} else { +		debug ("## device tree at %p ... %p (len=%ld [0x%lX])\n", +			fdt_blob, fdt_blob + *of_size - 1, of_len, of_len); -	printf ("   Loading Device Tree to %p, end %p ... ", -		of_start, of_start + of_len - 1); +		printf ("   Loading Device Tree to %p, end %p ... ", +			of_start, of_start + of_len - 1); -	err = fdt_open_into (fdt_blob, of_start, of_len); -	if (err != 0) { -		fdt_error ("fdt move failed"); -		goto error; +		err = fdt_open_into (fdt_blob, of_start, of_len); +		if (err != 0) { +			fdt_error ("fdt move failed"); +			goto error; +		} +		puts ("OK\n");  	} -	puts ("OK\n");  	*of_flat_tree = of_start;  	*of_size = of_len; diff --git a/doc/README.p2041rdb b/doc/README.p2041rdb new file mode 100644 index 000000000..292d0d39c --- /dev/null +++ b/doc/README.p2041rdb @@ -0,0 +1,123 @@ +Overview +========= +The P2041 Processor combines four Power Architecture processor cores +with high-performance datapath acceleration architecture(DPAA), CoreNet +fabric infrastructure, as well as network and peripheral bus interfaces +required for networking, telecom/datacom, wireless infrastructure, and +military/aerospace applications. + +P2041RDB board is a quad core platform supporting the P2041 processor +of QorIQ DPAA series. + +Boot from NOR flash +=================== +1. Build image +	make P2041RDB_config +	make all + +2. Program image +	=> tftp 1000000 u-boot.bin +	=> protect off all +	=> erase eff80000 efffffff +	=> cp.b 1000000 eff80000 80000 + +3. Program RCW +	=> tftp 1000000 rcw.bin +	=> protect off all +	=> erase e8000000 e801ffff +	=> cp.b 1000000 e8000000 50 + +4. Program FMAN Firmware ucode +	=> tftp 1000000 ucode.bin +	=> protect off all +	=> erase ef000000 ef0fffff +	=> cp.b 1000000 ef000000 2000 + +5. Change DIP-switch +	SW1[1-5] = 10110 +	Note: 1 stands for 'on', 0 stands for 'off' + +Boot from SDCard +=================== +1. Build image +	make P2041RDB_SDCARD_config +	make all + +2. Generate PBL imge +   Use PE tool to produce a image used to be programed to +   SDCard which contains RCW and U-Boot image. + +3. Program the PBL image to SDCard +	=> tftp 1000000 pbl_sd.bin +	=> mmcinfo +	=> mmc write 1000000 8 441 + +4. Program FMAN Firmware ucode +	=> tftp 1000000 ucode.bin +	=> mmc write 1000000 46a 10 + +5. Change DIP-switch +	SW1[1-5] = 01100 +	Note: 1 stands for 'on', 0 stands for 'off' + +Boot from SPI flash +=================== +1. Build image +	make P2041RDB_SPIFLASH_config +	make all + +2. Generate PBL imge +   Use PE tool to produce a image used to be programed to +   SPI flash which contains RCW and U-Boot image. + +3. Program the PBL image to SPI flash +	=> tftp 1000000 pbl_spi.bin +	=> spi probe 0 +	=> sf erase 0 100000 +	=> sf write 1000000 0 $filesize + +4. Program FMAN Firmware ucode +	=> tftp 1000000 ucode.bin +	=> sf erase 110000 10000 +	=> sf write 1000000 110000 $filesize + +5. Change DIP-switch +	SW1[1-5] = 10100 +	Note: 1 stands for 'on', 0 stands for 'off' + +CPLD command +============ +The CPLD is used to control the power sequence and some serdes lane +mux function. + +cpld reset			 - hard reset to default bank +cpld reset altbank		 - reset to alternate bank +cpld lane_mux <lane> <mux_value> - set multiplexed lane pin +		lane 6: 0 -> slot1 (Default) +			1 -> SGMII +		lane a: 0 -> slot2 (Default) +			1 -> AURORA +		lane c: 0 -> slot2 (Default) +			1 -> SATA0 +		lane d: 0 -> slot2 (Default) +			1 -> SATA1 + +Using the Device Tree Source File +================================= +To create the DTB (Device Tree Binary) image file, use a command +similar to this: +	dtc -O dtb -b 0 -p 1024 p2041rdb.dts > p2041rdb.dtb + +Or use the following command: +	{linux-2.6}/make p2041rdb.dtb ARCH=powerpc + +then the dtb file will be generated under the following directory: +	{linux-2.6}/arch/powerpc/boot/p2041rdb.dtb + +Booting Linux +============= +Place a linux uImage in the TFTP disk area. +	tftp 1000000 uImage +	tftp 2000000 rootfs.ext2.gz.uboot +	tftp 3000000 p2041rdb.dtb +	bootm 1000000 2000000 3000000 diff --git a/include/configs/MPC8548CDS.h b/include/configs/MPC8548CDS.h index 0c0ae0289..c9a0f6058 100644 --- a/include/configs/MPC8548CDS.h +++ b/include/configs/MPC8548CDS.h @@ -91,7 +91,6 @@ extern unsigned long get_clock_freq(void);  #undef CONFIG_FSL_DDR_INTERACTIVE  #define CONFIG_SPD_EEPROM		/* Use SPD EEPROM for DDR setup*/  #define CONFIG_DDR_SPD -#define CONFIG_SYS_FSL_ERRATUM_DDR_MSYNC_IN	/* possible DLL fix needed */  #define CONFIG_ECC_INIT_VIA_DDRCONTROLLER	/* DDR controller or DMA? */  #define CONFIG_MEM_INIT_VALUE	0xDeadBeef diff --git a/include/configs/P2041RDB.h b/include/configs/P2041RDB.h new file mode 100644 index 000000000..2beb35729 --- /dev/null +++ b/include/configs/P2041RDB.h @@ -0,0 +1,624 @@ +/* + * Copyright 2011 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 + */ + +/* + * P2041 RDB board configuration file + * + */ +#ifndef __CONFIG_H +#define __CONFIG_H + +#define CONFIG_P2041RDB +#define CONFIG_PHYS_64BIT +#define CONFIG_PPC_P2041 + +#ifdef CONFIG_RAMBOOT_PBL +#define CONFIG_RAMBOOT_TEXT_BASE	CONFIG_SYS_TEXT_BASE +#define CONFIG_RESET_VECTOR_ADDRESS	0xfffffffc +#endif + +/* High Level Configuration Options */ +#define CONFIG_BOOKE +#define CONFIG_E500			/* BOOKE e500 family */ +#define CONFIG_E500MC			/* BOOKE e500mc family */ +#define CONFIG_SYS_BOOK3E_HV		/* Category E.HV supported */ +#define CONFIG_MPC85xx			/* MPC85xx/PQ3 platform */ +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */ +#define CONFIG_MP			/* support multiple processors */ + +#ifndef CONFIG_SYS_TEXT_BASE +#define CONFIG_SYS_TEXT_BASE	0xeff80000 +#endif + +#ifndef CONFIG_RESET_VECTOR_ADDRESS +#define CONFIG_RESET_VECTOR_ADDRESS	0xeffffffc +#endif + +#define CONFIG_SYS_FSL_CPC		/* Corenet Platform Cache */ +#define CONFIG_SYS_NUM_CPC		CONFIG_NUM_DDR_CONTROLLERS +#define CONFIG_FSL_ELBC			/* Has Enhanced localbus controller */ +#define CONFIG_PCI			/* Enable PCI/PCIE */ +#define CONFIG_PCIE1			/* PCIE controler 1 */ +#define CONFIG_PCIE2			/* PCIE controler 2 */ +#define CONFIG_PCIE3			/* PCIE controler 3 */ +#define CONFIG_FSL_PCI_INIT		/* Use common FSL init code */ +#define CONFIG_SYS_PCI_64BIT		/* enable 64-bit PCI resources */ + +#define CONFIG_SYS_SRIO +#define CONFIG_SRIO1			/* SRIO port 1 */ +#define CONFIG_SRIO2			/* SRIO port 2 */ + +#define CONFIG_FSL_LAW			/* Use common FSL init code */ + +#define CONFIG_ENV_OVERWRITE + +#ifdef CONFIG_SYS_NO_FLASH +#define CONFIG_ENV_IS_NOWHERE +#else +#define CONFIG_FLASH_CFI_DRIVER +#define CONFIG_SYS_FLASH_CFI +#endif + +#if defined(CONFIG_SPIFLASH) +	#define CONFIG_SYS_EXTRA_ENV_RELOC +	#define CONFIG_ENV_IS_IN_SPI_FLASH +	#define CONFIG_ENV_SPI_BUS              0 +	#define CONFIG_ENV_SPI_CS               0 +	#define CONFIG_ENV_SPI_MAX_HZ           10000000 +	#define CONFIG_ENV_SPI_MODE             0 +	#define CONFIG_ENV_SIZE                 0x2000          /* 8KB */ +	#define CONFIG_ENV_OFFSET               0x100000        /* 1MB */ +	#define CONFIG_ENV_SECT_SIZE            0x10000 +#elif defined(CONFIG_SDCARD) +	#define CONFIG_SYS_EXTRA_ENV_RELOC +	#define CONFIG_ENV_IS_IN_MMC +	#define CONFIG_SYS_MMC_ENV_DEV          0 +	#define CONFIG_ENV_SIZE			0x2000 +	#define CONFIG_ENV_OFFSET		(512 * 1097) +#else +	#define CONFIG_ENV_IS_IN_FLASH +	#define CONFIG_ENV_ADDR		(CONFIG_SYS_MONITOR_BASE \ +			- CONFIG_ENV_SECT_SIZE) +	#define CONFIG_ENV_SIZE		0x2000 +	#define CONFIG_ENV_SECT_SIZE	0x20000 /* 128K (one sector) */ +#endif + +#define CONFIG_SYS_CLK_FREQ	66666666 + +/* + * These can be toggled for performance analysis, otherwise use default. + */ +#define CONFIG_SYS_CACHE_STASHING +#define CONFIG_BTB			/* toggle branch predition */ + +#define CONFIG_ENABLE_36BIT_PHYS + +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_ADDR_MAP +#define CONFIG_SYS_NUM_ADDR_MAP		64	/* number of TLB1 entries */ +#endif + +#define CONFIG_POST CONFIG_SYS_POST_MEMORY	/* test POST memory test */ +#define CONFIG_SYS_MEMTEST_START	0x00200000	/* memtest works on */ +#define CONFIG_SYS_MEMTEST_END		0x00400000 +#define CONFIG_SYS_ALT_MEMTEST +#define CONFIG_PANIC_HANG	/* do not reset board on panic */ + +/* + *  Config the L3 Cache as L3 SRAM + */ +#define CONFIG_SYS_INIT_L3_ADDR		CONFIG_RAMBOOT_TEXT_BASE +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_INIT_L3_ADDR_PHYS	(0xf00000000ull | \ +		CONFIG_RAMBOOT_TEXT_BASE) +#else +#define CONFIG_SYS_INIT_L3_ADDR_PHYS	CONFIG_SYS_INIT_L3_ADDR +#endif +#define CONFIG_SYS_L3_SIZE		(1024 << 10) +#define CONFIG_SYS_INIT_L3_END (CONFIG_SYS_INIT_L3_ADDR + CONFIG_SYS_L3_SIZE) + +/* + * Base addresses -- Note these are effective addresses where the + * actual resources get mapped (not physical addresses) + */ +#define CONFIG_SYS_CCSRBAR_DEFAULT	0xfe000000	/* CCSRBAR Default */ +#define CONFIG_SYS_CCSRBAR		0xfe000000	/* relocated CCSRBAR */ +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_CCSRBAR_PHYS		0xffe000000ull +#else +#define CONFIG_SYS_CCSRBAR_PHYS	CONFIG_SYS_CCSRBAR +#endif +/* PQII uses CONFIG_SYS_IMMR */ +#define CONFIG_SYS_IMMR		CONFIG_SYS_CCSRBAR + +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_DCSRBAR		0xf0000000 +#define CONFIG_SYS_DCSRBAR_PHYS		0xf00000000ull +#endif + +/* EEPROM */ +#define CONFIG_ID_EEPROM +#define CONFIG_SYS_I2C_EEPROM_NXID +#define CONFIG_SYS_EEPROM_BUS_NUM	0 +#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50 +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1 + +/* + * DDR Setup + */ +#define CONFIG_VERY_BIG_RAM +#define CONFIG_SYS_DDR_SDRAM_BASE	0x00000000 +#define CONFIG_SYS_SDRAM_BASE		CONFIG_SYS_DDR_SDRAM_BASE + +#define CONFIG_DIMM_SLOTS_PER_CTLR	1 +#define CONFIG_CHIP_SELECTS_PER_CTRL	(4 * CONFIG_DIMM_SLOTS_PER_CTLR) + +#define CONFIG_DDR_SPD +#define CONFIG_FSL_DDR3 + +#define CONFIG_SYS_SPD_BUS_NUM	0 +#define SPD_EEPROM_ADDRESS	0x52 +#define CONFIG_SYS_SDRAM_SIZE	4096	/* for fixed parameter use */ + +/* + * Local Bus Definitions + */ + +/* Set the local bus clock 1/8 of platform clock */ +#define CONFIG_SYS_LBC_LCRR		LCRR_CLKDIV_8 + +#define CONFIG_SYS_FLASH_BASE		0xe8000000	/* Start of PromJet */ +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_FLASH_BASE_PHYS	0xfe8000000ull +#else +#define CONFIG_SYS_FLASH_BASE_PHYS	CONFIG_SYS_FLASH_BASE +#endif + +#define CONFIG_SYS_BR0_PRELIM \ +		(BR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS) | BR_PS_16 | BR_V) +#define CONFIG_SYS_OR0_PRELIM ((0xf8000ff7 & ~OR_GPCM_SCY & ~OR_GPCM_EHTR) \ +				| OR_GPCM_SCY_8 | OR_GPCM_EHTR_CLEAR) + +#define CONFIG_FSL_CPLD +#define CPLD_BASE		0xffdf0000	/* CPLD registers */ +#ifdef CONFIG_PHYS_64BIT +#define CPLD_BASE_PHYS		0xfffdf0000ull +#else +#define CPLD_BASE_PHYS		CPLD_BASE +#endif + +#define CONFIG_SYS_BR3_PRELIM	(BR_PHYS_ADDR(CPLD_BASE_PHYS) | BR_PS_8 | BR_V) +#define CONFIG_SYS_OR3_PRELIM	0xffffeff7	/* 32KB but only 4k mapped */ + +#define PIXIS_LBMAP_SWITCH	7 +#define PIXIS_LBMAP_MASK	0xf0 +#define PIXIS_LBMAP_SHIFT	4 +#define PIXIS_LBMAP_ALTBANK	0x40 + +#define CONFIG_SYS_FLASH_QUIET_TEST +#define CONFIG_FLASH_SHOW_PROGRESS	45 /* count down from 45/5: 9..1 */ + +#define CONFIG_SYS_MAX_FLASH_BANKS	1		/* number of banks */ +#define CONFIG_SYS_MAX_FLASH_SECT	1024		/* sectors per device */ +#define CONFIG_SYS_FLASH_ERASE_TOUT	60000		/* Erase Timeout (ms) */ +#define CONFIG_SYS_FLASH_WRITE_TOUT	500		/* Write Timeout (ms) */ + +#define CONFIG_SYS_MONITOR_BASE		CONFIG_SYS_TEXT_BASE + +#if defined(CONFIG_RAMBOOT_PBL) +#define CONFIG_SYS_RAMBOOT +#endif + +#define CONFIG_SYS_FLASH_EMPTY_INFO +#define CONFIG_SYS_FLASH_AMD_CHECK_DQ7 +#define CONFIG_SYS_FLASH_BANKS_LIST	{CONFIG_SYS_FLASH_BASE_PHYS} + +#define CONFIG_BOARD_EARLY_INIT_F +#define CONFIG_BOARD_EARLY_INIT_R	/* call board_early_init_r function */ +#define CONFIG_MISC_INIT_R + +#define CONFIG_HWCONFIG + +/* define to use L1 as initial stack */ +#define CONFIG_L1_INIT_RAM +#define CONFIG_SYS_INIT_RAM_LOCK +#define CONFIG_SYS_INIT_RAM_ADDR	0xffd00000	/* Initial L1 address */ +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH 0xf +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW CONFIG_SYS_INIT_RAM_ADDR +/* The assembler doesn't like typecast */ +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS \ +	((CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH * 1ull << 32) | \ +	  CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW) +#else +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS	CONFIG_SYS_INIT_RAM_ADDR +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH 0 +#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW CONFIG_SYS_INIT_RAM_ADDR_PHYS +#endif +#define CONFIG_SYS_INIT_RAM_SIZE	0x00004000 + +#define CONFIG_SYS_GBL_DATA_OFFSET	(CONFIG_SYS_INIT_RAM_SIZE - \ +					GENERATED_GBL_DATA_SIZE) +#define CONFIG_SYS_INIT_SP_OFFSET	CONFIG_SYS_GBL_DATA_OFFSET + +#define CONFIG_SYS_MONITOR_LEN		(512 * 1024) +#define CONFIG_SYS_MALLOC_LEN		(1024 * 1024) + +/* Serial Port - controlled on board with jumper J8 + * open - index 2 + * shorted - index 1 + */ +#define CONFIG_CONS_INDEX	1 +#define CONFIG_SYS_NS16550 +#define CONFIG_SYS_NS16550_SERIAL +#define CONFIG_SYS_NS16550_REG_SIZE	1 +#define CONFIG_SYS_NS16550_CLK		(get_bus_freq(0)/2) + +#define CONFIG_SYS_BAUDRATE_TABLE	\ +	{300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200} + +#define CONFIG_SYS_NS16550_COM1	(CONFIG_SYS_CCSRBAR+0x11C500) +#define CONFIG_SYS_NS16550_COM2	(CONFIG_SYS_CCSRBAR+0x11C600) +#define CONFIG_SYS_NS16550_COM3	(CONFIG_SYS_CCSRBAR+0x11D500) +#define CONFIG_SYS_NS16550_COM4	(CONFIG_SYS_CCSRBAR+0x11D600) + +/* Use the HUSH parser */ +#define CONFIG_SYS_HUSH_PARSER +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> " + +/* pass open firmware flat tree */ +#define CONFIG_OF_LIBFDT +#define CONFIG_OF_BOARD_SETUP +#define CONFIG_OF_STDOUT_VIA_ALIAS + +/* new uImage format support */ +#define CONFIG_FIT +#define CONFIG_FIT_VERBOSE	/* enable fit_format_{error,warning}() */ + +/* I2C */ +#define CONFIG_FSL_I2C		/* Use FSL common I2C driver */ +#define CONFIG_HARD_I2C		/* I2C with hardware support */ +#define CONFIG_I2C_MULTI_BUS +#define CONFIG_I2C_CMD_TREE +#define CONFIG_SYS_I2C_SPEED		400000 +#define CONFIG_SYS_I2C_SLAVE		0x7F +#define CONFIG_SYS_I2C_OFFSET		0x118000 +#define CONFIG_SYS_I2C2_OFFSET		0x118100 + +/* + * RapidIO + */ +#define CONFIG_SYS_SRIO1_MEM_VIRT	0xa0000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_SRIO1_MEM_PHYS	0xc20000000ull +#else +#define CONFIG_SYS_SRIO1_MEM_PHYS	0xa0000000 +#endif +#define CONFIG_SYS_SRIO1_MEM_SIZE	0x10000000	/* 256M */ + +#define CONFIG_SYS_SRIO2_MEM_VIRT	0xb0000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_SRIO2_MEM_PHYS	0xc30000000ull +#else +#define CONFIG_SYS_SRIO2_MEM_PHYS	0xb0000000 +#endif +#define CONFIG_SYS_SRIO2_MEM_SIZE	0x10000000	/* 256M */ + +/* + * eSPI - Enhanced SPI + */ +#define CONFIG_FSL_ESPI +#define CONFIG_SPI_FLASH +#define CONFIG_SPI_FLASH_SPANSION +#define CONFIG_CMD_SF +#define CONFIG_SF_DEFAULT_SPEED         10000000 +#define CONFIG_SF_DEFAULT_MODE          0 + +/* + * General PCI + * Memory space is mapped 1-1, but I/O space must start from 0. + */ + +/* controller 1, direct to uli, tgtid 3, Base address 20000 */ +#define CONFIG_SYS_PCIE1_MEM_VIRT	0x80000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE1_MEM_BUS	0xe0000000 +#define CONFIG_SYS_PCIE1_MEM_PHYS	0xc00000000ull +#else +#define CONFIG_SYS_PCIE1_MEM_BUS	0x80000000 +#define CONFIG_SYS_PCIE1_MEM_PHYS	0x80000000 +#endif +#define CONFIG_SYS_PCIE1_MEM_SIZE	0x20000000	/* 512M */ +#define CONFIG_SYS_PCIE1_IO_VIRT	0xf8000000 +#define CONFIG_SYS_PCIE1_IO_BUS		0x00000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE1_IO_PHYS	0xff8000000ull +#else +#define CONFIG_SYS_PCIE1_IO_PHYS	0xf8000000 +#endif +#define CONFIG_SYS_PCIE1_IO_SIZE	0x00010000	/* 64k */ + +/* controller 2, Slot 2, tgtid 2, Base address 201000 */ +#define CONFIG_SYS_PCIE2_MEM_VIRT	0xa0000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE2_MEM_BUS	0xe0000000 +#define CONFIG_SYS_PCIE2_MEM_PHYS	0xc20000000ull +#else +#define CONFIG_SYS_PCIE2_MEM_BUS	0xa0000000 +#define CONFIG_SYS_PCIE2_MEM_PHYS	0xa0000000 +#endif +#define CONFIG_SYS_PCIE2_MEM_SIZE	0x20000000	/* 512M */ +#define CONFIG_SYS_PCIE2_IO_VIRT	0xf8010000 +#define CONFIG_SYS_PCIE2_IO_BUS		0x00000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE2_IO_PHYS	0xff8010000ull +#else +#define CONFIG_SYS_PCIE2_IO_PHYS	0xf8010000 +#endif +#define CONFIG_SYS_PCIE2_IO_SIZE	0x00010000	/* 64k */ + +/* controller 3, Slot 1, tgtid 1, Base address 202000 */ +#define CONFIG_SYS_PCIE3_MEM_VIRT	0xc0000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE3_MEM_BUS	0xe0000000 +#define CONFIG_SYS_PCIE3_MEM_PHYS	0xc40000000ull +#else +#define CONFIG_SYS_PCIE3_MEM_BUS	0xc0000000 +#define CONFIG_SYS_PCIE3_MEM_PHYS	0xc0000000 +#endif +#define CONFIG_SYS_PCIE3_MEM_SIZE	0x20000000	/* 512M */ +#define CONFIG_SYS_PCIE3_IO_VIRT	0xf8020000 +#define CONFIG_SYS_PCIE3_IO_BUS		0x00000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_PCIE3_IO_PHYS	0xff8020000ull +#else +#define CONFIG_SYS_PCIE3_IO_PHYS	0xf8020000 +#endif +#define CONFIG_SYS_PCIE3_IO_SIZE	0x00010000	/* 64k */ + +/* Qman/Bman */ +#define CONFIG_SYS_DPAA_QBMAN		/* Support Q/Bman */ +#define CONFIG_SYS_BMAN_NUM_PORTALS	10 +#define CONFIG_SYS_BMAN_MEM_BASE	0xf4000000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_BMAN_MEM_PHYS	0xff4000000ull +#else +#define CONFIG_SYS_BMAN_MEM_PHYS	CONFIG_SYS_BMAN_MEM_BASE +#endif +#define CONFIG_SYS_BMAN_MEM_SIZE	0x00200000 +#define CONFIG_SYS_QMAN_NUM_PORTALS	10 +#define CONFIG_SYS_QMAN_MEM_BASE	0xf4200000 +#ifdef CONFIG_PHYS_64BIT +#define CONFIG_SYS_QMAN_MEM_PHYS	0xff4200000ull +#else +#define CONFIG_SYS_QMAN_MEM_PHYS	CONFIG_SYS_QMAN_MEM_BASE +#endif +#define CONFIG_SYS_QMAN_MEM_SIZE	0x00200000 + +#define CONFIG_SYS_DPAA_FMAN +#define CONFIG_SYS_DPAA_PME +/* Default address of microcode for the Linux Fman driver */ +#define CONFIG_SYS_FMAN_FW +#if defined(CONFIG_SPIFLASH) +/* + * env is stored at 0x100000, sector size is 0x10000, ucode is stored after + * env, so we got 0x110000. + */ +#define CONFIG_SYS_QE_FW_IN_SPIFLASH	0x110000 +#elif defined(CONFIG_SDCARD) +/* + * PBL SD boot image should stored at 0x1000(8 blocks), the size of the image is + * about 545KB (1089 blocks), Env is stored after the image, and the env size is + * 0x2000 (16 blocks), 8 + 1089 + 16 = 1113, enlarge it to 1130. + */ +#define CONFIG_SYS_QE_FW_IN_MMC		(512 * 1130) +#elif defined(CONFIG_NAND) +#define CONFIG_SYS_QE_FW_IN_NAND	(6 * CONFIG_SYS_NAND_BLOCK_SIZE) +#else +#define CONFIG_SYS_FMAN_FW_ADDR		0xEF000000 +#endif +#define CONFIG_SYS_FMAN_FW_LENGTH	0x10000 +#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_FMAN_FW_LENGTH) + +#ifdef CONFIG_SYS_DPAA_FMAN +#define CONFIG_FMAN_ENET +#endif + +#ifdef CONFIG_PCI +#define CONFIG_NET_MULTI +#define CONFIG_PCI_PNP			/* do pci plug-and-play */ +#define CONFIG_E1000 + +#define CONFIG_PCI_SCAN_SHOW		/* show pci devices on startup */ +#define CONFIG_DOS_PARTITION +#endif	/* CONFIG_PCI */ + +#ifdef CONFIG_FMAN_ENET +#define CONFIG_SYS_FM1_DTSEC1_PHY_ADDR	0x2 +#define CONFIG_SYS_FM1_DTSEC2_PHY_ADDR	0x3 +#define CONFIG_SYS_FM1_DTSEC3_PHY_ADDR	0x4 +#define CONFIG_SYS_FM1_DTSEC4_PHY_ADDR	0x1 +#define CONFIG_SYS_FM1_DTSEC5_PHY_ADDR	0x0 + +#define CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR	0x1c +#define CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR	0x1d +#define CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR	0x1e +#define CONFIG_SYS_FM1_DTSEC4_RISER_PHY_ADDR	0x1f + +#define CONFIG_SYS_TBIPA_VALUE	8 +#define CONFIG_MII		/* MII PHY management */ +#define CONFIG_ETHPRIME		"FM1@DTSEC1" +#define CONFIG_PHY_GIGE		/* Include GbE speed/duplex detection */ +#endif + +/* + * Environment + */ +#define CONFIG_LOADS_ECHO		/* echo on for serial download */ +#define CONFIG_SYS_LOADS_BAUD_CHANGE	/* allow baudrate change */ + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> + +#define CONFIG_CMD_DHCP +#define CONFIG_CMD_ELF +#define CONFIG_CMD_ERRATA +#define CONFIG_CMD_GREPENV +#define CONFIG_CMD_IRQ +#define CONFIG_CMD_I2C +#define CONFIG_CMD_MII +#define CONFIG_CMD_PING +#define CONFIG_CMD_SETEXPR + +#ifdef CONFIG_PCI +#define CONFIG_CMD_PCI +#define CONFIG_CMD_NET +#endif + +/* +* USB +*/ +#define CONFIG_CMD_USB +#define CONFIG_USB_STORAGE +#define CONFIG_USB_EHCI +#define CONFIG_USB_EHCI_FSL +#define CONFIG_EHCI_HCD_INIT_AFTER_RESET +#define CONFIG_CMD_EXT2 + +#define CONFIG_MMC + +#ifdef CONFIG_MMC +#define CONFIG_FSL_ESDHC +#define CONFIG_SYS_FSL_ESDHC_ADDR       CONFIG_SYS_MPC85xx_ESDHC_ADDR +#define CONFIG_SYS_FSL_ESDHC_BROKEN_TIMEOUT +#define CONFIG_CMD_MMC +#define CONFIG_GENERIC_MMC +#define CONFIG_CMD_EXT2 +#define CONFIG_CMD_FAT +#define CONFIG_DOS_PARTITION +#endif + +/* + * Miscellaneous configurable options + */ +#define CONFIG_SYS_LONGHELP			/* undef to save memory	*/ +#define CONFIG_CMDLINE_EDITING			/* Command-line editing */ +#define CONFIG_AUTO_COMPLETE			/* add autocompletion support */ +#define CONFIG_SYS_LOAD_ADDR	0x2000000	/* default load address */ +#define CONFIG_SYS_PROMPT	"=> "		/* Monitor Command Prompt */ +#ifdef CONFIG_CMD_KGDB +#define CONFIG_SYS_CBSIZE	1024		/* Console I/O Buffer Size */ +#else +#define CONFIG_SYS_CBSIZE	256		/* Console I/O Buffer Size */ +#endif +/* Print Buffer Size */ +#define CONFIG_SYS_PBSIZE	(CONFIG_SYS_CBSIZE + \ +				sizeof(CONFIG_SYS_PROMPT)+16) +#define CONFIG_SYS_MAXARGS	16		/* max number of command args */ +/* Boot Argument Buffer Size */ +#define CONFIG_SYS_BARGSIZE	CONFIG_SYS_CBSIZE +#define CONFIG_SYS_HZ		1000		/* decrementer freq 1ms ticks */ + +/* + * For booting Linux, the board info and command line data + * have to be in the first 64 MB of memory, since this is + * the maximum mapped by the Linux kernel during initialization. + */ +#define CONFIG_SYS_BOOTMAPSZ	(64 << 20)	/* Initial Memory for Linux */ +#define CONFIG_SYS_BOOTM_LEN	(64 << 20)	/* Increase max gunzip size */ + +#ifdef CONFIG_CMD_KGDB +#define CONFIG_KGDB_BAUDRATE	230400	/* speed to run kgdb serial port */ +#define CONFIG_KGDB_SER_INDEX	2	/* which serial port to use */ +#endif + +/* + * Environment Configuration + */ +#define CONFIG_ROOTPATH		/opt/nfsroot +#define CONFIG_BOOTFILE		uImage +#define CONFIG_UBOOTPATH	u-boot.bin + +/* default location for tftp and bootm */ +#define CONFIG_LOADADDR		1000000 + +#define CONFIG_BOOTDELAY	10	/* -1 disables auto-boot */ + +#define CONFIG_BAUDRATE	115200 + +#define __USB_PHY_TYPE	utmi + +#define	CONFIG_EXTRA_ENV_SETTINGS				\ +	"hwconfig=fsl_ddr:ctlr_intlv=cacheline,"		\ +	"bank_intlv=cs0_cs1\0"					\ +	"netdev=eth0\0"						\ +	"uboot=" MK_STR(CONFIG_UBOOTPATH) "\0"			\ +	"ubootaddr=" MK_STR(CONFIG_SYS_TEXT_BASE) "\0"		\ +	"tftpflash=tftpboot $loadaddr $uboot && "		\ +	"protect off $ubootaddr +$filesize && "			\ +	"erase $ubootaddr +$filesize && "			\ +	"cp.b $loadaddr $ubootaddr $filesize && "		\ +	"protect on $ubootaddr +$filesize && "			\ +	"cmp.b $loadaddr $ubootaddr $filesize\0"		\ +	"consoledev=ttyS0\0"					\ +	"usb_phy_type=" MK_STR(__USB_PHY_TYPE) "\0"		\ +	"usb_dr_mode=host\0"					\ +	"ramdiskaddr=2000000\0"					\ +	"ramdiskfile=p2041rdb/ramdisk.uboot\0"			\ +	"fdtaddr=c00000\0"					\ +	"fdtfile=p2041rdb/p2041rdb.dtb\0"			\ +	"bdev=sda3\0"						\ +	"c=ffe\0" + +#define CONFIG_HDBOOT					\ +	"setenv bootargs root=/dev/$bdev rw "		\ +	"console=$consoledev,$baudrate $othbootargs;"	\ +	"tftp $loadaddr $bootfile;"			\ +	"tftp $fdtaddr $fdtfile;"			\ +	"bootm $loadaddr - $fdtaddr" + +#define CONFIG_NFSBOOTCOMMAND			\ +	"setenv bootargs root=/dev/nfs rw "	\ +	"nfsroot=$serverip:$rootpath "		\ +	"ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ +	"console=$consoledev,$baudrate $othbootargs;"	\ +	"tftp $loadaddr $bootfile;"		\ +	"tftp $fdtaddr $fdtfile;"		\ +	"bootm $loadaddr - $fdtaddr" + +#define CONFIG_RAMBOOTCOMMAND				\ +	"setenv bootargs root=/dev/ram rw "		\ +	"console=$consoledev,$baudrate $othbootargs;"	\ +	"tftp $ramdiskaddr $ramdiskfile;"		\ +	"tftp $loadaddr $bootfile;"			\ +	"tftp $fdtaddr $fdtfile;"			\ +	"bootm $loadaddr $ramdiskaddr $fdtaddr" + +#define CONFIG_BOOTCOMMAND		CONFIG_HDBOOT + +#ifdef CONFIG_SECURE_BOOT +#include <asm/fsl_secure_boot.h> +#endif + +#endif	/* __CONFIG_H */ diff --git a/include/fdt_support.h b/include/fdt_support.h index ce6817b6d..863024ff7 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -79,6 +79,7 @@ void ft_pci_setup(void *blob, bd_t *bd);  void set_working_fdt_addr(void *addr);  int fdt_resize(void *blob); +int fdt_increase_size(void *fdt, int add_len);  int fdt_fixup_nor_flash_size(void *blob); @@ -88,7 +89,12 @@ u64 fdt_translate_address(void *blob, int node_offset, const u32 *in_addr);  int fdt_node_offset_by_compat_reg(void *blob, const char *compat,  					phys_addr_t compat_off);  int fdt_alloc_phandle(void *blob); +int fdt_create_phandle(void *fdt, int nodeoffset, uint32_t phandle);  int fdt_add_edid(void *blob, const char *compat, unsigned char *buf); +int fdt_verify_alias_address(void *fdt, int anode, const char *alias, +			      u64 addr); +u64 fdt_get_base_address(void *fdt, int node); +  #endif /* ifdef CONFIG_OF_LIBFDT */  #endif /* ifndef __FDT_SUPPORT_H */ diff --git a/include/libfdt.h b/include/libfdt.h index d23d40e07..de82ed5ff 100644 --- a/include/libfdt.h +++ b/include/libfdt.h @@ -343,6 +343,75 @@ int fdt_path_offset(const void *fdt, const char *path);  const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);  /** + * fdt_first_property_offset - find the offset of a node's first property + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of a node + * + * fdt_first_property_offset() finds the first property of the node at + * the given structure block offset. + * + * returns: + *	structure block offset of the property (>=0), on success + *	-FDT_ERR_NOTFOUND, if the requested node has no properties + *	-FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_BEGIN_NODE tag + *      -FDT_ERR_BADMAGIC, + *	-FDT_ERR_BADVERSION, + *	-FDT_ERR_BADSTATE, + *	-FDT_ERR_BADSTRUCTURE, + *	-FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_first_property_offset(const void *fdt, int nodeoffset); + +/** + * fdt_next_property_offset - step through a node's properties + * @fdt: pointer to the device tree blob + * @offset: structure block offset of a property + * + * fdt_next_property_offset() finds the property immediately after the + * one at the given structure block offset.  This will be a property + * of the same node as the given property. + * + * returns: + *	structure block offset of the next property (>=0), on success + *	-FDT_ERR_NOTFOUND, if the given property is the last in its node + *	-FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_PROP tag + *      -FDT_ERR_BADMAGIC, + *	-FDT_ERR_BADVERSION, + *	-FDT_ERR_BADSTATE, + *	-FDT_ERR_BADSTRUCTURE, + *	-FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_next_property_offset(const void *fdt, int offset); + +/** + * fdt_get_property_by_offset - retrieve the property at a given offset + * @fdt: pointer to the device tree blob + * @offset: offset of the property to retrieve + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_property_by_offset() retrieves a pointer to the + * fdt_property structure within the device tree blob at the given + * offset.  If lenp is non-NULL, the length of the property value is + * also returned, in the integer pointed to by lenp. + * + * returns: + *	pointer to the structure representing the property + *		if lenp is non-NULL, *lenp contains the length of the property + *		value (>=0) + *	NULL, on error + *		if lenp is non-NULL, *lenp contains an error code (<0): + *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag + *		-FDT_ERR_BADMAGIC, + *		-FDT_ERR_BADVERSION, + *		-FDT_ERR_BADSTATE, + *		-FDT_ERR_BADSTRUCTURE, + *		-FDT_ERR_TRUNCATED, standard meanings + */ +const struct fdt_property *fdt_get_property_by_offset(const void *fdt, +						      int offset, +						      int *lenp); + +/**   * fdt_get_property_namelen - find a property based on substring   * @fdt: pointer to the device tree blob   * @nodeoffset: offset of the node whose property to find @@ -396,6 +465,40 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,  }  /** + * fdt_getprop_by_offset - retrieve the value of a property at a given offset + * @fdt: pointer to the device tree blob + * @ffset: offset of the property to read + * @namep: pointer to a string variable (will be overwritten) or NULL + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_getprop_by_offset() retrieves a pointer to the value of the + * property at structure block offset 'offset' (this will be a pointer + * to within the device blob itself, not a copy of the value).  If + * lenp is non-NULL, the length of the property value is also + * returned, in the integer pointed to by lenp.  If namep is non-NULL, + * the property's namne will also be returned in the char * pointed to + * by namep (this will be a pointer to within the device tree's string + * block, not a new copy of the name). + * + * returns: + *	pointer to the property's value + *		if lenp is non-NULL, *lenp contains the length of the property + *		value (>=0) + *		if namep is non-NULL *namep contiains a pointer to the property + *		name. + *	NULL, on error + *		if lenp is non-NULL, *lenp contains an error code (<0): + *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag + *		-FDT_ERR_BADMAGIC, + *		-FDT_ERR_BADVERSION, + *		-FDT_ERR_BADSTATE, + *		-FDT_ERR_BADSTRUCTURE, + *		-FDT_ERR_TRUNCATED, standard meanings + */ +const void *fdt_getprop_by_offset(const void *fdt, int offset, +				  const char **namep, int *lenp); + +/**   * fdt_getprop_namelen - get property value based on substring   * @fdt: pointer to the device tree blob   * @nodeoffset: offset of the node whose property to find diff --git a/lib/libfdt/fdt.c b/lib/libfdt/fdt.c index b09ea6f04..4157b21ef 100644 --- a/lib/libfdt/fdt.c +++ b/lib/libfdt/fdt.c @@ -153,6 +153,15 @@ int _fdt_check_node_offset(const void *fdt, int offset)  	return offset;  } +int _fdt_check_prop_offset(const void *fdt, int offset) +{ +	if ((offset < 0) || (offset % FDT_TAGSIZE) +	    || (fdt_next_tag(fdt, offset, &offset) != FDT_PROP)) +		return -FDT_ERR_BADOFFSET; + +	return offset; +} +  int fdt_next_node(const void *fdt, int offset, int *depth)  {  	int nextoffset = 0; diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c index 1e1e32209..1933010fd 100644 --- a/lib/libfdt/fdt_ro.c +++ b/lib/libfdt/fdt_ro.c @@ -109,6 +109,30 @@ int fdt_num_mem_rsv(const void *fdt)  	return i;  } +static int _nextprop(const void *fdt, int offset) +{ +	uint32_t tag; +	int nextoffset; + +	do { +		tag = fdt_next_tag(fdt, offset, &nextoffset); + +		switch (tag) { +		case FDT_END: +			if (nextoffset >= 0) +				return -FDT_ERR_BADSTRUCTURE; +			else +				return nextoffset; + +		case FDT_PROP: +			return offset; +		} +		offset = nextoffset; +	} while (tag == FDT_NOP); + +	return -FDT_ERR_NOTFOUND; +} +  int fdt_subnode_offset_namelen(const void *fdt, int offset,  			       const char *name, int namelen)  { @@ -198,52 +222,66 @@ const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)  	return NULL;  } -const struct fdt_property *fdt_get_property_namelen(const void *fdt, -						    int nodeoffset, -						    const char *name, -						    int namelen, int *lenp) +int fdt_first_property_offset(const void *fdt, int nodeoffset) +{ +	int offset; + +	if ((offset = _fdt_check_node_offset(fdt, nodeoffset)) < 0) +		return offset; + +	return _nextprop(fdt, offset); +} + +int fdt_next_property_offset(const void *fdt, int offset) +{ +	if ((offset = _fdt_check_prop_offset(fdt, offset)) < 0) +		return offset; + +	return _nextprop(fdt, offset); +} + +const struct fdt_property *fdt_get_property_by_offset(const void *fdt, +						      int offset, +						      int *lenp)  { -	uint32_t tag; -	const struct fdt_property *prop; -	int offset, nextoffset;  	int err; +	const struct fdt_property *prop; -	if (((err = fdt_check_header(fdt)) != 0) -	    || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0)) -			goto fail; +	if ((err = _fdt_check_prop_offset(fdt, offset)) < 0) { +		if (lenp) +			*lenp = err; +		return NULL; +	} -	nextoffset = err; -	do { -		offset = nextoffset; +	prop = _fdt_offset_ptr(fdt, offset); -		tag = fdt_next_tag(fdt, offset, &nextoffset); -		switch (tag) { -		case FDT_END: -			if (nextoffset < 0) -				err = nextoffset; -			else -				/* FDT_END tag with unclosed nodes */ -				err = -FDT_ERR_BADSTRUCTURE; -			goto fail; +	if (lenp) +		*lenp = fdt32_to_cpu(prop->len); -		case FDT_PROP: -			prop = _fdt_offset_ptr(fdt, offset); -			if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff), -					   name, namelen)) { -				/* Found it! */ -				if (lenp) -					*lenp = fdt32_to_cpu(prop->len); +	return prop; +} -				return prop; -			} +const struct fdt_property *fdt_get_property_namelen(const void *fdt, +						    int offset, +						    const char *name, +						    int namelen, int *lenp) +{ +	for (offset = fdt_first_property_offset(fdt, offset); +	     (offset >= 0); +	     (offset = fdt_next_property_offset(fdt, offset))) { +		const struct fdt_property *prop; + +		if (!(prop = fdt_get_property_by_offset(fdt, offset, lenp))) { +			offset = -FDT_ERR_INTERNAL;  			break;  		} -	} while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE)); +		if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff), +				   name, namelen)) +			return prop; +	} -	err = -FDT_ERR_NOTFOUND; - fail:  	if (lenp) -		*lenp = err; +		*lenp = offset;  	return NULL;  } @@ -267,6 +305,19 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,  	return prop->data;  } +const void *fdt_getprop_by_offset(const void *fdt, int offset, +				  const char **namep, int *lenp) +{ +	const struct fdt_property *prop; + +	prop = fdt_get_property_by_offset(fdt, offset, lenp); +	if (!prop) +		return NULL; +	if (namep) +		*namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); +	return prop->data; +} +  const void *fdt_getprop(const void *fdt, int nodeoffset,  			const char *name, int *lenp)  { @@ -278,9 +329,14 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)  	const uint32_t *php;  	int len; -	php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); -	if (!php || (len != sizeof(*php))) -		return 0; +	/* FIXME: This is a bit sub-optimal, since we potentially scan +	 * over all the properties twice. */ +	php = fdt_getprop(fdt, nodeoffset, "phandle", &len); +	if (!php || (len != sizeof(*php))) { +		php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); +		if (!php || (len != sizeof(*php))) +			return 0; +	}  	return fdt32_to_cpu(*php);  } @@ -440,11 +496,27 @@ int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,  int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)  { +	int offset; +  	if ((phandle == 0) || (phandle == -1))  		return -FDT_ERR_BADPHANDLE; -	phandle = cpu_to_fdt32(phandle); -	return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle", -					     &phandle, sizeof(phandle)); + +	FDT_CHECK_HEADER(fdt); + +	/* FIXME: The algorithm here is pretty horrible: we +	 * potentially scan each property of a node in +	 * fdt_get_phandle(), then if that didn't find what +	 * we want, we scan over them again making our way to the next +	 * node.  Still it's the easiest to implement approach; +	 * performance can come later. */ +	for (offset = fdt_next_node(fdt, -1, NULL); +	     offset >= 0; +	     offset = fdt_next_node(fdt, offset, NULL)) { +		if (fdt_get_phandle(fdt, offset) == phandle) +			return offset; +	} + +	return offset; /* error from fdt_next_node() */  }  static int _fdt_stringlist_contains(const char *strlist, int listlen, diff --git a/lib/libfdt/libfdt_internal.h b/lib/libfdt/libfdt_internal.h index d2dcbd65e..381133ba8 100644 --- a/lib/libfdt/libfdt_internal.h +++ b/lib/libfdt/libfdt_internal.h @@ -63,6 +63,7 @@  	}  int _fdt_check_node_offset(const void *fdt, int offset); +int _fdt_check_prop_offset(const void *fdt, int offset);  const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);  int _fdt_node_end_offset(void *fdt, int nodeoffset); |