diff options
Diffstat (limited to 'arch/powerpc/cpu/mpc85xx')
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/Makefile | 5 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/b4860_ids.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/b4860_serdes.c | 60 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/bsc9132_serdes.c | 96 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/cmd_errata.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/commproc.c | 21 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/cpu.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/cpu_init.c | 44 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/fdt.c | 30 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/speed.c | 28 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/start.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc85xx/tlb.c | 27 | 
12 files changed, 279 insertions, 46 deletions
| diff --git a/arch/powerpc/cpu/mpc85xx/Makefile b/arch/powerpc/cpu/mpc85xx/Makefile index 4c2b1040d46..6776c85e499 100644 --- a/arch/powerpc/cpu/mpc85xx/Makefile +++ b/arch/powerpc/cpu/mpc85xx/Makefile @@ -83,8 +83,10 @@ COBJS-$(CONFIG_PPC_P4080)	+= ddr-gen3.o  COBJS-$(CONFIG_PPC_P5020)	+= ddr-gen3.o  COBJS-$(CONFIG_PPC_P5040)	+= ddr-gen3.o  COBJS-$(CONFIG_PPC_T4240)	+= ddr-gen3.o +COBJS-$(CONFIG_PPC_B4420)	+= ddr-gen3.o  COBJS-$(CONFIG_PPC_B4860)	+= ddr-gen3.o  COBJS-$(CONFIG_BSC9131)		+= ddr-gen3.o +COBJS-$(CONFIG_BSC9132)		+= ddr-gen3.o  COBJS-$(CONFIG_CPM2)	+= ether_fcc.o  COBJS-$(CONFIG_OF_LIBFDT) += fdt.o @@ -100,6 +102,7 @@ COBJS-$(CONFIG_PPC_P4080) += p4080_ids.o  COBJS-$(CONFIG_PPC_P5020) += p5020_ids.o  COBJS-$(CONFIG_PPC_P5040) += p5040_ids.o  COBJS-$(CONFIG_PPC_T4240) += t4240_ids.o +COBJS-$(CONFIG_PPC_B4420) += b4860_ids.o  COBJS-$(CONFIG_PPC_B4860) += b4860_ids.o  COBJS-$(CONFIG_QE)	+= qe_io.o @@ -134,7 +137,9 @@ COBJS-$(CONFIG_PPC_P4080) += p4080_serdes.o  COBJS-$(CONFIG_PPC_P5020) += p5020_serdes.o  COBJS-$(CONFIG_PPC_P5040) += p5040_serdes.o  COBJS-$(CONFIG_PPC_T4240) += t4240_serdes.o +COBJS-$(CONFIG_PPC_B4420) += b4860_serdes.o  COBJS-$(CONFIG_PPC_B4860) += b4860_serdes.o +COBJS-$(CONFIG_BSC9132) += bsc9132_serdes.o  COBJS-y	+= cpu.o  COBJS-y	+= cpu_init.o diff --git a/arch/powerpc/cpu/mpc85xx/b4860_ids.c b/arch/powerpc/cpu/mpc85xx/b4860_ids.c index 7d33731a7ba..0f4e82e05b3 100644 --- a/arch/powerpc/cpu/mpc85xx/b4860_ids.c +++ b/arch/powerpc/cpu/mpc85xx/b4860_ids.c @@ -55,11 +55,13 @@ struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {  };  #endif +#ifdef CONFIG_SYS_SRIO  struct srio_liodn_id_table srio_liodn_tbl[] = {  	SET_SRIO_LIODN_1(1, 307),  	SET_SRIO_LIODN_1(2, 387),  };  int srio_liodn_tbl_sz = ARRAY_SIZE(srio_liodn_tbl); +#endif  struct liodn_id_table liodn_tbl[] = {  #ifdef CONFIG_SYS_DPAA_QBMAN @@ -76,10 +78,12 @@ struct liodn_id_table liodn_tbl[] = {  	SET_DMA_LIODN(1, 147),  	SET_DMA_LIODN(2, 227), +#ifndef CONFIG_PPC_B4420  	SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0),  	SET_GUTS_LIODN(NULL, 200, rio2liodnr, 0),  	SET_GUTS_LIODN(NULL, 201, rio1maintliodnr, 0),  	SET_GUTS_LIODN(NULL, 202, rio2maintliodnr, 0), +#endif  	/* SET_NEXUS_LIODN(557), -- not yet implemented */  }; @@ -93,8 +97,10 @@ struct liodn_id_table fman1_liodn_tbl[] = {  	SET_FMAN_RX_1G_LIODN(1, 3, 91),  	SET_FMAN_RX_1G_LIODN(1, 4, 92),  	SET_FMAN_RX_1G_LIODN(1, 5, 93), +#ifndef CONFIG_PPC_B4420  	SET_FMAN_RX_10G_LIODN(1, 0, 94),  	SET_FMAN_RX_10G_LIODN(1, 1, 95), +#endif  };  int fman1_liodn_tbl_sz = ARRAY_SIZE(fman1_liodn_tbl);  #endif diff --git a/arch/powerpc/cpu/mpc85xx/b4860_serdes.c b/arch/powerpc/cpu/mpc85xx/b4860_serdes.c index 9990202f421..bd3234271a1 100644 --- a/arch/powerpc/cpu/mpc85xx/b4860_serdes.c +++ b/arch/powerpc/cpu/mpc85xx/b4860_serdes.c @@ -31,6 +31,7 @@ struct serdes_config {  	u8 lanes[SRDS_MAX_LANES];  }; +#ifdef CONFIG_PPC_B4860  static struct serdes_config serdes1_cfg_tbl[] = {  	/* SerDes 1 */  	{0x0D, {CPRI8, CPRI7, CPRI6, CPRI5, @@ -41,6 +42,12 @@ static struct serdes_config serdes1_cfg_tbl[] = {  		CPRI4, CPRI3, CPRI2, CPRI1}},  	{0x2a, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,  		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}}, +	{0x2C, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, +		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}}, +	{0x2D, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, +		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}}, +	{0x2E, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, +		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}},  	{0x30, {AURORA, AURORA,  		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,  		CPRI4, CPRI3, CPRI2, CPRI1}}, @@ -84,6 +91,8 @@ static struct serdes_config serdes2_cfg_tbl[] = {  	{0x4E, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,  		SGMII_FM1_DTSEC3, AURORA,  		SRIO1, SRIO1, SRIO1, SRIO1}}, +	{0x7A, {SRIO2, SRIO2, SRIO2, SRIO2, +		SRIO1, SRIO1, SRIO1, SRIO1}},  	{0x84, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,  		SRIO2, SRIO2, AURORA, AURORA,  		XFI_FM1_MAC9, XFI_FM1_MAC10}}, @@ -94,6 +103,9 @@ static struct serdes_config serdes2_cfg_tbl[] = {  		SRIO2, SRIO2,  		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,  		XFI_FM1_MAC9, XFI_FM1_MAC10}}, +	{0x8D, {SRIO2, SRIO2, SRIO2, SRIO2, +		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, +		XFI_FM1_MAC9, XFI_FM1_MAC10}},  	{0x93, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,  		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,  		XAUI_FM1_MAC10, XAUI_FM1_MAC10, @@ -111,8 +123,56 @@ static struct serdes_config serdes2_cfg_tbl[] = {  	{0xC3, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,  		XAUI_FM1_MAC9, XAUI_FM1_MAC9,  		SRIO1, SRIO1, SRIO1, SRIO1}}, +	{0x98, {XAUI_FM1_MAC9, XAUI_FM1_MAC9, +		XAUI_FM1_MAC9, XAUI_FM1_MAC9, +		XAUI_FM1_MAC10, XAUI_FM1_MAC10, +		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},  	{}  }; +#endif + +#ifdef CONFIG_PPC_B4420 +static struct serdes_config serdes1_cfg_tbl[] = { +	{0x0D, {NONE, NONE, CPRI6, CPRI5, +		CPRI4, CPRI3, NONE, NONE} }, +	{0x0E, {NONE, NONE, CPRI8, CPRI5, +		CPRI4, CPRI3, NONE, NONE} }, +	{0x0F, {NONE, NONE, CPRI6, CPRI5, +		CPRI4, CPRI3, NONE, NONE} }, +	{0x18, {NONE, NONE, +		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, +		NONE, NONE, NONE, NONE} }, +	{0x1B, {NONE, NONE, +		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, +		NONE, NONE, NONE, NONE} }, +	{0x1E, {NONE, NONE, AURORA, AURORA, +		NONE, NONE, NONE, NONE} }, +	{0x21, {NONE, NONE, AURORA, AURORA, +		NONE, NONE, NONE, NONE} }, +	{0x3E, {NONE, NONE, CPRI6, CPRI5, +		CPRI4, CPRI3, NONE, NONE} }, +	{} +}; +static struct serdes_config serdes2_cfg_tbl[] = { +	{0x49, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, +		SGMII_FM1_DTSEC3, AURORA, +		NONE, NONE, NONE, NONE} }, +	{0x4A, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, +		SGMII_FM1_DTSEC3, AURORA, +		NONE, NONE, NONE, NONE} }, +	{0x6F, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, +		AURORA, AURORA,	NONE, NONE, NONE, NONE} }, +	{0x70, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, +		AURORA, AURORA,	NONE, NONE, NONE, NONE} }, +	{0x9A, {PCIE1, PCIE1, +		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, +		NONE, NONE, NONE, NONE} }, +	{0x9E, {PCIE1, PCIE1, PCIE1, PCIE1, +		NONE, NONE, NONE, NONE} }, +	{} +}; +#endif +  static struct serdes_config *serdes_cfg_tbl[] = {  	serdes1_cfg_tbl,  	serdes2_cfg_tbl, diff --git a/arch/powerpc/cpu/mpc85xx/bsc9132_serdes.c b/arch/powerpc/cpu/mpc85xx/bsc9132_serdes.c new file mode 100644 index 00000000000..300a4dbcf65 --- /dev/null +++ b/arch/powerpc/cpu/mpc85xx/bsc9132_serdes.c @@ -0,0 +1,96 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * Author: Prabhakar Kushwaha <prabhakar@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. + */ + +#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; + +static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { +	 [0] = {NONE, NONE, NONE, NONE}, +	 [1] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	 [2] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	 [3] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	 [4] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	 [5] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	 [6] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	 [7] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	 [8] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	 [9] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[10] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[11] = {PCIE1, PCIE2, SGMII_TSEC1, SGMII_TSEC2}, +	[12] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[13] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[14] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[15] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[16] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[17] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[18] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[19] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[20] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[21] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[22] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	[23] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	[24] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	[25] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	[26] = {PCIE1, PCIE2, CPRI2, CPRI1}, +	[27] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[28] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[29] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[30] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[31] = {PCIE1, PCIE2, SGMII_TSEC1, CPRI1}, +	[32] = {PCIE1, PCIE2, SGMII_TSEC1, SGMII_TSEC2}, +	[33] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[34] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[35] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[36] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[37] = {PCIE1, SGMII_TSEC2, CPRI2, CPRI1}, +	[38] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[39] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[40] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[41] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[42] = {PCIE1, SGMII_TSEC2, SGMII_TSEC1, CPRI1}, +	[43] = {SGMII_TSEC1, SGMII_TSEC2, CPRI2, CPRI1}, +	[44] = {SGMII_TSEC1, SGMII_TSEC2, CPRI2, CPRI1}, +	[45] = {SGMII_TSEC1, SGMII_TSEC2, CPRI2, CPRI1}, +	[46] = {SGMII_TSEC1, SGMII_TSEC2, CPRI2, CPRI1}, +	[47] = {SGMII_TSEC1, SGMII_TSEC2, CPRI2, CPRI1}, +}; + +int is_serdes_configured(enum srds_prtcl prtcl) +{ +	return (1 << prtcl) & 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; +	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; +	} + +	for (lane = 0; lane < SRDS1_MAX_LANES; lane++) { +		enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][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 e5ecf5dae59..5d72f4c342d 100644 --- a/arch/powerpc/cpu/mpc85xx/cmd_errata.c +++ b/arch/powerpc/cpu/mpc85xx/cmd_errata.c @@ -240,6 +240,10 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #ifdef CONFIG_SYS_FSL_ERRATUM_A_004934  	puts("Work-around for Erratum A004934 enabled\n");  #endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A005871 +	if (IS_SVR_REV(svr, 1, 0)) +		puts("Work-around for Erratum A005871 enabled\n"); +#endif  #ifdef CONFIG_SYS_FSL_ERRATUM_A004849  	/* This work-around is implemented in PBI, so just check for it */  	check_erratum_a4849(svr); diff --git a/arch/powerpc/cpu/mpc85xx/commproc.c b/arch/powerpc/cpu/mpc85xx/commproc.c index 292b723dcdd..37e706238b6 100644 --- a/arch/powerpc/cpu/mpc85xx/commproc.c +++ b/arch/powerpc/cpu/mpc85xx/commproc.c @@ -43,8 +43,8 @@ m8560_cpm_reset(void)  	/* Reclaim the DP memory for our use.  	*/ -	gd->dp_alloc_base = CPM_DATAONLY_BASE; -	gd->dp_alloc_top = gd->dp_alloc_base + CPM_DATAONLY_SIZE; +	gd->arch.dp_alloc_base = CPM_DATAONLY_BASE; +	gd->arch.dp_alloc_top = gd->arch.dp_alloc_base + CPM_DATAONLY_SIZE;  	/*  	 * Reset CPM @@ -69,21 +69,22 @@ m8560_cpm_dpalloc(uint size, uint align)  	uint	savebase;  	align_mask = align - 1; -	savebase = gd->dp_alloc_base; +	savebase = gd->arch.dp_alloc_base; -	if ((off = (gd->dp_alloc_base & align_mask)) != 0) -		gd->dp_alloc_base += (align - off); +	off = gd->arch.dp_alloc_base & align_mask; +	if (off != 0) +		gd->arch.dp_alloc_base += (align - off);  	if ((off = size & align_mask) != 0)  		size += align - off; -	if ((gd->dp_alloc_base + size) >= gd->dp_alloc_top) { -		gd->dp_alloc_base = savebase; +	if ((gd->arch.dp_alloc_base + size) >= gd->arch.dp_alloc_top) { +		gd->arch.dp_alloc_base = savebase;  		panic("m8560_cpm_dpalloc: ran out of dual port ram!");  	} -	retloc = gd->dp_alloc_base; -	gd->dp_alloc_base += size; +	retloc = gd->arch.dp_alloc_base; +	gd->arch.dp_alloc_base += size;  	memset((void *)&(cpm->im_dprambase[retloc]), 0, size); @@ -110,7 +111,7 @@ m8560_cpm_hostalloc(uint size, uint align)   * Baud rate clocks are zero-based in the driver code (as that maps   * to port numbers).  Documentation uses 1-based numbering.   */ -#define BRG_INT_CLK	gd->brg_clk +#define BRG_INT_CLK	gd->arch.brg_clk  #define BRG_UART_CLK	((BRG_INT_CLK + 15) / 16)  /* This function is used by UARTS, or anything else that uses a 16x diff --git a/arch/powerpc/cpu/mpc85xx/cpu.c b/arch/powerpc/cpu/mpc85xx/cpu.c index 9b9832cfc33..df2ab6d73cb 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu.c +++ b/arch/powerpc/cpu/mpc85xx/cpu.c @@ -104,7 +104,7 @@ int checkcpu (void)  		puts("CPU:   ");  	} -	cpu = gd->cpu; +	cpu = gd->arch.cpu;  	puts(cpu->name);  	if (IS_E_PROCESSOR(svr)) diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c index d1155e81263..de9d9161115 100644 --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c @@ -312,19 +312,33 @@ int enable_cluster_l2(void)  	/* Look through the remaining clusters, and set up their caches */  	do { +		int j, cluster_valid = 0; +  		l2cache = (void __iomem *)(CONFIG_SYS_FSL_CLUSTER_1_L2 + i * 0x40000); +  		cluster = in_be32(&gur->tp_cluster[i].lower); -		/* set stash ID to (cluster) * 2 + 32 + 1 */ -		clrsetbits_be32(&l2cache->l2csr1, 0xff, 32 + i * 2 + 1); +		/* check that at least one core/accel is enabled in cluster */ +		for (j = 0; j < 4; j++) { +			u32 idx = (cluster >> (j*8)) & TP_CLUSTER_INIT_MASK; +			u32 type = in_be32(&gur->tp_ityp[idx]); + +			if (type & TP_ITYP_AV) +				cluster_valid = 1; +		} -		printf("enable l2 for cluster %d %p\n", i, l2cache); +		if (cluster_valid) { +			/* set stash ID to (cluster) * 2 + 32 + 1 */ +			clrsetbits_be32(&l2cache->l2csr1, 0xff, 32 + i * 2 + 1); -		out_be32(&l2cache->l2csr0, L2CSR0_L2FI|L2CSR0_L2LFC); -		while ((in_be32(&l2cache->l2csr0) & -			(L2CSR0_L2FI|L2CSR0_L2LFC)) != 0) -			; -		out_be32(&l2cache->l2csr0, L2CSR0_L2E); +			printf("enable l2 for cluster %d %p\n", i, l2cache); + +			out_be32(&l2cache->l2csr0, L2CSR0_L2FI|L2CSR0_L2LFC); +			while ((in_be32(&l2cache->l2csr0) +				& (L2CSR0_L2FI|L2CSR0_L2LFC)) != 0) +					; +			out_be32(&l2cache->l2csr0, L2CSR0_L2E); +		}  		i++;  	} while (!(cluster & TP_CLUSTER_EOC)); @@ -534,6 +548,20 @@ skip_l2:  	/* needs to be in ram since code uses global static vars */  	fsl_serdes_init(); +#ifdef CONFIG_SYS_FSL_ERRATUM_A005871 +	if (IS_SVR_REV(svr, 1, 0)) { +		int i; +		__be32 *p = (void __iomem *)CONFIG_SYS_DCSRBAR + 0xb004c; + +		for (i = 0; i < 12; i++) { +			p += i + (i > 5 ? 11 : 0); +			out_be32(p, 0x2); +		} +		p = (void __iomem *)CONFIG_SYS_DCSRBAR + 0xb0108; +		out_be32(p, 0x34); +	} +#endif +  #ifdef CONFIG_SYS_SRIO  	srio_init();  #ifdef CONFIG_SYS_FSL_SRIO_PCIE_BOOT_MASTER  diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c index ab0933076df..24eb9789be9 100644 --- a/arch/powerpc/cpu/mpc85xx/fdt.c +++ b/arch/powerpc/cpu/mpc85xx/fdt.c @@ -100,6 +100,22 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)  			printf("Failed to reserve memory for bootpg: %s\n",  				fdt_strerror(off));  	} + +#ifndef CONFIG_MPC8xxx_DISABLE_BPTR +	/* +	 * Reserve the default boot page so OSes dont use it. +	 * The default boot page is always mapped to bootpg above using +	 * boot page translation. +	 */ +	if (0xfffff000ull < memory_limit) { +		off = fdt_add_mem_rsv(blob, 0xfffff000ull, (u64)4096); +		if (off < 0) { +			printf("Failed to reserve memory for 0xfffff000: %s\n", +				fdt_strerror(off)); +		} +	} +#endif +  	/* Reserve spin table page */  	if (spin_tbl_addr < memory_limit) {  		off = fdt_add_mem_rsv(blob, @@ -591,6 +607,14 @@ void ft_cpu_setup(void *blob, bd_t *bd)  	/* delete crypto node if not on an E-processor */  	if (!IS_E_PROCESSOR(get_svr()))  		fdt_fixup_crypto_node(blob, 0); +#if CONFIG_SYS_FSL_SEC_COMPAT >= 4 +	else { +		ccsr_sec_t __iomem *sec; + +		sec = (void __iomem *)CONFIG_SYS_FSL_SEC_ADDR; +		fdt_fixup_crypto_node(blob, in_be32(&sec->secvid_ms)); +	} +#endif  	fdt_fixup_ethernet(blob); @@ -613,9 +637,9 @@ void ft_cpu_setup(void *blob, bd_t *bd)  		"bus-frequency", bd->bi_busfreq, 1);  	do_fixup_by_compat_u32(blob, "fsl,pq3-localbus", -		"bus-frequency", gd->lbc_clk, 1); +		"bus-frequency", gd->arch.lbc_clk, 1);  	do_fixup_by_compat_u32(blob, "fsl,elbc", -		"bus-frequency", gd->lbc_clk, 1); +		"bus-frequency", gd->arch.lbc_clk, 1);  #ifdef CONFIG_QE  	ft_qe_setup(blob);  	ft_fixup_qe_snum(blob); @@ -787,7 +811,7 @@ int ft_verify_fdt(void *fdt)  #ifdef CONFIG_SYS_LBC_ADDR  	off = fdt_node_offset_by_compatible(fdt, -1, "fsl,elbc");  	if (off > 0) { -		const u32 *reg = fdt_getprop(fdt, off, "reg", NULL); +		const fdt32_t *reg = fdt_getprop(fdt, off, "reg", NULL);  		if (reg) {  			uint64_t uaddr = CCSR_VIRT_TO_PHYS(CONFIG_SYS_LBC_ADDR); diff --git a/arch/powerpc/cpu/mpc85xx/speed.c b/arch/powerpc/cpu/mpc85xx/speed.c index 801ee078c08..297f2ed4739 100644 --- a/arch/powerpc/cpu/mpc85xx/speed.c +++ b/arch/powerpc/cpu/mpc85xx/speed.c @@ -391,11 +391,11 @@ int get_clocks (void)  	gd->cpu_clk = sys_info.freqProcessor[0];  	gd->bus_clk = sys_info.freqSystemBus;  	gd->mem_clk = sys_info.freqDDRBus; -	gd->lbc_clk = sys_info.freqLocalBus; +	gd->arch.lbc_clk = sys_info.freqLocalBus;  #ifdef CONFIG_QE -	gd->qe_clk = sys_info.freqQE; -	gd->brg_clk = gd->qe_clk / 2; +	gd->arch.qe_clk = sys_info.freqQE; +	gd->arch.brg_clk = gd->arch.qe_clk / 2;  #endif  	/*  	 * The base clock for I2C depends on the actual SOC.  Unfortunately, @@ -406,7 +406,7 @@ int get_clocks (void)  	 */  #if defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || \  	defined(CONFIG_MPC8560) || defined(CONFIG_MPC8555) -	gd->i2c1_clk = sys_info.freqSystemBus; +	gd->arch.i2c1_clk = sys_info.freqSystemBus;  #elif defined(CONFIG_MPC8544)  	/*  	 * On the 8544, the I2C clock is the same as the SEC clock.  This can be @@ -416,29 +416,29 @@ int get_clocks (void)  	 * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.  	 */  	if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG) -		gd->i2c1_clk = sys_info.freqSystemBus / 3; +		gd->arch.i2c1_clk = sys_info.freqSystemBus / 3;  	else -		gd->i2c1_clk = sys_info.freqSystemBus / 2; +		gd->arch.i2c1_clk = sys_info.freqSystemBus / 2;  #else  	/* Most 85xx SOCs use CCB/2, so this is the default behavior. */ -	gd->i2c1_clk = sys_info.freqSystemBus / 2; +	gd->arch.i2c1_clk = sys_info.freqSystemBus / 2;  #endif -	gd->i2c2_clk = gd->i2c1_clk; +	gd->arch.i2c2_clk = gd->arch.i2c1_clk;  #if defined(CONFIG_FSL_ESDHC)  #if defined(CONFIG_MPC8569) || defined(CONFIG_P1010) ||\         defined(CONFIG_P1014) -	gd->sdhc_clk = gd->bus_clk; +	gd->arch.sdhc_clk = gd->bus_clk;  #else -	gd->sdhc_clk = gd->bus_clk / 2; +	gd->arch.sdhc_clk = gd->bus_clk / 2;  #endif  #endif /* defined(CONFIG_FSL_ESDHC) */  #if defined(CONFIG_CPM2) -	gd->vco_out = 2*sys_info.freqSystemBus; -	gd->cpm_clk = gd->vco_out / 2; -	gd->scc_clk = gd->vco_out / 4; -	gd->brg_clk = gd->vco_out / (1 << (2 * (dfbrg + 1))); +	gd->arch.vco_out = 2*sys_info.freqSystemBus; +	gd->arch.cpm_clk = gd->arch.vco_out / 2; +	gd->arch.scc_clk = gd->arch.vco_out / 4; +	gd->arch.brg_clk = gd->arch.vco_out / (1 << (2 * (dfbrg + 1)));  #endif  	if(gd->cpu_clk != 0) return (0); diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index bb0dc1a653e..fb674694e43 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -449,7 +449,7 @@ nexti:	mflr	r1		/* R1 = our PC */  	/* Set the size of the TLB to 4KB */  	mfspr	r3, MAS1 -	li	r2, 0xF00 +	li	r2, 0xF80  	andc	r3, r3, r2	/* Clear the TSIZE bits */  	ori	r3, r3, MAS1_TSIZE(BOOKE_PAGESZ_4K)@l  	oris	r3, r3, MAS1_IPROT@h diff --git a/arch/powerpc/cpu/mpc85xx/tlb.c b/arch/powerpc/cpu/mpc85xx/tlb.c index f44fadcffd8..0dff37f77cd 100644 --- a/arch/powerpc/cpu/mpc85xx/tlb.c +++ b/arch/powerpc/cpu/mpc85xx/tlb.c @@ -66,7 +66,7 @@ void read_tlbcam_entry(int idx, u32 *valid, u32 *tsize, unsigned long *epn,  	_mas1 = mfspr(MAS1);  	*valid = (_mas1 & MAS1_VALID); -	*tsize = (_mas1 >> 8) & 0xf; +	*tsize = (_mas1 >> 7) & 0x1f;  	*epn = mfspr(MAS2) & MAS2_EPN;  	*rpn = mfspr(MAS3) & MAS3_RPN;  #ifdef CONFIG_ENABLE_36BIT_PHYS @@ -99,7 +99,7 @@ static inline void use_tlb_cam(u8 idx)  	int i = idx / 32;  	int bit = idx % 32; -	gd->used_tlb_cams[i] |= (1 << bit); +	gd->arch.used_tlb_cams[i] |= (1 << bit);  }  static inline void free_tlb_cam(u8 idx) @@ -107,7 +107,7 @@ static inline void free_tlb_cam(u8 idx)  	int i = idx / 32;  	int bit = idx % 32; -	gd->used_tlb_cams[i] &= ~(1 << bit); +	gd->arch.used_tlb_cams[i] &= ~(1 << bit);  }  void init_used_tlb_cams(void) @@ -116,7 +116,7 @@ void init_used_tlb_cams(void)  	unsigned int num_cam = mfspr(SPRN_TLB1CFG) & 0xfff;  	for (i = 0; i < ((CONFIG_SYS_NUM_TLBCAMS+31)/32); i++) -		gd->used_tlb_cams[i] = 0; +		gd->arch.used_tlb_cams[i] = 0;  	/* walk all the entries */  	for (i = 0; i < num_cam; i++) { @@ -133,7 +133,7 @@ int find_free_tlbcam(void)  	u32 idx;  	for (i = 0; i < ((CONFIG_SYS_NUM_TLBCAMS+31)/32); i++) { -		idx = ffz(gd->used_tlb_cams[i]); +		idx = ffz(gd->arch.used_tlb_cams[i]);  		if (idx != 32)  			break; @@ -156,6 +156,13 @@ void set_tlb(u8 tlb, u32 epn, u64 rpn,  	if (tlb == 1)  		use_tlb_cam(esel); +	if ((mfspr(SPRN_MMUCFG) & MMUCFG_MAVN) == MMUCFG_MAVN_V1 && +	    tsize & 1) { +		printf("%s: bad tsize %d on entry %d at 0x%08x\n", +			__func__, tsize, tlb, epn); +		return; +	} +  	_mas0 = FSL_BOOKE_MAS0(tlb, esel, 0);  	_mas1 = FSL_BOOKE_MAS1(1, iprot, 0, ts, tsize);  	_mas2 = FSL_BOOKE_MAS2(epn, wimge); @@ -251,7 +258,7 @@ setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg)  	unsigned int tlb_size;  	unsigned int wimge = MAS2_M;  	unsigned int ram_tlb_address = (unsigned int)CONFIG_SYS_DDR_SDRAM_BASE; -	unsigned int max_cam; +	unsigned int max_cam, tsize_mask;  	u64 size, memsize = (u64)memsize_in_meg << 20;  #ifdef CONFIG_SYS_PPC_DDR_WIMGE @@ -261,15 +268,17 @@ setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg)  	if ((mfspr(SPRN_MMUCFG) & MMUCFG_MAVN) == MMUCFG_MAVN_V1) {  		/* Convert (4^max) kB to (2^max) bytes */  		max_cam = ((mfspr(SPRN_TLB1CFG) >> 16) & 0xf) * 2 + 10; +		tsize_mask = ~1U;  	} else {  		/* Convert (2^max) kB to (2^max) bytes */  		max_cam = __ilog2(mfspr(SPRN_TLB1PS)) + 10; +		tsize_mask = ~0U;  	}  	for (i = 0; size && i < 8; i++) {  		int ram_tlb_index = find_free_tlbcam(); -		u32 camsize = __ilog2_u64(size) & ~1U; -		u32 align = __ilog2(ram_tlb_address) & ~1U; +		u32 camsize = __ilog2_u64(size) & tsize_mask; +		u32 align = __ilog2(ram_tlb_address) & tsize_mask;  		if (ram_tlb_index == -1)  			break; @@ -281,7 +290,7 @@ setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg)  		if (camsize > max_cam)  			camsize = max_cam; -		tlb_size = (camsize - 10) / 2; +		tlb_size = camsize - 10;  		set_tlb(1, ram_tlb_address, p_addr,  			MAS3_SX|MAS3_SW|MAS3_SR, wimge, | 
