diff mbox

[U-Boot,6/7] arm: socfpga: Add Arria10 FPGA manager program assembly driver

Message ID 1493979992-7584-7-git-send-email-tien.fong.chee@intel.com
State Changes Requested
Delegated to: Marek Vasut
Headers show

Commit Message

Chee, Tien Fong May 5, 2017, 10:26 a.m. UTC
From: Tien Fong Chee <tien.fong.chee@intel.com>

Adding the Arria10 FPGA manager program assembly driver which can be used
to feed bitstream into FPGA manager for configuring FPGA.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
---
 arch/arm/mach-socfpga/Makefile        |    1 +
 arch/arm/mach-socfpga/lowlevel_init.S |   48 +++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-socfpga/lowlevel_init.S

Comments

Marek Vasut May 5, 2017, 11:14 a.m. UTC | #1
On 05/05/2017 12:26 PM, tien.fong.chee@intel.com wrote:
> From: Tien Fong Chee <tien.fong.chee@intel.com>
> 
> Adding the Arria10 FPGA manager program assembly driver which can be used
> to feed bitstream into FPGA manager for configuring FPGA.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> ---
>  arch/arm/mach-socfpga/Makefile        |    1 +
>  arch/arm/mach-socfpga/lowlevel_init.S |   48 +++++++++++++++++++++++++++++++++
>  2 files changed, 49 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/mach-socfpga/lowlevel_init.S
> 
> diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
> index 824cd8e..8b86dc7 100644
> --- a/arch/arm/mach-socfpga/Makefile
> +++ b/arch/arm/mach-socfpga/Makefile
> @@ -24,6 +24,7 @@ endif
>  
>  ifdef CONFIG_TARGET_SOCFPGA_ARRIA10
>  obj-y	+= clock_manager_arria10.o
> +obj-y	+= lowlevel_init.o
>  obj-y	+= misc_arria10.o
>  obj-y	+= pinmux_arria10.o
>  obj-y	+= reset_manager_arria10.o
> diff --git a/arch/arm/mach-socfpga/lowlevel_init.S b/arch/arm/mach-socfpga/lowlevel_init.S
> new file mode 100644
> index 0000000..79e9d07
> --- /dev/null
> +++ b/arch/arm/mach-socfpga/lowlevel_init.S
> @@ -0,0 +1,48 @@
> +/*
> + * Copyright (C) 2017 Intel Corporation <www.intel.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0
> + */
> +
> +#include <asm-offsets.h>
> +#include <config.h>
> +#include <linux/linkage.h>
> +
> +/*
> + * Write RBF data in burst form to FPGA Manager
> + * [r0] RBF binary source address
> + * [r1] FPGA Manager data address
> + * [r2] RBF data length
> + */

We do the same for Gen5 in C code with a bit of assembly, so do the same.

> +ENTRY(fpgamgr_axi_write)
> +	PUSH    {r4-r11, lr}            /* save registers per AAPCS */
> +
> +write_burst:
> +	cmp     r2,#32
> +	beq     write_burst_cont
> +	bls     write_word
> +write_burst_cont:
> +	ldmia   r0!, {r4-r11}
> +	stmia   r1, {r4-r11}
> +	subs    r2, r2, #32
> +	b       write_burst
> +
> +write_word:
> +	cmp     r2,#4
> +	beq     write_word_cont
> +	bls     write_byte
> +write_word_cont:
> +	ldmia   r0!, {r4}
> +	stmia   r1, {r4}
> +	subs    r2, r2, #4
> +	b       write_word
> +
> +write_byte:
> +	cmp     r2,#0
> +	beq     write_end
> +	ldr     r3, [r0]
> +	str     r3, [r1]
> +write_end:
> +	POP     {r4-r11, pc}
> +ENDPROC(fpgamgr_axi_write)
>
Chee, Tien Fong May 8, 2017, 4:03 a.m. UTC | #2
On Jum, 2017-05-05 at 13:14 +0200, Marek Vasut wrote:
> On 05/05/2017 12:26 PM, tien.fong.chee@intel.com wrote:

> > 

> > From: Tien Fong Chee <tien.fong.chee@intel.com>

> > 

> > Adding the Arria10 FPGA manager program assembly driver which can

> > be used

> > to feed bitstream into FPGA manager for configuring FPGA.

> > 

> > Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>

> > ---

> >  arch/arm/mach-socfpga/Makefile        |    1 +

> >  arch/arm/mach-socfpga/lowlevel_init.S |   48

> > +++++++++++++++++++++++++++++++++

> >  2 files changed, 49 insertions(+), 0 deletions(-)

> >  create mode 100644 arch/arm/mach-socfpga/lowlevel_init.S

> > 

> > diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-

> > socfpga/Makefile

> > index 824cd8e..8b86dc7 100644

> > --- a/arch/arm/mach-socfpga/Makefile

> > +++ b/arch/arm/mach-socfpga/Makefile

> > @@ -24,6 +24,7 @@ endif

> >  

> >  ifdef CONFIG_TARGET_SOCFPGA_ARRIA10

> >  obj-y	+= clock_manager_arria10.o

> > +obj-y	+= lowlevel_init.o

> >  obj-y	+= misc_arria10.o

> >  obj-y	+= pinmux_arria10.o

> >  obj-y	+= reset_manager_arria10.o

> > diff --git a/arch/arm/mach-socfpga/lowlevel_init.S b/arch/arm/mach-

> > socfpga/lowlevel_init.S

> > new file mode 100644

> > index 0000000..79e9d07

> > --- /dev/null

> > +++ b/arch/arm/mach-socfpga/lowlevel_init.S

> > @@ -0,0 +1,48 @@

> > +/*

> > + * Copyright (C) 2017 Intel Corporation <www.intel.com>

> > + *

> > + * SPDX-License-Identifier:    GPL-2.0

> > + */

> > +

> > +#include <asm-offsets.h>

> > +#include <config.h>

> > +#include <linux/linkage.h>

> > +

> > +/*

> > + * Write RBF data in burst form to FPGA Manager

> > + * [r0] RBF binary source address

> > + * [r1] FPGA Manager data address

> > + * [r2] RBF data length

> > + */

> We do the same for Gen5 in C code with a bit of assembly, so do the

> same.

> 

Okay, i just saw it, thanks for pointing out.
> > 

> > +ENTRY(fpgamgr_axi_write)

> > +	PUSH    {r4-r11, lr}            /* save registers per

> > AAPCS */

> > +

> > +write_burst:

> > +	cmp     r2,#32

> > +	beq     write_burst_cont

> > +	bls     write_word

> > +write_burst_cont:

> > +	ldmia   r0!, {r4-r11}

> > +	stmia   r1, {r4-r11}

> > +	subs    r2, r2, #32

> > +	b       write_burst

> > +

> > +write_word:

> > +	cmp     r2,#4

> > +	beq     write_word_cont

> > +	bls     write_byte

> > +write_word_cont:

> > +	ldmia   r0!, {r4}

> > +	stmia   r1, {r4}

> > +	subs    r2, r2, #4

> > +	b       write_word

> > +

> > +write_byte:

> > +	cmp     r2,#0

> > +	beq     write_end

> > +	ldr     r3, [r0]

> > +	str     r3, [r1]

> > +write_end:

> > +	POP     {r4-r11, pc}

> > +ENDPROC(fpgamgr_axi_write)

> > 

>
diff mbox

Patch

diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile
index 824cd8e..8b86dc7 100644
--- a/arch/arm/mach-socfpga/Makefile
+++ b/arch/arm/mach-socfpga/Makefile
@@ -24,6 +24,7 @@  endif
 
 ifdef CONFIG_TARGET_SOCFPGA_ARRIA10
 obj-y	+= clock_manager_arria10.o
+obj-y	+= lowlevel_init.o
 obj-y	+= misc_arria10.o
 obj-y	+= pinmux_arria10.o
 obj-y	+= reset_manager_arria10.o
diff --git a/arch/arm/mach-socfpga/lowlevel_init.S b/arch/arm/mach-socfpga/lowlevel_init.S
new file mode 100644
index 0000000..79e9d07
--- /dev/null
+++ b/arch/arm/mach-socfpga/lowlevel_init.S
@@ -0,0 +1,48 @@ 
+/*
+ * Copyright (C) 2017 Intel Corporation <www.intel.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <asm-offsets.h>
+#include <config.h>
+#include <linux/linkage.h>
+
+/*
+ * Write RBF data in burst form to FPGA Manager
+ * [r0] RBF binary source address
+ * [r1] FPGA Manager data address
+ * [r2] RBF data length
+ */
+
+ENTRY(fpgamgr_axi_write)
+	PUSH    {r4-r11, lr}            /* save registers per AAPCS */
+
+write_burst:
+	cmp     r2,#32
+	beq     write_burst_cont
+	bls     write_word
+write_burst_cont:
+	ldmia   r0!, {r4-r11}
+	stmia   r1, {r4-r11}
+	subs    r2, r2, #32
+	b       write_burst
+
+write_word:
+	cmp     r2,#4
+	beq     write_word_cont
+	bls     write_byte
+write_word_cont:
+	ldmia   r0!, {r4}
+	stmia   r1, {r4}
+	subs    r2, r2, #4
+	b       write_word
+
+write_byte:
+	cmp     r2,#0
+	beq     write_end
+	ldr     r3, [r0]
+	str     r3, [r1]
+write_end:
+	POP     {r4-r11, pc}
+ENDPROC(fpgamgr_axi_write)