mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-24 22:36:05 +00:00
part: Allow setting the partition-table type
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 <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
b279f5170a
commit
125194e6a1
4 changed files with 133 additions and 0 deletions
34
cmd/part.c
34
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"
|
||||
);
|
||||
|
|
16
disk/part.c
16
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;
|
||||
|
|
|
@ -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
|
||||
------------
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Add table
Reference in a new issue