]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - disk/part.c
imported Ka-Ro specific additions to U-Boot 2009.08 for TX28
[karo-tx-uboot.git] / disk / part.c
index 2255e726cf5c687994e7e7d7c138413bc2acd374..139a923cfa52e81ab7c4723e17f7b534a66c2839 100755 (executable)
@@ -24,6 +24,7 @@
 #include <common.h>
 #include <command.h>
 #include <ide.h>
+#include <part.h>
 
 #undef PART_DEBUG
 
 #define PRINTF(fmt,args...)
 #endif
 
-#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
-     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
-     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+#if (defined(CONFIG_CMD_IDE) || \
+     defined(CONFIG_CMD_MG_DISK) || \
+     defined(CONFIG_CMD_SATA) || \
+     defined(CONFIG_CMD_SCSI) || \
+     defined(CONFIG_CMD_USB) || \
+     defined(CONFIG_MMC) || \
+     defined(CONFIG_SYSTEMACE) )
+
+struct block_drvr {
+       char *name;
+       block_dev_desc_t* (*get_dev)(int dev);
+};
+
+static const struct block_drvr block_drvr[] = {
+#if defined(CONFIG_CMD_IDE)
+       { .name = "ide", .get_dev = ide_get_dev, },
+#endif
+#if defined(CONFIG_CMD_PATA)
+       { .name = "pata", .get_dev = pata_get_dev, },
+#endif
+#if defined(CONFIG_CMD_SATA)
+       {.name = "sata", .get_dev = sata_get_dev, },
+#endif
+#if defined(CONFIG_CMD_SCSI)
+       { .name = "scsi", .get_dev = scsi_get_dev, },
+#endif
+#if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
+       { .name = "usb", .get_dev = usb_stor_get_dev, },
+#endif
+#if defined(CONFIG_MMC)
+       { .name = "mmc", .get_dev = mmc_get_dev, },
+#endif
+#if defined(CONFIG_SYSTEMACE)
+       { .name = "ace", .get_dev = systemace_get_dev, },
+#endif
+#if defined(CONFIG_CMD_MG_DISK)
+       { .name = "mgd", .get_dev = mg_disk_get_dev, },
+#endif
+       { },
+};
+
+DECLARE_GLOBAL_DATA_PTR;
+
+block_dev_desc_t *get_dev(char* ifname, int dev)
+{
+       const struct block_drvr *drvr = block_drvr;
+       block_dev_desc_t* (*reloc_get_dev)(int dev);
+
+       while (drvr->name) {
+               reloc_get_dev = drvr->get_dev + gd->reloc_off;
+               if (strncmp(ifname, drvr->name, strlen(drvr->name)) == 0)
+                       return reloc_get_dev(dev);
+               drvr++;
+       }
+       return NULL;
+}
+#else
+block_dev_desc_t *get_dev(char* ifname, int dev)
+{
+       return NULL;
+}
+#endif
+
+#if (defined(CONFIG_CMD_IDE) || \
+       defined(CONFIG_CMD_PATA) || \
+     defined(CONFIG_CMD_MG_DISK) || \
+     defined(CONFIG_CMD_SATA) || \
+     defined(CONFIG_CMD_SCSI) || \
+     defined(CONFIG_CMD_USB) || \
      defined(CONFIG_MMC) || \
      defined(CONFIG_SYSTEMACE) )
 
@@ -51,38 +118,64 @@ void dev_print (block_dev_desc_t *dev_desc)
        lbaint_t lba512;
 #endif
 
-       if (dev_desc->type==DEV_TYPE_UNKNOWN) {
+       if (dev_desc->type == DEV_TYPE_UNKNOWN) {
                puts ("not available\n");
                return;
        }
-       if (dev_desc->if_type==IF_TYPE_SCSI)  {
-               printf ("(%d:%d) ", dev_desc->target,dev_desc->lun);
-       }
-       if (dev_desc->if_type==IF_TYPE_IDE) {
+
+       switch (dev_desc->if_type) {
+       case IF_TYPE_SCSI:
+               printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
+                       dev_desc->target,dev_desc->lun,
+                       dev_desc->vendor,
+                       dev_desc->product,
+                       dev_desc->revision);
+               break;
+       case IF_TYPE_ATAPI:
+       case IF_TYPE_IDE:
+       case IF_TYPE_SATA:
                printf ("Model: %s Firm: %s Ser#: %s\n",
                        dev_desc->vendor,
                        dev_desc->revision,
                        dev_desc->product);
-       } else {
-               printf ("Vendor: %s Prod.: %s Rev: %s\n",
+               break;
+       case IF_TYPE_SD:
+       case IF_TYPE_MMC:
+       case IF_TYPE_USB:
+               printf ("Vendor: %s Rev: %s Prod: %s\n",
                        dev_desc->vendor,
-                       dev_desc->product,
-                       dev_desc->revision);
+                       dev_desc->revision,
+                       dev_desc->product);
+               break;
+       case IF_TYPE_DOC:
+               puts("device type DOC\n");
+               return;
+       case IF_TYPE_UNKNOWN:
+               puts("device type unknown\n");
+               return;
+       default:
+               printf("Unhandled device type: %i\n", dev_desc->if_type);
+               return;
        }
        puts ("            Type: ");
        if (dev_desc->removable)
                puts ("Removable ");
        switch (dev_desc->type & 0x1F) {
-               case DEV_TYPE_HARDDISK: puts ("Hard Disk");
-                                       break;
-               case DEV_TYPE_CDROM:    puts ("CD ROM");
-                                       break;
-               case DEV_TYPE_OPDISK:   puts ("Optical Device");
-                                       break;
-               case DEV_TYPE_TAPE:     puts ("Tape");
-                                       break;
-               default:                printf ("# %02X #", dev_desc->type & 0x1F);
-                                       break;
+       case DEV_TYPE_HARDDISK:
+               puts ("Hard Disk");
+               break;
+       case DEV_TYPE_CDROM:
+               puts ("CD ROM");
+               break;
+       case DEV_TYPE_OPDISK:
+               puts ("Optical Device");
+               break;
+       case DEV_TYPE_TAPE:
+               puts ("Tape");
+               break;
+       default:
+               printf ("# %02X #", dev_desc->type & 0x1F);
+               break;
        }
        puts ("\n");
        if ((dev_desc->lba * dev_desc->blksz)>0L) {
@@ -104,8 +197,8 @@ void dev_print (block_dev_desc_t *dev_desc)
                if (dev_desc->lba48)
                        printf ("            Supports 48-bit addressing\n");
 #endif
-#if defined(CFG_64BIT_LBA) && defined(CFG_64BIT_VSPRINTF)
-               printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%qd x %ld)\n",
+#if defined(CONFIG_SYS_64BIT_LBA) && defined(CONFIG_SYS_64BIT_VSPRINTF)
+               printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%Ld x %ld)\n",
                        mb_quot, mb_rem,
                        gb_quot, gb_rem,
                        lba,
@@ -121,17 +214,22 @@ void dev_print (block_dev_desc_t *dev_desc)
                puts ("            Capacity: not available\n");
        }
 }
-#endif /* CFG_CMD_IDE || CFG_CMD_SCSI || CFG_CMD_USB || CONFIG_MMC */
+#endif
 
-#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
-     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
-     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
-     defined(CONFIG_SYSTEMACE)          )
+#if (defined(CONFIG_CMD_IDE) || \
+       defined(CONFIG_CMD_PATA) || \
+     defined(CONFIG_CMD_MG_DISK) || \
+     defined(CONFIG_CMD_SATA) || \
+     defined(CONFIG_CMD_SCSI) || \
+     defined(CONFIG_CMD_USB) || \
+     defined(CONFIG_MMC)               || \
+     defined(CONFIG_SYSTEMACE) )
 
 #if defined(CONFIG_MAC_PARTITION) || \
     defined(CONFIG_DOS_PARTITION) || \
     defined(CONFIG_ISO_PARTITION) || \
-    defined(CONFIG_AMIGA_PARTITION)
+    defined(CONFIG_AMIGA_PARTITION) || \
+    defined(CONFIG_EFI_PARTITION)
 
 void init_part (block_dev_desc_t * dev_desc)
 {
@@ -149,6 +247,14 @@ void init_part (block_dev_desc_t * dev_desc)
        }
 #endif
 
+/* must be placed before DOS partition detection */
+#ifdef CONFIG_EFI_PARTITION
+       if (test_part_efi(dev_desc) == 0) {
+               dev_desc->part_type = PART_TYPE_EFI;
+               return;
+       }
+#endif
+
 #ifdef CONFIG_DOS_PARTITION
        if (test_part_dos(dev_desc) == 0) {
                dev_desc->part_type = PART_TYPE_DOS;
@@ -165,9 +271,10 @@ void init_part (block_dev_desc_t * dev_desc)
 }
 
 
-int get_partition_info (block_dev_desc_t *dev_desc, int part, disk_partition_t *info)
+int get_partition_info (block_dev_desc_t *dev_desc, int part
+                                       , disk_partition_t *info)
 {
-               switch (dev_desc->part_type) {
+       switch (dev_desc->part_type) {
 #ifdef CONFIG_MAC_PARTITION
        case PART_TYPE_MAC:
                if (get_partition_info_mac(dev_desc,part,info) == 0) {
@@ -204,6 +311,15 @@ int get_partition_info (block_dev_desc_t *dev_desc, int part, disk_partition_t *
            }
            break;
 #endif
+
+#ifdef CONFIG_EFI_PARTITION
+       case PART_TYPE_EFI:
+               if (get_partition_info_efi(dev_desc,part,info) == 0) {
+                       PRINTF ("## Valid EFI partition found ##\n");
+                       return (0);
+               }
+               break;
+#endif
        default:
                break;
        }
@@ -214,18 +330,27 @@ static void print_part_header (const char *type, block_dev_desc_t * dev_desc)
 {
        puts ("\nPartition Map for ");
        switch (dev_desc->if_type) {
-               case IF_TYPE_IDE:       puts ("IDE");
-                                       break;
-               case IF_TYPE_SCSI:      puts ("SCSI");
-                                       break;
-               case IF_TYPE_ATAPI:     puts ("ATAPI");
-                                       break;
-               case IF_TYPE_USB:       puts ("USB");
-                                       break;
-               case IF_TYPE_DOC:       puts ("DOC");
-                                       break;
-               default:                puts ("UNKNOWN");
-                                       break;
+       case IF_TYPE_IDE:
+               puts ("IDE");
+               break;
+       case IF_TYPE_SATA:
+               puts ("SATA");
+               break;
+       case IF_TYPE_SCSI:
+               puts ("SCSI");
+               break;
+       case IF_TYPE_ATAPI:
+               puts ("ATAPI");
+               break;
+       case IF_TYPE_USB:
+               puts ("USB");
+               break;
+       case IF_TYPE_DOC:
+               puts ("DOC");
+               break;
+       default:
+               puts ("UNKNOWN");
+               break;
        }
        printf (" device %d  --   Partition Type: %s\n\n",
                        dev_desc->dev, type);
@@ -265,13 +390,23 @@ void print_part (block_dev_desc_t * dev_desc)
            print_part_amiga (dev_desc);
            return;
 #endif
+
+#ifdef CONFIG_EFI_PARTITION
+       case PART_TYPE_EFI:
+               PRINTF ("## Testing for valid EFI partition ##\n");
+               print_part_header ("EFI", dev_desc);
+               print_part_efi (dev_desc);
+               return;
+#endif
        }
        puts ("## Unknown partition table\n");
 }
 
 
-#else  /* neither MAC nor DOS nor ISO partition configured */
-# error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION nor CONFIG_ISO_PARTITION configured!
+#else  /* neither MAC nor DOS nor ISO nor AMIGA nor EFI partition configured */
+# error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION
+# error nor CONFIG_ISO_PARTITION nor CONFIG_AMIGA_PARTITION
+# error nor CONFIG_EFI_PARTITION configured!
 #endif
 
-#endif /* (CONFIG_COMMANDS & CFG_CMD_IDE) || CONFIG_COMMANDS & CFG_CMD_SCSI) */
+#endif