xref: /linux/arch/mips/cavium-octeon/executive/cvmx-interrupt-decodes.c (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1 /***********************license start***************
2  * Author: Cavium Networks
3  *
4  * Contact: support@caviumnetworks.com
5  * This file is part of the OCTEON SDK
6  *
7  * Copyright (c) 2003-2009 Cavium Networks
8  *
9  * This file is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License, Version 2, as
11  * published by the Free Software Foundation.
12  *
13  * This file is distributed in the hope that it will be useful, but
14  * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
15  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
16  * NONINFRINGEMENT.  See the GNU General Public License for more
17  * details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this file; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22  * or visit http://www.gnu.org/licenses/.
23  *
24  * This file may also be available under a different license from Cavium.
25  * Contact Cavium Networks for more information
26  ***********************license end**************************************/
27 
28 /*
29  *
30  * Automatically generated functions useful for enabling
31  * and decoding RSL_INT_BLOCKS interrupts.
32  *
33  */
34 
35 #include <asm/octeon/octeon.h>
36 
37 #include <asm/octeon/cvmx-gmxx-defs.h>
38 #include <asm/octeon/cvmx-pcsx-defs.h>
39 #include <asm/octeon/cvmx-pcsxx-defs.h>
40 #include <asm/octeon/cvmx-spxx-defs.h>
41 #include <asm/octeon/cvmx-stxx-defs.h>
42 
43 #ifndef PRINT_ERROR
44 #define PRINT_ERROR(format, ...)
45 #endif
46 
47 
48 /**
49  * __cvmx_interrupt_gmxx_rxx_int_en_enable enables all interrupt bits in cvmx_gmxx_rxx_int_en_t
50  */
51 void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block)
52 {
53 	union cvmx_gmxx_rxx_int_en gmx_rx_int_en;
54 	cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(index, block),
55 		       cvmx_read_csr(CVMX_GMXX_RXX_INT_REG(index, block)));
56 	gmx_rx_int_en.u64 = 0;
57 	if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
58 		/* Skipping gmx_rx_int_en.s.reserved_29_63 */
59 		gmx_rx_int_en.s.hg2cc = 1;
60 		gmx_rx_int_en.s.hg2fld = 1;
61 		gmx_rx_int_en.s.undat = 1;
62 		gmx_rx_int_en.s.uneop = 1;
63 		gmx_rx_int_en.s.unsop = 1;
64 		gmx_rx_int_en.s.bad_term = 1;
65 		gmx_rx_int_en.s.bad_seq = 1;
66 		gmx_rx_int_en.s.rem_fault = 1;
67 		gmx_rx_int_en.s.loc_fault = 1;
68 		gmx_rx_int_en.s.pause_drp = 1;
69 		/* Skipping gmx_rx_int_en.s.reserved_16_18 */
70 		/*gmx_rx_int_en.s.ifgerr = 1; */
71 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
72 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
73 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
74 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
75 		gmx_rx_int_en.s.ovrerr = 1;
76 		/* Skipping gmx_rx_int_en.s.reserved_9_9 */
77 		gmx_rx_int_en.s.skperr = 1;
78 		gmx_rx_int_en.s.rcverr = 1;
79 		/* Skipping gmx_rx_int_en.s.reserved_5_6 */
80 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
81 		gmx_rx_int_en.s.jabber = 1;
82 		/* Skipping gmx_rx_int_en.s.reserved_2_2 */
83 		gmx_rx_int_en.s.carext = 1;
84 		/* Skipping gmx_rx_int_en.s.reserved_0_0 */
85 	}
86 	if (OCTEON_IS_MODEL(OCTEON_CN30XX)) {
87 		/* Skipping gmx_rx_int_en.s.reserved_19_63 */
88 		/*gmx_rx_int_en.s.phy_dupx = 1; */
89 		/*gmx_rx_int_en.s.phy_spd = 1; */
90 		/*gmx_rx_int_en.s.phy_link = 1; */
91 		/*gmx_rx_int_en.s.ifgerr = 1; */
92 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
93 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
94 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
95 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
96 		gmx_rx_int_en.s.ovrerr = 1;
97 		gmx_rx_int_en.s.niberr = 1;
98 		gmx_rx_int_en.s.skperr = 1;
99 		gmx_rx_int_en.s.rcverr = 1;
100 		/*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
101 		gmx_rx_int_en.s.alnerr = 1;
102 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
103 		gmx_rx_int_en.s.jabber = 1;
104 		gmx_rx_int_en.s.maxerr = 1;
105 		gmx_rx_int_en.s.carext = 1;
106 		gmx_rx_int_en.s.minerr = 1;
107 	}
108 	if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
109 		/* Skipping gmx_rx_int_en.s.reserved_20_63 */
110 		gmx_rx_int_en.s.pause_drp = 1;
111 		/*gmx_rx_int_en.s.phy_dupx = 1; */
112 		/*gmx_rx_int_en.s.phy_spd = 1; */
113 		/*gmx_rx_int_en.s.phy_link = 1; */
114 		/*gmx_rx_int_en.s.ifgerr = 1; */
115 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
116 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
117 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
118 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
119 		gmx_rx_int_en.s.ovrerr = 1;
120 		gmx_rx_int_en.s.niberr = 1;
121 		gmx_rx_int_en.s.skperr = 1;
122 		gmx_rx_int_en.s.rcverr = 1;
123 		/* Skipping gmx_rx_int_en.s.reserved_6_6 */
124 		gmx_rx_int_en.s.alnerr = 1;
125 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
126 		gmx_rx_int_en.s.jabber = 1;
127 		/* Skipping gmx_rx_int_en.s.reserved_2_2 */
128 		gmx_rx_int_en.s.carext = 1;
129 		/* Skipping gmx_rx_int_en.s.reserved_0_0 */
130 	}
131 	if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
132 		/* Skipping gmx_rx_int_en.s.reserved_19_63 */
133 		/*gmx_rx_int_en.s.phy_dupx = 1; */
134 		/*gmx_rx_int_en.s.phy_spd = 1; */
135 		/*gmx_rx_int_en.s.phy_link = 1; */
136 		/*gmx_rx_int_en.s.ifgerr = 1; */
137 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
138 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
139 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
140 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
141 		gmx_rx_int_en.s.ovrerr = 1;
142 		gmx_rx_int_en.s.niberr = 1;
143 		gmx_rx_int_en.s.skperr = 1;
144 		gmx_rx_int_en.s.rcverr = 1;
145 		/*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
146 		gmx_rx_int_en.s.alnerr = 1;
147 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
148 		gmx_rx_int_en.s.jabber = 1;
149 		gmx_rx_int_en.s.maxerr = 1;
150 		gmx_rx_int_en.s.carext = 1;
151 		gmx_rx_int_en.s.minerr = 1;
152 	}
153 	if (OCTEON_IS_MODEL(OCTEON_CN31XX)) {
154 		/* Skipping gmx_rx_int_en.s.reserved_19_63 */
155 		/*gmx_rx_int_en.s.phy_dupx = 1; */
156 		/*gmx_rx_int_en.s.phy_spd = 1; */
157 		/*gmx_rx_int_en.s.phy_link = 1; */
158 		/*gmx_rx_int_en.s.ifgerr = 1; */
159 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
160 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
161 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
162 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
163 		gmx_rx_int_en.s.ovrerr = 1;
164 		gmx_rx_int_en.s.niberr = 1;
165 		gmx_rx_int_en.s.skperr = 1;
166 		gmx_rx_int_en.s.rcverr = 1;
167 		/*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
168 		gmx_rx_int_en.s.alnerr = 1;
169 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
170 		gmx_rx_int_en.s.jabber = 1;
171 		gmx_rx_int_en.s.maxerr = 1;
172 		gmx_rx_int_en.s.carext = 1;
173 		gmx_rx_int_en.s.minerr = 1;
174 	}
175 	if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
176 		/* Skipping gmx_rx_int_en.s.reserved_20_63 */
177 		gmx_rx_int_en.s.pause_drp = 1;
178 		/*gmx_rx_int_en.s.phy_dupx = 1; */
179 		/*gmx_rx_int_en.s.phy_spd = 1; */
180 		/*gmx_rx_int_en.s.phy_link = 1; */
181 		/*gmx_rx_int_en.s.ifgerr = 1; */
182 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
183 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
184 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
185 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
186 		gmx_rx_int_en.s.ovrerr = 1;
187 		gmx_rx_int_en.s.niberr = 1;
188 		gmx_rx_int_en.s.skperr = 1;
189 		gmx_rx_int_en.s.rcverr = 1;
190 		/*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
191 		gmx_rx_int_en.s.alnerr = 1;
192 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
193 		gmx_rx_int_en.s.jabber = 1;
194 		gmx_rx_int_en.s.maxerr = 1;
195 		gmx_rx_int_en.s.carext = 1;
196 		gmx_rx_int_en.s.minerr = 1;
197 	}
198 	if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
199 		/* Skipping gmx_rx_int_en.s.reserved_29_63 */
200 		gmx_rx_int_en.s.hg2cc = 1;
201 		gmx_rx_int_en.s.hg2fld = 1;
202 		gmx_rx_int_en.s.undat = 1;
203 		gmx_rx_int_en.s.uneop = 1;
204 		gmx_rx_int_en.s.unsop = 1;
205 		gmx_rx_int_en.s.bad_term = 1;
206 		gmx_rx_int_en.s.bad_seq = 0;
207 		gmx_rx_int_en.s.rem_fault = 1;
208 		gmx_rx_int_en.s.loc_fault = 0;
209 		gmx_rx_int_en.s.pause_drp = 1;
210 		/* Skipping gmx_rx_int_en.s.reserved_16_18 */
211 		/*gmx_rx_int_en.s.ifgerr = 1; */
212 		/*gmx_rx_int_en.s.coldet = 1; // Collision detect */
213 		/*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
214 		/*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
215 		/*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
216 		gmx_rx_int_en.s.ovrerr = 1;
217 		/* Skipping gmx_rx_int_en.s.reserved_9_9 */
218 		gmx_rx_int_en.s.skperr = 1;
219 		gmx_rx_int_en.s.rcverr = 1;
220 		/* Skipping gmx_rx_int_en.s.reserved_5_6 */
221 		/*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
222 		gmx_rx_int_en.s.jabber = 1;
223 		/* Skipping gmx_rx_int_en.s.reserved_2_2 */
224 		gmx_rx_int_en.s.carext = 1;
225 		/* Skipping gmx_rx_int_en.s.reserved_0_0 */
226 	}
227 	cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(index, block), gmx_rx_int_en.u64);
228 }
229 /**
230  * __cvmx_interrupt_pcsx_intx_en_reg_enable enables all interrupt bits in cvmx_pcsx_intx_en_reg_t
231  */
232 void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block)
233 {
234 	union cvmx_pcsx_intx_en_reg pcs_int_en_reg;
235 	cvmx_write_csr(CVMX_PCSX_INTX_REG(index, block),
236 		       cvmx_read_csr(CVMX_PCSX_INTX_REG(index, block)));
237 	pcs_int_en_reg.u64 = 0;
238 	if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
239 		/* Skipping pcs_int_en_reg.s.reserved_12_63 */
240 		/*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
241 		pcs_int_en_reg.s.sync_bad_en = 1;
242 		pcs_int_en_reg.s.an_bad_en = 1;
243 		pcs_int_en_reg.s.rxlock_en = 1;
244 		pcs_int_en_reg.s.rxbad_en = 1;
245 		/*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
246 		pcs_int_en_reg.s.txbad_en = 1;
247 		pcs_int_en_reg.s.txfifo_en = 1;
248 		pcs_int_en_reg.s.txfifu_en = 1;
249 		pcs_int_en_reg.s.an_err_en = 1;
250 		/*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
251 		/*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
252 	}
253 	if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
254 		/* Skipping pcs_int_en_reg.s.reserved_12_63 */
255 		/*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
256 		pcs_int_en_reg.s.sync_bad_en = 1;
257 		pcs_int_en_reg.s.an_bad_en = 1;
258 		pcs_int_en_reg.s.rxlock_en = 1;
259 		pcs_int_en_reg.s.rxbad_en = 1;
260 		/*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
261 		pcs_int_en_reg.s.txbad_en = 1;
262 		pcs_int_en_reg.s.txfifo_en = 1;
263 		pcs_int_en_reg.s.txfifu_en = 1;
264 		pcs_int_en_reg.s.an_err_en = 1;
265 		/*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
266 		/*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
267 	}
268 	cvmx_write_csr(CVMX_PCSX_INTX_EN_REG(index, block), pcs_int_en_reg.u64);
269 }
270 /**
271  * __cvmx_interrupt_pcsxx_int_en_reg_enable enables all interrupt bits in cvmx_pcsxx_int_en_reg_t
272  */
273 void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index)
274 {
275 	union cvmx_pcsxx_int_en_reg pcsx_int_en_reg;
276 	cvmx_write_csr(CVMX_PCSXX_INT_REG(index),
277 		       cvmx_read_csr(CVMX_PCSXX_INT_REG(index)));
278 	pcsx_int_en_reg.u64 = 0;
279 	if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
280 		/* Skipping pcsx_int_en_reg.s.reserved_6_63 */
281 		pcsx_int_en_reg.s.algnlos_en = 1;
282 		pcsx_int_en_reg.s.synlos_en = 1;
283 		pcsx_int_en_reg.s.bitlckls_en = 1;
284 		pcsx_int_en_reg.s.rxsynbad_en = 1;
285 		pcsx_int_en_reg.s.rxbad_en = 1;
286 		pcsx_int_en_reg.s.txflt_en = 1;
287 	}
288 	if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
289 		/* Skipping pcsx_int_en_reg.s.reserved_6_63 */
290 		pcsx_int_en_reg.s.algnlos_en = 1;
291 		pcsx_int_en_reg.s.synlos_en = 1;
292 		pcsx_int_en_reg.s.bitlckls_en = 0;	/* Happens if XAUI module is not installed */
293 		pcsx_int_en_reg.s.rxsynbad_en = 1;
294 		pcsx_int_en_reg.s.rxbad_en = 1;
295 		pcsx_int_en_reg.s.txflt_en = 1;
296 	}
297 	cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(index), pcsx_int_en_reg.u64);
298 }
299 
300 /**
301  * __cvmx_interrupt_spxx_int_msk_enable enables all interrupt bits in cvmx_spxx_int_msk_t
302  */
303 void __cvmx_interrupt_spxx_int_msk_enable(int index)
304 {
305 	union cvmx_spxx_int_msk spx_int_msk;
306 	cvmx_write_csr(CVMX_SPXX_INT_REG(index),
307 		       cvmx_read_csr(CVMX_SPXX_INT_REG(index)));
308 	spx_int_msk.u64 = 0;
309 	if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
310 		/* Skipping spx_int_msk.s.reserved_12_63 */
311 		spx_int_msk.s.calerr = 1;
312 		spx_int_msk.s.syncerr = 1;
313 		spx_int_msk.s.diperr = 1;
314 		spx_int_msk.s.tpaovr = 1;
315 		spx_int_msk.s.rsverr = 1;
316 		spx_int_msk.s.drwnng = 1;
317 		spx_int_msk.s.clserr = 1;
318 		spx_int_msk.s.spiovr = 1;
319 		/* Skipping spx_int_msk.s.reserved_2_3 */
320 		spx_int_msk.s.abnorm = 1;
321 		spx_int_msk.s.prtnxa = 1;
322 	}
323 	if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
324 		/* Skipping spx_int_msk.s.reserved_12_63 */
325 		spx_int_msk.s.calerr = 1;
326 		spx_int_msk.s.syncerr = 1;
327 		spx_int_msk.s.diperr = 1;
328 		spx_int_msk.s.tpaovr = 1;
329 		spx_int_msk.s.rsverr = 1;
330 		spx_int_msk.s.drwnng = 1;
331 		spx_int_msk.s.clserr = 1;
332 		spx_int_msk.s.spiovr = 1;
333 		/* Skipping spx_int_msk.s.reserved_2_3 */
334 		spx_int_msk.s.abnorm = 1;
335 		spx_int_msk.s.prtnxa = 1;
336 	}
337 	cvmx_write_csr(CVMX_SPXX_INT_MSK(index), spx_int_msk.u64);
338 }
339 /**
340  * __cvmx_interrupt_stxx_int_msk_enable enables all interrupt bits in cvmx_stxx_int_msk_t
341  */
342 void __cvmx_interrupt_stxx_int_msk_enable(int index)
343 {
344 	union cvmx_stxx_int_msk stx_int_msk;
345 	cvmx_write_csr(CVMX_STXX_INT_REG(index),
346 		       cvmx_read_csr(CVMX_STXX_INT_REG(index)));
347 	stx_int_msk.u64 = 0;
348 	if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
349 		/* Skipping stx_int_msk.s.reserved_8_63 */
350 		stx_int_msk.s.frmerr = 1;
351 		stx_int_msk.s.unxfrm = 1;
352 		stx_int_msk.s.nosync = 1;
353 		stx_int_msk.s.diperr = 1;
354 		stx_int_msk.s.datovr = 1;
355 		stx_int_msk.s.ovrbst = 1;
356 		stx_int_msk.s.calpar1 = 1;
357 		stx_int_msk.s.calpar0 = 1;
358 	}
359 	if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
360 		/* Skipping stx_int_msk.s.reserved_8_63 */
361 		stx_int_msk.s.frmerr = 1;
362 		stx_int_msk.s.unxfrm = 1;
363 		stx_int_msk.s.nosync = 1;
364 		stx_int_msk.s.diperr = 1;
365 		stx_int_msk.s.datovr = 1;
366 		stx_int_msk.s.ovrbst = 1;
367 		stx_int_msk.s.calpar1 = 1;
368 		stx_int_msk.s.calpar0 = 1;
369 	}
370 	cvmx_write_csr(CVMX_STXX_INT_MSK(index), stx_int_msk.u64);
371 }
372