Re: [BUG] Rockchip SPI: long burst writes produce unexpected result
On Sunday, April 7, 2019 9:55:10 PM CEST, Emil Renner Berthing wrote: Hi Vicente, On Sat, 6 Apr 2019 at 19:35, Vicente Bergas wrote: Hi, i have been experiencing issues writing to NOR-Flash SPI Memories from two RK3399-based platforms: gru-kevin and sapphire board. For kevin, this resulted in a bricked device because that memory is the only boot device. ... Since you say reverting the "set min/max speed" patch fixes your issues could you try raising the spi clock like this and see if it works for you? + assigned-clocks = < SCLK_SPI1>; + assigned-clock-rates = <4>; Of course the driver shouldn't let you configure the spi-controller in a way that makes it skip bytes, but if this works for you then I still think you're better off explicitly setting the spi clock speed rather than having the driver raise it for you. At least while it does it without checking for errors or having a way to lower it again as outlined in the commit message. status = "okay"; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; ... /Emil Hi Emil, I've added both assigned-clocks properties to the spi1 node and tested again. Unfortunately it still fails in a similar way: Before the maximum write burst without errors was 47, now it is 33. I've also tested it with an SPI bus speed of 100KHz to make sure the external hardware is not overrun: ioctl SPI_IOC_WR_MAX_SPEED_HZ 10 Regards, Vicenç.
Re: [BUG] Rockchip SPI: long burst writes produce unexpected result
Hi Vicente, On Sat, 6 Apr 2019 at 19:35, Vicente Bergas wrote: > > Hi, > i have been experiencing issues writing to NOR-Flash SPI Memories > from two RK3399-based platforms: gru-kevin and sapphire board. > For kevin, this resulted in a bricked device because that memory > is the only boot device. > Fortunately an external programmer is available. > > In order to isolate where the issue can be, several tests have been > done, after which it makes me think the issue is related to the > Rockchip SPI driver. > > 4KB burst reads work fine. > The issue is only observed on the write burst length. > > Test user user/kernel kernelRK3399 > Num spaceinterface space SoC Status Notes > > 1flashrom linux_mtd MTD/RKspi RKspi Fail > 2flashrom linux_spi RKspi RKspi Fail > 3flashrom linux_spi spi_gpio GPIOOK > 4custom linux_spi spi_gpio GPIOOK 260-byte burst writes > 5custom linux_spi RKspi RKspi Fail 260-byte burst writes > 6custom linux_spi RKspi RKspi OK 1-byte burst writes > 7custom linux_spi RKspi RKspi OK47-byte burst writes > 8custom linux_spi RKspi RKspi Fail 48-byte burst writes > > 3, 4) Unaccetably slow, device tree is > spi_gpio { > compatible = "spi-gpio"; > #address-cells = <1>; > #size-cells = <0>; > cs-gpios = < RK_PB2 GPIO_ACTIVE_HIGH>; > sck-gpios = < RK_PB1 GPIO_ACTIVE_HIGH>; > mosi-gpios = < RK_PB0 GPIO_ACTIVE_HIGH>; > miso-gpios = < RK_PA7 GPIO_ACTIVE_HIGH>; > num-chipselects = <1>; > spidev@0 { > compatible = "spidev"; > reg = <0>; > spi-max-frequency = <5000>; > }; > }; > 2, 5, 6, 7, 8) device tree is >{ Since you say reverting the "set min/max speed" patch fixes your issues could you try raising the spi clock like this and see if it works for you? + assigned-clocks = < SCLK_SPI1>; + assigned-clock-rates = <4>; Of course the driver shouldn't let you configure the spi-controller in a way that makes it skip bytes, but if this works for you then I still think you're better off explicitly setting the spi clock speed rather than having the driver raise it for you. At least while it does it without checking for errors or having a way to lower it again as outlined in the commit message. > status = "okay"; > spidev@0 { > compatible = "spidev"; > reg = <0>; > spi-max-frequency = <5000>; > }; > }; > ... /Emil
Re: [BUG] Rockchip SPI: long burst writes produce unexpected result
Hi, please, forget my previous mail about eff0275e5253604429aedc42b008c5fcaa6cc597 spi: rockchip: simplify use_dma logic i messed up with commit IDs, sorry. The first offending commit is one later than that: commit 420b82f842941a32adf309ca1b193adfc77616b0 Date: Wed Oct 31 11:57:07 2018 +0100 spi: rockchip: set min/max speed The driver previously checked each transfer if the requested speed was higher than possible with the current spi clock rate and raised the clock rate accordingly. However, there is no check to see if the spi clock was actually set that high and no way to dynamically lower the spi clock rate again. So it seems any potiential users of this functionality are better off just setting the spi clock rate at init using the assigned-clock-rates devicetree property. Removing this dynamic spi clock rate raising allows us let the spi framework handle min/max speeds for us. Regards, Vicenç. On Saturday, April 6, 2019 7:34:32 PM CEST, Vicente Bergas wrote: Hi, i have been experiencing issues writing to NOR-Flash SPI Memories from two RK3399-based platforms: gru-kevin and sapphire board. For kevin, this resulted in a bricked device because that memory is the only boot device. Fortunately an external programmer is available. In order to isolate where the issue can be, several tests have been done, after which it makes me think the issue is related to the Rockchip SPI driver. 4KB burst reads work fine. The issue is only observed on the write burst length. Test user user/kernel kernelRK3399 Num space interface space SoC Status Notes 1flashrom linux_mtd MTD/RKspi RKspi Fail 2flashrom linux_spi RKspi RKspi Fail 3flashrom linux_spi spi_gpio GPIOOK 4custom linux_spi spi_gpio GPIOOK 260-byte burst writes 5custom linux_spi RKspi RKspi Fail 260-byte burst writes 6custom linux_spi RKspi RKspi OK 1-byte burst writes 7custom linux_spi RKspi RKspi OK47-byte burst writes 8custom linux_spi RKspi RKspi Fail 48-byte burst writes 3, 4) Unaccetably slow, device tree is spi_gpio { compatible = "spi-gpio"; #address-cells = <1>; #size-cells = <0>; cs-gpios = < RK_PB2 GPIO_ACTIVE_HIGH>; sck-gpios = < RK_PB1 GPIO_ACTIVE_HIGH>; mosi-gpios = < RK_PB0 GPIO_ACTIVE_HIGH>; miso-gpios = < RK_PA7 GPIO_ACTIVE_HIGH>; num-chipselects = <1>; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 2, 5, 6, 7, 8) device tree is { status = "okay"; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 5, 6, 7, 8) Burst writes are performed this way enum { BURST = 48 }; struct spi_ioc_transfer msg[0x105]; unsigned i = 0; for (unsigned j = 0; j < wcnt; j += BURST) { msg[i++] = { .tx_buf = warr, .len = BURST000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 020 FF FF FF FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF 030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 070 FF FF FF FF FF FF FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF 080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7B0 00 00 00
Re: [BUG] Rockchip SPI: long burst writes produce unexpected result
Hi again, just found the first offending commit: commit eff0275e5253604429aedc42b008c5fcaa6cc597 Date: Wed Oct 31 11:57:06 2018 +0100 spi: rockchip: simplify use_dma logic We only need to know if we're using dma when setting up the transfer, so just use a local variable for that. It was mainlined in Linux v5.0. This is the result of a binary search among this list of commits: 04290192f7ebe892828f69ac57c4684e25da378d 65498c6ae2414a1425aa6c4231e79e2998afec05 01b59ce5dac856323a0c13c1d51d99a819f32efe 74b7efa82b11914c21e30d987ed61d3daa57ff21 420b82f842941a32adf309ca1b193adfc77616b0 eff0275e5253604429aedc42b008c5fcaa6cc597 d790c342e689ea77a5cf72d5b993299911ee5276 eee06a9ee2cd5deaddc5f77ce8f6118c8b82b2a0 fc1ad8ee33480bdf0493b54907b74538bf9b75b8 ce386100d99976442093ff57b5b24a9562c6cc27 fab3e4871f623c8f86e8a0e00749f1480ffa08db 2410d6a3c3070e205169a1a741aa78898e30a642 31bcb57be12fd815a9051f07d64334809b8cb472 30688e4e670d21126aa596df4523940e2f8d24de a3c174021ce780f5d2e9b2105e2cb4903a37226d d9071b7e9fc474e474e3b865428a8d30d88daaf4 f340b920511a666b02d371e88801d3817ea7a880 058f7c509e84abd36f988d4e16432366bd793d8f dcfc861d24ec19f0d0d3d55bb016646794571fbb dd8fd2cbc73f8650f651da71fc61a6e4f30c1566 Regards, Vicenç. On Saturday, April 6, 2019 7:34:32 PM CEST, Vicente Bergas wrote: Hi, i have been experiencing issues writing to NOR-Flash SPI Memories from two RK3399-based platforms: gru-kevin and sapphire board. For kevin, this resulted in a bricked device because that memory is the only boot device. Fortunately an external programmer is available. In order to isolate where the issue can be, several tests have been done, after which it makes me think the issue is related to the Rockchip SPI driver. 4KB burst reads work fine. The issue is only observed on the write burst length. Test user user/kernel kernelRK3399 Num space interface space SoC Status Notes 1flashrom linux_mtd MTD/RKspi RKspi Fail 2flashrom linux_spi RKspi RKspi Fail 3flashrom linux_spi spi_gpio GPIOOK 4custom linux_spi spi_gpio GPIOOK 260-byte burst writes 5custom linux_spi RKspi RKspi Fail 260-byte burst writes 6custom linux_spi RKspi RKspi OK 1-byte burst writes 7custom linux_spi RKspi RKspi OK47-byte burst writes 8custom linux_spi RKspi RKspi Fail 48-byte burst writes 3, 4) Unaccetably slow, device tree is spi_gpio { compatible = "spi-gpio"; #address-cells = <1>; #size-cells = <0>; cs-gpios = < RK_PB2 GPIO_ACTIVE_HIGH>; sck-gpios = < RK_PB1 GPIO_ACTIVE_HIGH>; mosi-gpios = < RK_PB0 GPIO_ACTIVE_HIGH>; miso-gpios = < RK_PA7 GPIO_ACTIVE_HIGH>; num-chipselects = <1>; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 2, 5, 6, 7, 8) device tree is { status = "okay"; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 5, 6, 7, 8) Burst writes are performed this way enum { BURST = 48 }; struct spi_ioc_transfer msg[0x105]; unsigned i = 0; for (unsigned j = 0; j < wcnt; j += BURST) { msg[i++] = { .tx_buf = warr, .len = BURST000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 020 FF FF FF FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF 030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 070 FF FF FF FF FF FF FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF 080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[BUG] Rockchip SPI: long burst writes produce unexpected result
Hi, i have been experiencing issues writing to NOR-Flash SPI Memories from two RK3399-based platforms: gru-kevin and sapphire board. For kevin, this resulted in a bricked device because that memory is the only boot device. Fortunately an external programmer is available. In order to isolate where the issue can be, several tests have been done, after which it makes me think the issue is related to the Rockchip SPI driver. 4KB burst reads work fine. The issue is only observed on the write burst length. Test user user/kernel kernelRK3399 Num spaceinterface space SoC Status Notes 1flashrom linux_mtd MTD/RKspi RKspi Fail 2flashrom linux_spi RKspi RKspi Fail 3flashrom linux_spi spi_gpio GPIOOK 4custom linux_spi spi_gpio GPIOOK 260-byte burst writes 5custom linux_spi RKspi RKspi Fail 260-byte burst writes 6custom linux_spi RKspi RKspi OK 1-byte burst writes 7custom linux_spi RKspi RKspi OK47-byte burst writes 8custom linux_spi RKspi RKspi Fail 48-byte burst writes 3, 4) Unaccetably slow, device tree is spi_gpio { compatible = "spi-gpio"; #address-cells = <1>; #size-cells = <0>; cs-gpios = < RK_PB2 GPIO_ACTIVE_HIGH>; sck-gpios = < RK_PB1 GPIO_ACTIVE_HIGH>; mosi-gpios = < RK_PB0 GPIO_ACTIVE_HIGH>; miso-gpios = < RK_PA7 GPIO_ACTIVE_HIGH>; num-chipselects = <1>; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 2, 5, 6, 7, 8) device tree is { status = "okay"; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <5000>; }; }; 5, 6, 7, 8) Burst writes are performed this way enum { BURST = 48 }; struct spi_ioc_transfer msg[0x105]; unsigned i = 0; for (unsigned j = 0; j < wcnt; j += BURST) { msg[i++] = { .tx_buf = warr, .len = BURST000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 020 FF FF FF FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF FF FF FF FF FF FF F1 F2 F3 F4 FF FF FF 030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 070 FF FF FF FF FF FF FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF E1 E2 E3 E4 FF FF FF FF FF FF 080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 800 01 02 03 04 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 00 00 00 00 00 00 00 00 00 00 00 00 810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 820 00 00 00 00 00 00 00 00 00 00 00 00 05 06 07 08 00 00 00 00 00 00 00 00 00 05 06 07 08 00 00 00 830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 850 00 00 00 00 00 00 00 00 00