diff mbox series

Revert "mtd: spi-nor: Add a post BFPT fixup for MX25L25635E"

Message ID 20190417054511.29291-1-andrew@aj.id.au
State Superseded, archived
Headers show
Series Revert "mtd: spi-nor: Add a post BFPT fixup for MX25L25635E" | expand

Commit Message

Andrew Jeffery April 17, 2019, 5:45 a.m. UTC
This reverts commit 2bffa65da43e399079dad5947c6aa9ab3cfa4ad4.

5.0.x fails to boot on Witherspoon machines after an AC-cycle, with the
following error:

> [    4.337766] ubi0: default fastmap pool size: 25
> [    4.342321] ubi0: default fastmap WL pool size: 12
> [    4.347232] ubi0: attaching mtd3
> [    4.361487] ubi0: scanning is finished
> [    4.365525] ubi0 error: ubi_read_volume_table: the layout volume was not found
> [    4.372989] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd3, error -22
> [    4.380193] UBI error: cannot attach mtd3

Which leads to:

> [    4.553478] VFS: Cannot open root device "ubiblock0_1" or unknown-block(0,0): error -6
> [    4.561550] Please append a correct "root=" boot option; here are the available partitions:
> [    4.570029] 1f00           32768 mtdblock0
> [    4.570038]  (driver?)
> [    4.576671] 1f01             384 mtdblock1
> [    4.576680]  (driver?)
> [    4.583234] 1f02             128 mtdblock2
> [    4.583240]  (driver?)
> [    4.589883] 1f03           32256 mtdblock3
> [    4.589892]  (driver?)
> [    4.596520] 1f04           32768 mtdblock4
> [    4.596529]  (driver?)
> [    4.603080] 1f05             384 mtdblock5
> [    4.603085]  (driver?)
> [    4.609711] 1f06             128 mtdblock6
> [    4.609719]  (driver?)
> [    4.616338] 1f07           32256 mtdblock7
> [    4.616347]  (driver?)
> [    4.622901] 1f08          131072 mtdblock8
> [    4.622907]  (driver?)
> [    4.629539] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

A hint is provided earlier in the boot process:

> [    0.920597] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> [    0.926753] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> [    0.932704] aspeed-smc 1e620000.spi: CE0 window [ 0x20000000 - 0x22000000 ] 32MB
> [    0.940230] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x2a000000 ] 128MB
> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> [    1.435022] 3 fixed-partitions partitions found on MTD device bmc
> [    1.441249] Creating 3 MTD partitions on "bmc":
> [    1.445911] 0x000000000000-0x000000060000 : "u-boot"
> [    1.455264] 0x000000060000-0x000000080000 : "u-boot-env"
> [    1.465042] 0x000000080000-0x000002000000 : "obmc-ubi"
> [    1.474914] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> [    1.481102] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> [    1.487175] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x24000000 ] 32MB
> [    1.494592] aspeed-smc 1e620000.spi: CE2 window [ 0x24000000 - 0x2c000000 ] 128MB
> [    1.502173] aspeed-smc 1e620000.spi: read control register: 203c0041
> [    1.705799] aspeed-smc 1e620000.spi: No good frequency, using dumb slow
> [    1.717393] 3 fixed-partitions partitions found on MTD device alt-bmc
> [    1.723851] Creating 3 MTD partitions on "alt-bmc":
> [    1.728890] 0x000000000000-0x000000060000 : "alt-u-boot"
> [    1.738950] 0x000000060000-0x000000080000 : "alt-u-boot-env"
> [    1.748975] 0x000000080000-0x000002000000 : "alt-obmc-ubi"

Specifically, the control register state is exposed as:

> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641

The 0x3c opcode translates to DREAD4B for the mx25l25635f part, which is
what is detected. The post BFPT fixup implemented in commit 2bffa65da43e
("mtd: spi-nor: Add a post BFPT fixup for MX25L25635E") detects the 'e'
vs 'f' part based on the reported support for
BFPT_DWORD5_FAST_READ_4_4_4, which implies 4B opcodes are supported
(e.g. DREAD4B), however the aspeed-smc driver fails to put the
controller into the right addressing mode to support sending DREAD4B, and
so we reach a bad state.

In the interim, revert the upstream patch adding 'e' vs 'f' detection to
avoid sending 4B opcodes.

The revert has been tested on a freshly flashed and power-cycled
Witherspoon, both with and without the patch applied, confirming the
broken behaviour in the former case and a successful boot in the latter.

Cc: Andrew Geissler <geissonator@gmail.com>
Reported-by: George Keishing <gkeishin@in.ibm.com>
Investigated-by: Cédric Le Goater <clg@kaod.org>
Investigated-by: Eddie James <eajames@linux.ibm.com>
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
 drivers/mtd/spi-nor/spi-nor.c | 29 +----------------------------
 1 file changed, 1 insertion(+), 28 deletions(-)

Comments

Andrew Jeffery April 17, 2019, 5:48 a.m. UTC | #1
Ugh, that subject should have had "linux dev-5.0" in it, but y'know. I'll survive.

On Wed, 17 Apr 2019, at 15:16, Andrew Jeffery wrote:
> This reverts commit 2bffa65da43e399079dad5947c6aa9ab3cfa4ad4.
> 
> 5.0.x fails to boot on Witherspoon machines after an AC-cycle, with the
> following error:
> 
> > [    4.337766] ubi0: default fastmap pool size: 25
> > [    4.342321] ubi0: default fastmap WL pool size: 12
> > [    4.347232] ubi0: attaching mtd3
> > [    4.361487] ubi0: scanning is finished
> > [    4.365525] ubi0 error: ubi_read_volume_table: the layout volume was not found
> > [    4.372989] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd3, error -22
> > [    4.380193] UBI error: cannot attach mtd3
> 
> Which leads to:
> 
> > [    4.553478] VFS: Cannot open root device "ubiblock0_1" or unknown-block(0,0): error -6
> > [    4.561550] Please append a correct "root=" boot option; here are the available partitions:
> > [    4.570029] 1f00           32768 mtdblock0
> > [    4.570038]  (driver?)
> > [    4.576671] 1f01             384 mtdblock1
> > [    4.576680]  (driver?)
> > [    4.583234] 1f02             128 mtdblock2
> > [    4.583240]  (driver?)
> > [    4.589883] 1f03           32256 mtdblock3
> > [    4.589892]  (driver?)
> > [    4.596520] 1f04           32768 mtdblock4
> > [    4.596529]  (driver?)
> > [    4.603080] 1f05             384 mtdblock5
> > [    4.603085]  (driver?)
> > [    4.609711] 1f06             128 mtdblock6
> > [    4.609719]  (driver?)
> > [    4.616338] 1f07           32256 mtdblock7
> > [    4.616347]  (driver?)
> > [    4.622901] 1f08          131072 mtdblock8
> > [    4.622907]  (driver?)
> > [    4.629539] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
> 
> A hint is provided earlier in the boot process:
> 
> > [    0.920597] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> > [    0.926753] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> > [    0.932704] aspeed-smc 1e620000.spi: CE0 window [ 0x20000000 - 0x22000000 ] 32MB
> > [    0.940230] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x2a000000 ] 128MB
> > [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> > [    1.435022] 3 fixed-partitions partitions found on MTD device bmc
> > [    1.441249] Creating 3 MTD partitions on "bmc":
> > [    1.445911] 0x000000000000-0x000000060000 : "u-boot"
> > [    1.455264] 0x000000060000-0x000000080000 : "u-boot-env"
> > [    1.465042] 0x000000080000-0x000002000000 : "obmc-ubi"
> > [    1.474914] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> > [    1.481102] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> > [    1.487175] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x24000000 ] 32MB
> > [    1.494592] aspeed-smc 1e620000.spi: CE2 window [ 0x24000000 - 0x2c000000 ] 128MB
> > [    1.502173] aspeed-smc 1e620000.spi: read control register: 203c0041
> > [    1.705799] aspeed-smc 1e620000.spi: No good frequency, using dumb slow
> > [    1.717393] 3 fixed-partitions partitions found on MTD device alt-bmc
> > [    1.723851] Creating 3 MTD partitions on "alt-bmc":
> > [    1.728890] 0x000000000000-0x000000060000 : "alt-u-boot"
> > [    1.738950] 0x000000060000-0x000000080000 : "alt-u-boot-env"
> > [    1.748975] 0x000000080000-0x000002000000 : "alt-obmc-ubi"
> 
> Specifically, the control register state is exposed as:
> 
> > [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> 
> The 0x3c opcode translates to DREAD4B for the mx25l25635f part, which is
> what is detected. The post BFPT fixup implemented in commit 2bffa65da43e
> ("mtd: spi-nor: Add a post BFPT fixup for MX25L25635E") detects the 'e'
> vs 'f' part based on the reported support for
> BFPT_DWORD5_FAST_READ_4_4_4, which implies 4B opcodes are supported
> (e.g. DREAD4B), however the aspeed-smc driver fails to put the
> controller into the right addressing mode to support sending DREAD4B, and
> so we reach a bad state.
> 
> In the interim, revert the upstream patch adding 'e' vs 'f' detection to
> avoid sending 4B opcodes.
> 
> The revert has been tested on a freshly flashed and power-cycled
> Witherspoon, both with and without the patch applied, confirming the
> broken behaviour in the former case and a successful boot in the latter.
> 
> Cc: Andrew Geissler <geissonator@gmail.com>
> Reported-by: George Keishing <gkeishin@in.ibm.com>
> Investigated-by: Cédric Le Goater <clg@kaod.org>
> Investigated-by: Eddie James <eajames@linux.ibm.com>
> Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> ---
>  drivers/mtd/spi-nor/spi-nor.c | 29 +----------------------------
>  1 file changed, 1 insertion(+), 28 deletions(-)
> 
> diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
> index 5a5a47651bf9..9f85ab5fc569 100644
> --- a/drivers/mtd/spi-nor/spi-nor.c
> +++ b/drivers/mtd/spi-nor/spi-nor.c
> @@ -1681,31 +1681,6 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
>  		.addr_width = 3,					\
>  		.flags = SPI_NOR_NO_FR | SPI_S3AN,
>  
> -static int
> -mx25l25635_post_bfpt_fixups(struct spi_nor *nor,
> -			    const struct sfdp_parameter_header *bfpt_header,
> -			    const struct sfdp_bfpt *bfpt,
> -			    struct spi_nor_flash_parameter *params)
> -{
> -	/*
> -	 * MX25L25635F supports 4B opcodes but MX25L25635E does not.
> -	 * Unfortunately, Macronix has re-used the same JEDEC ID for both
> -	 * variants which prevents us from defining a new entry in the parts
> -	 * table.
> -	 * We need a way to differentiate MX25L25635E and MX25L25635F, and it
> -	 * seems that the F version advertises support for Fast Read 4-4-4 in
> -	 * its BFPT table.
> -	 */
> -	if (bfpt->dwords[BFPT_DWORD(5)] & BFPT_DWORD5_FAST_READ_4_4_4)
> -		nor->flags |= SNOR_F_4B_OPCODES;
> -
> -	return 0;
> -}
> -
> -static struct spi_nor_fixups mx25l25635_fixups = {
> -	.post_bfpt = mx25l25635_post_bfpt_fixups,
> -};
> -
>  /* NOTE: double check command sets and memory organization when you add
>   * more nor chips.  This current list focusses on newer chips, which
>   * have been converging on command sets which including JEDEC ID.
> @@ -1843,9 +1818,7 @@ static const struct flash_info spi_nor_ids[] = {
>  	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
>  	{ "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
>  			 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> -	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512,
> -			 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
> -			 .fixups = &mx25l25635_fixups },
> +	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ 
> | SPI_NOR_QUAD_READ) },
>  	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | 
> SPI_NOR_4B_OPCODES) },
>  	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
>  	{ "mx66l51235f", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ 
> | SPI_NOR_QUAD_READ) },
> -- 
> 2.19.1
> 
>
Cédric Le Goater April 17, 2019, 6:11 a.m. UTC | #2
On 4/17/19 7:45 AM, Andrew Jeffery wrote:
> This reverts commit 2bffa65da43e399079dad5947c6aa9ab3cfa4ad4.
> 
> 5.0.x fails to boot on Witherspoon machines after an AC-cycle, with the
> following error:
> 
>> [    4.337766] ubi0: default fastmap pool size: 25
>> [    4.342321] ubi0: default fastmap WL pool size: 12
>> [    4.347232] ubi0: attaching mtd3
>> [    4.361487] ubi0: scanning is finished
>> [    4.365525] ubi0 error: ubi_read_volume_table: the layout volume was not found
>> [    4.372989] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd3, error -22
>> [    4.380193] UBI error: cannot attach mtd3
> 
> Which leads to:
> 
>> [    4.553478] VFS: Cannot open root device "ubiblock0_1" or unknown-block(0,0): error -6
>> [    4.561550] Please append a correct "root=" boot option; here are the available partitions:
>> [    4.570029] 1f00           32768 mtdblock0
>> [    4.570038]  (driver?)
>> [    4.576671] 1f01             384 mtdblock1
>> [    4.576680]  (driver?)
>> [    4.583234] 1f02             128 mtdblock2
>> [    4.583240]  (driver?)
>> [    4.589883] 1f03           32256 mtdblock3
>> [    4.589892]  (driver?)
>> [    4.596520] 1f04           32768 mtdblock4
>> [    4.596529]  (driver?)
>> [    4.603080] 1f05             384 mtdblock5
>> [    4.603085]  (driver?)
>> [    4.609711] 1f06             128 mtdblock6
>> [    4.609719]  (driver?)
>> [    4.616338] 1f07           32256 mtdblock7
>> [    4.616347]  (driver?)
>> [    4.622901] 1f08          131072 mtdblock8
>> [    4.622907]  (driver?)
>> [    4.629539] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
> 
> A hint is provided earlier in the boot process:
> 
>> [    0.920597] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
>> [    0.926753] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
>> [    0.932704] aspeed-smc 1e620000.spi: CE0 window [ 0x20000000 - 0x22000000 ] 32MB
>> [    0.940230] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x2a000000 ] 128MB
>> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
>> [    1.435022] 3 fixed-partitions partitions found on MTD device bmc
>> [    1.441249] Creating 3 MTD partitions on "bmc":
>> [    1.445911] 0x000000000000-0x000000060000 : "u-boot"
>> [    1.455264] 0x000000060000-0x000000080000 : "u-boot-env"
>> [    1.465042] 0x000000080000-0x000002000000 : "obmc-ubi"
>> [    1.474914] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
>> [    1.481102] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
>> [    1.487175] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x24000000 ] 32MB
>> [    1.494592] aspeed-smc 1e620000.spi: CE2 window [ 0x24000000 - 0x2c000000 ] 128MB
>> [    1.502173] aspeed-smc 1e620000.spi: read control register: 203c0041
>> [    1.705799] aspeed-smc 1e620000.spi: No good frequency, using dumb slow
>> [    1.717393] 3 fixed-partitions partitions found on MTD device alt-bmc
>> [    1.723851] Creating 3 MTD partitions on "alt-bmc":
>> [    1.728890] 0x000000000000-0x000000060000 : "alt-u-boot"
>> [    1.738950] 0x000000060000-0x000000080000 : "alt-u-boot-env"
>> [    1.748975] 0x000000080000-0x000002000000 : "alt-obmc-ubi"
> 
> Specifically, the control register state is exposed as:
> 
>> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> 
> The 0x3c opcode translates to DREAD4B for the mx25l25635f part, which is
> what is detected. The post BFPT fixup implemented in commit 2bffa65da43e
> ("mtd: spi-nor: Add a post BFPT fixup for MX25L25635E") detects the 'e'
> vs 'f' part based on the reported support for
> BFPT_DWORD5_FAST_READ_4_4_4, which implies 4B opcodes are supported
> (e.g. DREAD4B), however the aspeed-smc driver fails to put the
> controller into the right addressing mode to support sending DREAD4B, and
> so we reach a bad state.

It's more complex than that but I haven't quite cornered the problem. 

When doing the link training, the first read for the golden image is 
done in slow mode and it misses the first byte for some reason. So the 
gold image is incorrect (cough) but other images are correct (cough cough)

Why is this first byte being dropped is the question. The flash module 
might have entered 4B mode ? is it expecting a dummy ? 

For the moment, this is fine for a workaround but we will need to fully 
support 4B opcodes (which we do without training). Another solution is 
to use the kernel command line switch "optimize_read=false" and all 
works fine, perfectly fine. Which is kind of frustrating.

Thanks for the patch.

C.


> 
> In the interim, revert the upstream patch adding 'e' vs 'f' detection to
> avoid sending 4B opcodes.
> 
> The revert has been tested on a freshly flashed and power-cycled
> Witherspoon, both with and without the patch applied, confirming the
> broken behaviour in the former case and a successful boot in the latter.
> 
> Cc: Andrew Geissler <geissonator@gmail.com>
> Reported-by: George Keishing <gkeishin@in.ibm.com>
> Investigated-by: Cédric Le Goater <clg@kaod.org>
> Investigated-by: Eddie James <eajames@linux.ibm.com>
> Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> ---
>  drivers/mtd/spi-nor/spi-nor.c | 29 +----------------------------
>  1 file changed, 1 insertion(+), 28 deletions(-)
> 
> diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
> index 5a5a47651bf9..9f85ab5fc569 100644
> --- a/drivers/mtd/spi-nor/spi-nor.c
> +++ b/drivers/mtd/spi-nor/spi-nor.c
> @@ -1681,31 +1681,6 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
>  		.addr_width = 3,					\
>  		.flags = SPI_NOR_NO_FR | SPI_S3AN,
>  
> -static int
> -mx25l25635_post_bfpt_fixups(struct spi_nor *nor,
> -			    const struct sfdp_parameter_header *bfpt_header,
> -			    const struct sfdp_bfpt *bfpt,
> -			    struct spi_nor_flash_parameter *params)
> -{
> -	/*
> -	 * MX25L25635F supports 4B opcodes but MX25L25635E does not.
> -	 * Unfortunately, Macronix has re-used the same JEDEC ID for both
> -	 * variants which prevents us from defining a new entry in the parts
> -	 * table.
> -	 * We need a way to differentiate MX25L25635E and MX25L25635F, and it
> -	 * seems that the F version advertises support for Fast Read 4-4-4 in
> -	 * its BFPT table.
> -	 */
> -	if (bfpt->dwords[BFPT_DWORD(5)] & BFPT_DWORD5_FAST_READ_4_4_4)
> -		nor->flags |= SNOR_F_4B_OPCODES;
> -
> -	return 0;
> -}
> -
> -static struct spi_nor_fixups mx25l25635_fixups = {
> -	.post_bfpt = mx25l25635_post_bfpt_fixups,
> -};
> -
>  /* NOTE: double check command sets and memory organization when you add
>   * more nor chips.  This current list focusses on newer chips, which
>   * have been converging on command sets which including JEDEC ID.
> @@ -1843,9 +1818,7 @@ static const struct flash_info spi_nor_ids[] = {
>  	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
>  	{ "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
>  			 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> -	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512,
> -			 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
> -			 .fixups = &mx25l25635_fixups },
> +	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
>  	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
>  	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
>  	{ "mx66l51235f", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
>
Andrew Jeffery April 17, 2019, 6:22 a.m. UTC | #3
On Wed, 17 Apr 2019, at 15:41, Cédric Le Goater wrote:
> On 4/17/19 7:45 AM, Andrew Jeffery wrote:
> > This reverts commit 2bffa65da43e399079dad5947c6aa9ab3cfa4ad4.
> > 
> > 5.0.x fails to boot on Witherspoon machines after an AC-cycle, with the
> > following error:
> > 
> >> [    4.337766] ubi0: default fastmap pool size: 25
> >> [    4.342321] ubi0: default fastmap WL pool size: 12
> >> [    4.347232] ubi0: attaching mtd3
> >> [    4.361487] ubi0: scanning is finished
> >> [    4.365525] ubi0 error: ubi_read_volume_table: the layout volume was not found
> >> [    4.372989] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd3, error -22
> >> [    4.380193] UBI error: cannot attach mtd3
> > 
> > Which leads to:
> > 
> >> [    4.553478] VFS: Cannot open root device "ubiblock0_1" or unknown-block(0,0): error -6
> >> [    4.561550] Please append a correct "root=" boot option; here are the available partitions:
> >> [    4.570029] 1f00           32768 mtdblock0
> >> [    4.570038]  (driver?)
> >> [    4.576671] 1f01             384 mtdblock1
> >> [    4.576680]  (driver?)
> >> [    4.583234] 1f02             128 mtdblock2
> >> [    4.583240]  (driver?)
> >> [    4.589883] 1f03           32256 mtdblock3
> >> [    4.589892]  (driver?)
> >> [    4.596520] 1f04           32768 mtdblock4
> >> [    4.596529]  (driver?)
> >> [    4.603080] 1f05             384 mtdblock5
> >> [    4.603085]  (driver?)
> >> [    4.609711] 1f06             128 mtdblock6
> >> [    4.609719]  (driver?)
> >> [    4.616338] 1f07           32256 mtdblock7
> >> [    4.616347]  (driver?)
> >> [    4.622901] 1f08          131072 mtdblock8
> >> [    4.622907]  (driver?)
> >> [    4.629539] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
> > 
> > A hint is provided earlier in the boot process:
> > 
> >> [    0.920597] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> >> [    0.926753] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> >> [    0.932704] aspeed-smc 1e620000.spi: CE0 window [ 0x20000000 - 0x22000000 ] 32MB
> >> [    0.940230] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x2a000000 ] 128MB
> >> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> >> [    1.435022] 3 fixed-partitions partitions found on MTD device bmc
> >> [    1.441249] Creating 3 MTD partitions on "bmc":
> >> [    1.445911] 0x000000000000-0x000000060000 : "u-boot"
> >> [    1.455264] 0x000000060000-0x000000080000 : "u-boot-env"
> >> [    1.465042] 0x000000080000-0x000002000000 : "obmc-ubi"
> >> [    1.474914] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> >> [    1.481102] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> >> [    1.487175] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x24000000 ] 32MB
> >> [    1.494592] aspeed-smc 1e620000.spi: CE2 window [ 0x24000000 - 0x2c000000 ] 128MB
> >> [    1.502173] aspeed-smc 1e620000.spi: read control register: 203c0041
> >> [    1.705799] aspeed-smc 1e620000.spi: No good frequency, using dumb slow
> >> [    1.717393] 3 fixed-partitions partitions found on MTD device alt-bmc
> >> [    1.723851] Creating 3 MTD partitions on "alt-bmc":
> >> [    1.728890] 0x000000000000-0x000000060000 : "alt-u-boot"
> >> [    1.738950] 0x000000060000-0x000000080000 : "alt-u-boot-env"
> >> [    1.748975] 0x000000080000-0x000002000000 : "alt-obmc-ubi"
> > 
> > Specifically, the control register state is exposed as:
> > 
> >> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> > 
> > The 0x3c opcode translates to DREAD4B for the mx25l25635f part, which is
> > what is detected. The post BFPT fixup implemented in commit 2bffa65da43e
> > ("mtd: spi-nor: Add a post BFPT fixup for MX25L25635E") detects the 'e'
> > vs 'f' part based on the reported support for
> > BFPT_DWORD5_FAST_READ_4_4_4, which implies 4B opcodes are supported
> > (e.g. DREAD4B), however the aspeed-smc driver fails to put the
> > controller into the right addressing mode to support sending DREAD4B, and
> > so we reach a bad state.
> 
> It's more complex than that but I haven't quite cornered the problem. 
> 
> When doing the link training, the first read for the golden image is 
> done in slow mode and it misses the first byte for some reason. So the 
> gold image is incorrect (cough) but other images are correct (cough cough)
> 
> Why is this first byte being dropped is the question. The flash module 
> might have entered 4B mode ? is it expecting a dummy ? 
> 
> For the moment, this is fine for a workaround but we will need to fully 
> support 4B opcodes (which we do without training). Another solution is 
> to use the kernel command line switch "optimize_read=false" and all 
> works fine, perfectly fine. Which is kind of frustrating.

Hmm, okay. Sounds like I didn't track it down as well as I thought then.

I figured we'd need to set CONTROL_IO_DUAL_ADDR_DATA to send a
DREAD4B, but we never put the controller into that mode: there's only
one call to aspeed_smc_set_io_mode(), in aspeed_smc_read_user(),
which is only called if `io_mode == CONTROL_IO_DUAL_DATA` holds,
and we set the IO mode to CONTROL_IO_DUAL_DATA.

Suggestions for rewording the commit message? Should I just replace
some of it with your words above?

Andrew

> 
> Thanks for the patch.
> 
> C.
> 
> 
> > 
> > In the interim, revert the upstream patch adding 'e' vs 'f' detection to
> > avoid sending 4B opcodes.
> > 
> > The revert has been tested on a freshly flashed and power-cycled
> > Witherspoon, both with and without the patch applied, confirming the
> > broken behaviour in the former case and a successful boot in the latter.
> > 
> > Cc: Andrew Geissler <geissonator@gmail.com>
> > Reported-by: George Keishing <gkeishin@in.ibm.com>
> > Investigated-by: Cédric Le Goater <clg@kaod.org>
> > Investigated-by: Eddie James <eajames@linux.ibm.com>
> > Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> > ---
> >  drivers/mtd/spi-nor/spi-nor.c | 29 +----------------------------
> >  1 file changed, 1 insertion(+), 28 deletions(-)
> > 
> > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
> > index 5a5a47651bf9..9f85ab5fc569 100644
> > --- a/drivers/mtd/spi-nor/spi-nor.c
> > +++ b/drivers/mtd/spi-nor/spi-nor.c
> > @@ -1681,31 +1681,6 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
> >  		.addr_width = 3,					\
> >  		.flags = SPI_NOR_NO_FR | SPI_S3AN,
> >  
> > -static int
> > -mx25l25635_post_bfpt_fixups(struct spi_nor *nor,
> > -			    const struct sfdp_parameter_header *bfpt_header,
> > -			    const struct sfdp_bfpt *bfpt,
> > -			    struct spi_nor_flash_parameter *params)
> > -{
> > -	/*
> > -	 * MX25L25635F supports 4B opcodes but MX25L25635E does not.
> > -	 * Unfortunately, Macronix has re-used the same JEDEC ID for both
> > -	 * variants which prevents us from defining a new entry in the parts
> > -	 * table.
> > -	 * We need a way to differentiate MX25L25635E and MX25L25635F, and it
> > -	 * seems that the F version advertises support for Fast Read 4-4-4 in
> > -	 * its BFPT table.
> > -	 */
> > -	if (bfpt->dwords[BFPT_DWORD(5)] & BFPT_DWORD5_FAST_READ_4_4_4)
> > -		nor->flags |= SNOR_F_4B_OPCODES;
> > -
> > -	return 0;
> > -}
> > -
> > -static struct spi_nor_fixups mx25l25635_fixups = {
> > -	.post_bfpt = mx25l25635_post_bfpt_fixups,
> > -};
> > -
> >  /* NOTE: double check command sets and memory organization when you add
> >   * more nor chips.  This current list focusses on newer chips, which
> >   * have been converging on command sets which including JEDEC ID.
> > @@ -1843,9 +1818,7 @@ static const struct flash_info spi_nor_ids[] = {
> >  	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
> >  	{ "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
> >  			 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> > -	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512,
> > -			 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
> > -			 .fixups = &mx25l25635_fixups },
> > +	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> >  	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
> >  	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
> >  	{ "mx66l51235f", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> > 
> 
>
Andrew Jeffery April 17, 2019, 10:22 a.m. UTC | #4
On Wed, 17 Apr 2019, at 15:53, Andrew Jeffery wrote:
> 
> 
> On Wed, 17 Apr 2019, at 15:41, Cédric Le Goater wrote:
> > On 4/17/19 7:45 AM, Andrew Jeffery wrote:
> > > This reverts commit 2bffa65da43e399079dad5947c6aa9ab3cfa4ad4.
> > > 
> > > 5.0.x fails to boot on Witherspoon machines after an AC-cycle, with the
> > > following error:
> > > 
> > >> [    4.337766] ubi0: default fastmap pool size: 25
> > >> [    4.342321] ubi0: default fastmap WL pool size: 12
> > >> [    4.347232] ubi0: attaching mtd3
> > >> [    4.361487] ubi0: scanning is finished
> > >> [    4.365525] ubi0 error: ubi_read_volume_table: the layout volume was not found
> > >> [    4.372989] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd3, error -22
> > >> [    4.380193] UBI error: cannot attach mtd3
> > > 
> > > Which leads to:
> > > 
> > >> [    4.553478] VFS: Cannot open root device "ubiblock0_1" or unknown-block(0,0): error -6
> > >> [    4.561550] Please append a correct "root=" boot option; here are the available partitions:
> > >> [    4.570029] 1f00           32768 mtdblock0
> > >> [    4.570038]  (driver?)
> > >> [    4.576671] 1f01             384 mtdblock1
> > >> [    4.576680]  (driver?)
> > >> [    4.583234] 1f02             128 mtdblock2
> > >> [    4.583240]  (driver?)
> > >> [    4.589883] 1f03           32256 mtdblock3
> > >> [    4.589892]  (driver?)
> > >> [    4.596520] 1f04           32768 mtdblock4
> > >> [    4.596529]  (driver?)
> > >> [    4.603080] 1f05             384 mtdblock5
> > >> [    4.603085]  (driver?)
> > >> [    4.609711] 1f06             128 mtdblock6
> > >> [    4.609719]  (driver?)
> > >> [    4.616338] 1f07           32256 mtdblock7
> > >> [    4.616347]  (driver?)
> > >> [    4.622901] 1f08          131072 mtdblock8
> > >> [    4.622907]  (driver?)
> > >> [    4.629539] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
> > > 
> > > A hint is provided earlier in the boot process:
> > > 
> > >> [    0.920597] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> > >> [    0.926753] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> > >> [    0.932704] aspeed-smc 1e620000.spi: CE0 window [ 0x20000000 - 0x22000000 ] 32MB
> > >> [    0.940230] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x2a000000 ] 128MB
> > >> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> > >> [    1.435022] 3 fixed-partitions partitions found on MTD device bmc
> > >> [    1.441249] Creating 3 MTD partitions on "bmc":
> > >> [    1.445911] 0x000000000000-0x000000060000 : "u-boot"
> > >> [    1.455264] 0x000000060000-0x000000080000 : "u-boot-env"
> > >> [    1.465042] 0x000000080000-0x000002000000 : "obmc-ubi"
> > >> [    1.474914] aspeed-smc 1e620000.spi: Using 50 MHz SPI frequency
> > >> [    1.481102] aspeed-smc 1e620000.spi: mx25l25635e (32768 Kbytes)
> > >> [    1.487175] aspeed-smc 1e620000.spi: CE1 window [ 0x22000000 - 0x24000000 ] 32MB
> > >> [    1.494592] aspeed-smc 1e620000.spi: CE2 window [ 0x24000000 - 0x2c000000 ] 128MB
> > >> [    1.502173] aspeed-smc 1e620000.spi: read control register: 203c0041
> > >> [    1.705799] aspeed-smc 1e620000.spi: No good frequency, using dumb slow
> > >> [    1.717393] 3 fixed-partitions partitions found on MTD device alt-bmc
> > >> [    1.723851] Creating 3 MTD partitions on "alt-bmc":
> > >> [    1.728890] 0x000000000000-0x000000060000 : "alt-u-boot"
> > >> [    1.738950] 0x000000060000-0x000000080000 : "alt-u-boot-env"
> > >> [    1.748975] 0x000000080000-0x000002000000 : "alt-obmc-ubi"
> > > 
> > > Specifically, the control register state is exposed as:
> > > 
> > >> [    0.947812] aspeed-smc 1e620000.spi: read control register: 203c0641
> > > 
> > > The 0x3c opcode translates to DREAD4B for the mx25l25635f part, which is
> > > what is detected. The post BFPT fixup implemented in commit 2bffa65da43e
> > > ("mtd: spi-nor: Add a post BFPT fixup for MX25L25635E") detects the 'e'
> > > vs 'f' part based on the reported support for
> > > BFPT_DWORD5_FAST_READ_4_4_4, which implies 4B opcodes are supported
> > > (e.g. DREAD4B), however the aspeed-smc driver fails to put the
> > > controller into the right addressing mode to support sending DREAD4B, and
> > > so we reach a bad state.
> > 
> > It's more complex than that but I haven't quite cornered the problem. 
> > 
> > When doing the link training, the first read for the golden image is 
> > done in slow mode and it misses the first byte for some reason. So the 
> > gold image is incorrect (cough) but other images are correct (cough cough)
> > 
> > Why is this first byte being dropped is the question. The flash module 
> > might have entered 4B mode ? is it expecting a dummy ? 
> > 
> > For the moment, this is fine for a workaround but we will need to fully 
> > support 4B opcodes (which we do without training). Another solution is 
> > to use the kernel command line switch "optimize_read=false" and all 
> > works fine, perfectly fine. Which is kind of frustrating.
> 
> Hmm, okay. Sounds like I didn't track it down as well as I thought then.
> 
> I figured we'd need to set CONTROL_IO_DUAL_ADDR_DATA to send a
> DREAD4B, but we never put the controller into that mode: there's only
> one call to aspeed_smc_set_io_mode(), in aspeed_smc_read_user(),
> which is only called if `io_mode == CONTROL_IO_DUAL_DATA` holds,
> and we set the IO mode to CONTROL_IO_DUAL_DATA.
> 
> Suggestions for rewording the commit message? Should I just replace
> some of it with your words above?

Inside word is that Cédric has found the root cause, I'll be abandoning this work-around in anticipation of a proper fix. The issue actually appears to be with the link training assuming EN4B mode which is not the configured when 4B opcodes are enabled.

Andrew

> Andrew
> 
> > 
> > Thanks for the patch.
> > 
> > C.
> > 
> > 
> > > 
> > > In the interim, revert the upstream patch adding 'e' vs 'f' detection to
> > > avoid sending 4B opcodes.
> > > 
> > > The revert has been tested on a freshly flashed and power-cycled
> > > Witherspoon, both with and without the patch applied, confirming the
> > > broken behaviour in the former case and a successful boot in the latter.
> > > 
> > > Cc: Andrew Geissler <geissonator@gmail.com>
> > > Reported-by: George Keishing <gkeishin@in.ibm.com>
> > > Investigated-by: Cédric Le Goater <clg@kaod.org>
> > > Investigated-by: Eddie James <eajames@linux.ibm.com>
> > > Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> > > ---
> > >  drivers/mtd/spi-nor/spi-nor.c | 29 +----------------------------
> > >  1 file changed, 1 insertion(+), 28 deletions(-)
> > > 
> > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
> > > index 5a5a47651bf9..9f85ab5fc569 100644
> > > --- a/drivers/mtd/spi-nor/spi-nor.c
> > > +++ b/drivers/mtd/spi-nor/spi-nor.c
> > > @@ -1681,31 +1681,6 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
> > >  		.addr_width = 3,					\
> > >  		.flags = SPI_NOR_NO_FR | SPI_S3AN,
> > >  
> > > -static int
> > > -mx25l25635_post_bfpt_fixups(struct spi_nor *nor,
> > > -			    const struct sfdp_parameter_header *bfpt_header,
> > > -			    const struct sfdp_bfpt *bfpt,
> > > -			    struct spi_nor_flash_parameter *params)
> > > -{
> > > -	/*
> > > -	 * MX25L25635F supports 4B opcodes but MX25L25635E does not.
> > > -	 * Unfortunately, Macronix has re-used the same JEDEC ID for both
> > > -	 * variants which prevents us from defining a new entry in the parts
> > > -	 * table.
> > > -	 * We need a way to differentiate MX25L25635E and MX25L25635F, and it
> > > -	 * seems that the F version advertises support for Fast Read 4-4-4 in
> > > -	 * its BFPT table.
> > > -	 */
> > > -	if (bfpt->dwords[BFPT_DWORD(5)] & BFPT_DWORD5_FAST_READ_4_4_4)
> > > -		nor->flags |= SNOR_F_4B_OPCODES;
> > > -
> > > -	return 0;
> > > -}
> > > -
> > > -static struct spi_nor_fixups mx25l25635_fixups = {
> > > -	.post_bfpt = mx25l25635_post_bfpt_fixups,
> > > -};
> > > -
> > >  /* NOTE: double check command sets and memory organization when you add
> > >   * more nor chips.  This current list focusses on newer chips, which
> > >   * have been converging on command sets which including JEDEC ID.
> > > @@ -1843,9 +1818,7 @@ static const struct flash_info spi_nor_ids[] = {
> > >  	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
> > >  	{ "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
> > >  			 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> > > -	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512,
> > > -			 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
> > > -			 .fixups = &mx25l25635_fixups },
> > > +	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> > >  	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
> > >  	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
> > >  	{ "mx66l51235f", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
> > > 
> > 
> >
>
diff mbox series

Patch

diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 5a5a47651bf9..9f85ab5fc569 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -1681,31 +1681,6 @@  static int sr2_bit7_quad_enable(struct spi_nor *nor)
 		.addr_width = 3,					\
 		.flags = SPI_NOR_NO_FR | SPI_S3AN,
 
-static int
-mx25l25635_post_bfpt_fixups(struct spi_nor *nor,
-			    const struct sfdp_parameter_header *bfpt_header,
-			    const struct sfdp_bfpt *bfpt,
-			    struct spi_nor_flash_parameter *params)
-{
-	/*
-	 * MX25L25635F supports 4B opcodes but MX25L25635E does not.
-	 * Unfortunately, Macronix has re-used the same JEDEC ID for both
-	 * variants which prevents us from defining a new entry in the parts
-	 * table.
-	 * We need a way to differentiate MX25L25635E and MX25L25635F, and it
-	 * seems that the F version advertises support for Fast Read 4-4-4 in
-	 * its BFPT table.
-	 */
-	if (bfpt->dwords[BFPT_DWORD(5)] & BFPT_DWORD5_FAST_READ_4_4_4)
-		nor->flags |= SNOR_F_4B_OPCODES;
-
-	return 0;
-}
-
-static struct spi_nor_fixups mx25l25635_fixups = {
-	.post_bfpt = mx25l25635_post_bfpt_fixups,
-};
-
 /* NOTE: double check command sets and memory organization when you add
  * more nor chips.  This current list focusses on newer chips, which
  * have been converging on command sets which including JEDEC ID.
@@ -1843,9 +1818,7 @@  static const struct flash_info spi_nor_ids[] = {
 	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
 	{ "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
 			 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512,
-			 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
-			 .fixups = &mx25l25635_fixups },
+	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
 	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
 	{ "mx66l51235f", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },