mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
![]() HyperFlash devices in Renesas SoCs use 2-bytes addressing, according
to HW manual paragraph 62.3.3 (which officially describes Serial Flash
access, but seems to be applicable to HyperFlash too). And 1-byte bus
read operations to 2-bytes unaligned addresses in external address space
read mode work incorrectly (returns the other byte from the same word).
Function memcpy_fromio(), used by the driver to read data from the bus,
in ARM64 architecture (to which Renesas cores belong) uses 8-bytes
bus accesses for appropriate aligned addresses, and 1-bytes accesses
for other addresses. This results in incorrect data read from HyperFlash
in unaligned cases.
This issue can be reproduced using something like the following commands
(where mtd1 is a parition on Hyperflash storage, defined properly
in a device tree):
[Correct fragment, read from Hyperflash]
root@rcar-gen3:~# dd if=/dev/mtd1 of=/tmp/zz bs=32 count=1
root@rcar-gen3:~# hexdump -C /tmp/zz
00000000 f4 03 00 aa f5 03 01 aa f6 03 02 aa f7 03 03 aa |................|
00000010 00 00 80 d2 40 20 18 d5 00 06 81 d2 a0 18 a6 f2 |....@ ..........|
00000020
[Incorrect read of the same fragment: see the difference at offsets 8-11]
root@rcar-gen3:~# dd if=/dev/mtd1 of=/tmp/zz bs=12 count=1
root@rcar-gen3:~# hexdump -C /tmp/zz
00000000 f4 03 00 aa f5 03 01 aa 03 03 aa aa |............|
0000000c
Fix this issue by creating a local replacement of the copying function,
that performs only properly aligned bus accesses, and is used for reading
from HyperFlash.
Fixes:
|
||
---|---|---|
.. | ||
samsung | ||
tegra | ||
.gitignore | ||
atmel-ebi.c | ||
atmel-sdramc.c | ||
brcmstb_dpfe.c | ||
bt1-l2-ctl.c | ||
da8xx-ddrctl.c | ||
dfl-emif.c | ||
emif-asm-offsets.c | ||
emif.c | ||
emif.h | ||
fsl-corenet-cf.c | ||
fsl_ifc.c | ||
jedec_ddr.h | ||
jedec_ddr_data.c | ||
jz4780-nemc.c | ||
Kconfig | ||
Makefile | ||
mtk-smi.c | ||
mvebu-devbus.c | ||
of_memory.c | ||
of_memory.h | ||
omap-gpmc.c | ||
pl172.c | ||
pl353-smc.c | ||
renesas-rpc-if.c | ||
stm32-fmc2-ebi.c | ||
ti-aemif.c | ||
ti-emif-pm.c | ||
ti-emif-sram-pm.S |