]> git.sur5r.net Git - u-boot/blobdiff - board/mpl/common/common_util.c
[new uImage] Define a API for image handling operations
[u-boot] / board / mpl / common / common_util.c
index 17871d2a1bf57474d06427fd53e4bb32e7ab3bca..30c6ca9e30084bde6a8bb68a197ba7c1866534e7 100644 (file)
 
 #ifdef CONFIG_PIP405
 #include "../pip405/pip405.h"
-#include <405gp_pci.h>
+#include <asm/4xx_pci.h>
 #endif
 #ifdef CONFIG_MIP405
 #include "../mip405/mip405.h"
-#include <405gp_pci.h>
+#include <asm/4xx_pci.h>
 #endif
 
-extern int gunzip(void *, int, uchar *, int *);
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_PATI)
+#define FIRM_START 0xFFF00000
+#endif
+
+extern int gunzip(void *, int, uchar *, unsigned long *);
 extern int mem_test(ulong start, ulong ramsize, int quiet);
 
 #define I2C_BACKUP_ADDR 0x7C00         /* 0x200 bytes for backup */
@@ -51,24 +57,24 @@ extern int mem_test(ulong start, ulong ramsize, int quiet);
 
 extern flash_info_t flash_info[];      /* info for FLASH chips */
 
-static image_header_t header;
-
-
-static int 
+static int
 mpl_prg(uchar *src, ulong size)
 {
        ulong start;
        flash_info_t *info;
        int i, rc;
-#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
+#if defined(CONFIG_PATI)
+       int start_sect;
+#endif
+#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) || defined(CONFIG_PATI)
        char *copystr = (char *)src;
        ulong *magic = (ulong *)src;
 #endif
 
        info = &flash_info[0];
 
-#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
-       if (ntohl(magic[0]) != IH_MAGIC) {
+#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) || defined(CONFIG_PATI)
+       if (image_to_cpu (magic[0]) != IH_MAGIC) {
                puts("Bad Magic number\n");
                return -1;
        }
@@ -90,6 +96,7 @@ mpl_prg(uchar *src, ulong size)
                printf("Wrong Firmware Image: %s\n", &copystr[i]);
                return -1;
        }
+#if !defined(CONFIG_PATI)
        start = 0 - size;
        for (i = info->sector_count-1; i > 0; i--) {
                info->protect[i] = 0; /* unprotect this sector */
@@ -105,7 +112,36 @@ mpl_prg(uchar *src, ulong size)
                flash_perror(rc);
                return (1);
        }
-       
+
+#else /* #if !defined(CONFIG_PATI */
+       start = FIRM_START;
+       start_sect = -1;
+       for (i = 0; i < info->sector_count; i++) {
+               if (start < info->start[i]) {
+                       start_sect = i - 1;
+                       break;
+               }
+       }
+
+       info->protect[i - 1] = 0;       /* unprotect this sector */
+       for (; i < info->sector_count; i++) {
+               if ((start + size) < info->start[i])
+                       break;
+               info->protect[i] = 0;   /* unprotect this sector */
+       }
+
+       i--;
+       /* set-up flash location */
+       /* now erase flash */
+       printf ("Erasing at %lx to %lx (sector %d to %d) (%lx to %lx)\n",
+               start, start + size, start_sect, i,
+               info->start[start_sect], info->start[i]);
+       if ((rc = flash_erase (info, start_sect, i)) != 0) {
+               puts ("ERROR ");
+               flash_perror (rc);
+               return (1);
+       }
+#endif /* defined(CONFIG_PATI) */
 
 #elif defined(CONFIG_VCMA9)
        start = 0;
@@ -125,8 +161,9 @@ mpl_prg(uchar *src, ulong size)
        }
 
 #endif
-       printf("flash erased, programming from 0x%lx 0x%lx Bytes\n",src,size);
-       if ((rc = flash_write (src, start, size)) != 0) {
+       printf("flash erased, programming from 0x%lx 0x%lx Bytes\n",
+               (ulong)src, size);
+       if ((rc = flash_write ((char *)src, start, size)) != 0) {
                puts("ERROR ");
                flash_perror(rc);
                return (1);
@@ -136,58 +173,53 @@ mpl_prg(uchar *src, ulong size)
 }
 
 
-static int 
+static int
 mpl_prg_image(uchar *ld_addr)
 {
-       unsigned long len, checksum;
+       unsigned long len;
        uchar *data;
-       image_header_t *hdr = &header;
+       image_header_t *hdr = (image_header_t *)ld_addr;
        int rc;
-       
-       /* Copy header so we can blank CRC field for re-calculation */
-       memcpy (&header, (char *)ld_addr, sizeof(image_header_t));
-       if (ntohl(hdr->ih_magic)  != IH_MAGIC) {
+
+       if (!image_check_magic (hdr)) {
                puts("Bad Magic Number\n");
                return 1;
        }
        print_image_hdr(hdr);
-       if (hdr->ih_os  != IH_OS_U_BOOT) {
+       if (!image_check_os (hdr, IH_OS_U_BOOT)) {
                puts("No U-Boot Image\n");
                return 1;
        }
-       if (hdr->ih_type  != IH_TYPE_FIRMWARE) {
+       if (!image_check_type (hdr, IH_TYPE_FIRMWARE)) {
                puts("No Firmware Image\n");
                return 1;
        }
-       data = (uchar *)&header;
-       len  = sizeof(image_header_t);
-       checksum = ntohl(hdr->ih_hcrc);
-       hdr->ih_hcrc = 0;
-       if (crc32 (0, (char *)data, len) != checksum) {
+       if (!image_check_hcrc (hdr)) {
                puts("Bad Header Checksum\n");
                return 1;
        }
-       data = ld_addr + sizeof(image_header_t);
-       len  = ntohl(hdr->ih_size);
        puts("Verifying Checksum ... ");
-       if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {
+       if (!image_check_dcrc (hdr)) {
                puts("Bad Data CRC\n");
                return 1;
        }
        puts("OK\n");
 
-       if (hdr->ih_comp != IH_COMP_NONE) {
+       data = (uchar *)image_get_data (hdr);
+       len = image_get_data_size (hdr);
+
+       if (image_get_comp (hdr) != IH_COMP_NONE) {
                uchar *buf;
                /* reserve space for uncompressed image */
                if ((buf = malloc(IMAGE_SIZE)) == NULL) {
                        puts("Insufficient space for decompression\n");
                        return 1;
                }
-                                
-               switch (hdr->ih_comp) {
+
+               switch (image_get_comp (hdr)) {
                case IH_COMP_GZIP:
                        puts("Uncompressing (GZIP) ... ");
-                       rc = gunzip ((void *)(buf), IMAGE_SIZE, data, (int *)&len);
+                       rc = gunzip ((void *)(buf), IMAGE_SIZE, data, &len);
                        if (rc != 0) {
                                puts("GUNZIP ERROR\n");
                                free(buf);
@@ -195,7 +227,7 @@ mpl_prg_image(uchar *ld_addr)
                        }
                        puts("OK\n");
                        break;
-#if CONFIG_BZIP2
+#ifdef CONFIG_BZIP2
                case IH_COMP_BZIP2:
                        puts("Uncompressing (BZIP2) ... ");
                        {
@@ -213,21 +245,22 @@ mpl_prg_image(uchar *ld_addr)
                        break;
 #endif
                default:
-                       printf ("Unimplemented compression type %d\n", hdr->ih_comp);
+                       printf ("Unimplemented compression type %d\n",
+                               image_get_comp (hdr));
                        free(buf);
                        return 1;
                }
-               
+
                rc = mpl_prg(buf, len);
                free(buf);
        } else {
                rc = mpl_prg(data, len);
        }
-       
+
        return(rc);
 }
 
-
+#if !defined(CONFIG_PATI)
 void get_backup_values(backup_t *buf)
 {
        i2c_read(CFG_DEF_EEPROM_ADDR, I2C_BACKUP_ADDR,2,(void *)buf,sizeof(backup_t));
@@ -339,8 +372,8 @@ void copy_old_env(ulong size)
                        } while(len > off);
                        name=&name_buf[0];
                        value=&value_buf[0];
-                       if(strncmp(name,"baudrate",8)!=0) {
-                               setenv(name,value);
+                       if(strncmp((char *)name,"baudrate",8)!=0) {
+                               setenv((char *)name,(char *)value);
                        }
 
                }
@@ -350,7 +383,7 @@ void copy_old_env(ulong size)
 
 void check_env(void)
 {
-       unsigned char *s;
+       char *s;
        int i=0;
        char buf[32];
        backup_t back;
@@ -417,18 +450,21 @@ void show_stdio_dev(void)
        }
 }
 
+#endif /* #if !defined(CONFIG_PATI) */
 
 int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        ulong size,src,ld_addr;
        int result;
+#if !defined(CONFIG_PATI)
        backup_t back;
        src = MULTI_PURPOSE_SOCKET_ADDR;
        size = IMAGE_SIZE;
+#endif
 
        if (strcmp(argv[1], "flash") == 0)
        {
-#if (CONFIG_COMMANDS & CFG_CMD_FDC)
+#if defined(CONFIG_CMD_FDC)
                if (strcmp(argv[2], "floppy") == 0) {
                        char *local_args[3];
                        extern int do_fdcboot (cmd_tbl_t *, int, int, char *[]);
@@ -445,10 +481,10 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                                ld_addr=CFG_LOAD_ADDR;
                                result=do_fdcboot(cmdtp, 0, 1, local_args);
                        }
-                       result=mpl_prg_image(ld_addr);
+                       result=mpl_prg_image((uchar *)ld_addr);
                        return result;
                }
-#endif /* (CONFIG_COMMANDS & CFG_CMD_FDC) */
+#endif
                if (strcmp(argv[2], "mem") == 0) {
                        if(argc==4) {
                                ld_addr=simple_strtoul(argv[3], NULL, 16);
@@ -460,11 +496,13 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        result=mpl_prg_image((uchar *)ld_addr);
                        return result;
                }
+#if !defined(CONFIG_PATI)
                if (strcmp(argv[2], "mps") == 0) {
                        puts("\nupdating bootloader image from MPS\n");
                        result=mpl_prg((uchar *)src,size);
                        return result;
                }
+#endif /* #if !defined(CONFIG_PATI)    */
        }
        if (strcmp(argv[1], "mem") == 0)
        {
@@ -490,6 +528,7 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                }while(result);
                return 0;
        }
+#if !defined(CONFIG_PATI)
        if (strcmp(argv[1], "clearenvvalues") == 0)
        {
                if (strcmp(argv[2], "yes") == 0)
@@ -512,12 +551,13 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                set_backup_values(1);
                return 0;
        }
+#endif
        printf("Usage:\n%s\n", cmdtp->usage);
        return 1;
 }
 
 
-#if (CONFIG_COMMANDS & CFG_CMD_DOC)
+#if defined(CONFIG_CMD_DOC)
 extern void doc_probe(ulong physadr);
 void doc_init (void)
 {
@@ -540,15 +580,14 @@ extern int get_boot_mode(void);
 void video_get_info_str (int line_number, char *info)
 {
        /* init video info strings for graphic console */
-       DECLARE_GLOBAL_DATA_PTR;
-       PPC405_SYS_INFO sys_info;
+       PPC4xx_SYS_INFO sys_info;
        char rev;
        int i,boot;
        unsigned long pvr;
        char buf[64];
        char tmp[16];
        char cpustr[16];
-       unsigned char *s, *e, bc;
+       char *s, *e, bc;
        switch (line_number)
        {
        case 2: