blob: b0f323fbef37126e5a927f662597cf421fd57504 [file] [log] [blame]
wdenk5b845b62002-08-21 21:57:24 +00001/*
wdenk5da627a2003-10-09 20:09:04 +00002 * (C) Copyright 2003
3 * Steven Scholz, imc Measurement & Control, steven.scholz@imc-berlin.de
4 *
wdenk5b845b62002-08-21 21:57:24 +00005 * (C) Copyright 2002
6 * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
7 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02008 * SPDX-License-Identifier: GPL-2.0+
wdenk5b845b62002-08-21 21:57:24 +00009 */
10
11/*
wdenk5b845b62002-08-21 21:57:24 +000012 * Altera FPGA support
13 */
14#include <common.h>
wdenk5da627a2003-10-09 20:09:04 +000015#include <ACEX1K.h>
eran liberty3c735e72008-03-27 00:50:49 +010016#include <stratixII.h>
wdenk5b845b62002-08-21 21:57:24 +000017
Marek Vasut0ae16cb2014-09-16 20:21:42 +020018/* Define FPGA_DEBUG to 1 to get debug printf's */
19#define FPGA_DEBUG 0
wdenk5b845b62002-08-21 21:57:24 +000020
wdenk5da627a2003-10-09 20:09:04 +000021/* Local Static Functions */
eran liberty3c735e72008-03-27 00:50:49 +010022static int altera_validate (Altera_desc * desc, const char *fn);
wdenk5da627a2003-10-09 20:09:04 +000023
wdenk5b845b62002-08-21 21:57:24 +000024/* ------------------------------------------------------------------------- */
Wolfgang Denke6a857d2011-07-30 13:33:49 +000025int altera_load(Altera_desc *desc, const void *buf, size_t bsize)
wdenk5b845b62002-08-21 21:57:24 +000026{
wdenk5da627a2003-10-09 20:09:04 +000027 int ret_val = FPGA_FAIL; /* assume a failure */
28
Marek Vasut4a4c0a52014-09-16 20:29:24 +020029 if (!altera_validate(desc, (char *)__func__)) {
Marek Vasut0ae16cb2014-09-16 20:21:42 +020030 printf("%s: Invalid device descriptor\n", __func__);
Marek Vasut4a4c0a52014-09-16 20:29:24 +020031 return FPGA_FAIL;
32 }
33
34 switch (desc->family) {
35 case Altera_ACEX1K:
36 case Altera_CYC2:
Matthias Fuchs01335022007-12-27 17:12:34 +010037#if defined(CONFIG_FPGA_ACEX1K)
Marek Vasut4a4c0a52014-09-16 20:29:24 +020038 debug_cond(FPGA_DEBUG,
39 "%s: Launching the ACEX1K Loader...\n",
40 __func__);
41 ret_val = ACEX1K_load (desc, buf, bsize);
eran liberty3c735e72008-03-27 00:50:49 +010042#elif defined(CONFIG_FPGA_CYCLON2)
Marek Vasut4a4c0a52014-09-16 20:29:24 +020043 debug_cond(FPGA_DEBUG,
44 "%s: Launching the CYCLONE II Loader...\n",
45 __func__);
46 ret_val = CYC2_load (desc, buf, bsize);
wdenk5da627a2003-10-09 20:09:04 +000047#else
Marek Vasut4a4c0a52014-09-16 20:29:24 +020048 printf("%s: No support for ACEX1K devices.\n",
49 __func__);
wdenk5da627a2003-10-09 20:09:04 +000050#endif
Marek Vasut4a4c0a52014-09-16 20:29:24 +020051 break;
wdenk5da627a2003-10-09 20:09:04 +000052
eran liberty3c735e72008-03-27 00:50:49 +010053#if defined(CONFIG_FPGA_STRATIX_II)
Marek Vasut4a4c0a52014-09-16 20:29:24 +020054 case Altera_StratixII:
55 debug_cond(FPGA_DEBUG,
56 "%s: Launching the Stratix II Loader...\n",
57 __func__);
58 ret_val = StratixII_load (desc, buf, bsize);
59 break;
eran liberty3c735e72008-03-27 00:50:49 +010060#endif
Marek Vasut4a4c0a52014-09-16 20:29:24 +020061 default:
62 printf("%s: Unsupported family type, %d\n",
63 __func__, desc->family);
wdenk5da627a2003-10-09 20:09:04 +000064 }
65
66 return ret_val;
wdenk5b845b62002-08-21 21:57:24 +000067}
68
Wolfgang Denke6a857d2011-07-30 13:33:49 +000069int altera_dump(Altera_desc *desc, const void *buf, size_t bsize)
wdenk5b845b62002-08-21 21:57:24 +000070{
wdenk5da627a2003-10-09 20:09:04 +000071 int ret_val = FPGA_FAIL; /* assume a failure */
72
Marek Vasut0ae16cb2014-09-16 20:21:42 +020073 if (!altera_validate (desc, (char *)__func__)) {
74 printf("%s: Invalid device descriptor\n", __func__);
Marek Vasut4a4c0a52014-09-16 20:29:24 +020075 return FPGA_FAIL;
76 }
77
78 switch (desc->family) {
79 case Altera_ACEX1K:
Matthias Fuchs01335022007-12-27 17:12:34 +010080#if defined(CONFIG_FPGA_ACEX)
Marek Vasut4a4c0a52014-09-16 20:29:24 +020081 debug_cond(FPGA_DEBUG,
82 "%s: Launching the ACEX1K Reader...\n",
83 __func__);
84 ret_val = ACEX1K_dump (desc, buf, bsize);
wdenk5da627a2003-10-09 20:09:04 +000085#else
Marek Vasut4a4c0a52014-09-16 20:29:24 +020086 printf("%s: No support for ACEX1K devices.\n",
87 __func__);
wdenk5da627a2003-10-09 20:09:04 +000088#endif
Marek Vasut4a4c0a52014-09-16 20:29:24 +020089 break;
wdenk5da627a2003-10-09 20:09:04 +000090
eran liberty3c735e72008-03-27 00:50:49 +010091#if defined(CONFIG_FPGA_STRATIX_II)
Marek Vasut4a4c0a52014-09-16 20:29:24 +020092 case Altera_StratixII:
93 debug_cond(FPGA_DEBUG,
94 "%s: Launching the Stratix II Reader...\n",
95 __func__);
96 ret_val = StratixII_dump (desc, buf, bsize);
97 break;
eran liberty3c735e72008-03-27 00:50:49 +010098#endif
Marek Vasut4a4c0a52014-09-16 20:29:24 +020099 default:
100 printf("%s: Unsupported family type, %d\n",
101 __func__, desc->family);
wdenk5da627a2003-10-09 20:09:04 +0000102 }
103
104 return ret_val;
wdenk5b845b62002-08-21 21:57:24 +0000105}
106
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200107int altera_info(Altera_desc *desc)
wdenk5b845b62002-08-21 21:57:24 +0000108{
wdenk5da627a2003-10-09 20:09:04 +0000109 int ret_val = FPGA_FAIL;
110
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200111 if (!altera_validate (desc, (char *)__func__)) {
112 printf("%s: Invalid device descriptor\n", __func__);
113 return FPGA_FAIL;
114 }
115
116 printf("Family: \t");
117 switch (desc->family) {
118 case Altera_ACEX1K:
119 printf("ACEX1K\n");
120 break;
121 case Altera_CYC2:
122 printf("CYCLON II\n");
123 break;
124 case Altera_StratixII:
125 printf("Stratix II\n");
126 break;
127 /* Add new family types here */
128 default:
129 printf("Unknown family type, %d\n", desc->family);
130 }
131
132 printf("Interface type:\t");
133 switch (desc->iface) {
134 case passive_serial:
135 printf("Passive Serial (PS)\n");
136 break;
137 case passive_parallel_synchronous:
138 printf("Passive Parallel Synchronous (PPS)\n");
139 break;
140 case passive_parallel_asynchronous:
141 printf("Passive Parallel Asynchronous (PPA)\n");
142 break;
143 case passive_serial_asynchronous:
144 printf("Passive Serial Asynchronous (PSA)\n");
145 break;
146 case altera_jtag_mode: /* Not used */
147 printf("JTAG Mode\n");
148 break;
149 case fast_passive_parallel:
150 printf("Fast Passive Parallel (FPP)\n");
151 break;
152 case fast_passive_parallel_security:
153 printf("Fast Passive Parallel with Security (FPPS)\n");
154 break;
155 /* Add new interface types here */
156 default:
157 printf("Unsupported interface type, %d\n", desc->iface);
158 }
159
160 printf("Device Size: \t%zd bytes\n"
161 "Cookie: \t0x%x (%d)\n",
162 desc->size, desc->cookie, desc->cookie);
163
164 if (desc->iface_fns) {
165 printf("Device Function Table @ 0x%p\n", desc->iface_fns);
wdenk5da627a2003-10-09 20:09:04 +0000166 switch (desc->family) {
167 case Altera_ACEX1K:
Stefan Roesef0ff4692006-08-15 14:15:51 +0200168 case Altera_CYC2:
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200169#if defined(CONFIG_FPGA_ACEX1K)
170 ACEX1K_info(desc);
171#elif defined(CONFIG_FPGA_CYCLON2)
172 CYC2_info(desc);
173#else
174 /* just in case */
175 printf("%s: No support for ACEX1K devices.\n",
176 __func__);
177#endif
Stefan Roesef0ff4692006-08-15 14:15:51 +0200178 break;
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200179#if defined(CONFIG_FPGA_STRATIX_II)
eran liberty3c735e72008-03-27 00:50:49 +0100180 case Altera_StratixII:
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200181 StratixII_info(desc);
eran liberty3c735e72008-03-27 00:50:49 +0100182 break;
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200183#endif
eran liberty3c735e72008-03-27 00:50:49 +0100184 /* Add new family types here */
wdenk5da627a2003-10-09 20:09:04 +0000185 default:
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200186 /* we don't need a message here - we give one up above */
187 break;
wdenk5da627a2003-10-09 20:09:04 +0000188 }
wdenk5da627a2003-10-09 20:09:04 +0000189 } else {
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200190 printf("No Device Function Table.\n");
wdenk5da627a2003-10-09 20:09:04 +0000191 }
192
Marek Vasut4a4c0a52014-09-16 20:29:24 +0200193 ret_val = FPGA_SUCCESS;
194
wdenk5da627a2003-10-09 20:09:04 +0000195 return ret_val;
196}
197
wdenk5b845b62002-08-21 21:57:24 +0000198/* ------------------------------------------------------------------------- */
199
Marek Vasut5561a842014-09-16 20:26:07 +0200200static int altera_validate(Altera_desc *desc, const char *fn)
wdenk5da627a2003-10-09 20:09:04 +0000201{
Marek Vasut5561a842014-09-16 20:26:07 +0200202 if (!desc) {
Marek Vasut0ae16cb2014-09-16 20:21:42 +0200203 printf("%s: NULL descriptor!\n", fn);
Marek Vasut5561a842014-09-16 20:26:07 +0200204 return false;
wdenk5da627a2003-10-09 20:09:04 +0000205 }
206
Marek Vasut5561a842014-09-16 20:26:07 +0200207 if ((desc->family < min_altera_type) ||
208 (desc->family > max_altera_type)) {
209 printf("%s: Invalid family type, %d\n", fn, desc->family);
210 return false;
211 }
212
213 if ((desc->iface < min_altera_iface_type) ||
214 (desc->iface > max_altera_iface_type)) {
215 printf("%s: Invalid Interface type, %d\n", fn, desc->iface);
216 return false;
217 }
218
219 if (!desc->size) {
220 printf("%s: NULL part size\n", fn);
221 return false;
222 }
223
224 return true;
wdenk5da627a2003-10-09 20:09:04 +0000225}
wdenk5b845b62002-08-21 21:57:24 +0000226
227/* ------------------------------------------------------------------------- */