summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG7
-rw-r--r--board/RRvision/RRvision.c19
-rw-r--r--board/atc/atc.c19
-rw-r--r--board/c2mon/c2mon.c19
-rw-r--r--board/etx094/etx094.c19
-rw-r--r--board/evb64260/flash.c2
-rw-r--r--board/rmu/rmu.c116
-rw-r--r--board/tqm8260/tqm8260.c19
-rw-r--r--board/tqm8xx/tqm8xx.c19
-rw-r--r--fs/fat/fat.c29
-rw-r--r--include/version.h2
-rw-r--r--lib_arm/board.c4
12 files changed, 185 insertions, 89 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b391732..b8d8f49 100644
--- a/CHANGELOG
+++ b/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
diff --git a/board/RRvision/RRvision.c b/board/RRvision/RRvision.c
index d6f5c2a..8ed561d 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 9aa942f..fad7646 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 171d06e..0fdcebe 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 d48772b..e52ca85 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 bc52c12..7ca6f0a 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 331fb98..5fda4c0 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;
-
- 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);
}
diff --git a/board/tqm8260/tqm8260.c b/board/tqm8260/tqm8260.c
index 556a1e3..a0a38ca 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 53f1f2a..badc794 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 1f27133..29eea45 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 ef22f7a..b4ee13a 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 f3f831f..a6029b0 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