[PATCH 13/38] part: Allow setting the partition-table type

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Mar 31 00:27:55 CEST 2023



Am 30. März 2023 23:32:02 MESZ schrieb Simon Glass <sjg at chromium.org>:
>Some devices have multiple partition types available on the same media.
>It is sometimes useful to see these to check that everything is working
>correctly.
>
>Provide a way to manually set the partition-table type, avoiding the
>auto-detection process.

Do you have an example image where we get it wrong?

Linux does not need that. What is different in our  table type  priorities to Linux?

I am not yet convinced we need to set this manually.

Best regards

Heinrich 


>
>Signed-off-by: Simon Glass <sjg at chromium.org>
>---
>
> cmd/part.c             | 34 +++++++++++++++++++
> disk/part.c            | 16 +++++++++
> doc/usage/cmd/part.rst | 74 ++++++++++++++++++++++++++++++++++++++++++
> include/part.h         |  9 +++++
> 4 files changed, 133 insertions(+)
>
>diff --git a/cmd/part.c b/cmd/part.c
>index 28f2b7ff9bbe..0ce190005d32 100644
>--- a/cmd/part.c
>+++ b/cmd/part.c
>@@ -182,6 +182,36 @@ static int do_part_number(int argc, char *const argv[])
> 	return do_part_info(argc, argv, CMD_PART_INFO_NUMBER);
> }
> 
>+static int do_part_set(int argc, char *const argv[])
>+{
>+	const char *devname, *partstr, *typestr;
>+	struct blk_desc *desc;
>+	int dev;
>+
>+	if (argc < 3)
>+		return CMD_RET_USAGE;
>+
>+	/* Look up the device */
>+	devname = argv[0];
>+	partstr = argv[1];
>+	typestr = argv[2];
>+	dev = blk_get_device_by_str(devname, partstr, &desc);
>+	if (dev < 0) {
>+		printf("** Bad device specification %s %s **\n", devname,
>+		       partstr);
>+		return CMD_RET_FAILURE;
>+	}
>+
>+	desc->part_type = part_get_type_by_name(typestr);
>+	if (!desc->part_type) {
>+		printf("Unknown partition type '%s'\n", typestr);
>+		return CMD_RET_FAILURE;
>+	}
>+	part_print(desc);
>+
>+	return 0;
>+}
>+
> #ifdef CONFIG_PARTITION_TYPE_GUID
> static int do_part_type(int argc, char *const argv[])
> {
>@@ -245,6 +275,8 @@ static int do_part(struct cmd_tbl *cmdtp, int flag, int argc,
> 		return do_part_number(argc - 2, argv + 2);
> 	else if (!strcmp(argv[1], "types"))
> 		return do_part_types(argc - 2, argv + 2);
>+	else if (!strcmp(argv[1], "set"))
>+		return do_part_set(argc - 2, argv + 2);
> #ifdef CONFIG_PARTITION_TYPE_GUID
> 	else if (!strcmp(argv[1], "type"))
> 		return do_part_type(argc - 2, argv + 2);
>@@ -279,6 +311,8 @@ U_BOOT_CMD(
> #endif
> 	"part type <interface> <dev>:<part> <varname>\n"
> 	"    - set environment variable to partition type\n"
>+	"part set <interface> <dev> type\n"
>+	"    - set partition type for a device\n"
> 	"part types\n"
> 	"    - list supported partition table types"
> );
>diff --git a/disk/part.c b/disk/part.c
>index d449635254e1..5274baaac208 100644
>--- a/disk/part.c
>+++ b/disk/part.c
>@@ -54,6 +54,22 @@ static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
> 	return NULL;
> }
> 
>+int part_get_type_by_name(const char *name)
>+{
>+	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 (!strcasecmp(name, entry->name))
>+			return entry->part_type;
>+	}
>+
>+	/* Not found */
>+	return PART_TYPE_UNKNOWN;
>+}
>+
> static struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart)
> {
> 	struct blk_desc *dev_desc;
>diff --git a/doc/usage/cmd/part.rst b/doc/usage/cmd/part.rst
>index 8d2a2803912d..8a594aaff27e 100644
>--- a/doc/usage/cmd/part.rst
>+++ b/doc/usage/cmd/part.rst
>@@ -13,6 +13,7 @@ Synopis
>     part start <interface> <dev> <part> <varname>
>     part size <interface> <dev> <part> <varname>
>     part number <interface> <dev> <part> <varname>
>+    part set <interface> <dev> <part> <type>
>     part type <interface> <dev>:<part> [varname]
>     part types
> 
>@@ -82,6 +83,18 @@ part must be specified as partition name.
>     varname
>         a variable to store the current partition number value into
> 
>+The 'part set' command sets the type of a partition. This is useful when
>+autodetection fails or does not do the correct thing:
>+
>+    interface
>+        interface for accessing the block device (mmc, sata, scsi, usb, ....)
>+    dev
>+        device number
>+    part
>+        partition number
>+    type
>+        partition type to use (see 'part types') to check available types
>+
> The 'part type' command prints or sets an environment variable to the partition type UUID.
> 
>     interface
>@@ -147,6 +160,67 @@ Examples
>     => part types
>     Supported partition tables: EFI, AMIGA, DOS, ISO, MAC
> 
>+This shows looking at a device with multiple partition tables::
>+
>+    => virtio scan
>+    => part list virtio 0
>+
>+    Partition Map for VirtIO device 0  --   Partition Type: EFI
>+
>+    Part	Start LBA	End LBA		Name
>+            Attributes
>+            Type GUID
>+            Partition GUID
>+    1	0x00000040	0x0092b093	"ISO9660"
>+            attrs:	0x1000000000000001
>+            type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
>+            guid:	a0891d7e-b930-4513-94d8-f629dbd637b2
>+    2	0x0092b094	0x0092d7e7	"Appended2"
>+            attrs:	0x0000000000000000
>+            type:	c12a7328-f81f-11d2-ba4b-00a0c93ec93b
>+            guid:	a0891d7e-b930-4513-94db-f629dbd637b2
>+    3	0x0092d7e8	0x0092da3f	"Gap1"
>+            attrs:	0x1000000000000001
>+            type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
>+            guid:	a0891d7e-b930-4513-94da-f629dbd637b2
>+    => ls virtio 0:3
>+    => part types
>+    Supported partition tables: EFI, DOS, ISO
>+    => part set virtio 0 dos
>+
>+    Partition Map for VirtIO device 0  --   Partition Type: DOS
>+
>+    Part	Start Sector	Num Sectors	UUID		Type
>+    1	1         	9624191   	00000000-01	ee
>+    => part set virtio 0 iso
>+
>+    Partition Map for VirtIO device 0  --   Partition Type: ISO
>+
>+    Part   Start     Sect x Size Type
>+    1     3020        4    512 U-Boot
>+    2  9613460    10068    512 U-Boot
>+    => part set virtio 0 efi
>+
>+    Partition Map for VirtIO device 0  --   Partition Type: EFI
>+
>+    Part	Start LBA	End LBA		Name
>+            Attributes
>+            Type GUID
>+            Partition GUID
>+    1	0x00000040	0x0092b093	"ISO9660"
>+            attrs:	0x1000000000000001
>+            type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
>+            guid:	a0891d7e-b930-4513-94d8-f629dbd637b2
>+    2	0x0092b094	0x0092d7e7	"Appended2"
>+            attrs:	0x0000000000000000
>+            type:	c12a7328-f81f-11d2-ba4b-00a0c93ec93b
>+            guid:	a0891d7e-b930-4513-94db-f629dbd637b2
>+    3	0x0092d7e8	0x0092da3f	"Gap1"
>+            attrs:	0x1000000000000001
>+            type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
>+            guid:	a0891d7e-b930-4513-94da-f629dbd637b2
>+    =>
>+
> Return value
> ------------
> 
>diff --git a/include/part.h b/include/part.h
>index be75c7354955..3b1b5398699c 100644
>--- a/include/part.h
>+++ b/include/part.h
>@@ -598,6 +598,15 @@ static inline struct part_driver *part_driver_get_first(void)
> 	return ll_entry_start(struct part_driver, part_driver);
> }
> 
>+/**
>+ * part_get_type_by_name() - Get partition type by name
>+ *
>+ * @name: Name of partition type to look up (not case-sensitive)
>+ * Returns: Corresponding partition type (PART_TYPE_...) or PART_TYPE_UNKNOWN if
>+ * not known
>+ */
>+int part_get_type_by_name(const char *name);
>+
> #else
> static inline int part_driver_get_count(void)
> { return 0; }


More information about the U-Boot mailing list