]> git.sur5r.net Git - u-boot/blobdiff - disk/part.c
disk/part: introduce get_device_and_partition
[u-boot] / disk / part.c
index 2b63db6c75f00f1b951f9bbf28dcbaab72929f82..f0afd89553345b974c828bde34425da61c9ee9ef 100644 (file)
@@ -35,7 +35,6 @@
 #endif
 
 #if (defined(CONFIG_CMD_IDE) || \
-     defined(CONFIG_CMD_MG_DISK) || \
      defined(CONFIG_CMD_SATA) || \
      defined(CONFIG_CMD_SCSI) || \
      defined(CONFIG_CMD_USB) || \
@@ -65,29 +64,29 @@ 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
        { },
 };
 
 DECLARE_GLOBAL_DATA_PTR;
 
-block_dev_desc_t *get_dev(char* ifname, int dev)
+block_dev_desc_t *get_dev(const char *ifname, int dev)
 {
        const struct block_drvr *drvr = block_drvr;
        block_dev_desc_t* (*reloc_get_dev)(int dev);
        char *name;
 
+       if (!ifname)
+               return NULL;
+
        name = drvr->name;
-#ifndef CONFIG_RELOC_FIXUP_WORKS
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
        name += gd->reloc_off;
 #endif
-       while (name) {
+       while (drvr->name) {
                name = drvr->name;
                reloc_get_dev = drvr->get_dev;
-#ifndef CONFIG_RELOC_FIXUP_WORKS
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
                name += gd->reloc_off;
                reloc_get_dev += gd->reloc_off;
 #endif
@@ -98,14 +97,13 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
        return NULL;
 }
 #else
-block_dev_desc_t *get_dev(char* ifname, int dev)
+block_dev_desc_t *get_dev(const char *ifname, int dev)
 {
        return NULL;
 }
 #endif
 
 #if (defined(CONFIG_CMD_IDE) || \
-     defined(CONFIG_CMD_MG_DISK) || \
      defined(CONFIG_CMD_SATA) || \
      defined(CONFIG_CMD_SCSI) || \
      defined(CONFIG_CMD_USB) || \
@@ -241,7 +239,6 @@ void dev_print (block_dev_desc_t *dev_desc)
 #endif
 
 #if (defined(CONFIG_CMD_IDE) || \
-     defined(CONFIG_CMD_MG_DISK) || \
      defined(CONFIG_CMD_SATA) || \
      defined(CONFIG_CMD_SCSI) || \
      defined(CONFIG_CMD_USB) || \
@@ -291,64 +288,10 @@ void init_part (block_dev_desc_t * dev_desc)
            return;
        }
 #endif
+       dev_desc->part_type = PART_TYPE_UNKNOWN;
 }
 
 
-int get_partition_info (block_dev_desc_t *dev_desc, int part
-                                       , disk_partition_t *info)
-{
-       switch (dev_desc->part_type) {
-#ifdef CONFIG_MAC_PARTITION
-       case PART_TYPE_MAC:
-               if (get_partition_info_mac(dev_desc,part,info) == 0) {
-                       PRINTF ("## Valid MAC partition found ##\n");
-                       return (0);
-               }
-               break;
-#endif
-
-#ifdef CONFIG_DOS_PARTITION
-       case PART_TYPE_DOS:
-               if (get_partition_info_dos(dev_desc,part,info) == 0) {
-                       PRINTF ("## Valid DOS partition found ##\n");
-                       return (0);
-               }
-               break;
-#endif
-
-#ifdef CONFIG_ISO_PARTITION
-       case PART_TYPE_ISO:
-               if (get_partition_info_iso(dev_desc,part,info) == 0) {
-                       PRINTF ("## Valid ISO boot partition found ##\n");
-                       return (0);
-               }
-               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
-
-#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;
-       }
-       return (-1);
-}
-
 static void print_part_header (const char *type, block_dev_desc_t * dev_desc)
 {
        puts ("\nPartition Map for ");
@@ -436,3 +379,130 @@ void print_part (block_dev_desc_t * dev_desc)
 #endif
 
 #endif
+
+int get_partition_info(block_dev_desc_t *dev_desc, int part
+                                       , disk_partition_t *info)
+{
+#if defined(CONFIG_CMD_IDE) || \
+       defined(CONFIG_CMD_SATA) || \
+       defined(CONFIG_CMD_SCSI) || \
+       defined(CONFIG_CMD_USB) || \
+       defined(CONFIG_MMC) || \
+       defined(CONFIG_SYSTEMACE)
+
+       switch (dev_desc->part_type) {
+#ifdef CONFIG_MAC_PARTITION
+       case PART_TYPE_MAC:
+               if (get_partition_info_mac(dev_desc, part, info) == 0) {
+                       PRINTF("## Valid MAC partition found ##\n");
+                       return 0;
+               }
+               break;
+#endif
+
+#ifdef CONFIG_DOS_PARTITION
+       case PART_TYPE_DOS:
+               if (get_partition_info_dos(dev_desc, part, info) == 0) {
+                       PRINTF("## Valid DOS partition found ##\n");
+                       return 0;
+               }
+               break;
+#endif
+
+#ifdef CONFIG_ISO_PARTITION
+       case PART_TYPE_ISO:
+               if (get_partition_info_iso(dev_desc, part, info) == 0) {
+                       PRINTF("## Valid ISO boot partition found ##\n");
+                       return 0;
+               }
+               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
+
+#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;
+       }
+#endif
+
+       return -1;
+}
+
+int get_device_and_partition(const char *ifname, const char *dev_str,
+                            block_dev_desc_t **dev_desc,
+                            disk_partition_t *info)
+{
+       int ret;
+       char *ep;
+       int dev;
+       block_dev_desc_t *desc;
+       int part = 0;
+       char *part_str;
+
+       if (dev_str)
+               dev = simple_strtoul(dev_str, &ep, 16);
+
+       if (!dev_str || (dev_str == ep)) {
+               dev_str = getenv("bootdevice");
+               if (dev_str)
+                       dev = simple_strtoul(dev_str, &ep, 16);
+               if (!dev_str || (dev_str == ep))
+                       goto err;
+       }
+
+       desc = get_dev(ifname, dev);
+       if (!desc || (desc->type == DEV_TYPE_UNKNOWN))
+               goto err;
+
+       if (desc->part_type == PART_TYPE_UNKNOWN) {
+               /* disk doesn't use partition table */
+               if (!desc->lba) {
+                       printf("**Bad disk size - %s %d:0 **\n", ifname, dev);
+                       return -1;
+               }
+               info->start = 0;
+               info->size = desc->lba;
+               info->blksz = desc->blksz;
+
+               *dev_desc = desc;
+               return 0;
+       }
+
+       part_str = strchr(dev_str, ':');
+       if (part_str)
+               part = (int)simple_strtoul(++part_str, NULL, 16);
+
+       ret = get_partition_info(desc, part, info);
+       if (ret) {
+               printf("** Invalid partition %d, use `dev[:part]' **\n", part);
+               return -1;
+       }
+       if (strncmp((char *)info->type, BOOT_PART_TYPE, sizeof(info->type)) != 0) {
+               printf("** Invalid partition type \"%.32s\""
+                       " (expect \"" BOOT_PART_TYPE "\")\n",
+                       info->type);
+               return -1;
+       }
+
+       *dev_desc = desc;
+       return part;
+
+err:
+       puts("** Invalid boot device, use `dev[:part]' **\n");
+       return -1;
+}