mtd: rawnand: Add and use helper for testing data interface
Subsystems (2)
PATCH v3 1/2 mtd: rawnand: Add and use helper for testing data interface
From: Rickard x Andersson <[email protected]>
This helper checks if the controller supports the current data interface timings. If the timings are not supported the vendor provided corresponding onfi mode will be tried, and if that fails we will fall back to onfi mode 0.
The helper can also be used by NAND vendor driver for testing different timings.
--- drivers/mtd/nand/raw/internals.h | 24 ++++++++++++++++++++++++ drivers/mtd/nand/raw/nand_base.c | 28 ++++++++++++++++++---------- 2 files changed, 42 insertions(+), 10 deletions(-)
drivers/mtd/nand/raw/internals.h +24 -0
@@ -148,6 +148,30 @@ static inline bool nand_can_choose_data_interface(struct nand_chip *chip)return chip->ops.choose_data_interface; } +/** +* nand_controller_supports_data_interface - Check if controller can handle +* the current timings. +* +* @chip: The NAND chip +*/ +static inline int +nand_controller_supports_data_interface (struct nand_chip *chip) +{ +int ret; +const struct nand_controller_ops *ops = chip->controller->ops; + +/* +* Pass NAND_DATA_IFACE_CHECK_ONLY to only check if the +* controller supports the requested timings. +*/ + ret = ops->setup_data_interface (chip, +NAND_DATA_IFACE_CHECK_ONLY , + &chip->data_interface); + +return ret; +} + +/* BBT functions */ int nand_markbad_bbt (struct nand_chip *chip,loff_t offs);int nand_isreserved_bbt (struct nand_chip *chip,loff_t offs);
drivers/mtd/nand/raw/nand_base.c +18 -10
@@ -982,8 +982,24 @@ static int nand_choose_data_interface(struct nand_chip *chip)*/ if (nand_can_choose_data_interface (chip)) { ret = chip->ops.choose_data_interface (chip); +if (ret) +return ret; + +/* +* Check if the controller can handle the NAND vendor specific +* best timings. +*/ + ret =nand_controller_supports_data_interface (chip);if (!ret)return ret; + +/* +* Specific timings did not work, try using corresponding +* onfi mode provided by vendor. +*/ +if (chip->data_interface.timings.mode) + chip->default_timing_mode = + chip->data_interface.timings.mode; }/*
@@ -994,9 +1010,6 @@ static int nand_choose_data_interface(struct nand_chip *chip)if (chip->parameters.onfi) { modes = chip->parameters.onfi->async_timing_mode; }else { -if (!chip->default_timing_mode) -return 0 ; - modes =GENMASK (chip->default_timing_mode,0 ); }
@@ -1005,13 +1018,8 @@ static int nand_choose_data_interface(struct nand_chip *chip)if (ret)continue ; -/* -* Pass NAND_DATA_IFACE_CHECK_ONLY to only check if the -* controller supports the requested timings. -*/ - ret = chip->controller->ops->setup_data_interface (chip, -NAND_DATA_IFACE_CHECK_ONLY , - &chip->data_interface); +/* Check if the controller supports the requested timings. */ + ret =nand_controller_supports_data_interface (chip);if (!ret) { chip->default_timing_mode = mode;break ;
Signature · 6 lines
2.11.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
PATCH v3 2/2 mtd: rawnand: Add timings for Kioxia TH58NVG2S3HBAI4
From: Rickard x Andersson <[email protected]>
The Kioxia/Toshiba TH58NVG2S3HBAI4 NAND memory is not a ONFI compliant memory. The timings of the memory is quite close to ONFI mode 4 but is breaking that spec.
Erase block read speed is increased from 6910 KiB/s to 13490 KiB/s. Erase block write speed is increased from 3350 KiB/s to 4410 KiB/s.
Tested on IMX6SX which has a NAND controller supporting EDO mode.
--- drivers/mtd/nand/raw/nand_ids.c | 3 +++ drivers/mtd/nand/raw/nand_toshiba.c | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
drivers/mtd/nand/raw/nand_ids.c +3 -0
@@ -52,6 +52,9 @@ struct nand_flash_dev nand_flash_ids[] = { { .id = {0xad, 0xde, 0x94, 0xda, 0x74, 0xc4} },SZ_8K ,SZ_8K ,SZ_2M ,NAND_NEED_SCRAMBLING ,6 ,640 , NAND_ECC_INFO(40, SZ_1K), 4 }, + {"TH58NVG2S3HBAI4 4G 3.3V 8-bit", + { .id = {0x98, 0xdc, 0x91, 0x15, 0x76} }, + SZ_2K, SZ_512, SZ_128K, 0, 5, 128, NAND_ECC_INFO(8, SZ_512) },LEGACY_ID_NAND ("NAND 4MiB 5V 8-bit" ,0x6B ,4 ,SZ_8K ,SP_OPTIONS ), LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS),
drivers/mtd/nand/raw/nand_toshiba.c +44 -0
62 lines not on this page · raw message
Signature · 6 lines
2.11.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
Miquel Raynal
maintainerHi Rickard,
Rickard Andersson <[email protected]> wrote on Mon, 25 May 2020 16:51:32 +0200:
Quoted 96 lines
From: Rickard x Andersson <[email protected]>
This helper checks if the controller supports the current data interface timings. If the timings are not supported the vendor provided corresponding onfi mode will be tried, and if that fails we will fall back to onfi mode 0.
The helper can also be used by NAND vendor driver for testing different timings.
Signed-off-by Rickard x Andersson <[email protected]>--- drivers/mtd/nand/raw/internals.h | 24 ++++++++++++++++++++++++ drivers/mtd/nand/raw/nand_base.c | 28 ++++++++++++++++++---------- 2 files changed, 42 insertions(+), 10 deletions(-)drivers/mtd/nand/raw/internals.h +24
-0@@ -148,6 +148,30 @@ static inline bool nand_can_choose_data_interface(struct nand_chip *chip)return chip->ops.choose_data_interface; } +/** +* nand_controller_supports_data_interface - Check if controller can handle +* the current timings. +* +* @chip: The NAND chip +*/ +static inline int +nand_controller_supports_data_interface (struct nand_chip *chip) +{ +int ret; +const struct nand_controller_ops *ops = chip->controller->ops; + +/* +* Pass NAND_DATA_IFACE_CHECK_ONLY to only check if the +* controller supports the requested timings. +*/ + ret = ops->setup_data_interface (chip, +NAND_DATA_IFACE_CHECK_ONLY , + &chip->data_interface); + +return ret; +} + +/* BBT functions */ int nand_markbad_bbt (struct nand_chip *chip,loff_t offs);int nand_isreserved_bbt (struct nand_chip *chip,loff_t offs);drivers/mtd/nand/raw/nand_base.c +16
-5@@ -982,8 +982,24 @@ static int nand_choose_data_interface(struct nand_chip *chip)*/ if (nand_can_choose_data_interface (chip)) { ret = chip->ops.choose_data_interface (chip); +if (ret) +return ret; + +/* +* Check if the controller can handle the NAND vendor specific +* best timings. +*/ + ret =nand_controller_supports_data_interface (chip);if (!ret)return ret; + +/* +* Specific timings did not work, try using corresponding +* onfi mode provided by vendor. +*/ +if (chip->data_interface.timings.mode) + chip->default_timing_mode = + chip->data_interface.timings.mode; }/* @@ -994,9 +1010,6 @@ static int nand_choose_data_interface(struct nand_chip *chip)if (chip->parameters.onfi) { modes = chip->parameters.onfi->async_timing_mode; }else { -if (!chip->default_timing_mode) -return 0 ; - modes =GENMASK (chip->default_timing_mode,0 ); }@@ -1005,13 +1018,8 @@ static int nand_choose_data_interface(struct nand_chip *chip)if (ret)continue ; -/* -* Pass NAND_DATA_IFACE_CHECK_ONLY to only check if the
drivers/mtd/nand/raw/nand_base.c static int nand_choose_data_interface(struct nand_chip *chip) · line 1025
Quoted 10 lines
drivers/mtd/nand/raw/nand_base.c +2
-5-* controller supports the requested timings. -*/ - ret = chip->controller->ops->setup_data_interface (chip, -NAND_DATA_IFACE_CHECK_ONLY , - &chip->data_interface); +/* Check if the controller supports the requested timings. */ + ret =nand_controller_supports_data_interface (chip);if (!ret) { chip->default_timing_mode = mode;break ;
Actually I think what Boris had in mind was a little bit different. As the "preparation series" has not been sent over the mailing list yet, if you don't mind, I will drop patch 1/2 which is not needed after my latest changes and take your second patch, adapted to the latest changes too. I am not taking the ownership of your series, just proposing the big picture and provide a more usual way to review the patches than a Github branch. Then, I'll might ask you to respin the entire series as well if needed.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Quoted 10 lines
Actually I think what Boris had in mind was a little bit different. As the "preparation series" has not been sent over the mailing list yet, if you don't mind, I will drop patch 1/2 which is not needed after my latest changes and take your second patch, adapted to the latest changes too. I am not taking the ownership of your series, just proposing the big picture and provide a more usual way to review the patches than a Github branch. Then, I'll might ask you to respin the entire series as well if needed.
Quoted 2 lines
Thanks,
Miquèl
Sounds good! I just wanted to update my patches as much as possible with the information I had.
BR,
Rickard
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/