]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - disk/part.c
Merge with git://www.denx.de/git/u-boot.git
[karo-tx-uboot.git] / disk / part.c
index 99fe0db9fa78081a9b711f76c198601d321b40f8..acc1a748e44e524ea65848470188dca833f2df4d 100644 (file)
@@ -24,7 +24,7 @@
 #include <common.h>
 #include <command.h>
 #include <ide.h>
-#include <cmd_disk.h>
+#include <part.h>
 
 #undef PART_DEBUG
 
 #define PRINTF(fmt,args...)
 #endif
 
-#if (CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI)
+#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
+     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
+     (CONFIG_COMMANDS & CFG_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 (CONFIG_COMMANDS & CFG_CMD_IDE)
+       { .name = "ide", .get_dev = ide_get_dev, },
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
+       { .name = "scsi", .get_dev = scsi_get_dev, },
+#endif
+#if ((CONFIG_COMMANDS & CFG_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
+       { },
+};
+
+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 ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
+     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
+     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+     defined(CONFIG_MMC) || \
+     defined(CONFIG_SYSTEMACE) )
 
 /* ------------------------------------------------------------------------- */
 /*
  */
 void dev_print (block_dev_desc_t *dev_desc)
 {
-       ulong lba512; /* number of blocks if 512bytes block size */
+#ifdef CONFIG_LBA48
+       uint64_t lba512; /* number of blocks if 512bytes block size */
+#else
+       lbaint_t lba512;
+#endif
 
        if (dev_desc->type==DEV_TYPE_UNKNOWN) {
                puts ("not available\n");
@@ -80,9 +140,11 @@ void dev_print (block_dev_desc_t *dev_desc)
        puts ("\n");
        if ((dev_desc->lba * dev_desc->blksz)>0L) {
                ulong mb, mb_quot, mb_rem, gb, gb_quot, gb_rem;
+               lbaint_t lba;
 
-               lba512 = (dev_desc->lba * (dev_desc->blksz/512));
+               lba = dev_desc->lba;
 
+               lba512 = (lba * (dev_desc->blksz/512));
                mb = (10 * lba512) / 2048;      /* 2048 = (1024 * 1024) / 512 MB */
                /* round to 1 digit */
                mb_quot = mb / 10;
@@ -91,22 +153,39 @@ void dev_print (block_dev_desc_t *dev_desc)
                gb = mb / 1024;
                gb_quot = gb / 10;
                gb_rem  = gb - (10 * gb_quot);
-
+#ifdef CONFIG_LBA48
+               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",
+                       mb_quot, mb_rem,
+                       gb_quot, gb_rem,
+                       lba,
+                       dev_desc->blksz);
+#else
                printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%ld x %ld)\n",
                        mb_quot, mb_rem,
                        gb_quot, gb_rem,
-                       dev_desc->lba,
+                       (ulong)lba,
                        dev_desc->blksz);
+#endif
        } else {
                puts ("            Capacity: not available\n");
        }
 }
+#endif /* CFG_CMD_IDE || CFG_CMD_SCSI || CFG_CMD_USB || CONFIG_MMC */
 
-
+#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
+     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
+     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+     defined(CONFIG_MMC)               || \
+     defined(CONFIG_SYSTEMACE)          )
 
 #if defined(CONFIG_MAC_PARTITION) || \
     defined(CONFIG_DOS_PARTITION) || \
-    defined(CONFIG_ISO_PARTITION)
+    defined(CONFIG_ISO_PARTITION) || \
+    defined(CONFIG_AMIGA_PARTITION)
 
 void init_part (block_dev_desc_t * dev_desc)
 {
@@ -130,6 +209,13 @@ void init_part (block_dev_desc_t * dev_desc)
                return;
        }
 #endif
+
+#ifdef CONFIG_AMIGA_PARTITION
+       if (test_part_amiga(dev_desc) == 0) {
+           dev_desc->part_type = PART_TYPE_AMIGA;
+           return;
+       }
+#endif
 }
 
 
@@ -162,6 +248,16 @@ int get_partition_info (block_dev_desc_t *dev_desc, int part, disk_partition_t *
                }
                break;
 #endif
+
+#ifdef CONFIG_AMIGA_PARTITION
+       case PART_TYPE_AMIGA:
+           if (get_partition_info_amiga(dev_desc, part, info) == 0)
+           {
+               PRINTF ("## Valid Amiga partition found ##\n");
+               return (0);
+           }
+           break;
+#endif
        default:
                break;
        }
@@ -215,6 +311,14 @@ void print_part (block_dev_desc_t * dev_desc)
                print_part_iso (dev_desc);
                return;
 #endif
+
+#ifdef CONFIG_AMIGA_PARTITION
+       case PART_TYPE_AMIGA:
+           PRINTF ("## Testing for a valid Amiga partition ##\n");
+           print_part_header ("AMIGA", dev_desc);
+           print_part_amiga (dev_desc);
+           return;
+#endif
        }
        puts ("## Unknown partition table\n");
 }