diff options
| -rw-r--r-- | CHANGELOG | 7 | ||||
| -rw-r--r-- | board/RRvision/RRvision.c | 19 | ||||
| -rw-r--r-- | board/atc/atc.c | 19 | ||||
| -rw-r--r-- | board/c2mon/c2mon.c | 19 | ||||
| -rw-r--r-- | board/etx094/etx094.c | 19 | ||||
| -rw-r--r-- | board/evb64260/flash.c | 2 | ||||
| -rw-r--r-- | board/rmu/rmu.c | 110 | ||||
| -rw-r--r-- | board/tqm8260/tqm8260.c | 19 | ||||
| -rw-r--r-- | board/tqm8xx/tqm8xx.c | 19 | ||||
| -rw-r--r-- | fs/fat/fat.c | 29 | ||||
| -rw-r--r-- | include/version.h | 2 | ||||
| -rw-r--r-- | lib_arm/board.c | 4 | 
12 files changed, 182 insertions, 86 deletions
| @@ -2,6 +2,13 @@  Changes for U-Boot 1.0.0:  ====================================================================== +* Fix problems in memory test on some boards (which was not +  non-destructive as intended) + +* Patch by Gary Jennejohn, 28 Oct 2003: +  Change fs/fat/fat.c to put I/O buffers in BSS instead on the stack +  to prevent stack overflow on ARM systems +  * Patch by Stephan Linz, 28 Oct 2003:    fix init sequence error for NIOS port diff --git a/board/RRvision/RRvision.c b/board/RRvision/RRvision.c index d6f5c2a0d..8ed561d87 100644 --- a/board/RRvision/RRvision.c +++ b/board/RRvision/RRvision.c @@ -230,8 +230,8 @@ static long int dram_size (long int mamr_value, long int *base,  	volatile immap_t *immap = (immap_t *) CFG_IMMR;  	volatile memctl8xx_t *memctl = &immap->im_memctl;  	volatile long int *addr; -	ulong cnt, val; -	ulong save[32];			/* to make test non-destructive */ + 	ulong cnt, val, size; + 	ulong save[32];			/* to make test non-destructive */  	unsigned char i = 0;  	memctl->memc_mamr = mamr_value; @@ -250,7 +250,13 @@ static long int dram_size (long int mamr_value, long int *base,  	/* check at base address */  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -261,7 +267,14 @@ static long int dram_size (long int mamr_value, long int *base,  		*addr = save[--i];  		if (val != (~cnt)) { -			return (cnt * sizeof (long)); +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			} +			return (size);  		}  	}  	return (maxsize); diff --git a/board/atc/atc.c b/board/atc/atc.c index 9aa942fcf..fad7646af 100644 --- a/board/atc/atc.c +++ b/board/atc/atc.c @@ -269,7 +269,7 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  			  ulong orx, volatile uchar * base)  {  	volatile uchar c = 0xff; -	ulong cnt, val; +	ulong cnt, val, size;  	volatile ulong *addr;  	volatile uint *sdmr_ptr;  	volatile uint *orx_ptr; @@ -344,7 +344,13 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  	*addr = 0;  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -353,10 +359,17 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  		val = *addr;  		*addr = save[--i];  		if (val != ~cnt) { +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			}  			/* Write the actual size to ORx  			 */ -			*orx_ptr = orx | ~(cnt * sizeof (long) - 1); -			return (cnt * sizeof (long)); +			*orx_ptr = orx | ~(size - 1); +			return (size);  		}  	}  	return (maxsize); diff --git a/board/c2mon/c2mon.c b/board/c2mon/c2mon.c index 171d06eba..0fdcebe37 100644 --- a/board/c2mon/c2mon.c +++ b/board/c2mon/c2mon.c @@ -228,8 +228,8 @@ static long int dram_size (long int mamr_value, long int *base,  	volatile immap_t *immap = (immap_t *) CFG_IMMR;  	volatile memctl8xx_t *memctl = &immap->im_memctl;  	volatile long int *addr; -	ulong cnt, val; -	ulong save[32];			/* to make test non-destructive */ + 	ulong cnt, val, size; + 	ulong save[32];			/* to make test non-destructive */  	unsigned char i = 0;  	memctl->memc_mamr = mamr_value; @@ -248,7 +248,13 @@ static long int dram_size (long int mamr_value, long int *base,  	/* check at base address */  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -259,7 +265,14 @@ static long int dram_size (long int mamr_value, long int *base,  		*addr = save[--i];  		if (val != (~cnt)) { -			return (cnt * sizeof (long)); +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			} +			return (size);  		}  	}  	return (maxsize); diff --git a/board/etx094/etx094.c b/board/etx094/etx094.c index d48772be6..e52ca8574 100644 --- a/board/etx094/etx094.c +++ b/board/etx094/etx094.c @@ -321,8 +321,8 @@ static long int dram_size (long int mamr_value, long int *base,  	volatile immap_t *immap = (immap_t *) CFG_IMMR;  	volatile memctl8xx_t *memctl = &immap->im_memctl;  	volatile long int *addr; -	ulong cnt, val; -	ulong save[32];			/* to make test non-destructive */ + 	ulong cnt, val, size; + 	ulong save[32];			/* to make test non-destructive */  	unsigned char i = 0;  	memctl->memc_mamr = mamr_value; @@ -341,7 +341,13 @@ static long int dram_size (long int mamr_value, long int *base,  	/* check at base address */  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -352,7 +358,14 @@ static long int dram_size (long int mamr_value, long int *base,  		*addr = save[--i];  		if (val != (~cnt)) { -			return (cnt * sizeof (long)); +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			} +			return (size);  		}  	}  	return (maxsize); diff --git a/board/evb64260/flash.c b/board/evb64260/flash.c index bc52c1278..7ca6f0ae7 100644 --- a/board/evb64260/flash.c +++ b/board/evb64260/flash.c @@ -97,7 +97,7 @@ flash_init (void)  #ifndef CONFIG_P3G4  	    printf("[");  	    print_size (size, ""); -	    printf("@%08lX] ", size>>20, base); +	    printf("@%08lX] ", base);  #endif  	    if (flash_info[i].flash_id == FLASH_UNKNOWN) { diff --git a/board/rmu/rmu.c b/board/rmu/rmu.c index 331fb9877..5fda4c061 100644 --- a/board/rmu/rmu.c +++ b/board/rmu/rmu.c @@ -94,39 +94,41 @@ int checkboard (void)  long int initdram (int board_type)  { -    volatile immap_t     *immap  = (immap_t *)CFG_IMMR; -    volatile memctl8xx_t *memctl = &immap->im_memctl; -    long int size9 ; +	volatile immap_t *immap = (immap_t *) CFG_IMMR; +	volatile memctl8xx_t *memctl = &immap->im_memctl; +	long int size9; -    upmconfig(UPMA, (uint *)sdram_table, sizeof(sdram_table)/sizeof(uint)); +	upmconfig (UPMA, (uint *) sdram_table, +		   sizeof (sdram_table) / sizeof (uint));  	/* Refresh clock prescalar */ -    memctl->memc_mptpr = CFG_MPTPR ; +	memctl->memc_mptpr = CFG_MPTPR; -    memctl->memc_mar  = 0x00000088; +	memctl->memc_mar = 0x00000088;  	/* Map controller banks 1 to the SDRAM bank */ -    memctl->memc_or1 = CFG_OR1_PRELIM; -    memctl->memc_br1 = CFG_BR1_PRELIM; +	memctl->memc_or1 = CFG_OR1_PRELIM; +	memctl->memc_br1 = CFG_BR1_PRELIM; -    memctl->memc_mamr = CFG_MAMR_9COL & (~(MAMR_PTAE)); /* no refresh yet */ +	memctl->memc_mamr = CFG_MAMR_9COL & (~(MAMR_PTAE));	/* no refresh yet */ -    udelay(200); +	udelay (200); -    /* perform SDRAM initializsation sequence */ +	/* perform SDRAM initializsation sequence */ -	memctl->memc_mcr  = 0x80002136 ; /* SDRAM bank 0 */ -    udelay(1); +	memctl->memc_mcr = 0x80002136;	/* SDRAM bank 0 */ +	udelay (1); -    memctl->memc_mamr |= MAMR_PTAE;	/* enable refresh */ +	memctl->memc_mamr |= MAMR_PTAE;	/* enable refresh */ -    udelay (1000); +	udelay (1000);  	/* Check Bank 0 Memory Size,  	 * 9 column mode  	 */ -	size9 = dram_size (CFG_MAMR_9COL, (ulong *)SDRAM_BASE_PRELIM, SDRAM_MAX_SIZE) ; +	size9 = dram_size (CFG_MAMR_9COL, (ulong *) SDRAM_BASE_PRELIM, +			   SDRAM_MAX_SIZE);  	/*  	 * Final mapping: @@ -135,7 +137,7 @@ long int initdram (int board_type)  	memctl->memc_or1 = ((-size9) & 0xFFFF0000) | CFG_OR_TIMING_SDRAM;  	udelay (1000); -    return (size9); +	return (size9);  }  /* ------------------------------------------------------------------------- */ @@ -148,44 +150,58 @@ long int initdram (int board_type)   * - short between data lines   */ -static long int dram_size (long int mamr_value, long int *base, long int maxsize) +static long int dram_size (long int mamr_value, long int *base, +			   long int maxsize)  { -    volatile immap_t     *immap  = (immap_t *)CFG_IMMR; -    volatile memctl8xx_t *memctl = &immap->im_memctl; -    volatile long int	 *addr; -    ulong		  cnt, val; -    ulong		  save[32];	/* to make test non-destructive */ -    unsigned char	  i = 0; +	volatile immap_t *immap = (immap_t *) CFG_IMMR; +	volatile memctl8xx_t *memctl = &immap->im_memctl; +	volatile long int *addr; +	ulong cnt, val, size; +	ulong save[32];		/* to make test non-destructive */ +	unsigned char i = 0; -    memctl->memc_mamr = mamr_value; +	memctl->memc_mamr = mamr_value; -    for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1) { -	addr = base + cnt;	/* pointer arith! */ +	for (cnt = maxsize / sizeof (long); cnt > 0; cnt >>= 1) { +		addr = base + cnt;	/* pointer arith! */ -	save[i++] = *addr; -	*addr = ~cnt; -    } +		save[i++] = *addr; +		*addr = ~cnt; +	} -    /* write 0 to base address */ -    addr = base; -    save[i] = *addr; -    *addr = 0; +	/* write 0 to base address */ +	addr = base; +	save[i] = *addr; +	*addr = 0; -    /* check at base address */ -    if ((val = *addr) != 0) { -	*addr = save[i]; -	return (0); -    } +	/* check at base address */ +	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */ +		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		} +		return (0); +	} -    for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1) { -	addr = base + cnt;	/* pointer arith! */ +	for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +		addr = base + cnt;	/* pointer arith! */ -	val = *addr; -	*addr = save[--i]; +		val = *addr; +		*addr = save[--i]; -	if (val != (~cnt)) { -	    return (cnt * sizeof(long)); +		if (val != (~cnt)) { +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			} +			return (size); +		}  	} -    } -    return (maxsize); +	return (maxsize);  } diff --git a/board/tqm8260/tqm8260.c b/board/tqm8260/tqm8260.c index 556a1e3e7..a0a38caf2 100644 --- a/board/tqm8260/tqm8260.c +++ b/board/tqm8260/tqm8260.c @@ -230,7 +230,7 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  	volatile uint *orx_ptr;  	int i;  	ulong save[32];				/* to make test non-destructive */ -	ulong maxsize; +	ulong maxsize, size;  	/* We must be able to test a location outsize the maximum legal size  	 * to find out THAT we are outside; but this address still has to be @@ -299,7 +299,13 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  	*addr = 0;  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -308,10 +314,17 @@ static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,  		val = *addr;  		*addr = save[--i];  		if (val != ~cnt) { +			size = cnt * sizeof (long); +			/* Restore the original data before leaving the function. +			 */  +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			}  			/* Write the actual size to ORx  			 */ -			*orx_ptr = orx | ~(cnt * sizeof (long) - 1); -			return (cnt * sizeof (long)); +			*orx_ptr = orx | ~(size - 1); +			return (size);  		}  	}  	return (maxsize); diff --git a/board/tqm8xx/tqm8xx.c b/board/tqm8xx/tqm8xx.c index 53f1f2abb..badc79401 100644 --- a/board/tqm8xx/tqm8xx.c +++ b/board/tqm8xx/tqm8xx.c @@ -389,8 +389,8 @@ static long int dram_size (long int mamr_value, long int *base,  	volatile immap_t *immap = (immap_t *) CFG_IMMR;  	volatile memctl8xx_t *memctl = &immap->im_memctl;  	volatile long int *addr; -	ulong cnt, val; -	ulong save[32];				/* to make test non-destructive */ +	ulong cnt, val, size; +	ulong save[32];			/* to make test non-destructive */  	unsigned char i = 0;  	memctl->memc_mamr = mamr_value; @@ -409,7 +409,13 @@ static long int dram_size (long int mamr_value, long int *base,  	/* check at base address */  	if ((val = *addr) != 0) { +		/* Restore the original data before leaving the function. +		 */  		*addr = save[i]; +		for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { +			addr  = (volatile ulong *) base + cnt; +			*addr = save[--i]; +		}  		return (0);  	} @@ -420,7 +426,14 @@ static long int dram_size (long int mamr_value, long int *base,  		*addr = save[--i];  		if (val != (~cnt)) { -			return (cnt * sizeof (long)); +			size = cnt * sizeof (long); +			/* Restore the original data before returning +			 */ +			for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { +				addr  = (volatile ulong *) base + cnt; +				*addr = save[--i]; +			} +			return (size);  		}  	}  	return (maxsize); diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 1f2713326..29eea4582 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -33,11 +33,6 @@  #if (CONFIG_COMMANDS & CFG_CMD_FAT) -#ifdef CONFIG_AUTO_UPDATE -/* the VFAT code has a bug which breaks auto update */ -#undef CONFIG_SUPPORT_VFAT -#endif -  /*   * Convert a string to lowercase.   */ @@ -429,6 +424,7 @@ slot2str(dir_slot *slotptr, char *l_name, int *idx)   * into 'retdent'   * Return 0 on success, -1 otherwise.   */ +__u8	 get_vfatname_block[MAX_CLUSTSIZE];  static int  get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,  	     dir_entry *retdent, char *l_name) @@ -447,7 +443,6 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,  	}  	if ((__u8*)slotptr >= nextclust) { -		__u8	 block[MAX_CLUSTSIZE];  		dir_slot *slotptr2;  		slotptr--; @@ -457,18 +452,18 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,  			FAT_ERROR("Invalid FAT entry\n");  			return -1;  		} -		if (get_cluster(mydata, curclust, block, +		if (get_cluster(mydata, curclust, get_vfatname_block,  				mydata->clust_size * SECTOR_SIZE) != 0) {  			FAT_DPRINT("Error: reading directory block\n");  			return -1;  		} -		slotptr2 = (dir_slot*) block; +		slotptr2 = (dir_slot*) get_vfatname_block;  		while (slotptr2->id > 0x01) {  			slotptr2++;  		}  		/* Save the real directory entry */  		realdent = (dir_entry*)slotptr2 + 1; -		while ((__u8*)slotptr2 >= block) { +		while ((__u8*)slotptr2 >= get_vfatname_block) {  			slot2str(slotptr2, l_name, &idx);  			slotptr2--;  		} @@ -514,12 +509,12 @@ mkcksum(const char *str)   * Get the directory entry associated with 'filename' from the directory   * starting at 'startsect'   */ +__u8 get_dentfromdir_block[MAX_CLUSTSIZE];  static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,  				   char *filename, dir_entry * retdent,  				   int dols)  {      __u16 prevcksum = 0xffff; -    __u8 block[MAX_CLUSTSIZE];      __u32 curclust = START (retdent);      int files = 0, dirs = 0; @@ -528,12 +523,12 @@ static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,  	dir_entry *dentptr;  	int i; -	if (get_cluster (mydata, curclust, block, +	if (get_cluster (mydata, curclust, get_dentfromdir_block,  		 mydata->clust_size * SECTOR_SIZE) != 0) {  	    FAT_DPRINT ("Error: reading directory block\n");  	    return NULL;  	} -	dentptr = (dir_entry *) block; +	dentptr = (dir_entry *) get_dentfromdir_block;  	for (i = 0; i < DIRENTSPERCLUST; i++) {  	    char s_name[14], l_name[256]; @@ -544,7 +539,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,  		    (dentptr->name[0] & 0x40)) {  		    prevcksum = ((dir_slot *) dentptr)  			    ->alias_checksum; -		    get_vfatname (mydata, curclust, block, +		    get_vfatname (mydata, curclust, get_dentfromdir_block,  				  dentptr, l_name);  		    if (dols) {  			int isdir = (dentptr->attr & ATTR_DIR); @@ -716,11 +711,11 @@ read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)  } +__u8 do_fat_read_block[MAX_CLUSTSIZE];  /* Block buffer */  static long  do_fat_read (const char *filename, void *buffer, unsigned long maxsize,  	     int dols)  { -    __u8 block[MAX_CLUSTSIZE];  /* Block buffer */      char fnamecopy[2048];      boot_sector bs;      volume_info volinfo; @@ -792,11 +787,11 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,      while (1) {  	int i; -	if (disk_read (cursect, mydata->clust_size, block) < 0) { +	if (disk_read (cursect, mydata->clust_size, do_fat_read_block) < 0) {  	    FAT_DPRINT ("Error: reading rootdir block\n");  	    return -1;  	} -	dentptr = (dir_entry *) block; +	dentptr = (dir_entry *) do_fat_read_block;  	for (i = 0; i < DIRENTSPERBLOCK; i++) {  	    char s_name[14], l_name[256]; @@ -806,7 +801,7 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,  		if ((dentptr->attr & ATTR_VFAT) &&  		    (dentptr->name[0] & 0x40)) {  		    prevcksum = ((dir_slot *) dentptr)->alias_checksum; -		    get_vfatname (mydata, 0, block, dentptr, l_name); +		    get_vfatname (mydata, 0, do_fat_read_block, dentptr, l_name);  		    if (dols == LS_ROOT) {  			int isdir = (dentptr->attr & ATTR_DIR);  			char dirc; diff --git a/include/version.h b/include/version.h index ef22f7ac0..b4ee13a40 100644 --- a/include/version.h +++ b/include/version.h @@ -24,6 +24,6 @@  #ifndef	__VERSION_H__  #define	__VERSION_H__ -#define	U_BOOT_VERSION	"U-Boot 1.0.0-pre" +#define	U_BOOT_VERSION	"U-Boot 1.0.0"  #endif	/* __VERSION_H__ */ diff --git a/lib_arm/board.c b/lib_arm/board.c index f3f831f4f..a6029b0f2 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -111,9 +111,9 @@ static int init_baudrate (void)  static int display_banner (void)  { +#ifdef CONFIG_SILENT_CONSOLE  	DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_SILENT_CONSOLE  	if (gd->flags & GD_FLG_SILENT)  		return (0);  #endif @@ -161,9 +161,9 @@ static int display_dram_config (void)  static void display_flash_config (ulong size)  { +#ifdef CONFIG_SILENT_CONSOLE  	DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_SILENT_CONSOLE  	if (gd->flags & GD_FLG_SILENT)  		return;  #endif |