]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/mpl/common/flash.c
board/mpl/common/flash.c: Fix GCC 4.6 build warning
[karo-tx-uboot.git] / board / mpl / common / flash.c
index 98cfb0d318990df6c35a5ba243411629b51ebe81..d5b63c01964ca7de5f449f2e76aa41774ed9f2c9 100644 (file)
@@ -36,7 +36,9 @@
  */
 
 #include <common.h>
-#include <ppc4xx.h>
+
+#if !defined(CONFIG_PATI)
+#include <asm/ppc4xx.h>
 #include <asm/processor.h>
 #include "common_util.h"
 #if defined(CONFIG_MIP405)
 #if defined(CONFIG_PIP405)
 #include "../pip405/pip405.h"
 #endif
-#include <405gp_pci.h>
+#include <asm/4xx_pci.h>
+#else /* defined(CONFIG_PATI) */
+#include <mpc5xx.h>
+#endif
 
-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 */
 /*-----------------------------------------------------------------------
  * Functions
  */
@@ -56,22 +61,15 @@ static int write_word (flash_info_t *info, ulong dest, ulong data);
 
 void unlock_intel_sectors(flash_info_t *info,ulong addr,ulong cnt);
 
-
-#ifdef CONFIG_PIP405
 #define ADDR0           0x5555
 #define ADDR1           0x2aaa
 #define FLASH_WORD_SIZE unsigned short
-#endif
-
-#ifdef CONFIG_MIP405
-#define ADDR0           0x5555
-#define ADDR1           0x2aaa
-#define FLASH_WORD_SIZE unsigned short
-#endif
 
 #define FALSE           0
 #define TRUE            1
 
+#if !defined(CONFIG_PATI)
+
 /*-----------------------------------------------------------------------
  * Some CS switching routines:
  *
@@ -86,20 +84,20 @@ void unlock_intel_sectors(flash_info_t *info,ulong addr,ulong cnt);
  * The first thing we do is to map the Flash CS to the Flash area and
  * the MPS CS to the MPS area. Since the flash size is unknown at this
  * point, we use the max flash size and the lowest flash address as base.
- * 
+ *
  * After flash detection we adjust the size of the CS area accordingly.
  * The board_init_r will fill in wrong values in the board init structure,
  * but this will be fixed in the misc_init_r routine:
  * bd->bi_flashstart=0-flash_info[0].size
- * bd->bi_flashsize=flash_info[0].size-CFG_MONITOR_LEN
+ * bd->bi_flashsize=flash_info[0].size-CONFIG_SYS_MONITOR_LEN
  * bd->bi_flashoffset=0
- * 
+ *
  */
 int get_boot_mode(void)
 {
        unsigned long pbcr;
        int res = 0;
-       pbcr = mfdcr (strap);
+       pbcr = mfdcr (CPC0_PSR);
        if ((pbcr & PSR_ROM_WIDTH_MASK) == 0)
                /* boot via MPS or MPS mapping */
                res = BOOT_MPS;
@@ -125,40 +123,44 @@ void setup_cs_reloc(void)
        /* first findout on which cs the flash is */
        if(mode & BOOT_MPS) {
                /* map flash high on CS1 and MPS on CS0 */
-               mtdcr (ebccfga, pb0ap);
-               mtdcr (ebccfgd, MPS_AP);
-               mtdcr (ebccfga, pb0cr);
-               mtdcr (ebccfgd, MPS_CR);
+               mtdcr (EBC0_CFGADDR, PB0AP);
+               mtdcr (EBC0_CFGDATA, MPS_AP);
+               mtdcr (EBC0_CFGADDR, PB0CR);
+               mtdcr (EBC0_CFGDATA, MPS_CR);
                /* we use the default values (max values) for the flash
                 * because its real size is not yet known */
-               mtdcr (ebccfga, pb1ap);
-               mtdcr (ebccfgd, FLASH_AP);
-               mtdcr (ebccfga, pb1cr);
-               mtdcr (ebccfgd, FLASH_CR_B);
+               mtdcr (EBC0_CFGADDR, PB1AP);
+               mtdcr (EBC0_CFGDATA, FLASH_AP);
+               mtdcr (EBC0_CFGADDR, PB1CR);
+               mtdcr (EBC0_CFGDATA, FLASH_CR_B);
        }
        else {
                /* map flash high on CS0 and MPS on CS1 */
-               mtdcr (ebccfga, pb1ap);
-               mtdcr (ebccfgd, MPS_AP);
-               mtdcr (ebccfga, pb1cr);
-               mtdcr (ebccfgd, MPS_CR);
+               mtdcr (EBC0_CFGADDR, PB1AP);
+               mtdcr (EBC0_CFGDATA, MPS_AP);
+               mtdcr (EBC0_CFGADDR, PB1CR);
+               mtdcr (EBC0_CFGDATA, MPS_CR);
                /* we use the default values (max values) for the flash
                 * because its real size is not yet known */
-               mtdcr (ebccfga, pb0ap);
-               mtdcr (ebccfgd, FLASH_AP);
-               mtdcr (ebccfga, pb0cr);
-               mtdcr (ebccfgd, FLASH_CR_B);
+               mtdcr (EBC0_CFGADDR, PB0AP);
+               mtdcr (EBC0_CFGDATA, FLASH_AP);
+               mtdcr (EBC0_CFGADDR, PB0CR);
+               mtdcr (EBC0_CFGDATA, FLASH_CR_B);
        }
 }
 
-
+#endif /* #if !defined(CONFIG_PATI) */
 
 unsigned long flash_init (void)
 {
-       unsigned long size_b0, size_b1,flashcr, size_reg;
-       int mode, i;
+       unsigned long size_b0;
+       int i;
+
+#if !defined(CONFIG_PATI)
+       unsigned long flashcr,size_reg;
+       int mode;
        extern char version_string;
-       char *p=&version_string;
+       char *p = &version_string;
 
        /* Since we are relocated, we can set-up the CS finally */
        setup_cs_reloc();
@@ -170,14 +172,15 @@ unsigned long flash_init (void)
        else
                printf("(%s Boot) ",(mode & BOOT_MPS) ?
                        "MPS" : "Flash");
+#endif /* #if !defined(CONFIG_PATI) */
        /* 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;
        }
 
        /* Static FLASH Bank configuration here - FIXME XXX */
 
-       size_b0 = flash_get_size((vu_long *)CFG_MONITOR_BASE, &flash_info[0]);
+       size_b0 = flash_get_size((vu_long *)CONFIG_SYS_MONITOR_BASE, &flash_info[0]);
 
        if (flash_info[0].flash_id == FLASH_UNKNOWN) {
                printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
@@ -185,15 +188,15 @@ unsigned long flash_init (void)
        }
        /* protect the bootloader */
        /* Monitor protection ON by default */
-#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
+#if CONFIG_SYS_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE
        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
+#if !defined(CONFIG_PATI)
        /* protect reset vector */
        flash_info[0].protect[flash_info[0].sector_count-1] = 1;
-       size_b1 = 0 ;
        flash_info[0].size = size_b0;
        /* set up flash cs according to the size */
        size_reg=(flash_info[0].size >>20);
@@ -207,40 +210,40 @@ unsigned long flash_init (void)
                case 32: i=5; break; /* = 32MB */
                case 64: i=6; break; /* = 64MB */
                case 128: i=7; break; /*= 128MB */
-               default: 
+               default:
                        printf("\n #### ERROR, wrong size %ld MByte reset board #####\n",size_reg);
                        while(1);
        }
        if(mode & BOOT_MPS) {
                /* flash is on CS1 */
-               mtdcr(ebccfga, pb1cr);
-               flashcr = mfdcr (ebccfgd);
+               mtdcr(EBC0_CFGADDR, PB1CR);
+               flashcr = mfdcr (EBC0_CFGDATA);
                /* we map the flash high in every case */
                flashcr&=0x0001FFFF; /* mask out address bits */
                flashcr|= ((0-flash_info[0].size) & 0xFFF00000); /* start addr */
                flashcr|= (i << 17); /* size addr */
-               mtdcr(ebccfga, pb1cr);
-               mtdcr(ebccfgd, flashcr);
+               mtdcr(EBC0_CFGADDR, PB1CR);
+               mtdcr(EBC0_CFGDATA, flashcr);
        }
        else {
                /* flash is on CS0 */
-               mtdcr(ebccfga, pb0cr);
-               flashcr = mfdcr (ebccfgd);
+               mtdcr(EBC0_CFGADDR, PB0CR);
+               flashcr = mfdcr (EBC0_CFGDATA);
                /* we map the flash high in every case */
                flashcr&=0x0001FFFF; /* mask out address bits */
                flashcr|= ((0-flash_info[0].size) & 0xFFF00000); /* start addr */
                flashcr|= (i << 17); /* size addr */
-               mtdcr(ebccfga, pb0cr);
-               mtdcr(ebccfgd, flashcr);
+               mtdcr(EBC0_CFGADDR, PB0CR);
+               mtdcr(EBC0_CFGDATA, flashcr);
        }
 #if 0
-       /* enable this if you want to test if
+       /* enable this (PIP405/MIP405 only) if you want to test if
           the relocation has be done ok.
           This will disable both Chipselects */
-       mtdcr (ebccfga, pb0cr);
-       mtdcr (ebccfgd, 0L);
-       mtdcr (ebccfga, pb1cr);
-       mtdcr (ebccfgd, 0L);
+       mtdcr (EBC0_CFGADDR, PB0CR);
+       mtdcr (EBC0_CFGDATA, 0L);
+       mtdcr (EBC0_CFGADDR, PB1CR);
+       mtdcr (EBC0_CFGDATA, 0L);
        printf("CS0 & CS1 switched off for test\n");
 #endif
        /* patch version_string */
@@ -251,6 +254,15 @@ unsigned long flash_init (void)
                }
                p++;
        }
+#else /* #if !defined(CONFIG_PATI) */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+       /* ENV protection ON by default */
+       flash_protect(FLAG_PROTECT_SET,
+                     CONFIG_ENV_ADDR,
+                     CONFIG_ENV_ADDR+CONFIG_ENV_SECT_SIZE-1,
+                     &flash_info[0]);
+#endif
+#endif /* #if !defined(CONFIG_PATI) */
        return (size_b0);
 }
 
@@ -345,7 +357,7 @@ void flash_print_info  (flash_info_t *info)
 
 
 /*-----------------------------------------------------------------------
+
 */
 
 /*
@@ -385,7 +397,7 @@ static ulong flash_get_size (vu_long *addr, flash_info_t *info)
                return (0);                     /* no or unknown flash  */
        }
        value = addr2[1];                       /* device ID            */
-       /*      printf("Device value %x\n",value);                  */
+       /*      printf("Device value %x\n",value);                  */
        switch (value) {
        case (FLASH_WORD_SIZE)AMD_ID_F040B:
                info->flash_id += FLASH_AM040;
@@ -542,9 +554,9 @@ int wait_for_DQ7(flash_info_t *info, int sect)
        start = get_timer (0);
        last  = start;
        while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) {
-               if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+               if ((now = get_timer(start)) > CONFIG_SYS_FLASH_ERASE_TOUT) {
                        printf ("Timeout\n");
-                       return -1;
+                       return ERR_TIMOUT;
                }
                /* show that we're waiting */
                if ((now - last) > 1000) {  /* every second */
@@ -552,20 +564,20 @@ int wait_for_DQ7(flash_info_t *info, int sect)
                        last = now;
                }
        }
-       return 0;
+       return ERR_OK;
 }
 
 int intel_wait_for_DQ7(flash_info_t *info, int sect)
 {
-       ulong start, now, last;
+       ulong start, now, last, status;
        volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[sect]);
 
        start = get_timer (0);
        last  = start;
        while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) {
-               if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+               if ((now = get_timer(start)) > CONFIG_SYS_FLASH_ERASE_TOUT) {
                        printf ("Timeout\n");
-                       return -1;
+                       return ERR_TIMOUT;
                }
                /* show that we're waiting */
                if ((now - last) > 1000) {  /* every second */
@@ -573,8 +585,11 @@ int intel_wait_for_DQ7(flash_info_t *info, int sect)
                        last = now;
                }
        }
-       addr[0]=(FLASH_WORD_SIZE)0x00500050;
-       return 0;
+       status = addr[0] & (FLASH_WORD_SIZE)0x00280028;
+       /* clear status register */
+       addr[0] = (FLASH_WORD_SIZE)0x00500050;
+       /* check status for block erase fail and VPP low */
+       return (status == 0 ? ERR_OK : ERR_NOT_ERASED);
 }
 
 /*-----------------------------------------------------------------------
@@ -584,8 +599,8 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
 {
        volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[0]);
        volatile FLASH_WORD_SIZE *addr2;
-       int flag, prot, sect, l_sect;
-       int i;
+       int flag, prot, sect;
+       int i, rcode = 0;
 
 
        if ((s_first < 0) || (s_first > s_last)) {
@@ -616,8 +631,6 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
                printf ("\n");
        }
 
-       l_sect = -1;
-
        /* Disable interrupts which might cause a timeout here */
        flag = disable_interrupts();
 
@@ -635,7 +648,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
                                addr2[0] = (FLASH_WORD_SIZE)0x00500050;  /* block erase */
                                for (i=0; i<50; i++)
                                        udelay(1000);  /* wait 1 ms */
-                               wait_for_DQ7(info, sect);
+                               rcode |= wait_for_DQ7(info, sect);
                        }
                        else {
                                if((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL){
@@ -644,7 +657,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
                                        intel_wait_for_DQ7(info, sect);
                                        addr2[0] = (FLASH_WORD_SIZE)0x00200020;  /* sector erase */
                                        addr2[0] = (FLASH_WORD_SIZE)0x00D000D0;  /* sector erase */
-                                       intel_wait_for_DQ7(info, sect);
+                                       rcode |= intel_wait_for_DQ7(info, sect);
                                }
                                else {
                                        addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
@@ -653,10 +666,9 @@ int        flash_erase (flash_info_t *info, int s_first, int s_last)
                                        addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
                                        addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
                                        addr2[0] = (FLASH_WORD_SIZE)0x00300030;  /* sector erase */
-                                       wait_for_DQ7(info, sect);
+                                       rcode |= wait_for_DQ7(info, sect);
                                }
                        }
-                       l_sect = sect;
                        /*
                         * Wait for each sector to complete, it's more
                         * reliable.  According to AMD Spec, you must
@@ -675,22 +687,14 @@ int       flash_erase (flash_info_t *info, int s_first, int s_last)
        /* wait at least 80us - let's wait 1 ms */
        udelay (1000);
 
-#if 0
-       /*
-        * We wait for the last triggered sector
-        */
-       if (l_sect < 0)
-               goto DONE;
-       wait_for_DQ7(info, l_sect);
-
-DONE:
-#endif
        /* reset to read mode */
        addr = (FLASH_WORD_SIZE *)info->start[0];
        addr[0] = (FLASH_WORD_SIZE)0x00F000F0;  /* reset bank */
 
-       printf (" done\n");
-       return 0;
+       if (!rcode)
+           printf (" done\n");
+
+       return rcode;
 }
 
 
@@ -801,13 +805,17 @@ static FLASH_WORD_SIZE *read_val = (FLASH_WORD_SIZE *)0x200000;
 
 static int write_word (flash_info_t *info, ulong dest, ulong data)
 {
-       volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)(info->start[0]);
-       volatile FLASH_WORD_SIZE *dest2 = (FLASH_WORD_SIZE *)dest;
-       volatile FLASH_WORD_SIZE *data2 = (FLASH_WORD_SIZE *)&data;
+       volatile FLASH_WORD_SIZE *addr2 = (volatile FLASH_WORD_SIZE *)(info->start[0]);
+       volatile FLASH_WORD_SIZE *dest2 = (volatile FLASH_WORD_SIZE *)dest;
+       volatile FLASH_WORD_SIZE *data2;
        ulong start;
+       ulong *data_p;
        int flag;
        int i;
 
+       data_p = &data;
+       data2 = (volatile FLASH_WORD_SIZE *)data_p;
+
        /* Check if Flash is (sufficiently) erased */
        if ((*((volatile FLASH_WORD_SIZE *)dest) &
                (FLASH_WORD_SIZE)data) != (FLASH_WORD_SIZE)data) {
@@ -830,7 +838,7 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
                        udelay(10);
                        while ((dest2[i] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080)
                        {
-                               if (get_timer(start) > CFG_FLASH_WRITE_TOUT)
+                               if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT)
                                        return (1);
                        }
                        dest2[i] = (FLASH_WORD_SIZE)0x00FF00FF; /* return to read mode */
@@ -851,7 +859,7 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
                        start = get_timer (0);
                        while ((dest2[i] & (FLASH_WORD_SIZE)0x00800080) !=
                                (data2[i] & (FLASH_WORD_SIZE)0x00800080)) {
-                               if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+                               if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
                                        return (1);
                                }
                        }