diff options
Diffstat (limited to 'arch/powerpc')
63 files changed, 1054 insertions, 435 deletions
| diff --git a/arch/powerpc/cpu/mpc512x/cpu.c b/arch/powerpc/cpu/mpc512x/cpu.c index a1a3bd4adf1..bb03c6d8857 100644 --- a/arch/powerpc/cpu/mpc512x/cpu.c +++ b/arch/powerpc/cpu/mpc512x/cpu.c @@ -68,8 +68,8 @@ int checkcpu (void)  	}  	printf ("at %s MHz, CSB at %s MHz (RSR=0x%04lx)\n",  		strmhz(buf1, clock), -		strmhz(buf2, gd->csb_clk), -		gd->reset_status & 0xffff); +		strmhz(buf2, gd->arch.csb_clk), +		gd->arch.reset_status & 0xffff);  	return 0;  } diff --git a/arch/powerpc/cpu/mpc512x/cpu_init.c b/arch/powerpc/cpu/mpc512x/cpu_init.c index fe6beaf84d2..32ade1b0b92 100644 --- a/arch/powerpc/cpu/mpc512x/cpu_init.c +++ b/arch/powerpc/cpu/mpc512x/cpu_init.c @@ -62,7 +62,7 @@ void cpu_init_f (volatile immap_t * im)  #endif  	/* RSR - Reset Status Register - clear all status */ -	gd->reset_status = im->reset.rsr; +	gd->arch.reset_status = im->reset.rsr;  	out_be32(&im->reset.rsr, ~RSR_RES);  	/* diff --git a/arch/powerpc/cpu/mpc512x/i2c.c b/arch/powerpc/cpu/mpc512x/i2c.c index 0ea12806b92..59040f83c92 100644 --- a/arch/powerpc/cpu/mpc512x/i2c.c +++ b/arch/powerpc/cpu/mpc512x/i2c.c @@ -250,7 +250,7 @@ static int mpc_get_fdr (int speed)  			{126, 128}  		}; -		ips = gd->ips_clk; +		ips = gd->arch.ips_clk;  		for (i = 7; i >= 0; i--) {  			for (j = 7; j >= 0; j--) {  				scl = 2 * (scltap[j].scl2tap + diff --git a/arch/powerpc/cpu/mpc512x/ide.c b/arch/powerpc/cpu/mpc512x/ide.c index dd6b2f4673d..7a496734e7c 100644 --- a/arch/powerpc/cpu/mpc512x/ide.c +++ b/arch/powerpc/cpu/mpc512x/ide.c @@ -100,7 +100,7 @@ int ide_preinit (void)  	ide_set_reset(0);  	/* Init timings : we use PIO mode 0 timings */ -	t = 1000000000 / gd->ips_clk;	/* period in ns */ +	t = 1000000000 / gd->arch.ips_clk;	/* period in ns */  	cfg.bytes.field1 = 3;  	cfg.bytes.field2 = 3;  	cfg.bytes.field3 = (pio_specs.t1 + t) / t; diff --git a/arch/powerpc/cpu/mpc512x/serial.c b/arch/powerpc/cpu/mpc512x/serial.c index 58587fd5bcf..3afbe810184 100644 --- a/arch/powerpc/cpu/mpc512x/serial.c +++ b/arch/powerpc/cpu/mpc512x/serial.c @@ -140,7 +140,7 @@ void serial_setbrg_dev(unsigned int idx)  	}  	/* calculate divisor for setting PSC CTUR and CTLR registers */ -	baseclk = (gd->ips_clk + 8) / 16; +	baseclk = (gd->arch.ips_clk + 8) / 16;  	div = (baseclk + (baudrate / 2)) / baudrate;  	out_8(&psc->ctur, (div >> 8) & 0xff); diff --git a/arch/powerpc/cpu/mpc512x/speed.c b/arch/powerpc/cpu/mpc512x/speed.c index 9d749f22e4d..9a8f315d825 100644 --- a/arch/powerpc/cpu/mpc512x/speed.c +++ b/arch/powerpc/cpu/mpc512x/speed.c @@ -113,9 +113,9 @@ int get_clocks (void)  		pci_clk = 333333;  	} -	gd->ips_clk = ips_clk; +	gd->arch.ips_clk = ips_clk;  	gd->pci_clk = pci_clk; -	gd->csb_clk = csb_clk; +	gd->arch.csb_clk = csb_clk;  	gd->cpu_clk = core_clk;  	gd->bus_clk = csb_clk;  	return 0; @@ -128,7 +128,7 @@ int get_clocks (void)   *********************************************/  ulong get_bus_freq (ulong dummy)  { -	return gd->csb_clk; +	return gd->arch.csb_clk;  }  int do_clocks (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) @@ -137,10 +137,13 @@ int do_clocks (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  	printf("Clock configuration:\n");  	printf("  CPU:                 %-4s MHz\n", strmhz(buf, gd->cpu_clk)); -	printf("  Coherent System Bus: %-4s MHz\n", strmhz(buf, gd->csb_clk)); -	printf("  IPS Bus:             %-4s MHz\n", strmhz(buf, gd->ips_clk)); +	printf("  Coherent System Bus: %-4s MHz\n", +	       strmhz(buf, gd->arch.csb_clk)); +	printf("  IPS Bus:             %-4s MHz\n", +	       strmhz(buf, gd->arch.ips_clk));  	printf("  PCI:                 %-4s MHz\n", strmhz(buf, gd->pci_clk)); -	printf("  DDR:                 %-4s MHz\n", strmhz(buf, 2*gd->csb_clk)); +	printf("  DDR:                 %-4s MHz\n", +	       strmhz(buf, 2 * gd->arch.csb_clk));  	return 0;  } diff --git a/arch/powerpc/cpu/mpc5xxx/cpu.c b/arch/powerpc/cpu/mpc5xxx/cpu.c index 0c1eebd4ee1..dc021e35f55 100644 --- a/arch/powerpc/cpu/mpc5xxx/cpu.c +++ b/arch/powerpc/cpu/mpc5xxx/cpu.c @@ -36,7 +36,6 @@  #if defined(CONFIG_OF_LIBFDT)  #include <libfdt.h> -#include <libfdt_env.h>  #include <fdt_support.h>  #endif diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c index b423d2fe341..8d5f47b1bba 100644 --- a/arch/powerpc/cpu/mpc5xxx/i2c.c +++ b/arch/powerpc/cpu/mpc5xxx/i2c.c @@ -310,7 +310,7 @@ static int mpc_get_fdr(int speed)  			{126, 128}  		}; -		ipb = gd->ipb_clk; +		ipb = gd->arch.ipb_clk;  		for (i = 7; i >= 0; i--) {  			for (j = 7; j >= 0; j--) {  				scl = 2 * (scltap[j].scl2tap + diff --git a/arch/powerpc/cpu/mpc5xxx/ide.c b/arch/powerpc/cpu/mpc5xxx/ide.c index d337abb1c9f..094f62b6bab 100644 --- a/arch/powerpc/cpu/mpc5xxx/ide.c +++ b/arch/powerpc/cpu/mpc5xxx/ide.c @@ -75,7 +75,7 @@ int ide_preinit (void)  	psdma->PtdCntrl |= 1;  	/* Init timings : we use PIO mode 0 timings */ -	period = 1000000000 / gd->ipb_clk;	/* period in ns */ +	period = 1000000000 / gd->arch.ipb_clk;	/* period in ns */  	t0 = CALC_TIMING (600);  	t2_8 = CALC_TIMING (290); diff --git a/arch/powerpc/cpu/mpc5xxx/serial.c b/arch/powerpc/cpu/mpc5xxx/serial.c index eb141619b87..1ccb4e35def 100644 --- a/arch/powerpc/cpu/mpc5xxx/serial.c +++ b/arch/powerpc/cpu/mpc5xxx/serial.c @@ -89,7 +89,7 @@ int serial_init_dev (unsigned long dev_base)  	/* select clock sources */  	psc->psc_clock_select = 0; -	baseclk = (gd->ipb_clk + 16) / 32; +	baseclk = (gd->arch.ipb_clk + 16) / 32;  	/* switch to UART mode */  	psc->sicr = 0; @@ -169,7 +169,7 @@ void serial_setbrg_dev (unsigned long dev_base)  	volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base;  	unsigned long baseclk, div; -	baseclk = (gd->ipb_clk + 16) / 32; +	baseclk = (gd->arch.ipb_clk + 16) / 32;  	/* set up UART divisor */  	div = (baseclk + (gd->baudrate/2)) / gd->baudrate; diff --git a/arch/powerpc/cpu/mpc5xxx/speed.c b/arch/powerpc/cpu/mpc5xxx/speed.c index 8027d3e08a2..5353e3d5350 100644 --- a/arch/powerpc/cpu/mpc5xxx/speed.c +++ b/arch/powerpc/cpu/mpc5xxx/speed.c @@ -66,14 +66,20 @@ int get_clocks (void)  	val = *(vu_long *)MPC5XXX_CDM_CFG;  	if (val & (1 << 8)) { -		gd->ipb_clk = gd->bus_clk / 2; +		gd->arch.ipb_clk = gd->bus_clk / 2;  	} else { -		gd->ipb_clk = gd->bus_clk; +		gd->arch.ipb_clk = gd->bus_clk;  	}  	switch (val & 3) { -		case 0: gd->pci_clk = gd->ipb_clk; break; -		case 1: gd->pci_clk = gd->ipb_clk / 2; break; -		default: gd->pci_clk = gd->bus_clk / 4; break; +	case 0: +		gd->pci_clk = gd->arch.ipb_clk; +		break; +	case 1: +		gd->pci_clk = gd->arch.ipb_clk / 2; +		break; +	default: +		gd->pci_clk = gd->bus_clk / 4; +		break;  	}  	return (0); @@ -85,7 +91,7 @@ int prt_mpc5xxx_clks (void)  	printf ("       Bus %s MHz, IPB %s MHz, PCI %s MHz\n",  		strmhz(buf1, gd->bus_clk), -		strmhz(buf2, gd->ipb_clk), +		strmhz(buf2, gd->arch.ipb_clk),  		strmhz(buf3, gd->pci_clk)  	);  	return (0); diff --git a/arch/powerpc/cpu/mpc8220/fec.c b/arch/powerpc/cpu/mpc8220/fec.c index aaf9be107af..43fa802ca96 100644 --- a/arch/powerpc/cpu/mpc8220/fec.c +++ b/arch/powerpc/cpu/mpc8220/fec.c @@ -288,9 +288,11 @@ static int mpc8220_fec_init (struct eth_device *dev, bd_t * bis)  		 * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock  		 * and do not drop the Preamble.  		 */ -		/* tbd - rtm */ -		/*fec->eth->mii_speed = (((gd->ipb_clk >> 20) / 5) << 1); */ -		/* No MII for 7-wire mode */ +		/* +		 * tbd - rtm +		 * fec->eth->mii_speed = (((gd->arch.ipb_clk >> 20) / 5) << 1); +		 * No MII for 7-wire mode +		 */  		fec->eth->mii_speed = 0x00000030;  	} diff --git a/arch/powerpc/cpu/mpc8220/speed.c b/arch/powerpc/cpu/mpc8220/speed.c index 62ac845b7ae..bb72e5ce126 100644 --- a/arch/powerpc/cpu/mpc8220/speed.c +++ b/arch/powerpc/cpu/mpc8220/speed.c @@ -71,7 +71,7 @@ int get_clocks (void)  #error clock measuring not implemented yet - define CONFIG_SYS_MPC8220_CLKIN  #endif -	gd->inp_clk = CONFIG_SYS_MPC8220_CLKIN; +	gd->arch.inp_clk = CONFIG_SYS_MPC8220_CLKIN;  	/* Read XLB to PCI(INP) clock multiplier */  	pci2bus = (*((volatile u32 *)PCI_REG_PCIGSCR) & @@ -85,7 +85,7 @@ int get_clocks (void)  	/* FlexBus is temporary set as the same as input clock */  	/* will do dynamic in the future */ -	gd->flb_clk = CONFIG_SYS_MPC8220_CLKIN; +	gd->arch.flb_clk = CONFIG_SYS_MPC8220_CLKIN;  	/* CPU Clock - Read HID1 */  	asm volatile ("mfspr %0, 1009":"=r" (hid1):); @@ -97,12 +97,14 @@ int get_clocks (void)  	for (i = 0; i < size; i++)  		if (hid1 == bus2core[i].hid1) {  			gd->cpu_clk = (bus2core[i].multi * gd->bus_clk) >> 1; -			gd->vco_clk = CONFIG_SYS_MPC8220_SYSPLL_VCO_MULTIPLIER * (gd->pci_clk * bus2core[i].vco_div)/2; +			gd->arch.vco_clk = +				CONFIG_SYS_MPC8220_SYSPLL_VCO_MULTIPLIER * +				(gd->pci_clk * bus2core[i].vco_div) / 2;  			break;  		}  	/* hardcoded 81MHz for now */ -	gd->pev_clk = 81000000; +	gd->arch.pev_clk = 81000000;  	return (0);  } @@ -115,7 +117,7 @@ int prt_mpc8220_clks (void)  		strmhz(buf1, gd->bus_clk),  		strmhz(buf2, gd->cpu_clk),  		strmhz(buf3, gd->pci_clk), -		strmhz(buf4, gd->vco_clk) +		strmhz(buf4, gd->arch.vco_clk)  	);  	return (0);  } diff --git a/arch/powerpc/cpu/mpc8260/commproc.c b/arch/powerpc/cpu/mpc8260/commproc.c index 082957ee08e..22cef3e9839 100644 --- a/arch/powerpc/cpu/mpc8260/commproc.c +++ b/arch/powerpc/cpu/mpc8260/commproc.c @@ -30,8 +30,8 @@ m8260_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 @@ -60,21 +60,22 @@ m8260_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("m8260_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 *)&immr->im_dprambase[retloc], 0, size); @@ -101,7 +102,7 @@ m8260_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 / 16)  /* This function is used by UARTs, or anything else that uses a 16x diff --git a/arch/powerpc/cpu/mpc8260/cpu.c b/arch/powerpc/cpu/mpc8260/cpu.c index 220c1e24b10..f8bc5a9834b 100644 --- a/arch/powerpc/cpu/mpc8260/cpu.c +++ b/arch/powerpc/cpu/mpc8260/cpu.c @@ -50,7 +50,6 @@  #if defined(CONFIG_OF_LIBFDT)  #include <libfdt.h> -#include <libfdt_env.h>  #include <fdt_support.h>  #endif diff --git a/arch/powerpc/cpu/mpc8260/cpu_init.c b/arch/powerpc/cpu/mpc8260/cpu_init.c index acd48a9f553..3964e607d05 100644 --- a/arch/powerpc/cpu/mpc8260/cpu_init.c +++ b/arch/powerpc/cpu/mpc8260/cpu_init.c @@ -120,7 +120,7 @@ void cpu_init_f (volatile immap_t * immr)  	memset ((void *) gd, 0, sizeof (gd_t));  	/* RSR - Reset Status Register - clear all status (5-4) */ -	gd->reset_status = immr->im_clkrst.car_rsr; +	gd->arch.reset_status = immr->im_clkrst.car_rsr;  	immr->im_clkrst.car_rsr = RSR_ALLBITS;  	/* RMR - Reset Mode Register - contains checkstop reset enable (5-5) */ @@ -274,7 +274,7 @@ int prt_8260_rsr (void)  		RSR_EHRS, "External Hard"}  	};  	static int n = sizeof bits / sizeof bits[0]; -	ulong rsr = gd->reset_status; +	ulong rsr = gd->arch.reset_status;  	int i;  	char *sep; diff --git a/arch/powerpc/cpu/mpc8260/i2c.c b/arch/powerpc/cpu/mpc8260/i2c.c index 7382cbadc7e..b720b1fb882 100644 --- a/arch/powerpc/cpu/mpc8260/i2c.c +++ b/arch/powerpc/cpu/mpc8260/i2c.c @@ -259,7 +259,7 @@ void i2c_init(int speed, int slaveadd)  	 * divide BRGCLK by 1)  	 */  	debug("[I2C] Setting rate...\n"); -	i2c_setrate(gd->brg_clk, CONFIG_SYS_I2C_SPEED); +	i2c_setrate(gd->arch.brg_clk, CONFIG_SYS_I2C_SPEED);  	/* Set I2C controller in master mode */  	i2c->i2c_i2com = 0x01; diff --git a/arch/powerpc/cpu/mpc8260/speed.c b/arch/powerpc/cpu/mpc8260/speed.c index bb50dee9602..7841e8a898c 100644 --- a/arch/powerpc/cpu/mpc8260/speed.c +++ b/arch/powerpc/cpu/mpc8260/speed.c @@ -135,17 +135,17 @@ int get_clocks (void)  	    (get_pvr () == PVR_8260_HIP7R1) ||  	    (get_pvr () == PVR_8260_HIP7RA)) {  		pllmf = (scmr & SCMR_PLLMF_MSKH7) >> SCMR_PLLMF_SHIFT; -		gd->vco_out = clkin * (pllmf + 1); +		gd->arch.vco_out = clkin * (pllmf + 1);  	} else {                        /* HiP3, HiP4 */  		pllmf = (scmr & SCMR_PLLMF_MSK) >> SCMR_PLLMF_SHIFT;  		plldf = (scmr & SCMR_PLLDF) ? 1 : 0; -		gd->vco_out = (clkin * 2 * (pllmf + 1)) / (plldf + 1); +		gd->arch.vco_out = (clkin * 2 * (pllmf + 1)) / (plldf + 1);  	} -	gd->cpm_clk = gd->vco_out / 2; +	gd->arch.cpm_clk = gd->arch.vco_out / 2;  	gd->bus_clk = clkin; -	gd->scc_clk = gd->vco_out / 4; -	gd->brg_clk = gd->vco_out / (1 << (2 * (dfbrg + 1))); +	gd->arch.scc_clk = gd->arch.vco_out / 4; +	gd->arch.brg_clk = gd->arch.vco_out / (1 << (2 * (dfbrg + 1)));  	if (cp->b2c_mult > 0) {  		gd->cpu_clk = (clkin * cp->b2c_mult) / 2; @@ -173,7 +173,7 @@ int get_clocks (void)  			pci_div = pcidf + 1;  		} -		gd->pci_clk = (gd->cpm_clk * 2) / pci_div; +		gd->pci_clk = (gd->arch.cpm_clk * 2) / pci_div;  	}  #endif @@ -231,10 +231,10 @@ int prt_8260_clks (void)  			plldf, pllmf, pcidf);  	printf (" - vco_out %10ld, scc_clk %10ld, brg_clk %10ld\n", -			gd->vco_out, gd->scc_clk, gd->brg_clk); +			gd->arch.vco_out, gd->arch.scc_clk, gd->arch.brg_clk);  	printf (" - cpu_clk %10ld, cpm_clk %10ld, bus_clk %10ld\n", -			gd->cpu_clk, gd->cpm_clk, gd->bus_clk); +			gd->cpu_clk, gd->arch.cpm_clk, gd->bus_clk);  #ifdef CONFIG_PCI  	printf (" - pci_clk %10ld\n", gd->pci_clk);  #endif diff --git a/arch/powerpc/cpu/mpc83xx/Makefile b/arch/powerpc/cpu/mpc83xx/Makefile index 687f5e90a4d..8a470b84b84 100644 --- a/arch/powerpc/cpu/mpc83xx/Makefile +++ b/arch/powerpc/cpu/mpc83xx/Makefile @@ -27,8 +27,22 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(CPU).o +MINIMAL= + +ifdef CONFIG_SPL_BUILD +ifdef CONFIG_SPL_INIT_MINIMAL +MINIMAL=y +endif +endif +  START	= start.o +ifdef MINIMAL + +COBJS-y	+= spl_minimal.o + +else +  COBJS-y += traps.o  COBJS-y += cpu.o  COBJS-y += cpu_init.o @@ -51,6 +65,8 @@ COBJS-y += spd_sdram.o  endif  COBJS-$(CONFIG_FSL_DDR2) += law.o +endif # not minimal +  COBJS	:= $(COBJS-y)  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) $(addprefix $(obj),$(COBJS_LN-y:.o=.c))  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS) $(COBJS_LN-y)) diff --git a/arch/powerpc/cpu/mpc83xx/cpu.c b/arch/powerpc/cpu/mpc83xx/cpu.c index e64b0c34118..cc202342982 100644 --- a/arch/powerpc/cpu/mpc83xx/cpu.c +++ b/arch/powerpc/cpu/mpc83xx/cpu.c @@ -122,7 +122,7 @@ int checkcpu(void)  	printf(" at %s MHz, ", strmhz(buf, clock)); -	printf("CSB: %s MHz\n", strmhz(buf, gd->csb_clk)); +	printf("CSB: %s MHz\n", strmhz(buf, gd->arch.csb_clk));  	return 0;  } diff --git a/arch/powerpc/cpu/mpc83xx/cpu_init.c b/arch/powerpc/cpu/mpc83xx/cpu_init.c index 20d06003e57..51533519626 100644 --- a/arch/powerpc/cpu/mpc83xx/cpu_init.c +++ b/arch/powerpc/cpu/mpc83xx/cpu_init.c @@ -232,12 +232,12 @@ void cpu_init_f (volatile immap_t * im)  	clrsetbits_be32(&im->clk.sccr, sccr_mask, sccr_val);  	/* RSR - Reset Status Register - clear all status (4.6.1.3) */ -	gd->reset_status = __raw_readl(&im->reset.rsr); +	gd->arch.reset_status = __raw_readl(&im->reset.rsr);  	__raw_writel(~(RSR_RES), &im->reset.rsr);  	/* AER - Arbiter Event Register - store status */ -	gd->arbiter_event_attributes = __raw_readl(&im->arbiter.aeatr); -	gd->arbiter_event_address = __raw_readl(&im->arbiter.aeadr); +	gd->arch.arbiter_event_attributes = __raw_readl(&im->arbiter.aeatr); +	gd->arch.arbiter_event_address = __raw_readl(&im->arbiter.aeadr);  	/*  	 * RMR - Reset Mode Register @@ -440,42 +440,44 @@ static int print_83xx_arb_event(int force)  		"reserved"  	}; -	int etype = (gd->arbiter_event_attributes & AEATR_EVENT) +	int etype = (gd->arch.arbiter_event_attributes & AEATR_EVENT)  	            >> AEATR_EVENT_SHIFT; -	int mstr_id = (gd->arbiter_event_attributes & AEATR_MSTR_ID) +	int mstr_id = (gd->arch.arbiter_event_attributes & AEATR_MSTR_ID)  	              >> AEATR_MSTR_ID_SHIFT; -	int tbst = (gd->arbiter_event_attributes & AEATR_TBST) +	int tbst = (gd->arch.arbiter_event_attributes & AEATR_TBST)  	           >> AEATR_TBST_SHIFT; -	int tsize = (gd->arbiter_event_attributes & AEATR_TSIZE) +	int tsize = (gd->arch.arbiter_event_attributes & AEATR_TSIZE)  	            >> AEATR_TSIZE_SHIFT; -	int ttype = (gd->arbiter_event_attributes & AEATR_TTYPE) +	int ttype = (gd->arch.arbiter_event_attributes & AEATR_TTYPE)  	            >> AEATR_TTYPE_SHIFT; -	if (!force && !gd->arbiter_event_address) +	if (!force && !gd->arch.arbiter_event_address)  		return 0;  	puts("Arbiter Event Status:\n"); -	printf("       Event Address: 0x%08lX\n", gd->arbiter_event_address); +	printf("       Event Address: 0x%08lX\n", +	       gd->arch.arbiter_event_address);  	printf("       Event Type:    0x%1x  = %s\n", etype, event[etype]);  	printf("       Master ID:     0x%02x = %s\n", mstr_id, master[mstr_id]);  	printf("       Transfer Size: 0x%1x  = %d bytes\n", (tbst<<3) | tsize,  				tbst ? (tsize ? tsize : 8) : 16 + 8 * tsize);  	printf("       Transfer Type: 0x%02x = %s\n", ttype, transfer[ttype]); -	return gd->arbiter_event_address; +	return gd->arch.arbiter_event_address;  }  #elif defined(CONFIG_DISPLAY_AER_BRIEF)  static int print_83xx_arb_event(int force)  { -	if (!force && !gd->arbiter_event_address) +	if (!force && !gd->arch.arbiter_event_address)  		return 0;  	printf("Arbiter Event Status: AEATR=0x%08lX, AEADR=0x%08lX\n", -		gd->arbiter_event_attributes, gd->arbiter_event_address); +		gd->arch.arbiter_event_attributes, +		gd->arch.arbiter_event_address); -	return gd->arbiter_event_address; +	return gd->arch.arbiter_event_address;  }  #endif /* CONFIG_DISPLAY_AER_xxxx */ @@ -499,7 +501,7 @@ int prt_83xx_rsr(void)  		RSR_HRS,  "External/Internal Hard"}  	};  	static int n = sizeof bits / sizeof bits[0]; -	ulong rsr = gd->reset_status; +	ulong rsr = gd->arch.reset_status;  	int i;  	char *sep; diff --git a/arch/powerpc/cpu/mpc83xx/fdt.c b/arch/powerpc/cpu/mpc83xx/fdt.c index 1f54781b7e2..fe553a74f00 100644 --- a/arch/powerpc/cpu/mpc83xx/fdt.c +++ b/arch/powerpc/cpu/mpc83xx/fdt.c @@ -118,7 +118,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)  	do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,  		"bus-frequency", bd->bi_busfreq, 1);  	do_fixup_by_prop_u32(blob, "device_type", "cpu", 4, -		"clock-frequency", gd->core_clk, 1); +		"clock-frequency", gd->arch.core_clk, 1);  	do_fixup_by_prop_u32(blob, "device_type", "soc", 4,  		"bus-frequency", bd->bi_busfreq, 1);  	do_fixup_by_compat_u32(blob, "fsl,soc", diff --git a/arch/powerpc/cpu/mpc83xx/pcie.c b/arch/powerpc/cpu/mpc83xx/pcie.c index 52d446175aa..609b133215c 100644 --- a/arch/powerpc/cpu/mpc83xx/pcie.c +++ b/arch/powerpc/cpu/mpc83xx/pcie.c @@ -286,8 +286,8 @@ static void mpc83xx_pcie_init_bus(int bus, struct pci_region *reg)  	get_clocks();  	/* Configure the PCIE controller core clock ratio */  	out_le32(hose_cfg_base + PEX_GCLK_RATIO, -		(((bus ? gd->pciexp2_clk : gd->pciexp1_clk) / 1000000) * 16) -		/ 333); +		(((bus ? gd->arch.pciexp2_clk : gd->arch.pciexp1_clk) +			/ 1000000) * 16) / 333);  	udelay(1000000);  	/* Do Type 1 bridge configuration */ diff --git a/arch/powerpc/cpu/mpc83xx/speed.c b/arch/powerpc/cpu/mpc83xx/speed.c index b8c05d15929..6be0e3a2ee4 100644 --- a/arch/powerpc/cpu/mpc83xx/speed.c +++ b/arch/powerpc/cpu/mpc83xx/speed.c @@ -462,53 +462,53 @@ int get_clocks(void)  	brg_clk = qe_clk / 2;  #endif -	gd->csb_clk = csb_clk; +	gd->arch.csb_clk = csb_clk;  #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x) -	gd->tsec1_clk = tsec1_clk; -	gd->tsec2_clk = tsec2_clk; -	gd->usbdr_clk = usbdr_clk; +	gd->arch.tsec1_clk = tsec1_clk; +	gd->arch.tsec2_clk = tsec2_clk; +	gd->arch.usbdr_clk = usbdr_clk;  #elif defined(CONFIG_MPC8309) -	gd->usbdr_clk = usbdr_clk; +	gd->arch.usbdr_clk = usbdr_clk;  #endif  #if defined(CONFIG_MPC834x) -	gd->usbmph_clk = usbmph_clk; +	gd->arch.usbmph_clk = usbmph_clk;  #endif  #if defined(CONFIG_MPC8315) -	gd->tdm_clk = tdm_clk; +	gd->arch.tdm_clk = tdm_clk;  #endif  #if defined(CONFIG_FSL_ESDHC) -	gd->sdhc_clk = sdhc_clk; +	gd->arch.sdhc_clk = sdhc_clk;  #endif -	gd->core_clk = core_clk; -	gd->i2c1_clk = i2c1_clk; +	gd->arch.core_clk = core_clk; +	gd->arch.i2c1_clk = i2c1_clk;  #if !defined(CONFIG_MPC832x) -	gd->i2c2_clk = i2c2_clk; +	gd->arch.i2c2_clk = i2c2_clk;  #endif  #if !defined(CONFIG_MPC8309) -	gd->enc_clk = enc_clk; +	gd->arch.enc_clk = enc_clk;  #endif -	gd->lbiu_clk = lbiu_clk; -	gd->lclk_clk = lclk_clk; +	gd->arch.lbiu_clk = lbiu_clk; +	gd->arch.lclk_clk = lclk_clk;  	gd->mem_clk = mem_clk;  #if defined(CONFIG_MPC8360) -	gd->mem_sec_clk = mem_sec_clk; +	gd->arch.mem_sec_clk = mem_sec_clk;  #endif  #if defined(CONFIG_QE) -	gd->qe_clk = qe_clk; -	gd->brg_clk = brg_clk; +	gd->arch.qe_clk = qe_clk; +	gd->arch.brg_clk = brg_clk;  #endif  #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC837x) -	gd->pciexp1_clk = pciexp1_clk; -	gd->pciexp2_clk = pciexp2_clk; +	gd->arch.pciexp1_clk = pciexp1_clk; +	gd->arch.pciexp2_clk = pciexp2_clk;  #endif  #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315) -	gd->sata_clk = sata_clk; +	gd->arch.sata_clk = sata_clk;  #endif  	gd->pci_clk = pci_sync_in; -	gd->cpu_clk = gd->core_clk; -	gd->bus_clk = gd->csb_clk; +	gd->cpu_clk = gd->arch.core_clk; +	gd->bus_clk = gd->arch.csb_clk;  	return 0;  } @@ -519,7 +519,7 @@ int get_clocks(void)   *********************************************/  ulong get_bus_freq(ulong dummy)  { -	return gd->csb_clk; +	return gd->arch.csb_clk;  }  /******************************************** @@ -536,49 +536,69 @@ static int do_clocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	char buf[32];  	printf("Clock configuration:\n"); -	printf("  Core:                %-4s MHz\n", strmhz(buf, gd->core_clk)); -	printf("  Coherent System Bus: %-4s MHz\n", strmhz(buf, gd->csb_clk)); +	printf("  Core:                %-4s MHz\n", +	       strmhz(buf, gd->arch.core_clk)); +	printf("  Coherent System Bus: %-4s MHz\n", +	       strmhz(buf, gd->arch.csb_clk));  #if defined(CONFIG_QE) -	printf("  QE:                  %-4s MHz\n", strmhz(buf, gd->qe_clk)); -	printf("  BRG:                 %-4s MHz\n", strmhz(buf, gd->brg_clk)); -#endif -	printf("  Local Bus Controller:%-4s MHz\n", strmhz(buf, gd->lbiu_clk)); -	printf("  Local Bus:           %-4s MHz\n", strmhz(buf, gd->lclk_clk)); +	printf("  QE:                  %-4s MHz\n", +	       strmhz(buf, gd->arch.qe_clk)); +	printf("  BRG:                 %-4s MHz\n", +	       strmhz(buf, gd->arch.brg_clk)); +#endif +	printf("  Local Bus Controller:%-4s MHz\n", +	       strmhz(buf, gd->arch.lbiu_clk)); +	printf("  Local Bus:           %-4s MHz\n", +	       strmhz(buf, gd->arch.lclk_clk));  	printf("  DDR:                 %-4s MHz\n", strmhz(buf, gd->mem_clk));  #if defined(CONFIG_MPC8360) -	printf("  DDR Secondary:       %-4s MHz\n", strmhz(buf, gd->mem_sec_clk)); +	printf("  DDR Secondary:       %-4s MHz\n", +	       strmhz(buf, gd->arch.mem_sec_clk));  #endif  #if !defined(CONFIG_MPC8309) -	printf("  SEC:                 %-4s MHz\n", strmhz(buf, gd->enc_clk)); +	printf("  SEC:                 %-4s MHz\n", +	       strmhz(buf, gd->arch.enc_clk));  #endif -	printf("  I2C1:                %-4s MHz\n", strmhz(buf, gd->i2c1_clk)); +	printf("  I2C1:                %-4s MHz\n", +	       strmhz(buf, gd->arch.i2c1_clk));  #if !defined(CONFIG_MPC832x) -	printf("  I2C2:                %-4s MHz\n", strmhz(buf, gd->i2c2_clk)); +	printf("  I2C2:                %-4s MHz\n", +	       strmhz(buf, gd->arch.i2c2_clk));  #endif  #if defined(CONFIG_MPC8315) -	printf("  TDM:                 %-4s MHz\n", strmhz(buf, gd->tdm_clk)); +	printf("  TDM:                 %-4s MHz\n", +	       strmhz(buf, gd->arch.tdm_clk));  #endif  #if defined(CONFIG_FSL_ESDHC) -	printf("  SDHC:                %-4s MHz\n", strmhz(buf, gd->sdhc_clk)); +	printf("  SDHC:                %-4s MHz\n", +	       strmhz(buf, gd->arch.sdhc_clk));  #endif  #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x) -	printf("  TSEC1:               %-4s MHz\n", strmhz(buf, gd->tsec1_clk)); -	printf("  TSEC2:               %-4s MHz\n", strmhz(buf, gd->tsec2_clk)); -	printf("  USB DR:              %-4s MHz\n", strmhz(buf, gd->usbdr_clk)); +	printf("  TSEC1:               %-4s MHz\n", +	       strmhz(buf, gd->arch.tsec1_clk)); +	printf("  TSEC2:               %-4s MHz\n", +	       strmhz(buf, gd->arch.tsec2_clk)); +	printf("  USB DR:              %-4s MHz\n", +	       strmhz(buf, gd->arch.usbdr_clk));  #elif defined(CONFIG_MPC8309) -	printf("  USB DR:              %-4s MHz\n", strmhz(buf, gd->usbdr_clk)); +	printf("  USB DR:              %-4s MHz\n", +	       strmhz(buf, gd->arch.usbdr_clk));  #endif  #if defined(CONFIG_MPC834x) -	printf("  USB MPH:             %-4s MHz\n", strmhz(buf, gd->usbmph_clk)); +	printf("  USB MPH:             %-4s MHz\n", +	       strmhz(buf, gd->arch.usbmph_clk));  #endif  #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC837x) -	printf("  PCIEXP1:             %-4s MHz\n", strmhz(buf, gd->pciexp1_clk)); -	printf("  PCIEXP2:             %-4s MHz\n", strmhz(buf, gd->pciexp2_clk)); +	printf("  PCIEXP1:             %-4s MHz\n", +	       strmhz(buf, gd->arch.pciexp1_clk)); +	printf("  PCIEXP2:             %-4s MHz\n", +	       strmhz(buf, gd->arch.pciexp2_clk));  #endif  #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315) -	printf("  SATA:                %-4s MHz\n", strmhz(buf, gd->sata_clk)); +	printf("  SATA:                %-4s MHz\n", +	       strmhz(buf, gd->arch.sata_clk));  #endif  	return 0;  } diff --git a/arch/powerpc/cpu/mpc83xx/nand_init.c b/arch/powerpc/cpu/mpc83xx/spl_minimal.c index d1648b78107..d1648b78107 100644 --- a/arch/powerpc/cpu/mpc83xx/nand_init.c +++ b/arch/powerpc/cpu/mpc83xx/spl_minimal.c diff --git a/arch/powerpc/cpu/mpc83xx/start.S b/arch/powerpc/cpu/mpc83xx/start.S index b70b4ca12ce..44a64b7acd9 100644 --- a/arch/powerpc/cpu/mpc83xx/start.S +++ b/arch/powerpc/cpu/mpc83xx/start.S @@ -58,7 +58,13 @@  #define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)  #endif -#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SYS_RAMBOOT) +#if defined(CONFIG_NAND_SPL) || \ +	(defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_INIT_MINIMAL)) +#define MINIMAL_SPL +#endif + +#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NAND_SPL) && \ +	!defined(CONFIG_SYS_RAMBOOT)  #define CONFIG_SYS_FLASHBOOT  #endif @@ -72,7 +78,7 @@  	GOT_ENTRY(__bss_start)  	GOT_ENTRY(__bss_end__) -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	GOT_ENTRY(_FIXUP_TABLE_)  	GOT_ENTRY(_start)  	GOT_ENTRY(_start_of_vectors) @@ -206,7 +212,8 @@ _start: /* time t 0 */  	/* Initialise the E300 processor core		*/  	/*------------------------------------------*/ -#ifdef CONFIG_NAND_SPL +#if (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_MPC83XX_WAIT_FOR_NAND)) || \ +		defined(CONFIG_NAND_SPL)  	/* The FCM begins execution after only the first page  	 * is loaded.  Wait for the rest before branching  	 * to another flash page. @@ -292,7 +299,7 @@ in_flash:  	/* NOTREACHED - board_init_f() does not return */ -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  /*   * Vector Table   */ @@ -467,7 +474,7 @@ int_return:  	lwz	r1,GPR1(r1)  	SYNC  	rfi -#endif /* !CONFIG_NAND_SPL */ +#endif /* !MINIMAL_SPL */  /*   * This code initialises the E300 processor core @@ -724,7 +731,7 @@ setup_bats:   * Note: requires that all cache bits in   * HID0 are in the low half word.   */ -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	.globl	icache_enable  icache_enable:  	mfspr	r3, HID0 @@ -753,7 +760,7 @@ icache_status:  	mfspr	r3, HID0  	rlwinm	r3, r3, (31 - HID0_ICE_SHIFT + 1), 31, 31  	blr -#endif	/* !CONFIG_NAND_SPL */ +#endif	/* !MINIMAL_SPL */  	.globl	dcache_enable  dcache_enable: @@ -936,7 +943,7 @@ in_ram:  	stw	r0,0(r3)  2:	bdnz	1b -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	/*  	 * Now adjust the fixups and the pointers to the fixups  	 * in case we need to move ourselves again. @@ -991,7 +998,7 @@ clear_bss:  	mr	r4, r10		/* Destination Address		*/  	bl	board_init_r -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  	/*  	 * Copy exception vector code to low memory  	 * @@ -1061,7 +1068,7 @@ trap_init:  	mtlr	r4			/* restore link register    */  	blr -#endif /* !CONFIG_NAND_SPL */ +#endif /* !MINIMAL_SPL */  #ifdef CONFIG_SYS_INIT_RAM_LOCK  lock_ram_in_cache: @@ -1085,7 +1092,7 @@ lock_ram_in_cache:  	sync  	blr -#ifndef CONFIG_NAND_SPL +#ifndef MINIMAL_SPL  .globl unlock_ram_in_cache  unlock_ram_in_cache:  	/* invalidate the INIT_RAM section */ @@ -1111,7 +1118,7 @@ unlock_ram_in_cache:  	sync  	mtspr	HID0, r3		/* no invalidate, unlock */  	blr -#endif /* !CONFIG_NAND_SPL */ +#endif /* !MINIMAL_SPL */  #endif /* CONFIG_SYS_INIT_RAM_LOCK */  #ifdef CONFIG_SYS_FLASHBOOT diff --git a/arch/powerpc/cpu/mpc83xx/u-boot-spl.lds b/arch/powerpc/cpu/mpc83xx/u-boot-spl.lds new file mode 100644 index 00000000000..d140453d497 --- /dev/null +++ b/arch/powerpc/cpu/mpc83xx/u-boot-spl.lds @@ -0,0 +1,55 @@ +/* + * (C) Copyright 2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * Copyright 2008 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 + */ + +OUTPUT_ARCH(powerpc) +SECTIONS +{ +	. = 0xfff00000; +	.text : { +		*(.text*) +		. = ALIGN(16); +		*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) +	} + +	. = ALIGN(8); +	.data : { +		*(.data*) +		*(.sdata*) +		_GOT2_TABLE_ = .; +		KEEP(*(.got2)) +		KEEP(*(.got)) +		PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4); +	} +	__got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1; + +	. = ALIGN(8); +	__bss_start = .; +	.bss (NOLOAD) : { +		*(.*bss) +	} +	__bss_end__ = .; +} +ENTRY(_start) +ASSERT(__bss_end__ <= 0xfff01000, "NAND bootstrap too big"); 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, diff --git a/arch/powerpc/cpu/mpc86xx/cpu.c b/arch/powerpc/cpu/mpc86xx/cpu.c index d2c8c78e864..c553415b555 100644 --- a/arch/powerpc/cpu/mpc86xx/cpu.c +++ b/arch/powerpc/cpu/mpc86xx/cpu.c @@ -67,7 +67,7 @@ checkcpu(void)  	}  	puts("CPU:   "); -	cpu = gd->cpu; +	cpu = gd->arch.cpu;  	puts(cpu->name); diff --git a/arch/powerpc/cpu/mpc86xx/fdt.c b/arch/powerpc/cpu/mpc86xx/fdt.c index 2f955fe9309..26a65c586d5 100644 --- a/arch/powerpc/cpu/mpc86xx/fdt.c +++ b/arch/powerpc/cpu/mpc86xx/fdt.c @@ -34,10 +34,10 @@ void ft_cpu_setup(void *blob, bd_t *bd)  #if defined(CONFIG_MPC8641)  	do_fixup_by_compat_u32(blob, "fsl,mpc8641-localbus", -			       "bus-frequency", gd->lbc_clk, 1); +			       "bus-frequency", gd->arch.lbc_clk, 1);  #endif  	do_fixup_by_compat_u32(blob, "fsl,elbc", -			       "bus-frequency", gd->lbc_clk, 1); +			       "bus-frequency", gd->arch.lbc_clk, 1);  	fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize); diff --git a/arch/powerpc/cpu/mpc86xx/speed.c b/arch/powerpc/cpu/mpc86xx/speed.c index a2d0a8ac6eb..18c1eea0c1a 100644 --- a/arch/powerpc/cpu/mpc86xx/speed.c +++ b/arch/powerpc/cpu/mpc86xx/speed.c @@ -120,7 +120,7 @@ int get_clocks(void)  	get_sys_info(&sys_info);  	gd->cpu_clk = sys_info.freqProcessor;  	gd->bus_clk = sys_info.freqSystemBus; -	gd->lbc_clk = sys_info.freqLocalBus; +	gd->arch.lbc_clk = sys_info.freqLocalBus;  	/*  	 * The base clock for I2C depends on the actual SOC.  Unfortunately, @@ -130,11 +130,11 @@ int get_clocks(void)  	 * AN2919.  	 */  #ifdef CONFIG_MPC8610 -	gd->i2c1_clk = sys_info.freqSystemBus; +	gd->arch.i2c1_clk = sys_info.freqSystemBus;  #else -	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 (gd->cpu_clk != 0)  		return 0; diff --git a/arch/powerpc/cpu/mpc8xx/commproc.c b/arch/powerpc/cpu/mpc8xx/commproc.c index 5fe01fffae2..a3647820967 100644 --- a/arch/powerpc/cpu/mpc8xx/commproc.c +++ b/arch/powerpc/cpu/mpc8xx/commproc.c @@ -31,8 +31,8 @@ DECLARE_GLOBAL_DATA_PTR;  int dpram_init (void)  {  	/* Reclaim the DP memory for our use. */ -	gd->dp_alloc_base = CPM_DATAONLY_BASE; -	gd->dp_alloc_top  = CPM_DATAONLY_BASE + CPM_DATAONLY_SIZE; +	gd->arch.dp_alloc_base = CPM_DATAONLY_BASE; +	gd->arch.dp_alloc_top  = CPM_DATAONLY_BASE + CPM_DATAONLY_SIZE;  	return (0);  } @@ -43,19 +43,19 @@ int dpram_init (void)   */  uint dpram_alloc (uint size)  { -	uint addr = gd->dp_alloc_base; +	uint addr = gd->arch.dp_alloc_base; -	if ((gd->dp_alloc_base + size) >= gd->dp_alloc_top) +	if ((gd->arch.dp_alloc_base + size) >= gd->arch.dp_alloc_top)  		return (CPM_DP_NOSPACE); -	gd->dp_alloc_base += size; +	gd->arch.dp_alloc_base += size;  	return addr;  }  uint dpram_base (void)  { -	return gd->dp_alloc_base; +	return gd->arch.dp_alloc_base;  }  /* Allocate some memory from the dual ported ram.  We may want to @@ -66,12 +66,12 @@ uint dpram_alloc_align (uint size, uint align)  {  	uint addr, mask = align - 1; -	addr = (gd->dp_alloc_base + mask) & ~mask; +	addr = (gd->arch.dp_alloc_base + mask) & ~mask; -	if ((addr + size) >= gd->dp_alloc_top) +	if ((addr + size) >= gd->arch.dp_alloc_top)  		return (CPM_DP_NOSPACE); -	gd->dp_alloc_base = addr + size; +	gd->arch.dp_alloc_base = addr + size;  	return addr;  } @@ -80,6 +80,6 @@ uint dpram_base_align (uint align)  {  	uint mask = align - 1; -	return (gd->dp_alloc_base + mask) & ~mask; +	return (gd->arch.dp_alloc_base + mask) & ~mask;  }  #endif	/* CONFIG_SYS_ALLOC_DPRAM */ diff --git a/arch/powerpc/cpu/mpc8xx/cpu.c b/arch/powerpc/cpu/mpc8xx/cpu.c index b3fcfe5626a..b6b733d77fd 100644 --- a/arch/powerpc/cpu/mpc8xx/cpu.c +++ b/arch/powerpc/cpu/mpc8xx/cpu.c @@ -45,7 +45,6 @@  #if defined(CONFIG_OF_LIBFDT)  #include <libfdt.h> -#include <libfdt_env.h>  #include <fdt_support.h>  #endif diff --git a/arch/powerpc/cpu/mpc8xx/fdt.c b/arch/powerpc/cpu/mpc8xx/fdt.c index 7130983ff22..7edd7e4204e 100644 --- a/arch/powerpc/cpu/mpc8xx/fdt.c +++ b/arch/powerpc/cpu/mpc8xx/fdt.c @@ -37,7 +37,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)  	do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,  		"clock-frequency", bd->bi_intfreq, 1);  	do_fixup_by_compat_u32(blob, "fsl,cpm-brg", "clock-frequency", -		gd->brg_clk, 1); +		gd->arch.brg_clk, 1);  	/* Fixup ethernet MAC addresses */  	fdt_fixup_ethernet(blob); diff --git a/arch/powerpc/cpu/mpc8xx/speed.c b/arch/powerpc/cpu/mpc8xx/speed.c index 6e13e5de028..091b49f24a9 100644 --- a/arch/powerpc/cpu/mpc8xx/speed.c +++ b/arch/powerpc/cpu/mpc8xx/speed.c @@ -192,7 +192,7 @@ void get_brgclk(uint sccr)  			divider = 64;  			break;  	} -	gd->brg_clk = gd->cpu_clk/divider; +	gd->arch.brg_clk = gd->cpu_clk/divider;  }  #if !defined(CONFIG_8xx_CPUCLK_DEFAULT) diff --git a/arch/powerpc/cpu/mpc8xxx/cpu.c b/arch/powerpc/cpu/mpc8xxx/cpu.c index e8613be3931..39525fb29d5 100644 --- a/arch/powerpc/cpu/mpc8xxx/cpu.c +++ b/arch/powerpc/cpu/mpc8xxx/cpu.c @@ -86,6 +86,8 @@ static struct cpu_type cpu_type_list[] = {  	CPU_TYPE_ENTRY(B4220, B4220, 0),  	CPU_TYPE_ENTRY(BSC9130, 9130, 1),  	CPU_TYPE_ENTRY(BSC9131, 9131, 1), +	CPU_TYPE_ENTRY(BSC9132, 9132, 2), +	CPU_TYPE_ENTRY(BSC9232, 9232, 2),  #elif defined(CONFIG_MPC86xx)  	CPU_TYPE_ENTRY(8610, 8610, 1),  	CPU_TYPE_ENTRY(8641, 8641, 2), @@ -146,7 +148,7 @@ struct cpu_type *identify_cpu(u32 ver)  u32 cpu_mask(void)  {  	ccsr_pic_t __iomem *pic = (void *)CONFIG_SYS_MPC8xxx_PIC_ADDR; -	struct cpu_type *cpu = gd->cpu; +	struct cpu_type *cpu = gd->arch.cpu;  	/* better to query feature reporting register than just assume 1 */  	if (cpu == &cpu_type_unknown) @@ -164,7 +166,7 @@ u32 cpu_mask(void)   */  int cpu_numcores(void)  { -	struct cpu_type *cpu = gd->cpu; +	struct cpu_type *cpu = gd->arch.cpu;  	/*  	 * Report # of cores in terms of the cpu_mask if we haven't @@ -194,7 +196,7 @@ int probecpu (void)  	svr = get_svr();  	ver = SVR_SOC_VER(svr); -	gd->cpu = identify_cpu(ver); +	gd->arch.cpu = identify_cpu(ver);  	return 0;  } @@ -202,7 +204,7 @@ int probecpu (void)  /* Once in memory, compute mask & # cores once and save them off */  int fixup_cpu(void)  { -	struct cpu_type *cpu = gd->cpu; +	struct cpu_type *cpu = gd->arch.cpu;  	if (cpu->num_cores == 0) {  		cpu->mask = cpu_mask(); diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c index 8016bcdc22e..26c42f70390 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c @@ -1190,7 +1190,11 @@ static void set_ddr_data_init(fsl_ddr_cfg_regs_t *ddr)  {  	unsigned int init_value;	/* Initialization value */ +#ifdef CONFIG_MEM_INIT_VALUE +	init_value = CONFIG_MEM_INIT_VALUE; +#else  	init_value = 0xDEADBEEF; +#endif  	ddr->ddr_data_init = init_value;  } diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h b/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h index c8b0f916763..4dd55fc4c3f 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h +++ b/arch/powerpc/cpu/mpc8xxx/ddr/ddr.h @@ -86,7 +86,8 @@ void fsl_ddr_set_lawbar(  		unsigned int memctl_interleaved,  		unsigned int ctrl_num); -unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo); +int fsl_ddr_interactive_env_var_exists(void); +unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set);  void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,  			   unsigned int ctrl_num); diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c b/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c index cb71f94ba1e..46257c9529e 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/interactive.c @@ -1369,14 +1369,15 @@ struct data_strings {  #define DATA_OPTIONS(name, step, dimm) {#name, step, dimm} -unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo) -{ -	unsigned long long ddrsize; -	const char *prompt = "FSL DDR>"; -	char buffer[CONFIG_SYS_CBSIZE]; -	char *argv[CONFIG_SYS_MAXARGS + 1];	/* NULL terminated */ -	int argc; -	unsigned int next_step = STEP_GET_SPD; +static unsigned int fsl_ddr_parse_interactive_cmd( +	char **argv, +	int argc, +	unsigned int *pstep_mask, +	unsigned int *pctlr_mask, +	unsigned int *pdimm_mask, +	unsigned int *pdimm_number_required +	 ) { +  	static const struct data_strings options[] = {  		DATA_OPTIONS(spd, STEP_GET_SPD, 1),  		DATA_OPTIONS(dimmparms, STEP_COMPUTE_DIMM_PARMS, 1), @@ -1386,6 +1387,69 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)  		DATA_OPTIONS(regs, STEP_COMPUTE_REGS, 0),  	};  	static const unsigned int n_opts = ARRAY_SIZE(options); + +	unsigned int i, j; +	unsigned int error = 0; + +	for (i = 1; i < argc; i++) { +		unsigned int matched = 0; + +		for (j = 0; j < n_opts; j++) { +			if (strcmp(options[j].data_name, argv[i]) != 0) +				continue; +			*pstep_mask |= options[j].step_mask; +			*pdimm_number_required = +				options[j].dimm_number_required; +			matched = 1; +			break; +		} + +		if (matched) +			continue; + +		if (argv[i][0] == 'c') { +			char c = argv[i][1]; +			if (isdigit(c)) +				*pctlr_mask |= 1 << (c - '0'); +			continue; +		} + +		if (argv[i][0] == 'd') { +			char c = argv[i][1]; +			if (isdigit(c)) +				*pdimm_mask |= 1 << (c - '0'); +			continue; +		} + +		printf("unknown arg %s\n", argv[i]); +		*pstep_mask = 0; +		error = 1; +		break; +	} + +	return error; +} + +int fsl_ddr_interactive_env_var_exists(void) +{ +	char buffer[CONFIG_SYS_CBSIZE]; + +	if (getenv_f("ddr_interactive", buffer, CONFIG_SYS_CBSIZE) >= 0) +		return 1; + +	return 0; +} + +unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set) +{ +	unsigned long long ddrsize; +	const char *prompt = "FSL DDR>"; +	char buffer[CONFIG_SYS_CBSIZE]; +	char buffer2[CONFIG_SYS_CBSIZE]; +	char *p = NULL; +	char *argv[CONFIG_SYS_MAXARGS + 1];	/* NULL terminated */ +	int argc; +	unsigned int next_step = STEP_GET_SPD;  	const char *usage = {  		"commands:\n"  		"print      print SPD and intermediate computed data\n" @@ -1393,21 +1457,45 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)  		"recompute  reload SPD and options to default and recompute regs\n"  		"edit       modify spd, parameter, or option\n"  		"compute    recompute registers from current next_step to end\n" +		"copy       copy parameters\n"  		"next_step  shows current next_step\n"  		"help       this message\n"  		"go         program the memory controller and continue with u-boot\n"  	}; +	if (var_is_set) { +		if (getenv_f("ddr_interactive", buffer2, CONFIG_SYS_CBSIZE) > 0) { +			p = buffer2; +		} else { +			var_is_set = 0; +		} +	} +  	/*  	 * The strategy for next_step is that it points to the next  	 * step in the computation process that needs to be done.  	 */  	while (1) { -		/* -		 * No need to worry for buffer overflow here in -		 * this function;  readline() maxes out at CFG_CBSIZE -		 */ -		readline_into_buffer(prompt, buffer, 0); +		if (var_is_set) { +			char *pend = strchr(p, ';'); +			if (pend) { +				/* found command separator, copy sub-command */ +				*pend = '\0'; +				strcpy(buffer, p); +				p = pend + 1; +			} else { +				/* separator not found, copy whole string */ +				strcpy(buffer, p); +				p = NULL; +				var_is_set = 0; +			} +		} else { +			/* +			 * No need to worry for buffer overflow here in +			 * this function;  readline() maxes out at CFG_CBSIZE +			 */ +			readline_into_buffer(prompt, buffer, 0); +		}  		argc = parse_line(buffer, argv);  		if (argc == 0)  			continue; @@ -1425,64 +1513,160 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)  			continue;  		} -		if (strcmp(argv[0], "edit") == 0) { -			unsigned int i, j; +		if (strcmp(argv[0], "copy") == 0) {  			unsigned int error = 0;  			unsigned int step_mask = 0; -			unsigned int ctlr_mask = 0; -			unsigned int dimm_mask = 0; -			char *p_element = NULL; -			char *p_value = NULL; +			unsigned int src_ctlr_mask = 0; +			unsigned int src_dimm_mask = 0;  			unsigned int dimm_number_required = 0; -			unsigned int ctrl_num; -			unsigned int dimm_num; -			unsigned int matched = 0; +			unsigned int src_ctlr_num = 0; +			unsigned int src_dimm_num = 0; +			unsigned int dst_ctlr_num = -1; +			unsigned int dst_dimm_num = -1; +			unsigned int i, num_dest_parms;  			if (argc == 1) { -				/* Only the element and value must be last */ -				printf("edit <c#> <d#> " -					"<spd|dimmparms|commonparms|opts|" -					"addresses|regs> <element> <value>\n"); -				printf("for spd, specify byte number for " -					"element\n"); +				printf("copy <src c#> <src d#> <spd|dimmparms|commonparms|opts|addresses|regs> <dst c#> <dst d#>\n");  				continue;  			} -			for (i = 1; i < argc - 2; i++) { -				for (j = 0; j < n_opts; j++) { -					if (strcmp(options[j].data_name, -						argv[i]) != 0) -						continue; -					step_mask |= options[j].step_mask; -					dimm_number_required = -						options[j].dimm_number_required; -					matched = 1; -					break; +			error = fsl_ddr_parse_interactive_cmd( +				argv, argc, +				&step_mask, +				&src_ctlr_mask, +				&src_dimm_mask, +				&dimm_number_required +			); + +			/* XXX: only dimm_number_required and step_mask will +			   be used by this function.  Parse the controller and +			   DIMM number separately because it is easier.  */ + +			if (error) +				continue; + +			/* parse source destination controller / DIMM */ + +			num_dest_parms = dimm_number_required ? 2 : 1; + +			for (i = 0; i < argc; i++) { +				if (argv[i][0] == 'c') { +					char c = argv[i][1]; +					if (isdigit(c)) { +						src_ctlr_num = (c - '0'); +						break; +					}  				} +			} -				if (matched) -					continue; +			for (i = 0; i < argc; i++) { +				if (argv[i][0] == 'd') { +					char c = argv[i][1]; +					if (isdigit(c)) { +						src_dimm_num = (c - '0'); +						break; +					} +				} +			} + +			/* parse destination controller / DIMM */ +			for (i = argc - 1; i >= argc - num_dest_parms; i--) {  				if (argv[i][0] == 'c') {  					char c = argv[i][1]; -					if (isdigit(c)) -						ctlr_mask |= 1 << (c - '0'); -					continue; +					if (isdigit(c)) { +						dst_ctlr_num = (c - '0'); +						break; +					}  				} +			} +			for (i = argc - 1; i >= argc - num_dest_parms; i--) {  				if (argv[i][0] == 'd') {  					char c = argv[i][1]; -					if (isdigit(c)) -						dimm_mask |= 1 << (c - '0'); -					continue; +					if (isdigit(c)) { +						dst_dimm_num = (c - '0'); +						break; +					}  				} +			} + +			/* TODO: validate inputs */ + +			debug("src_ctlr_num = %u, src_dimm_num = %u, dst_ctlr_num = %u, dst_dimm_num = %u, step_mask = %x\n", +				src_ctlr_num, src_dimm_num, dst_ctlr_num, dst_dimm_num, step_mask); -				printf("unknown arg %s\n", argv[i]); -				step_mask = 0; -				error = 1; + +			switch (step_mask) { + +			case STEP_GET_SPD: +				memcpy(&(pinfo->spd_installed_dimms[dst_ctlr_num][dst_dimm_num]), +					&(pinfo->spd_installed_dimms[src_ctlr_num][src_dimm_num]), +					sizeof(pinfo->spd_installed_dimms[0][0]));  				break; + +			case STEP_COMPUTE_DIMM_PARMS: +				memcpy(&(pinfo->dimm_params[dst_ctlr_num][dst_dimm_num]), +					&(pinfo->dimm_params[src_ctlr_num][src_dimm_num]), +					sizeof(pinfo->dimm_params[0][0])); +				break; + +			case STEP_COMPUTE_COMMON_PARMS: +				memcpy(&(pinfo->common_timing_params[dst_ctlr_num]), +					&(pinfo->common_timing_params[src_ctlr_num]), +					sizeof(pinfo->common_timing_params[0])); +				break; + +			case STEP_GATHER_OPTS: +				memcpy(&(pinfo->memctl_opts[dst_ctlr_num]), +					&(pinfo->memctl_opts[src_ctlr_num]), +					sizeof(pinfo->memctl_opts[0])); +				break; + +			/* someday be able to have addresses to copy addresses... */ + +			case STEP_COMPUTE_REGS: +				memcpy(&(pinfo->fsl_ddr_config_reg[dst_ctlr_num]), +					&(pinfo->fsl_ddr_config_reg[src_ctlr_num]), +					sizeof(pinfo->memctl_opts[0])); +				break; + +			default: +				printf("unexpected step_mask value\n"); +			} + +			continue; + +		} + +		if (strcmp(argv[0], "edit") == 0) { +			unsigned int error = 0; +			unsigned int step_mask = 0; +			unsigned int ctlr_mask = 0; +			unsigned int dimm_mask = 0; +			char *p_element = NULL; +			char *p_value = NULL; +			unsigned int dimm_number_required = 0; +			unsigned int ctrl_num; +			unsigned int dimm_num; + +			if (argc == 1) { +				/* Only the element and value must be last */ +				printf("edit <c#> <d#> " +					"<spd|dimmparms|commonparms|opts|" +					"addresses|regs> <element> <value>\n"); +				printf("for spd, specify byte number for " +					"element\n"); +				continue;  			} +			error = fsl_ddr_parse_interactive_cmd( +				argv, argc - 2, +				&step_mask, +				&ctlr_mask, +				&dimm_mask, +				&dimm_number_required +			);  			if (error)  				continue; @@ -1629,12 +1813,11 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)  		}  		if (strcmp(argv[0], "print") == 0) { -			unsigned int i, j;  			unsigned int error = 0;  			unsigned int step_mask = 0;  			unsigned int ctlr_mask = 0;  			unsigned int dimm_mask = 0; -			unsigned int matched = 0; +			unsigned int dimm_number_required = 0;  			if (argc == 1) {  				printf("print [c<n>] [d<n>] [spd] [dimmparms] " @@ -1642,38 +1825,13 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)  				continue;  			} -			for (i = 1; i < argc; i++) { -				for (j = 0; j < n_opts; j++) { -					if (strcmp(options[j].data_name, -						argv[i]) != 0) -						continue; -					step_mask |= options[j].step_mask; -					matched = 1; -					break; -				} - -				if (matched) -					continue; - -				if (argv[i][0] == 'c') { -					char c = argv[i][1]; -					if (isdigit(c)) -						ctlr_mask |= 1 << (c - '0'); -					continue; -				} - -				if (argv[i][0] == 'd') { -					char c = argv[i][1]; -					if (isdigit(c)) -						dimm_mask |= 1 << (c - '0'); -					continue; -				} - -				printf("unknown arg %s\n", argv[i]); -				step_mask = 0; -				error = 1; -				break; -			} +			error = fsl_ddr_parse_interactive_cmd( +				argv, argc, +				&step_mask, +				&ctlr_mask, +				&dimm_mask, +				&dimm_number_required +			);  			if (error)  				continue; diff --git a/arch/powerpc/cpu/mpc8xxx/ddr/main.c b/arch/powerpc/cpu/mpc8xxx/ddr/main.c index d6b73c7af16..5311a262a29 100644 --- a/arch/powerpc/cpu/mpc8xxx/ddr/main.c +++ b/arch/powerpc/cpu/mpc8xxx/ddr/main.c @@ -532,9 +532,11 @@ phys_size_t fsl_ddr_sdram(void)  	/* Compute it once normally. */  #ifdef CONFIG_FSL_DDR_INTERACTIVE -	if (getenv("ddr_interactive")) -		total_memory = fsl_ddr_interactive(&info); -	else +	if (tstc() && (getc() == 'd')) {	/* we got a key press of 'd' */ +		total_memory = fsl_ddr_interactive(&info, 0); +	} else if (fsl_ddr_interactive_env_var_exists()) { +		total_memory = fsl_ddr_interactive(&info, 1); +	} else  #endif  		total_memory = fsl_ddr_compute(&info, STEP_GET_SPD, 0); diff --git a/arch/powerpc/cpu/mpc8xxx/fdt.c b/arch/powerpc/cpu/mpc8xxx/fdt.c index 1986fea030a..284709428d9 100644 --- a/arch/powerpc/cpu/mpc8xxx/fdt.c +++ b/arch/powerpc/cpu/mpc8xxx/fdt.c @@ -297,10 +297,86 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev)  		       fdt_strerror(err));  }  #elif CONFIG_SYS_FSL_SEC_COMPAT >= 4  /* SEC4 */ +static u8 caam_get_era(void) +{ +	static const struct { +		u16 ip_id; +		u8 maj_rev; +		u8 era; +	} caam_eras[] = { +		{0x0A10, 1, 1}, +		{0x0A10, 2, 2}, +		{0x0A12, 1, 3}, +		{0x0A14, 1, 3}, +		{0x0A14, 2, 4}, +		{0x0A16, 1, 4}, +		{0x0A10, 3, 4}, +		{0x0A11, 1, 4}, +		{0x0A18, 1, 4}, +		{0x0A11, 2, 5}, +		{0x0A12, 2, 5}, +		{0x0A13, 1, 5}, +		{0x0A1C, 1, 5} +	}; + +	ccsr_sec_t __iomem *sec = (void __iomem *)CONFIG_SYS_FSL_SEC_ADDR; +	u32 secvid_ms = in_be32(&sec->secvid_ms); +	u32 ccbvid = in_be32(&sec->ccbvid); +	u16 ip_id = (secvid_ms & SEC_SECVID_MS_IPID_MASK) >> +				SEC_SECVID_MS_IPID_SHIFT; +	u8 maj_rev = (secvid_ms & SEC_SECVID_MS_MAJ_REV_MASK) >> +				SEC_SECVID_MS_MAJ_REV_SHIFT; +	u8 era = (ccbvid & SEC_CCBVID_ERA_MASK) >> SEC_CCBVID_ERA_SHIFT; + +	int i; + +	if (era)	/* This is '0' prior to CAAM ERA-6 */ +		return era; + +	for (i = 0; i < ARRAY_SIZE(caam_eras); i++) +		if (caam_eras[i].ip_id == ip_id && +		    caam_eras[i].maj_rev == maj_rev) +			return caam_eras[i].era; + +	return 0; +} + +static void fdt_fixup_crypto_era(void *blob, u32 era) +{ +	int err; +	int crypto_node; + +	crypto_node = fdt_path_offset(blob, "crypto"); +	if (crypto_node < 0) { +		printf("WARNING: Missing crypto node\n"); +		return; +	} + +	err = fdt_setprop(blob, crypto_node, "fsl,sec-era", &era, +			  sizeof(era)); +	if (err < 0) { +		printf("ERROR: could not set fsl,sec-era property: %s\n", +		       fdt_strerror(err)); +	} +} +  void fdt_fixup_crypto_node(void *blob, int sec_rev)  { -	if (!sec_rev) +	u8 era; + +	if (!sec_rev) {  		fdt_del_node_and_alias(blob, "crypto"); +		return; +	} + +	/* Add SEC ERA information in compatible */ +	era = caam_get_era(); +	if (era) { +		fdt_fixup_crypto_era(blob, era); +	} else { +		printf("WARNING: Unable to get ERA for CAAM rev: %d\n", +			sec_rev); +	}  }  #endif diff --git a/arch/powerpc/cpu/mpc8xxx/law.c b/arch/powerpc/cpu/mpc8xxx/law.c index ce1d71e307a..6f9d5683a9c 100644 --- a/arch/powerpc/cpu/mpc8xxx/law.c +++ b/arch/powerpc/cpu/mpc8xxx/law.c @@ -69,7 +69,7 @@ static inline void set_law_base_addr(int idx, phys_addr_t addr)  void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if id)  { -	gd->used_laws |= (1 << idx); +	gd->arch.used_laws |= (1 << idx);  	out_be32(LAWAR_ADDR(idx), 0);  	set_law_base_addr(idx, addr); @@ -81,7 +81,7 @@ void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if id)  void disable_law(u8 idx)  { -	gd->used_laws &= ~(1 << idx); +	gd->arch.used_laws &= ~(1 << idx);  	out_be32(LAWAR_ADDR(idx), 0);  	set_law_base_addr(idx, 0); @@ -112,7 +112,7 @@ static int get_law_entry(u8 i, struct law_entry *e)  int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id)  { -	u32 idx = ffz(gd->used_laws); +	u32 idx = ffz(gd->arch.used_laws);  	if (idx >= FSL_HW_NUM_LAWS)  		return -1; @@ -128,11 +128,11 @@ int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id)  	u32 idx;  	/* we have no LAWs free */ -	if (gd->used_laws == -1) +	if (gd->arch.used_laws == -1)  		return -1;  	/* grab the last free law */ -	idx = __ilog2(~(gd->used_laws)); +	idx = __ilog2(~(gd->arch.used_laws));  	if (idx >= FSL_HW_NUM_LAWS)  		return -1; @@ -240,9 +240,9 @@ void init_laws(void)  	int i;  #if FSL_HW_NUM_LAWS < 32 -	gd->used_laws = ~((1 << FSL_HW_NUM_LAWS) - 1); +	gd->arch.used_laws = ~((1 << FSL_HW_NUM_LAWS) - 1);  #elif FSL_HW_NUM_LAWS == 32 -	gd->used_laws = 0; +	gd->arch.used_laws = 0;  #else  #error FSL_HW_NUM_LAWS can not be greater than 32 w/o code changes  #endif @@ -255,7 +255,7 @@ void init_laws(void)  		u32 lawar = in_be32(LAWAR_ADDR(i));  		if (lawar & LAW_EN) -			gd->used_laws |= (1 << i); +			gd->arch.used_laws |= (1 << i);  	}  #if (defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)) || \ diff --git a/arch/powerpc/cpu/ppc4xx/4xx_uart.c b/arch/powerpc/cpu/ppc4xx/4xx_uart.c index 38ba60bb0d6..2ab185f0fd9 100644 --- a/arch/powerpc/cpu/ppc4xx/4xx_uart.c +++ b/arch/powerpc/cpu/ppc4xx/4xx_uart.c @@ -296,10 +296,10 @@ int get_serial_clock(void)  	 * the UART divisor is available  	 */  #ifdef CONFIG_SYS_EXT_SERIAL_CLOCK -	gd->uart_clk = CONFIG_SYS_EXT_SERIAL_CLOCK; +	gd->arch.uart_clk = CONFIG_SYS_EXT_SERIAL_CLOCK;  #else  	get_sys_info(&sys_info); -	gd->uart_clk = sys_info.freqUART / udiv; +	gd->arch.uart_clk = sys_info.freqUART / udiv;  #endif  	return clk; diff --git a/arch/powerpc/cpu/ppc4xx/fdt.c b/arch/powerpc/cpu/ppc4xx/fdt.c index 5ddb8802417..3cdd5319a9b 100644 --- a/arch/powerpc/cpu/ppc4xx/fdt.c +++ b/arch/powerpc/cpu/ppc4xx/fdt.c @@ -29,7 +29,6 @@  #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)  #include <libfdt.h> -#include <libfdt_env.h>  #include <fdt_support.h>  #include <asm/4xx_pcie.h> @@ -141,7 +140,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)  	/*  	 * Fixup all UART clocks for CPU internal UARTs -	 * (only these UARTs are definitely clocked by gd->uart_clk) +	 * (only these UARTs are definitely clocked by gd->arch.uart_clk)  	 *  	 * These UARTs are direct childs of /plb/opb. This code  	 * does not touch any UARTs that are connected to the ebc. @@ -160,7 +159,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)  		    (fdt_node_check_compatible(blob, off, "ns16550") == 0))  			fdt_setprop(blob, off,  				    "clock-frequency", -				    (void*)&(gd->uart_clk), 4); +				    (void *)&gd->arch.uart_clk, 4);  	}  	/* diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index 0b9638bceef..d57c178f7f2 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -493,6 +493,21 @@  #define CONFIG_SYS_FSL_ERRATUM_IFC_A003399  #define CONFIG_SYS_FSL_ERRATUM_ESDHC111 +#elif defined(CONFIG_BSC9132) +#define CONFIG_MAX_CPUS			2 +#define CONFIG_SYS_PPC_E500_DEBUG_TLB	3 +#define CONFIG_FSL_SDHC_V2_3 +#define CONFIG_SYS_FSL_NUM_LAWS		12 +#define CONFIG_TSECV2 +#define CONFIG_SYS_FSL_SEC_COMPAT	4 +#define CONFIG_NUM_DDR_CONTROLLERS	2 +#define CONFIG_SYS_CCSRBAR_DEFAULT	0xff700000 +#define CONFIG_NAND_FSL_IFC +#define CONFIG_SYS_FSL_ERRATUM_IFC_A003399 +#define CONFIG_SYS_FSL_ERRATUM_ESDHC111 +#define CONFIG_SYS_FSL_ESDHC_P1010_BROKEN_SDCLK +#define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.2" +  #elif defined(CONFIG_PPC_T4240)  #define CONFIG_SYS_PPC64		/* 64-bit core */  #define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */ @@ -523,6 +538,28 @@  #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY  #define CONFIG_SYS_FSL_ERRATUM_A004468  #define CONFIG_SYS_FSL_ERRATUM_A_004934 +#define CONFIG_SYS_FSL_ERRATUM_A005871 +#define CONFIG_SYS_CCSRBAR_DEFAULT	0xfe000000 + +#elif defined(CONFIG_PPC_B4420) +#define CONFIG_SYS_PPC64		/* 64-bit core */ +#define CONFIG_FSL_CORENET		/* Freescale CoreNet platform */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS2	/* Freescale Chassis generation 2 */ +#define CONFIG_SYS_FSL_QMAN_V3		/* QMAN version 3 */ +#define CONFIG_MAX_CPUS			2 +#define CONFIG_SYS_FSL_NUM_CC_PLLS	4 +#define CONFIG_SYS_FSL_NUM_LAWS		32 +#define CONFIG_SYS_FSL_SEC_COMPAT	4 +#define CONFIG_SYS_NUM_FMAN		1 +#define CONFIG_SYS_NUM_FM1_DTSEC	4 +#define CONFIG_NUM_DDR_CONTROLLERS	1 +#define CONFIG_SYS_FSL_DDR_VER		FSL_DDR_VER_4_7 +#define CONFIG_SYS_FMAN_V3 +#define CONFIG_SYS_FM_MURAM_SIZE	0x60000 +#define CONFIG_SYS_FSL_TBCLK_DIV	16 +#define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.4" +#define CONFIG_SYS_FSL_USB1_PHY_ENABLE +#define CONFIG_SYS_FSL_ERRATUM_A_004934  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xfe000000  #elif defined(CONFIG_PPC_B4860) @@ -537,7 +574,7 @@  #define CONFIG_SYS_NUM_FMAN		1  #define CONFIG_SYS_NUM_FM1_DTSEC	6  #define CONFIG_SYS_NUM_FM1_10GEC	2 -#define CONFIG_NUM_DDR_CONTROLLERS	1 +#define CONFIG_NUM_DDR_CONTROLLERS	2  #define CONFIG_SYS_FSL_DDR_VER		FSL_DDR_VER_4_7  #define CONFIG_SYS_FMAN_V3  #define CONFIG_SYS_FM_MURAM_SIZE	0x60000 diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h index cb3a80bb2bf..d5db8549cc9 100644 --- a/arch/powerpc/include/asm/global_data.h +++ b/arch/powerpc/include/asm/global_data.h @@ -27,76 +27,61 @@  #include "config.h"  #include "asm/types.h" -/* - * The following data structure is placed in some memory wich is - * available very early after boot (like DPRAM on MPC8xx/MPC82xx, or - * some locked parts of the data cache) to allow for a minimum set of - * global variables during system initialization (until we have set - * up the memory controller so that we can use RAM). - */ - -typedef	struct	global_data { -	bd_t		*bd; -	unsigned long	flags; -	unsigned int	baudrate; -	unsigned long	cpu_clk;	/* CPU clock in Hz! */ -	unsigned long	bus_clk; +/* Architecture-specific global data */ +struct arch_global_data { +#if defined(CONFIG_FSL_ESDHC) +	u32 sdhc_clk; +#endif  #if defined(CONFIG_8xx) -	unsigned long	brg_clk; +	unsigned long brg_clk;  #endif  #if defined(CONFIG_CPM2)  	/* There are many clocks on the MPC8260 - see page 9-5 */ -	unsigned long	vco_out; -	unsigned long	cpm_clk; -	unsigned long	scc_clk; -	unsigned long	brg_clk; -#ifdef CONFIG_PCI -	unsigned long	pci_clk; -#endif +	unsigned long vco_out; +	unsigned long cpm_clk; +	unsigned long scc_clk; +	unsigned long brg_clk;  #endif -	unsigned long   mem_clk; +	/* TODO: sjg@chromium.org: Should these be unslgned long? */  #if defined(CONFIG_MPC83xx)  	/* There are other clocks in the MPC83XX */  	u32 csb_clk; -#if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \ +# if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)  	u32 tsec1_clk;  	u32 tsec2_clk;  	u32 usbdr_clk; -#elif defined(CONFIG_MPC8309) +# elif defined(CONFIG_MPC8309)  	u32 usbdr_clk; -#endif -#if defined (CONFIG_MPC834x) +# endif +# if defined(CONFIG_MPC834x)  	u32 usbmph_clk; -#endif /* CONFIG_MPC834x */ -#if defined(CONFIG_MPC8315) +# endif /* CONFIG_MPC834x */ +# if defined(CONFIG_MPC8315)  	u32 tdm_clk; -#endif +# endif  	u32 core_clk;  	u32 enc_clk;  	u32 lbiu_clk;  	u32 lclk_clk; -	u32 pci_clk; -#if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \ +# if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \  	defined(CONFIG_MPC837x)  	u32 pciexp1_clk;  	u32 pciexp2_clk; -#endif -#if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315) +# endif +# if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315)  	u32 sata_clk; -#endif -#if defined(CONFIG_MPC8360) -	u32  mem_sec_clk; -#endif /* CONFIG_MPC8360 */ -#endif -#if defined(CONFIG_FSL_ESDHC) -	u32 sdhc_clk; +# endif +# if defined(CONFIG_MPC8360) +	u32 mem_sec_clk; +# endif /* CONFIG_MPC8360 */  #endif  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)  	u32 lbc_clk;  	void *cpu;  #endif /* CONFIG_MPC85xx || CONFIG_MPC86xx */ -#if defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) +#if defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || \ +		defined(CONFIG_MPC86xx)  	u32 i2c1_clk;  	u32 i2c2_clk;  #endif @@ -113,68 +98,32 @@ typedef	struct	global_data {  	u32 used_tlb_cams[(CONFIG_SYS_NUM_TLBCAMS+31)/32];  #endif  #if defined(CONFIG_MPC5xxx) -	unsigned long	ipb_clk; -	unsigned long	pci_clk; +	unsigned long ipb_clk;  #endif  #if defined(CONFIG_MPC512X)  	u32 ips_clk;  	u32 csb_clk; -	u32 pci_clk;  #endif /* CONFIG_MPC512X */  #if defined(CONFIG_MPC8220) -	unsigned long   bExtUart; -	unsigned long   inp_clk; -	unsigned long   pci_clk; -	unsigned long   vco_clk; -	unsigned long   pev_clk; -	unsigned long   flb_clk; -#endif -	phys_size_t	ram_size;	/* RAM size */ -	unsigned long	reset_status;	/* reset status register at boot	*/ -#if defined(CONFIG_MPC83xx) -	unsigned long	arbiter_event_attributes; -	unsigned long	arbiter_event_address; +	unsigned long inp_clk; +	unsigned long vco_clk; +	unsigned long pev_clk; +	unsigned long flb_clk;  #endif -	unsigned long	env_addr;	/* Address  of Environment struct	*/ -	unsigned long	env_valid;	/* Checksum of Environment valid?	*/ -	unsigned long	have_console;	/* serial_init() was called		*/ -#ifdef CONFIG_PRE_CONSOLE_BUFFER -	unsigned long	precon_buf_idx;	/* Pre-Console buffer index */ +	unsigned long reset_status;	/* reset status register at boot */ +#if defined(CONFIG_MPC83xx) +	unsigned long arbiter_event_attributes; +	unsigned long arbiter_event_address;  #endif  #if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2) -	unsigned int	dp_alloc_base; -	unsigned int	dp_alloc_top; +	unsigned int dp_alloc_base; +	unsigned int dp_alloc_top;  #endif  #if defined(CONFIG_4xx) -	u32  uart_clk; +	u32 uart_clk;  #endif /* CONFIG_4xx */  #if defined(CONFIG_SYS_GT_6426x) -	unsigned int	mirror_hack[16]; -#endif -#if defined(CONFIG_A3000)	|| \ -    defined(CONFIG_HIDDEN_DRAGON)  || \ -    defined(CONFIG_MUSENKI)	||  \ -    defined(CONFIG_SANDPOINT) -	void *		console_addr; -#endif -	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */ -#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) -	unsigned long	fb_base;	/* Base address of framebuffer memory	*/ -#endif -#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER) -	unsigned long	post_log_word;  /* Record POST activities */ -	unsigned long	post_log_res; /* success of POST test */ -	unsigned long	post_init_f_time;  /* When post_init_f started */ -#endif -#ifdef CONFIG_BOARD_TYPES -	unsigned long	board_type; -#endif -#ifdef CONFIG_MODEM_SUPPORT -	unsigned long do_mdm_init; -	unsigned long be_quiet; -#endif -#if defined(CONFIG_LWMON) || defined(CONFIG_LWMON5) -	unsigned long kbd_status; +	unsigned int mirror_hack[16];  #endif  #ifdef CONFIG_SYS_FPGA_COUNT  	unsigned fpga_state[CONFIG_SYS_FPGA_COUNT]; @@ -182,11 +131,12 @@ typedef	struct	global_data {  #if defined(CONFIG_WD_MAX_RATE)  	unsigned long long wdt_last;	/* trace watch-dog triggering rate */  #endif -	void		**jt;		/* jump table */ -	char		env_buf[32];	/* buffer for getenv() before reloc. */ -} gd_t; +#if defined(CONFIG_LWMON) || defined(CONFIG_LWMON5) +	unsigned long kbd_status; +#endif +}; -#include <asm-generic/global_data_flags.h> +#include <asm-generic/global_data.h>  #if 1  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2") diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h index 296b5497798..4eb3f792303 100644 --- a/arch/powerpc/include/asm/immap_85xx.h +++ b/arch/powerpc/include/asm/immap_85xx.h @@ -1840,7 +1840,7 @@ typedef struct ccsr_gur {  #define FSL_CORENET2_RCWSR4_SRDS3_PRTCL_SHIFT	11  #define FSL_CORENET2_RCWSR4_SRDS4_PRTCL		0x000000f8  #define FSL_CORENET2_RCWSR4_SRDS4_PRTCL_SHIFT	3 -#elif defined(CONFIG_PPC_B4860) +#elif defined(CONFIG_PPC_B4860) || defined(CONFIG_PPC_B4420)  #define FSL_CORENET2_RCWSR4_SRDS1_PRTCL	0xfe000000  #define FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT	25  #define FSL_CORENET2_RCWSR4_SRDS2_PRTCL	0x00ff0000 @@ -2150,7 +2150,7 @@ typedef struct ccsr_gur {  #define MPC85xx_PORPLLSR_DDR_RATIO	0x3e000000  #define MPC85xx_PORPLLSR_DDR_RATIO_SHIFT	25  #else -#ifdef CONFIG_BSC9131 +#if defined(CONFIG_BSC9131) || defined(CONFIG_BSC9132)  #define MPC85xx_PORPLLSR_DDR_RATIO	0x00003f00  #else  #define MPC85xx_PORPLLSR_DDR_RATIO	0x00003e00 @@ -2164,6 +2164,11 @@ typedef struct ccsr_gur {  	u32	porbmsr;	/* POR boot mode status */  #define MPC85xx_PORBMSR_HA		0x00070000  #define MPC85xx_PORBMSR_HA_SHIFT	16 +#define MPC85XX_PORBMSR_ROMLOC_SHIFT	24 +#define PORBMSR_ROMLOC_SPI	0x6 +#define PORBMSR_ROMLOC_SDHC	0x7 +#define PORBMSR_ROMLOC_NAND_2K	0x9 +#define PORBMSR_ROMLOC_NOR	0xf  	u32	porimpscr;	/* POR I/O impedance status & control */  	u32	pordevsr;	/* POR I/O device status regsiter */  #if defined(CONFIG_P1017) || defined(CONFIG_P1023) @@ -2188,6 +2193,9 @@ typedef struct ccsr_gur {  #if defined(CONFIG_P1010)  #define MPC85xx_PORDEVSR_IO_SEL		0x00600000  #define MPC85xx_PORDEVSR_IO_SEL_SHIFT	21 +#elif defined(CONFIG_BSC9132) +#define MPC85xx_PORDEVSR_IO_SEL		0x00FE0000 +#define MPC85xx_PORDEVSR_IO_SEL_SHIFT	17  #else  #define MPC85xx_PORDEVSR_IO_SEL		0x00780000  #define MPC85xx_PORDEVSR_IO_SEL_SHIFT	19 @@ -2345,6 +2353,10 @@ typedef struct ccsr_gur {  #define MPC85xx_PMUXCR_SPI1_CS3_dbg_adi2_rxen	0x00000002  #define MPC85xx_PMUXCR_SPI1_CS3_GPO76		0x00000003  #endif +#ifdef CONFIG_BSC9132 +#define MPC85xx_PMUXCR0_SIM_SEL_MASK	0x0003b000 +#define MPC85xx_PMUXCR0_SIM_SEL		0x00014000 +#endif  	u32	pmuxcr2;	/* Alt. function signal multiplex control 2 */  #if defined(CONFIG_P1010) || defined(CONFIG_P1014)  #define MPC85xx_PMUXCR2_UART_GPIO		0x40000000 @@ -2375,6 +2387,7 @@ typedef struct ccsr_gur {  #define MPC85xx_PMUXCR2_ETSECUSB_MASK	0x001f8000  #define MPC85xx_PMUXCR2_USB		0x00150000  #endif +#if defined(CONFIG_BSC9131) || defined(CONFIG_BSC9132)  #if defined(CONFIG_BSC9131)  #define MPC85xx_PMUXCR2_UART_CTS_B0_SIM_PD		0X40000000  #define MPC85xx_PMUXCR2_UART_CTS_B0_DSP_TMS		0X80000000 @@ -2418,8 +2431,9 @@ typedef struct ccsr_gur {  #define MPC85xx_PMUXCR2_ANT3_AGC_GPO53			0x00000004  #define MPC85xx_PMUXCR2_ANT3_DO_TDM			0x00000001  #define MPC85xx_PMUXCR2_ANT3_DO_GPIO46_49		0x00000002 +#endif  	u32	pmuxcr3; - +#if defined(CONFIG_BSC9131)  #define MPC85xx_PMUXCR3_ANT3_DO4_5_TDM			0x40000000  #define MPC85xx_PMUXCR3_ANT3_DO4_5_GPIO_50_51		0x80000000  #define MPC85xx_PMUXCR3_ANT3_DO6_7_TRIG_IN_SRESET_B	0x10000000 @@ -2434,6 +2448,13 @@ typedef struct ccsr_gur {  #define MPC85xx_PMUXCR3_SPI2_CS3_GPO94			0x00040000  #define MPC85xx_PMUXCR3_ANT2_AGC_RSVD			0x00010000  #define MPC85xx_PMUXCR3_ANT2_GPO89			0x00030000 +#endif +#ifdef CONFIG_BSC9132 +#define MPC85xx_PMUXCR3_USB_SEL_MASK	0x0000ff00 +#define MPC85xx_PMUXCR3_UART2_SEL	0x00005000 +#define MPC85xx_PMUXCR3_UART3_SEL_MASK	0xc0000000 +#define MPC85xx_PMUXCR3_UART3_SEL	0x40000000 +#endif  	u32 pmuxcr4;  #else  	u8	res6[8]; @@ -2727,6 +2748,12 @@ typedef struct ccsr_sec {  #define SEC_CHANUM_MS_JRNUM_SHIFT	28  #define SEC_CHANUM_MS_DECONUM_MASK	0x0f000000  #define SEC_CHANUM_MS_DECONUM_SHIFT	24 +#define SEC_SECVID_MS_IPID_MASK	0xffff0000 +#define SEC_SECVID_MS_IPID_SHIFT	16 +#define SEC_SECVID_MS_MAJ_REV_MASK	0x0000ff00 +#define SEC_SECVID_MS_MAJ_REV_SHIFT	8 +#define SEC_CCBVID_ERA_MASK		0xff000000 +#define SEC_CCBVID_ERA_SHIFT		24  #endif  typedef struct ccsr_qman { @@ -2962,6 +2989,7 @@ struct ccsr_pman {  #endif  #define CONFIG_SYS_MDIO1_OFFSET			0x24000  #define CONFIG_SYS_MPC85xx_ESDHC_OFFSET		0x2e000 +#define CONFIG_SYS_FSL_SEC_OFFSET		0x30000  #define CONFIG_SYS_MPC85xx_SERDES2_OFFSET	0xE3100  #define CONFIG_SYS_MPC85xx_SERDES1_OFFSET	0xE3000  #define CONFIG_SYS_SNVS_OFFSET			0xE6000 diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index 2e0e292da05..b700a3a0bec 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h @@ -401,8 +401,8 @@ extern void print_bats(void);  #define MAS1_IPROT	0x40000000  #define MAS1_TID(x)	(((x) << 16) & 0x3FFF0000)  #define MAS1_TS		0x00001000 -#define MAS1_TSIZE(x)	(((x) << 8) & 0x00000F00) -#define TSIZE_TO_BYTES(x) (1ULL << (((x) * 2) + 10)) +#define MAS1_TSIZE(x)	(((x) << 7) & 0x00000F80) +#define TSIZE_TO_BYTES(x) (1ULL << ((x) + 10))  #define MAS2_EPN	0xFFFFF000  #define MAS2_X0		0x00000040 @@ -458,22 +458,38 @@ extern void print_bats(void);  #define FSL_BOOKE_MAS7(rpn) \  		(((u64)(rpn)) >> 32) -#define BOOKE_PAGESZ_1K         0 -#define BOOKE_PAGESZ_4K         1 -#define BOOKE_PAGESZ_16K        2 -#define BOOKE_PAGESZ_64K        3 -#define BOOKE_PAGESZ_256K       4 -#define BOOKE_PAGESZ_1M         5 -#define BOOKE_PAGESZ_4M         6 -#define BOOKE_PAGESZ_16M        7 -#define BOOKE_PAGESZ_64M        8 -#define BOOKE_PAGESZ_256M       9 -#define BOOKE_PAGESZ_1G		10 -#define BOOKE_PAGESZ_4G		11 -#define BOOKE_PAGESZ_16GB	12 -#define BOOKE_PAGESZ_64GB	13 -#define BOOKE_PAGESZ_256GB	14 -#define BOOKE_PAGESZ_1TB	15 +#define BOOKE_PAGESZ_1K		0 +#define BOOKE_PAGESZ_2K		1 +#define BOOKE_PAGESZ_4K		2 +#define BOOKE_PAGESZ_8K		3 +#define BOOKE_PAGESZ_16K	4 +#define BOOKE_PAGESZ_32K	5 +#define BOOKE_PAGESZ_64K	6 +#define BOOKE_PAGESZ_128K	7 +#define BOOKE_PAGESZ_256K	8 +#define BOOKE_PAGESZ_512K	9 +#define BOOKE_PAGESZ_1M		10 +#define BOOKE_PAGESZ_2M		11 +#define BOOKE_PAGESZ_4M		12 +#define BOOKE_PAGESZ_8M		13 +#define BOOKE_PAGESZ_16M	14 +#define BOOKE_PAGESZ_32M	15 +#define BOOKE_PAGESZ_64M	16 +#define BOOKE_PAGESZ_128M	17 +#define BOOKE_PAGESZ_256M	18 +#define BOOKE_PAGESZ_512M	19 +#define BOOKE_PAGESZ_1G		20 +#define BOOKE_PAGESZ_2G		21 +#define BOOKE_PAGESZ_4G		22 +#define BOOKE_PAGESZ_8G		23 +#define BOOKE_PAGESZ_16GB	24 +#define BOOKE_PAGESZ_32GB	25 +#define BOOKE_PAGESZ_64GB	26 +#define BOOKE_PAGESZ_128GB	27 +#define BOOKE_PAGESZ_256GB	28 +#define BOOKE_PAGESZ_512GB	29 +#define BOOKE_PAGESZ_1TB	30 +#define BOOKE_PAGESZ_2TB	31  #define TLBIVAX_ALL		4  #define TLBIVAX_TLB0		0 diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 19fe2503057..8c91f0849b8 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -1113,6 +1113,8 @@  #define SVR_9130	0x860001  #define SVR_9131	0x860000 +#define SVR_9132	0x861000 +#define SVR_9232	0x861400  #define SVR_Unknown	0xFFFFFF diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 844fe8636de..86cf02ace41 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -47,7 +47,8 @@ endif  endif  ifdef MINIMAL -COBJS-y += cache.o +COBJS-y += cache.o time.o +SOBJS-y += ticks.o  else  SOBJS-y	+= ppcstring.o diff --git a/arch/powerpc/lib/board.c b/arch/powerpc/lib/board.c index 6a7bf4b6c21..12270a4533a 100644 --- a/arch/powerpc/lib/board.c +++ b/arch/powerpc/lib/board.c @@ -556,11 +556,11 @@ void board_init_f(ulong bootflag)  #endif  #if defined(CONFIG_MPC8220)  	bd->bi_mbar_base = CONFIG_SYS_MBAR;	/* base of internal registers */ -	bd->bi_inpfreq = gd->inp_clk; +	bd->bi_inpfreq = gd->arch.inp_clk;  	bd->bi_pcifreq = gd->pci_clk; -	bd->bi_vcofreq = gd->vco_clk; -	bd->bi_pevfreq = gd->pev_clk; -	bd->bi_flbfreq = gd->flb_clk; +	bd->bi_vcofreq = gd->arch.vco_clk; +	bd->bi_pevfreq = gd->arch.pev_clk; +	bd->bi_flbfreq = gd->arch.flb_clk;  	/* store bootparam to sram (backward compatible), here? */  	{ @@ -568,10 +568,10 @@ void board_init_f(ulong bootflag)  		*sram++ = gd->ram_size;  		*sram++ = gd->bus_clk; -		*sram++ = gd->inp_clk; +		*sram++ = gd->arch.inp_clk;  		*sram++ = gd->cpu_clk; -		*sram++ = gd->vco_clk; -		*sram++ = gd->flb_clk; +		*sram++ = gd->arch.vco_clk; +		*sram++ = gd->arch.flb_clk;  		*sram++ = 0xb8c3ba11;	/* boot signature */  	}  #endif @@ -580,16 +580,16 @@ void board_init_f(ulong bootflag)  	bd->bi_intfreq = gd->cpu_clk;	/* Internal Freq, in Hz */  	bd->bi_busfreq = gd->bus_clk;	/* Bus Freq,      in Hz */  #if defined(CONFIG_CPM2) -	bd->bi_cpmfreq = gd->cpm_clk; -	bd->bi_brgfreq = gd->brg_clk; -	bd->bi_sccfreq = gd->scc_clk; -	bd->bi_vco = gd->vco_out; +	bd->bi_cpmfreq = gd->arch.cpm_clk; +	bd->bi_brgfreq = gd->arch.brg_clk; +	bd->bi_sccfreq = gd->arch.scc_clk; +	bd->bi_vco = gd->arch.vco_out;  #endif /* CONFIG_CPM2 */  #if defined(CONFIG_MPC512X) -	bd->bi_ipsfreq = gd->ips_clk; +	bd->bi_ipsfreq = gd->arch.ips_clk;  #endif /* CONFIG_MPC512X */  #if defined(CONFIG_MPC5xxx) -	bd->bi_ipbfreq = gd->ipb_clk; +	bd->bi_ipbfreq = gd->arch.ipb_clk;  	bd->bi_pcifreq = gd->pci_clk;  #endif /* CONFIG_MPC5xxx */  	bd->bi_baudrate = gd->baudrate;	/* Console Baudrate     */ @@ -649,10 +649,11 @@ void board_init_r(gd_t *id, ulong dest_addr)  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)  	/* -	 * The gd->cpu pointer is set to an address in flash before relocation. -	 * We need to update it to point to the same CPU entry in RAM. +	 * The gd->arch.cpu pointer is set to an address in flash before +	 * relocation.  We need to update it to point to the same CPU entry +	 * in RAM.  	 */ -	gd->cpu += dest_addr - CONFIG_SYS_MONITOR_BASE; +	gd->arch.cpu += dest_addr - CONFIG_SYS_MONITOR_BASE;  	/*  	 * If we didn't know the cpu mask & # cores, we can save them of diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c index 7088293a364..0119a7b6ebf 100644 --- a/arch/powerpc/lib/bootm.c +++ b/arch/powerpc/lib/bootm.c @@ -36,10 +36,8 @@  #include <asm/mp.h>  #if defined(CONFIG_OF_LIBFDT) -#include <fdt.h>  #include <libfdt.h>  #include <fdt_support.h> -  #endif  #ifdef CONFIG_SYS_INIT_RAM_LOCK | 
