diff options
Diffstat (limited to 'board/tqm8xx/flash.c')
| -rw-r--r-- | board/tqm8xx/flash.c | 75 | 
1 files changed, 67 insertions, 8 deletions
| diff --git a/board/tqm8xx/flash.c b/board/tqm8xx/flash.c index 98bea0e00..c791c3052 100644 --- a/board/tqm8xx/flash.c +++ b/board/tqm8xx/flash.c @@ -25,6 +25,7 @@  #include <common.h>  #include <mpc8xx.h> +#include <environment.h>  #ifndef	CFG_ENV_ADDR  #define CFG_ENV_ADDR	(CFG_FLASH_BASE + CFG_ENV_OFFSET) @@ -103,17 +104,41 @@ unsigned long flash_init (void)  #if CFG_MONITOR_BASE >= CFG_FLASH_BASE  	/* monitor protection ON by default */ +	debug ("Protect monitor: %08lx ... %08lx\n", +		(ulong)CFG_MONITOR_BASE, +		(ulong)CFG_MONITOR_BASE + monitor_flash_len - 1); +  	flash_protect(FLAG_PROTECT_SET,  		      CFG_MONITOR_BASE, -		      CFG_MONITOR_BASE+monitor_flash_len-1, +		      CFG_MONITOR_BASE + monitor_flash_len - 1,  		      &flash_info[0]);  #endif  #ifdef	CFG_ENV_IS_IN_FLASH  	/* ENV protection ON by default */ +	debug ("Protect %senvironment: %08lx ... %08lx\n", +# ifdef CFG_ENV_ADDR_REDUND +		"primary   ", +# else +		"", +# endif +		(ulong)CFG_ENV_ADDR, +		(ulong)CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1); +  	flash_protect(FLAG_PROTECT_SET,  		      CFG_ENV_ADDR, -		      CFG_ENV_ADDR+CFG_ENV_SIZE-1, +		      CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1, +		      &flash_info[0]); +#endif + +#ifdef CFG_ENV_ADDR_REDUND +	debug ("Protect redundand environment: %08lx ... %08lx\n", +		(ulong)CFG_ENV_ADDR_REDUND, +		(ulong)CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1); + +	flash_protect(FLAG_PROTECT_SET, +		      CFG_ENV_ADDR_REDUND, +		      CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1,  		      &flash_info[0]);  #endif @@ -181,6 +206,10 @@ void flash_print_info  (flash_info_t *info)  	}  	switch (info->flash_id & FLASH_TYPEMASK) { +#ifdef CONFIG_TQM8xxM	/* mirror bit flash */ +	case FLASH_AMLV128U:	printf ("AM29LV128ML (128Mbit, uniform sector size)\n"); +				break; +# else	/* ! TQM8xxM */  	case FLASH_AM400B:	printf ("AM29LV400B (4 Mbit, bottom boot sect)\n");  				break;  	case FLASH_AM400T:	printf ("AM29LV400T (4 Mbit, top boot sector)\n"); @@ -197,6 +226,7 @@ void flash_print_info  (flash_info_t *info)  				break;  	case FLASH_AM320T:	printf ("AM29LV320T (32 Mbit, top boot sector)\n");  				break; +#endif	/* TQM8xxM */  	default:		printf ("Unknown Chip Type\n");  				break;  	} @@ -262,6 +292,25 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)  	debug ("Device ID @ 0x%08lx: 0x%08lx\n", (ulong)(&addr[1]), value);  	switch (value) { +#ifdef CONFIG_TQM8xxM	/* mirror bit flash */ +	case AMD_ID_MIRROR: +		switch(addr[14]) { +		case AMD_ID_LV128U_2: +			if (addr[15] != AMD_ID_LV128U_3) { +				info->flash_id = FLASH_UNKNOWN; +			} +			else { +				info->flash_id += FLASH_AMLV128U; +				info->sector_count = 256; +				info->size = 0x02000000; +			} +			break;				/* => 32 MB		*/ +		default: +			info->flash_id = FLASH_UNKNOWN; +			break; +		} +		break; +# else	/* ! TQM8xxM */  	case AMD_ID_LV400T:  		info->flash_id += FLASH_AM400T;  		info->sector_count = 11; @@ -297,6 +346,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)  		info->sector_count = 35;  		info->size = 0x00400000;  		break;				/* => 4 MB		*/ +  	case AMD_ID_LV320T:  		info->flash_id += FLASH_AM320T;  		info->sector_count = 71; @@ -308,12 +358,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)  		info->sector_count = 71;  		info->size = 0x00800000;  		break;				/* => 8 MB		*/ -	case AMD_ID_DL640: -debug ("## oops - same ID used for AM29LV128ML/H mirror bit flash ???\n"); -		info->flash_id += FLASH_AMDL640; -		info->sector_count = 142; -		info->size = 0x00800000; -		break; +#endif	/* TQM8xxM */  	default:  		info->flash_id = FLASH_UNKNOWN;  		return (0);			/* => no or unknown flash */ @@ -321,6 +366,19 @@ debug ("## oops - same ID used for AM29LV128ML/H mirror bit flash ???\n");  	/* set up sector start address table */  	switch (value) { +#ifdef CONFIG_TQM8xxM	/* mirror bit flash */ +	case AMD_ID_MIRROR: +		switch (info->flash_id & FLASH_TYPEMASK) { +			/* only known types here - no default */ +		case FLASH_AMLV128U: +			for (i = 0; i < info->sector_count; i++) { +				info->start[i] = base; +				base += 0x20000; +			} +			break; +		} +		break; +# else	/* ! TQM8xxM */  	case AMD_ID_LV400B:  	case AMD_ID_LV800B:  	case AMD_ID_LV160B: @@ -369,6 +427,7 @@ debug ("## oops - same ID used for AM29LV128ML/H mirror bit flash ???\n");  				:  2 * ( 8 << 10);  		}  		break; +#endif	/* TQM8xxM */  	default:  		return (0);  		break; |