diff options
| author | Tom Rini <trini@ti.com> | 2013-08-13 09:14:02 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-08-13 09:14:02 -0400 | 
| commit | b98d934128bcd98106e764d2f492ac79c38ae53d (patch) | |
| tree | 5e078614fccb51f34fa8f7aa8d92c4f5f518b686 /arch | |
| parent | 67cafc0861477bf19a587508ed13f4538c7a281e (diff) | |
| parent | 3aab0cd852d7c9565c2559a7983cbb73852bac28 (diff) | |
| download | olio-uboot-2014.01-b98d934128bcd98106e764d2f492ac79c38ae53d.tar.xz olio-uboot-2014.01-b98d934128bcd98106e764d2f492ac79c38ae53d.zip | |
Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
Diffstat (limited to 'arch')
32 files changed, 396 insertions, 40 deletions
| diff --git a/arch/powerpc/cpu/mpc83xx/pcie.c b/arch/powerpc/cpu/mpc83xx/pcie.c index 09970b058..28c25e5fe 100644 --- a/arch/powerpc/cpu/mpc83xx/pcie.c +++ b/arch/powerpc/cpu/mpc83xx/pcie.c @@ -299,6 +299,8 @@ static void mpc83xx_pcie_init_bus(int bus, struct pci_region *reg)  	printf("PCIE%d: ", bus); +#define PCI_LTSSM	0x404 /* PCIe Link Training, Status State Machine */ +#define PCI_LTSSM_L0	0x16 /* L0 state */  	reg16 = in_le16(hose_cfg_base + PCI_LTSSM);  	if (reg16 >= PCI_LTSSM_L0)  		printf("link\n"); diff --git a/arch/powerpc/cpu/mpc85xx/Makefile b/arch/powerpc/cpu/mpc85xx/Makefile index 0d1e8f1f0..f70f0d747 100644 --- a/arch/powerpc/cpu/mpc85xx/Makefile +++ b/arch/powerpc/cpu/mpc85xx/Makefile @@ -46,6 +46,7 @@ COBJS-$(CONFIG_MPC8568) += ddr-gen2.o  COBJS-$(CONFIG_MPC8544) += ddr-gen2.o  # supports ddr1/2/3 +COBJS-$(CONFIG_PPC_C29X)	+= ddr-gen3.o  COBJS-$(CONFIG_MPC8572) += ddr-gen3.o  COBJS-$(CONFIG_MPC8536) += ddr-gen3.o  COBJS-$(CONFIG_MPC8569)	+= ddr-gen3.o @@ -100,6 +101,7 @@ COBJS-$(CONFIG_SYS_FSL_QORIQ_CHASSIS1) += fsl_corenet_serdes.o  COBJS-$(CONFIG_SYS_FSL_QORIQ_CHASSIS2) += fsl_corenet2_serdes.o  # SoC specific SERDES support +COBJS-$(CONFIG_PPC_C29X)	+= c29x_serdes.o  COBJS-$(CONFIG_MPC8536) += mpc8536_serdes.o  COBJS-$(CONFIG_MPC8544) += mpc8544_serdes.o  COBJS-$(CONFIG_MPC8548) += mpc8548_serdes.o diff --git a/arch/powerpc/cpu/mpc85xx/b4860_ids.c b/arch/powerpc/cpu/mpc85xx/b4860_ids.c index 53c6a7faf..39b8e3ecc 100644 --- a/arch/powerpc/cpu/mpc85xx/b4860_ids.c +++ b/arch/powerpc/cpu/mpc85xx/b4860_ids.c @@ -41,8 +41,8 @@ struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {  #ifdef CONFIG_SYS_SRIO  struct srio_liodn_id_table srio_liodn_tbl[] = { -	SET_SRIO_LIODN_1(1, 307), -	SET_SRIO_LIODN_1(2, 387), +	SET_SRIO_LIODN_BASE(1, 307), +	SET_SRIO_LIODN_BASE(2, 387),  };  int srio_liodn_tbl_sz = ARRAY_SIZE(srio_liodn_tbl);  #endif @@ -112,10 +112,10 @@ int sec_liodn_tbl_sz = ARRAY_SIZE(sec_liodn_tbl);  #ifdef CONFIG_SYS_DPAA_RMAN  struct liodn_id_table rman_liodn_tbl[] = {  	/* Set RMan block 0-3 liodn offset */ -	SET_RMAN_LIODN(0, 678), -	SET_RMAN_LIODN(1, 679), -	SET_RMAN_LIODN(2, 680), -	SET_RMAN_LIODN(3, 681), +	SET_RMAN_LIODN(0, 6), +	SET_RMAN_LIODN(1, 7), +	SET_RMAN_LIODN(2, 8), +	SET_RMAN_LIODN(3, 9),  };  int rman_liodn_tbl_sz = ARRAY_SIZE(rman_liodn_tbl);  #endif diff --git a/arch/powerpc/cpu/mpc85xx/c29x_serdes.c b/arch/powerpc/cpu/mpc85xx/c29x_serdes.c new file mode 100644 index 000000000..51972cb7c --- /dev/null +++ b/arch/powerpc/cpu/mpc85xx/c29x_serdes.c @@ -0,0 +1,62 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <config.h> +#include <common.h> +#include <asm/io.h> +#include <asm/immap_85xx.h> +#include <asm/fsl_serdes.h> + +#define SRDS1_MAX_LANES		4 + +static u32 serdes1_prtcl_map; + +struct serdes_config { +	u32 protocol; +	u8 lanes[SRDS1_MAX_LANES]; +}; + +static const struct serdes_config serdes1_cfg_tbl[] = { +	/* SerDes 1 */ +	{1, {PCIE1, PCIE1, PCIE1, PCIE1} }, +	{2, {PCIE1, PCIE1, PCIE1, PCIE1} }, +	{3, {PCIE1, PCIE1, NONE, NONE} }, +	{4, {PCIE1, PCIE1, NONE, NONE} }, +	{5, {PCIE1, NONE, NONE, NONE} }, +	{6, {PCIE1, NONE, NONE, NONE} }, +	{} +}; + +int is_serdes_configured(enum srds_prtcl device) +{ +	return (1 << device) & serdes1_prtcl_map; +} + +void fsl_serdes_init(void) +{ +	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; +	u32 pordevsr = in_be32(&gur->pordevsr); +	u32 srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> +				MPC85xx_PORDEVSR_IO_SEL_SHIFT; +	const struct serdes_config *ptr; +	int lane; + +	debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); + +	if (srds_cfg > ARRAY_SIZE(serdes1_cfg_tbl)) { +		printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); +		return; +	} + +	ptr = &serdes1_cfg_tbl[srds_cfg]; +	if (!ptr->protocol) +		return; + +	for (lane = 0; lane < SRDS1_MAX_LANES; lane++) { +		enum srds_prtcl lane_prtcl = ptr->lanes[lane]; +		serdes1_prtcl_map |= (1 << lane_prtcl); +	} +} diff --git a/arch/powerpc/cpu/mpc85xx/cmd_errata.c b/arch/powerpc/cpu/mpc85xx/cmd_errata.c index 5cd02ccde..cbb443fd2 100644 --- a/arch/powerpc/cpu/mpc85xx/cmd_errata.c +++ b/arch/powerpc/cpu/mpc85xx/cmd_errata.c @@ -245,6 +245,9 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #ifdef CONFIG_SYS_FSL_ERRATUM_A006593  	puts("Work-around for Erratum A006593 enabled\n");  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A005812 +	puts("Work-around for Erratum A-005812 enabled\n"); +#endif  	return 0;  } diff --git a/arch/powerpc/cpu/mpc85xx/cpu.c b/arch/powerpc/cpu/mpc85xx/cpu.c index 91ac4ee61..66bc6a2ea 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu.c +++ b/arch/powerpc/cpu/mpc85xx/cpu.c @@ -44,10 +44,10 @@ int checkcpu (void)  	uint major, minor;  	struct cpu_type *cpu;  	char buf1[32], buf2[32]; -#if (defined(CONFIG_DDR_CLK_FREQ) || \ -	defined(CONFIG_FSL_CORENET)) && !defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) -	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); -#endif /* CONFIG_FSL_CORENET */ +#if defined(CONFIG_DDR_CLK_FREQ) || defined(CONFIG_FSL_CORENET) +	ccsr_gur_t __iomem *gur = +		(void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); +#endif  	/*  	 * Cornet platforms use ddr sync bit in RCW to indicate sync vs async @@ -211,6 +211,21 @@ int checkcpu (void)  	puts("L1:    D-cache 32 kB enabled\n       I-cache 32 kB enabled\n"); +#ifdef CONFIG_FSL_CORENET +	/* 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"); +#endif +  	return 0;  } diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c index 25beda233..48b38263f 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c @@ -399,6 +399,14 @@ int cpu_init_r(void)  		sync();  	}  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A005812 +	/* +	 * A-005812 workaround sets bit 32 of SPR 976 for SoCs running +	 * in write shadow mode. Checking DCWS before setting SPR 976. +	 */ +	if (mfspr(L1CSR2) & L1CSR2_DCWS) +		mtspr(SPRN_HDBCR0, (mfspr(SPRN_HDBCR0) | 0x80000000)); +#endif  #if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP)  	spin = getenv("spin_table_compat"); @@ -532,8 +540,10 @@ skip_l2:  	enable_cpc(); +#ifndef CONFIG_SYS_FSL_NO_SERDES  	/* needs to be in ram since code uses global static vars */  	fsl_serdes_init(); +#endif  #ifdef CONFIG_SYS_FSL_ERRATUM_A005871  	if (IS_SVR_REV(svr, 1, 0)) { diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen1.c b/arch/powerpc/cpu/mpc85xx/ddr-gen1.c index 8a86819fb..4dd8c0b5b 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen1.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen1.c @@ -15,7 +15,7 @@  #endif  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -			     unsigned int ctrl_num) +			     unsigned int ctrl_num, int step)  {  	unsigned int i;  	volatile ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR; diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen2.c b/arch/powerpc/cpu/mpc85xx/ddr-gen2.c index a70586252..542bc84ac 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen2.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen2.c @@ -16,7 +16,7 @@  #endif  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -			     unsigned int ctrl_num) +			     unsigned int ctrl_num, int step)  {  	unsigned int i;  	ccsr_ddr_t *ddr = (void *)CONFIG_SYS_MPC8xxx_DDR_ADDR; diff --git a/arch/powerpc/cpu/mpc85xx/ddr-gen3.c b/arch/powerpc/cpu/mpc85xx/ddr-gen3.c index c5b47200e..1be51d330 100644 --- a/arch/powerpc/cpu/mpc85xx/ddr-gen3.c +++ b/arch/powerpc/cpu/mpc85xx/ddr-gen3.c @@ -15,8 +15,18 @@  #error Invalid setting for CONFIG_CHIP_SELECTS_PER_CTRL  #endif + +/* + * regs has the to-be-set values for DDR controller registers + * ctrl_num is the DDR controller number + * step: 0 goes through the initialization in one pass + *       1 sets registers and returns before enabling controller + *       2 resumes from step 1 and continues to initialize + * Dividing the initialization to two steps to deassert DDR reset signal + * to comply with JEDEC specs for RDIMMs. + */  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -			     unsigned int ctrl_num) +			     unsigned int ctrl_num, int step)  {  	unsigned int i, bus_width;  	volatile ccsr_ddr_t *ddr; @@ -54,6 +64,9 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  		return;  	} +	if (step == 2) +		goto step2; +  	if (regs->ddr_eor)  		out_be32(&ddr->eor, regs->ddr_eor);  #ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 @@ -123,10 +136,17 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  	out_be32(&ddr->timing_cfg_5, regs->timing_cfg_5);  	out_be32(&ddr->ddr_zq_cntl, regs->ddr_zq_cntl);  	out_be32(&ddr->ddr_wrlvl_cntl, regs->ddr_wrlvl_cntl); +#ifndef CONFIG_SYS_FSL_DDR_EMU +	/* +	 * Skip these two registers if running on emulator +	 * because emulator doesn't have skew between bytes. +	 */ +  	if (regs->ddr_wrlvl_cntl_2)  		out_be32(&ddr->ddr_wrlvl_cntl_2, regs->ddr_wrlvl_cntl_2);  	if (regs->ddr_wrlvl_cntl_3)  		out_be32(&ddr->ddr_wrlvl_cntl_3, regs->ddr_wrlvl_cntl_3); +#endif  	out_be32(&ddr->ddr_sr_cntr, regs->ddr_sr_cntr);  	out_be32(&ddr->ddr_sdram_rcw_1, regs->ddr_sdram_rcw_1); @@ -150,6 +170,20 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,  	out_be32(&ddr->debug[21], 0x24000000);  #endif /* CONFIG_SYS_FSL_ERRATUM_DDR_A003474 */ +	/* +	 * For RDIMMs, JEDEC spec requires clocks to be stable before reset is +	 * deasserted. Clocks start when any chip select is enabled and clock +	 * control register is set. Because all DDR components are connected to +	 * one reset signal, this needs to be done in two steps. Step 1 is to +	 * get the clocks started. Step 2 resumes after reset signal is +	 * deasserted. +	 */ +	if (step == 1) { +		udelay(200); +		return; +	} + +step2:  	/* Set, but do not enable the memory */  	temp_sdram_cfg = regs->ddr_sdram_cfg;  	temp_sdram_cfg &= ~(SDRAM_CFG_MEM_EN); diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c index cfaa2edce..84bb8fab8 100644 --- a/arch/powerpc/cpu/mpc85xx/fdt.c +++ b/arch/powerpc/cpu/mpc85xx/fdt.c @@ -604,8 +604,12 @@ void ft_cpu_setup(void *blob, bd_t *bd)  	fdt_add_enet_stashing(blob); +#ifndef CONFIG_FSL_TBCLK_EXTRA_DIV +#define CONFIG_FSL_TBCLK_EXTRA_DIV 1 +#endif  	do_fixup_by_prop_u32(blob, "device_type", "cpu", 4, -		"timebase-frequency", get_tbclk(), 1); +		"timebase-frequency", get_tbclk() / CONFIG_FSL_TBCLK_EXTRA_DIV, +		1);  	do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,  		"bus-frequency", bd->bi_busfreq, 1);  	get_sys_info(&sysinfo); diff --git a/arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h b/arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h index 6de572d59..d515b234a 100644 --- a/arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h +++ b/arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h @@ -9,5 +9,4 @@  int is_serdes_prtcl_valid(int serdes, u32 prtcl);  int serdes_lane_enabled(int lane); -enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);  #endif /* __FSL_CORENET2_SERDES_H */ diff --git a/arch/powerpc/cpu/mpc85xx/release.S b/arch/powerpc/cpu/mpc85xx/release.S index 15bbbc15a..c15e83b52 100644 --- a/arch/powerpc/cpu/mpc85xx/release.S +++ b/arch/powerpc/cpu/mpc85xx/release.S @@ -226,6 +226,21 @@ __secondary_start_page:  2:  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A005812 +	/* +	 * A-005812 workaround sets bit 32 of SPR 976 for SoCs running in +	 * write shadow mode. This code should run after other code setting +	 * DCWS. +	 */ +	mfspr	r3,L1CSR2 +	andis.	r3,r3,(L1CSR2_DCWS)@h +	beq	1f +	mfspr	r3, SPRN_HDBCR0 +	oris	r3, r3, 0x8000 +	mtspr	SPRN_HDBCR0, r3 +1: +#endif +  #ifdef CONFIG_BACKSIDE_L2_CACHE  	/* skip L2 setup on P2040/P2040E as they have no L2 */  	mfspr	r3,SPRN_SVR diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index cfc3a60d2..ad57a9cfa 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -33,7 +33,8 @@  #define MINIMAL_SPL  #endif -#if !defined(CONFIG_SPL) && !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) +#if !defined(CONFIG_SPL) && !defined(CONFIG_SYS_RAMBOOT) && \ +	!defined(CONFIG_SECURE_BOOT) && !defined(CONFIG_SRIO_PCIE_BOOT_SLAVE)  #define NOR_BOOT  #endif diff --git a/arch/powerpc/cpu/mpc85xx/t4240_ids.c b/arch/powerpc/cpu/mpc85xx/t4240_ids.c index e173cb5f9..54c1cfd2c 100644 --- a/arch/powerpc/cpu/mpc85xx/t4240_ids.c +++ b/arch/powerpc/cpu/mpc85xx/t4240_ids.c @@ -65,8 +65,8 @@ struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {  #endif  struct srio_liodn_id_table srio_liodn_tbl[] = { -	SET_SRIO_LIODN_1(1, 307), -	SET_SRIO_LIODN_1(2, 387), +	SET_SRIO_LIODN_BASE(1, 307), +	SET_SRIO_LIODN_BASE(2, 387),  };  int srio_liodn_tbl_sz = ARRAY_SIZE(srio_liodn_tbl); @@ -159,10 +159,10 @@ int sec_liodn_tbl_sz = ARRAY_SIZE(sec_liodn_tbl);  #ifdef CONFIG_SYS_DPAA_RMAN  struct liodn_id_table rman_liodn_tbl[] = {  	/* Set RMan block 0-3 liodn offset */ -	SET_RMAN_LIODN(0, 678), -	SET_RMAN_LIODN(1, 679), -	SET_RMAN_LIODN(2, 680), -	SET_RMAN_LIODN(3, 681), +	SET_RMAN_LIODN(0, 6), +	SET_RMAN_LIODN(1, 7), +	SET_RMAN_LIODN(2, 8), +	SET_RMAN_LIODN(3, 9),  };  int rman_liodn_tbl_sz = ARRAY_SIZE(rman_liodn_tbl);  #endif diff --git a/arch/powerpc/cpu/mpc86xx/ddr-8641.c b/arch/powerpc/cpu/mpc86xx/ddr-8641.c index 92ba26dc8..33a91f9f7 100644 --- a/arch/powerpc/cpu/mpc86xx/ddr-8641.c +++ b/arch/powerpc/cpu/mpc86xx/ddr-8641.c @@ -15,7 +15,7 @@  #endif  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -			     unsigned int ctrl_num) +			     unsigned int ctrl_num, int step)  {  	unsigned int i;  	volatile ccsr_ddr_t *ddr; diff --git a/arch/powerpc/cpu/mpc8xxx/cpu.c b/arch/powerpc/cpu/mpc8xxx/cpu.c index 7369582ef..c67be4ef2 100644 --- a/arch/powerpc/cpu/mpc8xxx/cpu.c +++ b/arch/powerpc/cpu/mpc8xxx/cpu.c @@ -79,6 +79,9 @@ static struct cpu_type cpu_type_list[] = {  	CPU_TYPE_ENTRY(BSC9131, 9131, 1),  	CPU_TYPE_ENTRY(BSC9132, 9132, 2),  	CPU_TYPE_ENTRY(BSC9232, 9232, 2), +	CPU_TYPE_ENTRY(C291, C291, 1), +	CPU_TYPE_ENTRY(C292, C292, 1), +	CPU_TYPE_ENTRY(C293, C293, 1),  #elif defined(CONFIG_MPC86xx)  	CPU_TYPE_ENTRY(8610, 8610, 1),  	CPU_TYPE_ENTRY(8641, 8641, 2), diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c index ff5812df5..242eb47ac 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c @@ -364,7 +364,7 @@ static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr,  	ddr->timing_cfg_3 = (0  		| ((ext_pretoact & 0x1) << 28) -		| ((ext_acttopre & 0x2) << 24) +		| ((ext_acttopre & 0x3) << 24)  		| ((ext_acttorw & 0x1) << 22)  		| ((ext_refrec & 0x1F) << 16)  		| ((ext_caslat & 0x3) << 12) @@ -681,6 +681,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,  	unsigned int odt_cfg = 0;	/* ODT configuration */  	unsigned int num_pr;		/* Number of posted refreshes */  	unsigned int slow = 0;		/* DDR will be run less than 1250 */ +	unsigned int x4_en = 0;		/* x4 DRAM enable */  	unsigned int obc_cfg;		/* On-The-Fly Burst Chop Cfg */  	unsigned int ap_en;		/* Address Parity Enable */  	unsigned int d_init;		/* DRAM data initialization */ @@ -725,6 +726,8 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,  		ap_en = 0;  	} +	x4_en = popts->x4_en ? 1 : 0; +  #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)  	/* Use the DDR controller to auto initialize memory. */  	d_init = popts->ECC_init_using_memctl; @@ -747,6 +750,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,  		| ((odt_cfg & 0x3) << 21)  		| ((num_pr & 0xf) << 12)  		| ((slow & 1) << 11) +		| (x4_en << 10)  		| (qd_en << 9)  		| (unq_mrs_en << 8)  		| ((obc_cfg & 0x1) << 6) @@ -1585,8 +1589,8 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,  				| ((ea & 0xFFF) << 0)	/* ending address MSB */  				);  		} else { -			debug("FSLDDR: setting bnds to 0 for inactive CS\n"); -			ddr->cs[i].bnds = 0; +			/* setting bnds to 0xffffffff for inactive CS */ +			ddr->cs[i].bnds = 0xffffffff;  		}  		debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds); @@ -1638,5 +1642,10 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,  	set_ddr_sdram_rcw(ddr, popts, common_dimm); +#ifdef CONFIG_SYS_FSL_DDR_EMU +	/* disble DDR training for emulator */ +	ddr->debug[2] = 0x00000400; +	ddr->debug[4] = 0xff800000; +#endif  	return check_fsl_memctl_config_regs(ddr);  } diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h b/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h index 4dd55fc4c..c173a5a74 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h @@ -96,7 +96,7 @@ unsigned int check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr);  /* processor specific function */  void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -				   unsigned int ctrl_num); +				   unsigned int ctrl_num, int step);  /* board specific function */  int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ddr3_dimm_params.c b/arch/powerpc/cpu/mpc8xxx/ddr/ddr3_dimm_params.c index 3e7c269e4..b67158c0f 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ddr3_dimm_params.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ddr3_dimm_params.c @@ -129,6 +129,7 @@ ddr_compute_dimm_parameters(const ddr3_spd_eeprom_t *spd,  		pdimm->ec_sdram_width = 0;  	pdimm->data_width = pdimm->primary_sdram_width  			  + pdimm->ec_sdram_width; +	pdimm->device_width = 1 << ((spd->organization & 0x7) + 2);  	/* These are the types defined by the JEDEC DDR3 SPD spec */  	pdimm->mirrored_dimm = 0; diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c b/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c index 1ed6c7715..260fce577 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c @@ -205,6 +205,7 @@ static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,  		DIMM_PARM(primary_sdram_width),  		DIMM_PARM(ec_sdram_width),  		DIMM_PARM(registered_dimm), +		DIMM_PARM(device_width),  		DIMM_PARM(n_row_addr),  		DIMM_PARM(n_col_addr), @@ -263,6 +264,7 @@ static void print_dimm_parameters(const dimm_params_t *pdimm)  		DIMM_PARM(primary_sdram_width),  		DIMM_PARM(ec_sdram_width),  		DIMM_PARM(registered_dimm), +		DIMM_PARM(device_width),  		DIMM_PARM(n_row_addr),  		DIMM_PARM(n_col_addr), @@ -443,6 +445,7 @@ static void fsl_ddr_options_edit(fsl_ddr_info_t *pinfo,  		CTRL_OPTIONS(twoT_en),  		CTRL_OPTIONS(threeT_en),  		CTRL_OPTIONS(ap_en), +		CTRL_OPTIONS(x4_en),  		CTRL_OPTIONS(bstopre),  		CTRL_OPTIONS(wrlvl_override),  		CTRL_OPTIONS(wrlvl_sample), @@ -687,6 +690,7 @@ static void print_memctl_options(const memctl_options_t *popts)  		CTRL_OPTIONS(threeT_en),  		CTRL_OPTIONS(registered_dimm_en),  		CTRL_OPTIONS(ap_en), +		CTRL_OPTIONS(x4_en),  		CTRL_OPTIONS(bstopre),  		CTRL_OPTIONS(wrlvl_override),  		CTRL_OPTIONS(wrlvl_sample), diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/main.c b/arch/powerpc/cpu/mpc8xxx/ddr/main.c index 7a8636de1..9f4f25343 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/main.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/main.c @@ -25,10 +25,6 @@ void fsl_ddr_set_lawbar(  		unsigned int ctrl_num);  void fsl_ddr_set_intl3r(const unsigned int granule_size); -/* processor specific function */ -extern void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -				   unsigned int ctrl_num); -  #if defined(SPD_EEPROM_ADDRESS) || \      defined(SPD_EEPROM_ADDRESS1) || defined(SPD_EEPROM_ADDRESS2) || \      defined(SPD_EEPROM_ADDRESS3) || defined(SPD_EEPROM_ADDRESS4) @@ -365,9 +361,11 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,  {  	unsigned int i, j;  	unsigned long long total_mem = 0; +	int assert_reset;  	fsl_ddr_cfg_regs_t *ddr_reg = pinfo->fsl_ddr_config_reg;  	common_timing_params_t *timing_params = pinfo->common_timing_params; +	assert_reset = board_need_mem_reset();  	/* data bus width capacity adjust shift amount */  	unsigned int dbw_capacity_adjust[CONFIG_NUM_DDR_CONTROLLERS]; @@ -462,7 +460,20 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,  					timing_params[i].all_DIMMs_registered,  					&pinfo->memctl_opts[i],  					pinfo->dimm_params[i], i); +			/* +			 * For RDIMMs, JEDEC spec requires clocks to be stable +			 * before reset signal is deasserted. For the boards +			 * using fixed parameters, this function should be +			 * be called from board init file. +			 */ +			if (timing_params[i].all_DIMMs_registered) +				assert_reset = 1;  		} +		if (assert_reset) { +			debug("Asserting mem reset\n"); +			board_assert_mem_reset(); +		} +  	case STEP_ASSIGN_ADDRESSES:  		/* STEP 5:  Assign addresses to chip selects */  		check_interleaving_options(pinfo); @@ -504,7 +515,13 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,  				fsl_ddr_cfg_regs_t *reg = &ddr_reg[i];  				if (reg->cs[j].config & 0x80000000) {  					unsigned int end; -					end = reg->cs[j].bnds & 0xFFF; +					/* +					 * 0xfffffff is a special value we put +					 * for unused bnds +					 */ +					if (reg->cs[j].bnds == 0xffffffff) +						continue; +					end = reg->cs[j].bnds & 0xffff;  					if (end > max_end) {  						max_end = end;  					} @@ -531,6 +548,7 @@ phys_size_t fsl_ddr_sdram(void)  	unsigned int law_memctl = LAW_TRGT_IF_DDR_1;  	unsigned long long total_memory;  	fsl_ddr_info_t info; +	int deassert_reset;  	/* Reset info structure. */  	memset(&info, 0, sizeof(fsl_ddr_info_t)); @@ -559,7 +577,21 @@ phys_size_t fsl_ddr_sdram(void)  		}  	} -	/* Program configuration registers. */ +	/* +	 * Program configuration registers. +	 * JEDEC specs requires clocks to be stable before deasserting reset +	 * for RDIMMs. Clocks start after chip select is enabled and clock +	 * control register is set. During step 1, all controllers have their +	 * registers set but not enabled. Step 2 proceeds after deasserting +	 * reset through board FPGA or GPIO. +	 * For non-registered DIMMs, initialization can go through but it is +	 * also OK to follow the same flow. +	 */ +	deassert_reset = board_need_mem_reset(); +	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) { +		if (info.common_timing_params[i].all_DIMMs_registered) +			deassert_reset = 1; +	}  	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {  		debug("Programming controller %u\n", i);  		if (info.common_timing_params[i].ndimms_present == 0) { @@ -567,8 +599,22 @@ phys_size_t fsl_ddr_sdram(void)  					"skipping programming\n", i);  			continue;  		} - -		fsl_ddr_set_memctl_regs(&(info.fsl_ddr_config_reg[i]), i); +		/* +		 * The following call with step = 1 returns before enabling +		 * the controller. It has to finish with step = 2 later. +		 */ +		fsl_ddr_set_memctl_regs(&(info.fsl_ddr_config_reg[i]), i, +					deassert_reset ? 1 : 0); +	} +	if (deassert_reset) { +		/* Use board FPGA or GPIO to deassert reset signal */ +		debug("Deasserting mem reset\n"); +		board_deassert_mem_reset(); +		for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) { +			/* Call with step = 2 to continue initialization */ +			fsl_ddr_set_memctl_regs(&(info.fsl_ddr_config_reg[i]), +						i, 2); +		}  	}  	/* program LAWs */ diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/options.c b/arch/powerpc/cpu/mpc8xxx/ddr/options.c index 26369e099..30cdca497 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/options.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/options.c @@ -700,6 +700,8 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,  	}  #endif +	popts->x4_en = (pdimm[0].device_width == 4) ? 1 : 0; +  	/* Choose burst length. */  #if defined(CONFIG_FSL_DDR3)  #if defined(CONFIG_E500MC) diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index 7ed93acdc..ce1bf0554 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -303,6 +303,7 @@  #elif defined(CONFIG_PPC_P2041) /* also supports P2040 */  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */  #define CONFIG_MAX_CPUS			4  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32 @@ -336,6 +337,7 @@  #elif defined(CONFIG_PPC_P3041)  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */  #define CONFIG_MAX_CPUS			4  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32 @@ -366,9 +368,11 @@  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000  #define CONFIG_SYS_FSL_ERRATUM_SRIO_A004034  #define CONFIG_SYS_FSL_ERRATUM_A004849 +#define CONFIG_SYS_FSL_ERRATUM_A005812  #elif defined(CONFIG_PPC_P4080) /* also supports P4040 */  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */  #define CONFIG_MAX_CPUS			8  #define CONFIG_SYS_FSL_NUM_CC_PLLS	4  #define CONFIG_SYS_FSL_NUM_LAWS		32 @@ -410,10 +414,12 @@  #define CONFIG_SYS_FSL_ERRATUM_A004849  #define CONFIG_SYS_FSL_ERRATUM_A004580  #define CONFIG_SYS_P4080_ERRATUM_PCIE_A003 +#define CONFIG_SYS_FSL_ERRATUM_A005812  #elif defined(CONFIG_PPC_P5020) /* also supports P5010 */  #define CONFIG_SYS_PPC64		/* 64-bit core */  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */  #define CONFIG_MAX_CPUS			2  #define CONFIG_SYS_FSL_NUM_CC_PLLS	2  #define CONFIG_SYS_FSL_NUM_LAWS		32 @@ -444,6 +450,7 @@  #elif defined(CONFIG_PPC_P5040)  #define CONFIG_SYS_PPC64  #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */  #define CONFIG_MAX_CPUS			4  #define CONFIG_SYS_FSL_NUM_CC_PLLS	3  #define CONFIG_SYS_FSL_NUM_LAWS		32 @@ -469,6 +476,7 @@  #define CONFIG_SYS_FSL_ERRATUM_A004510  #define CONFIG_SYS_FSL_ERRATUM_A004510_SVR_REV	0x10  #define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000 +#define CONFIG_SYS_FSL_ERRATUM_A005812  #elif defined(CONFIG_BSC9131)  #define CONFIG_MAX_CPUS			1 @@ -492,6 +500,10 @@  #define CONFIG_TSECV2  #define CONFIG_SYS_FSL_SEC_COMPAT	4  #define CONFIG_NUM_DDR_CONTROLLERS	2 +#define CONFIG_SYS_FSL_DSP_DDR_ADDR	0x40000000 +#define CONFIG_SYS_FSL_DSP_M2_RAM_ADDR	0xb0000000 +#define CONFIG_SYS_FSL_DSP_M3_RAM_ADDR	0xc0000000 +#define CONFIG_SYS_FSL_DSP_CCSRBAR_DEFAULT	0xff600000  #define CONFIG_SYS_FSL_IFC_BANK_COUNT	3  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000  #define CONFIG_NAND_FSL_IFC @@ -536,6 +548,7 @@  #define CONFIG_SYS_FSL_SRIO_MAX_PORTS	2  #define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM	9  #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM	5 +#define CONFIG_SYS_FSL_SRIO_LIODN  #define CONFIG_SYS_FSL_USB_DUAL_PHY_ENABLE  #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY  #define CONFIG_SYS_FSL_ERRATUM_A004468 @@ -576,6 +589,7 @@  #define CONFIG_SYS_FSL_SRIO_MAX_PORTS	2  #define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM	9  #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM	5 +#define CONFIG_SYS_FSL_SRIO_LIODN  #else  #define CONFIG_MAX_CPUS			2  #define CONFIG_SYS_FSL_CORES_PER_CLUSTER 2 @@ -612,6 +626,18 @@  #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xfe000000 +#elif defined(CONFIG_PPC_C29X) +#define CONFIG_MAX_CPUS			1 +#define CONFIG_FSL_SDHC_V2_3 +#define CONFIG_SYS_FSL_NUM_LAWS		12 +#define CONFIG_SYS_PPC_E500_DEBUG_TLB	3 +#define CONFIG_TSECV2_1 +#define CONFIG_SYS_FSL_SEC_COMPAT	6 +#define CONFIG_SYS_FSL_ERRATUM_ESDHC111 +#define CONFIG_NUM_DDR_CONTROLLERS	1 +#define CONFIG_SYS_FSL_IFC_BANK_COUNT	8 +#define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000 +  #else  #error Processor type not defined for this platform  #endif diff --git a/arch/powerpc/include/asm/fsl_ddr_dimm_params.h b/arch/powerpc/include/asm/fsl_ddr_dimm_params.h index ffe4db8b8..bd312ad5c 100644 --- a/arch/powerpc/include/asm/fsl_ddr_dimm_params.h +++ b/arch/powerpc/include/asm/fsl_ddr_dimm_params.h @@ -26,6 +26,7 @@ typedef struct dimm_params_s {  	unsigned int primary_sdram_width;  	unsigned int ec_sdram_width;  	unsigned int registered_dimm; +	unsigned int device_width;	/* x4, x8, x16 components */  	/* SDRAM device parameters */  	unsigned int n_row_addr; diff --git a/arch/powerpc/include/asm/fsl_ddr_sdram.h b/arch/powerpc/include/asm/fsl_ddr_sdram.h index 640d3297d..f4eec82d5 100644 --- a/arch/powerpc/include/asm/fsl_ddr_sdram.h +++ b/arch/powerpc/include/asm/fsl_ddr_sdram.h @@ -277,6 +277,7 @@ typedef struct memctl_options_s {  	unsigned int mirrored_dimm;  	unsigned int quad_rank_present;  	unsigned int ap_en;	/* address parity enable for RDIMM */ +	unsigned int x4_en;	/* enable x4 devices */  	/* Global Timing Parameters */  	unsigned int cas_latency_override; @@ -330,9 +331,31 @@ extern phys_size_t fsl_ddr_sdram(void);  extern phys_size_t fsl_ddr_sdram_size(void);  extern int fsl_use_spd(void);  extern void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, -					unsigned int ctrl_num); +					unsigned int ctrl_num, int step);  u32 fsl_ddr_get_intl3r(void); +static void __board_assert_mem_reset(void) +{ +} + +static void __board_deassert_mem_reset(void) +{ +} + +void board_assert_mem_reset(void) +	__attribute__((weak, alias("__board_assert_mem_reset"))); + +void board_deassert_mem_reset(void) +	__attribute__((weak, alias("__board_deassert_mem_reset"))); + +static int __board_need_mem_reset(void) +{ +	return 0; +} + +int board_need_mem_reset(void) +	__attribute__((weak, alias("__board_need_mem_reset"))); +  /*   * The 85xx boards have a common prototype for fixed_sdram so put the   * declaration here. diff --git a/arch/powerpc/include/asm/fsl_law.h b/arch/powerpc/include/asm/fsl_law.h index bea163676..37d3a2246 100644 --- a/arch/powerpc/include/asm/fsl_law.h +++ b/arch/powerpc/include/asm/fsl_law.h @@ -82,7 +82,7 @@ enum law_trgt_if {  #ifndef CONFIG_MPC8641  	LAW_TRGT_IF_PCIE_1 = 0x02,  #endif -#if defined(CONFIG_BSC9131) +#if defined(CONFIG_BSC9131) || defined(CONFIG_BSC9132)  	LAW_TRGT_IF_OCN_DSP = 0x03,  #else  #if !defined(CONFIG_MPC8572) && !defined(CONFIG_P2020) @@ -92,9 +92,14 @@ enum law_trgt_if {  	LAW_TRGT_IF_LBC = 0x04,  	LAW_TRGT_IF_CCSR = 0x08,  	LAW_TRGT_IF_DSP_CCSR = 0x09, +	LAW_TRGT_IF_PLATFORM_SRAM = 0x0a,  	LAW_TRGT_IF_DDR_INTRLV = 0x0b,  	LAW_TRGT_IF_RIO = 0x0c, +#if defined(CONFIG_BSC9132) +	LAW_TRGT_IF_CLASS_DSP = 0x0d, +#else  	LAW_TRGT_IF_RIO_2 = 0x0d, +#endif  	LAW_TRGT_IF_DPAA_SWP_SRAM = 0x0e,  	LAW_TRGT_IF_DDR = 0x0f,  	LAW_TRGT_IF_DDR_2 = 0x16,	/* 2nd controller */ diff --git a/arch/powerpc/include/asm/fsl_liodn.h b/arch/powerpc/include/asm/fsl_liodn.h index 3f543d924..44bc88dce 100644 --- a/arch/powerpc/include/asm/fsl_liodn.h +++ b/arch/powerpc/include/asm/fsl_liodn.h @@ -29,6 +29,13 @@ struct srio_liodn_id_table {  		+ CONFIG_SYS_MPC85xx_GUTS_OFFSET + CONFIG_SYS_CCSRBAR, \  	} +#define SET_SRIO_LIODN_BASE(port, id_a) \ +	{ .id = { id_a }, .num_ids = 1, .portid = port, \ +	  .reg_offset[0] = offsetof(struct ccsr_rio, liodn) \ +		+ (port - 1) * 0x200 \ +		+ CONFIG_SYS_FSL_SRIO_ADDR, \ +	} +  struct liodn_id_table {  	const char * compat;  	u32 id[2]; diff --git a/arch/powerpc/include/asm/fsl_pci.h b/arch/powerpc/include/asm/fsl_pci.h index c740da37c..749411c10 100644 --- a/arch/powerpc/include/asm/fsl_pci.h +++ b/arch/powerpc/include/asm/fsl_pci.h @@ -1,5 +1,5 @@  /* - * Copyright 2007,2009-2011 Freescale Semiconductor, Inc. + * Copyright 2007,2009-2012 Freescale Semiconductor, Inc.   *   * SPDX-License-Identifier:	GPL-2.0+   */ @@ -13,6 +13,34 @@  #define PEX_IP_BLK_REV_2_2	0x02080202  #define PEX_IP_BLK_REV_2_3	0x02080203 +#define PEX_IP_BLK_REV_3_0	0x02080300 + +/* Freescale-specific PCI config registers */ +#define FSL_PCI_PBFR		0x44 + +#ifdef CONFIG_SYS_FSL_PCI_VER_3_X +/* Currently only the PCIe capability is used, so hardcode the offset. + * if more capabilities need to be justified, the capability link method + * should be applied here + */ +#define FSL_PCIE_CAP_ID		0x70 +#define PCI_DCR		0x78    /* PCIe Device Control Register */ +#define PCI_DSR		0x7a    /* PCIe Device Status Register */ +#define PCI_LSR		0x82    /* PCIe Link Status Register */ +#define PCI_LCR		0x80    /* PCIe Link Control Register */ +#else +#define FSL_PCIE_CAP_ID		0x4c +#define PCI_DCR		0x54    /* PCIe Device Control Register */ +#define PCI_DSR		0x56    /* PCIe Device Status Register */ +#define PCI_LSR		0x5e    /* PCIe Link Status Register */ +#define PCI_LCR		0x5c    /* PCIe Link Control Register */ +#endif + +#define FSL_PCIE_CFG_RDY	0x4b0 +#define FSL_PROG_IF_AGENT	0x1 + +#define PCI_LTSSM	0x404   /* PCIe Link Training, Status State Machine */ +#define  PCI_LTSSM_L0	0x16    /* L0 state */  int fsl_setup_hose(struct pci_controller *hose, unsigned long addr);  int fsl_is_pci_agent(struct pci_controller *hose); @@ -149,7 +177,10 @@ typedef struct ccsr_pci {  	u32	perr_cap3;	/* 0xe34 - PCIE Error Capture Register 3 */  	char	res23[200];  	u32	pdb_stat;	/* 0xf00 - PCIE Debug Status */ -	char	res24[252]; +	char	res24[16]; +	u32	pex_csr0;	/* 0xf14 - PEX Control/Status register 0*/ +	u32	pex_csr1;	/* 0xf18 - PEX Control/Status register 1*/ +	char	res25[228];  } ccsr_fsl_pci_t;  #define PCIE_CONFIG_PC	0x00020000  #define PCIE_CONFIG_OB_CK	0x00002000 diff --git a/arch/powerpc/include/asm/fsl_serdes.h b/arch/powerpc/include/asm/fsl_serdes.h index 59189adb3..1106d2805 100644 --- a/arch/powerpc/include/asm/fsl_serdes.h +++ b/arch/powerpc/include/asm/fsl_serdes.h @@ -90,6 +90,7 @@ void fsl_serdes_init(void);  #ifdef CONFIG_FSL_CORENET  #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2  int serdes_get_first_lane(u32 sd, enum srds_prtcl device); +enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);  #else  int serdes_get_first_lane(enum srds_prtcl device);  #endif diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h index 81b3322fe..2ed384e30 100644 --- a/arch/powerpc/include/asm/immap_85xx.h +++ b/arch/powerpc/include/asm/immap_85xx.h @@ -1544,6 +1544,18 @@ struct rio_pw {  };  #endif +#ifdef CONFIG_SYS_FSL_SRIO_LIODN +struct rio_liodn { +	u32	plbr; +	u8	res0[28]; +	u32	plaor; +	u8	res1[12]; +	u32	pludr; +	u32	plldr; +	u8	res2[456]; +}; +#endif +  /* RapidIO Registers */  struct ccsr_rio {  	struct rio_arch	arch; @@ -1566,6 +1578,10 @@ struct ccsr_rio {  	u8	res7[100];  	struct rio_pw	pw;  #endif +#ifdef CONFIG_SYS_FSL_SRIO_LIODN +	u8	res5[8192]; +	struct rio_liodn liodn[CONFIG_SYS_FSL_SRIO_MAX_PORTS]; +#endif  };  #endif @@ -2131,6 +2147,11 @@ typedef struct ccsr_gur {  #ifdef CONFIG_MPC8536  #define MPC85xx_PORPLLSR_DDR_RATIO	0x3e000000  #define MPC85xx_PORPLLSR_DDR_RATIO_SHIFT	25 +#elif defined(CONFIG_PPC_C29X) +#define MPC85xx_PORPLLSR_DDR_RATIO	0x00003f00 +#define MPC85xx_PORPLLSR_DDR_RATIO_SHIFT	(9 - ((gur->pordevsr2 \ +					& MPC85xx_PORDEVSR2_DDR_SPD_0) \ +					>> MPC85xx_PORDEVSR2_DDR_SPD_0_SHIFT))  #else  #if defined(CONFIG_BSC9131) || defined(CONFIG_BSC9132)  #define MPC85xx_PORPLLSR_DDR_RATIO	0x00003f00 @@ -2178,6 +2199,9 @@ typedef struct ccsr_gur {  #elif defined(CONFIG_BSC9132)  #define MPC85xx_PORDEVSR_IO_SEL		0x00FE0000  #define MPC85xx_PORDEVSR_IO_SEL_SHIFT	17 +#elif defined(CONFIG_PPC_C29X) +#define MPC85xx_PORDEVSR_IO_SEL		0x00e00000 +#define MPC85xx_PORDEVSR_IO_SEL_SHIFT	21  #else  #define MPC85xx_PORDEVSR_IO_SEL		0x00780000  #define MPC85xx_PORDEVSR_IO_SEL_SHIFT	19 @@ -2193,6 +2217,10 @@ typedef struct ccsr_gur {  #define MPC85xx_PORDEVSR_RIO_DEV_ID	0x00000007  	u32	pordbgmsr;	/* POR debug mode status */  	u32	pordevsr2;	/* POR I/O device status 2 */ +#if defined(CONFIG_PPC_C29X) +#define MPC85xx_PORDEVSR2_DDR_SPD_0	0x00000008 +#define MPC85xx_PORDEVSR2_DDR_SPD_0_SHIFT	3 +#endif  /* The 8544 RM says this is bit 26, but it's really bit 24 */  #define MPC85xx_PORDEVSR2_SEC_CFG	0x00000080  	u8	res1[8]; @@ -2339,6 +2367,11 @@ typedef struct ccsr_gur {  #define MPC85xx_PMUXCR0_SIM_SEL_MASK	0x0003b000  #define MPC85xx_PMUXCR0_SIM_SEL		0x00014000  #endif +#if defined(CONFIG_PPC_C29X) +#define MPC85xx_PMUXCR_SPI_MASK			0x00000300 +#define MPC85xx_PMUXCR_SPI			0x00000000 +#define MPC85xx_PMUXCR_SPI_GPIO			0x00000100 +#endif  	u32	pmuxcr2;	/* Alt. function signal multiplex control 2 */  #if defined(CONFIG_P1010) || defined(CONFIG_P1014)  #define MPC85xx_PMUXCR2_UART_GPIO		0x40000000 @@ -2526,7 +2559,9 @@ typedef struct serdes_corenet {  #define SRDS_RSTCTL_RSTDONE	0x40000000  #define SRDS_RSTCTL_RSTERR	0x20000000  #define SRDS_RSTCTL_SWRST	0x10000000 -#define SRDS_RSTCTL_SDPD	0x00000020 +#define SRDS_RSTCTL_SDEN	0x00000020 +#define SRDS_RSTCTL_SDRST_B	0x00000040 +#define SRDS_RSTCTL_PLLRST_B	0x00000080  		u32	pllcr0; /* PLL Control Register 0 */  #define SRDS_PLLCR0_POFF		0x80000000  #define SRDS_PLLCR0_RFCK_SEL_MASK	0x70000000 @@ -3008,12 +3043,18 @@ struct ccsr_pman {  #define CONFIG_SYS_MPC85xx_USB2_OFFSET		0x23000  #ifdef CONFIG_TSECV2  #define CONFIG_SYS_TSEC1_OFFSET			0xB0000 +#elif defined(CONFIG_TSECV2_1) +#define CONFIG_SYS_TSEC1_OFFSET			0x10000  #else  #define CONFIG_SYS_TSEC1_OFFSET			0x24000  #endif  #define CONFIG_SYS_MDIO1_OFFSET			0x24000  #define CONFIG_SYS_MPC85xx_ESDHC_OFFSET		0x2e000 +#if defined(CONFIG_PPC_C29X) +#define CONFIG_SYS_FSL_SEC_OFFSET		0x80000 +#else  #define CONFIG_SYS_FSL_SEC_OFFSET		0x30000 +#endif  #define CONFIG_SYS_MPC85xx_SERDES2_OFFSET	0xE3100  #define CONFIG_SYS_MPC85xx_SERDES1_OFFSET	0xE3000  #define CONFIG_SYS_SNVS_OFFSET			0xE6000 @@ -3031,6 +3072,12 @@ struct ccsr_pman {  #define CONFIG_SYS_MPC85xx_GUTS_OFFSET		0xE0000  #define CONFIG_SYS_FSL_SRIO_OFFSET		0xC0000 +#if defined(CONFIG_BSC9132) +#define CONFIG_SYS_FSL_DSP_CCSR_DDR_OFFSET	0x10000 +#define CONFIG_SYS_FSL_DSP_CCSR_DDR_ADDR \ +	(CONFIG_SYS_FSL_DSP_CCSRBAR + CONFIG_SYS_FSL_DSP_CCSR_DDR_OFFSET) +#endif +  #define CONFIG_SYS_FSL_CPC_ADDR	\  	(CONFIG_SYS_CCSRBAR + CONFIG_SYS_FSL_CPC_OFFSET)  #define CONFIG_SYS_FSL_QMAN_ADDR \ diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 56b22d840..64a6f9c54 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -1119,6 +1119,9 @@  #define SVR_T4240	0x824000  #define SVR_T4120	0x824001  #define SVR_T4160	0x824100 +#define SVR_C291	0x850000 +#define SVR_C292	0x850020 +#define SVR_C293	0x850030  #define SVR_B4860	0X868000  #define SVR_G4860	0x868001  #define SVR_G4060	0x868003 |