[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