[PATCH 3/3] imx-bbu-nand-fcb: Add command to help debug FCB issues
Sascha Hauer
sha at pengutronix.de
Tue Oct 12 01:21:35 PDT 2021
On Mon, Oct 11, 2021 at 06:53:59PM -0700, Trent Piepho wrote:
> Add new "fcb" command. It can save a decoded copy of the FCB to a file,
> do a hexdump of the decoded FCB, or display the FCB fields. Or simply
> read and validate the FCB.
>
> The FCB uses a different ECC system that the rest of flash and there is
> no easy way to decode it in Barebox or Linux. The code already here
> does it.
>
> This will also set the nand0.barebox device parameters with the location
> of the bootloader images as read from the FCB.
>
> Signed-off-by: Trent Piepho <trent.piepho at igorinstitute.com>
> ---
> commands/Kconfig | 19 ++++++
> common/imx-bbu-nand-fcb.c | 126 ++++++++++++++++++++++++++++++++++++--
> 2 files changed, 139 insertions(+), 6 deletions(-)
>
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 5ae3cb3dd..d3b5cd7fa 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -277,6 +277,25 @@ config CMD_SLICE
> command can be used to print informations about slices and also to manipulate
> them on the command line for debugging purposes.
>
> +config CMD_IMX_NAND_FCB
> + tristate
> + prompt "iMX FCB decoding and display"
> + depends on BAREBOX_UPDATE_IMX_NAND_FCB
> + help
> + Decode and display or save the contents of the iMX FCB.
> +
> + This will add a command named "fcb" that will decode the FCB and can
> + save the decode data to a file or display the contents.
> +
> + The FCB is a block of data at the start of NAND flash that instructs
> + the iMX ROM bootloader on how to find Barebox. It uses a different
> + ECC config than the rest of NAND flash and can't be read correctly
> + with normal "md" commands.
> +
> + The command also saves the locations of the Barebox image in NAND
> + from the FCB into parameters on the NAND deivce, which are available
> + in scripts as environment variables.
> +
> # end Information commands
> endmenu
>
> diff --git a/common/imx-bbu-nand-fcb.c b/common/imx-bbu-nand-fcb.c
> index 76ac1d4f2..e61494930 100644
> --- a/common/imx-bbu-nand-fcb.c
> +++ b/common/imx-bbu-nand-fcb.c
> @@ -7,6 +7,8 @@
>
> #include <filetype.h>
> #include <common.h>
> +#include <command.h>
> +#include <getopt.h>
> #include <malloc.h>
> #include <errno.h>
> #include <fcntl.h>
> @@ -14,6 +16,7 @@
> #include <linux/sizes.h>
> #include <bbu.h>
> #include <fs.h>
> +#include <libfile.h>
> #include <linux/mtd/mtd-abi.h>
> #include <linux/mtd/nand_mxs.h>
> #include <linux/mtd/mtd.h>
> @@ -27,6 +30,9 @@
> #include <mtd/mtd-peb.h>
> #include <soc/imx/imx-nand-bcb.h>
>
> +/* Name of NAND device that contains FCB */
> +#define FCB_NAND_PART "nand0.barebox"
> +
> #ifdef CONFIG_ARCH_IMX6
> #include <mach/imx6.h>
> static inline int fcb_is_bch_encoded(void)
> @@ -387,6 +393,7 @@ static ssize_t raw_write_page(struct mtd_info *mtd, void *buf, loff_t offset)
> return ret;
> }
>
> +/* Returns size of FCB on success, negative on error */
> static int read_fcb(struct mtd_info *mtd, int num, struct fcb_block **retfcb)
> {
> int ret;
> @@ -403,10 +410,13 @@ static int read_fcb(struct mtd_info *mtd, int num, struct fcb_block **retfcb)
> goto err;
> }
>
> - if (fcb_is_bch_encoded())
> + if (fcb_is_bch_encoded()) {
> fcb = read_fcb_bch(rawpage, 40);
> - else
> + ret = 128 * 8;
> + } else {
> fcb = read_fcb_hamming_13_8(rawpage);
> + ret = 512;
> + }
>
> if (IS_ERR(fcb)) {
> pr_err("Cannot read fcb on block %d\n", num);
> @@ -415,7 +425,6 @@ static int read_fcb(struct mtd_info *mtd, int num, struct fcb_block **retfcb)
> }
>
> *retfcb = fcb;
> - ret = 0;
> err:
> free(rawpage);
>
> @@ -870,7 +879,7 @@ static int fcb_dbbt_check(struct mtd_info *mtd, int num, struct fcb_block *fcb)
> int pages_per_block = mtd->erasesize / mtd->writesize;
>
> ret = read_fcb(mtd, num, &f);
> - if (ret)
> + if (ret < 0)
> return ret;
>
> if (memcmp(fcb, f, sizeof(*fcb))) {
> @@ -1403,7 +1412,7 @@ int imx6_bbu_nand_register_handler(const char *name, unsigned long flags)
> imx_handler->filetype = filetype_arm_barebox;
>
> handler = &imx_handler->handler;
> - handler->devicefile = "nand0.barebox";
> + handler->devicefile = FCB_NAND_PART;
> handler->name = name;
> handler->flags = flags | BBU_HANDLER_CAN_REFRESH;
> handler->handler = imx_bbu_nand_update;
> @@ -1480,7 +1489,7 @@ int imx28_bbu_nand_register_handler(const char *name, unsigned long flags)
> imx_handler->filetype = filetype_mxs_bootstream;
>
> handler = &imx_handler->handler;
> - handler->devicefile = "nand0.barebox";
> + handler->devicefile = FCB_NAND_PART;
> handler->name = name;
> handler->flags = flags | BBU_HANDLER_CAN_REFRESH;
> handler->handler = imx_bbu_nand_update;
> @@ -1492,3 +1501,108 @@ int imx28_bbu_nand_register_handler(const char *name, unsigned long flags)
> return ret;
> }
> #endif
> +
> +#if IS_ENABLED(CONFIG_CMD_IMX_NAND_FCB)
> +
> +static int do_fcb(int argc, char *argv[])
> +{
> + int opt;
> + int fd;
> + int ret;
> + int fcbsize;
> + struct cdev *cdev;
> + struct fcb_block *fcb;
> + bool hex = false, info = false;
> + const char *outfile = NULL;
> + unsigned int block = 0;
> +
> + while ((opt = getopt(argc, argv, "xin:o:")) > 0) {
> + switch (opt) {
> + case 'x':
> + hex = true;
> + break;
> + case 'i':
> + info = true;
> + break;
> + case 'o':
> + outfile = optarg;
> + break;
> + case 'n':
> + block = strtoull_suffix(optarg, NULL, 0);
> + break;
> + default:
> + return COMMAND_ERROR_USAGE;
> + }
> + }
Not sure if we need to control this command in such a fine grained way.
For me just extracting all possible FCBs including the firmware images,
maybe printing consistency information would be enough. That's just a
personal opinion though, feel free to override it.
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list