Am 30. März 2023 23:32:02 MESZ schrieb Simon Glass <s...@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 <s...@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; }

Reply via email to