diff options
| author | Sergei Poselenov <sposelenov@emcraft.com> | 2008-06-06 15:42:40 +0200 | 
|---|---|---|
| committer | Andrew Fleming-AFLEMING <afleming@freescale.com> | 2008-06-11 00:29:29 -0500 | 
| commit | 740280e68ccc0b971e613face7eaaa8bd1382b8c (patch) | |
| tree | 7e970d405f0a0ccf7a1d5ff30a7fbbf927116728 | |
| parent | d39e68514ff943930ee692cff3fde03532eb7fec (diff) | |
| download | olio-uboot-2014.01-740280e68ccc0b971e613face7eaaa8bd1382b8c.tar.xz olio-uboot-2014.01-740280e68ccc0b971e613face7eaaa8bd1382b8c.zip | |
Added the upmconfig() function for 85xx.
Signed-off-by: Sergei Poselenov <sposelenov@emcraft.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
| -rw-r--r-- | cpu/mpc85xx/cpu.c | 66 | ||||
| -rw-r--r-- | include/asm-ppc/fsl_lbc.h | 4 | 
2 files changed, 70 insertions, 0 deletions
| diff --git a/cpu/mpc85xx/cpu.c b/cpu/mpc85xx/cpu.c index c64bf1050..2b7e753ec 100644 --- a/cpu/mpc85xx/cpu.c +++ b/cpu/mpc85xx/cpu.c @@ -29,6 +29,7 @@  #include <watchdog.h>  #include <command.h>  #include <asm/cache.h> +#include <asm/io.h>  DECLARE_GLOBAL_DATA_PTR; @@ -287,3 +288,68 @@ int dma_xfer(void *dest, uint count, void *src) {  	return dma_check();  }  #endif +/* + * Configures a UPM. Currently, the loop fields in MxMR (RLF, WLF and TLF) + * are hardcoded as "1"."size" is the number or entries, not a sizeof. + */ +void upmconfig (uint upm, uint * table, uint size) +{ +	int i, mdr, mad, old_mad = 0; +	volatile u32 *mxmr; +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); +	int loopval = 0x00004440; +	volatile u32 *brp,*orp; +	volatile u8* dummy = NULL; +	int upmmask; + +	switch (upm) { +	case UPMA: +		mxmr = &lbc->mamr; +		upmmask = BR_MS_UPMA; +		break; +	case UPMB: +		mxmr = &lbc->mbmr; +		upmmask = BR_MS_UPMB; +		break; +	case UPMC: +		mxmr = &lbc->mcmr; +		upmmask = BR_MS_UPMC; +		break; +	default: +		printf("%s: Bad UPM index %d to configure\n", __FUNCTION__, upm); +		hang(); +	} + +	/* Find the address for the dummy write transaction */ +	for (brp = &lbc->br0, orp = &lbc->or0, i = 0; i < 8; +		 i++, brp += 2, orp += 2) { +		 +		/* Look for a valid BR with selected UPM */ +		if ((in_be32(brp) & (BR_V | upmmask)) == (BR_V | upmmask)) { +			dummy = (volatile u8*)(in_be32(brp) >> BR_BA_SHIFT); +			break; +		} +	} + +	if (i == 8) { +		printf("Error: %s() could not find matching BR\n", __FUNCTION__); +		hang(); +	} + +	for (i = 0; i < size; i++) { +		/* 1 */ +		out_be32(mxmr, loopval | 0x10000000 | i); /* OP_WRITE */ +		/* 2 */ +		out_be32(&lbc->mdr, table[i]); +		/* 3 */ +		mdr = in_be32(&lbc->mdr); +		/* 4 */ +		*(volatile u8 *)dummy = 0; +		/* 5 */ +		do { +			mad = in_be32(mxmr) & 0x3f; +		} while (mad <= old_mad && !(!mad && i == (size-1))); +		old_mad = mad; +	} +	out_be32(mxmr, loopval); /* OP_NORMAL */ +} diff --git a/include/asm-ppc/fsl_lbc.h b/include/asm-ppc/fsl_lbc.h index bad34769a..c4af7971b 100644 --- a/include/asm-ppc/fsl_lbc.h +++ b/include/asm-ppc/fsl_lbc.h @@ -59,6 +59,10 @@  #define BR_V				0x00000001  #define BR_V_SHIFT			0 +#define UPMA			0 +#define UPMB			1 +#define UPMC			2 +  #if defined(CONFIG_MPC834X)  #define BR_RES				~(BR_BA | BR_PS | BR_DECC | BR_WP | BR_MSEL | BR_V)  #else |