X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=disk%2Fpart.c;h=e31aca4877fb6cd655d3c17035e8d5649e71ad17;hb=fac379e1ea4090471c7fdbc184f83409ae4be942;hp=6a1c02d9fada7410c953cd144c2ea6968fb3a200;hpb=08ca213acadef61748dc62d48b0f5c4bed8b8c2d;p=u-boot diff --git a/disk/part.c b/disk/part.c index 6a1c02d9fa..e31aca4877 100644 --- a/disk/part.c +++ b/disk/part.c @@ -21,25 +21,38 @@ #define PRINTF(fmt,args...) #endif -DECLARE_GLOBAL_DATA_PTR; +/* Check all partition types */ +#define PART_TYPE_ALL -1 -#ifdef HAVE_BLOCK_DEVICE -static struct part_driver *part_driver_lookup_type(int part_type) +static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc) { struct part_driver *drv = ll_entry_start(struct part_driver, part_driver); const int n_ents = ll_entry_count(struct part_driver, part_driver); struct part_driver *entry; - for (entry = drv; entry != drv + n_ents; entry++) { - if (part_type == entry->part_type) - return entry; + if (dev_desc->part_type == PART_TYPE_UNKNOWN) { + for (entry = drv; entry != drv + n_ents; entry++) { + int ret; + + ret = entry->test(dev_desc); + if (!ret) { + dev_desc->part_type = entry->part_type; + return entry; + } + } + } else { + for (entry = drv; entry != drv + n_ents; entry++) { + if (dev_desc->part_type == entry->part_type) + return entry; + } } /* Not found */ return NULL; } +#ifdef CONFIG_HAVE_BLOCK_DEVICE static struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart) { struct blk_desc *dev_desc; @@ -77,7 +90,7 @@ struct blk_desc *blk_get_dev(const char *ifname, int dev) } #endif -#ifdef HAVE_BLOCK_DEVICE +#ifdef CONFIG_HAVE_BLOCK_DEVICE /* ------------------------------------------------------------------------- */ /* @@ -132,6 +145,7 @@ void dev_print (struct blk_desc *dev_desc) case IF_TYPE_SD: case IF_TYPE_MMC: case IF_TYPE_USB: + case IF_TYPE_NVME: printf ("Vendor: %s Rev: %s Prod: %s\n", dev_desc->vendor, dev_desc->revision, @@ -190,13 +204,13 @@ void dev_print (struct blk_desc *dev_desc) printf (" Supports 48-bit addressing\n"); #endif #if defined(CONFIG_SYS_64BIT_LBA) - printf (" Capacity: %ld.%ld MB = %ld.%ld GB (%Ld x %ld)\n", + printf (" Capacity: %lu.%lu MB = %lu.%lu GB (%llu x %lu)\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", + printf (" Capacity: %lu.%lu MB = %lu.%lu GB (%lu x %lu)\n", mb_quot, mb_rem, gb_quot, gb_rem, (ulong)lba, @@ -208,7 +222,7 @@ void dev_print (struct blk_desc *dev_desc) } #endif -#ifdef HAVE_BLOCK_DEVICE +#ifdef CONFIG_HAVE_BLOCK_DEVICE void part_init(struct blk_desc *dev_desc) { @@ -234,11 +248,11 @@ void part_init(struct blk_desc *dev_desc) static void print_part_header(const char *type, struct blk_desc *dev_desc) { -#if defined(CONFIG_MAC_PARTITION) || \ - defined(CONFIG_DOS_PARTITION) || \ - defined(CONFIG_ISO_PARTITION) || \ - defined(CONFIG_AMIGA_PARTITION) || \ - defined(CONFIG_EFI_PARTITION) +#if CONFIG_IS_ENABLED(MAC_PARTITION) || \ + CONFIG_IS_ENABLED(DOS_PARTITION) || \ + CONFIG_IS_ENABLED(ISO_PARTITION) || \ + CONFIG_IS_ENABLED(AMIGA_PARTITION) || \ + CONFIG_IS_ENABLED(EFI_PARTITION) puts ("\nPartition Map for "); switch (dev_desc->if_type) { case IF_TYPE_IDE: @@ -263,7 +277,10 @@ static void print_part_header(const char *type, struct blk_desc *dev_desc) puts ("MMC"); break; case IF_TYPE_HOST: - puts("HOST"); + puts ("HOST"); + break; + case IF_TYPE_NVME: + puts ("NVMe"); break; default: puts ("UNKNOWN"); @@ -278,7 +295,7 @@ void part_print(struct blk_desc *dev_desc) { struct part_driver *drv; - drv = part_driver_lookup_type(dev_desc->part_type); + drv = part_driver_lookup_type(dev_desc); if (!drv) { printf("## Unknown partition table type %x\n", dev_desc->part_type); @@ -291,15 +308,15 @@ void part_print(struct blk_desc *dev_desc) drv->print(dev_desc); } -#endif /* HAVE_BLOCK_DEVICE */ +#endif /* CONFIG_HAVE_BLOCK_DEVICE */ int part_get_info(struct blk_desc *dev_desc, int part, disk_partition_t *info) { -#ifdef HAVE_BLOCK_DEVICE +#ifdef CONFIG_HAVE_BLOCK_DEVICE struct part_driver *drv; -#ifdef CONFIG_PARTITION_UUIDS +#if CONFIG_IS_ENABLED(PARTITION_UUIDS) /* The common case is no UUID support */ info->uuid[0] = 0; #endif @@ -307,7 +324,7 @@ int part_get_info(struct blk_desc *dev_desc, int part, info->type_guid[0] = 0; #endif - drv = part_driver_lookup_type(dev_desc->part_type); + drv = part_driver_lookup_type(dev_desc); if (!drv) { debug("## Unknown partition table type %x\n", dev_desc->part_type); @@ -322,11 +339,29 @@ int part_get_info(struct blk_desc *dev_desc, int part, PRINTF("## Valid %s partition found ##\n", drv->name); return 0; } -#endif /* HAVE_BLOCK_DEVICE */ +#endif /* CONFIG_HAVE_BLOCK_DEVICE */ return -1; } +int part_get_info_whole_disk(struct blk_desc *dev_desc, disk_partition_t *info) +{ + info->start = 0; + info->size = dev_desc->lba; + info->blksz = dev_desc->blksz; + info->bootable = 0; + strcpy((char *)info->type, BOOT_PART_TYPE); + strcpy((char *)info->name, "Whole Disk"); +#if CONFIG_IS_ENABLED(PARTITION_UUIDS) + info->uuid[0] = 0; +#endif +#ifdef CONFIG_PARTITION_TYPE_GUID + info->type_guid[0] = 0; +#endif + + return 0; +} + int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str, struct blk_desc **dev_desc) { @@ -371,7 +406,7 @@ int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str, goto cleanup; } -#ifdef HAVE_BLOCK_DEVICE +#ifdef CONFIG_HAVE_BLOCK_DEVICE /* * Updates the partition table for the specified hw partition. * Does not need to be done for hwpart 0 since it is default and @@ -388,7 +423,6 @@ cleanup: #define PART_UNSPECIFIED -2 #define PART_AUTO -1 -#define MAX_SEARCH_PARTITIONS 16 int blk_get_device_part_str(const char *ifname, const char *dev_part_str, struct blk_desc **dev_desc, disk_partition_t *info, int allow_whole_dev) @@ -416,7 +450,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, info->bootable = 0; strcpy((char *)info->type, BOOT_PART_TYPE); strcpy((char *)info->name, "Sandbox host"); -#ifdef CONFIG_PARTITION_UUIDS +#if CONFIG_IS_ENABLED(PARTITION_UUIDS) info->uuid[0] = 0; #endif #ifdef CONFIG_PARTITION_TYPE_GUID @@ -442,7 +476,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, memset(info, 0, sizeof(*info)); strcpy((char *)info->type, BOOT_PART_TYPE); strcpy((char *)info->name, "UBI"); -#ifdef CONFIG_PARTITION_UUIDS +#if CONFIG_IS_ENABLED(PARTITION_UUIDS) info->uuid[0] = 0; #endif return 0; @@ -452,7 +486,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, /* If no dev_part_str, use bootdevice environment variable */ if (!dev_part_str || !strlen(dev_part_str) || !strcmp(dev_part_str, "-")) - dev_part_str = getenv("bootdevice"); + dev_part_str = env_get("bootdevice"); /* If still no dev_part_str, it's an error */ if (!dev_part_str) { @@ -520,18 +554,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str, (*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz); - info->start = 0; - info->size = (*dev_desc)->lba; - info->blksz = (*dev_desc)->blksz; - info->bootable = 0; - strcpy((char *)info->type, BOOT_PART_TYPE); - strcpy((char *)info->name, "Whole Disk"); -#ifdef CONFIG_PARTITION_UUIDS - info->uuid[0] = 0; -#endif -#ifdef CONFIG_PARTITION_TYPE_GUID - info->type_guid[0] = 0; -#endif + part_get_info_whole_disk(*dev_desc, info); ret = 0; goto cleanup; @@ -615,3 +638,66 @@ cleanup: free(dup_str); return ret; } + +int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name, + disk_partition_t *info, int part_type) +{ + struct part_driver *part_drv; + int ret; + int i; + + part_drv = part_driver_lookup_type(dev_desc); + if (!part_drv) + return -1; + for (i = 1; i < part_drv->max_entries; i++) { + ret = part_drv->get_info(dev_desc, i, info); + if (ret != 0) { + /* no more entries in table */ + break; + } + if (strcmp(name, (const char *)info->name) == 0) { + /* matched */ + return i; + } + } + + return -1; +} + +int part_get_info_by_name(struct blk_desc *dev_desc, const char *name, + disk_partition_t *info) +{ + return part_get_info_by_name_type(dev_desc, name, info, PART_TYPE_ALL); +} + +void part_set_generic_name(const struct blk_desc *dev_desc, + int part_num, char *name) +{ + char *devtype; + + switch (dev_desc->if_type) { + case IF_TYPE_IDE: + case IF_TYPE_SATA: + case IF_TYPE_ATAPI: + devtype = "hd"; + break; + case IF_TYPE_SCSI: + devtype = "sd"; + break; + case IF_TYPE_USB: + devtype = "usbd"; + break; + case IF_TYPE_DOC: + devtype = "docd"; + break; + case IF_TYPE_MMC: + case IF_TYPE_SD: + devtype = "mmcsd"; + break; + default: + devtype = "xx"; + break; + } + + sprintf(name, "%s%c%d", devtype, 'a' + dev_desc->devnum, part_num); +}