Altera Cyclone Passive Serial SPI FPGA Manager
Subsystems (4)
v4 cover Altera Cyclone Passive Serial SPI FPGA Manager
This series adds an FPGA manager for Altera cyclone FPGAs that can program them using an spi port and a couple of gpios, using Alteras passive serial protocol.
Changes from v3:
- Fixed up the state() function to return the state of the status pin reqested by Alan Tull
- Switched the pin to ACTIVE_LOW and coresponding logic level, and updated the corresponding documentation. Thanks Rob Herring for pointing out my mistake.
- Per Rob Herring, switched from "gpio" to "gpios" in dts
Changes from v2:
- Merged patch 3 and 4 as suggested in review by Moritz Fischer
- Changed FPGA_MIN_DELAY from 250 to 50 ms is the time advertized by Altera. This now works, as we don't assume it is done
Changes from v1:
- Changed the name from cyclone-spi-fpga-mgr to cyclone-ps-spi-fpga-mgr This name change was requested by Alan Tull, to be specific about which programming method is being employed on the fpga.
- Changed the name of the reset-gpio to config-gpio to closer match the way the pins are described in the Altera manual
- Moved MODULE_LICENCE, _AUTHOR, and _DESCRIPTION to the bottom
- Added a bitrev8x4() function to the bitrev headers and implemented ARM const, runtime, and ARM specific faster versions (This may end up needing to be a standalone patch)
- Moved the bitswapping into cyclonespi_write(), as requested. This falls short of my desired generic lsb first spi support, but is a step in that direction.
- Fixed whitespace problems introduced during refactoring
- Replaced magic number for initial delay with a descriptive macro
- Poll the fpga to see when it is ready rather than a fixed 1 ms sleep
Joshua Clayton (3):
lib: add bitrev8x4()
doc: dt: add cyclone-spi binding document
fpga manager: Add cyclone-ps-spi driver for Altera FPGAs
.../bindings/fpga/cyclone-ps-spi-fpga-mgr.txt | 25 +++ arch/arm/include/asm/bitrev.h | 5 + drivers/fpga/Kconfig | 7 + drivers/fpga/Makefile | 1 + drivers/fpga/cyclone-ps-spi.c | 181 +++++++++++++++++++++ include/linux/bitrev.h | 26 +++ 6 files changed, 245 insertions(+) create mode 100644 Documentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txt create mode 100644 drivers/fpga/cyclone-ps-spi.c
Signature · 1 line
2.9.3
PATCH v4 1/3 lib: add bitrev8x4()
Add a function to reverse bytes within a 32 bit word. This function is more efficient than using the 8 bit version when iterating over an array
---
Looking for an ACK from Russell King on this patch (or at least the arm specific implementation)
arch/arm/include/asm/bitrev.h | 5 +++++ include/linux/bitrev.h | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
arch/arm/include/asm/bitrev.h +5 -0
@@ -17,4 +17,9 @@ static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x)return __arch_bitrev32 ((u32 )x) >>24 ; } +static __always_inline __attribute_const__ u32 __arch_bitrev8x4(u32 x) +{ + __asm__ ("rbit %0, %1; rev %0, %0" :"=r" (x) :"r" (x)); +} +#endif
include/linux/bitrev.h +26 -0
@@ -9,6 +9,7 @@#define __bitrev32 __arch_bitrev32#define __bitrev16 __arch_bitrev16#define __bitrev8 __arch_bitrev8 +#define __bitrev8x4 __arch_bitrev8x4#else extern u8 const byte_rev_table[256 ];
@@ -27,6 +28,14 @@ static inline u32 __bitrev32(u32 x) return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16); } +static inline u32 __bitrev8x4 (u32 x) +{ +return (__bitrev8 (x &0xff ) | + (__bitrev8 ((x >>8 ) &0xff ) <<8 ) | + (__bitrev8 ((x >>16 ) &0xff ) <<16 ) | + (__bitrev8 ((x >>24 ) &0xff ) <<24 )); +} +#endif /* CONFIG_HAVE_ARCH_BITREVERSE */ #define __constant_bitrev32 (x) \
@@ -50,6 +59,15 @@ static inline u32 __bitrev32(u32 x) __x; \ }) +#define __constant_bitrev8x4 (x) \ +({ \ + u32 __x = x; \ + __x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \ + __x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \ + __x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \ + __x; \ +}) +#define __constant_bitrev8 (x) \ ({ \ u8 __x = x; \
@@ -75,6 +93,14 @@ static inline u32 __bitrev32(u32 x)__bitrev16 (__x); \ }) +#define bitrev8x4 (x) \ +({ \ + u32 __x = x; \ + __builtin_constant_p(__x) ? \ + __constant_bitrev8x4(__x) : \ + __bitrev8x4(__x); \ +}) +#define bitrev8 (x) \ ({ \ u8 __x = x; \
Signature · 1 line
2.9.3
Re: [PATCH v4 1/3] lib: add bitrev8x4()
On Thu, 1 Dec 2016 09:04:50 -0800
Joshua Clayton stillcompiling at gmail.com wrote:
...
arch/arm/include/asm/bitrev.h static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x) · line 22
Quoted 11 lines
arch/arm/include/asm/bitrev.h +3
-0@@ -17,4 +17,9 @@ static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x)return __arch_bitrev32 ((u32 )x) >>24 ; } +static __always_inline __attribute_const__ u32 __arch_bitrev8x4(u32 x) +{ + __asm__ ("rbit %0, %1; rev %0, %0" :"=r" (x) :"r" (x));
return x;
arch/arm/include/asm/bitrev.h static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x) · line 23
Quoted 1 line
arch/arm/include/asm/bitrev.h +1
-0+}
otherwise you get
In function '__arch_bitrev8x4':
warning: no return statement in function returning non-void [-Wreturn-type]
--
Anatolij
Re: [PATCH v4 1/3] lib: add bitrev8x4()
Hello Anatolij,
Thanks for the review.
Quoted 11 lines · Anatolij Gustschin
On Thu, 1 Dec 2016 09:04:50 -0800
Joshua Clayton stillcompiling at gmail.com wrote:
...Quoted 8 lines
arch/arm/include/asm/bitrev.h +0
-0@@ -17,4 +17,9 @@ static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x)return __arch_bitrev32 ((u32 )x) >>24 ; }
Quoted 4 lines
arch/arm/include/asm/bitrev.h static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x) · line 22
Quoted 3 lines
arch/arm/include/asm/bitrev.h +3
-0+static __always_inline __attribute_const__ u32 __arch_bitrev8x4(u32 x) +{ + __asm__ ("rbit %0, %1; rev %0, %0" :"=r" (x) :"r" (x));return x;
Oops thats a little embarrassing;
I'll add a return.
Quoted 8 lines
arch/arm/include/asm/bitrev.h static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x) · line 23
Quoted 1 line
arch/arm/include/asm/bitrev.h +1
-0+}otherwise you get
In function '
__arch_bitrev8x4':
warning: no return statement in function returning non-void [-Wreturn-type]--
Anatolij
I wonder why I do not see this warning when compiling. The inlining, maybe?
Joshua
Re: [PATCH v4 1/3] lib: add bitrev8x4()
Hi Joshua,
On Thu, 1 Dec 2016 16:04:09 -0800
Joshua Clayton stillcompiling at gmail.com wrote:
...
Quoted 6 lines
Quoted 4 lines
arch/arm/include/asm/bitrev.h static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x) · line 22
Quoted 3 lines
arch/arm/include/asm/bitrev.h +3
-0+static __always_inline __attribute_const__ u32 __arch_bitrev8x4(u32 x) +{ + __asm__ ("rbit %0, %1; rev %0, %0" :"=r" (x) :"r" (x));return x;Oops thats a little embarrassing;
I'll add a return.
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
+}
otherwise you get
In function '
__arch_bitrev8x4':
warning: no return statement in function returning non-void [-Wreturn-type]I wonder why I do not see this warning when compiling. The inlining, maybe?
do you have CONFIG_HAVE_ARCH_BITREVERSE=y in your .config? Probably not optimized code is used, otherwise you will send wrong data to FPGA (due to wrong return values from __arch_bitrev8x4).
Anatolij
PATCH v4 2/3 doc: dt: add cyclone-spi binding document
In reply to Joshua ClaytonDescribe a cyclonei-ps-spi devicetree entry, required features
---
.../bindings/fpga/cyclone-ps-spi-fpga-mgr.txt | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txt
Documentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txt new file +25 -0
@@ -0,0 +1,25 @@ +Altera Cyclone Passive Serial SPI FPGA Manager + +Altera Cyclone FPGAs support a method of loading the bitstream over what is +referred to as "passive serial". +The passive serial link is not technically spi, and might require extra +circuits in order to play nicely with other spi slaves on the same bus. + +See https://www.altera.com/literature/hb/cyc/cyc_c51013.pdf + +Required properties: +- compatible : should contain "altr,cyclone-ps-spi-fpga-mgr" +- reg : spi slave id of the fpga +- config-gpios : config pin (referred to as nCONFIG in the cyclone manual) +- status-gpios : status pin (referred to as nSTATUS in the cyclone manual) + +both gpio pins are normally active low open drain. + +Example: + fpga_spi: evi-fpga-spi at 0 { + compatible = "altr,cyclone-ps-spi-fpga-mgr"; + spi-max-frequency = <20000000>; + reg = <0>; + config-gpios = <&gpio4 9 GPIO_ACTIVE_LOW>; + status-gpios = <&gpio4 11 GPIO_ACTIVE_LOW>; + };
Signature · 1 line
2.9.3
Re: [PATCH v4 2/3] doc: dt: add cyclone-spi binding document
Quoted 3 lines · Joshua Clayton
Describe a cyclonei-ps-spi devicetree entry, required features
Signed-off-by Joshua Clayton <[email protected]>
Quoted 40 lines
---
.../bindings/fpga/cyclone-ps-spi-fpga-mgr.txt | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txtDocumentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txt new file +25
-1@@ -0,0 +1,25 @@ +Altera Cyclone Passive Serial SPI FPGA Manager + +Altera Cyclone FPGAs support a method of loading the bitstream over what is +referred to as "passive serial". +The passive serial link is not technically spi, and might require extra +circuits in order to play nicely with other spi slaves on the same bus. + +See https://www.altera.com/literature/hb/cyc/cyc_c51013.pdf + +Required properties: +- compatible : should contain "altr,cyclone-ps-spi-fpga-mgr" +- reg : spi slave id of the fpga +- config-gpios : config pin (referred to as nCONFIG in the cyclone manual) +- status-gpios : status pin (referred to as nSTATUS in the cyclone manual) + +both gpio pins are normally active low open drain. + +Example: + fpga_spi: evi-fpga-spi at 0 { + compatible = "altr,cyclone-ps-spi-fpga-mgr"; + spi-max-frequency = <20000000>; + reg = <0>; + config-gpios = <&gpio4 9 GPIO_ACTIVE_LOW>; + status-gpios = <&gpio4 11 GPIO_ACTIVE_LOW>; + }; --2.9.3
Re: [PATCH v4 2/3] doc: dt: add cyclone-spi binding document
In reply to Joshua ClaytonQuoted 1 line · Joshua Clayton
Describe a cyclonei-ps-spi devicetree entry, required features
cyclonei?
Quoted 7 lines
Signed-off-by Joshua Clayton <[email protected]>---
.../bindings/fpga/cyclone-ps-spi-fpga-mgr.txt | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/devicetree/bindings/fpga/cyclone-ps-spi-fpga-mgr.txt
PATCH v4 3/3 fpga manager: Add cyclone-ps-spi driver for Altera FPGAs
In reply to Joshua Claytoncyclone-ps-spi loads FPGA firmware over spi, using the "passive serial" interface on Altera Cyclone FPGAS.
This is one of the simpler ways to set up an FPGA at runtime. The signal interface is close to unidirectional spi with lsb first.
--- drivers/fpga/Kconfig | 7 ++ drivers/fpga/Makefile | 1 + drivers/fpga/cyclone-ps-spi.c | 181 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 drivers/fpga/cyclone-ps-spi.c
drivers/fpga/Kconfig +7 -0
@@ -13,6 +13,13 @@ config FPGA if FPGA +config FPGA_MGR_CYCLONE_PS_SPI + tristate "Altera Cyclone FPGA Passive Serial over SPI" + depends on SPI + help + FPGA manager driver support for Altera Cyclone using the + passive serial interface over SPI + config FPGA_MGR_SOCFPGA tristate "Altera SOCFPGA FPGA Manager" depends on ARCH_SOCFPGA
drivers/fpga/Makefile +1 -0
@@ -6,5 +6,6 @@ obj-$(CONFIG_FPGA) += fpga-mgr.o # FPGA Manager Drivers +obj-$(CONFIG_FPGA_MGR_CYCLONE_PS_SPI) += cyclone-ps-spi.o obj-$(CONFIG_FPGA_MGR_SOCFPGA) += socfpga.o obj-$(CONFIG_FPGA_MGR_ZYNQ_FPGA) += zynq-fpga.o
drivers/fpga/cyclone-ps-spi.c new file +181 -0
181 lines not on this page · raw message
Signature · 1 line
2.9.3