All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Dmitrii Merkurev <dimorinny@google.com>, u-boot@lists.denx.de
Cc: rammuthiah@google.com, Dmitrii Merkurev <dimorinny@google.com>,
	Eugeniu Rosca <erosca@de.adit-jv.com>,
	Ying-Chun Liu <paul.liu@linaro.org>,
	Simon Glass <sjg@chromium.org>,
	Sean Anderson <sean.anderson@seco.com>,
	Cody Schuffelen <schuffelen@google.com>
Subject: Re: [PATCH v2 1/2] cmd: bcb: support various block device interfaces for BCB command
Date: Tue, 14 Nov 2023 09:12:20 +0100	[thread overview]
Message-ID: <87y1f0n47v.fsf@baylibre.com> (raw)
In-Reply-To: <20231110055955.3370681-2-dimorinny@google.com>

Hi Dmitrii,

Thank you for  your patch.

On ven., nov. 10, 2023 at 05:59, Dmitrii Merkurev <dimorinny@google.com> wrote:

> Currently BCB command-line, C APIs and implementation only
> support MMC interface. Extend it to allow various block
> device interfaces.
>
> Signed-off-by: Dmitrii Merkurev <dimorinny@google.com>
> Cc: Eugeniu Rosca <erosca@de.adit-jv.com>
> Cc: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> Cc: Sean Anderson <sean.anderson@seco.com>
> Cc: Cody Schuffelen <schuffelen@google.com>

I confirm that I can reboot from U-Boot into other modes (like
fastbootd) using the default U-boot environment

Tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> # on vim3

Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>

> ---
>  cmd/Kconfig                  |  1 -
>  cmd/bcb.c                    | 70 ++++++++++++++++++++++--------------
>  doc/android/bcb.rst          | 34 +++++++++---------
>  drivers/fastboot/fb_common.c |  2 +-
>  include/bcb.h                |  5 +--
>  5 files changed, 65 insertions(+), 47 deletions(-)
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index df6d71c103..ce2435bbb8 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -981,7 +981,6 @@ config CMD_ADC
>  
>  config CMD_BCB
>  	bool "bcb"
> -	depends on MMC
>  	depends on PARTITIONS
>  	help
>  	  Read/modify/write the fields of Bootloader Control Block, usually
> diff --git a/cmd/bcb.c b/cmd/bcb.c
> index 02d0c70d87..6594ac6439 100644
> --- a/cmd/bcb.c
> +++ b/cmd/bcb.c
> @@ -25,6 +25,7 @@ enum bcb_cmd {
>  	BCB_CMD_STORE,
>  };
>  
> +static enum uclass_id bcb_uclass_id = UCLASS_INVALID;
>  static int bcb_dev = -1;
>  static int bcb_part = -1;
>  static struct bootloader_message bcb __aligned(ARCH_DMA_MINALIGN) = { { 0 } };
> @@ -53,6 +54,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,7 +119,7 @@ static int bcb_field_get(char *name, char **fieldp, int *sizep)
>  	return 0;
>  }
>  
> -static int __bcb_load(int devnum, const char *partp)
> +static int __bcb_load(const char *iface, int devnum, const char *partp)
>  {
>  	struct blk_desc *desc;
>  	struct disk_partition info;
> @@ -123,14 +127,14 @@ static int __bcb_load(int devnum, const char *partp)
>  	char *endp;
>  	int part, ret;
>  
> -	desc = blk_get_devnum_by_uclass_id(UCLASS_MMC, devnum);
> +	desc = blk_get_dev(iface, devnum);
>  	if (!desc) {
>  		ret = -ENODEV;
>  		goto err_read_fail;
>  	}
>  
>  	/*
> -	 * always select the USER mmc hwpart in case another
> +	 * always select the first hwpart in case another
>  	 * blk operation selected a different hwpart
>  	 */
>  	ret = blk_dselect_hwpart(desc, 0);
> @@ -161,18 +165,20 @@ static int __bcb_load(int devnum, const char *partp)
>  		goto err_read_fail;
>  	}
>  
> +	bcb_uclass_id = desc->uclass_id;
>  	bcb_dev = desc->devnum;
>  	bcb_part = part;
> -	debug("%s: Loaded from mmc %d:%d\n", __func__, bcb_dev, bcb_part);
> +	debug("%s: Loaded from %s %d:%d\n", __func__, iface, bcb_dev, bcb_part);
>  
>  	return CMD_RET_SUCCESS;
>  err_read_fail:
> -	printf("Error: mmc %d:%s read failed (%d)\n", devnum, partp, ret);
> +	printf("Error: %s %d:%s read failed (%d)\n", iface, devnum, partp, ret);
>  	goto err;
>  err_too_small:
> -	printf("Error: mmc %d:%s too small!", devnum, partp);
> +	printf("Error: %s %d:%s too small!", iface, devnum, partp);
>  	goto err;
>  err:
> +	bcb_uclass_id = UCLASS_INVALID;
>  	bcb_dev = -1;
>  	bcb_part = -1;
>  
> @@ -182,15 +188,23 @@ err:
>  static int do_bcb_load(struct cmd_tbl *cmdtp, int flag, int argc,
>  		       char * const argv[])
>  {
> +	int devnum;
>  	char *endp;
> -	int devnum = simple_strtoul(argv[1], &endp, 0);
> +	char *iface = "mmc";
> +
> +	if (argc == 4) {
> +		iface = argv[1];
> +		argc--;
> +		argv++;
> +	}
>  
> +	devnum = simple_strtoul(argv[1], &endp, 0);
>  	if (*endp != '\0') {
>  		printf("Error: Device id '%s' not a number\n", argv[1]);
>  		return CMD_RET_FAILURE;
>  	}
>  
> -	return __bcb_load(devnum, argv[2]);
> +	return __bcb_load(iface, devnum, argv[2]);
>  }
>  
>  static int __bcb_set(char *fieldp, const char *valp)
> @@ -298,7 +312,7 @@ static int __bcb_store(void)
>  	u64 cnt;
>  	int ret;
>  
> -	desc = blk_get_devnum_by_uclass_id(UCLASS_MMC, bcb_dev);
> +	desc = blk_get_devnum_by_uclass_id(bcb_uclass_id, bcb_dev);
>  	if (!desc) {
>  		ret = -ENODEV;
>  		goto err;
> @@ -317,7 +331,7 @@ static int __bcb_store(void)
>  
>  	return CMD_RET_SUCCESS;
>  err:
> -	printf("Error: mmc %d:%d write failed (%d)\n", bcb_dev, bcb_part, ret);
> +	printf("Error: %d %d:%d write failed (%d)\n", bcb_uclass_id, bcb_dev, bcb_part, ret);
>  
>  	return CMD_RET_FAILURE;
>  }
> @@ -328,11 +342,11 @@ static int do_bcb_store(struct cmd_tbl *cmdtp, int flag, int argc,
>  	return __bcb_store();
>  }
>  
> -int bcb_write_reboot_reason(int devnum, char *partp, const char *reasonp)
> +int bcb_write_reboot_reason(const char *iface, int devnum, char *partp, const char *reasonp)
>  {
>  	int ret;
>  
> -	ret = __bcb_load(devnum, partp);
> +	ret = __bcb_load(iface, devnum, partp);
>  	if (ret != CMD_RET_SUCCESS)
>  		return ret;
>  
> @@ -385,21 +399,23 @@ 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 <interface> <dev> <part>  - load  BCB from <interface> <dev>:<part>\n"
> +	"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 <interface>\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"
> +	"<interface> - storage device interface (virtio, mmc, etc)\n"
> +	"<dev>       - storage device index containing the BCB partition\n"
> +	"<part>      - 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"
>  );
> diff --git a/doc/android/bcb.rst b/doc/android/bcb.rst
> index 8861608300..2226517d39 100644
> --- a/doc/android/bcb.rst
> +++ b/doc/android/bcb.rst
> @@ -41,23 +41,25 @@ 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 <interface> <dev> <part>  - load  BCB from <interface> <dev>:<part>
> +   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 <interface>
>  
>     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
> +   <interface> - storage device interface (virtio, mmc, etc)
> +   <dev>       - storage device index containing the BCB partition
> +   <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
> @@ -91,7 +93,7 @@ The following Kconfig options must be enabled::
>  
>     CONFIG_PARTITIONS=y
>     CONFIG_MMC=y
> -   CONFIG_BCB=y
> +   CONFIG_CMD_BCB=y
>  
>  .. [1] https://android.googlesource.com/platform/bootable/recovery
>  .. [2] https://source.android.com/devices/bootloader
> diff --git a/drivers/fastboot/fb_common.c b/drivers/fastboot/fb_common.c
> index 4e9d9b719c..2a6608b28c 100644
> --- a/drivers/fastboot/fb_common.c
> +++ b/drivers/fastboot/fb_common.c
> @@ -105,7 +105,7 @@ int __weak fastboot_set_reboot_flag(enum fastboot_reboot_reason reason)
>  	if (reason >= FASTBOOT_REBOOT_REASONS_COUNT)
>  		return -EINVAL;
>  
> -	return bcb_write_reboot_reason(mmc_dev, "misc", boot_cmds[reason]);
> +	return bcb_write_reboot_reason("mmc", mmc_dev, "misc", boot_cmds[reason]);
>  }
>  
>  /**
> diff --git a/include/bcb.h b/include/bcb.h
> index 5edb17aa47..a6326523c4 100644
> --- a/include/bcb.h
> +++ b/include/bcb.h
> @@ -9,10 +9,11 @@
>  #define __BCB_H__
>  
>  #if IS_ENABLED(CONFIG_CMD_BCB)
> -int bcb_write_reboot_reason(int devnum, char *partp, const char *reasonp);
> +int bcb_write_reboot_reason(const char *iface, int devnum, char *partp, const char *reasonp);
>  #else
>  #include <linux/errno.h>
> -static inline int bcb_write_reboot_reason(int devnum, char *partp, const char *reasonp)
> +static inline int bcb_write_reboot_reason(const char *iface, int devnum,
> +					  char *partp, const char *reasonp)
>  {
>  	return -EOPNOTSUPP;
>  }
> -- 
> 2.43.0.rc0.421.g78406f8d94-goog

  reply	other threads:[~2023-11-14  8:12 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-10  5:59 [PATCH 0/2] cmd: bcb: extend BCB APIs to support Android boot flow Dmitrii Merkurev
2023-11-10  5:59 ` [PATCH v2 1/2] cmd: bcb: support various block device interfaces for BCB command Dmitrii Merkurev
2023-11-14  8:12   ` Mattijs Korpershoek [this message]
2023-11-17 13:42   ` Tom Rini
2023-11-10  5:59 ` [PATCH v2 2/2] cmd: bcb: extend BCB C API to allow read/write the fields Dmitrii Merkurev
2023-11-17 13:42   ` Tom Rini
2023-11-14  8:14 ` [PATCH 0/2] cmd: bcb: extend BCB APIs to support Android boot flow Mattijs Korpershoek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y1f0n47v.fsf@baylibre.com \
    --to=mkorpershoek@baylibre.com \
    --cc=dimorinny@google.com \
    --cc=erosca@de.adit-jv.com \
    --cc=paul.liu@linaro.org \
    --cc=rammuthiah@google.com \
    --cc=schuffelen@google.com \
    --cc=sean.anderson@seco.com \
    --cc=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.