public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Peter Pan <peterpansjtu@gmail.com>
Cc: computersforpeace@gmail.com, dwmw2@infradead.org,
	fransklaver@gmail.com, Peter Pan <peterpandong@micron.com>,
	beanhuo@micron.com, linux-mtd@lists.infradead.org,
	linux-kernel@vger.kernel.org, karlzhang@micron.com
Subject: Re: [PATCH v2 02/12] mtd: nand_bbt: introduce struct nand_bbt
Date: Wed, 6 Jan 2016 14:12:58 +0100	[thread overview]
Message-ID: <20160106141258.5c1e5fc6@bbrezillon> (raw)
In-Reply-To: <1450159178-29895-3-git-send-email-peterpandong@micron.com>

Brian, Peter,

On Tue, 15 Dec 2015 05:59:28 +0000
Peter Pan <peterpansjtu@gmail.com> wrote:

> From: Brian Norris <computersforpeace@gmail.com>
> 
> Currently nand_bbt.c is tied with struct nand_chip, and it makes other
> NAND family chips hard to use nand_bbt.c. Maybe it's the reason why
> onenand has own bbt(onenand_bbt.c).
> 
> Separate struct nand_chip from BBT code can make current BBT shareable.
> We create struct nand_bbt to take place of nand_chip in nand_bbt.c
> 
> Below is mtd folder structure we want:
> 	mtd
> 	├── Kconfig
> 	├── Makefile
> 	├── ...
> 	├── nand_bbt.c
> 	├── nand
> 	│   ├── Kconfig
> 	│   ├── Makefile
> 	│   ├── nand_base.c
> 	│   ├── nand_ids.c
> 	│   ├── ...
> 	│   └── xway_nand.c
> 	├── spi-nand
> 	│   ├── Kconfig
> 	│   ├── Makefile
> 	│   ├── spi-nand-base.c
> 	│   ├── ...
> 	│   └── spi-nand-device.c
> 	└── ...
> 
> We put every information nand_bbt.c needed from outside into struct
> nand_bbt, include:
> 	@mtd:	pointer to MTD device structure
> 	@is_bad_bbm:	check if a block is factory bad block
> 	@mark_bad_bbm:	imitate a block as factory bad block
> 	@erase:	erase block bypassing resvered checks
> 	@bbt_options:	bad block specific options. All options used
> 			here must come from nand_bbt.h.
> 	@numchips:	number of physical chips, required for NAND_BBT_PERCHIP
> 	@bbt_td:	bad block table descriptor for flash lookup.
> 	@bbt_md:	bad block table mirror descriptor
> 	@chipsize:	the size of one chip for multichip arrays
> 	@chip_shift:	number of address bits in one chip
> 	@bbt_erase_shift:	number of address bits in a bbt entry
> 	@page_shift:	number of address bits in a page
> 	@bbt:	bad block table pointer
> 
> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
> [Peter: correct comment style]
> Signed-off-by: Peter Pan <peterpandong@micron.com>
> ---
>  include/linux/mtd/nand_bbt.h | 59 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 59 insertions(+)
> 
> diff --git a/include/linux/mtd/nand_bbt.h b/include/linux/mtd/nand_bbt.h
> index 5a65230..e468571 100644
> --- a/include/linux/mtd/nand_bbt.h
> +++ b/include/linux/mtd/nand_bbt.h
> @@ -18,6 +18,8 @@
>  #ifndef __LINUX_MTD_NAND_BBT_H
>  #define __LINUX_MTD_NAND_BBT_H
>  
> +struct mtd_info;
> +
>  /* The maximum number of NAND chips in an array */
>  #define NAND_MAX_CHIPS		8
>  
> @@ -115,4 +117,61 @@ struct nand_bbt_descr {
>  /* The maximum number of blocks to scan for a bbt */
>  #define NAND_BBT_SCAN_MAXBLOCKS	4
>  
> +/**
> + * struct nand_bbt - bad block table structure
> + * @mtd:	pointer to MTD device structure
> + * @is_bad_bbm:	check if a block is factory bad block
> + * @mark_bad_bbm:	imitate a block as factory bad block
> + * @erase:	erase block bypassing resvered checks
> + * @bbt_options:	bad block specific options. All options used
> + *			here must come from nand_bbt.h.
> + * @numchips:	number of physical chips, required for NAND_BBT_PERCHIP
> + * @bbt_td:	bad block table descriptor for flash lookup.
> + * @bbt_md:	bad block table mirror descriptor
> + * @chipsize:	the size of one chip for multichip arrays
> + * @chip_shift:	number of address bits in one chip
> + * @bbt_erase_shift:	number of address bits in a bbt entry
> + * @page_shift:	number of address bits in a page
> + * @bbt:	bad block table pointer
> + *
> + */
> +struct nand_bbt {
> +	struct mtd_info *mtd;
> +
> +	/*
> +	 * This is important to abstract out of nand_bbt.c and provide
> +	 * separately in nand_base.c and spi-nand-base.c -- it's sort of
> +	 * duplicated in nand_block_bad() (nand_base) and
> +	 * scan_block_fast() (nand_bbt) right now
> +	 *
> +	 * Note that this also means nand_chip.badblock_pattern should
> +	 * be removed from nand_bbt.c
> +	 */
> +	int (*is_bad_bbm)(struct mtd_info *mtd, loff_t ofs);
> +
> +	/*
> +	 * Only required if the driver wants to attempt to program new
> +	 * bad block markers that imitate the factory-marked BBMs
> +	 */
> +	int (*mark_bad_bbm)(struct mtd_info *mtd, loff_t ofs);

Not sure what this function is really meant for, and it's not used in
the current patch series. Do you have an example where it would be
useful and how it would be implemented?
In any case, shouldn't we delay the creation of this method until we
have a real user?

> +
> +	/* Erase a block, bypassing reserved checks */
> +	int (*erase)(struct mtd_info *mtd, loff_t ofs);

Just a question about the above methods (->is_bad_bbm(),
->mark_bad_bbm() and ->erase()). Are those really meant to be defined
on a per-chip basis, or is this something set by the NAND controller, or
NAND interface common code (raw, SPI, onenand)?
In the latter case, I'd suggest defining a nand_bbt_ops struct where
you would put those methods, and then adding a
const struct nand_bbt_ops * field in nand_bbt.

I also think we should pass struct nand_bbt and not struct mtd as the
first argument of all this functions. mtd can thus be retrieved using
bbt->mtd (or even better, you could hide it behind an helper function).

> +
> +	unsigned int bbt_options;
> +	int numchips;
> +
> +	/*
> +	 * Discourage new custom usages here; suggest usage of the
> +	 * relevant NAND_BBT_* options instead
> +	 */
> +	struct nand_bbt_descr *bbt_td;
> +	struct nand_bbt_descr *bbt_md;
> +	u64 chipsize;
> +	int chip_shift;
> +	int bbt_erase_shift;
> +	int page_shift;
> +	u8 *bbt;
> +};

It seems that this nand_bbt struct is redefining some fields already
specified in nand_chip (->numchips, ->chipsize, ->chip_shift, ...), and
I guess those fields are also defined in onenand_chip and will be
defined in spi_nand_chip, so maybe it's time to create a nand_chip_info
or nand_chip_layout_info struct containing all those fields and pass a
const pointer to this struct when creating the bbt object.

Best Regards,

Boris

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

  reply	other threads:[~2016-01-06 13:13 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-15  5:59 [PATCH v2 00/12] mtd: nand_bbt: introduce independent nand BBT Peter Pan
2015-12-15  5:59 ` [PATCH v2 01/12] mtd: nand_bbt: new header for nand family BBT Peter Pan
2015-12-15  5:59 ` [PATCH v2 02/12] mtd: nand_bbt: introduce struct nand_bbt Peter Pan
2016-01-06 13:12   ` Boris Brezillon [this message]
2015-12-15  5:59 ` [PATCH v2 03/12] mtd: nand_bbt: add new API definitions Peter Pan
2015-12-15  5:59 ` [PATCH v2 04/12] mtd: nand_bbt: add nand_bbt_markbad_factory() interface Peter Pan
2015-12-15  5:59 ` [PATCH v2 05/12] mtd: nand: use new BBT API instead of old ones Peter Pan
2016-01-06 13:36   ` Boris Brezillon
2016-01-06 14:38   ` Boris Brezillon
2016-01-06 15:22   ` Boris Brezillon
2016-01-07  6:03     ` Peter Pan
2015-12-15  5:59 ` [PATCH v2 06/12] mtd: nand_bbt: use erase() and is_bad_bbm() hook in BBT Peter Pan
2016-01-06 13:49   ` Boris Brezillon
2015-12-15  5:59 ` [PATCH v2 07/12] mtd: nand: make nand_erase_nand() static Peter Pan
2015-12-15  5:59 ` [PATCH v2 08/12] mtd: nand_bbt: remove struct nand_chip from nand_bbt.c Peter Pan
2016-01-06 15:16   ` Boris Brezillon
2016-01-07  6:04     ` Peter Pan
2015-12-15  5:59 ` [PATCH v2 09/12] mtd: nand_bbt: remove old API definitions Peter Pan
2015-12-15  5:59 ` [PATCH v2 10/12] mtd: nand_bbt: remove NAND_BBT_DYNAMICSTRUCT macro Peter Pan
2015-12-15  5:59 ` [PATCH v2 11/12] mtd: nand: remove nand_chip.bbt Peter Pan
2015-12-15  5:59 ` [PATCH v2 12/12] mtd: nand-bbt: move nand_bbt.c to mtd folder Peter Pan
2015-12-28 20:42 ` [PATCH v2 00/12] mtd: nand_bbt: introduce independent nand BBT Ezequiel Garcia
2015-12-29  9:35   ` Boris Brezillon
2015-12-29 15:07     ` Ezequiel Garcia
2015-12-29 15:11       ` Boris Brezillon
2015-12-30  7:18         ` 潘栋
2015-12-30  8:31           ` Boris Brezillon
2016-01-06 14:29             ` Boris Brezillon
2016-01-07  5:53               ` Peter Pan

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=20160106141258.5c1e5fc6@bbrezillon \
    --to=boris.brezillon@free-electrons.com \
    --cc=beanhuo@micron.com \
    --cc=computersforpeace@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=fransklaver@gmail.com \
    --cc=karlzhang@micron.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=peterpandong@micron.com \
    --cc=peterpansjtu@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox