2020-02-28 03:12:38

by Yoshio Furuyama

[permalink] [raw]
Subject: [PATCH v2 0/2] mtd: spinand: toshiba: Support for new Kioxia Serial NAND

First patch is to rename function name becase of add new device.
Second patch is to supprot for new device.

Yoshio Furuyama (2):
mtd: spinand: toshiba: Rename function name to change suffix and
prefix (8Gbit)
mtd: spinand: toshiba: Support for new Kioxia Serial NAND

drivers/mtd/nand/spi/toshiba.c | 173 +++++++++++++++++++++++++++++++----------
1 file changed, 130 insertions(+), 43 deletions(-)

--
1.9.1


2020-02-28 03:12:38

by Yoshio Furuyama

[permalink] [raw]
Subject: [PATCH v2 1/2] mtd: spinand: toshiba: Rename function name to change suffix and prefix (8Gbit)

The suffix was changed to classify from "g" to "j" between 1st generation
device and 2nd generation device that's new Serial NAND of Kioxia brand.
As reference that's
1st generation device of 1Gbit product is "tc58cvg0s3hraig"
2nd generation device of 1Gbit product is "tc58cvg0s3hraij".

The 8Gbit product "TH58CxG3S0HRAIJ" is new line up of Kioxia's serial nand
and changed the prefix from tc58 to th58.
Thus it was changed argument to the function from "tc58cxgxsx" to
"tx58cxgxsxraix".

Signed-off-by: Yoshio Furuyama <[email protected]>
---
changelog[v2]:Split 2 patches, and add patch description.

drivers/mtd/nand/spi/toshiba.c | 60 +++++++++++++++++++++---------------------
1 file changed, 30 insertions(+), 30 deletions(-)

diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
index 0db5ee4..700d86f 100644
--- a/drivers/mtd/nand/spi/toshiba.c
+++ b/drivers/mtd/nand/spi/toshiba.c
@@ -25,8 +25,8 @@ static SPINAND_OP_VARIANTS(write_cache_variants,
static SPINAND_OP_VARIANTS(update_cache_variants,
SPINAND_PROG_LOAD(false, 0, NULL, 0));

-static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
+static int tx58cxgxsxraix_ooblayout_ecc(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
{
if (section > 0)
return -ERANGE;
@@ -37,8 +37,8 @@ static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
return 0;
}

-static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
+static int tx58cxgxsxraix_ooblayout_free(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
{
if (section > 0)
return -ERANGE;
@@ -50,13 +50,13 @@ static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
return 0;
}

-static const struct mtd_ooblayout_ops tc58cxgxsx_ooblayout = {
- .ecc = tc58cxgxsx_ooblayout_ecc,
- .free = tc58cxgxsx_ooblayout_free,
+static const struct mtd_ooblayout_ops tx58cxgxsxraix_ooblayout = {
+ .ecc = tx58cxgxsxraix_ooblayout_ecc,
+ .free = tx58cxgxsxraix_ooblayout_free,
};

-static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,
- u8 status)
+static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
+ u8 status)
{
struct nand_device *nand = spinand_to_nand(spinand);
u8 mbf = 0;
@@ -95,75 +95,75 @@ static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,

static const struct spinand_info toshiba_spinand_table[] = {
/* 3.3V 1Gb */
- SPINAND_INFO("TC58CVG0S3", 0xC2,
+ SPINAND_INFO("TC58CVG0S3HRAIG", 0xC2,
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 3.3V 2Gb */
- SPINAND_INFO("TC58CVG1S3", 0xCB,
+ SPINAND_INFO("TC58CVG1S3HRAIG", 0xCB,
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 3.3V 4Gb */
- SPINAND_INFO("TC58CVG2S0", 0xCD,
+ SPINAND_INFO("TC58CVG2S0HRAIG", 0xCD,
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 3.3V 4Gb */
- SPINAND_INFO("TC58CVG2S0", 0xED,
+ SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 1.8V 1Gb */
- SPINAND_INFO("TC58CYG0S3", 0xB2,
+ SPINAND_INFO("TC58CYG0S3HRAIG", 0xB2,
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 1.8V 2Gb */
- SPINAND_INFO("TC58CYG1S3", 0xBB,
+ SPINAND_INFO("TC58CYG1S3HRAIG", 0xBB,
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
/* 1.8V 4Gb */
- SPINAND_INFO("TC58CYG2S0", 0xBD,
+ SPINAND_INFO("TC58CYG2S0HRAIG", 0xBD,
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
- SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
- tc58cxgxsx_ecc_get_status)),
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
};

static int toshiba_spinand_detect(struct spinand_device *spinand)
--
1.9.1

2020-02-28 03:12:42

by Yoshio Furuyama

[permalink] [raw]
Subject: [PATCH v2 2/2] mtd: spinand: toshiba: Support for new Kioxia Serial NAND

Add support for new Kioxia products.
The new Kioxia products support program load x4 command, and have
HOLD_D bit which is equivalent to QE bit.

Signed-off-by: Yoshio Furuyama <[email protected]>
---
changelog[v2]:Split 2 patches.

drivers/mtd/nand/spi/toshiba.c | 119 +++++++++++++++++++++++++++++++++++------
1 file changed, 103 insertions(+), 16 deletions(-)

diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
index 700d86f..505f9f5 100644
--- a/drivers/mtd/nand/spi/toshiba.c
+++ b/drivers/mtd/nand/spi/toshiba.c
@@ -19,6 +19,18 @@ static SPINAND_OP_VARIANTS(read_cache_variants,
SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));

+static SPINAND_OP_VARIANTS(write_cache_x4_variants,
+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
+
+static SPINAND_OP_VARIANTS(update_cache_x4_variants,
+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
+/**
+ * Backward compatibility for 1st generation Serial NAND devices
+ * which don't support Quad Program Load operation.
+ */
static SPINAND_OP_VARIANTS(write_cache_variants,
SPINAND_PROG_LOAD(true, 0, NULL, 0));

@@ -94,7 +106,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
}

static const struct spinand_info toshiba_spinand_table[] = {
- /* 3.3V 1Gb */
+ /* 3.3V 1Gb (1st generation) */
SPINAND_INFO("TC58CVG0S3HRAIG", 0xC2,
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -104,7 +116,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
- /* 3.3V 2Gb */
+ /* 3.3V 2Gb (1st generation) */
SPINAND_INFO("TC58CVG1S3HRAIG", 0xCB,
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -114,7 +126,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
- /* 3.3V 4Gb */
+ /* 3.3V 4Gb (1st generation) */
SPINAND_INFO("TC58CVG2S0HRAIG", 0xCD,
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -124,17 +136,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
- /* 3.3V 4Gb */
- SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
- NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
- NAND_ECCREQ(8, 512),
- SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
- &write_cache_variants,
- &update_cache_variants),
- 0,
- SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
- tx58cxgxsxraix_ecc_get_status)),
- /* 1.8V 1Gb */
+ /* 1.8V 1Gb (1st generation) */
SPINAND_INFO("TC58CYG0S3HRAIG", 0xB2,
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -144,7 +146,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
- /* 1.8V 2Gb */
+ /* 1.8V 2Gb (1st generation) */
SPINAND_INFO("TC58CYG1S3HRAIG", 0xBB,
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -154,7 +156,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
- /* 1.8V 4Gb */
+ /* 1.8V 4Gb (1st generation) */
SPINAND_INFO("TC58CYG2S0HRAIG", 0xBD,
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
NAND_ECCREQ(8, 512),
@@ -164,6 +166,91 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
0,
SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
tx58cxgxsxraix_ecc_get_status)),
+
+ /*
+ * 2nd generation serial nand has HOLD_D which is equivalent to
+ * QE_BIT.
+ */
+ /* 3.3V 1Gb (2nd generation) */
+ SPINAND_INFO("TC58CVG0S3HRAIJ", 0xE2,
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 3.3V 2Gb (2nd generation) */
+ SPINAND_INFO("TC58CVG1S3HRAIJ", 0xEB,
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 3.3V 4Gb (2nd generation) */
+ SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 3.3V 8Gb (2nd generation) */
+ SPINAND_INFO("TH58CVG3S0HRAIJ", 0xE4,
+ NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 1.8V 1Gb (2nd generation) */
+ SPINAND_INFO("TC58CYG0S3HRAIJ", 0xD2,
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 1.8V 2Gb (2nd generation) */
+ SPINAND_INFO("TC58CYG1S3HRAIJ", 0xDB,
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 1.8V 4Gb (2nd generation) */
+ SPINAND_INFO("TC58CYG2S0HRAIJ", 0xDD,
+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
+ /* 1.8V 8Gb (2nd generation) */
+ SPINAND_INFO("TH58CYG3S0HRAIJ", 0xD4,
+ NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_x4_variants,
+ &update_cache_x4_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
+ tx58cxgxsxraix_ecc_get_status)),
};

static int toshiba_spinand_detect(struct spinand_device *spinand)
--
1.9.1

2020-03-02 08:02:51

by Frieder Schrempf

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] mtd: spinand: toshiba: Rename function name to change suffix and prefix (8Gbit)

On 28.02.20 04:11, Yoshio Furuyama wrote:
> The suffix was changed to classify from "g" to "j" between 1st generation
> device and 2nd generation device that's new Serial NAND of Kioxia brand.

I had to read this sentence multiple times to understand it. Maybe
something like this would be better:

The suffix was changed from "g" to "j" to classify between 1st
generation and 2nd generation serial NAND devices (which now belong to
the Kioxia brand).

> As reference that's
> 1st generation device of 1Gbit product is "tc58cvg0s3hraig"
> 2nd generation device of 1Gbit product is "tc58cvg0s3hraij".
>
> The 8Gbit product "TH58CxG3S0HRAIJ" is new line up of Kioxia's serial nand
> and changed the prefix from tc58 to th58.
> Thus it was changed argument to the function from "tc58cxgxsx" to
> "tx58cxgxsxraix".

Same here. It is very hard to read. I would write something like this:

The 8Gbit type "TH58CxG3S0HRAIJ" is new to Kioxia's serial NAND lineup
and the prefix was changed from "TC58" to "TH85".

Thus the functions were renamed from tc58cxgxsx_*() to
tx58cxgxsxraix_*().

With an easier to understand commit message:

Reviewed-by: Frieder Schrempf <[email protected]>

>
> Signed-off-by: Yoshio Furuyama <[email protected]>
> ---
> changelog[v2]:Split 2 patches, and add patch description.
>
> drivers/mtd/nand/spi/toshiba.c | 60 +++++++++++++++++++++---------------------
> 1 file changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
> index 0db5ee4..700d86f 100644
> --- a/drivers/mtd/nand/spi/toshiba.c
> +++ b/drivers/mtd/nand/spi/toshiba.c
> @@ -25,8 +25,8 @@ static SPINAND_OP_VARIANTS(write_cache_variants,
> static SPINAND_OP_VARIANTS(update_cache_variants,
> SPINAND_PROG_LOAD(false, 0, NULL, 0));
>
> -static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
> - struct mtd_oob_region *region)
> +static int tx58cxgxsxraix_ooblayout_ecc(struct mtd_info *mtd, int section,
> + struct mtd_oob_region *region)
> {
> if (section > 0)
> return -ERANGE;
> @@ -37,8 +37,8 @@ static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
> return 0;
> }
>
> -static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
> - struct mtd_oob_region *region)
> +static int tx58cxgxsxraix_ooblayout_free(struct mtd_info *mtd, int section,
> + struct mtd_oob_region *region)
> {
> if (section > 0)
> return -ERANGE;
> @@ -50,13 +50,13 @@ static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
> return 0;
> }
>
> -static const struct mtd_ooblayout_ops tc58cxgxsx_ooblayout = {
> - .ecc = tc58cxgxsx_ooblayout_ecc,
> - .free = tc58cxgxsx_ooblayout_free,
> +static const struct mtd_ooblayout_ops tx58cxgxsxraix_ooblayout = {
> + .ecc = tx58cxgxsxraix_ooblayout_ecc,
> + .free = tx58cxgxsxraix_ooblayout_free,
> };
>
> -static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,
> - u8 status)
> +static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> + u8 status)
> {
> struct nand_device *nand = spinand_to_nand(spinand);
> u8 mbf = 0;
> @@ -95,75 +95,75 @@ static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,
>
> static const struct spinand_info toshiba_spinand_table[] = {
> /* 3.3V 1Gb */
> - SPINAND_INFO("TC58CVG0S3", 0xC2,
> + SPINAND_INFO("TC58CVG0S3HRAIG", 0xC2,
> NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 3.3V 2Gb */
> - SPINAND_INFO("TC58CVG1S3", 0xCB,
> + SPINAND_INFO("TC58CVG1S3HRAIG", 0xCB,
> NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 3.3V 4Gb */
> - SPINAND_INFO("TC58CVG2S0", 0xCD,
> + SPINAND_INFO("TC58CVG2S0HRAIG", 0xCD,
> NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 3.3V 4Gb */
> - SPINAND_INFO("TC58CVG2S0", 0xED,
> + SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
> NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 1.8V 1Gb */
> - SPINAND_INFO("TC58CYG0S3", 0xB2,
> + SPINAND_INFO("TC58CYG0S3HRAIG", 0xB2,
> NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 1.8V 2Gb */
> - SPINAND_INFO("TC58CYG1S3", 0xBB,
> + SPINAND_INFO("TC58CYG1S3HRAIG", 0xBB,
> NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> /* 1.8V 4Gb */
> - SPINAND_INFO("TC58CYG2S0", 0xBD,
> + SPINAND_INFO("TC58CYG2S0HRAIG", 0xBD,
> NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> &write_cache_variants,
> &update_cache_variants),
> 0,
> - SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
> - tc58cxgxsx_ecc_get_status)),
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> };
>
> static int toshiba_spinand_detect(struct spinand_device *spinand)
>

2020-03-02 08:03:42

by Frieder Schrempf

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] mtd: spinand: toshiba: Support for new Kioxia Serial NAND

On 28.02.20 04:12, Yoshio Furuyama wrote:
> Add support for new Kioxia products.
> The new Kioxia products support program load x4 command, and have
> HOLD_D bit which is equivalent to QE bit.
>
> Signed-off-by: Yoshio Furuyama <[email protected]>

Reviewed-by: Frieder Schrempf <[email protected]>

> ---
> changelog[v2]:Split 2 patches.
>
> drivers/mtd/nand/spi/toshiba.c | 119 +++++++++++++++++++++++++++++++++++------
> 1 file changed, 103 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
> index 700d86f..505f9f5 100644
> --- a/drivers/mtd/nand/spi/toshiba.c
> +++ b/drivers/mtd/nand/spi/toshiba.c
> @@ -19,6 +19,18 @@ static SPINAND_OP_VARIANTS(read_cache_variants,
> SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
> SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
>
> +static SPINAND_OP_VARIANTS(write_cache_x4_variants,
> + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
> + SPINAND_PROG_LOAD(true, 0, NULL, 0));
> +
> +static SPINAND_OP_VARIANTS(update_cache_x4_variants,
> + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
> + SPINAND_PROG_LOAD(false, 0, NULL, 0));
> +
> +/**
> + * Backward compatibility for 1st generation Serial NAND devices
> + * which don't support Quad Program Load operation.
> + */
> static SPINAND_OP_VARIANTS(write_cache_variants,
> SPINAND_PROG_LOAD(true, 0, NULL, 0));
>
> @@ -94,7 +106,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> }
>
> static const struct spinand_info toshiba_spinand_table[] = {
> - /* 3.3V 1Gb */
> + /* 3.3V 1Gb (1st generation) */
> SPINAND_INFO("TC58CVG0S3HRAIG", 0xC2,
> NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -104,7 +116,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> - /* 3.3V 2Gb */
> + /* 3.3V 2Gb (1st generation) */
> SPINAND_INFO("TC58CVG1S3HRAIG", 0xCB,
> NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -114,7 +126,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> - /* 3.3V 4Gb */
> + /* 3.3V 4Gb (1st generation) */
> SPINAND_INFO("TC58CVG2S0HRAIG", 0xCD,
> NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -124,17 +136,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> - /* 3.3V 4Gb */
> - SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
> - NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> - NAND_ECCREQ(8, 512),
> - SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> - &write_cache_variants,
> - &update_cache_variants),
> - 0,
> - SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> - tx58cxgxsxraix_ecc_get_status)),
> - /* 1.8V 1Gb */
> + /* 1.8V 1Gb (1st generation) */
> SPINAND_INFO("TC58CYG0S3HRAIG", 0xB2,
> NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -144,7 +146,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> - /* 1.8V 2Gb */
> + /* 1.8V 2Gb (1st generation) */
> SPINAND_INFO("TC58CYG1S3HRAIG", 0xBB,
> NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -154,7 +156,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> - /* 1.8V 4Gb */
> + /* 1.8V 4Gb (1st generation) */
> SPINAND_INFO("TC58CYG2S0HRAIG", 0xBD,
> NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> NAND_ECCREQ(8, 512),
> @@ -164,6 +166,91 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand,
> 0,
> SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> tx58cxgxsxraix_ecc_get_status)),
> +
> + /*
> + * 2nd generation serial nand has HOLD_D which is equivalent to
> + * QE_BIT.
> + */
> + /* 3.3V 1Gb (2nd generation) */
> + SPINAND_INFO("TC58CVG0S3HRAIJ", 0xE2,
> + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 3.3V 2Gb (2nd generation) */
> + SPINAND_INFO("TC58CVG1S3HRAIJ", 0xEB,
> + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 3.3V 4Gb (2nd generation) */
> + SPINAND_INFO("TC58CVG2S0HRAIJ", 0xED,
> + NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 3.3V 8Gb (2nd generation) */
> + SPINAND_INFO("TH58CVG3S0HRAIJ", 0xE4,
> + NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 1.8V 1Gb (2nd generation) */
> + SPINAND_INFO("TC58CYG0S3HRAIJ", 0xD2,
> + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 1.8V 2Gb (2nd generation) */
> + SPINAND_INFO("TC58CYG1S3HRAIJ", 0xDB,
> + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 1.8V 4Gb (2nd generation) */
> + SPINAND_INFO("TC58CYG2S0HRAIJ", 0xDD,
> + NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> + /* 1.8V 8Gb (2nd generation) */
> + SPINAND_INFO("TH58CYG3S0HRAIJ", 0xD4,
> + NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
> + NAND_ECCREQ(8, 512),
> + SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> + &write_cache_x4_variants,
> + &update_cache_x4_variants),
> + SPINAND_HAS_QE_BIT,
> + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout,
> + tx58cxgxsxraix_ecc_get_status)),
> };
>
> static int toshiba_spinand_detect(struct spinand_device *spinand)
>

2020-03-02 09:13:21

by Miquel Raynal

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] mtd: spinand: toshiba: Rename function name to change suffix and prefix (8Gbit)

Hello,

Schrempf Frieder <[email protected]> wrote on Mon, 2 Mar 2020
08:02:25 +0000:

> On 28.02.20 04:11, Yoshio Furuyama wrote:
> > The suffix was changed to classify from "g" to "j" between 1st generation
> > device and 2nd generation device that's new Serial NAND of Kioxia brand.
>
> I had to read this sentence multiple times to understand it. Maybe
> something like this would be better:
>
> The suffix was changed from "g" to "j" to classify between 1st
> generation and 2nd generation serial NAND devices (which now belong to
> the Kioxia brand).
>
> > As reference that's
> > 1st generation device of 1Gbit product is "tc58cvg0s3hraig"
> > 2nd generation device of 1Gbit product is "tc58cvg0s3hraij".
> >
> > The 8Gbit product "TH58CxG3S0HRAIJ" is new line up of Kioxia's serial nand
> > and changed the prefix from tc58 to th58.
> > Thus it was changed argument to the function from "tc58cxgxsx" to
> > "tx58cxgxsxraix".
>
> Same here. It is very hard to read. I would write something like this:
>
> The 8Gbit type "TH58CxG3S0HRAIJ" is new to Kioxia's serial NAND lineup
> and the prefix was changed from "TC58" to "TH85".
>
> Thus the functions were renamed from tc58cxgxsx_*() to
> tx58cxgxsxraix_*().
>
> With an easier to understand commit message:
>
> Reviewed-by: Frieder Schrempf <[email protected]>

Agreed, the commit log proposal from Frieder looks better.

The rest of the patch is fine by me though.

Thanks,
Miquèl

2020-03-05 02:44:27

by Yoshio Furuyama

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] mtd: spinand: toshiba: Rename function name to change suffix and prefix (8Gbit)


On 2020/03/02 18:12, Miquel Raynal wrote:
> Hello,
>
> Schrempf Frieder <[email protected]> wrote on Mon, 2 Mar 2020
> 08:02:25 +0000:
>
>> On 28.02.20 04:11, Yoshio Furuyama wrote:
>>> The suffix was changed to classify from "g" to "j" between 1st generation
>>> device and 2nd generation device that's new Serial NAND of Kioxia brand.
>> I had to read this sentence multiple times to understand it. Maybe
>> something like this would be better:
>>
>> The suffix was changed from "g" to "j" to classify between 1st
>> generation and 2nd generation serial NAND devices (which now belong to
>> the Kioxia brand).
Thanks comment,     I will send revise rev.
>>> As reference that's
>>> 1st generation device of 1Gbit product is "tc58cvg0s3hraig"
>>> 2nd generation device of 1Gbit product is "tc58cvg0s3hraij".
>>>
>>> The 8Gbit product "TH58CxG3S0HRAIJ" is new line up of Kioxia's serial nand
>>> and changed the prefix from tc58 to th58.
>>> Thus it was changed argument to the function from "tc58cxgxsx" to
>>> "tx58cxgxsxraix".
>> Same here. It is very hard to read. I would write something like this:
>>
>> The 8Gbit type "TH58CxG3S0HRAIJ" is new to Kioxia's serial NAND lineup
>> and the prefix was changed from "TC58" to "TH85".
>>
>> Thus the functions were renamed from tc58cxgxsx_*() to
>> tx58cxgxsxraix_*().

I will change prefix from "TH85" to "TH58" .  Since this is typo.

The 8Gbit type "TH58CxG3S0HRAIJ" is new to Kioxia's serial NAND lineup
and the prefix was changed from "TC58" to "TH58".

Thus the functions were renamed from tc58cxgxsx_*() to
tx58cxgxsxraix_*().

Thanks,

>> With an easier to understand commit message:
>>
>> Reviewed-by: Frieder Schrempf <[email protected]>
> Agreed, the commit log proposal from Frieder looks better.
>
> The rest of the patch is fine by me though.
>
> Thanks,
> Miquèl
>
>