3 * Heiko Schocher, hs@denx.de
6 * SPDX-License-Identifier: GPL-2.0+
9 #include <common.h> /* core U-Boot definitions */
11 #include <ACEX1K.h> /* ACEX device family */
13 /* Define FPGA_DEBUG to get debug printf's */
15 #define PRINTF(fmt,args...) printf (fmt ,##args)
17 #define PRINTF(fmt,args...)
20 /* Note: The assumption is that we cannot possibly run fast enough to
21 * overrun the device (the Slave Parallel mode can free run at 50MHz).
22 * If there is a need to operate slower, define CONFIG_FPGA_DELAY in
23 * the board config file to slow things down.
25 #ifndef CONFIG_FPGA_DELAY
26 #define CONFIG_FPGA_DELAY()
29 #ifndef CONFIG_SYS_FPGA_WAIT
30 #define CONFIG_SYS_FPGA_WAIT CONFIG_SYS_HZ/10 /* 100 ms */
33 static int CYC2_ps_load(Altera_desc
*desc
, const void *buf
, size_t bsize
);
34 static int CYC2_ps_dump(Altera_desc
*desc
, const void *buf
, size_t bsize
);
35 /* static int CYC2_ps_info( Altera_desc *desc ); */
37 /* ------------------------------------------------------------------------- */
38 /* CYCLON2 Generic Implementation */
39 int CYC2_load(Altera_desc
*desc
, const void *buf
, size_t bsize
)
41 int ret_val
= FPGA_FAIL
;
43 switch (desc
->iface
) {
45 PRINTF ("%s: Launching Passive Serial Loader\n", __FUNCTION__
);
46 ret_val
= CYC2_ps_load (desc
, buf
, bsize
);
49 case fast_passive_parallel
:
50 /* Fast Passive Parallel (FPP) and PS only differ in what is
51 * done in the write() callback. Use the existing PS load
52 * function for FPP, too.
54 PRINTF ("%s: Launching Fast Passive Parallel Loader\n",
56 ret_val
= CYC2_ps_load(desc
, buf
, bsize
);
59 /* Add new interface types here */
62 printf ("%s: Unsupported interface type, %d\n",
63 __FUNCTION__
, desc
->iface
);
69 int CYC2_dump(Altera_desc
*desc
, const void *buf
, size_t bsize
)
71 int ret_val
= FPGA_FAIL
;
73 switch (desc
->iface
) {
75 PRINTF ("%s: Launching Passive Serial Dump\n", __FUNCTION__
);
76 ret_val
= CYC2_ps_dump (desc
, buf
, bsize
);
79 /* Add new interface types here */
82 printf ("%s: Unsupported interface type, %d\n",
83 __FUNCTION__
, desc
->iface
);
89 int CYC2_info( Altera_desc
*desc
)
94 /* ------------------------------------------------------------------------- */
95 /* CYCLON2 Passive Serial Generic Implementation */
96 static int CYC2_ps_load(Altera_desc
*desc
, const void *buf
, size_t bsize
)
98 int ret_val
= FPGA_FAIL
; /* assume the worst */
99 Altera_CYC2_Passive_Serial_fns
*fn
= desc
->iface_fns
;
102 PRINTF ("%s: start with interface functions @ 0x%p\n",
106 int cookie
= desc
->cookie
; /* make a local copy */
107 unsigned long ts
; /* timestamp */
109 PRINTF ("%s: Function Table:\n"
116 __FUNCTION__
, &fn
, fn
, fn
->config
, fn
->status
,
117 fn
->write
, fn
->done
);
118 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
119 printf ("Loading FPGA Device %d...", cookie
);
123 * Run the pre configuration function if there is one.
129 /* Establish the initial state */
130 (*fn
->config
) (false, true, cookie
); /* De-assert nCONFIG */
132 (*fn
->config
) (true, true, cookie
); /* Assert nCONFIG */
134 udelay(2); /* T_cfg > 2us */
136 /* Wait for nSTATUS to be asserted */
137 ts
= get_timer (0); /* get current time */
139 CONFIG_FPGA_DELAY ();
140 if (get_timer (ts
) > CONFIG_SYS_FPGA_WAIT
) { /* check the time */
141 puts ("** Timeout waiting for STATUS to go high.\n");
142 (*fn
->abort
) (cookie
);
145 } while (!(*fn
->status
) (cookie
));
147 /* Get ready for the burn */
148 CONFIG_FPGA_DELAY ();
150 ret
= (*fn
->write
) (buf
, bsize
, true, cookie
);
152 puts ("** Write failed.\n");
153 (*fn
->abort
) (cookie
);
156 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
160 CONFIG_FPGA_DELAY ();
162 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
163 putc (' '); /* terminate the dotted line */
167 * Checking FPGA's CONF_DONE signal - correctly booted ?
170 if ( ! (*fn
->done
) (cookie
) ) {
171 puts ("** Booting failed! CONF_DONE is still deasserted.\n");
172 (*fn
->abort
) (cookie
);
175 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
179 ret_val
= FPGA_SUCCESS
;
181 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
182 if (ret_val
== FPGA_SUCCESS
) {
189 (*fn
->post
) (cookie
);
192 printf ("%s: NULL Interface function table!\n", __FUNCTION__
);
198 static int CYC2_ps_dump(Altera_desc
*desc
, const void *buf
, size_t bsize
)
200 /* Readback is only available through the Slave Parallel and */
201 /* boundary-scan interfaces. */
202 printf ("%s: Passive Serial Dumping is unavailable\n",