Hello Andrii, On Wed, Jul 20, 2022 at 6:00 PM Andrii Chepurnyi <andrii.chepurny...@gmail.com> wrote: > > From: Andrii Chepurnyi <andrii.chepurny...@gmail.com> > > From: Andrii Chepurnyi <andrii_chepur...@epam.com> > > Originally, bcb implementation relay on mmc block devices. > The interface parameter will give the ability to use bcb with > various block devices by choosing the exact interface type. > By default (if no interface parameter is provided) mmc interface > will be used. > > Reviewed-by: Igor Opaniuk <igor.opan...@gmail.com> > Signed-off-by: Andrii Chepurnyi <andrii_chepur...@epam.com> > --- > cmd/bcb.c | 65 +++++++++++++++++++++++---------------------- > doc/android/bcb.rst | 33 ++++++++++++----------- > 2 files changed, 51 insertions(+), 47 deletions(-) > > diff --git a/cmd/bcb.c b/cmd/bcb.c > index 92f4d27990..bfe395558e 100644 > --- a/cmd/bcb.c > +++ b/cmd/bcb.c > @@ -26,6 +26,7 @@ enum bcb_cmd { > static int bcb_dev = -1; > static int bcb_part = -1; > static struct bootloader_message bcb __aligned(ARCH_DMA_MINALIGN) = { { 0 } > }; > +static struct blk_desc *bcb_blk_desc; > > static int bcb_cmd_get(char *cmd) > { > @@ -51,6 +52,9 @@ static int bcb_is_misused(int argc, char *const argv[]) > > switch (cmd) { > case BCB_CMD_LOAD: > + if (argc != 3 && argc != 4) > + goto err; > + break; > case BCB_CMD_FIELD_SET: > if (argc != 3) > goto err; > @@ -115,25 +119,23 @@ static int bcb_field_get(char *name, char **fieldp, int > *sizep) > > static int __bcb_load(int devnum, const char *partp) > { > - struct blk_desc *desc; > struct disk_partition info; > u64 cnt; > char *endp; > int part, ret; > > - desc = blk_get_devnum_by_type(IF_TYPE_MMC, devnum); > - if (!desc) { > + if (!bcb_blk_desc) { > ret = -ENODEV; > goto err_read_fail; > } > > part = simple_strtoul(partp, &endp, 0); > if (*endp == '\0') { > - ret = part_get_info(desc, part, &info); > + ret = part_get_info(bcb_blk_desc, part, &info); > if (ret) > goto err_read_fail; > } else { > - part = part_get_info_by_name(desc, partp, &info); > + part = part_get_info_by_name(bcb_blk_desc, partp, &info); > if (part < 0) { > ret = part; > goto err_read_fail; > @@ -144,12 +146,12 @@ static int __bcb_load(int devnum, const char *partp) > if (cnt > info.size) > goto err_too_small; > > - if (blk_dread(desc, info.start, cnt, &bcb) != cnt) { > + if (blk_dread(bcb_blk_desc, info.start, cnt, &bcb) != cnt) { > ret = -EIO; > goto err_read_fail; > } > > - bcb_dev = desc->devnum; > + bcb_dev = bcb_blk_desc->devnum; > bcb_part = part; > debug("%s: Loaded from mmc %d:%d\n", __func__, bcb_dev, bcb_part); > > @@ -170,15 +172,15 @@ err: > static int do_bcb_load(struct cmd_tbl *cmdtp, int flag, int argc, > char * const argv[]) > { > - char *endp; > - int devnum = simple_strtoul(argv[1], &endp, 0); > + int ret = blk_get_device_by_str((argv[3]) ? argv[3] : "mmc", argv[1], > &bcb_blk_desc); > > - if (*endp != '\0') { > - printf("Error: Device id '%s' not a number\n", argv[1]); > + if (ret < 0) { > + printf("Error: Device id '%s' or interface '%s' is not > valid\n", argv[1], > + (argv[3]) ? argv[3] : "mmc"); > return CMD_RET_FAILURE; > } > > - return __bcb_load(devnum, argv[2]); > + return __bcb_load(bcb_blk_desc->devnum, argv[2]); > } > > static int __bcb_set(char *fieldp, const char *valp) > @@ -281,24 +283,22 @@ static int do_bcb_dump(struct cmd_tbl *cmdtp, int flag, > int argc, > > static int __bcb_store(void) > { > - struct blk_desc *desc; > struct disk_partition info; > u64 cnt; > int ret; > > - desc = blk_get_devnum_by_type(IF_TYPE_MMC, bcb_dev); > - if (!desc) { > + if (!bcb_blk_desc) { > ret = -ENODEV; > goto err; > } > > - ret = part_get_info(desc, bcb_part, &info); > + ret = part_get_info(bcb_blk_desc, bcb_part, &info); > if (ret) > goto err; > > cnt = DIV_ROUND_UP(sizeof(struct bootloader_message), info.blksz); > > - if (blk_dwrite(desc, info.start, cnt, &bcb) != cnt) { > + if (blk_dwrite(bcb_blk_desc, info.start, cnt, &bcb) != cnt) { > ret = -EIO; > goto err; > } > @@ -373,21 +373,22 @@ static int do_bcb(struct cmd_tbl *cmdtp, int flag, int > argc, char *const argv[]) > U_BOOT_CMD( > bcb, CONFIG_SYS_MAXARGS, 1, do_bcb, > "Load/set/clear/test/dump/store Android BCB fields", > - "load <dev> <part> - load BCB from mmc <dev>:<part>\n" > - "bcb set <field> <val> - set BCB <field> to <val>\n" > - "bcb clear [<field>] - clear BCB <field> or all fields\n" > - "bcb test <field> <op> <val> - test BCB <field> against <val>\n" > - "bcb dump <field> - dump BCB <field>\n" > - "bcb store - store BCB back to mmc\n" > + "load <dev> <part> [<interface>] - load BCB from > <dev>:<part>[<interface>]\n" > + "bcb set <field> <val> - set BCB <field> to <val>\n" > + "bcb clear [<field>] - clear BCB <field> or all > fields\n" > + "bcb test <field> <op> <val> - test BCB <field> against > <val>\n" > + "bcb dump <field> - dump BCB <field>\n" > + "bcb store - store BCB back to mmc\n" > "\n" > "Legend:\n" > - "<dev> - MMC device index containing the BCB partition\n" > - "<part> - MMC partition index or name containing the BCB\n" > - "<field> - one of {command,status,recovery,stage,reserved}\n" > - "<op> - the binary operator used in 'bcb test':\n" > - " '=' returns true if <val> matches the string stored in > <field>\n" > - " '~' returns true if <val> matches a subset of <field>'s > string\n" > - "<val> - string/text provided as input to bcb {set,test}\n" > - " NOTE: any ':' character in <val> will be replaced by line > feed\n" > - " during 'bcb set' and used as separator by upper layers\n" > + "<dev> - device index containing the BCB partition\n" > + "<part> - partition index or name containing the BCB\n" > + "<interface> - interface name of the block device containing the > BCB\n" > + "<field> - one of {command,status,recovery,stage,reserved}\n" > + "<op> - the binary operator used in 'bcb test':\n" > + " '=' returns true if <val> matches the string stored > in <field>\n" > + " '~' returns true if <val> matches a subset of > <field>'s string\n" > + "<val> - string/text provided as input to bcb {set,test}\n" > + " NOTE: any ':' character in <val> will be replaced > by line feed\n" > + " during 'bcb set' and used as separator by upper > layers\n" > ); > diff --git a/doc/android/bcb.rst b/doc/android/bcb.rst > index 8861608300..e6d201f439 100644 > --- a/doc/android/bcb.rst > +++ b/doc/android/bcb.rst > @@ -41,23 +41,26 @@ requirements enumerated above. Below is the command's > help message:: > bcb - Load/set/clear/test/dump/store Android BCB fields > > Usage: > - bcb load <dev> <part> - load BCB from mmc <dev>:<part> > - bcb set <field> <val> - set BCB <field> to <val> > - bcb clear [<field>] - clear BCB <field> or all fields > - bcb test <field> <op> <val> - test BCB <field> against <val> > - bcb dump <field> - dump BCB <field> > - bcb store - store BCB back to mmc > + bcb load <dev> <part> [<iftype>] - load BCB from > <dev>:<part>[<iftype>] > + bcb set <field> <val> - set BCB <field> to <val> > + bcb clear [<field>] - clear BCB <field> or all fields > + bcb test <field> <op> <val> - test BCB <field> against <val> > + bcb dump <field> - dump BCB <field> > + bcb store - store BCB back to <iftype> > > Legend: > - <dev> - MMC device index containing the BCB partition > - <part> - MMC partition index or name containing the BCB > - <field> - one of {command,status,recovery,stage,reserved} > - <op> - the binary operator used in 'bcb test': > - '=' returns true if <val> matches the string stored in <field> > - '~' returns true if <val> matches a subset of <field>'s string > - <val> - string/text provided as input to bcb {set,test} > - NOTE: any ':' character in <val> will be replaced by line feed > - during 'bcb set' and used as separator by upper layers > + <dev> - device index containing the BCB partition > + <iftype> - Optional parameter of the interface type for the specified > + block device like: mmc,sd,virtio see blk.h for details. > + The default value is mmc. > + <part> - partition index or name containing the BCB > + <field> - one of {command,status,recovery,stage,reserved} > + <op> - the binary operator used in 'bcb test': > + '=' returns true if <val> matches the string stored in <field> > + '~' returns true if <val> matches a subset of <field>'s string > + <val> - string/text provided as input to bcb {set,test} > + NOTE: any ':' character in <val> will be replaced by line feed > + during 'bcb set' and used as separator by upper layers > > > 'bcb'. Example of getting reboot reason > -- > 2.25.1 >
Reviewed-by: Igor Opaniuk <igor.opan...@gmail.com> -- Best regards - Freundliche GrĂ¼sse - Meilleures salutations Igor Opaniuk mailto: igor.opan...@gmail.com skype: igor.opanyuk +380 (93) 836 40 67 http://ua.linkedin.com/in/iopaniuk