Skip to content

Commit

Permalink
part: Allow setting the partition-table type
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Simon Glass <[email protected]>
Reviewed-by: Bin Meng <[email protected]>
  • Loading branch information
sjg20 authored and lbmeng committed Jul 17, 2023
1 parent b279f51 commit 125194e
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 0 deletions.
34 changes: 34 additions & 0 deletions cmd/part.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[])
{
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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"
);
16 changes: 16 additions & 0 deletions disk/part.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
74 changes: 74 additions & 0 deletions doc/usage/cmd/part.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
------------

Expand Down
9 changes: 9 additions & 0 deletions include/part.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down

0 comments on commit 125194e

Please sign in to comment.