All of lore.kernel.org
 help / color / mirror / Atom feed
From: Scott Wood <scottwood@freescale.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [U-Boot, U-boot, 1/2] common: cmd_nand: add nand ecclayout command
Date: Thu, 19 Jun 2014 20:00:12 -0500	[thread overview]
Message-ID: <20140620010012.GA5906@home.buserror.net> (raw)
In-Reply-To: <1400264797-3593-2-git-send-email-ivan.khoronzhuk@ti.com>

On Fri, May 16, 2014 at 09:26:36PM +0300, Khoronzhuk, Ivan wrote:
> From: WingMan Kwok <w-kwok2@ti.com>
> 
> This commit adds a nand ecclayout command that allows the ecclayout of
> the current nand device to be changed during run time. This feature is
> useful when using u-boot to write something to nand flash that will be
> read by other applications, such as ROM bootloader, that expects a
> different ECC layout. In that case, change the current nand device
> ecclayout using the "nand ecclayout set" command before writing the
> data to nand flash.
> 
> Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
> 
> ---
> common/cmd_nand.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  include/nand.h    |  10 +++++
>  2 files changed, 124 insertions(+), 1 deletion(-)
> 
> diff --git a/common/cmd_nand.c b/common/cmd_nand.c
> index 04ab0f1..7cbe6fc 100644
> --- a/common/cmd_nand.c
> +++ b/common/cmd_nand.c
> @@ -462,6 +462,53 @@ static void adjust_size_for_badblocks(loff_t *size, loff_t offset, int dev)
>  	}
>  }
>  
> +#ifdef CONFIG_CMD_NAND_ECCLAYOUT
> +static void nand_print_ecclayout_info(struct nand_ecclayout *p)
> +{
> +	int i;
> +	struct nand_oobfree *oobfree;
> +
> +	if (!p)
> +		return;
> +
> +	printf("  num ecc bytes: %d\n", p->eccbytes);
> +	puts("  ecc pos:\n    ");
> +
> +	for (i = 0; i < p->eccbytes; i++) {
> +		if (i && !(i % 9))
> +			printf("\n    ");
> +
> +		printf("%2d ", p->eccpos[i]);
> +	}

Why 9?

> +	puts("\n  oobfree:\n");
> +	puts("    offset length\n");
> +
> +	oobfree = p->oobfree;
> +	for (i = 0; oobfree->length && i < MTD_MAX_OOBFREE_ENTRIES_LARGE; i++) {
> +		printf("     %2d    %2d\n", oobfree->offset, oobfree->length);
> +		oobfree++;
> +	}
> +}
> +
> +static void nand_print_device_ecclayout(int dev)
> +{
> +	int idx;
> +	nand_info_t *nand = &nand_info[dev];
> +	struct nand_chip *chip = nand->priv;
> +
> +	idx = board_nand_ecclayout_get_idx(chip, chip->ecc.layout);
> +
> +	if (idx < 0) {
> +		puts("no ecc layout\n");
> +		return;
> +	}
> +
> +	printf("\necc layout %d:\n", idx);
> +	nand_print_ecclayout_info(chip->ecc.layout);
> +}
> +#endif
> +
>  static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  {
>  	int i, ret = 0;
> @@ -506,8 +553,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  			putc('\n');
>  			if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE)
>  				puts("no devices available\n");
> -			else
> +			else {
>  				nand_print_and_set_info(dev);
> +#ifdef CONFIG_CMD_NAND_ECCLAYOUT
> +				nand_print_device_ecclayout(dev);
> +#endif
> +			}
>  			return 0;
>  		}

Braces are needed on both sides of if/else if used on one side.

It would be better to provide an inline no-op stub when
CONFIG_CMD_NAND_ECCLAYOUT, than ifdeffing at the call site.

Does it really make sense to dump this information here, when the user
could use the ecclayout command instead?

> @@ -836,6 +887,60 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  	}
>  #endif
>  
> +#ifdef CONFIG_CMD_NAND_ECCLAYOUT
> +	if (strcmp(cmd, "ecclayout") == 0) {
> +		int idx;
> +		struct nand_ecclayout *p;
> +		nand_info_t *nand = &nand_info[dev];
> +		struct nand_chip *chip = nand->priv;
> +
> +		if (argc < 3) {
> +			puts("Current device ecclayout:\n");
> +			nand_print_device_ecclayout(dev);
> +			return 0;
> +		}
> +
> +		if (!strcmp(argv[2], "set")) {
> +			if (argc < 4)
> +				return 1;
> +
> +			idx = (int)simple_strtoul(argv[3], NULL, 10);
> +			if (!board_nand_ecclayout_set(chip, idx)) {
> +				p = chip->ecc.layout;
> +				p->oobavail = 0;
> +				for (i = 0; p->oobfree[i].length &&
> +						i < ARRAY_SIZE(p->oobfree); i++)
> +					p->oobavail += p->oobfree[i].length;
> +
> +				nand->oobavail = p->oobavail;

Shouldn't board_nand_ecclayout_set() take care of this?  Possibly via
common helper functions, but not here.

> +			} else {
> +				printf("Setting current device"
> +				       " to ecc layout %d FAILED!\n", idx);

Don't wrap user-visible strings (checkpatch should have warned you about
this).

> +			}
> +
> +			return 0;
> +		}
> +
> +		if (strcmp(argv[2], "all") != 0)
> +			return 1;
> +
> +		/* show all available ecc layouts */
> +		puts("Available ecc layouts:\n");
> +
> +		idx = 0;
> +		while (1) {
> +			p = board_nand_ecclayout_get_layout(chip, idx);
> +			if (!p)
> +				break;
> +
> +			printf("\n ecc layout %d:\n", idx++);
> +			nand_print_ecclayout_info(p);
> +		}

Please use a for loop rather than hiding the increment in the loop body.

> +
> +		return 0;
> +	}
> +#endif
> +
>  usage:
>  	return CMD_RET_USAGE;
>  }
> @@ -890,6 +995,14 @@ static char nand_help_text[] =
>  	"nand env.oob set off|partition - set enviromnent offset\n"
>  	"nand env.oob get - get environment offset"
>  #endif
> +#ifdef CONFIG_CMD_NAND_ECCLAYOUT
> +	"\n"
> +	"nand ecclayout <set <idx>|all> - show or set ecclayout"
> +	" of current device\n"
> +	"    'all' shows all available ecc layouts for setting"
> +	" to current device\n"
> +	"    'set' sets current device ecc layout to layout indexed by idx\n"
> +#endif

This help text doesn't include the plain "nand ecclayout" to show the
current layout.

> diff --git a/include/nand.h b/include/nand.h
> index fc735d1..0e8a093 100644
> --- a/include/nand.h
> +++ b/include/nand.h
> @@ -155,6 +155,16 @@ void nand_deselect(void);
>  void board_nand_select_device(struct nand_chip *nand, int chip);
>  #endif
>  
> +#ifdef CONFIG_CMD_NAND_ECCLAYOUT
> +int board_nand_ecclayout_get_idx(struct nand_chip *nand,
> +				 struct nand_ecclayout *p);
> +
> +struct nand_ecclayout *board_nand_ecclayout_get_layout(struct nand_chip *nand,
> +						       int idx);
> +
> +int board_nand_ecclayout_set(struct nand_chip *nand, int idx);
> +#endif

Don't ifdef prototypes.

-Scott

  reply	other threads:[~2014-06-20  1:00 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-16 18:26 [U-Boot] [U-boot] [Patch 0/2] keystone: nand: add additional nand ecclayout Ivan Khoronzhuk
2014-05-16 18:26 ` [U-Boot] [U-boot] [Patch 1/2] common: cmd_nand: add nand ecclayout command Ivan Khoronzhuk
2014-06-20  1:00   ` Scott Wood [this message]
2014-06-20 13:29     ` [U-Boot] [U-Boot, U-boot, " Ivan Khoronzhuk
2014-06-20 14:10       ` Jon Loeliger
2014-06-20 16:03         ` Scott Wood
2014-06-20 17:10           ` Ivan Khoronzhuk
2014-06-20 16:31       ` Scott Wood
2014-06-20 17:02         ` Ivan Khoronzhuk
2014-05-16 18:26 ` [U-Boot] [U-boot] [Patch 2/2] mtd: nand: davinci: allow to change ecclayout by " Ivan Khoronzhuk
2014-06-20  1:07   ` [U-Boot] [U-Boot, U-boot, " Scott Wood
2014-06-20 14:59     ` Ivan Khoronzhuk
2014-06-20 16:22       ` Scott Wood
2014-06-20 16:57         ` Ivan Khoronzhuk

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=20140620010012.GA5906@home.buserror.net \
    --to=scottwood@freescale.com \
    --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.