]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
disk: part: Add API to get partitions with specific driver
authorJoshua Watt <jpewhacker@gmail.com>
Mon, 3 Jul 2023 13:39:54 +0000 (08:39 -0500)
committerTom Rini <trini@konsulko.com>
Mon, 17 Jul 2023 19:39:55 +0000 (15:39 -0400)
Adds part_driver_get_type() API which can be used to force a specific
driver to be used when getting partition information instead of relying
on auto detection.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
disk/part.c
include/part.h

index 1d2117ab71ee960967c574e0e99f11c31c92bab8..0a03b8213d8fee053fcd650f5754be633d201b96 100644 (file)
 /* Check all partition types */
 #define PART_TYPE_ALL          -1
 
+static struct part_driver *part_driver_get_type(int part_type)
+{
+       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;
+       }
+
+       /* Not found */
+       return NULL;
+}
+
 static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
 {
        struct part_driver *drv =
@@ -44,10 +60,7 @@ static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
                        }
                }
        } else {
-               for (entry = drv; entry != drv + n_ents; entry++) {
-                       if (dev_desc->part_type == entry->part_type)
-                               return entry;
-               }
+               return part_driver_get_type(dev_desc->part_type);
        }
 
        /* Not found */
@@ -322,8 +335,8 @@ void part_print(struct blk_desc *dev_desc)
                drv->print(dev_desc);
 }
 
-int part_get_info(struct blk_desc *dev_desc, int part,
-                      struct disk_partition *info)
+int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
+                         struct disk_partition *info)
 {
        struct part_driver *drv;
 
@@ -336,7 +349,12 @@ int part_get_info(struct blk_desc *dev_desc, int part,
                info->type_guid[0] = 0;
 #endif
 
-               drv = part_driver_lookup_type(dev_desc);
+               if (part_type == PART_TYPE_UNKNOWN) {
+                       drv = part_driver_lookup_type(dev_desc);
+               } else {
+                       drv = part_driver_get_type(part_type);
+               }
+
                if (!drv) {
                        debug("## Unknown partition table type %x\n",
                              dev_desc->part_type);
@@ -356,6 +374,12 @@ int part_get_info(struct blk_desc *dev_desc, int part,
        return -ENOENT;
 }
 
+int part_get_info(struct blk_desc *dev_desc, int part,
+                 struct disk_partition *info)
+{
+       return part_get_info_by_type(dev_desc, part, PART_TYPE_UNKNOWN, info);
+}
+
 int part_get_info_whole_disk(struct blk_desc *dev_desc,
                             struct disk_partition *info)
 {
index 3b1b5398699ca213892443943fdd29c01694e3cd..b19b33ab89a8c3ac60b01786ba72f748ba6877d3 100644 (file)
@@ -105,7 +105,24 @@ struct blk_desc *blk_get_dev(const char *ifname, int dev);
 
 struct blk_desc *mg_disk_get_dev(int dev);
 
-/* disk/part.c */
+/**
+ * part_get_info_by_type() - Get partitions from a block device using a specific
+ * partition driver
+ *
+ * Each interface allocates its own devices and typically struct blk_desc is
+ * contained with the interface's data structure. There is no global
+ * numbering for block devices, so the interface name must be provided.
+ *
+ * @dev_desc:  Block device descriptor
+ * @part:      Partition number to read
+ * @part_type: Partition driver to use, or PART_TYPE_UNKNOWN to automatically
+ *             choose a driver
+ * @info:      Returned partition information
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
+                         struct disk_partition *info);
 int part_get_info(struct blk_desc *dev_desc, int part,
                  struct disk_partition *info);
 /**