[PATCH v2 1/2] cmd: bcb: introduce optional interface parameter to bcb

Igor Opaniuk igor.opaniuk at gmail.com
Wed May 4 17:48:41 CEST 2022


Hi Andrii,

On Tue, Apr 19, 2022 at 9:46 AM Andrii Chepurnyi
<andrii.chepurnyi82 at gmail.com> wrote:
>
> From: Andrii Chepurnyi <andrii.chepurnyi82 at gmail.com>
>
> From: Andrii Chepurnyi <andrii_chepurnyi at 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.
>
> Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi at 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.opaniuk at gmail.com>

-- 
Best regards - Freundliche Grüsse - Meilleures salutations

Igor Opaniuk

mailto: igor.opaniuk at gmail.com
skype: igor.opanyuk
+380 (93) 836 40 67
http://ua.linkedin.com/in/iopaniuk


More information about the U-Boot mailing list