
Hi Siva,
Sorry for the very late reply!
-----Original Message----- From: Siva Durga Prasad Paladugu [mailto:siva.durga.paladugu@xilinx.com] Sent: Thursday, January 04, 2018 1:08 PM To: u-boot@lists.denx.de Cc: jagannadh.teki@gmail.com; Siva Durga Prasad Paladugu sivadur@xilinx.com Subject: [PATCH v2 1/2] spi: zynqmp_qspi: Add support for ZynqMP qspi driver
This patch adds qspi driver support for ZynqMP SoC. This driver is responsible for communicating with qspi flash devices.
The Technical Reference Manual of the ZynqMP talks about the LQSPI and the GQSPI. Based on the #defines, I'm guessing this is for the GQSPI but should we be more explicit about it?
Signed-off-by: Siva Durga Prasad Paladugu sivadur@xilinx.com
Changes from v1:
- Rebased on top of latest master
- Moved macro definitions to .h file as per comment
- Fixed magic values with macros as per comment
arch/arm/cpu/armv8/zynqmp/Kconfig | 7 + arch/arm/include/asm/arch-zynqmp/zynqmp_qspi.h | 154 ++++++ drivers/spi/Makefile | 1 + drivers/spi/zynqmp_qspi.c | 678 +++++++++++++++++++++++++ 4 files changed, 840 insertions(+) create mode 100644 arch/arm/include/asm/arch-zynqmp/zynqmp_qspi.h create mode 100644 drivers/spi/zynqmp_qspi.c
I tried building on top of master and running it on a zcu102 (Rev-B) board but I can't get anything newer than v2017.11 to work. I get this failure (unrelated to this series):
In: serial@ff000000 Out: serial@ff000000 Err: serial@ff000000 initcall sequence 000000007ff8dee8 failed at call 0000000008002c7c (err=-22) ### ERROR ### Please RESET the board ###
After looking arround a little, it seems it may be because of my FSBL.
Since I can't get another FSBL for now, I rebased the series on top of v2017.11 and it seems to be working well except for the erase operation in a certain range of flash addresses. The same operations (in that range) in Linux seem to be working.
I'm guessing this is due to something else, maybe in the spi_flash driver.
Here is the test I used:
ZynqMP> sf probe SF: Detected n25q512a with page size 256 Bytes, erase size 4 KiB, total 64 MiB ZynqMP> mw.w 0x100 0x00 0x100 ZynqMP> md.w 0x100 00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ZynqMP> sf read 0x100 0x00 0x100 device 0 offset 0x0, size 0x100 SF: 256 bytes @ 0x0 Read: OK ZynqMP> md.w 0x100 00000100: 1234 1234 abcd abcd abcd abcd abcd abcd 4.4............. 00000110: abcd abcd abcd abcd abcd abcd abcd abcd ................ 00000120: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000130: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000140: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000150: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000160: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000170: ffff ffff ffff ffff ffff ffff ffff ffff ................ ZynqMP> mw.w 0x100 0xbeee 0x10 ZynqMP> md.w 0x100 00000100: beee beee beee beee beee beee beee beee ................ 00000110: beee beee beee beee beee beee beee beee ................ 00000120: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000130: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000140: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000150: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000160: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000170: ffff ffff ffff ffff ffff ffff ffff ffff ................ ZynqMP> sf update 0x100 0x00 0x100 device 0 offset 0x0, size 0x100 256 bytes written, 0 bytes skipped in 0.70s, speed 3591 B/s ZynqMP> mw.w 0x100 0x00 0x100 ZynqMP> md.w 0x100 00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ZynqMP> sf read 0x100 0x00 0x100 device 0 offset 0x0, size 0x100 SF: 256 bytes @ 0x0 Read: OK ZynqMP> md.w 0x100 00000100: beee beee beee beee beee beee beee beee ................ 00000110: beee beee beee beee beee beee beee beee ................ 00000120: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000130: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000140: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000150: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000160: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000170: ffff ffff ffff ffff ffff ffff ffff ffff ................
Here is a case where it failed:
ZynqMP> mw.w 100 abcd 10 ; md.w 100 10 00000100: abcd abcd abcd abcd abcd abcd abcd abcd ................ 00000110: abcd abcd abcd abcd abcd abcd abcd abcd ................ ZynqMP> sf update 100 100 10 device 0 offset 0x100, size 0x10 SPI flash failed in erase step ZynqMP> mw.w 100 00 100 ; sf read 100 100 10 ; md.w 100 10 device 0 offset 0x100, size 0x10 SF: 16 bytes @ 0x100 Read: OK 00000100: ffff ffff ffff ffff ffff ffff ffff ffff ................ 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
I hope this helps! Thanks,
Liam Beguin Xiphos Systems Corp. http://xiphos.ca