]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/cmd_bootm.c
* Patch by Scott McNutt, 21 Jul 2003:
[people/ms/u-boot.git] / common / cmd_bootm.c
index 489fa6146132f7bc4470781fa406e09e55ee1d7b..794f0de13fb83bf9fc00ffece42df6ca0ff4dd84 100644 (file)
@@ -80,6 +80,13 @@ static void zfree(void *, void *, unsigned);
 #if (CONFIG_COMMANDS & CFG_CMD_IMI)
 static int image_info (unsigned long addr);
 #endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_IMLS)
+#include <flash.h>
+extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
+static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+#endif
+
 static void print_type (image_header_t *hdr);
 
 #ifdef __I386__
@@ -120,6 +127,10 @@ int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] );
 #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC)
 static boot_os_Fcn do_bootm_artos;
 #endif
+#ifdef CONFIG_LYNXKDI
+static boot_os_Fcn do_bootm_lynxkdi;
+extern void lynxkdi_boot( image_header_t * );
+#endif
 
 image_header_t header;
 
@@ -350,6 +361,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                             addr, len_ptr, verify);
            break;
 
+#ifdef CONFIG_LYNXKDI
+       case IH_OS_LYNXOS:
+           do_bootm_lynxkdi (cmdtp, flag, argc, argv,
+                            addr, len_ptr, verify);
+           break;
+#endif
+
        case IH_OS_RTEMS:
            do_bootm_rtems (cmdtp, flag, argc, argv,
                             addr, len_ptr, verify);
@@ -481,6 +499,10 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                kbd->bi_sccfreq /= 1000000L;
                kbd->bi_vco     /= 1000000L;
 #endif /* CONFIG_8260 */
+#if defined(CONFIG_MPC5XXXX)
+               kbd->bi_ipbfreq /= 1000000L;
+               kbd->bi_pcifreq /= 1000000L;
+#endif /* CONFIG_MPC5XXXX */
        }
 
        kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep;
@@ -957,6 +979,56 @@ U_BOOT_CMD(
 
 #endif /* CFG_CMD_IMI */
 
+#if (CONFIG_COMMANDS & CFG_CMD_IMLS)
+/*-----------------------------------------------------------------------
+ * List all images found in flash.
+ */
+int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       flash_info_t *info;
+       int i, j;
+       image_header_t *hdr;
+       ulong checksum;
+
+       for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) {
+               if (info->flash_id == FLASH_UNKNOWN)
+                       goto next_bank;
+               for (j=0; j<CFG_MAX_FLASH_SECT; ++j) {
+
+                       if (!(hdr=(image_header_t *)info->start[j]) ||
+                           (ntohl(hdr->ih_magic) != IH_MAGIC))
+                               goto next_sector;
+
+                       /* Copy header so we can blank CRC field for re-calculation */
+                       memmove (&header, (char *)hdr, sizeof(image_header_t));
+
+                       checksum = ntohl(header.ih_hcrc);
+                       header.ih_hcrc = 0;
+
+                       if (crc32 (0, (char *)&header, sizeof(image_header_t))
+                           != checksum)
+                               goto next_sector;
+
+                       printf ("Image at %08lX:\n", (ulong)hdr);
+                       print_image_hdr( hdr );
+                       putc ('\n');
+               next_sector:
+               }
+       next_bank:
+       }
+
+       return (0);
+}
+
+U_BOOT_CMD(
+       imls,   1,              1,      do_imls,
+       "imls    - list all images found in flash\n",
+       "\n"
+       "    - Prints information about all images found at sector\n"
+       "      boundaries in flash.\n"
+);
+#endif /* CFG_CMD_IMLS */
+
 void
 print_image_hdr (image_header_t *hdr)
 {
@@ -1007,6 +1079,9 @@ print_type (image_header_t *hdr)
        case IH_OS_RTEMS:       os = "RTEMS";                   break;
 #ifdef CONFIG_ARTOS
        case IH_OS_ARTOS:       os = "ARTOS";                   break;
+#endif
+#ifdef CONFIG_LYNXKDI
+       case IH_OS_LYNXOS:      os = "LynxOS";                  break;
 #endif
        default:                os = "Unknown OS";              break;
        }
@@ -1181,3 +1256,17 @@ do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        do_bootelf(cmdtp, 0, 2, local_args);
 }
 #endif /* CFG_CMD_ELF */
+
+#ifdef CONFIG_LYNXKDI
+static void
+do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,
+                int    argc, char *argv[],
+                ulong  addr,
+                ulong  *len_ptr,
+                int    verify)
+{
+       lynxkdi_boot( &header );
+}
+
+#endif /* CONFIG_LYNXKDI */
+