]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/sixnet/flash.c
rename CFG_ macros to CONFIG_SYS
[karo-tx-uboot.git] / board / sixnet / flash.c
index 225513acca5ba8aa965ee1f4870c59de2b2e0878..a8dfca82461752e0f0adb61f1b2cb6f81ba50f3b 100644 (file)
 
 #include <common.h>
 #include <mpc8xx.h>
+/* environment.h defines the various CONFIG_ENV_... values in terms
+ * of whichever ones are given in the configuration file.
+ */
+#include <environment.h>
 
-flash_info_t   flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips        */
+flash_info_t   flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
 
 /* NOTE - CONFIG_FLASH_16BIT means the CPU interface is 16-bit, it
  *        has nothing to do with the flash chip being 8-bit or 16-bit.
@@ -52,7 +56,7 @@ static void flash_reset(flash_info_t *info);
 static int write_word_intel(flash_info_t *info, FPWV *dest, FPW data);
 static int write_word_amd(flash_info_t *info, FPWV *dest, FPW data);
 static void flash_get_offsets(ulong base, flash_info_t *info);
-#ifdef CFG_FLASH_PROTECTION
+#ifdef CONFIG_SYS_FLASH_PROTECTION
 static void flash_sync_real_protect(flash_info_t *info);
 #endif
 
@@ -63,17 +67,17 @@ static void flash_sync_real_protect(flash_info_t *info);
  */
 unsigned long flash_init (void)
 {
-       volatile immap_t     *immap  = (immap_t *)CFG_IMMR;
+       volatile immap_t     *immap  = (immap_t *)CONFIG_SYS_IMMR;
        volatile memctl8xx_t *memctl = &immap->im_memctl;
        unsigned long size_b;
        int i;
 
        /* Init: no FLASHes known */
-       for (i=0; i < CFG_MAX_FLASH_BANKS; ++i) {
+       for (i=0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
                flash_info[i].flash_id = FLASH_UNKNOWN;
        }
 
-       size_b = flash_get_size((FPW *)CFG_FLASH_BASE, &flash_info[0]);
+       size_b = flash_get_size((FPW *)CONFIG_SYS_FLASH_BASE, &flash_info[0]);
 
        flash_info[0].size = size_b;
 
@@ -87,23 +91,36 @@ unsigned long flash_init (void)
        /* Do this again (was done already in flast_get_size), just
         * in case we move it when remap the FLASH.
         */
-       flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);
+       flash_get_offsets (CONFIG_SYS_FLASH_BASE, &flash_info[0]);
 
-#ifdef CFG_FLASH_PROTECTION
+#ifdef CONFIG_SYS_FLASH_PROTECTION
        /* read the hardware protection status (if any) into the
         * protection array in flash_info.
         */
        flash_sync_real_protect(&flash_info[0]);
 #endif
 
-#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
+#if CONFIG_SYS_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE
        /* monitor protection ON by default */
        flash_protect(FLAG_PROTECT_SET,
-                     CFG_MONITOR_BASE,
-                     CFG_MONITOR_BASE+monitor_flash_len-1,
+                     CONFIG_SYS_MONITOR_BASE,
+                     CONFIG_SYS_MONITOR_BASE+monitor_flash_len-1,
                      &flash_info[0]);
 #endif
 
+#ifdef CONFIG_ENV_ADDR
+       flash_protect ( FLAG_PROTECT_SET,
+                       CONFIG_ENV_ADDR,
+                       CONFIG_ENV_ADDR + CONFIG_ENV_SIZE - 1, &flash_info[0]);
+#endif
+
+#ifdef CONFIG_ENV_ADDR_REDUND
+       flash_protect ( FLAG_PROTECT_SET,
+                       CONFIG_ENV_ADDR_REDUND,
+                       CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+                       &flash_info[0]);
+#endif
+
        return (size_b);
 }
 
@@ -154,6 +171,21 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
                for( i = 0; i < info->sector_count; i++ )
                        info->start[i] = base + (i * sect_size);
        }
+       else if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_AMD
+                && (info->flash_id & FLASH_TYPEMASK) == FLASH_AM800T) {
+
+               int sect_size;          /* number of bytes/sector */
+
+               sect_size = 0x00010000 * (sizeof(FPW)/2);
+
+               /* set up sector start address table (top boot sector type) */
+               for (i = 0; i < info->sector_count - 3; i++)
+                       info->start[i] = base + (i * sect_size);
+               i = info->sector_count - 1;
+               info->start[i--] = base + (info->size - 0x00004000) * (sizeof(FPW)/2);
+               info->start[i--] = base + (info->size - 0x00006000) * (sizeof(FPW)/2);
+               info->start[i--] = base + (info->size - 0x00008000) * (sizeof(FPW)/2);
+       }
 }
 
 /*-----------------------------------------------------------------------
@@ -164,7 +196,7 @@ void flash_print_info (flash_info_t *info)
        int i;
        uchar *boottype;
        uchar *bootletter;
-       uchar *fmt;
+       char *fmt;
        uchar botbootletter[] = "B";
        uchar topbootletter[] = "T";
        uchar botboottype[] = "bottom boot sector";
@@ -196,6 +228,9 @@ void flash_print_info (flash_info_t *info)
        }
 
        switch (info->flash_id & FLASH_TYPEMASK) {
+       case FLASH_AM800T:
+               fmt = "29LV800B%s (8 Mbit, %s)\n";
+               break;
        case FLASH_AM640U:
                fmt = "29LV641D (64 Mbit, uniform sectors)\n";
                break;
@@ -295,6 +330,12 @@ ulong flash_get_size (FPWV *addr, flash_info_t *info)
        /* Check 16 bits or 32 bits of ID so work on 32 or 16 bit bus. */
        if (info->flash_id != FLASH_UNKNOWN) switch (addr[1]) {
 
+       case (FPW)AMD_ID_LV800T:
+               info->flash_id += FLASH_AM800T;
+               info->sector_count = 19;
+               info->size = 0x00100000 * (sizeof(FPW)/2);
+               break;                          /* => 1 or 2 MiB        */
+
        case (FPW)AMD_ID_LV640U:        /* 29LV640 and 29LV641 have same ID */
                info->flash_id += FLASH_AM640U;
                info->sector_count = 128;
@@ -364,7 +405,7 @@ ulong flash_get_size (FPWV *addr, flash_info_t *info)
        return (info->size);
 }
 
-#ifdef CFG_FLASH_PROTECTION
+#ifdef CONFIG_SYS_FLASH_PROTECTION
 /*-----------------------------------------------------------------------
  */
 
@@ -401,6 +442,7 @@ static void flash_sync_real_protect(flash_info_t *info)
        break;
 
     case FLASH_AM640U:
+    case FLASH_AM800T:
     default:
        /* no hardware protect that we support */
        break;
@@ -438,6 +480,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
        case FLASH_28F320C3B:
        case FLASH_28F640C3B:
        case FLASH_AM640U:
+       case FLASH_AM800T:
                break;
        case FLASH_UNKNOWN:
        default:
@@ -501,7 +544,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
                udelay (1000);
 
                while ((*addr & (FPW)0x00800080) != (FPW)0x00800080) {
-                       if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+                       if ((now = get_timer(start)) > CONFIG_SYS_FLASH_ERASE_TOUT) {
                                printf ("Timeout\n");
 
                                if (intel) {
@@ -620,7 +663,7 @@ static int write_word_amd (flash_info_t *info, FPWV *dest, FPW data)
 
     /* data polling for D7 */
     while (res == 0 && (*dest & (FPW)0x00800080) != (data & (FPW)0x00800080)) {
-       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
            *dest = (FPW)0x00F000F0;    /* reset bank */
            res = 1;
        }
@@ -666,7 +709,7 @@ static int write_word_intel (flash_info_t *info, FPWV *dest, FPW data)
     start = get_timer (0);
 
     while (res == 0 && (*dest & (FPW)0x00800080) != (FPW)0x00800080) {
-       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
            *dest = (FPW)0x00B000B0;    /* Suspend program      */
            res = 1;
        }
@@ -681,7 +724,7 @@ static int write_word_intel (flash_info_t *info, FPWV *dest, FPW data)
     return (res);
 }
 
-#ifdef CFG_FLASH_PROTECTION
+#ifdef CONFIG_SYS_FLASH_PROTECTION
 /*-----------------------------------------------------------------------
  */
 int flash_real_protect (flash_info_t * info, long sector, int prot)
@@ -735,6 +778,7 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)
                break;
 
        case FLASH_AM640U:
+       case FLASH_AM800T:
        default:
                /* no hardware protect that we support */
                info->protect[sector] = prot;