u-boot-brain/drivers
Rasmus Villemoes 391c40048b mpc8xxx_spi: always use 8-bit characters, don't read or write garbage
There are a few problems with the current driver.

First, it unconditionally reads from dout/writes to din whether or not
those pointers are NULL. So for example a simple "sf probe" ends up
writing four bytes at address 0:

=> md.l 0x0 8
00000000: 45454545 45454545 05050505 05050505    EEEEEEEE........
00000010: 00000000 00000000 07070707 07070707    ................
=> sf probe 0
mpc8xxx_spi_xfer: slave spi@7000:0 dout 0FB53618 din 00000000 bitlen 8
mpc8xxx_spi_xfer: slave spi@7000:0 dout 00000000 din 0FB536B8 bitlen 48
SF: Detected s25sl032p with page size 256 Bytes, erase size 64 KiB, total 4 MiB
=> md.l 0x0 8
00000000: ff000000 45454545 05050505 05050505    ....EEEE........
00000010: 00000000 00000000 07070707 07070707    ................

(here I've change the first debug statement to a printf, and made it
print the din/dout pointers rather than the uints they point at).

Second, as we can also see above, it always writes a full 32 bits,
even if a smaller amount was requested. So for example

=> mw.l $loadaddr 0xaabbccdd 8
=> md.l $loadaddr 8
02000000: aabbccdd aabbccdd aabbccdd aabbccdd    ................
02000010: aabbccdd aabbccdd aabbccdd aabbccdd    ................
=> sf read $loadaddr 0x400 6
device 0 offset 0x400, size 0x6
mpc8xxx_spi_xfer: slave spi@7000:0 dout 0FB536E8 din 00000000 bitlen 40
mpc8xxx_spi_xfer: slave spi@7000:0 dout 00000000 din 02000000 bitlen 48
SF: 6 bytes @ 0x400 Read: OK
=> sf read 0x02000010 0x400 8
device 0 offset 0x400, size 0x8
mpc8xxx_spi_xfer: slave spi@7000:0 dout 0FB53848 din 00000000 bitlen 40
mpc8xxx_spi_xfer: slave spi@7000:0 dout 00000000 din 02000010 bitlen 64
SF: 8 bytes @ 0x400 Read: OK
=> md.l $loadaddr 8
02000000: 45454545 45450000 aabbccdd aabbccdd    EEEEEE..........
02000010: 45454545 45454545 aabbccdd aabbccdd    EEEEEEEE........

Finally, when the bitlen is 24 mod 32 (e.g. requesting to read 3 or 7
bytes), the last three bytes and up being the wrong ones, since the
driver does a full 32 bit read and then shifts the wrong byte out:

=> mw.l $loadaddr 0xaabbccdd 4
=> md.l $loadaddr 4
02000000: aabbccdd aabbccdd aabbccdd aabbccdd    ................
=> sf read $loadaddr 0x444 10
device 0 offset 0x444, size 0x10
mpc8xxx_spi_xfer: slave spi@7000:0 dout 0FB536E8 din 00000000 bitlen 40
mpc8xxx_spi_xfer: slave spi@7000:0 dout 00000000 din 02000000 bitlen 128
SF: 16 bytes @ 0x444 Read: OK
=> md.l $loadaddr 4
02000000: 552d426f 6f742032 3031392e 30342d30    U-Boot 2019.04-0
=> mw.l $loadaddr 0xaabbccdd 4
=> sf read $loadaddr 0x444 0xb
device 0 offset 0x444, size 0xb
mpc8xxx_spi_xfer: slave spi@7000:0 dout 0FB536E8 din 00000000 bitlen 40
mpc8xxx_spi_xfer: slave spi@7000:0 dout 00000000 din 02000000 bitlen 88
SF: 11 bytes @ 0x444 Read: OK
=> md.l $loadaddr 4
02000000: 552d426f 6f742032 31392e00 aabbccdd    U-Boot 219......

Fix all of that by always using a character size of 8, and reject
transfers that are not a whole number of bytes. While it ends being
more work for the CPU, we're mostly bounded by the speed of the SPI
bus, and we avoid writing to the mode register in every loop.

Based on work by Klaus H. Sørensen.

Cc: Klaus H. Sorensen <khso@prevas.dk>
Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
2020-03-31 10:06:53 -04:00
..
adc dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
ata Revert "ata: fsl_ahci: Add sata DM support for Freescale powerpc socs" 2020-02-25 10:16:05 +05:30
axi dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
bios_emulator bios_emulator: remove stray break 2019-08-09 22:24:02 +08:00
block dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
board drivers: board: Add get_fit_loadable() 2020-01-07 11:13:24 -05:00
bootcount bootcount: add a DM i2c eeprom backing store for bootcount 2020-01-10 10:25:13 -05:00
cache common: Move hang() to the same header as panic() 2020-01-24 23:06:49 +05:30
clk x86: remove dead code in intel_clk_get_rate() 2020-03-05 18:19:40 +08:00
core dm: core: Add a flag for power domain control on device removal 2020-03-02 19:47:38 -07:00
cpu Move strtomhz() to vsprintf.h 2019-12-02 18:23:09 -05:00
crypto crypto: make mod_exp_sw() static 2020-01-25 12:04:36 -05:00
ddr sandbox conversion to SDL2 2020-02-11 10:58:41 -05:00
demo SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
dfu dm: core: Require users of devres to include the header 2020-02-05 19:33:46 -07:00
dma dma-mapping: move dma_map_(un)single() to <linux/dma-mapping.h> 2020-02-19 21:27:30 +08:00
fastboot fastboot: mt85xx: add command to flash/erase emmc hwpart 2020-01-25 12:04:36 -05:00
firmware dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
fpga dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
gpio gpio/mpc83xx_spisel_boot.c: gpio driver for SPISEL_BOOT signal 2020-03-31 10:06:52 -04:00
hwspinlock dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
i2c i2c: designware_i2c: Correct the selection of speed mode 2020-02-18 08:16:45 +01:00
input input: Move input.o to be built only in some cases 2019-11-19 17:43:04 -05:00
led dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
mailbox dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
memory SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
misc misc: k3_avs: Fix possible NULL pointer deference 2020-02-26 18:35:29 +05:30
mmc mmc: am654_sdhci: Implement workaround for card detect 2020-03-09 08:33:16 +08:00
mtd mtd: nand: Fix on-die ecc issues in arasan_nfc driver 2020-02-28 12:04:10 +01:00
net armv8/ls1046ardb: RGMII ports require internal delay 2020-03-30 08:06:52 +05:30
nvme dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
pch x86: Allow removal of standard PCH drivers 2019-12-15 11:44:16 +08:00
pci pci-host-ecam-generic: access config space independent of system-wide bus id 2020-03-30 08:11:56 +05:30
pci_endpoint pci_ep: Fix Coverity warning 2019-08-07 15:31:04 -04:00
phy dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
pinctrl pinctrl: stmfx: update the result type of dm_i2c_reg_read 2020-02-13 18:47:00 +01:00
power dm: arm64: ls1046a: add i2c DM support 2020-03-30 08:12:13 +05:30
pwm pwm: rk_pwm: Make PWM driver to support all Rockchip Socs 2019-12-06 00:06:23 +08:00
qe crc32: Use the crc.h header for crc functions 2019-12-02 18:23:08 -05:00
ram ram: rockchip: Fix Kconfig dependency for RAM_ROCKCHIP_DEBUG 2020-02-13 10:10:50 -05:00
remoteproc dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
reset sandbox conversion to SDL2 2020-02-11 10:58:41 -05:00
rng drivers/rng: add Amlogic hardware RNG driver 2020-03-11 08:29:58 +01:00
rtc rtc: m41t62: add compatible for m41st87 2020-03-01 22:07:32 +01:00
scsi scsi: Add dma direction member to command structure 2019-10-23 20:47:12 -04:00
serial serial: mcfuart: renaming to a more appropriate name 2020-03-13 09:29:50 -04:00
smem dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
soc dma-mapping: move dma_map_(un)single() to <linux/dma-mapping.h> 2020-02-19 21:27:30 +08:00
sound dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
spi mpc8xxx_spi: always use 8-bit characters, don't read or write garbage 2020-03-31 10:06:53 -04:00
spmi dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
sysreset dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
tee dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
thermal thermal: ti-bandgap: Fix adc value datatype 2020-01-20 10:10:28 +05:30
timer dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
tpm sandbox conversion to SDL2 2020-02-11 10:58:41 -05:00
ufs dma-mapping: move dma_map_(un)single() to <linux/dma-mapping.h> 2020-02-19 21:27:30 +08:00
usb sunxi: Move common defconfig options to Kconfig 2020-03-18 18:25:00 +05:30
video video: meson: keep power domain up after booting 2020-03-02 19:47:38 -07:00
virtio dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
w1 dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
w1-eeprom dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
watchdog watchdog: Handle timer wrap around 2020-03-16 11:25:12 +01:00
Kconfig dm: rng: Add random number generator(rng) uclass 2020-01-07 18:08:21 +01:00
Makefile Kconfig: Rename CONFIG_SPL_DMA_SUPPORT to CONFIG_SPL_DMA 2020-01-15 19:50:27 -05:00