2018-05-07 05:58:06 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0+
|
2002-08-17 17:36:01 +08:00
|
|
|
/*
|
|
|
|
* (C) Copyright 2001
|
|
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
|
|
|
#include <command.h>
|
2019-08-01 23:46:52 +08:00
|
|
|
#include <env.h>
|
2016-03-01 06:25:47 +08:00
|
|
|
#include <errno.h>
|
2002-08-17 17:36:01 +08:00
|
|
|
#include <ide.h>
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
#include <malloc.h>
|
2007-02-20 16:04:34 +08:00
|
|
|
#include <part.h>
|
2015-09-18 06:46:58 +08:00
|
|
|
#include <ubifs_uboot.h>
|
2002-08-17 17:36:01 +08:00
|
|
|
|
|
|
|
#undef PART_DEBUG
|
|
|
|
|
|
|
|
#ifdef PART_DEBUG
|
|
|
|
#define PRINTF(fmt,args...) printf (fmt ,##args)
|
|
|
|
#else
|
|
|
|
#define PRINTF(fmt,args...)
|
|
|
|
#endif
|
|
|
|
|
2017-09-22 06:51:58 +08:00
|
|
|
/* Check all partition types */
|
|
|
|
#define PART_TYPE_ALL -1
|
|
|
|
|
2018-02-10 17:55:37 +08:00
|
|
|
static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
|
2016-03-01 06:25:47 +08:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
2018-02-10 17:55:37 +08:00
|
|
|
if (dev_desc->part_type == PART_TYPE_UNKNOWN) {
|
|
|
|
for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = entry->test(dev_desc);
|
|
|
|
if (!ret) {
|
|
|
|
dev_desc->part_type = entry->part_type;
|
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
|
if (dev_desc->part_type == entry->part_type)
|
|
|
|
return entry;
|
|
|
|
}
|
2016-03-01 06:25:47 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Not found */
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2018-02-10 17:55:38 +08:00
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
2016-03-01 06:25:34 +08:00
|
|
|
static struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart)
|
2007-02-20 16:04:34 +08:00
|
|
|
{
|
2016-05-02 03:52:32 +08:00
|
|
|
struct blk_desc *dev_desc;
|
|
|
|
int ret;
|
2007-02-20 16:04:34 +08:00
|
|
|
|
2016-05-02 03:52:32 +08:00
|
|
|
dev_desc = blk_get_devnum_by_typename(ifname, dev);
|
|
|
|
if (!dev_desc) {
|
|
|
|
debug("%s: No device for iface '%s', dev %d\n", __func__,
|
|
|
|
ifname, dev);
|
2012-03-27 17:43:25 +08:00
|
|
|
return NULL;
|
2007-02-20 16:04:34 +08:00
|
|
|
}
|
2016-05-02 03:52:32 +08:00
|
|
|
ret = blk_dselect_hwpart(dev_desc, hwpart);
|
|
|
|
if (ret) {
|
|
|
|
debug("%s: Failed to select h/w partition: err-%d\n", __func__,
|
|
|
|
ret);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return dev_desc;
|
2007-02-20 16:04:34 +08:00
|
|
|
}
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
|
2016-03-01 06:25:42 +08:00
|
|
|
struct blk_desc *blk_get_dev(const char *ifname, int dev)
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
{
|
disk: default to HW partition 0 if not specified
Currently, get_device()/get_dev_hwpart() for MMC devices does not select
an explicit HW partition unless the user explicitly requests one, i.e. by
requesting device "mmc 0.0" rather than just "mmc 0". I think it makes
more sense if the default is to select HW partition 0 (main data area)
if the user didn't request a specific partition. Otherwise, the following
happens, which feels wrong:
Select HW partition 1 (boot0):
mmc dev 0 1
Attempts to access SW partition 1 on HW partition 1 (boot0), rather than
SW partition 1 on HW partition 0 (main data area):
ls mmc 0:1 /
With this patch, the second command above re-selects the main data area.
Many device types don't support HW partitions at all, so if HW partition
0 is selected (either explicitly or as the default) and there's no
select_hwpart function, we simply skip attempting to select a HW
partition.
Some MMC devices (i.e. SD cards) don't support HW partitions. However,
this patch still works, since mmc_start_init() sets the current
partition number to 0, and mmc_select_hwpart() succeeds if the requested
partition is already selected.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
2014-05-24 02:48:11 +08:00
|
|
|
return get_dev_hwpart(ifname, dev, 0);
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
}
|
2007-02-20 16:04:34 +08:00
|
|
|
#else
|
2016-03-01 06:25:34 +08:00
|
|
|
struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart)
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2016-03-01 06:25:42 +08:00
|
|
|
struct blk_desc *blk_get_dev(const char *ifname, int dev)
|
2007-02-20 16:04:34 +08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2018-02-07 02:43:56 +08:00
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
2002-08-17 17:36:01 +08:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/*
|
|
|
|
* reports device info to the user
|
|
|
|
*/
|
2010-08-08 20:05:39 +08:00
|
|
|
|
2004-03-15 06:25:36 +08:00
|
|
|
#ifdef CONFIG_LBA48
|
2010-08-08 20:05:39 +08:00
|
|
|
typedef uint64_t lba512_t;
|
2004-03-14 07:29:43 +08:00
|
|
|
#else
|
2010-08-08 20:05:39 +08:00
|
|
|
typedef lbaint_t lba512_t;
|
2004-03-14 07:29:43 +08:00
|
|
|
#endif
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2010-08-08 20:05:39 +08:00
|
|
|
/*
|
2019-06-02 06:04:50 +08:00
|
|
|
* Overflowless variant of (block_count * mul_by / 2**div_by)
|
2010-08-08 20:05:39 +08:00
|
|
|
* when div_by > mul_by
|
|
|
|
*/
|
2019-06-02 06:04:50 +08:00
|
|
|
static lba512_t lba512_muldiv(lba512_t block_count, lba512_t mul_by, int div_by)
|
2010-08-08 20:05:39 +08:00
|
|
|
{
|
|
|
|
lba512_t bc_quot, bc_rem;
|
|
|
|
|
|
|
|
/* x * m / d == x / d * m + (x % d) * m / d */
|
2019-06-02 06:04:50 +08:00
|
|
|
bc_quot = block_count >> div_by;
|
|
|
|
bc_rem = block_count - (bc_quot << div_by);
|
|
|
|
return bc_quot * mul_by + ((bc_rem * mul_by) >> div_by);
|
2010-08-08 20:05:39 +08:00
|
|
|
}
|
|
|
|
|
2016-03-01 06:25:34 +08:00
|
|
|
void dev_print (struct blk_desc *dev_desc)
|
2010-08-08 20:05:39 +08:00
|
|
|
{
|
|
|
|
lba512_t lba512; /* number of blocks if 512bytes block size */
|
|
|
|
|
2009-05-15 15:27:58 +08:00
|
|
|
if (dev_desc->type == DEV_TYPE_UNKNOWN) {
|
|
|
|
puts ("not available\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-05-29 17:10:30 +08:00
|
|
|
switch (dev_desc->if_type) {
|
2008-05-05 22:11:21 +08:00
|
|
|
case IF_TYPE_SCSI:
|
|
|
|
printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
|
|
|
|
dev_desc->target,dev_desc->lun,
|
2002-08-17 17:36:01 +08:00
|
|
|
dev_desc->vendor,
|
2008-05-05 22:11:21 +08:00
|
|
|
dev_desc->product,
|
|
|
|
dev_desc->revision);
|
|
|
|
break;
|
2008-09-19 19:30:06 +08:00
|
|
|
case IF_TYPE_ATAPI:
|
2008-05-05 22:11:21 +08:00
|
|
|
case IF_TYPE_IDE:
|
|
|
|
case IF_TYPE_SATA:
|
2008-03-26 22:49:44 +08:00
|
|
|
printf ("Model: %s Firm: %s Ser#: %s\n",
|
|
|
|
dev_desc->vendor,
|
|
|
|
dev_desc->revision,
|
|
|
|
dev_desc->product);
|
2008-05-05 22:11:21 +08:00
|
|
|
break;
|
2008-09-19 19:30:06 +08:00
|
|
|
case IF_TYPE_SD:
|
|
|
|
case IF_TYPE_MMC:
|
2008-09-05 02:35:46 +08:00
|
|
|
case IF_TYPE_USB:
|
2017-08-03 17:30:56 +08:00
|
|
|
case IF_TYPE_NVME:
|
2008-09-05 02:35:46 +08:00
|
|
|
printf ("Vendor: %s Rev: %s Prod: %s\n",
|
|
|
|
dev_desc->vendor,
|
|
|
|
dev_desc->revision,
|
|
|
|
dev_desc->product);
|
|
|
|
break;
|
2018-10-15 17:21:10 +08:00
|
|
|
case IF_TYPE_VIRTIO:
|
|
|
|
printf("%s VirtIO Block Device\n", dev_desc->vendor);
|
|
|
|
break;
|
2008-09-19 19:30:06 +08:00
|
|
|
case IF_TYPE_DOC:
|
|
|
|
puts("device type DOC\n");
|
|
|
|
return;
|
2008-05-29 17:10:30 +08:00
|
|
|
case IF_TYPE_UNKNOWN:
|
2008-09-19 19:30:06 +08:00
|
|
|
puts("device type unknown\n");
|
|
|
|
return;
|
2008-05-05 22:11:21 +08:00
|
|
|
default:
|
2008-09-19 19:30:06 +08:00
|
|
|
printf("Unhandled device type: %i\n", dev_desc->if_type);
|
2008-05-05 22:11:21 +08:00
|
|
|
return;
|
2002-08-17 17:36:01 +08:00
|
|
|
}
|
|
|
|
puts (" Type: ");
|
|
|
|
if (dev_desc->removable)
|
|
|
|
puts ("Removable ");
|
|
|
|
switch (dev_desc->type & 0x1F) {
|
2008-05-05 22:11:22 +08:00
|
|
|
case DEV_TYPE_HARDDISK:
|
|
|
|
puts ("Hard Disk");
|
|
|
|
break;
|
|
|
|
case DEV_TYPE_CDROM:
|
|
|
|
puts ("CD ROM");
|
|
|
|
break;
|
|
|
|
case DEV_TYPE_OPDISK:
|
|
|
|
puts ("Optical Device");
|
|
|
|
break;
|
|
|
|
case DEV_TYPE_TAPE:
|
|
|
|
puts ("Tape");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
printf ("# %02X #", dev_desc->type & 0x1F);
|
|
|
|
break;
|
2002-08-17 17:36:01 +08:00
|
|
|
}
|
|
|
|
puts ("\n");
|
2012-11-06 23:33:12 +08:00
|
|
|
if (dev_desc->lba > 0L && dev_desc->blksz > 0L) {
|
2002-08-17 17:36:01 +08:00
|
|
|
ulong mb, mb_quot, mb_rem, gb, gb_quot, gb_rem;
|
2004-03-14 07:29:43 +08:00
|
|
|
lbaint_t lba;
|
2004-04-19 01:39:38 +08:00
|
|
|
|
|
|
|
lba = dev_desc->lba;
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2004-03-14 07:29:43 +08:00
|
|
|
lba512 = (lba * (dev_desc->blksz/512));
|
2002-08-17 17:36:01 +08:00
|
|
|
/* round to 1 digit */
|
2014-09-09 21:19:42 +08:00
|
|
|
/* 2048 = (1024 * 1024) / 512 MB */
|
2019-06-02 06:04:50 +08:00
|
|
|
mb = lba512_muldiv(lba512, 10, 11);
|
2010-08-08 20:05:39 +08:00
|
|
|
|
2002-08-17 17:36:01 +08:00
|
|
|
mb_quot = mb / 10;
|
|
|
|
mb_rem = mb - (10 * mb_quot);
|
|
|
|
|
|
|
|
gb = mb / 1024;
|
|
|
|
gb_quot = gb / 10;
|
|
|
|
gb_rem = gb - (10 * gb_quot);
|
2004-03-15 06:25:36 +08:00
|
|
|
#ifdef CONFIG_LBA48
|
2004-04-19 01:39:38 +08:00
|
|
|
if (dev_desc->lba48)
|
2004-03-14 07:29:43 +08:00
|
|
|
printf (" Supports 48-bit addressing\n");
|
|
|
|
#endif
|
2009-12-03 18:21:21 +08:00
|
|
|
#if defined(CONFIG_SYS_64BIT_LBA)
|
2016-12-23 17:45:43 +08:00
|
|
|
printf (" Capacity: %lu.%lu MB = %lu.%lu GB (%llu x %lu)\n",
|
2004-03-14 07:29:43 +08:00
|
|
|
mb_quot, mb_rem,
|
|
|
|
gb_quot, gb_rem,
|
|
|
|
lba,
|
|
|
|
dev_desc->blksz);
|
|
|
|
#else
|
2016-12-23 17:45:43 +08:00
|
|
|
printf (" Capacity: %lu.%lu MB = %lu.%lu GB (%lu x %lu)\n",
|
2002-08-17 17:36:01 +08:00
|
|
|
mb_quot, mb_rem,
|
|
|
|
gb_quot, gb_rem,
|
2004-03-14 07:29:43 +08:00
|
|
|
(ulong)lba,
|
2002-08-17 17:36:01 +08:00
|
|
|
dev_desc->blksz);
|
2004-03-14 07:29:43 +08:00
|
|
|
#endif
|
2002-08-17 17:36:01 +08:00
|
|
|
} else {
|
|
|
|
puts (" Capacity: not available\n");
|
|
|
|
}
|
|
|
|
}
|
2007-07-11 00:19:50 +08:00
|
|
|
#endif
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2018-02-07 02:43:56 +08:00
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2016-03-01 06:25:48 +08:00
|
|
|
void part_init(struct blk_desc *dev_desc)
|
2002-08-17 17:36:01 +08:00
|
|
|
{
|
2016-03-01 06:25:47 +08:00
|
|
|
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;
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2016-03-29 01:05:44 +08:00
|
|
|
blkcache_invalidate(dev_desc->if_type, dev_desc->devnum);
|
|
|
|
|
2012-09-21 12:08:17 +08:00
|
|
|
dev_desc->part_type = PART_TYPE_UNKNOWN;
|
2016-03-01 06:25:47 +08:00
|
|
|
for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = entry->test(dev_desc);
|
|
|
|
debug("%s: try '%s': ret=%d\n", __func__, entry->name, ret);
|
|
|
|
if (!ret) {
|
|
|
|
dev_desc->part_type = entry->part_type;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2002-08-17 17:36:01 +08:00
|
|
|
}
|
|
|
|
|
2016-03-01 06:25:47 +08:00
|
|
|
static void print_part_header(const char *type, struct blk_desc *dev_desc)
|
|
|
|
{
|
2017-01-27 18:00:36 +08:00
|
|
|
#if CONFIG_IS_ENABLED(MAC_PARTITION) || \
|
2017-01-27 18:00:37 +08:00
|
|
|
CONFIG_IS_ENABLED(DOS_PARTITION) || \
|
2017-01-27 18:00:38 +08:00
|
|
|
CONFIG_IS_ENABLED(ISO_PARTITION) || \
|
2017-01-27 18:00:39 +08:00
|
|
|
CONFIG_IS_ENABLED(AMIGA_PARTITION) || \
|
2017-01-27 18:00:41 +08:00
|
|
|
CONFIG_IS_ENABLED(EFI_PARTITION)
|
2002-08-17 17:36:01 +08:00
|
|
|
puts ("\nPartition Map for ");
|
|
|
|
switch (dev_desc->if_type) {
|
2008-05-05 22:11:22 +08:00
|
|
|
case IF_TYPE_IDE:
|
|
|
|
puts ("IDE");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_SATA:
|
|
|
|
puts ("SATA");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_SCSI:
|
|
|
|
puts ("SCSI");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_ATAPI:
|
|
|
|
puts ("ATAPI");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_USB:
|
|
|
|
puts ("USB");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_DOC:
|
|
|
|
puts ("DOC");
|
|
|
|
break;
|
2010-09-13 22:07:28 +08:00
|
|
|
case IF_TYPE_MMC:
|
|
|
|
puts ("MMC");
|
|
|
|
break;
|
2013-11-11 01:26:56 +08:00
|
|
|
case IF_TYPE_HOST:
|
2017-08-03 17:30:56 +08:00
|
|
|
puts ("HOST");
|
|
|
|
break;
|
|
|
|
case IF_TYPE_NVME:
|
|
|
|
puts ("NVMe");
|
2013-11-11 01:26:56 +08:00
|
|
|
break;
|
2018-10-15 17:21:10 +08:00
|
|
|
case IF_TYPE_VIRTIO:
|
|
|
|
puts("VirtIO");
|
|
|
|
break;
|
2008-05-05 22:11:22 +08:00
|
|
|
default:
|
|
|
|
puts ("UNKNOWN");
|
|
|
|
break;
|
2002-08-17 17:36:01 +08:00
|
|
|
}
|
|
|
|
printf (" device %d -- Partition Type: %s\n\n",
|
2016-03-01 06:25:51 +08:00
|
|
|
dev_desc->devnum, type);
|
2012-10-12 22:26:08 +08:00
|
|
|
#endif /* any CONFIG_..._PARTITION */
|
2016-03-01 06:25:47 +08:00
|
|
|
}
|
2012-10-12 22:26:08 +08:00
|
|
|
|
2016-03-01 06:25:48 +08:00
|
|
|
void part_print(struct blk_desc *dev_desc)
|
2002-08-17 17:36:01 +08:00
|
|
|
{
|
2016-03-01 06:25:47 +08:00
|
|
|
struct part_driver *drv;
|
2002-08-17 17:36:01 +08:00
|
|
|
|
2018-02-10 17:55:37 +08:00
|
|
|
drv = part_driver_lookup_type(dev_desc);
|
2016-03-01 06:25:47 +08:00
|
|
|
if (!drv) {
|
|
|
|
printf("## Unknown partition table type %x\n",
|
|
|
|
dev_desc->part_type);
|
2002-08-17 17:36:01 +08:00
|
|
|
return;
|
|
|
|
}
|
2016-03-01 06:25:47 +08:00
|
|
|
|
|
|
|
PRINTF("## Testing for valid %s partition ##\n", drv->name);
|
|
|
|
print_part_header(drv->name, dev_desc);
|
|
|
|
if (drv->print)
|
|
|
|
drv->print(dev_desc);
|
2002-08-17 17:36:01 +08:00
|
|
|
}
|
|
|
|
|
2018-02-07 02:43:56 +08:00
|
|
|
#endif /* CONFIG_HAVE_BLOCK_DEVICE */
|
disk: make get_partition_info() always available to disk.c
Now that get_device_and_partition() always calls get_partition_info()
when disk.c is compiled, we must always compile the function, rather
than ifdef it away.
The implementation must be conditional based on CONFIG_CMD_* etc., since
that's what e.g. part_dos.c uses to ifdef out get_partition_info_dos();
CONFIG_DOS_PARTITION can be enabled even without those commands being
enabled.
Technically, this change is required before Rob's "disk/part: introduce
get_device_and_partition" patch. However, at least when the compiler
optimizer is turned on, it isn't required before then in practice,
since get_device_and_partition() calls get_dev(), which is stubbed out
in disk.c under exactly the same conditions that get_partition_info()
is not compiled, and hence the compiler never generates code for the
call to the missing function. However, in my later patch "disk:
get_device_and_partition() "auto" partition and cleanup", the optimizer
doesn't succeed at this, and may attempt to reference the undefined
function.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 20:46:54 +08:00
|
|
|
|
2016-03-01 06:25:48 +08:00
|
|
|
int part_get_info(struct blk_desc *dev_desc, int part,
|
2014-07-20 05:50:44 +08:00
|
|
|
disk_partition_t *info)
|
disk: make get_partition_info() always available to disk.c
Now that get_device_and_partition() always calls get_partition_info()
when disk.c is compiled, we must always compile the function, rather
than ifdef it away.
The implementation must be conditional based on CONFIG_CMD_* etc., since
that's what e.g. part_dos.c uses to ifdef out get_partition_info_dos();
CONFIG_DOS_PARTITION can be enabled even without those commands being
enabled.
Technically, this change is required before Rob's "disk/part: introduce
get_device_and_partition" patch. However, at least when the compiler
optimizer is turned on, it isn't required before then in practice,
since get_device_and_partition() calls get_dev(), which is stubbed out
in disk.c under exactly the same conditions that get_partition_info()
is not compiled, and hence the compiler never generates code for the
call to the missing function. However, in my later patch "disk:
get_device_and_partition() "auto" partition and cleanup", the optimizer
doesn't succeed at this, and may attempt to reference the undefined
function.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 20:46:54 +08:00
|
|
|
{
|
2018-02-07 02:43:56 +08:00
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
2016-03-01 06:25:47 +08:00
|
|
|
struct part_driver *drv;
|
disk: make get_partition_info() always available to disk.c
Now that get_device_and_partition() always calls get_partition_info()
when disk.c is compiled, we must always compile the function, rather
than ifdef it away.
The implementation must be conditional based on CONFIG_CMD_* etc., since
that's what e.g. part_dos.c uses to ifdef out get_partition_info_dos();
CONFIG_DOS_PARTITION can be enabled even without those commands being
enabled.
Technically, this change is required before Rob's "disk/part: introduce
get_device_and_partition" patch. However, at least when the compiler
optimizer is turned on, it isn't required before then in practice,
since get_device_and_partition() calls get_dev(), which is stubbed out
in disk.c under exactly the same conditions that get_partition_info()
is not compiled, and hence the compiler never generates code for the
call to the missing function. However, in my later patch "disk:
get_device_and_partition() "auto" partition and cleanup", the optimizer
doesn't succeed at this, and may attempt to reference the undefined
function.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 20:46:54 +08:00
|
|
|
|
2017-01-27 18:00:42 +08:00
|
|
|
#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
|
2012-09-21 17:50:59 +08:00
|
|
|
/* The common case is no UUID support */
|
|
|
|
info->uuid[0] = 0;
|
|
|
|
#endif
|
2015-10-27 18:00:27 +08:00
|
|
|
#ifdef CONFIG_PARTITION_TYPE_GUID
|
|
|
|
info->type_guid[0] = 0;
|
|
|
|
#endif
|
2012-09-21 17:50:59 +08:00
|
|
|
|
2018-02-10 17:55:37 +08:00
|
|
|
drv = part_driver_lookup_type(dev_desc);
|
2016-03-01 06:25:47 +08:00
|
|
|
if (!drv) {
|
|
|
|
debug("## Unknown partition table type %x\n",
|
|
|
|
dev_desc->part_type);
|
|
|
|
return -EPROTONOSUPPORT;
|
|
|
|
}
|
|
|
|
if (!drv->get_info) {
|
2016-03-16 05:15:32 +08:00
|
|
|
PRINTF("## Driver %s does not have the get_info() method\n",
|
|
|
|
drv->name);
|
2016-03-01 06:25:47 +08:00
|
|
|
return -ENOSYS;
|
|
|
|
}
|
|
|
|
if (drv->get_info(dev_desc, part, info) == 0) {
|
|
|
|
PRINTF("## Valid %s partition found ##\n", drv->name);
|
|
|
|
return 0;
|
disk: make get_partition_info() always available to disk.c
Now that get_device_and_partition() always calls get_partition_info()
when disk.c is compiled, we must always compile the function, rather
than ifdef it away.
The implementation must be conditional based on CONFIG_CMD_* etc., since
that's what e.g. part_dos.c uses to ifdef out get_partition_info_dos();
CONFIG_DOS_PARTITION can be enabled even without those commands being
enabled.
Technically, this change is required before Rob's "disk/part: introduce
get_device_and_partition" patch. However, at least when the compiler
optimizer is turned on, it isn't required before then in practice,
since get_device_and_partition() calls get_dev(), which is stubbed out
in disk.c under exactly the same conditions that get_partition_info()
is not compiled, and hence the compiler never generates code for the
call to the missing function. However, in my later patch "disk:
get_device_and_partition() "auto" partition and cleanup", the optimizer
doesn't succeed at this, and may attempt to reference the undefined
function.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 20:46:54 +08:00
|
|
|
}
|
2018-02-07 02:43:56 +08:00
|
|
|
#endif /* CONFIG_HAVE_BLOCK_DEVICE */
|
disk: make get_partition_info() always available to disk.c
Now that get_device_and_partition() always calls get_partition_info()
when disk.c is compiled, we must always compile the function, rather
than ifdef it away.
The implementation must be conditional based on CONFIG_CMD_* etc., since
that's what e.g. part_dos.c uses to ifdef out get_partition_info_dos();
CONFIG_DOS_PARTITION can be enabled even without those commands being
enabled.
Technically, this change is required before Rob's "disk/part: introduce
get_device_and_partition" patch. However, at least when the compiler
optimizer is turned on, it isn't required before then in practice,
since get_device_and_partition() calls get_dev(), which is stubbed out
in disk.c under exactly the same conditions that get_partition_info()
is not compiled, and hence the compiler never generates code for the
call to the missing function. However, in my later patch "disk:
get_device_and_partition() "auto" partition and cleanup", the optimizer
doesn't succeed at this, and may attempt to reference the undefined
function.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 20:46:54 +08:00
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
2012-09-21 12:08:17 +08:00
|
|
|
|
2017-09-10 01:15:55 +08:00
|
|
|
int part_get_info_whole_disk(struct blk_desc *dev_desc, disk_partition_t *info)
|
|
|
|
{
|
|
|
|
info->start = 0;
|
|
|
|
info->size = dev_desc->lba;
|
|
|
|
info->blksz = dev_desc->blksz;
|
|
|
|
info->bootable = 0;
|
|
|
|
strcpy((char *)info->type, BOOT_PART_TYPE);
|
|
|
|
strcpy((char *)info->name, "Whole Disk");
|
|
|
|
#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
|
|
|
|
info->uuid[0] = 0;
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PARTITION_TYPE_GUID
|
|
|
|
info->type_guid[0] = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-03-01 06:25:43 +08:00
|
|
|
int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str,
|
|
|
|
struct blk_desc **dev_desc)
|
2012-09-21 17:50:56 +08:00
|
|
|
{
|
|
|
|
char *ep;
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
char *dup_str = NULL;
|
|
|
|
const char *dev_str, *hwpart_str;
|
|
|
|
int dev, hwpart;
|
|
|
|
|
|
|
|
hwpart_str = strchr(dev_hwpart_str, '.');
|
|
|
|
if (hwpart_str) {
|
|
|
|
dup_str = strdup(dev_hwpart_str);
|
|
|
|
dup_str[hwpart_str - dev_hwpart_str] = 0;
|
|
|
|
dev_str = dup_str;
|
|
|
|
hwpart_str++;
|
|
|
|
} else {
|
|
|
|
dev_str = dev_hwpart_str;
|
disk: default to HW partition 0 if not specified
Currently, get_device()/get_dev_hwpart() for MMC devices does not select
an explicit HW partition unless the user explicitly requests one, i.e. by
requesting device "mmc 0.0" rather than just "mmc 0". I think it makes
more sense if the default is to select HW partition 0 (main data area)
if the user didn't request a specific partition. Otherwise, the following
happens, which feels wrong:
Select HW partition 1 (boot0):
mmc dev 0 1
Attempts to access SW partition 1 on HW partition 1 (boot0), rather than
SW partition 1 on HW partition 0 (main data area):
ls mmc 0:1 /
With this patch, the second command above re-selects the main data area.
Many device types don't support HW partitions at all, so if HW partition
0 is selected (either explicitly or as the default) and there's no
select_hwpart function, we simply skip attempting to select a HW
partition.
Some MMC devices (i.e. SD cards) don't support HW partitions. However,
this patch still works, since mmc_start_init() sets the current
partition number to 0, and mmc_select_hwpart() succeeds if the requested
partition is already selected.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
2014-05-24 02:48:11 +08:00
|
|
|
hwpart = 0;
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
}
|
2012-09-21 17:50:56 +08:00
|
|
|
|
|
|
|
dev = simple_strtoul(dev_str, &ep, 16);
|
|
|
|
if (*ep) {
|
|
|
|
printf("** Bad device specification %s %s **\n",
|
|
|
|
ifname, dev_str);
|
2016-05-02 03:52:36 +08:00
|
|
|
dev = -EINVAL;
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hwpart_str) {
|
|
|
|
hwpart = simple_strtoul(hwpart_str, &ep, 16);
|
|
|
|
if (*ep) {
|
|
|
|
printf("** Bad HW partition specification %s %s **\n",
|
|
|
|
ifname, hwpart_str);
|
2016-05-02 03:52:36 +08:00
|
|
|
dev = -EINVAL;
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
goto cleanup;
|
|
|
|
}
|
2012-09-21 17:50:56 +08:00
|
|
|
}
|
|
|
|
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
*dev_desc = get_dev_hwpart(ifname, dev, hwpart);
|
2012-09-21 17:50:56 +08:00
|
|
|
if (!(*dev_desc) || ((*dev_desc)->type == DEV_TYPE_UNKNOWN)) {
|
2018-07-31 00:19:27 +08:00
|
|
|
debug("** Bad device %s %s **\n", ifname, dev_hwpart_str);
|
2016-05-02 03:52:36 +08:00
|
|
|
dev = -ENOENT;
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
goto cleanup;
|
2012-09-21 17:50:56 +08:00
|
|
|
}
|
|
|
|
|
2018-02-07 02:43:56 +08:00
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
2016-01-11 21:39:07 +08:00
|
|
|
/*
|
|
|
|
* Updates the partition table for the specified hw partition.
|
2019-06-18 23:53:04 +08:00
|
|
|
* Always should be done, otherwise hw partition 0 will return stale
|
|
|
|
* data after displaying a non-zero hw partition.
|
2016-01-11 21:39:07 +08:00
|
|
|
*/
|
2019-06-18 23:53:04 +08:00
|
|
|
part_init(*dev_desc);
|
2016-01-11 21:39:07 +08:00
|
|
|
#endif
|
|
|
|
|
disk: support devices with HW partitions
Some device types (e.g. eMMC) have hardware-level partitions (for eMMC,
separate boot and user data partitions). This change allows the user to
specify the HW partition they wish to access when passing a device ID to
U-Boot Commands such as part, ls, load, ums, etc.
The syntax allows an optional ".$hwpartid" to be appended to the device
name string for those commands.
Existing syntax, for MMC device 0, default HW partition ID, SW partition
ID 1:
ls mmc 0:1 /
New syntax, for MMC device 0, HW partition ID 1 (boot0), SW partition
ID 2:
ls mmc 0.1:2 /
For my purposes, this is most useful for the ums (USB mass storage
gadget) command, but there's no reason not to allow the new syntax
globally.
This patch adds the core support infra-structure. The next patch will
provide the implementation for MMC.
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2014-05-08 02:19:01 +08:00
|
|
|
cleanup:
|
|
|
|
free(dup_str);
|
2012-09-21 17:50:56 +08:00
|
|
|
return dev;
|
|
|
|
}
|
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
#define PART_UNSPECIFIED -2
|
|
|
|
#define PART_AUTO -1
|
2016-03-01 06:25:44 +08:00
|
|
|
int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
|
2016-03-01 06:25:34 +08:00
|
|
|
struct blk_desc **dev_desc,
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
disk_partition_t *info, int allow_whole_dev)
|
2012-09-21 12:08:17 +08:00
|
|
|
{
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
int ret = -1;
|
|
|
|
const char *part_str;
|
|
|
|
char *dup_str = NULL;
|
|
|
|
const char *dev_str;
|
2012-09-21 12:08:17 +08:00
|
|
|
int dev;
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
char *ep;
|
|
|
|
int p;
|
|
|
|
int part;
|
|
|
|
disk_partition_t tmpinfo;
|
|
|
|
|
2015-09-18 06:46:55 +08:00
|
|
|
#ifdef CONFIG_SANDBOX
|
2014-06-13 00:28:32 +08:00
|
|
|
/*
|
2014-07-20 05:50:44 +08:00
|
|
|
* Special-case a pseudo block device "hostfs", to allow access to the
|
2014-06-13 00:28:32 +08:00
|
|
|
* host's own filesystem.
|
|
|
|
*/
|
|
|
|
if (0 == strcmp(ifname, "hostfs")) {
|
|
|
|
*dev_desc = NULL;
|
|
|
|
info->start = 0;
|
|
|
|
info->size = 0;
|
|
|
|
info->blksz = 0;
|
|
|
|
info->bootable = 0;
|
|
|
|
strcpy((char *)info->type, BOOT_PART_TYPE);
|
|
|
|
strcpy((char *)info->name, "Sandbox host");
|
2017-01-27 18:00:42 +08:00
|
|
|
#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
|
2014-06-13 00:28:32 +08:00
|
|
|
info->uuid[0] = 0;
|
|
|
|
#endif
|
2015-10-27 18:00:27 +08:00
|
|
|
#ifdef CONFIG_PARTITION_TYPE_GUID
|
|
|
|
info->type_guid[0] = 0;
|
|
|
|
#endif
|
2014-06-13 00:28:32 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2015-09-18 06:46:55 +08:00
|
|
|
#endif
|
2014-06-13 00:28:32 +08:00
|
|
|
|
2015-09-18 06:46:58 +08:00
|
|
|
#ifdef CONFIG_CMD_UBIFS
|
|
|
|
/*
|
2019-04-11 00:59:26 +08:00
|
|
|
* Special-case ubi, ubi goes through a mtd, rather than through
|
2015-09-18 06:46:58 +08:00
|
|
|
* a regular block device.
|
|
|
|
*/
|
|
|
|
if (0 == strcmp(ifname, "ubi")) {
|
|
|
|
if (!ubifs_is_mounted()) {
|
|
|
|
printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*dev_desc = NULL;
|
|
|
|
memset(info, 0, sizeof(*info));
|
|
|
|
strcpy((char *)info->type, BOOT_PART_TYPE);
|
|
|
|
strcpy((char *)info->name, "UBI");
|
2017-01-27 18:00:42 +08:00
|
|
|
#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
|
2015-09-18 06:46:58 +08:00
|
|
|
info->uuid[0] = 0;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
/* If no dev_part_str, use bootdevice environment variable */
|
2012-09-28 13:34:09 +08:00
|
|
|
if (!dev_part_str || !strlen(dev_part_str) ||
|
|
|
|
!strcmp(dev_part_str, "-"))
|
2017-08-04 02:22:12 +08:00
|
|
|
dev_part_str = env_get("bootdevice");
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
|
|
|
|
/* If still no dev_part_str, it's an error */
|
|
|
|
if (!dev_part_str) {
|
|
|
|
printf("** No device specified **\n");
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Separate device and partition ID specification */
|
|
|
|
part_str = strchr(dev_part_str, ':');
|
|
|
|
if (part_str) {
|
|
|
|
dup_str = strdup(dev_part_str);
|
|
|
|
dup_str[part_str - dev_part_str] = 0;
|
|
|
|
dev_str = dup_str;
|
|
|
|
part_str++;
|
|
|
|
} else {
|
|
|
|
dev_str = dev_part_str;
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
/* Look up the device */
|
2016-03-01 06:25:43 +08:00
|
|
|
dev = blk_get_device_by_str(ifname, dev_str, dev_desc);
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
if (dev < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
/* Convert partition ID string to number */
|
|
|
|
if (!part_str || !*part_str) {
|
|
|
|
part = PART_UNSPECIFIED;
|
|
|
|
} else if (!strcmp(part_str, "auto")) {
|
|
|
|
part = PART_AUTO;
|
|
|
|
} else {
|
|
|
|
/* Something specified -> use exactly that */
|
|
|
|
part = (int)simple_strtoul(part_str, &ep, 16);
|
|
|
|
/*
|
|
|
|
* Less than whole string converted,
|
|
|
|
* or request for whole device, but caller requires partition.
|
|
|
|
*/
|
|
|
|
if (*ep || (part == 0 && !allow_whole_dev)) {
|
|
|
|
printf("** Bad partition specification %s %s **\n",
|
|
|
|
ifname, dev_part_str);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* No partition table on device,
|
|
|
|
* or user requested partition 0 (entire device).
|
|
|
|
*/
|
|
|
|
if (((*dev_desc)->part_type == PART_TYPE_UNKNOWN) ||
|
|
|
|
(part == 0)) {
|
|
|
|
if (!(*dev_desc)->lba) {
|
|
|
|
printf("** Bad device size - %s %s **\n", ifname,
|
|
|
|
dev_str);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2012-09-21 12:08:17 +08:00
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
/*
|
|
|
|
* If user specified a partition ID other than 0,
|
|
|
|
* or the calling command only accepts partitions,
|
|
|
|
* it's an error.
|
|
|
|
*/
|
|
|
|
if ((part > 0) || (!allow_whole_dev)) {
|
|
|
|
printf("** No partition table - %s %s **\n", ifname,
|
|
|
|
dev_str);
|
|
|
|
goto cleanup;
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
|
2013-07-20 08:17:59 +08:00
|
|
|
(*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz);
|
|
|
|
|
2017-09-10 01:15:55 +08:00
|
|
|
part_get_info_whole_disk(*dev_desc, info);
|
2012-09-21 12:08:17 +08:00
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
ret = 0;
|
|
|
|
goto cleanup;
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
/*
|
|
|
|
* Now there's known to be a partition table,
|
|
|
|
* not specifying a partition means to pick partition 1.
|
|
|
|
*/
|
|
|
|
if (part == PART_UNSPECIFIED)
|
|
|
|
part = 1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If user didn't specify a partition number, or did specify something
|
|
|
|
* other than "auto", use that partition number directly.
|
|
|
|
*/
|
|
|
|
if (part != PART_AUTO) {
|
2016-03-01 06:25:48 +08:00
|
|
|
ret = part_get_info(*dev_desc, part, info);
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
if (ret) {
|
|
|
|
printf("** Invalid partition %d **\n", part);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Find the first bootable partition.
|
|
|
|
* If none are bootable, fall back to the first valid partition.
|
|
|
|
*/
|
|
|
|
part = 0;
|
|
|
|
for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) {
|
2016-03-01 06:25:48 +08:00
|
|
|
ret = part_get_info(*dev_desc, p, info);
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
if (ret)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* First valid partition, or new better partition?
|
|
|
|
* If so, save partition ID.
|
|
|
|
*/
|
|
|
|
if (!part || info->bootable)
|
|
|
|
part = p;
|
|
|
|
|
|
|
|
/* Best possible partition? Stop searching. */
|
|
|
|
if (info->bootable)
|
|
|
|
break;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We now need to search further for best possible.
|
|
|
|
* If we what we just queried was the best so far,
|
|
|
|
* save the info since we over-write it next loop.
|
|
|
|
*/
|
|
|
|
if (part == p)
|
|
|
|
tmpinfo = *info;
|
|
|
|
}
|
|
|
|
/* If we found any acceptable partition */
|
|
|
|
if (part) {
|
|
|
|
/*
|
|
|
|
* If we searched all possible partition IDs,
|
|
|
|
* return the first valid partition we found.
|
|
|
|
*/
|
|
|
|
if (p == MAX_SEARCH_PARTITIONS + 1)
|
|
|
|
*info = tmpinfo;
|
|
|
|
} else {
|
|
|
|
printf("** No valid partitions found **\n");
|
2012-10-08 15:45:54 +08:00
|
|
|
ret = -1;
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
goto cleanup;
|
|
|
|
}
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
|
|
|
if (strncmp((char *)info->type, BOOT_PART_TYPE, sizeof(info->type)) != 0) {
|
|
|
|
printf("** Invalid partition type \"%.32s\""
|
|
|
|
" (expect \"" BOOT_PART_TYPE "\")\n",
|
|
|
|
info->type);
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
ret = -1;
|
|
|
|
goto cleanup;
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
|
|
|
|
2013-07-20 08:17:59 +08:00
|
|
|
(*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz);
|
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
ret = part;
|
|
|
|
goto cleanup;
|
2012-09-21 12:08:17 +08:00
|
|
|
|
disk: get_device_and_partition() "auto" partition and cleanup
Rework get_device_and_partition() to:
a) Implement a new partition ID of "auto", which requests that U-Boot
search for the first "bootable" partition, and fall back to the first
valid partition if none is found. This way, users don't need to
specify an explicit partition in their commands.
b) Make use of get_device().
c) Add parameter to indicate whether returning a whole device is
acceptable, or whether a partition is mandatory.
d) Make error-checking of the user's device-/partition-specification
more complete. In particular, if strtoul() doesn't convert all
characters, it's an error rather than just ignored.
The resultant device/partition returned by the function will be as
follows, based on whether the disk has a partition table (ptable) or not,
and whether the calling command allows the whole device to be returned
or not.
(D and P are integers, P >= 1)
D
D:
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
device D partition 1
D:0
!allow_whole_dev: error
allow_whole_dev: device D
D:P
No ptable: error
ptable: device D partition P
D:auto
No ptable:
!allow_whole_dev: error
allow_whole_dev: device D
ptable:
first partition in device D with bootable flag set.
If none, first valid paratition in device D.
Note: In order to review this patch, it's probably easiest to simply
look at the file contents post-application, rather than reading the
patch itself.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
[swarren: Rob implemented scanning for bootable partitions. I fixed a
couple of issues there, switched the syntax to ":auto", added the
error-checking rework, and ":0" syntax for the whole device]
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2012-09-21 17:50:57 +08:00
|
|
|
cleanup:
|
|
|
|
free(dup_str);
|
|
|
|
return ret;
|
2012-09-21 12:08:17 +08:00
|
|
|
}
|
2016-09-09 16:27:15 +08:00
|
|
|
|
2017-09-22 06:51:58 +08:00
|
|
|
int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
|
|
|
|
disk_partition_t *info, int part_type)
|
2016-09-09 16:27:15 +08:00
|
|
|
{
|
|
|
|
struct part_driver *part_drv;
|
2018-02-10 17:55:38 +08:00
|
|
|
int ret;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
part_drv = part_driver_lookup_type(dev_desc);
|
|
|
|
if (!part_drv)
|
|
|
|
return -1;
|
|
|
|
for (i = 1; i < part_drv->max_entries; i++) {
|
|
|
|
ret = part_drv->get_info(dev_desc, i, info);
|
|
|
|
if (ret != 0) {
|
|
|
|
/* no more entries in table */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (strcmp(name, (const char *)info->name) == 0) {
|
|
|
|
/* matched */
|
|
|
|
return i;
|
2016-09-09 16:27:15 +08:00
|
|
|
}
|
|
|
|
}
|
2018-02-10 17:55:38 +08:00
|
|
|
|
2016-09-09 16:27:15 +08:00
|
|
|
return -1;
|
|
|
|
}
|
2016-09-09 16:27:17 +08:00
|
|
|
|
2017-09-22 06:51:58 +08:00
|
|
|
int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
|
|
|
|
disk_partition_t *info)
|
|
|
|
{
|
|
|
|
return part_get_info_by_name_type(dev_desc, name, info, PART_TYPE_ALL);
|
|
|
|
}
|
|
|
|
|
2019-07-05 20:37:31 +08:00
|
|
|
/**
|
|
|
|
* Get partition info from device number and partition name.
|
|
|
|
*
|
|
|
|
* Parse a device number and partition name string in the form of
|
|
|
|
* "device_num#partition_name", for example "0#misc". If the partition
|
|
|
|
* is found, sets dev_desc and part_info accordingly with the information
|
|
|
|
* of the partition with the given partition_name.
|
|
|
|
*
|
|
|
|
* @param[in] dev_iface Device interface
|
|
|
|
* @param[in] dev_part_str Input string argument, like "0#misc"
|
|
|
|
* @param[out] dev_desc Place to store the device description pointer
|
|
|
|
* @param[out] part_info Place to store the partition information
|
|
|
|
* @return 0 on success, or a negative on error
|
|
|
|
*/
|
|
|
|
static int part_get_info_by_dev_and_name(const char *dev_iface,
|
|
|
|
const char *dev_part_str,
|
|
|
|
struct blk_desc **dev_desc,
|
|
|
|
disk_partition_t *part_info)
|
|
|
|
{
|
|
|
|
char *ep;
|
|
|
|
const char *part_str;
|
|
|
|
int dev_num;
|
|
|
|
|
|
|
|
part_str = strchr(dev_part_str, '#');
|
|
|
|
if (!part_str || part_str == dev_part_str)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
dev_num = simple_strtoul(dev_part_str, &ep, 16);
|
|
|
|
if (ep != part_str) {
|
|
|
|
/* Not all the first part before the # was parsed. */
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
part_str++;
|
|
|
|
|
|
|
|
*dev_desc = blk_get_dev(dev_iface, dev_num);
|
|
|
|
if (!*dev_desc) {
|
|
|
|
printf("Could not find %s %d\n", dev_iface, dev_num);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
|
|
|
|
printf("Could not find \"%s\" partition\n", part_str);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
|
|
|
|
const char *dev_part_str,
|
|
|
|
struct blk_desc **dev_desc,
|
|
|
|
disk_partition_t *part_info)
|
|
|
|
{
|
|
|
|
/* Split the part_name if passed as "$dev_num#part_name". */
|
|
|
|
if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
|
|
|
|
dev_desc, part_info))
|
|
|
|
return 0;
|
|
|
|
/*
|
|
|
|
* Couldn't lookup by name, try looking up the partition description
|
|
|
|
* directly.
|
|
|
|
*/
|
|
|
|
if (blk_get_device_part_str(dev_iface, dev_part_str,
|
|
|
|
dev_desc, part_info, 1) < 0) {
|
|
|
|
printf("Couldn't find partition %s %s\n",
|
|
|
|
dev_iface, dev_part_str);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-09-09 16:27:17 +08:00
|
|
|
void part_set_generic_name(const struct blk_desc *dev_desc,
|
|
|
|
int part_num, char *name)
|
|
|
|
{
|
|
|
|
char *devtype;
|
|
|
|
|
|
|
|
switch (dev_desc->if_type) {
|
|
|
|
case IF_TYPE_IDE:
|
|
|
|
case IF_TYPE_SATA:
|
|
|
|
case IF_TYPE_ATAPI:
|
|
|
|
devtype = "hd";
|
|
|
|
break;
|
|
|
|
case IF_TYPE_SCSI:
|
|
|
|
devtype = "sd";
|
|
|
|
break;
|
|
|
|
case IF_TYPE_USB:
|
|
|
|
devtype = "usbd";
|
|
|
|
break;
|
|
|
|
case IF_TYPE_DOC:
|
|
|
|
devtype = "docd";
|
|
|
|
break;
|
|
|
|
case IF_TYPE_MMC:
|
|
|
|
case IF_TYPE_SD:
|
|
|
|
devtype = "mmcsd";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
devtype = "xx";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
sprintf(name, "%s%c%d", devtype, 'a' + dev_desc->devnum, part_num);
|
|
|
|
}
|