at91: Introduction of at91sam9g45 SOC.
[platform/kernel/u-boot.git] / drivers / fpga / altera.c
1 /*
2  * (C) Copyright 2003
3  * Steven Scholz, imc Measurement & Control, steven.scholz@imc-berlin.de
4  *
5  * (C) Copyright 2002
6  * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
7  *
8  * See file CREDITS for list of people who contributed to this
9  * project.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24  * MA 02111-1307 USA
25  *
26  */
27
28 /*
29  *  Altera FPGA support
30  */
31 #include <common.h>
32 #include <ACEX1K.h>
33 #include <stratixII.h>
34
35 /* Define FPGA_DEBUG to get debug printf's */
36 /* #define FPGA_DEBUG */
37
38 #ifdef  FPGA_DEBUG
39 #define PRINTF(fmt,args...)     printf (fmt ,##args)
40 #else
41 #define PRINTF(fmt,args...)
42 #endif
43
44 /* Local Static Functions */
45 static int altera_validate (Altera_desc * desc, const char *fn);
46
47 /* ------------------------------------------------------------------------- */
48 int altera_load( Altera_desc *desc, void *buf, size_t bsize )
49 {
50         int ret_val = FPGA_FAIL;        /* assume a failure */
51
52         if (!altera_validate (desc, (char *)__FUNCTION__)) {
53                 printf ("%s: Invalid device descriptor\n", __FUNCTION__);
54         } else {
55                 switch (desc->family) {
56                 case Altera_ACEX1K:
57                 case Altera_CYC2:
58 #if defined(CONFIG_FPGA_ACEX1K)
59                         PRINTF ("%s: Launching the ACEX1K Loader...\n",
60                                         __FUNCTION__);
61                         ret_val = ACEX1K_load (desc, buf, bsize);
62 #elif defined(CONFIG_FPGA_CYCLON2)
63                         PRINTF ("%s: Launching the CYCLON II Loader...\n",
64                                         __FUNCTION__);
65                         ret_val = CYC2_load (desc, buf, bsize);
66 #else
67                         printf ("%s: No support for ACEX1K devices.\n",
68                                         __FUNCTION__);
69 #endif
70                         break;
71
72 #if defined(CONFIG_FPGA_STRATIX_II)
73                 case Altera_StratixII:
74                         PRINTF ("%s: Launching the Stratix II Loader...\n",
75                                 __FUNCTION__);
76                         ret_val = StratixII_load (desc, buf, bsize);
77                         break;
78 #endif
79                 default:
80                         printf ("%s: Unsupported family type, %d\n",
81                                         __FUNCTION__, desc->family);
82                 }
83         }
84
85         return ret_val;
86 }
87
88 int altera_dump( Altera_desc *desc, void *buf, size_t bsize )
89 {
90         int ret_val = FPGA_FAIL;        /* assume a failure */
91
92         if (!altera_validate (desc, (char *)__FUNCTION__)) {
93                 printf ("%s: Invalid device descriptor\n", __FUNCTION__);
94         } else {
95                 switch (desc->family) {
96                 case Altera_ACEX1K:
97 #if defined(CONFIG_FPGA_ACEX)
98                         PRINTF ("%s: Launching the ACEX1K Reader...\n",
99                                         __FUNCTION__);
100                         ret_val = ACEX1K_dump (desc, buf, bsize);
101 #else
102                         printf ("%s: No support for ACEX1K devices.\n",
103                                         __FUNCTION__);
104 #endif
105                         break;
106
107 #if defined(CONFIG_FPGA_STRATIX_II)
108                 case Altera_StratixII:
109                         PRINTF ("%s: Launching the Stratix II Reader...\n",
110                                 __FUNCTION__);
111                         ret_val = StratixII_dump (desc, buf, bsize);
112                         break;
113 #endif
114                 default:
115                         printf ("%s: Unsupported family type, %d\n",
116                                         __FUNCTION__, desc->family);
117                 }
118         }
119
120         return ret_val;
121 }
122
123 int altera_info( Altera_desc *desc )
124 {
125         int ret_val = FPGA_FAIL;
126
127         if (altera_validate (desc, (char *)__FUNCTION__)) {
128                 printf ("Family:        \t");
129                 switch (desc->family) {
130                 case Altera_ACEX1K:
131                         printf ("ACEX1K\n");
132                         break;
133                 case Altera_CYC2:
134                         printf ("CYCLON II\n");
135                         break;
136                 case Altera_StratixII:
137                         printf ("Stratix II\n");
138                         break;
139                         /* Add new family types here */
140                 default:
141                         printf ("Unknown family type, %d\n", desc->family);
142                 }
143
144                 printf ("Interface type:\t");
145                 switch (desc->iface) {
146                 case passive_serial:
147                         printf ("Passive Serial (PS)\n");
148                         break;
149                 case passive_parallel_synchronous:
150                         printf ("Passive Parallel Synchronous (PPS)\n");
151                         break;
152                 case passive_parallel_asynchronous:
153                         printf ("Passive Parallel Asynchronous (PPA)\n");
154                         break;
155                 case passive_serial_asynchronous:
156                         printf ("Passive Serial Asynchronous (PSA)\n");
157                         break;
158                 case altera_jtag_mode:          /* Not used */
159                         printf ("JTAG Mode\n");
160                         break;
161                 case fast_passive_parallel:
162                         printf ("Fast Passive Parallel (FPP)\n");
163                         break;
164                 case fast_passive_parallel_security:
165                         printf
166                             ("Fast Passive Parallel with Security (FPPS) \n");
167                         break;
168                         /* Add new interface types here */
169                 default:
170                         printf ("Unsupported interface type, %d\n", desc->iface);
171                 }
172
173                 printf ("Device Size:   \t%d bytes\n"
174                                 "Cookie:        \t0x%x (%d)\n",
175                                 desc->size, desc->cookie, desc->cookie);
176
177                 if (desc->iface_fns) {
178                         printf ("Device Function Table @ 0x%p\n", desc->iface_fns);
179                         switch (desc->family) {
180                         case Altera_ACEX1K:
181                         case Altera_CYC2:
182 #if defined(CONFIG_FPGA_ACEX1K)
183                                 ACEX1K_info (desc);
184 #elif defined(CONFIG_FPGA_CYCLON2)
185                                 CYC2_info (desc);
186 #else
187                                 /* just in case */
188                                 printf ("%s: No support for ACEX1K devices.\n",
189                                                 __FUNCTION__);
190 #endif
191                                 break;
192 #if defined(CONFIG_FPGA_STRATIX_II)
193                         case Altera_StratixII:
194                                 StratixII_info (desc);
195                                 break;
196 #endif
197                                 /* Add new family types here */
198                         default:
199                                 /* we don't need a message here - we give one up above */
200                                 break;
201                         }
202                 } else {
203                         printf ("No Device Function Table.\n");
204                 }
205
206                 ret_val = FPGA_SUCCESS;
207         } else {
208                 printf ("%s: Invalid device descriptor\n", __FUNCTION__);
209         }
210
211         return ret_val;
212 }
213
214 int altera_reloc( Altera_desc *desc, ulong reloc_offset)
215 {
216         int ret_val = FPGA_FAIL;        /* assume a failure */
217
218         if (!altera_validate (desc, (char *)__FUNCTION__)) {
219                 printf ("%s: Invalid device descriptor\n", __FUNCTION__);
220         } else {
221                 switch (desc->family) {
222                 case Altera_ACEX1K:
223 #if defined(CONFIG_FPGA_ACEX1K)
224                         ret_val = ACEX1K_reloc (desc, reloc_offset);
225 #else
226                         printf ("%s: No support for ACEX devices.\n",
227                                         __FUNCTION__);
228 #endif
229                         break;
230 #if defined(CONFIG_FPGA_STRATIX_II)
231                 case Altera_StratixII:
232                         ret_val = StratixII_reloc (desc, reloc_offset);
233                         break;
234 #endif
235                 case Altera_CYC2:
236 #if defined(CONFIG_FPGA_CYCLON2)
237                         ret_val = CYC2_reloc (desc, reloc_offset);
238 #else
239                         printf ("%s: No support for CYCLON II devices.\n",
240                                         __FUNCTION__);
241 #endif
242                         break;
243                         /* Add new family types here */
244                 default:
245                         printf ("%s: Unsupported family type, %d\n",
246                                         __FUNCTION__, desc->family);
247                 }
248         }
249
250         return ret_val;
251 }
252
253 /* ------------------------------------------------------------------------- */
254
255 static int altera_validate (Altera_desc * desc, const char *fn)
256 {
257         int ret_val = FALSE;
258
259         if (desc) {
260                 if ((desc->family > min_altera_type) &&
261                         (desc->family < max_altera_type)) {
262                         if ((desc->iface > min_altera_iface_type) &&
263                                 (desc->iface < max_altera_iface_type)) {
264                                 if (desc->size) {
265                                         ret_val = TRUE;
266                                 } else {
267                                         printf ("%s: NULL part size\n", fn);
268                                 }
269                         } else {
270                                 printf ("%s: Invalid Interface type, %d\n",
271                                         fn, desc->iface);
272                         }
273                 } else {
274                         printf ("%s: Invalid family type, %d\n", fn, desc->family);
275                 }
276         } else {
277                 printf ("%s: NULL descriptor!\n", fn);
278         }
279
280         return ret_val;
281 }
282
283 /* ------------------------------------------------------------------------- */