Bläddra i källkod

* Prepare for release

* 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
wdenk 21 år sedan
förälder
incheckning
5fa66df63a
12 ändrade filer med 185 tillägg och 89 borttagningar
  1. 7 0
      CHANGELOG
  2. 16 3
      board/RRvision/RRvision.c
  3. 16 3
      board/atc/atc.c
  4. 16 3
      board/c2mon/c2mon.c
  5. 16 3
      board/etx094/etx094.c
  6. 1 1
      board/evb64260/flash.c
  7. 66 50
      board/rmu/rmu.c
  8. 16 3
      board/tqm8260/tqm8260.c
  9. 16 3
      board/tqm8xx/tqm8xx.c
  10. 12 17
      fs/fat/fat.c
  11. 1 1
      include/version.h
  12. 2 2
      lib_arm/board.c

+ 7 - 0
CHANGELOG

@@ -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
 

+ 16 - 3
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);

+ 16 - 3
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);

+ 16 - 3
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);

+ 16 - 3
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);

+ 1 - 1
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) {

+ 66 - 50
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;
-
-    memctl->memc_mamr = mamr_value;
-
-    for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1) {
-	addr = base + cnt;	/* pointer arith! */
+	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;
 
-	save[i++] = *addr;
-	*addr = ~cnt;
-    }
+	memctl->memc_mamr = mamr_value;
 
-    /* write 0 to base address */
-    addr = base;
-    save[i] = *addr;
-    *addr = 0;
+	for (cnt = maxsize / sizeof (long); cnt > 0; cnt >>= 1) {
+		addr = base + cnt;	/* pointer arith! */
 
-    /* check at base address */
-    if ((val = *addr) != 0) {
-	*addr = save[i];
-	return (0);
-    }
-
-    for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1) {
-	addr = base + cnt;	/* pointer arith! */
+		save[i++] = *addr;
+		*addr = ~cnt;
+	}
 
-	val = *addr;
-	*addr = save[--i];
+	/* write 0 to base address */
+	addr = base;
+	save[i] = *addr;
+	*addr = 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);
+	}
 
-	if (val != (~cnt)) {
-	    return (cnt * sizeof(long));
+	for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) {
+		addr = base + cnt;	/* pointer arith! */
+
+		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];
+			}
+			return (size);
+		}
 	}
-    }
-    return (maxsize);
+	return (maxsize);
 }

+ 16 - 3
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);

+ 16 - 3
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);

+ 12 - 17
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;

+ 1 - 1
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__ */

+ 2 - 2
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