mtd: spinand: add support for SkyHigh Memory ML-3 SPI NAND Flash family
Subsystems (2)
PATCH 1/1 mtd: spinand: add support for SkyHigh Memory ML-3 SPI NAND Flash family
This patch has been added to operate properly on SkyHigh memory's SPI NAND. This patch is derived from Takahiro's work who is author.
Added:
- Some patch code for the SkyHigh Memory ML-3 SPI NAND Flash family.
Created:
- skyhigh.c
--- drivers/mtd/nand/spi/Makefile | 2 +- drivers/mtd/nand/spi/core.c | 7 +- drivers/mtd/nand/spi/skyhigh.c | 146 +++++++++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 3 + 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 drivers/mtd/nand/spi/skyhigh.c
drivers/mtd/nand/spi/Makefile +1 -1
@@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o -spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o +spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
drivers/mtd/nand/spi/core.c +6 -1
@@ -34,7 +34,7 @@ static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)return 0 ; } -static int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val) +int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val) {struct spi_mem_op op =SPINAND_SET_FEATURE_OP (reg, spinand->scratchbuf);
@@ -196,6 +196,10 @@ static int spinand_init_quad_enable(struct spinand_device *spinand)static int spinand_ecc_enable (struct spinand_device *spinand,bool enable) { +/* SHM : always ECC On */ +if (spinand->flags &SPINAND_ON_DIE_ECC_MANDATORY ) +return 0 ; +return spinand_upd_cfg (spinand,CFG_ECC_ENABLE , enable ?CFG_ECC_ENABLE :0 ); }
@@ -945,6 +949,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = { ¯onix_spinand_manufacturer, µn_spinand_manufacturer, ¶gon_spinand_manufacturer, + &skyhigh_spinand_manufacturer, &toshiba_spinand_manufacturer, &winbond_spinand_manufacturer, &xtx_spinand_manufacturer,
drivers/mtd/nand/spi/skyhigh.c new file +146 -0
146 lines not on this page · raw message
include/linux/mtd/spinand.h +3 -0
@@ -268,6 +268,7 @@ extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;extern const struct spinand_manufacturer macronix_spinand_manufacturer;extern const struct spinand_manufacturer micron_spinand_manufacturer;extern const struct spinand_manufacturer paragon_spinand_manufacturer; +extern const struct spinand_manufacturer skyhigh_spinand_manufacturer;extern const struct spinand_manufacturer toshiba_spinand_manufacturer;extern const struct spinand_manufacturer winbond_spinand_manufacturer;extern const struct spinand_manufacturer xtx_spinand_manufacturer;
@@ -312,6 +313,7 @@ struct spinand_ecc_info {#define SPINAND_HAS_QE_BIT BIT(0)#define SPINAND_HAS_CR_FEAT_BIT BIT(1) +#define SPINAND_ON_DIE_ECC_MANDATORY BIT(2)/** * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure
@@ -518,5 +520,6 @@ int spinand_match_and_init(struct spinand_device *spinand,int spinand_upd_cfg (struct spinand_device *spinand,u8 mask,u8 val);int spinand_select_target (struct spinand_device *spinand,unsigned int target); +int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val);#endif /* __LINUX_MTD_SPINAND_H */
Signature · 1 line
2.43.0
Miquel Raynal
maintainerHi,
[email protected] wrote on Tue, 20 Aug 2024 15:45:47 +0900:
Quoted 7 lines
This patch has been added to operate properly on SkyHigh memory's SPI NAND. This patch is derived from Takahiro's work who is author.
Added:
- Some patch code for the SkyHigh Memory ML-3 SPI NAND Flash family.
Created:
-skyhigh.c
This is not a correct commit log, please read the submitting process doc.
Quoted 25 lines
Signed-off-by KR Kim <[email protected]>--- drivers/mtd/nand/spi/Makefile | 2 +- drivers/mtd/nand/spi/core.c | 7 +- drivers/mtd/nand/spi/skyhigh.c | 146 +++++++++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 3 + 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 drivers/mtd/nand/spi/skyhigh.cdrivers/mtd/nand/spi/Makefile +1
-1@@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o -spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o +spinand-objs += micron.o paragon.o skyhigh.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.odrivers/mtd/nand/spi/core.c +0
-0
drivers/mtd/nand/spi/core.c static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val) · line 37
Quoted 5 lines
drivers/mtd/nand/spi/core.c +1
-1@@ -34,7 +34,7 @@ static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)return 0 ; } -static int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val) +int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val)
This should be done in a preliminary patch.
drivers/mtd/nand/spi/core.c static int spinand_init_quad_enable(struct spinand_device *spinand) · line 201
Quoted 10 lines
drivers/mtd/nand/spi/core.c +3
-0{struct spi_mem_op op =SPINAND_SET_FEATURE_OP (reg, spinand->scratchbuf);@@ -196,6 +196,10 @@ static int spinand_init_quad_enable(struct spinand_device *spinand)static int spinand_ecc_enable (struct spinand_device *spinand,bool enable) { +/* SHM : always ECC On */ +if (spinand->flags &SPINAND_ON_DIE_ECC_MANDATORY ) +return 0 ;
Do you have a datasheet? Can we really not disable the correction?
drivers/mtd/nand/spi/core.c static int spinand_init_quad_enable(struct spinand_device *spinand) · line 204
Quoted 3 lines
drivers/mtd/nand/spi/core.c +1
-0+return spinand_upd_cfg (spinand,CFG_ECC_ENABLE , enable ?CFG_ECC_ENABLE :0 );
How can this be useful if the engine cannot be disabled?
Quoted 49 lines
drivers/mtd/nand/spi/core.c +1
-0}@@ -945,6 +949,7 @@ static const struct spinand_manufacturer *spinand_manufacturers[] = { ¯onix_spinand_manufacturer, µn_spinand_manufacturer, ¶gon_spinand_manufacturer, + &skyhigh_spinand_manufacturer, &toshiba_spinand_manufacturer, &winbond_spinand_manufacturer, &xtx_spinand_manufacturer,drivers/mtd/nand/spi/skyhigh.c new file +34
-0@@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (c) 2024 SkyHigh Memory Limited +* +* Author: Takahiro Kuwano <[email protected]> +* Co-Author: KR Kim <[email protected]> +* This patch is derived from Takahiro's work. +*/ + +#include <linux/device.h> +#include <linux/kernel.h> +#include <linux/mtd/spinand.h> + +#define SPINAND_MFR_SKYHIGH 0x01 + +#define SKYHIGH_STATUS_ECC_1TO2_BITFLIPS (1 << 4) +#define SKYHIGH_STATUS_ECC_3TO6_BITFLIPS (2 << 4) +#define SKYHIGH_STATUS_ECC_UNCOR_ERROR (3 << 4) + +#define SKYHIGH_CONFIG_PROTECT_EN BIT(1) + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0), +SPINAND_PAGE_READ_FROM_CACHE_X4_OP (0 ,1 ,NULL ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP (0 ,2 ,NULL ,0 ), +SPINAND_PAGE_READ_FROM_CACHE_X2_OP (0 ,1 ,NULL ,0 ), +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_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants,
drivers/mtd/nand/spi/skyhigh.c line 44
Quoted 10 lines
drivers/mtd/nand/spi/skyhigh.c new file +10
-0+SPINAND_PROG_LOAD_X4 (false,0 ,NULL ,0 ), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int skyhigh_spinand_ooblayout_ecc (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section) +return -ERANGE ; + + region->offset = mtd->oobsize;
That's not possible
drivers/mtd/nand/spi/skyhigh.c line 57
Quoted 13 lines
drivers/mtd/nand/spi/skyhigh.c new file +13
-0+ region->length = mtd->oobsize /2 ; + +return 0 ; +} + +static int skyhigh_spinand_ooblayout_free (struct mtd_info *mtd,int section, +struct mtd_oob_region *region) +{ +if (section) +return -ERANGE ; + + region->offset =2 ; + region->length = mtd->oobsize -2 ;
Aren't the ECC bytes visible?
(if so, a comment is needed)
Quoted 30 lines
drivers/mtd/nand/spi/skyhigh.c new file +30
-0+ +return 0 ; +} + +static const struct mtd_ooblayout_ops skyhigh_spinand_ooblayout = { + .ecc = skyhigh_spinand_ooblayout_ecc, + .free = skyhigh_spinand_ooblayout_free, +}; + +static int skyhigh_spinand_ecc_get_status (struct spinand_device *spinand,u8 status) +{ +switch (status &STATUS_ECC_MASK ) { +case STATUS_ECC_NO_BITFLIPS : +return 0 ; + +case SKYHIGH_STATUS_ECC_1TO2_BITFLIPS : +return 2 ; + +case SKYHIGH_STATUS_ECC_3TO6_BITFLIPS : +return 6 ; + +case SKYHIGH_STATUS_ECC_UNCOR_ERROR : +return -EBADMSG ; + +default : +return -EINVAL ; + } +} + +static const struct spinand_info skyhigh_spinand_table[] = {
drivers/mtd/nand/spi/skyhigh.c line 97
Quoted 10 lines
drivers/mtd/nand/spi/skyhigh.c new file +10
-0+SPINAND_INFO ("S35ML01G301" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0x15 ), +NAND_MEMORG (1 ,2048 ,64 ,64 ,1024 ,20 ,1 ,1 ,1 ), +NAND_ECCREQ (6 ,32 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_ON_DIE_ECC_MANDATORY , +SPINAND_ECCINFO (&skyhigh_spinand_ooblayout, + skyhigh_spinand_ecc_get_status)),
Indentation (same below)
Quoted 70 lines
drivers/mtd/nand/spi/skyhigh.c new file +49
-0+SPINAND_INFO ("S35ML01G300" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0x14 ), +NAND_MEMORG (1 ,2048 ,128 ,64 ,1024 ,20 ,1 ,1 ,1 ), +NAND_ECCREQ (6 ,32 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_ON_DIE_ECC_MANDATORY , +SPINAND_ECCINFO (&skyhigh_spinand_ooblayout, + skyhigh_spinand_ecc_get_status)), +SPINAND_INFO ("S35ML02G300" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0x25 ), +NAND_MEMORG (1 ,2048 ,128 ,64 ,2048 ,40 ,2 ,1 ,1 ), +NAND_ECCREQ (6 ,32 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_ON_DIE_ECC_MANDATORY , +SPINAND_ECCINFO (&skyhigh_spinand_ooblayout, + skyhigh_spinand_ecc_get_status)), +SPINAND_INFO ("S35ML04G300" , +SPINAND_ID (SPINAND_READID_METHOD_OPCODE_DUMMY ,0x35 ), +NAND_MEMORG (1 ,2048 ,128 ,64 ,4096 ,80 ,2 ,1 ,1 ), +NAND_ECCREQ (6 ,32 ), +SPINAND_INFO_OP_VARIANTS (&read_cache_variants, + &write_cache_variants, + &update_cache_variants), +SPINAND_ON_DIE_ECC_MANDATORY , +SPINAND_ECCINFO (&skyhigh_spinand_ooblayout, + skyhigh_spinand_ecc_get_status)), +}; + +static int skyhigh_spinand_init (struct spinand_device *spinand) +{ +return spinand_write_reg_op (spinand,REG_BLOCK_LOCK , +SKYHIGH_CONFIG_PROTECT_EN ); +} + +static const struct spinand_manufacturer_ops skyhigh_spinand_manuf_ops = { + .init = skyhigh_spinand_init, +}; + +const struct spinand_manufacturer skyhigh_spinand_manufacturer = { + .id =SPINAND_MFR_SKYHIGH , + .name ="SkyHigh" , + .chips = skyhigh_spinand_table, + .nchips =ARRAY_SIZE (skyhigh_spinand_table), + .ops = &skyhigh_spinand_manuf_ops, +};include/linux/mtd/spinand.h +2
-0@@ -268,6 +268,7 @@ extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;extern const struct spinand_manufacturer macronix_spinand_manufacturer;extern const struct spinand_manufacturer micron_spinand_manufacturer;extern const struct spinand_manufacturer paragon_spinand_manufacturer; +extern const struct spinand_manufacturer skyhigh_spinand_manufacturer;extern const struct spinand_manufacturer toshiba_spinand_manufacturer;extern const struct spinand_manufacturer winbond_spinand_manufacturer;extern const struct spinand_manufacturer xtx_spinand_manufacturer;@@ -312,6 +313,7 @@ struct spinand_ecc_info {#define SPINAND_HAS_QE_BIT BIT(0)#define SPINAND_HAS_CR_FEAT_BIT BIT(1) +#define SPINAND_ON_DIE_ECC_MANDATORY BIT(2)/** * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure
include/linux/mtd/spinand.h int spinand_match_and_init(struct spinand_device *spinand, · line 525
Quoted 6 lines
include/linux/mtd/spinand.h +1
-0@@ -518,5 +520,6 @@ int spinand_match_and_init(struct spinand_device *spinand,int spinand_upd_cfg (struct spinand_device *spinand,u8 mask,u8 val);int spinand_select_target (struct spinand_device *spinand,unsigned int target); +int spinand_write_reg_op (struct spinand_device *spinand,u8 reg,u8 val);#endif /* __LINUX_MTD_SPINAND_H */
Thanks,
Miquèl