]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - disk/part.c
merged current version of git://git.denx.de/u-boot
[karo-tx-uboot.git] / disk / part.c
index e353cee991d522a572a87c0de62c611231f5cd4f..1bd6259a1a57f143fc86725d72466b47c347f99f 100644 (file)
@@ -35,6 +35,7 @@
 #endif
 
 #if (defined(CONFIG_CMD_IDE) || \
+     defined(CONFIG_CMD_MG_DISK) || \
      defined(CONFIG_CMD_SATA) || \
      defined(CONFIG_CMD_SCSI) || \
      defined(CONFIG_CMD_USB) || \
@@ -50,6 +51,9 @@ 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
@@ -64,6 +68,9 @@ static const struct block_drvr block_drvr[] = {
 #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
        { },
 };
@@ -74,10 +81,20 @@ 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);
+       char *name;
 
+       name = drvr->name;
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+       name += gd->reloc_off;
+#endif
        while (drvr->name) {
-               reloc_get_dev = drvr->get_dev + gd->reloc_off;
-               if (strncmp(ifname, drvr->name, strlen(drvr->name)) == 0)
+               name = drvr->name;
+               reloc_get_dev = drvr->get_dev;
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+               name += gd->reloc_off;
+               reloc_get_dev += gd->reloc_off;
+#endif
+               if (strncmp(ifname, name, strlen(name)) == 0)
                        return reloc_get_dev(dev);
                drvr++;
        }
@@ -91,6 +108,8 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
 #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) || \
@@ -101,14 +120,36 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
 /*
  * reports device info to the user
  */
-void dev_print (block_dev_desc_t *dev_desc)
-{
+
 #ifdef CONFIG_LBA48
-       uint64_t lba512; /* number of blocks if 512bytes block size */
+typedef uint64_t lba512_t;
 #else
-       lbaint_t lba512;
+typedef lbaint_t lba512_t;
 #endif
 
+/*
+ * Overflowless variant of (block_count * mul_by / div_by)
+ * when div_by > mul_by
+ */
+static lba512_t lba512_muldiv (lba512_t block_count, lba512_t mul_by, lba512_t div_by)
+{
+       lba512_t bc_quot, bc_rem;
+
+       /* x * m / d == x / d * m + (x % d) * m / d */
+       bc_quot = block_count / div_by;
+       bc_rem  = block_count - div_by * bc_quot;
+       return bc_quot * mul_by + (bc_rem * mul_by) / div_by;
+}
+
+void dev_print (block_dev_desc_t *dev_desc)
+{
+       lba512_t lba512; /* number of blocks if 512bytes block size */
+
+       if (dev_desc->type == DEV_TYPE_UNKNOWN) {
+               puts ("not available\n");
+               return;
+       }
+
        switch (dev_desc->if_type) {
        case IF_TYPE_SCSI:
                printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
@@ -171,8 +212,9 @@ void dev_print (block_dev_desc_t *dev_desc)
                lba = dev_desc->lba;
 
                lba512 = (lba * (dev_desc->blksz/512));
-               mb = (10 * lba512) / 2048;      /* 2048 = (1024 * 1024) / 512 MB */
                /* round to 1 digit */
+               mb = lba512_muldiv(lba512, 10, 2048);   /* 2048 = (1024 * 1024) / 512 MB */
+
                mb_quot = mb / 10;
                mb_rem  = mb - (10 * mb_quot);
 
@@ -183,8 +225,8 @@ void dev_print (block_dev_desc_t *dev_desc)
                if (dev_desc->lba48)
                        printf ("            Supports 48-bit addressing\n");
 #endif
-#if defined(CONFIG_SYS_64BIT_LBA) && defined(CONFIG_SYS_64BIT_VSPRINTF)
-               printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%qd x %ld)\n",
+#if defined(CONFIG_SYS_64BIT_LBA)
+               printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%Ld x %ld)\n",
                        mb_quot, mb_rem,
                        gb_quot, gb_rem,
                        lba,
@@ -203,11 +245,13 @@ void dev_print (block_dev_desc_t *dev_desc)
 #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)          )
+     defined(CONFIG_SYSTEMACE) )
 
 #if defined(CONFIG_MAC_PARTITION) || \
     defined(CONFIG_DOS_PARTITION) || \
@@ -332,6 +376,9 @@ static void print_part_header (const char *type, block_dev_desc_t * dev_desc)
        case IF_TYPE_DOC:
                puts ("DOC");
                break;
+       case IF_TYPE_MMC:
+               puts ("MMC");
+               break;
        default:
                puts ("UNKNOWN");
                break;