xref: /openbmc/u-boot/drivers/fpga/altera.c (revision 3e3eec39)
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 /* ------------------------------------------------------------------------- */
284