]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/fpga/virtex2.c
arm: mx5: clock: add support for changing CPU clock via cmdline
[karo-tx-uboot.git] / drivers / fpga / virtex2.c
1 /*
2  * (C) Copyright 2002
3  * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
4  * Keith Outwater, keith_outwater@mvis.com
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  */
8
9 /*
10  * Configuration support for Xilinx Virtex2 devices.  Based
11  * on spartan2.c (Rich Ireland, rireland@enterasys.com).
12  */
13
14 #include <common.h>
15 #include <virtex2.h>
16
17 #if 0
18 #define FPGA_DEBUG
19 #endif
20
21 #ifdef  FPGA_DEBUG
22 #define PRINTF(fmt,args...)     printf (fmt ,##args)
23 #else
24 #define PRINTF(fmt,args...)
25 #endif
26
27 /*
28  * If the SelectMap interface can be overrun by the processor, define
29  * CONFIG_SYS_FPGA_CHECK_BUSY and/or CONFIG_FPGA_DELAY in the board configuration
30  * file and add board-specific support for checking BUSY status. By default,
31  * assume that the SelectMap interface cannot be overrun.
32  */
33 #ifndef CONFIG_SYS_FPGA_CHECK_BUSY
34 #undef CONFIG_SYS_FPGA_CHECK_BUSY
35 #endif
36
37 #ifndef CONFIG_FPGA_DELAY
38 #define CONFIG_FPGA_DELAY()
39 #endif
40
41 #ifndef CONFIG_SYS_FPGA_PROG_FEEDBACK
42 #define CONFIG_SYS_FPGA_PROG_FEEDBACK
43 #endif
44
45 /*
46  * Don't allow config cycle to be interrupted
47  */
48 #ifndef CONFIG_SYS_FPGA_CHECK_CTRLC
49 #undef CONFIG_SYS_FPGA_CHECK_CTRLC
50 #endif
51
52 /*
53  * Check for errors during configuration by default
54  */
55 #ifndef CONFIG_SYS_FPGA_CHECK_ERROR
56 #define CONFIG_SYS_FPGA_CHECK_ERROR
57 #endif
58
59 /*
60  * The default timeout in mS for INIT_B to deassert after PROG_B has
61  * been deasserted. Per the latest Virtex II Handbook (page 347), the
62  * max time from PORG_B deassertion to INIT_B deassertion is 4uS per
63  * data frame for the XC2V8000.  The XC2V8000 has 2860 data frames
64  * which yields 11.44 mS.  So let's make it bigger in order to handle
65  * an XC2V1000, if anyone can ever get ahold of one.
66  */
67 #ifndef CONFIG_SYS_FPGA_WAIT_INIT
68 #define CONFIG_SYS_FPGA_WAIT_INIT       CONFIG_SYS_HZ/2 /* 500 ms */
69 #endif
70
71 /*
72  * The default timeout for waiting for BUSY to deassert during configuration.
73  * This is normally not necessary since for most reasonable configuration
74  * clock frequencies (i.e. 66 MHz or less), BUSY monitoring is unnecessary.
75  */
76 #ifndef CONFIG_SYS_FPGA_WAIT_BUSY
77 #define CONFIG_SYS_FPGA_WAIT_BUSY       CONFIG_SYS_HZ/200       /* 5 ms*/
78 #endif
79
80 /* Default timeout for waiting for FPGA to enter operational mode after
81  * configuration data has been written.
82  */
83 #ifndef CONFIG_SYS_FPGA_WAIT_CONFIG
84 #define CONFIG_SYS_FPGA_WAIT_CONFIG     CONFIG_SYS_HZ/5 /* 200 ms */
85 #endif
86
87 static int Virtex2_ssm_load(Xilinx_desc *desc, const void *buf, size_t bsize);
88 static int Virtex2_ssm_dump(Xilinx_desc *desc, const void *buf, size_t bsize);
89
90 static int Virtex2_ss_load(Xilinx_desc *desc, const void *buf, size_t bsize);
91 static int Virtex2_ss_dump(Xilinx_desc *desc, const void *buf, size_t bsize);
92
93 int Virtex2_load(Xilinx_desc *desc, const void *buf, size_t bsize)
94 {
95         int ret_val = FPGA_FAIL;
96
97         switch (desc->iface) {
98         case slave_serial:
99                 PRINTF ("%s: Launching Slave Serial Load\n", __FUNCTION__);
100                 ret_val = Virtex2_ss_load (desc, buf, bsize);
101                 break;
102
103         case slave_selectmap:
104                 PRINTF ("%s: Launching Slave Parallel Load\n", __FUNCTION__);
105                 ret_val = Virtex2_ssm_load (desc, buf, bsize);
106                 break;
107
108         default:
109                 printf ("%s: Unsupported interface type, %d\n",
110                                 __FUNCTION__, desc->iface);
111         }
112         return ret_val;
113 }
114
115 int Virtex2_dump(Xilinx_desc *desc, const void *buf, size_t bsize)
116 {
117         int ret_val = FPGA_FAIL;
118
119         switch (desc->iface) {
120         case slave_serial:
121                 PRINTF ("%s: Launching Slave Serial Dump\n", __FUNCTION__);
122                 ret_val = Virtex2_ss_dump (desc, buf, bsize);
123                 break;
124
125         case slave_parallel:
126                 PRINTF ("%s: Launching Slave Parallel Dump\n", __FUNCTION__);
127                 ret_val = Virtex2_ssm_dump (desc, buf, bsize);
128                 break;
129
130         default:
131                 printf ("%s: Unsupported interface type, %d\n",
132                                 __FUNCTION__, desc->iface);
133         }
134         return ret_val;
135 }
136
137 int Virtex2_info (Xilinx_desc * desc)
138 {
139         return FPGA_SUCCESS;
140 }
141
142 /*
143  * Virtex-II Slave SelectMap configuration loader. Configuration via
144  * SelectMap is as follows:
145  * 1. Set the FPGA's PROG_B line low.
146  * 2. Set the FPGA's PROG_B line high.  Wait for INIT_B to go high.
147  * 3. Write data to the SelectMap port.  If INIT_B goes low at any time
148  *    this process, a configuration error (most likely CRC failure) has
149  *    ocurred.  At this point a status word may be read from the
150  *    SelectMap interface to determine the source of the problem (You
151  *    could, for instance, put this in your 'abort' function handler).
152  * 4. After all data has been written, test the state of the FPGA
153  *    INIT_B and DONE lines.  If both are high, configuration has
154  *    succeeded. Congratulations!
155  */
156 static int Virtex2_ssm_load(Xilinx_desc *desc, const void *buf, size_t bsize)
157 {
158         int ret_val = FPGA_FAIL;
159         Xilinx_Virtex2_Slave_SelectMap_fns *fn = desc->iface_fns;
160
161         PRINTF ("%s:%d: Start with interface functions @ 0x%p\n",
162                         __FUNCTION__, __LINE__, fn);
163
164         if (fn) {
165                 size_t bytecount = 0;
166                 unsigned char *data = (unsigned char *) buf;
167                 int cookie = desc->cookie;
168                 unsigned long ts;
169
170                 /* Gotta split this one up (so the stack won't blow??) */
171                 PRINTF ("%s:%d: Function Table:\n"
172                                 "  base   0x%p\n"
173                                 "  struct 0x%p\n"
174                                 "  pre    0x%p\n"
175                                 "  prog   0x%p\n"
176                                 "  init   0x%p\n"
177                                 "  error  0x%p\n",
178                                 __FUNCTION__, __LINE__,
179                                 &fn, fn, fn->pre, fn->pgm, fn->init, fn->err);
180                 PRINTF ("  clock  0x%p\n"
181                                 "  cs     0x%p\n"
182                                 "  write  0x%p\n"
183                                 "  rdata  0x%p\n"
184                                 "  wdata  0x%p\n"
185                                 "  busy   0x%p\n"
186                                 "  abort  0x%p\n"
187                                 "  post   0x%p\n\n",
188                                 fn->clk, fn->cs, fn->wr, fn->rdata, fn->wdata,
189                                 fn->busy, fn->abort, fn->post);
190
191 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
192                 printf ("Initializing FPGA Device %d...\n", cookie);
193 #endif
194                 /*
195                  * Run the pre configuration function if there is one.
196                  */
197                 if (*fn->pre) {
198                         (*fn->pre) (cookie);
199                 }
200
201                 /*
202                  * Assert the program line.  The minimum pulse width for
203                  * Virtex II devices is 300 nS (Tprogram parameter in datasheet).
204                  * There is no maximum value for the pulse width.  Check to make
205                  * sure that INIT_B goes low after assertion of PROG_B
206                  */
207                 (*fn->pgm) (true, true, cookie);
208                 udelay (10);
209                 ts = get_timer (0);
210                 do {
211                         if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT_INIT) {
212                                 printf ("%s:%d: ** Timeout after %d ticks waiting for INIT"
213                                                 " to assert.\n", __FUNCTION__, __LINE__,
214                                                 CONFIG_SYS_FPGA_WAIT_INIT);
215                                 (*fn->abort) (cookie);
216                                 return FPGA_FAIL;
217                         }
218                 } while (!(*fn->init) (cookie));
219
220                 (*fn->pgm) (false, true, cookie);
221                 CONFIG_FPGA_DELAY ();
222                 (*fn->clk) (true, true, cookie);
223
224                 /*
225                  * Start a timer and wait for INIT_B to go high
226                  */
227                 ts = get_timer (0);
228                 do {
229                         CONFIG_FPGA_DELAY ();
230                         if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT_INIT) {
231                                 printf ("%s:%d: ** Timeout after %d ticks waiting for INIT"
232                                                 " to deassert.\n", __FUNCTION__, __LINE__,
233                                                 CONFIG_SYS_FPGA_WAIT_INIT);
234                                 (*fn->abort) (cookie);
235                                 return FPGA_FAIL;
236                         }
237                 } while ((*fn->init) (cookie) && (*fn->busy) (cookie));
238
239                 (*fn->wr) (true, true, cookie);
240                 (*fn->cs) (true, true, cookie);
241
242                 udelay (10000);
243
244                 /*
245                  * Load the data byte by byte
246                  */
247                 while (bytecount < bsize) {
248 #ifdef CONFIG_SYS_FPGA_CHECK_CTRLC
249                         if (ctrlc ()) {
250                                 (*fn->abort) (cookie);
251                                 return FPGA_FAIL;
252                         }
253 #endif
254
255                         if ((*fn->done) (cookie) == FPGA_SUCCESS) {
256                             PRINTF ("%s:%d:done went active early, bytecount = %d\n",
257                                     __FUNCTION__, __LINE__, bytecount);
258                             break;
259                         }
260
261 #ifdef CONFIG_SYS_FPGA_CHECK_ERROR
262                         if ((*fn->init) (cookie)) {
263                                 printf ("\n%s:%d:  ** Error: INIT asserted during"
264                                                 " configuration\n", __FUNCTION__, __LINE__);
265                                 printf ("%d = buffer offset, %d = buffer size\n",
266                                         bytecount, bsize);
267                                 (*fn->abort) (cookie);
268                                 return FPGA_FAIL;
269                         }
270 #endif
271
272                         (*fn->wdata) (data[bytecount++], true, cookie);
273                         CONFIG_FPGA_DELAY ();
274
275                         /*
276                          * Cycle the clock pin
277                          */
278                         (*fn->clk) (false, true, cookie);
279                         CONFIG_FPGA_DELAY ();
280                         (*fn->clk) (true, true, cookie);
281
282 #ifdef CONFIG_SYS_FPGA_CHECK_BUSY
283                         ts = get_timer (0);
284                         while ((*fn->busy) (cookie)) {
285                                 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT_BUSY) {
286                                         printf ("%s:%d: ** Timeout after %d ticks waiting for"
287                                                         " BUSY to deassert\n",
288                                                         __FUNCTION__, __LINE__, CONFIG_SYS_FPGA_WAIT_BUSY);
289                                         (*fn->abort) (cookie);
290                                         return FPGA_FAIL;
291                                 }
292                         }
293 #endif
294
295 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
296                         if (bytecount % (bsize / 40) == 0)
297                                 putc ('.');
298 #endif
299                 }
300
301                 /*
302                  * Finished writing the data; deassert FPGA CS_B and WRITE_B signals.
303                  */
304                 CONFIG_FPGA_DELAY ();
305                 (*fn->cs) (false, true, cookie);
306                 (*fn->wr) (false, true, cookie);
307
308 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
309                 putc ('\n');
310 #endif
311
312                 /*
313                  * Check for successful configuration.  FPGA INIT_B and DONE should
314                  * both be high upon successful configuration.
315                  */
316                 ts = get_timer (0);
317                 ret_val = FPGA_SUCCESS;
318                 while (((*fn->done) (cookie) == FPGA_FAIL) || (*fn->init) (cookie)) {
319                         if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT_CONFIG) {
320                                 printf ("%s:%d: ** Timeout after %d ticks waiting for DONE to"
321                                                 "assert and INIT to deassert\n",
322                                                 __FUNCTION__, __LINE__, CONFIG_SYS_FPGA_WAIT_CONFIG);
323                                 (*fn->abort) (cookie);
324                                 ret_val = FPGA_FAIL;
325                                 break;
326                         }
327                 }
328
329                 if (ret_val == FPGA_SUCCESS) {
330 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
331                         printf ("Initialization of FPGA device %d complete\n", cookie);
332 #endif
333                         /*
334                          * Run the post configuration function if there is one.
335                          */
336                         if (*fn->post) {
337                                 (*fn->post) (cookie);
338                         }
339                 } else {
340 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
341                         printf ("** Initialization of FPGA device %d FAILED\n",
342                                         cookie);
343 #endif
344                 }
345         } else {
346                 printf ("%s:%d: NULL Interface function table!\n",
347                                 __FUNCTION__, __LINE__);
348         }
349         return ret_val;
350 }
351
352 /*
353  * Read the FPGA configuration data
354  */
355 static int Virtex2_ssm_dump(Xilinx_desc *desc, const void *buf, size_t bsize)
356 {
357         int ret_val = FPGA_FAIL;
358         Xilinx_Virtex2_Slave_SelectMap_fns *fn = desc->iface_fns;
359
360         if (fn) {
361                 unsigned char *data = (unsigned char *) buf;
362                 size_t bytecount = 0;
363                 int cookie = desc->cookie;
364
365                 printf ("Starting Dump of FPGA Device %d...\n", cookie);
366
367                 (*fn->cs) (true, true, cookie);
368                 (*fn->clk) (true, true, cookie);
369
370                 while (bytecount < bsize) {
371 #ifdef CONFIG_SYS_FPGA_CHECK_CTRLC
372                         if (ctrlc ()) {
373                                 (*fn->abort) (cookie);
374                                 return FPGA_FAIL;
375                         }
376 #endif
377                         /*
378                          * Cycle the clock and read the data
379                          */
380                         (*fn->clk) (false, true, cookie);
381                         (*fn->clk) (true, true, cookie);
382                         (*fn->rdata) (&(data[bytecount++]), cookie);
383 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
384                         if (bytecount % (bsize / 40) == 0)
385                                 putc ('.');
386 #endif
387                 }
388
389                 /*
390                  * Deassert CS_B and cycle the clock to deselect the device.
391                  */
392                 (*fn->cs) (false, false, cookie);
393                 (*fn->clk) (false, true, cookie);
394                 (*fn->clk) (true, true, cookie);
395
396 #ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
397                 putc ('\n');
398 #endif
399                 puts ("Done.\n");
400         } else {
401                 printf ("%s:%d: NULL Interface function table!\n",
402                                 __FUNCTION__, __LINE__);
403         }
404         return ret_val;
405 }
406
407 static int Virtex2_ss_load(Xilinx_desc *desc, const void *buf, size_t bsize)
408 {
409         printf ("%s: Slave Serial Loading is unsupported\n", __FUNCTION__);
410         return FPGA_FAIL;
411 }
412
413 static int Virtex2_ss_dump(Xilinx_desc *desc, const void *buf, size_t bsize)
414 {
415         printf ("%s: Slave Serial Dumping is unsupported\n", __FUNCTION__);
416         return FPGA_FAIL;
417 }
418
419 /* vim: set ts=4 tw=78: */