cmd: bcb: select user(0) hwpart in __bcb_load()
For some blk operations, it's possible that a different hw partition gets selected via blk_dselect_hwpart(). In that case, only the region of the device covered by that partition is accessible. This breaks "bcb load" which attempts to read the gpt and assumes it's on the user(0) hw partition: => bcb load 2 misc GUID Partition Table Header signature is wrong: 0xDE7B17AD07D9E5D6 != 0x5452415020494645 find_valid_gpt: *** ERROR: Invalid GPT *** GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645 find_valid_gpt: *** ERROR: Invalid Backup GPT *** Error: mmc 2:misc read failed (-2) Add a fail-safe in __bcb_load() to ensure we will always read from the user(0) hwpartition. This fixes the following fastboot sequence: $ fastboot erase mmc2boot1 # switch to hwpart1 $ fastboot reboot bootloader # switch to hwpart0, then reads GPT Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> Reviewed-by: Sean Anderson <sean.anderson@seco.com>
This commit is contained in:
parent
65e8b64d23
commit
64a11fb8c9
11
cmd/bcb.c
11
cmd/bcb.c
@ -14,6 +14,7 @@
|
|||||||
#include <part.h>
|
#include <part.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <memalign.h>
|
#include <memalign.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
|
||||||
enum bcb_cmd {
|
enum bcb_cmd {
|
||||||
BCB_CMD_LOAD,
|
BCB_CMD_LOAD,
|
||||||
@ -128,6 +129,16 @@ static int __bcb_load(int devnum, const char *partp)
|
|||||||
goto err_read_fail;
|
goto err_read_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* always select the USER mmc hwpart in case another
|
||||||
|
* blk operation selected a different hwpart
|
||||||
|
*/
|
||||||
|
ret = blk_dselect_hwpart(desc, 0);
|
||||||
|
if (IS_ERR_VALUE(ret)) {
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto err_read_fail;
|
||||||
|
}
|
||||||
|
|
||||||
part = simple_strtoul(partp, &endp, 0);
|
part = simple_strtoul(partp, &endp, 0);
|
||||||
if (*endp == '\0') {
|
if (*endp == '\0') {
|
||||||
ret = part_get_info(desc, part, &info);
|
ret = part_get_info(desc, part, &info);
|
||||||
|
Loading…
Reference in New Issue
Block a user