1 /*
2 * Copyright(c) 2015 - 2018 Intel Corporation.
3 *
4 * This file is provided under a dual BSD/GPLv2 license. When using or
5 * redistributing this file, you may do so under either license.
6 *
7 * GPL LICENSE SUMMARY
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * BSD LICENSE
19 *
20 * Redistribution and use in source and binary forms, with or without
21 * modification, are permitted provided that the following conditions
22 * are met:
23 *
24 * - Redistributions of source code must retain the above copyright
25 * notice, this list of conditions and the following disclaimer.
26 * - Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in
28 * the documentation and/or other materials provided with the
29 * distribution.
30 * - Neither the name of Intel Corporation nor the names of its
31 * contributors may be used to endorse or promote products derived
32 * from this software without specific prior written permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
38 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
40 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 *
46 */
47
48 /*
49 * This file contains all of the code that is specific to the HFI chip
50 */
51
52 #include <linux/pci.h>
53 #include <linux/delay.h>
54 #include <linux/interrupt.h>
55 #include <linux/module.h>
56
57 #include "hfi.h"
58 #include "trace.h"
59 #include "mad.h"
60 #include "pio.h"
61 #include "sdma.h"
62 #include "eprom.h"
63 #include "efivar.h"
64 #include "platform.h"
65 #include "aspm.h"
66 #include "affinity.h"
67 #include "debugfs.h"
68 #include "fault.h"
69
70 uint kdeth_qp;
71 module_param_named(kdeth_qp, kdeth_qp, uint, S_IRUGO);
72 MODULE_PARM_DESC(kdeth_qp, "Set the KDETH queue pair prefix");
73
74 uint num_vls = HFI1_MAX_VLS_SUPPORTED;
75 module_param(num_vls, uint, S_IRUGO);
76 MODULE_PARM_DESC(num_vls, "Set number of Virtual Lanes to use (1-8)");
77
78 /*
79 * Default time to aggregate two 10K packets from the idle state
80 * (timer not running). The timer starts at the end of the first packet,
81 * so only the time for one 10K packet and header plus a bit extra is needed.
82 * 10 * 1024 + 64 header byte = 10304 byte
83 * 10304 byte / 12.5 GB/s = 824.32ns
84 */
85 uint rcv_intr_timeout = (824 + 16); /* 16 is for coalescing interrupt */
86 module_param(rcv_intr_timeout, uint, S_IRUGO);
87 MODULE_PARM_DESC(rcv_intr_timeout, "Receive interrupt mitigation timeout in ns");
88
89 uint rcv_intr_count = 16; /* same as qib */
90 module_param(rcv_intr_count, uint, S_IRUGO);
91 MODULE_PARM_DESC(rcv_intr_count, "Receive interrupt mitigation count");
92
93 ushort link_crc_mask = SUPPORTED_CRCS;
94 module_param(link_crc_mask, ushort, S_IRUGO);
95 MODULE_PARM_DESC(link_crc_mask, "CRCs to use on the link");
96
97 uint loopback;
98 module_param_named(loopback, loopback, uint, S_IRUGO);
99 MODULE_PARM_DESC(loopback, "Put into loopback mode (1 = serdes, 3 = external cable");
100
101 /* Other driver tunables */
102 uint rcv_intr_dynamic = 1; /* enable dynamic mode for rcv int mitigation*/
103 static ushort crc_14b_sideband = 1;
104 static uint use_flr = 1;
105 uint quick_linkup; /* skip LNI */
106
107 struct flag_table {
108 u64 flag; /* the flag */
109 char *str; /* description string */
110 u16 extra; /* extra information */
111 u16 unused0;
112 u32 unused1;
113 };
114
115 /* str must be a string constant */
116 #define FLAG_ENTRY(str, extra, flag) {flag, str, extra}
117 #define FLAG_ENTRY0(str, flag) {flag, str, 0}
118
119 /* Send Error Consequences */
120 #define SEC_WRITE_DROPPED 0x1
121 #define SEC_PACKET_DROPPED 0x2
122 #define SEC_SC_HALTED 0x4 /* per-context only */
123 #define SEC_SPC_FREEZE 0x8 /* per-HFI only */
124
125 #define DEFAULT_KRCVQS 2
126 #define MIN_KERNEL_KCTXTS 2
127 #define FIRST_KERNEL_KCTXT 1
128
129 /*
130 * RSM instance allocation
131 * 0 - Verbs
132 * 1 - User Fecn Handling
133 * 2 - Vnic
134 */
135 #define RSM_INS_VERBS 0
136 #define RSM_INS_FECN 1
137 #define RSM_INS_VNIC 2
138
139 /* Bit offset into the GUID which carries HFI id information */
140 #define GUID_HFI_INDEX_SHIFT 39
141
142 /* extract the emulation revision */
143 #define emulator_rev(dd) ((dd)->irev >> 8)
144 /* parallel and serial emulation versions are 3 and 4 respectively */
145 #define is_emulator_p(dd) ((((dd)->irev) & 0xf) == 3)
146 #define is_emulator_s(dd) ((((dd)->irev) & 0xf) == 4)
147
148 /* RSM fields for Verbs */
149 /* packet type */
150 #define IB_PACKET_TYPE 2ull
151 #define QW_SHIFT 6ull
152 /* QPN[7..1] */
153 #define QPN_WIDTH 7ull
154
155 /* LRH.BTH: QW 0, OFFSET 48 - for match */
156 #define LRH_BTH_QW 0ull
157 #define LRH_BTH_BIT_OFFSET 48ull
158 #define LRH_BTH_OFFSET(off) ((LRH_BTH_QW << QW_SHIFT) | (off))
159 #define LRH_BTH_MATCH_OFFSET LRH_BTH_OFFSET(LRH_BTH_BIT_OFFSET)
160 #define LRH_BTH_SELECT
161 #define LRH_BTH_MASK 3ull
162 #define LRH_BTH_VALUE 2ull
163
164 /* LRH.SC[3..0] QW 0, OFFSET 56 - for match */
165 #define LRH_SC_QW 0ull
166 #define LRH_SC_BIT_OFFSET 56ull
167 #define LRH_SC_OFFSET(off) ((LRH_SC_QW << QW_SHIFT) | (off))
168 #define LRH_SC_MATCH_OFFSET LRH_SC_OFFSET(LRH_SC_BIT_OFFSET)
169 #define LRH_SC_MASK 128ull
170 #define LRH_SC_VALUE 0ull
171
172 /* SC[n..0] QW 0, OFFSET 60 - for select */
173 #define LRH_SC_SELECT_OFFSET ((LRH_SC_QW << QW_SHIFT) | (60ull))
174
175 /* QPN[m+n:1] QW 1, OFFSET 1 */
176 #define QPN_SELECT_OFFSET ((1ull << QW_SHIFT) | (1ull))
177
178 /* RSM fields for Vnic */
179 /* L2_TYPE: QW 0, OFFSET 61 - for match */
180 #define L2_TYPE_QW 0ull
181 #define L2_TYPE_BIT_OFFSET 61ull
182 #define L2_TYPE_OFFSET(off) ((L2_TYPE_QW << QW_SHIFT) | (off))
183 #define L2_TYPE_MATCH_OFFSET L2_TYPE_OFFSET(L2_TYPE_BIT_OFFSET)
184 #define L2_TYPE_MASK 3ull
185 #define L2_16B_VALUE 2ull
186
187 /* L4_TYPE QW 1, OFFSET 0 - for match */
188 #define L4_TYPE_QW 1ull
189 #define L4_TYPE_BIT_OFFSET 0ull
190 #define L4_TYPE_OFFSET(off) ((L4_TYPE_QW << QW_SHIFT) | (off))
191 #define L4_TYPE_MATCH_OFFSET L4_TYPE_OFFSET(L4_TYPE_BIT_OFFSET)
192 #define L4_16B_TYPE_MASK 0xFFull
193 #define L4_16B_ETH_VALUE 0x78ull
194
195 /* 16B VESWID - for select */
196 #define L4_16B_HDR_VESWID_OFFSET ((2 << QW_SHIFT) | (16ull))
197 /* 16B ENTROPY - for select */
198 #define L2_16B_ENTROPY_OFFSET ((1 << QW_SHIFT) | (32ull))
199
200 /* defines to build power on SC2VL table */
201 #define SC2VL_VAL( \
202 num, \
203 sc0, sc0val, \
204 sc1, sc1val, \
205 sc2, sc2val, \
206 sc3, sc3val, \
207 sc4, sc4val, \
208 sc5, sc5val, \
209 sc6, sc6val, \
210 sc7, sc7val) \
211 ( \
212 ((u64)(sc0val) << SEND_SC2VLT##num##_SC##sc0##_SHIFT) | \
213 ((u64)(sc1val) << SEND_SC2VLT##num##_SC##sc1##_SHIFT) | \
214 ((u64)(sc2val) << SEND_SC2VLT##num##_SC##sc2##_SHIFT) | \
215 ((u64)(sc3val) << SEND_SC2VLT##num##_SC##sc3##_SHIFT) | \
216 ((u64)(sc4val) << SEND_SC2VLT##num##_SC##sc4##_SHIFT) | \
217 ((u64)(sc5val) << SEND_SC2VLT##num##_SC##sc5##_SHIFT) | \
218 ((u64)(sc6val) << SEND_SC2VLT##num##_SC##sc6##_SHIFT) | \
219 ((u64)(sc7val) << SEND_SC2VLT##num##_SC##sc7##_SHIFT) \
220 )
221
222 #define DC_SC_VL_VAL( \
223 range, \
224 e0, e0val, \
225 e1, e1val, \
226 e2, e2val, \
227 e3, e3val, \
228 e4, e4val, \
229 e5, e5val, \
230 e6, e6val, \
231 e7, e7val, \
232 e8, e8val, \
233 e9, e9val, \
234 e10, e10val, \
235 e11, e11val, \
236 e12, e12val, \
237 e13, e13val, \
238 e14, e14val, \
239 e15, e15val) \
240 ( \
241 ((u64)(e0val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e0##_SHIFT) | \
242 ((u64)(e1val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e1##_SHIFT) | \
243 ((u64)(e2val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e2##_SHIFT) | \
244 ((u64)(e3val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e3##_SHIFT) | \
245 ((u64)(e4val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e4##_SHIFT) | \
246 ((u64)(e5val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e5##_SHIFT) | \
247 ((u64)(e6val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e6##_SHIFT) | \
248 ((u64)(e7val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e7##_SHIFT) | \
249 ((u64)(e8val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e8##_SHIFT) | \
250 ((u64)(e9val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e9##_SHIFT) | \
251 ((u64)(e10val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e10##_SHIFT) | \
252 ((u64)(e11val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e11##_SHIFT) | \
253 ((u64)(e12val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e12##_SHIFT) | \
254 ((u64)(e13val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e13##_SHIFT) | \
255 ((u64)(e14val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e14##_SHIFT) | \
256 ((u64)(e15val) << DCC_CFG_SC_VL_TABLE_##range##_ENTRY##e15##_SHIFT) \
257 )
258
259 /* all CceStatus sub-block freeze bits */
260 #define ALL_FROZE (CCE_STATUS_SDMA_FROZE_SMASK \
261 | CCE_STATUS_RXE_FROZE_SMASK \
262 | CCE_STATUS_TXE_FROZE_SMASK \
263 | CCE_STATUS_TXE_PIO_FROZE_SMASK)
264 /* all CceStatus sub-block TXE pause bits */
265 #define ALL_TXE_PAUSE (CCE_STATUS_TXE_PIO_PAUSED_SMASK \
266 | CCE_STATUS_TXE_PAUSED_SMASK \
267 | CCE_STATUS_SDMA_PAUSED_SMASK)
268 /* all CceStatus sub-block RXE pause bits */
269 #define ALL_RXE_PAUSE CCE_STATUS_RXE_PAUSED_SMASK
270
271 #define CNTR_MAX 0xFFFFFFFFFFFFFFFFULL
272 #define CNTR_32BIT_MAX 0x00000000FFFFFFFF
273
274 /*
275 * CCE Error flags.
276 */
277 static struct flag_table cce_err_status_flags[] = {
278 /* 0*/ FLAG_ENTRY0("CceCsrParityErr",
279 CCE_ERR_STATUS_CCE_CSR_PARITY_ERR_SMASK),
280 /* 1*/ FLAG_ENTRY0("CceCsrReadBadAddrErr",
281 CCE_ERR_STATUS_CCE_CSR_READ_BAD_ADDR_ERR_SMASK),
282 /* 2*/ FLAG_ENTRY0("CceCsrWriteBadAddrErr",
283 CCE_ERR_STATUS_CCE_CSR_WRITE_BAD_ADDR_ERR_SMASK),
284 /* 3*/ FLAG_ENTRY0("CceTrgtAsyncFifoParityErr",
285 CCE_ERR_STATUS_CCE_TRGT_ASYNC_FIFO_PARITY_ERR_SMASK),
286 /* 4*/ FLAG_ENTRY0("CceTrgtAccessErr",
287 CCE_ERR_STATUS_CCE_TRGT_ACCESS_ERR_SMASK),
288 /* 5*/ FLAG_ENTRY0("CceRspdDataParityErr",
289 CCE_ERR_STATUS_CCE_RSPD_DATA_PARITY_ERR_SMASK),
290 /* 6*/ FLAG_ENTRY0("CceCli0AsyncFifoParityErr",
291 CCE_ERR_STATUS_CCE_CLI0_ASYNC_FIFO_PARITY_ERR_SMASK),
292 /* 7*/ FLAG_ENTRY0("CceCsrCfgBusParityErr",
293 CCE_ERR_STATUS_CCE_CSR_CFG_BUS_PARITY_ERR_SMASK),
294 /* 8*/ FLAG_ENTRY0("CceCli2AsyncFifoParityErr",
295 CCE_ERR_STATUS_CCE_CLI2_ASYNC_FIFO_PARITY_ERR_SMASK),
296 /* 9*/ FLAG_ENTRY0("CceCli1AsyncFifoPioCrdtParityErr",
297 CCE_ERR_STATUS_CCE_CLI1_ASYNC_FIFO_PIO_CRDT_PARITY_ERR_SMASK),
298 /*10*/ FLAG_ENTRY0("CceCli1AsyncFifoPioCrdtParityErr",
299 CCE_ERR_STATUS_CCE_CLI1_ASYNC_FIFO_SDMA_HD_PARITY_ERR_SMASK),
300 /*11*/ FLAG_ENTRY0("CceCli1AsyncFifoRxdmaParityError",
301 CCE_ERR_STATUS_CCE_CLI1_ASYNC_FIFO_RXDMA_PARITY_ERROR_SMASK),
302 /*12*/ FLAG_ENTRY0("CceCli1AsyncFifoDbgParityError",
303 CCE_ERR_STATUS_CCE_CLI1_ASYNC_FIFO_DBG_PARITY_ERROR_SMASK),
304 /*13*/ FLAG_ENTRY0("PcicRetryMemCorErr",
305 CCE_ERR_STATUS_PCIC_RETRY_MEM_COR_ERR_SMASK),
306 /*14*/ FLAG_ENTRY0("PcicRetryMemCorErr",
307 CCE_ERR_STATUS_PCIC_RETRY_SOT_MEM_COR_ERR_SMASK),
308 /*15*/ FLAG_ENTRY0("PcicPostHdQCorErr",
309 CCE_ERR_STATUS_PCIC_POST_HD_QCOR_ERR_SMASK),
310 /*16*/ FLAG_ENTRY0("PcicPostHdQCorErr",
311 CCE_ERR_STATUS_PCIC_POST_DAT_QCOR_ERR_SMASK),
312 /*17*/ FLAG_ENTRY0("PcicPostHdQCorErr",
313 CCE_ERR_STATUS_PCIC_CPL_HD_QCOR_ERR_SMASK),
314 /*18*/ FLAG_ENTRY0("PcicCplDatQCorErr",
315 CCE_ERR_STATUS_PCIC_CPL_DAT_QCOR_ERR_SMASK),
316 /*19*/ FLAG_ENTRY0("PcicNPostHQParityErr",
317 CCE_ERR_STATUS_PCIC_NPOST_HQ_PARITY_ERR_SMASK),
318 /*20*/ FLAG_ENTRY0("PcicNPostDatQParityErr",
319 CCE_ERR_STATUS_PCIC_NPOST_DAT_QPARITY_ERR_SMASK),
320 /*21*/ FLAG_ENTRY0("PcicRetryMemUncErr",
321 CCE_ERR_STATUS_PCIC_RETRY_MEM_UNC_ERR_SMASK),
322 /*22*/ FLAG_ENTRY0("PcicRetrySotMemUncErr",
323 CCE_ERR_STATUS_PCIC_RETRY_SOT_MEM_UNC_ERR_SMASK),
324 /*23*/ FLAG_ENTRY0("PcicPostHdQUncErr",
325 CCE_ERR_STATUS_PCIC_POST_HD_QUNC_ERR_SMASK),
326 /*24*/ FLAG_ENTRY0("PcicPostDatQUncErr",
327 CCE_ERR_STATUS_PCIC_POST_DAT_QUNC_ERR_SMASK),
328 /*25*/ FLAG_ENTRY0("PcicCplHdQUncErr",
329 CCE_ERR_STATUS_PCIC_CPL_HD_QUNC_ERR_SMASK),
330 /*26*/ FLAG_ENTRY0("PcicCplDatQUncErr",
331 CCE_ERR_STATUS_PCIC_CPL_DAT_QUNC_ERR_SMASK),
332 /*27*/ FLAG_ENTRY0("PcicTransmitFrontParityErr",
333 CCE_ERR_STATUS_PCIC_TRANSMIT_FRONT_PARITY_ERR_SMASK),
334 /*28*/ FLAG_ENTRY0("PcicTransmitBackParityErr",
335 CCE_ERR_STATUS_PCIC_TRANSMIT_BACK_PARITY_ERR_SMASK),
336 /*29*/ FLAG_ENTRY0("PcicReceiveParityErr",
337 CCE_ERR_STATUS_PCIC_RECEIVE_PARITY_ERR_SMASK),
338 /*30*/ FLAG_ENTRY0("CceTrgtCplTimeoutErr",
339 CCE_ERR_STATUS_CCE_TRGT_CPL_TIMEOUT_ERR_SMASK),
340 /*31*/ FLAG_ENTRY0("LATriggered",
341 CCE_ERR_STATUS_LA_TRIGGERED_SMASK),
342 /*32*/ FLAG_ENTRY0("CceSegReadBadAddrErr",
343 CCE_ERR_STATUS_CCE_SEG_READ_BAD_ADDR_ERR_SMASK),
344 /*33*/ FLAG_ENTRY0("CceSegWriteBadAddrErr",
345 CCE_ERR_STATUS_CCE_SEG_WRITE_BAD_ADDR_ERR_SMASK),
346 /*34*/ FLAG_ENTRY0("CceRcplAsyncFifoParityErr",
347 CCE_ERR_STATUS_CCE_RCPL_ASYNC_FIFO_PARITY_ERR_SMASK),
348 /*35*/ FLAG_ENTRY0("CceRxdmaConvFifoParityErr",
349 CCE_ERR_STATUS_CCE_RXDMA_CONV_FIFO_PARITY_ERR_SMASK),
350 /*36*/ FLAG_ENTRY0("CceMsixTableCorErr",
351 CCE_ERR_STATUS_CCE_MSIX_TABLE_COR_ERR_SMASK),
352 /*37*/ FLAG_ENTRY0("CceMsixTableUncErr",
353 CCE_ERR_STATUS_CCE_MSIX_TABLE_UNC_ERR_SMASK),
354 /*38*/ FLAG_ENTRY0("CceIntMapCorErr",
355 CCE_ERR_STATUS_CCE_INT_MAP_COR_ERR_SMASK),
356 /*39*/ FLAG_ENTRY0("CceIntMapUncErr",
357 CCE_ERR_STATUS_CCE_INT_MAP_UNC_ERR_SMASK),
358 /*40*/ FLAG_ENTRY0("CceMsixCsrParityErr",
359 CCE_ERR_STATUS_CCE_MSIX_CSR_PARITY_ERR_SMASK),
360 /*41-63 reserved*/
361 };
362
363 /*
364 * Misc Error flags
365 */
366 #define MES(text) MISC_ERR_STATUS_MISC_##text##_ERR_SMASK
367 static struct flag_table misc_err_status_flags[] = {
368 /* 0*/ FLAG_ENTRY0("CSR_PARITY", MES(CSR_PARITY)),
369 /* 1*/ FLAG_ENTRY0("CSR_READ_BAD_ADDR", MES(CSR_READ_BAD_ADDR)),
370 /* 2*/ FLAG_ENTRY0("CSR_WRITE_BAD_ADDR", MES(CSR_WRITE_BAD_ADDR)),
371 /* 3*/ FLAG_ENTRY0("SBUS_WRITE_FAILED", MES(SBUS_WRITE_FAILED)),
372 /* 4*/ FLAG_ENTRY0("KEY_MISMATCH", MES(KEY_MISMATCH)),
373 /* 5*/ FLAG_ENTRY0("FW_AUTH_FAILED", MES(FW_AUTH_FAILED)),
374 /* 6*/ FLAG_ENTRY0("EFUSE_CSR_PARITY", MES(EFUSE_CSR_PARITY)),
375 /* 7*/ FLAG_ENTRY0("EFUSE_READ_BAD_ADDR", MES(EFUSE_READ_BAD_ADDR)),
376 /* 8*/ FLAG_ENTRY0("EFUSE_WRITE", MES(EFUSE_WRITE)),
377 /* 9*/ FLAG_ENTRY0("EFUSE_DONE_PARITY", MES(EFUSE_DONE_PARITY)),
378 /*10*/ FLAG_ENTRY0("INVALID_EEP_CMD", MES(INVALID_EEP_CMD)),
379 /*11*/ FLAG_ENTRY0("MBIST_FAIL", MES(MBIST_FAIL)),
380 /*12*/ FLAG_ENTRY0("PLL_LOCK_FAIL", MES(PLL_LOCK_FAIL))
381 };
382
383 /*
384 * TXE PIO Error flags and consequences
385 */
386 static struct flag_table pio_err_status_flags[] = {
387 /* 0*/ FLAG_ENTRY("PioWriteBadCtxt",
388 SEC_WRITE_DROPPED,
389 SEND_PIO_ERR_STATUS_PIO_WRITE_BAD_CTXT_ERR_SMASK),
390 /* 1*/ FLAG_ENTRY("PioWriteAddrParity",
391 SEC_SPC_FREEZE,
392 SEND_PIO_ERR_STATUS_PIO_WRITE_ADDR_PARITY_ERR_SMASK),
393 /* 2*/ FLAG_ENTRY("PioCsrParity",
394 SEC_SPC_FREEZE,
395 SEND_PIO_ERR_STATUS_PIO_CSR_PARITY_ERR_SMASK),
396 /* 3*/ FLAG_ENTRY("PioSbMemFifo0",
397 SEC_SPC_FREEZE,
398 SEND_PIO_ERR_STATUS_PIO_SB_MEM_FIFO0_ERR_SMASK),
399 /* 4*/ FLAG_ENTRY("PioSbMemFifo1",
400 SEC_SPC_FREEZE,
401 SEND_PIO_ERR_STATUS_PIO_SB_MEM_FIFO1_ERR_SMASK),
402 /* 5*/ FLAG_ENTRY("PioPccFifoParity",
403 SEC_SPC_FREEZE,
404 SEND_PIO_ERR_STATUS_PIO_PCC_FIFO_PARITY_ERR_SMASK),
405 /* 6*/ FLAG_ENTRY("PioPecFifoParity",
406 SEC_SPC_FREEZE,
407 SEND_PIO_ERR_STATUS_PIO_PEC_FIFO_PARITY_ERR_SMASK),
408 /* 7*/ FLAG_ENTRY("PioSbrdctlCrrelParity",
409 SEC_SPC_FREEZE,
410 SEND_PIO_ERR_STATUS_PIO_SBRDCTL_CRREL_PARITY_ERR_SMASK),
411 /* 8*/ FLAG_ENTRY("PioSbrdctrlCrrelFifoParity",
412 SEC_SPC_FREEZE,
413 SEND_PIO_ERR_STATUS_PIO_SBRDCTRL_CRREL_FIFO_PARITY_ERR_SMASK),
414 /* 9*/ FLAG_ENTRY("PioPktEvictFifoParityErr",
415 SEC_SPC_FREEZE,
416 SEND_PIO_ERR_STATUS_PIO_PKT_EVICT_FIFO_PARITY_ERR_SMASK),
417 /*10*/ FLAG_ENTRY("PioSmPktResetParity",
418 SEC_SPC_FREEZE,
419 SEND_PIO_ERR_STATUS_PIO_SM_PKT_RESET_PARITY_ERR_SMASK),
420 /*11*/ FLAG_ENTRY("PioVlLenMemBank0Unc",
421 SEC_SPC_FREEZE,
422 SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK0_UNC_ERR_SMASK),
423 /*12*/ FLAG_ENTRY("PioVlLenMemBank1Unc",
424 SEC_SPC_FREEZE,
425 SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK1_UNC_ERR_SMASK),
426 /*13*/ FLAG_ENTRY("PioVlLenMemBank0Cor",
427 0,
428 SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK0_COR_ERR_SMASK),
429 /*14*/ FLAG_ENTRY("PioVlLenMemBank1Cor",
430 0,
431 SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK1_COR_ERR_SMASK),
432 /*15*/ FLAG_ENTRY("PioCreditRetFifoParity",
433 SEC_SPC_FREEZE,
434 SEND_PIO_ERR_STATUS_PIO_CREDIT_RET_FIFO_PARITY_ERR_SMASK),
435 /*16*/ FLAG_ENTRY("PioPpmcPblFifo",
436 SEC_SPC_FREEZE,
437 SEND_PIO_ERR_STATUS_PIO_PPMC_PBL_FIFO_ERR_SMASK),
438 /*17*/ FLAG_ENTRY("PioInitSmIn",
439 0,
440 SEND_PIO_ERR_STATUS_PIO_INIT_SM_IN_ERR_SMASK),
441 /*18*/ FLAG_ENTRY("PioPktEvictSmOrArbSm",
442 SEC_SPC_FREEZE,
443 SEND_PIO_ERR_STATUS_PIO_PKT_EVICT_SM_OR_ARB_SM_ERR_SMASK),
444 /*19*/ FLAG_ENTRY("PioHostAddrMemUnc",
445 SEC_SPC_FREEZE,
446 SEND_PIO_ERR_STATUS_PIO_HOST_ADDR_MEM_UNC_ERR_SMASK),
447 /*20*/ FLAG_ENTRY("PioHostAddrMemCor",
448 0,
449 SEND_PIO_ERR_STATUS_PIO_HOST_ADDR_MEM_COR_ERR_SMASK),
450 /*21*/ FLAG_ENTRY("PioWriteDataParity",
451 SEC_SPC_FREEZE,
452 SEND_PIO_ERR_STATUS_PIO_WRITE_DATA_PARITY_ERR_SMASK),
453 /*22*/ FLAG_ENTRY("PioStateMachine",
454 SEC_SPC_FREEZE,
455 SEND_PIO_ERR_STATUS_PIO_STATE_MACHINE_ERR_SMASK),
456 /*23*/ FLAG_ENTRY("PioWriteQwValidParity",
457 SEC_WRITE_DROPPED | SEC_SPC_FREEZE,
458 SEND_PIO_ERR_STATUS_PIO_WRITE_QW_VALID_PARITY_ERR_SMASK),
459 /*24*/ FLAG_ENTRY("PioBlockQwCountParity",
460 SEC_WRITE_DROPPED | SEC_SPC_FREEZE,
461 SEND_PIO_ERR_STATUS_PIO_BLOCK_QW_COUNT_PARITY_ERR_SMASK),
462 /*25*/ FLAG_ENTRY("PioVlfVlLenParity",
463 SEC_SPC_FREEZE,
464 SEND_PIO_ERR_STATUS_PIO_VLF_VL_LEN_PARITY_ERR_SMASK),
465 /*26*/ FLAG_ENTRY("PioVlfSopParity",
466 SEC_SPC_FREEZE,
467 SEND_PIO_ERR_STATUS_PIO_VLF_SOP_PARITY_ERR_SMASK),
468 /*27*/ FLAG_ENTRY("PioVlFifoParity",
469 SEC_SPC_FREEZE,
470 SEND_PIO_ERR_STATUS_PIO_VL_FIFO_PARITY_ERR_SMASK),
471 /*28*/ FLAG_ENTRY("PioPpmcBqcMemParity",
472 SEC_SPC_FREEZE,
473 SEND_PIO_ERR_STATUS_PIO_PPMC_BQC_MEM_PARITY_ERR_SMASK),
474 /*29*/ FLAG_ENTRY("PioPpmcSopLen",
475 SEC_SPC_FREEZE,
476 SEND_PIO_ERR_STATUS_PIO_PPMC_SOP_LEN_ERR_SMASK),
477 /*30-31 reserved*/
478 /*32*/ FLAG_ENTRY("PioCurrentFreeCntParity",
479 SEC_SPC_FREEZE,
480 SEND_PIO_ERR_STATUS_PIO_CURRENT_FREE_CNT_PARITY_ERR_SMASK),
481 /*33*/ FLAG_ENTRY("PioLastReturnedCntParity",
482 SEC_SPC_FREEZE,
483 SEND_PIO_ERR_STATUS_PIO_LAST_RETURNED_CNT_PARITY_ERR_SMASK),
484 /*34*/ FLAG_ENTRY("PioPccSopHeadParity",
485 SEC_SPC_FREEZE,
486 SEND_PIO_ERR_STATUS_PIO_PCC_SOP_HEAD_PARITY_ERR_SMASK),
487 /*35*/ FLAG_ENTRY("PioPecSopHeadParityErr",
488 SEC_SPC_FREEZE,
489 SEND_PIO_ERR_STATUS_PIO_PEC_SOP_HEAD_PARITY_ERR_SMASK),
490 /*36-63 reserved*/
491 };
492
493 /* TXE PIO errors that cause an SPC freeze */
494 #define ALL_PIO_FREEZE_ERR \
495 (SEND_PIO_ERR_STATUS_PIO_WRITE_ADDR_PARITY_ERR_SMASK \
496 | SEND_PIO_ERR_STATUS_PIO_CSR_PARITY_ERR_SMASK \
497 | SEND_PIO_ERR_STATUS_PIO_SB_MEM_FIFO0_ERR_SMASK \
498 | SEND_PIO_ERR_STATUS_PIO_SB_MEM_FIFO1_ERR_SMASK \
499 | SEND_PIO_ERR_STATUS_PIO_PCC_FIFO_PARITY_ERR_SMASK \
500 | SEND_PIO_ERR_STATUS_PIO_PEC_FIFO_PARITY_ERR_SMASK \
501 | SEND_PIO_ERR_STATUS_PIO_SBRDCTL_CRREL_PARITY_ERR_SMASK \
502 | SEND_PIO_ERR_STATUS_PIO_SBRDCTRL_CRREL_FIFO_PARITY_ERR_SMASK \
503 | SEND_PIO_ERR_STATUS_PIO_PKT_EVICT_FIFO_PARITY_ERR_SMASK \
504 | SEND_PIO_ERR_STATUS_PIO_SM_PKT_RESET_PARITY_ERR_SMASK \
505 | SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK0_UNC_ERR_SMASK \
506 | SEND_PIO_ERR_STATUS_PIO_VL_LEN_MEM_BANK1_UNC_ERR_SMASK \
507 | SEND_PIO_ERR_STATUS_PIO_CREDIT_RET_FIFO_PARITY_ERR_SMASK \
508 | SEND_PIO_ERR_STATUS_PIO_PPMC_PBL_FIFO_ERR_SMASK \
509 | SEND_PIO_ERR_STATUS_PIO_PKT_EVICT_SM_OR_ARB_SM_ERR_SMASK \
510 | SEND_PIO_ERR_STATUS_PIO_HOST_ADDR_MEM_UNC_ERR_SMASK \
511 | SEND_PIO_ERR_STATUS_PIO_WRITE_DATA_PARITY_ERR_SMASK \
512 | SEND_PIO_ERR_STATUS_PIO_STATE_MACHINE_ERR_SMASK \
513 | SEND_PIO_ERR_STATUS_PIO_WRITE_QW_VALID_PARITY_ERR_SMASK \
514 | SEND_PIO_ERR_STATUS_PIO_BLOCK_QW_COUNT_PARITY_ERR_SMASK \
515 | SEND_PIO_ERR_STATUS_PIO_VLF_VL_LEN_PARITY_ERR_SMASK \
516 | SEND_PIO_ERR_STATUS_PIO_VLF_SOP_PARITY_ERR_SMASK \
517 | SEND_PIO_ERR_STATUS_PIO_VL_FIFO_PARITY_ERR_SMASK \
518 | SEND_PIO_ERR_STATUS_PIO_PPMC_BQC_MEM_PARITY_ERR_SMASK \
519 | SEND_PIO_ERR_STATUS_PIO_PPMC_SOP_LEN_ERR_SMASK \
520 | SEND_PIO_ERR_STATUS_PIO_CURRENT_FREE_CNT_PARITY_ERR_SMASK \
521 | SEND_PIO_ERR_STATUS_PIO_LAST_RETURNED_CNT_PARITY_ERR_SMASK \
522 | SEND_PIO_ERR_STATUS_PIO_PCC_SOP_HEAD_PARITY_ERR_SMASK \
523 | SEND_PIO_ERR_STATUS_PIO_PEC_SOP_HEAD_PARITY_ERR_SMASK)
524
525 /*
526 * TXE SDMA Error flags
527 */
528 static struct flag_table sdma_err_status_flags[] = {
529 /* 0*/ FLAG_ENTRY0("SDmaRpyTagErr",
530 SEND_DMA_ERR_STATUS_SDMA_RPY_TAG_ERR_SMASK),
531 /* 1*/ FLAG_ENTRY0("SDmaCsrParityErr",
532 SEND_DMA_ERR_STATUS_SDMA_CSR_PARITY_ERR_SMASK),
533 /* 2*/ FLAG_ENTRY0("SDmaPcieReqTrackingUncErr",
534 SEND_DMA_ERR_STATUS_SDMA_PCIE_REQ_TRACKING_UNC_ERR_SMASK),
535 /* 3*/ FLAG_ENTRY0("SDmaPcieReqTrackingCorErr",
536 SEND_DMA_ERR_STATUS_SDMA_PCIE_REQ_TRACKING_COR_ERR_SMASK),
537 /*04-63 reserved*/
538 };
539
540 /* TXE SDMA errors that cause an SPC freeze */
541 #define ALL_SDMA_FREEZE_ERR \
542 (SEND_DMA_ERR_STATUS_SDMA_RPY_TAG_ERR_SMASK \
543 | SEND_DMA_ERR_STATUS_SDMA_CSR_PARITY_ERR_SMASK \
544 | SEND_DMA_ERR_STATUS_SDMA_PCIE_REQ_TRACKING_UNC_ERR_SMASK)
545
546 /* SendEgressErrInfo bits that correspond to a PortXmitDiscard counter */
547 #define PORT_DISCARD_EGRESS_ERRS \
548 (SEND_EGRESS_ERR_INFO_TOO_LONG_IB_PACKET_ERR_SMASK \
549 | SEND_EGRESS_ERR_INFO_VL_MAPPING_ERR_SMASK \
550 | SEND_EGRESS_ERR_INFO_VL_ERR_SMASK)
551
552 /*
553 * TXE Egress Error flags
554 */
555 #define SEES(text) SEND_EGRESS_ERR_STATUS_##text##_ERR_SMASK
556 static struct flag_table egress_err_status_flags[] = {
557 /* 0*/ FLAG_ENTRY0("TxPktIntegrityMemCorErr", SEES(TX_PKT_INTEGRITY_MEM_COR)),
558 /* 1*/ FLAG_ENTRY0("TxPktIntegrityMemUncErr", SEES(TX_PKT_INTEGRITY_MEM_UNC)),
559 /* 2 reserved */
560 /* 3*/ FLAG_ENTRY0("TxEgressFifoUnderrunOrParityErr",
561 SEES(TX_EGRESS_FIFO_UNDERRUN_OR_PARITY)),
562 /* 4*/ FLAG_ENTRY0("TxLinkdownErr", SEES(TX_LINKDOWN)),
563 /* 5*/ FLAG_ENTRY0("TxIncorrectLinkStateErr", SEES(TX_INCORRECT_LINK_STATE)),
564 /* 6 reserved */
565 /* 7*/ FLAG_ENTRY0("TxPioLaunchIntfParityErr",
566 SEES(TX_PIO_LAUNCH_INTF_PARITY)),
567 /* 8*/ FLAG_ENTRY0("TxSdmaLaunchIntfParityErr",
568 SEES(TX_SDMA_LAUNCH_INTF_PARITY)),
569 /* 9-10 reserved */
570 /*11*/ FLAG_ENTRY0("TxSbrdCtlStateMachineParityErr",
571 SEES(TX_SBRD_CTL_STATE_MACHINE_PARITY)),
572 /*12*/ FLAG_ENTRY0("TxIllegalVLErr", SEES(TX_ILLEGAL_VL)),
573 /*13*/ FLAG_ENTRY0("TxLaunchCsrParityErr", SEES(TX_LAUNCH_CSR_PARITY)),
574 /*14*/ FLAG_ENTRY0("TxSbrdCtlCsrParityErr", SEES(TX_SBRD_CTL_CSR_PARITY)),
575 /*15*/ FLAG_ENTRY0("TxConfigParityErr", SEES(TX_CONFIG_PARITY)),
576 /*16*/ FLAG_ENTRY0("TxSdma0DisallowedPacketErr",
577 SEES(TX_SDMA0_DISALLOWED_PACKET)),
578 /*17*/ FLAG_ENTRY0("TxSdma1DisallowedPacketErr",
579 SEES(TX_SDMA1_DISALLOWED_PACKET)),
580 /*18*/ FLAG_ENTRY0("TxSdma2DisallowedPacketErr",
581 SEES(TX_SDMA2_DISALLOWED_PACKET)),
582 /*19*/ FLAG_ENTRY0("TxSdma3DisallowedPacketErr",
583 SEES(TX_SDMA3_DISALLOWED_PACKET)),
584 /*20*/ FLAG_ENTRY0("TxSdma4DisallowedPacketErr",
585 SEES(TX_SDMA4_DISALLOWED_PACKET)),
586 /*21*/ FLAG_ENTRY0("TxSdma5DisallowedPacketErr",
587 SEES(TX_SDMA5_DISALLOWED_PACKET)),
588 /*22*/ FLAG_ENTRY0("TxSdma6DisallowedPacketErr",
589 SEES(TX_SDMA6_DISALLOWED_PACKET)),
590 /*23*/ FLAG_ENTRY0("TxSdma7DisallowedPacketErr",
591 SEES(TX_SDMA7_DISALLOWED_PACKET)),
592 /*24*/ FLAG_ENTRY0("TxSdma8DisallowedPacketErr",
593 SEES(TX_SDMA8_DISALLOWED_PACKET)),
594 /*25*/ FLAG_ENTRY0("TxSdma9DisallowedPacketErr",
595 SEES(TX_SDMA9_DISALLOWED_PACKET)),
596 /*26*/ FLAG_ENTRY0("TxSdma10DisallowedPacketErr",
597 SEES(TX_SDMA10_DISALLOWED_PACKET)),
598 /*27*/ FLAG_ENTRY0("TxSdma11DisallowedPacketErr",
599 SEES(TX_SDMA11_DISALLOWED_PACKET)),
600 /*28*/ FLAG_ENTRY0("TxSdma12DisallowedPacketErr",
601 SEES(TX_SDMA12_DISALLOWED_PACKET)),
602 /*29*/ FLAG_ENTRY0("TxSdma13DisallowedPacketErr",
603 SEES(TX_SDMA13_DISALLOWED_PACKET)),
604 /*30*/ FLAG_ENTRY0("TxSdma14DisallowedPacketErr",
605 SEES(TX_SDMA14_DISALLOWED_PACKET)),
606 /*31*/ FLAG_ENTRY0("TxSdma15DisallowedPacketErr",
607 SEES(TX_SDMA15_DISALLOWED_PACKET)),
608 /*32*/ FLAG_ENTRY0("TxLaunchFifo0UncOrParityErr",
609 SEES(TX_LAUNCH_FIFO0_UNC_OR_PARITY)),
610 /*33*/ FLAG_ENTRY0("TxLaunchFifo1UncOrParityErr",
611 SEES(TX_LAUNCH_FIFO1_UNC_OR_PARITY)),
612 /*34*/ FLAG_ENTRY0("TxLaunchFifo2UncOrParityErr",
613 SEES(TX_LAUNCH_FIFO2_UNC_OR_PARITY)),
614 /*35*/ FLAG_ENTRY0("TxLaunchFifo3UncOrParityErr",
615 SEES(TX_LAUNCH_FIFO3_UNC_OR_PARITY)),
616 /*36*/ FLAG_ENTRY0("TxLaunchFifo4UncOrParityErr",
617 SEES(TX_LAUNCH_FIFO4_UNC_OR_PARITY)),
618 /*37*/ FLAG_ENTRY0("TxLaunchFifo5UncOrParityErr",
619 SEES(TX_LAUNCH_FIFO5_UNC_OR_PARITY)),
620 /*38*/ FLAG_ENTRY0("TxLaunchFifo6UncOrParityErr",
621 SEES(TX_LAUNCH_FIFO6_UNC_OR_PARITY)),
622 /*39*/ FLAG_ENTRY0("TxLaunchFifo7UncOrParityErr",
623 SEES(TX_LAUNCH_FIFO7_UNC_OR_PARITY)),
624 /*40*/ FLAG_ENTRY0("TxLaunchFifo8UncOrParityErr",
625 SEES(TX_LAUNCH_FIFO8_UNC_OR_PARITY)),
626 /*41*/ FLAG_ENTRY0("TxCreditReturnParityErr", SEES(TX_CREDIT_RETURN_PARITY)),
627 /*42*/ FLAG_ENTRY0("TxSbHdrUncErr", SEES(TX_SB_HDR_UNC)),
628 /*43*/ FLAG_ENTRY0("TxReadSdmaMemoryUncErr", SEES(TX_READ_SDMA_MEMORY_UNC)),
629 /*44*/ FLAG_ENTRY0("TxReadPioMemoryUncErr", SEES(TX_READ_PIO_MEMORY_UNC)),
630 /*45*/ FLAG_ENTRY0("TxEgressFifoUncErr", SEES(TX_EGRESS_FIFO_UNC)),
631 /*46*/ FLAG_ENTRY0("TxHcrcInsertionErr", SEES(TX_HCRC_INSERTION)),
632 /*47*/ FLAG_ENTRY0("TxCreditReturnVLErr", SEES(TX_CREDIT_RETURN_VL)),
633 /*48*/ FLAG_ENTRY0("TxLaunchFifo0CorErr", SEES(TX_LAUNCH_FIFO0_COR)),
634 /*49*/ FLAG_ENTRY0("TxLaunchFifo1CorErr", SEES(TX_LAUNCH_FIFO1_COR)),
635 /*50*/ FLAG_ENTRY0("TxLaunchFifo2CorErr", SEES(TX_LAUNCH_FIFO2_COR)),
636 /*51*/ FLAG_ENTRY0("TxLaunchFifo3CorErr", SEES(TX_LAUNCH_FIFO3_COR)),
637 /*52*/ FLAG_ENTRY0("TxLaunchFifo4CorErr", SEES(TX_LAUNCH_FIFO4_COR)),
638 /*53*/ FLAG_ENTRY0("TxLaunchFifo5CorErr", SEES(TX_LAUNCH_FIFO5_COR)),
639 /*54*/ FLAG_ENTRY0("TxLaunchFifo6CorErr", SEES(TX_LAUNCH_FIFO6_COR)),
640 /*55*/ FLAG_ENTRY0("TxLaunchFifo7CorErr", SEES(TX_LAUNCH_FIFO7_COR)),
641 /*56*/ FLAG_ENTRY0("TxLaunchFifo8CorErr", SEES(TX_LAUNCH_FIFO8_COR)),
642 /*57*/ FLAG_ENTRY0("TxCreditOverrunErr", SEES(TX_CREDIT_OVERRUN)),
643 /*58*/ FLAG_ENTRY0("TxSbHdrCorErr", SEES(TX_SB_HDR_COR)),
644 /*59*/ FLAG_ENTRY0("TxReadSdmaMemoryCorErr", SEES(TX_READ_SDMA_MEMORY_COR)),
645 /*60*/ FLAG_ENTRY0("TxReadPioMemoryCorErr", SEES(TX_READ_PIO_MEMORY_COR)),
646 /*61*/ FLAG_ENTRY0("TxEgressFifoCorErr", SEES(TX_EGRESS_FIFO_COR)),
647 /*62*/ FLAG_ENTRY0("TxReadSdmaMemoryCsrUncErr",
648 SEES(TX_READ_SDMA_MEMORY_CSR_UNC)),
649 /*63*/ FLAG_ENTRY0("TxReadPioMemoryCsrUncErr",
650 SEES(TX_READ_PIO_MEMORY_CSR_UNC)),
651 };
652
653 /*
654 * TXE Egress Error Info flags
655 */
656 #define SEEI(text) SEND_EGRESS_ERR_INFO_##text##_ERR_SMASK
657 static struct flag_table egress_err_info_flags[] = {
658 /* 0*/ FLAG_ENTRY0("Reserved", 0ull),
659 /* 1*/ FLAG_ENTRY0("VLErr", SEEI(VL)),
660 /* 2*/ FLAG_ENTRY0("JobKeyErr", SEEI(JOB_KEY)),
661 /* 3*/ FLAG_ENTRY0("JobKeyErr", SEEI(JOB_KEY)),
662 /* 4*/ FLAG_ENTRY0("PartitionKeyErr", SEEI(PARTITION_KEY)),
663 /* 5*/ FLAG_ENTRY0("SLIDErr", SEEI(SLID)),
664 /* 6*/ FLAG_ENTRY0("OpcodeErr", SEEI(OPCODE)),
665 /* 7*/ FLAG_ENTRY0("VLMappingErr", SEEI(VL_MAPPING)),
666 /* 8*/ FLAG_ENTRY0("RawErr", SEEI(RAW)),
667 /* 9*/ FLAG_ENTRY0("RawIPv6Err", SEEI(RAW_IPV6)),
668 /*10*/ FLAG_ENTRY0("GRHErr", SEEI(GRH)),
669 /*11*/ FLAG_ENTRY0("BypassErr", SEEI(BYPASS)),
670 /*12*/ FLAG_ENTRY0("KDETHPacketsErr", SEEI(KDETH_PACKETS)),
671 /*13*/ FLAG_ENTRY0("NonKDETHPacketsErr", SEEI(NON_KDETH_PACKETS)),
672 /*14*/ FLAG_ENTRY0("TooSmallIBPacketsErr", SEEI(TOO_SMALL_IB_PACKETS)),
673 /*15*/ FLAG_ENTRY0("TooSmallBypassPacketsErr", SEEI(TOO_SMALL_BYPASS_PACKETS)),
674 /*16*/ FLAG_ENTRY0("PbcTestErr", SEEI(PBC_TEST)),
675 /*17*/ FLAG_ENTRY0("BadPktLenErr", SEEI(BAD_PKT_LEN)),
676 /*18*/ FLAG_ENTRY0("TooLongIBPacketErr", SEEI(TOO_LONG_IB_PACKET)),
677 /*19*/ FLAG_ENTRY0("TooLongBypassPacketsErr", SEEI(TOO_LONG_BYPASS_PACKETS)),
678 /*20*/ FLAG_ENTRY0("PbcStaticRateControlErr", SEEI(PBC_STATIC_RATE_CONTROL)),
679 /*21*/ FLAG_ENTRY0("BypassBadPktLenErr", SEEI(BAD_PKT_LEN)),
680 };
681
682 /* TXE Egress errors that cause an SPC freeze */
683 #define ALL_TXE_EGRESS_FREEZE_ERR \
684 (SEES(TX_EGRESS_FIFO_UNDERRUN_OR_PARITY) \
685 | SEES(TX_PIO_LAUNCH_INTF_PARITY) \
686 | SEES(TX_SDMA_LAUNCH_INTF_PARITY) \
687 | SEES(TX_SBRD_CTL_STATE_MACHINE_PARITY) \
688 | SEES(TX_LAUNCH_CSR_PARITY) \
689 | SEES(TX_SBRD_CTL_CSR_PARITY) \
690 | SEES(TX_CONFIG_PARITY) \
691 | SEES(TX_LAUNCH_FIFO0_UNC_OR_PARITY) \
692 | SEES(TX_LAUNCH_FIFO1_UNC_OR_PARITY) \
693 | SEES(TX_LAUNCH_FIFO2_UNC_OR_PARITY) \
694 | SEES(TX_LAUNCH_FIFO3_UNC_OR_PARITY) \
695 | SEES(TX_LAUNCH_FIFO4_UNC_OR_PARITY) \
696 | SEES(TX_LAUNCH_FIFO5_UNC_OR_PARITY) \
697 | SEES(TX_LAUNCH_FIFO6_UNC_OR_PARITY) \
698 | SEES(TX_LAUNCH_FIFO7_UNC_OR_PARITY) \
699 | SEES(TX_LAUNCH_FIFO8_UNC_OR_PARITY) \
700 | SEES(TX_CREDIT_RETURN_PARITY))
701
702 /*
703 * TXE Send error flags
704 */
705 #define SES(name) SEND_ERR_STATUS_SEND_##name##_ERR_SMASK
706 static struct flag_table send_err_status_flags[] = {
707 /* 0*/ FLAG_ENTRY0("SendCsrParityErr", SES(CSR_PARITY)),
708 /* 1*/ FLAG_ENTRY0("SendCsrReadBadAddrErr", SES(CSR_READ_BAD_ADDR)),
709 /* 2*/ FLAG_ENTRY0("SendCsrWriteBadAddrErr", SES(CSR_WRITE_BAD_ADDR))
710 };
711
712 /*
713 * TXE Send Context Error flags and consequences
714 */
715 static struct flag_table sc_err_status_flags[] = {
716 /* 0*/ FLAG_ENTRY("InconsistentSop",
717 SEC_PACKET_DROPPED | SEC_SC_HALTED,
718 SEND_CTXT_ERR_STATUS_PIO_INCONSISTENT_SOP_ERR_SMASK),
719 /* 1*/ FLAG_ENTRY("DisallowedPacket",
720 SEC_PACKET_DROPPED | SEC_SC_HALTED,
721 SEND_CTXT_ERR_STATUS_PIO_DISALLOWED_PACKET_ERR_SMASK),
722 /* 2*/ FLAG_ENTRY("WriteCrossesBoundary",
723 SEC_WRITE_DROPPED | SEC_SC_HALTED,
724 SEND_CTXT_ERR_STATUS_PIO_WRITE_CROSSES_BOUNDARY_ERR_SMASK),
725 /* 3*/ FLAG_ENTRY("WriteOverflow",
726 SEC_WRITE_DROPPED | SEC_SC_HALTED,
727 SEND_CTXT_ERR_STATUS_PIO_WRITE_OVERFLOW_ERR_SMASK),
728 /* 4*/ FLAG_ENTRY("WriteOutOfBounds",
729 SEC_WRITE_DROPPED | SEC_SC_HALTED,
730 SEND_CTXT_ERR_STATUS_PIO_WRITE_OUT_OF_BOUNDS_ERR_SMASK),
731 /* 5-63 reserved*/
732 };
733
734 /*
735 * RXE Receive Error flags
736 */
737 #define RXES(name) RCV_ERR_STATUS_RX_##name##_ERR_SMASK
738 static struct flag_table rxe_err_status_flags[] = {
739 /* 0*/ FLAG_ENTRY0("RxDmaCsrCorErr", RXES(DMA_CSR_COR)),
740 /* 1*/ FLAG_ENTRY0("RxDcIntfParityErr", RXES(DC_INTF_PARITY)),
741 /* 2*/ FLAG_ENTRY0("RxRcvHdrUncErr", RXES(RCV_HDR_UNC)),
742 /* 3*/ FLAG_ENTRY0("RxRcvHdrCorErr", RXES(RCV_HDR_COR)),
743 /* 4*/ FLAG_ENTRY0("RxRcvDataUncErr", RXES(RCV_DATA_UNC)),
744 /* 5*/ FLAG_ENTRY0("RxRcvDataCorErr", RXES(RCV_DATA_COR)),
745 /* 6*/ FLAG_ENTRY0("RxRcvQpMapTableUncErr", RXES(RCV_QP_MAP_TABLE_UNC)),
746 /* 7*/ FLAG_ENTRY0("RxRcvQpMapTableCorErr", RXES(RCV_QP_MAP_TABLE_COR)),
747 /* 8*/ FLAG_ENTRY0("RxRcvCsrParityErr", RXES(RCV_CSR_PARITY)),
748 /* 9*/ FLAG_ENTRY0("RxDcSopEopParityErr", RXES(DC_SOP_EOP_PARITY)),
749 /*10*/ FLAG_ENTRY0("RxDmaFlagUncErr", RXES(DMA_FLAG_UNC)),
750 /*11*/ FLAG_ENTRY0("RxDmaFlagCorErr", RXES(DMA_FLAG_COR)),
751 /*12*/ FLAG_ENTRY0("RxRcvFsmEncodingErr", RXES(RCV_FSM_ENCODING)),
752 /*13*/ FLAG_ENTRY0("RxRbufFreeListUncErr", RXES(RBUF_FREE_LIST_UNC)),
753 /*14*/ FLAG_ENTRY0("RxRbufFreeListCorErr", RXES(RBUF_FREE_LIST_COR)),
754 /*15*/ FLAG_ENTRY0("RxRbufLookupDesRegUncErr", RXES(RBUF_LOOKUP_DES_REG_UNC)),
755 /*16*/ FLAG_ENTRY0("RxRbufLookupDesRegUncCorErr",
756 RXES(RBUF_LOOKUP_DES_REG_UNC_COR)),
757 /*17*/ FLAG_ENTRY0("RxRbufLookupDesUncErr", RXES(RBUF_LOOKUP_DES_UNC)),
758 /*18*/ FLAG_ENTRY0("RxRbufLookupDesCorErr", RXES(RBUF_LOOKUP_DES_COR)),
759 /*19*/ FLAG_ENTRY0("RxRbufBlockListReadUncErr",
760 RXES(RBUF_BLOCK_LIST_READ_UNC)),
761 /*20*/ FLAG_ENTRY0("RxRbufBlockListReadCorErr",
762 RXES(RBUF_BLOCK_LIST_READ_COR)),
763 /*21*/ FLAG_ENTRY0("RxRbufCsrQHeadBufNumParityErr",
764 RXES(RBUF_CSR_QHEAD_BUF_NUM_PARITY)),
765 /*22*/ FLAG_ENTRY0("RxRbufCsrQEntCntParityErr",
766 RXES(RBUF_CSR_QENT_CNT_PARITY)),
767 /*23*/ FLAG_ENTRY0("RxRbufCsrQNextBufParityErr",
768 RXES(RBUF_CSR_QNEXT_BUF_PARITY)),
769 /*24*/ FLAG_ENTRY0("RxRbufCsrQVldBitParityErr",
770 RXES(RBUF_CSR_QVLD_BIT_PARITY)),
771 /*25*/ FLAG_ENTRY0("RxRbufCsrQHdPtrParityErr", RXES(RBUF_CSR_QHD_PTR_PARITY)),
772 /*26*/ FLAG_ENTRY0("RxRbufCsrQTlPtrParityErr", RXES(RBUF_CSR_QTL_PTR_PARITY)),
773 /*27*/ FLAG_ENTRY0("RxRbufCsrQNumOfPktParityErr",
774 RXES(RBUF_CSR_QNUM_OF_PKT_PARITY)),
775 /*28*/ FLAG_ENTRY0("RxRbufCsrQEOPDWParityErr", RXES(RBUF_CSR_QEOPDW_PARITY)),
776 /*29*/ FLAG_ENTRY0("RxRbufCtxIdParityErr", RXES(RBUF_CTX_ID_PARITY)),
777 /*30*/ FLAG_ENTRY0("RxRBufBadLookupErr", RXES(RBUF_BAD_LOOKUP)),
778 /*31*/ FLAG_ENTRY0("RxRbufFullErr", RXES(RBUF_FULL)),
779 /*32*/ FLAG_ENTRY0("RxRbufEmptyErr", RXES(RBUF_EMPTY)),
780 /*33*/ FLAG_ENTRY0("RxRbufFlRdAddrParityErr", RXES(RBUF_FL_RD_ADDR_PARITY)),
781 /*34*/ FLAG_ENTRY0("RxRbufFlWrAddrParityErr", RXES(RBUF_FL_WR_ADDR_PARITY)),
782 /*35*/ FLAG_ENTRY0("RxRbufFlInitdoneParityErr",
783 RXES(RBUF_FL_INITDONE_PARITY)),
784 /*36*/ FLAG_ENTRY0("RxRbufFlInitWrAddrParityErr",
785 RXES(RBUF_FL_INIT_WR_ADDR_PARITY)),
786 /*37*/ FLAG_ENTRY0("RxRbufNextFreeBufUncErr", RXES(RBUF_NEXT_FREE_BUF_UNC)),
787 /*38*/ FLAG_ENTRY0("RxRbufNextFreeBufCorErr", RXES(RBUF_NEXT_FREE_BUF_COR)),
788 /*39*/ FLAG_ENTRY0("RxLookupDesPart1UncErr", RXES(LOOKUP_DES_PART1_UNC)),
789 /*40*/ FLAG_ENTRY0("RxLookupDesPart1UncCorErr",
790 RXES(LOOKUP_DES_PART1_UNC_COR)),
791 /*41*/ FLAG_ENTRY0("RxLookupDesPart2ParityErr",
792 RXES(LOOKUP_DES_PART2_PARITY)),
793 /*42*/ FLAG_ENTRY0("RxLookupRcvArrayUncErr", RXES(LOOKUP_RCV_ARRAY_UNC)),
794 /*43*/ FLAG_ENTRY0("RxLookupRcvArrayCorErr", RXES(LOOKUP_RCV_ARRAY_COR)),
795 /*44*/ FLAG_ENTRY0("RxLookupCsrParityErr", RXES(LOOKUP_CSR_PARITY)),
796 /*45*/ FLAG_ENTRY0("RxHqIntrCsrParityErr", RXES(HQ_INTR_CSR_PARITY)),
797 /*46*/ FLAG_ENTRY0("RxHqIntrFsmErr", RXES(HQ_INTR_FSM)),
798 /*47*/ FLAG_ENTRY0("RxRbufDescPart1UncErr", RXES(RBUF_DESC_PART1_UNC)),
799 /*48*/ FLAG_ENTRY0("RxRbufDescPart1CorErr", RXES(RBUF_DESC_PART1_COR)),
800 /*49*/ FLAG_ENTRY0("RxRbufDescPart2UncErr", RXES(RBUF_DESC_PART2_UNC)),
801 /*50*/ FLAG_ENTRY0("RxRbufDescPart2CorErr", RXES(RBUF_DESC_PART2_COR)),
802 /*51*/ FLAG_ENTRY0("RxDmaHdrFifoRdUncErr", RXES(DMA_HDR_FIFO_RD_UNC)),
803 /*52*/ FLAG_ENTRY0("RxDmaHdrFifoRdCorErr", RXES(DMA_HDR_FIFO_RD_COR)),
804 /*53*/ FLAG_ENTRY0("RxDmaDataFifoRdUncErr", RXES(DMA_DATA_FIFO_RD_UNC)),
805 /*54*/ FLAG_ENTRY0("RxDmaDataFifoRdCorErr", RXES(DMA_DATA_FIFO_RD_COR)),
806 /*55*/ FLAG_ENTRY0("RxRbufDataUncErr", RXES(RBUF_DATA_UNC)),
807 /*56*/ FLAG_ENTRY0("RxRbufDataCorErr", RXES(RBUF_DATA_COR)),
808 /*57*/ FLAG_ENTRY0("RxDmaCsrParityErr", RXES(DMA_CSR_PARITY)),
809 /*58*/ FLAG_ENTRY0("RxDmaEqFsmEncodingErr", RXES(DMA_EQ_FSM_ENCODING)),
810 /*59*/ FLAG_ENTRY0("RxDmaDqFsmEncodingErr", RXES(DMA_DQ_FSM_ENCODING)),
811 /*60*/ FLAG_ENTRY0("RxDmaCsrUncErr", RXES(DMA_CSR_UNC)),
812 /*61*/ FLAG_ENTRY0("RxCsrReadBadAddrErr", RXES(CSR_READ_BAD_ADDR)),
813 /*62*/ FLAG_ENTRY0("RxCsrWriteBadAddrErr", RXES(CSR_WRITE_BAD_ADDR)),
814 /*63*/ FLAG_ENTRY0("RxCsrParityErr", RXES(CSR_PARITY))
815 };
816
817 /* RXE errors that will trigger an SPC freeze */
818 #define ALL_RXE_FREEZE_ERR \
819 (RCV_ERR_STATUS_RX_RCV_QP_MAP_TABLE_UNC_ERR_SMASK \
820 | RCV_ERR_STATUS_RX_RCV_CSR_PARITY_ERR_SMASK \
821 | RCV_ERR_STATUS_RX_DMA_FLAG_UNC_ERR_SMASK \
822 | RCV_ERR_STATUS_RX_RCV_FSM_ENCODING_ERR_SMASK \
823 | RCV_ERR_STATUS_RX_RBUF_FREE_LIST_UNC_ERR_SMASK \
824 | RCV_ERR_STATUS_RX_RBUF_LOOKUP_DES_REG_UNC_ERR_SMASK \
825 | RCV_ERR_STATUS_RX_RBUF_LOOKUP_DES_REG_UNC_COR_ERR_SMASK \
826 | RCV_ERR_STATUS_RX_RBUF_LOOKUP_DES_UNC_ERR_SMASK \
827 | RCV_ERR_STATUS_RX_RBUF_BLOCK_LIST_READ_UNC_ERR_SMASK \
828 | RCV_ERR_STATUS_RX_RBUF_CSR_QHEAD_BUF_NUM_PARITY_ERR_SMASK \
829 | RCV_ERR_STATUS_RX_RBUF_CSR_QENT_CNT_PARITY_ERR_SMASK \
830 | RCV_ERR_STATUS_RX_RBUF_CSR_QNEXT_BUF_PARITY_ERR_SMASK \
831 | RCV_ERR_STATUS_RX_RBUF_CSR_QVLD_BIT_PARITY_ERR_SMASK \
832 | RCV_ERR_STATUS_RX_RBUF_CSR_QHD_PTR_PARITY_ERR_SMASK \
833 | RCV_ERR_STATUS_RX_RBUF_CSR_QTL_PTR_PARITY_ERR_SMASK \
834 | RCV_ERR_STATUS_RX_RBUF_CSR_QNUM_OF_PKT_PARITY_ERR_SMASK \
835 | RCV_ERR_STATUS_RX_RBUF_CSR_QEOPDW_PARITY_ERR_SMASK \
836 | RCV_ERR_STATUS_RX_RBUF_CTX_ID_PARITY_ERR_SMASK \
837 | RCV_ERR_STATUS_RX_RBUF_BAD_LOOKUP_ERR_SMASK \
838 | RCV_ERR_STATUS_RX_RBUF_FULL_ERR_SMASK \
839 | RCV_ERR_STATUS_RX_RBUF_EMPTY_ERR_SMASK \
840 | RCV_ERR_STATUS_RX_RBUF_FL_RD_ADDR_PARITY_ERR_SMASK \
841 | RCV_ERR_STATUS_RX_RBUF_FL_WR_ADDR_PARITY_ERR_SMASK \
842 | RCV_ERR_STATUS_RX_RBUF_FL_INITDONE_PARITY_ERR_SMASK \
843 | RCV_ERR_STATUS_RX_RBUF_FL_INIT_WR_ADDR_PARITY_ERR_SMASK \
844 | RCV_ERR_STATUS_RX_RBUF_NEXT_FREE_BUF_UNC_ERR_SMASK \
845 | RCV_ERR_STATUS_RX_LOOKUP_DES_PART1_UNC_ERR_SMASK \
846 | RCV_ERR_STATUS_RX_LOOKUP_DES_PART1_UNC_COR_ERR_SMASK \
847 | RCV_ERR_STATUS_RX_LOOKUP_DES_PART2_PARITY_ERR_SMASK \
848 | RCV_ERR_STATUS_RX_LOOKUP_RCV_ARRAY_UNC_ERR_SMASK \
849 | RCV_ERR_STATUS_RX_LOOKUP_CSR_PARITY_ERR_SMASK \
850 | RCV_ERR_STATUS_RX_HQ_INTR_CSR_PARITY_ERR_SMASK \
851 | RCV_ERR_STATUS_RX_HQ_INTR_FSM_ERR_SMASK \
852 | RCV_ERR_STATUS_RX_RBUF_DESC_PART1_UNC_ERR_SMASK \
853 | RCV_ERR_STATUS_RX_RBUF_DESC_PART1_COR_ERR_SMASK \
854 | RCV_ERR_STATUS_RX_RBUF_DESC_PART2_UNC_ERR_SMASK \
855 | RCV_ERR_STATUS_RX_DMA_HDR_FIFO_RD_UNC_ERR_SMASK \
856 | RCV_ERR_STATUS_RX_DMA_DATA_FIFO_RD_UNC_ERR_SMASK \
857 | RCV_ERR_STATUS_RX_RBUF_DATA_UNC_ERR_SMASK \
858 | RCV_ERR_STATUS_RX_DMA_CSR_PARITY_ERR_SMASK \
859 | RCV_ERR_STATUS_RX_DMA_EQ_FSM_ENCODING_ERR_SMASK \
860 | RCV_ERR_STATUS_RX_DMA_DQ_FSM_ENCODING_ERR_SMASK \
861 | RCV_ERR_STATUS_RX_DMA_CSR_UNC_ERR_SMASK \
862 | RCV_ERR_STATUS_RX_CSR_PARITY_ERR_SMASK)
863
864 #define RXE_FREEZE_ABORT_MASK \
865 (RCV_ERR_STATUS_RX_DMA_CSR_UNC_ERR_SMASK | \
866 RCV_ERR_STATUS_RX_DMA_HDR_FIFO_RD_UNC_ERR_SMASK | \
867 RCV_ERR_STATUS_RX_DMA_DATA_FIFO_RD_UNC_ERR_SMASK)
868
869 /*
870 * DCC Error Flags
871 */
872 #define DCCE(name) DCC_ERR_FLG_##name##_SMASK
873 static struct flag_table dcc_err_flags[] = {
874 FLAG_ENTRY0("bad_l2_err", DCCE(BAD_L2_ERR)),
875 FLAG_ENTRY0("bad_sc_err", DCCE(BAD_SC_ERR)),
876 FLAG_ENTRY0("bad_mid_tail_err", DCCE(BAD_MID_TAIL_ERR)),
877 FLAG_ENTRY0("bad_preemption_err", DCCE(BAD_PREEMPTION_ERR)),
878 FLAG_ENTRY0("preemption_err", DCCE(PREEMPTION_ERR)),
879 FLAG_ENTRY0("preemptionvl15_err", DCCE(PREEMPTIONVL15_ERR)),
880 FLAG_ENTRY0("bad_vl_marker_err", DCCE(BAD_VL_MARKER_ERR)),
881 FLAG_ENTRY0("bad_dlid_target_err", DCCE(BAD_DLID_TARGET_ERR)),
882 FLAG_ENTRY0("bad_lver_err", DCCE(BAD_LVER_ERR)),
883 FLAG_ENTRY0("uncorrectable_err", DCCE(UNCORRECTABLE_ERR)),
884 FLAG_ENTRY0("bad_crdt_ack_err", DCCE(BAD_CRDT_ACK_ERR)),
885 FLAG_ENTRY0("unsup_pkt_type", DCCE(UNSUP_PKT_TYPE)),
886 FLAG_ENTRY0("bad_ctrl_flit_err", DCCE(BAD_CTRL_FLIT_ERR)),
887 FLAG_ENTRY0("event_cntr_parity_err", DCCE(EVENT_CNTR_PARITY_ERR)),
888 FLAG_ENTRY0("event_cntr_rollover_err", DCCE(EVENT_CNTR_ROLLOVER_ERR)),
889 FLAG_ENTRY0("link_err", DCCE(LINK_ERR)),
890 FLAG_ENTRY0("misc_cntr_rollover_err", DCCE(MISC_CNTR_ROLLOVER_ERR)),
891 FLAG_ENTRY0("bad_ctrl_dist_err", DCCE(BAD_CTRL_DIST_ERR)),
892 FLAG_ENTRY0("bad_tail_dist_err", DCCE(BAD_TAIL_DIST_ERR)),
893 FLAG_ENTRY0("bad_head_dist_err", DCCE(BAD_HEAD_DIST_ERR)),
894 FLAG_ENTRY0("nonvl15_state_err", DCCE(NONVL15_STATE_ERR)),
895 FLAG_ENTRY0("vl15_multi_err", DCCE(VL15_MULTI_ERR)),
896 FLAG_ENTRY0("bad_pkt_length_err", DCCE(BAD_PKT_LENGTH_ERR)),
897 FLAG_ENTRY0("unsup_vl_err", DCCE(UNSUP_VL_ERR)),
898 FLAG_ENTRY0("perm_nvl15_err", DCCE(PERM_NVL15_ERR)),
899 FLAG_ENTRY0("slid_zero_err", DCCE(SLID_ZERO_ERR)),
900 FLAG_ENTRY0("dlid_zero_err", DCCE(DLID_ZERO_ERR)),
901 FLAG_ENTRY0("length_mtu_err", DCCE(LENGTH_MTU_ERR)),
902 FLAG_ENTRY0("rx_early_drop_err", DCCE(RX_EARLY_DROP_ERR)),
903 FLAG_ENTRY0("late_short_err", DCCE(LATE_SHORT_ERR)),
904 FLAG_ENTRY0("late_long_err", DCCE(LATE_LONG_ERR)),
905 FLAG_ENTRY0("late_ebp_err", DCCE(LATE_EBP_ERR)),
906 FLAG_ENTRY0("fpe_tx_fifo_ovflw_err", DCCE(FPE_TX_FIFO_OVFLW_ERR)),
907 FLAG_ENTRY0("fpe_tx_fifo_unflw_err", DCCE(FPE_TX_FIFO_UNFLW_ERR)),
908 FLAG_ENTRY0("csr_access_blocked_host", DCCE(CSR_ACCESS_BLOCKED_HOST)),
909 FLAG_ENTRY0("csr_access_blocked_uc", DCCE(CSR_ACCESS_BLOCKED_UC)),
910 FLAG_ENTRY0("tx_ctrl_parity_err", DCCE(TX_CTRL_PARITY_ERR)),
911 FLAG_ENTRY0("tx_ctrl_parity_mbe_err", DCCE(TX_CTRL_PARITY_MBE_ERR)),
912 FLAG_ENTRY0("tx_sc_parity_err", DCCE(TX_SC_PARITY_ERR)),
913 FLAG_ENTRY0("rx_ctrl_parity_mbe_err", DCCE(RX_CTRL_PARITY_MBE_ERR)),
914 FLAG_ENTRY0("csr_parity_err", DCCE(CSR_PARITY_ERR)),
915 FLAG_ENTRY0("csr_inval_addr", DCCE(CSR_INVAL_ADDR)),
916 FLAG_ENTRY0("tx_byte_shft_parity_err", DCCE(TX_BYTE_SHFT_PARITY_ERR)),
917 FLAG_ENTRY0("rx_byte_shft_parity_err", DCCE(RX_BYTE_SHFT_PARITY_ERR)),
918 FLAG_ENTRY0("fmconfig_err", DCCE(FMCONFIG_ERR)),
919 FLAG_ENTRY0("rcvport_err", DCCE(RCVPORT_ERR)),
920 };
921
922 /*
923 * LCB error flags
924 */
925 #define LCBE(name) DC_LCB_ERR_FLG_##name##_SMASK
926 static struct flag_table lcb_err_flags[] = {
927 /* 0*/ FLAG_ENTRY0("CSR_PARITY_ERR", LCBE(CSR_PARITY_ERR)),
928 /* 1*/ FLAG_ENTRY0("INVALID_CSR_ADDR", LCBE(INVALID_CSR_ADDR)),
929 /* 2*/ FLAG_ENTRY0("RST_FOR_FAILED_DESKEW", LCBE(RST_FOR_FAILED_DESKEW)),
930 /* 3*/ FLAG_ENTRY0("ALL_LNS_FAILED_REINIT_TEST",
931 LCBE(ALL_LNS_FAILED_REINIT_TEST)),
932 /* 4*/ FLAG_ENTRY0("LOST_REINIT_STALL_OR_TOS", LCBE(LOST_REINIT_STALL_OR_TOS)),
933 /* 5*/ FLAG_ENTRY0("TX_LESS_THAN_FOUR_LNS", LCBE(TX_LESS_THAN_FOUR_LNS)),
934 /* 6*/ FLAG_ENTRY0("RX_LESS_THAN_FOUR_LNS", LCBE(RX_LESS_THAN_FOUR_LNS)),
935 /* 7*/ FLAG_ENTRY0("SEQ_CRC_ERR", LCBE(SEQ_CRC_ERR)),
936 /* 8*/ FLAG_ENTRY0("REINIT_FROM_PEER", LCBE(REINIT_FROM_PEER)),
937 /* 9*/ FLAG_ENTRY0("REINIT_FOR_LN_DEGRADE", LCBE(REINIT_FOR_LN_DEGRADE)),
938 /*10*/ FLAG_ENTRY0("CRC_ERR_CNT_HIT_LIMIT", LCBE(CRC_ERR_CNT_HIT_LIMIT)),
939 /*11*/ FLAG_ENTRY0("RCLK_STOPPED", LCBE(RCLK_STOPPED)),
940 /*12*/ FLAG_ENTRY0("UNEXPECTED_REPLAY_MARKER", LCBE(UNEXPECTED_REPLAY_MARKER)),
941 /*13*/ FLAG_ENTRY0("UNEXPECTED_ROUND_TRIP_MARKER",
942 LCBE(UNEXPECTED_ROUND_TRIP_MARKER)),
943 /*14*/ FLAG_ENTRY0("ILLEGAL_NULL_LTP", LCBE(ILLEGAL_NULL_LTP)),
944 /*15*/ FLAG_ENTRY0("ILLEGAL_FLIT_ENCODING", LCBE(ILLEGAL_FLIT_ENCODING)),
945 /*16*/ FLAG_ENTRY0("FLIT_INPUT_BUF_OFLW", LCBE(FLIT_INPUT_BUF_OFLW)),
946 /*17*/ FLAG_ENTRY0("VL_ACK_INPUT_BUF_OFLW", LCBE(VL_ACK_INPUT_BUF_OFLW)),
947 /*18*/ FLAG_ENTRY0("VL_ACK_INPUT_PARITY_ERR", LCBE(VL_ACK_INPUT_PARITY_ERR)),
948 /*19*/ FLAG_ENTRY0("VL_ACK_INPUT_WRONG_CRC_MODE",
949 LCBE(VL_ACK_INPUT_WRONG_CRC_MODE)),
950 /*20*/ FLAG_ENTRY0("FLIT_INPUT_BUF_MBE", LCBE(FLIT_INPUT_BUF_MBE)),
951 /*21*/ FLAG_ENTRY0("FLIT_INPUT_BUF_SBE", LCBE(FLIT_INPUT_BUF_SBE)),
952 /*22*/ FLAG_ENTRY0("REPLAY_BUF_MBE", LCBE(REPLAY_BUF_MBE)),
953 /*23*/ FLAG_ENTRY0("REPLAY_BUF_SBE", LCBE(REPLAY_BUF_SBE)),
954 /*24*/ FLAG_ENTRY0("CREDIT_RETURN_FLIT_MBE", LCBE(CREDIT_RETURN_FLIT_MBE)),
955 /*25*/ FLAG_ENTRY0("RST_FOR_LINK_TIMEOUT", LCBE(RST_FOR_LINK_TIMEOUT)),
956 /*26*/ FLAG_ENTRY0("RST_FOR_INCOMPLT_RND_TRIP",
957 LCBE(RST_FOR_INCOMPLT_RND_TRIP)),
958 /*27*/ FLAG_ENTRY0("HOLD_REINIT", LCBE(HOLD_REINIT)),
959 /*28*/ FLAG_ENTRY0("NEG_EDGE_LINK_TRANSFER_ACTIVE",
960 LCBE(NEG_EDGE_LINK_TRANSFER_ACTIVE)),
961 /*29*/ FLAG_ENTRY0("REDUNDANT_FLIT_PARITY_ERR",
962 LCBE(REDUNDANT_FLIT_PARITY_ERR))
963 };
964
965 /*
966 * DC8051 Error Flags
967 */
968 #define D8E(name) DC_DC8051_ERR_FLG_##name##_SMASK
969 static struct flag_table dc8051_err_flags[] = {
970 FLAG_ENTRY0("SET_BY_8051", D8E(SET_BY_8051)),
971 FLAG_ENTRY0("LOST_8051_HEART_BEAT", D8E(LOST_8051_HEART_BEAT)),
972 FLAG_ENTRY0("CRAM_MBE", D8E(CRAM_MBE)),
973 FLAG_ENTRY0("CRAM_SBE", D8E(CRAM_SBE)),
974 FLAG_ENTRY0("DRAM_MBE", D8E(DRAM_MBE)),
975 FLAG_ENTRY0("DRAM_SBE", D8E(DRAM_SBE)),
976 FLAG_ENTRY0("IRAM_MBE", D8E(IRAM_MBE)),
977 FLAG_ENTRY0("IRAM_SBE", D8E(IRAM_SBE)),
978 FLAG_ENTRY0("UNMATCHED_SECURE_MSG_ACROSS_BCC_LANES",
979 D8E(UNMATCHED_SECURE_MSG_ACROSS_BCC_LANES)),
980 FLAG_ENTRY0("INVALID_CSR_ADDR", D8E(INVALID_CSR_ADDR)),
981 };
982
983 /*
984 * DC8051 Information Error flags
985 *
986 * Flags in DC8051_DBG_ERR_INFO_SET_BY_8051.ERROR field.
987 */
988 static struct flag_table dc8051_info_err_flags[] = {
989 FLAG_ENTRY0("Spico ROM check failed", SPICO_ROM_FAILED),
990 FLAG_ENTRY0("Unknown frame received", UNKNOWN_FRAME),
991 FLAG_ENTRY0("Target BER not met", TARGET_BER_NOT_MET),
992 FLAG_ENTRY0("Serdes internal loopback failure",
993 FAILED_SERDES_INTERNAL_LOOPBACK),
994 FLAG_ENTRY0("Failed SerDes init", FAILED_SERDES_INIT),
995 FLAG_ENTRY0("Failed LNI(Polling)", FAILED_LNI_POLLING),
996 FLAG_ENTRY0("Failed LNI(Debounce)", FAILED_LNI_DEBOUNCE),
997 FLAG_ENTRY0("Failed LNI(EstbComm)", FAILED_LNI_ESTBCOMM),
998 FLAG_ENTRY0("Failed LNI(OptEq)", FAILED_LNI_OPTEQ),
999 FLAG_ENTRY0("Failed LNI(VerifyCap_1)", FAILED_LNI_VERIFY_CAP1),
1000 FLAG_ENTRY0("Failed LNI(VerifyCap_2)", FAILED_LNI_VERIFY_CAP2),
1001 FLAG_ENTRY0("Failed LNI(ConfigLT)", FAILED_LNI_CONFIGLT),
1002 FLAG_ENTRY0("Host Handshake Timeout", HOST_HANDSHAKE_TIMEOUT),
1003 FLAG_ENTRY0("External Device Request Timeout",
1004 EXTERNAL_DEVICE_REQ_TIMEOUT),
1005 };
1006
1007 /*
1008 * DC8051 Information Host Information flags
1009 *
1010 * Flags in DC8051_DBG_ERR_INFO_SET_BY_8051.HOST_MSG field.
1011 */
1012 static struct flag_table dc8051_info_host_msg_flags[] = {
1013 FLAG_ENTRY0("Host request done", 0x0001),
1014 FLAG_ENTRY0("BC PWR_MGM message", 0x0002),
1015 FLAG_ENTRY0("BC SMA message", 0x0004),
1016 FLAG_ENTRY0("BC Unknown message (BCC)", 0x0008),
1017 FLAG_ENTRY0("BC Unknown message (LCB)", 0x0010),
1018 FLAG_ENTRY0("External device config request", 0x0020),
1019 FLAG_ENTRY0("VerifyCap all frames received", 0x0040),
1020 FLAG_ENTRY0("LinkUp achieved", 0x0080),
1021 FLAG_ENTRY0("Link going down", 0x0100),
1022 FLAG_ENTRY0("Link width downgraded", 0x0200),
1023 };
1024
1025 static u32 encoded_size(u32 size);
1026 static u32 chip_to_opa_lstate(struct hfi1_devdata *dd, u32 chip_lstate);
1027 static int set_physical_link_state(struct hfi1_devdata *dd, u64 state);
1028 static void read_vc_remote_phy(struct hfi1_devdata *dd, u8 *power_management,
1029 u8 *continuous);
1030 static void read_vc_remote_fabric(struct hfi1_devdata *dd, u8 *vau, u8 *z,
1031 u8 *vcu, u16 *vl15buf, u8 *crc_sizes);
1032 static void read_vc_remote_link_width(struct hfi1_devdata *dd,
1033 u8 *remote_tx_rate, u16 *link_widths);
1034 static void read_vc_local_link_mode(struct hfi1_devdata *dd, u8 *misc_bits,
1035 u8 *flag_bits, u16 *link_widths);
1036 static void read_remote_device_id(struct hfi1_devdata *dd, u16 *device_id,
1037 u8 *device_rev);
1038 static void read_local_lni(struct hfi1_devdata *dd, u8 *enable_lane_rx);
1039 static int read_tx_settings(struct hfi1_devdata *dd, u8 *enable_lane_tx,
1040 u8 *tx_polarity_inversion,
1041 u8 *rx_polarity_inversion, u8 *max_rate);
1042 static void handle_sdma_eng_err(struct hfi1_devdata *dd,
1043 unsigned int context, u64 err_status);
1044 static void handle_qsfp_int(struct hfi1_devdata *dd, u32 source, u64 reg);
1045 static void handle_dcc_err(struct hfi1_devdata *dd,
1046 unsigned int context, u64 err_status);
1047 static void handle_lcb_err(struct hfi1_devdata *dd,
1048 unsigned int context, u64 err_status);
1049 static void handle_8051_interrupt(struct hfi1_devdata *dd, u32 unused, u64 reg);
1050 static void handle_cce_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1051 static void handle_rxe_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1052 static void handle_misc_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1053 static void handle_pio_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1054 static void handle_sdma_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1055 static void handle_egress_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1056 static void handle_txe_err(struct hfi1_devdata *dd, u32 unused, u64 reg);
1057 static void set_partition_keys(struct hfi1_pportdata *ppd);
1058 static const char *link_state_name(u32 state);
1059 static const char *link_state_reason_name(struct hfi1_pportdata *ppd,
1060 u32 state);
1061 static int do_8051_command(struct hfi1_devdata *dd, u32 type, u64 in_data,
1062 u64 *out_data);
1063 static int read_idle_sma(struct hfi1_devdata *dd, u64 *data);
1064 static int thermal_init(struct hfi1_devdata *dd);
1065
1066 static void update_statusp(struct hfi1_pportdata *ppd, u32 state);
1067 static int wait_phys_link_offline_substates(struct hfi1_pportdata *ppd,
1068 int msecs);
1069 static int wait_logical_linkstate(struct hfi1_pportdata *ppd, u32 state,
1070 int msecs);
1071 static void log_state_transition(struct hfi1_pportdata *ppd, u32 state);
1072 static void log_physical_state(struct hfi1_pportdata *ppd, u32 state);
1073 static int wait_physical_linkstate(struct hfi1_pportdata *ppd, u32 state,
1074 int msecs);
1075 static int wait_phys_link_out_of_offline(struct hfi1_pportdata *ppd,
1076 int msecs);
1077 static void read_planned_down_reason_code(struct hfi1_devdata *dd, u8 *pdrrc);
1078 static void read_link_down_reason(struct hfi1_devdata *dd, u8 *ldr);
1079 static void handle_temp_err(struct hfi1_devdata *dd);
1080 static void dc_shutdown(struct hfi1_devdata *dd);
1081 static void dc_start(struct hfi1_devdata *dd);
1082 static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
1083 unsigned int *np);
1084 static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd);
1085 static int wait_link_transfer_active(struct hfi1_devdata *dd, int wait_ms);
1086 static void clear_rsm_rule(struct hfi1_devdata *dd, u8 rule_index);
1087 static void update_xmit_counters(struct hfi1_pportdata *ppd, u16 link_width);
1088
1089 /*
1090 * Error interrupt table entry. This is used as input to the interrupt
1091 * "clear down" routine used for all second tier error interrupt register.
1092 * Second tier interrupt registers have a single bit representing them
1093 * in the top-level CceIntStatus.
1094 */
1095 struct err_reg_info {
1096 u32 status; /* status CSR offset */
1097 u32 clear; /* clear CSR offset */
1098 u32 mask; /* mask CSR offset */
1099 void (*handler)(struct hfi1_devdata *dd, u32 source, u64 reg);
1100 const char *desc;
1101 };
1102
1103 #define NUM_MISC_ERRS (IS_GENERAL_ERR_END + 1 - IS_GENERAL_ERR_START)
1104 #define NUM_DC_ERRS (IS_DC_END + 1 - IS_DC_START)
1105 #define NUM_VARIOUS (IS_VARIOUS_END + 1 - IS_VARIOUS_START)
1106
1107 /*
1108 * Helpers for building HFI and DC error interrupt table entries. Different
1109 * helpers are needed because of inconsistent register names.
1110 */
1111 #define EE(reg, handler, desc) \
1112 { reg##_STATUS, reg##_CLEAR, reg##_MASK, \
1113 handler, desc }
1114 #define DC_EE1(reg, handler, desc) \
1115 { reg##_FLG, reg##_FLG_CLR, reg##_FLG_EN, handler, desc }
1116 #define DC_EE2(reg, handler, desc) \
1117 { reg##_FLG, reg##_CLR, reg##_EN, handler, desc }
1118
1119 /*
1120 * Table of the "misc" grouping of error interrupts. Each entry refers to
1121 * another register containing more information.
1122 */
1123 static const struct err_reg_info misc_errs[NUM_MISC_ERRS] = {
1124 /* 0*/ EE(CCE_ERR, handle_cce_err, "CceErr"),
1125 /* 1*/ EE(RCV_ERR, handle_rxe_err, "RxeErr"),
1126 /* 2*/ EE(MISC_ERR, handle_misc_err, "MiscErr"),
1127 /* 3*/ { 0, 0, 0, NULL }, /* reserved */
1128 /* 4*/ EE(SEND_PIO_ERR, handle_pio_err, "PioErr"),
1129 /* 5*/ EE(SEND_DMA_ERR, handle_sdma_err, "SDmaErr"),
1130 /* 6*/ EE(SEND_EGRESS_ERR, handle_egress_err, "EgressErr"),
1131 /* 7*/ EE(SEND_ERR, handle_txe_err, "TxeErr")
1132 /* the rest are reserved */
1133 };
1134
1135 /*
1136 * Index into the Various section of the interrupt sources
1137 * corresponding to the Critical Temperature interrupt.
1138 */
1139 #define TCRIT_INT_SOURCE 4
1140
1141 /*
1142 * SDMA error interrupt entry - refers to another register containing more
1143 * information.
1144 */
1145 static const struct err_reg_info sdma_eng_err =
1146 EE(SEND_DMA_ENG_ERR, handle_sdma_eng_err, "SDmaEngErr");
1147
1148 static const struct err_reg_info various_err[NUM_VARIOUS] = {
1149 /* 0*/ { 0, 0, 0, NULL }, /* PbcInt */
1150 /* 1*/ { 0, 0, 0, NULL }, /* GpioAssertInt */
1151 /* 2*/ EE(ASIC_QSFP1, handle_qsfp_int, "QSFP1"),
1152 /* 3*/ EE(ASIC_QSFP2, handle_qsfp_int, "QSFP2"),
1153 /* 4*/ { 0, 0, 0, NULL }, /* TCritInt */
1154 /* rest are reserved */
1155 };
1156
1157 /*
1158 * The DC encoding of mtu_cap for 10K MTU in the DCC_CFG_PORT_CONFIG
1159 * register can not be derived from the MTU value because 10K is not
1160 * a power of 2. Therefore, we need a constant. Everything else can
1161 * be calculated.
1162 */
1163 #define DCC_CFG_PORT_MTU_CAP_10240 7
1164
1165 /*
1166 * Table of the DC grouping of error interrupts. Each entry refers to
1167 * another register containing more information.
1168 */
1169 static const struct err_reg_info dc_errs[NUM_DC_ERRS] = {
1170 /* 0*/ DC_EE1(DCC_ERR, handle_dcc_err, "DCC Err"),
1171 /* 1*/ DC_EE2(DC_LCB_ERR, handle_lcb_err, "LCB Err"),
1172 /* 2*/ DC_EE2(DC_DC8051_ERR, handle_8051_interrupt, "DC8051 Interrupt"),
1173 /* 3*/ /* dc_lbm_int - special, see is_dc_int() */
1174 /* the rest are reserved */
1175 };
1176
1177 struct cntr_entry {
1178 /*
1179 * counter name
1180 */
1181 char *name;
1182
1183 /*
1184 * csr to read for name (if applicable)
1185 */
1186 u64 csr;
1187
1188 /*
1189 * offset into dd or ppd to store the counter's value
1190 */
1191 int offset;
1192
1193 /*
1194 * flags
1195 */
1196 u8 flags;
1197
1198 /*
1199 * accessor for stat element, context either dd or ppd
1200 */
1201 u64 (*rw_cntr)(const struct cntr_entry *, void *context, int vl,
1202 int mode, u64 data);
1203 };
1204
1205 #define C_RCV_HDR_OVF_FIRST C_RCV_HDR_OVF_0
1206 #define C_RCV_HDR_OVF_LAST C_RCV_HDR_OVF_159
1207
1208 #define CNTR_ELEM(name, csr, offset, flags, accessor) \
1209 { \
1210 name, \
1211 csr, \
1212 offset, \
1213 flags, \
1214 accessor \
1215 }
1216
1217 /* 32bit RXE */
1218 #define RXE32_PORT_CNTR_ELEM(name, counter, flags) \
1219 CNTR_ELEM(#name, \
1220 (counter * 8 + RCV_COUNTER_ARRAY32), \
1221 0, flags | CNTR_32BIT, \
1222 port_access_u32_csr)
1223
1224 #define RXE32_DEV_CNTR_ELEM(name, counter, flags) \
1225 CNTR_ELEM(#name, \
1226 (counter * 8 + RCV_COUNTER_ARRAY32), \
1227 0, flags | CNTR_32BIT, \
1228 dev_access_u32_csr)
1229
1230 /* 64bit RXE */
1231 #define RXE64_PORT_CNTR_ELEM(name, counter, flags) \
1232 CNTR_ELEM(#name, \
1233 (counter * 8 + RCV_COUNTER_ARRAY64), \
1234 0, flags, \
1235 port_access_u64_csr)
1236
1237 #define RXE64_DEV_CNTR_ELEM(name, counter, flags) \
1238 CNTR_ELEM(#name, \
1239 (counter * 8 + RCV_COUNTER_ARRAY64), \
1240 0, flags, \
1241 dev_access_u64_csr)
1242
1243 #define OVR_LBL(ctx) C_RCV_HDR_OVF_ ## ctx
1244 #define OVR_ELM(ctx) \
1245 CNTR_ELEM("RcvHdrOvr" #ctx, \
1246 (RCV_HDR_OVFL_CNT + ctx * 0x100), \
1247 0, CNTR_NORMAL, port_access_u64_csr)
1248
1249 /* 32bit TXE */
1250 #define TXE32_PORT_CNTR_ELEM(name, counter, flags) \
1251 CNTR_ELEM(#name, \
1252 (counter * 8 + SEND_COUNTER_ARRAY32), \
1253 0, flags | CNTR_32BIT, \
1254 port_access_u32_csr)
1255
1256 /* 64bit TXE */
1257 #define TXE64_PORT_CNTR_ELEM(name, counter, flags) \
1258 CNTR_ELEM(#name, \
1259 (counter * 8 + SEND_COUNTER_ARRAY64), \
1260 0, flags, \
1261 port_access_u64_csr)
1262
1263 # define TX64_DEV_CNTR_ELEM(name, counter, flags) \
1264 CNTR_ELEM(#name,\
1265 counter * 8 + SEND_COUNTER_ARRAY64, \
1266 0, \
1267 flags, \
1268 dev_access_u64_csr)
1269
1270 /* CCE */
1271 #define CCE_PERF_DEV_CNTR_ELEM(name, counter, flags) \
1272 CNTR_ELEM(#name, \
1273 (counter * 8 + CCE_COUNTER_ARRAY32), \
1274 0, flags | CNTR_32BIT, \
1275 dev_access_u32_csr)
1276
1277 #define CCE_INT_DEV_CNTR_ELEM(name, counter, flags) \
1278 CNTR_ELEM(#name, \
1279 (counter * 8 + CCE_INT_COUNTER_ARRAY32), \
1280 0, flags | CNTR_32BIT, \
1281 dev_access_u32_csr)
1282
1283 /* DC */
1284 #define DC_PERF_CNTR(name, counter, flags) \
1285 CNTR_ELEM(#name, \
1286 counter, \
1287 0, \
1288 flags, \
1289 dev_access_u64_csr)
1290
1291 #define DC_PERF_CNTR_LCB(name, counter, flags) \
1292 CNTR_ELEM(#name, \
1293 counter, \
1294 0, \
1295 flags, \
1296 dc_access_lcb_cntr)
1297
1298 /* ibp counters */
1299 #define SW_IBP_CNTR(name, cntr) \
1300 CNTR_ELEM(#name, \
1301 0, \
1302 0, \
1303 CNTR_SYNTH, \
1304 access_ibp_##cntr)
1305
1306 /**
1307 * hfi_addr_from_offset - return addr for readq/writeq
1308 * @dd - the dd device
1309 * @offset - the offset of the CSR within bar0
1310 *
1311 * This routine selects the appropriate base address
1312 * based on the indicated offset.
1313 */
hfi1_addr_from_offset(const struct hfi1_devdata * dd,u32 offset)1314 static inline void __iomem *hfi1_addr_from_offset(
1315 const struct hfi1_devdata *dd,
1316 u32 offset)
1317 {
1318 if (offset >= dd->base2_start)
1319 return dd->kregbase2 + (offset - dd->base2_start);
1320 return dd->kregbase1 + offset;
1321 }
1322
1323 /**
1324 * read_csr - read CSR at the indicated offset
1325 * @dd - the dd device
1326 * @offset - the offset of the CSR within bar0
1327 *
1328 * Return: the value read or all FF's if there
1329 * is no mapping
1330 */
read_csr(const struct hfi1_devdata * dd,u32 offset)1331 u64 read_csr(const struct hfi1_devdata *dd, u32 offset)
1332 {
1333 if (dd->flags & HFI1_PRESENT)
1334 return readq(hfi1_addr_from_offset(dd, offset));
1335 return -1;
1336 }
1337
1338 /**
1339 * write_csr - write CSR at the indicated offset
1340 * @dd - the dd device
1341 * @offset - the offset of the CSR within bar0
1342 * @value - value to write
1343 */
write_csr(const struct hfi1_devdata * dd,u32 offset,u64 value)1344 void write_csr(const struct hfi1_devdata *dd, u32 offset, u64 value)
1345 {
1346 if (dd->flags & HFI1_PRESENT) {
1347 void __iomem *base = hfi1_addr_from_offset(dd, offset);
1348
1349 /* avoid write to RcvArray */
1350 if (WARN_ON(offset >= RCV_ARRAY && offset < dd->base2_start))
1351 return;
1352 writeq(value, base);
1353 }
1354 }
1355
1356 /**
1357 * get_csr_addr - return te iomem address for offset
1358 * @dd - the dd device
1359 * @offset - the offset of the CSR within bar0
1360 *
1361 * Return: The iomem address to use in subsequent
1362 * writeq/readq operations.
1363 */
get_csr_addr(const struct hfi1_devdata * dd,u32 offset)1364 void __iomem *get_csr_addr(
1365 const struct hfi1_devdata *dd,
1366 u32 offset)
1367 {
1368 if (dd->flags & HFI1_PRESENT)
1369 return hfi1_addr_from_offset(dd, offset);
1370 return NULL;
1371 }
1372
read_write_csr(const struct hfi1_devdata * dd,u32 csr,int mode,u64 value)1373 static inline u64 read_write_csr(const struct hfi1_devdata *dd, u32 csr,
1374 int mode, u64 value)
1375 {
1376 u64 ret;
1377
1378 if (mode == CNTR_MODE_R) {
1379 ret = read_csr(dd, csr);
1380 } else if (mode == CNTR_MODE_W) {
1381 write_csr(dd, csr, value);
1382 ret = value;
1383 } else {
1384 dd_dev_err(dd, "Invalid cntr register access mode");
1385 return 0;
1386 }
1387
1388 hfi1_cdbg(CNTR, "csr 0x%x val 0x%llx mode %d", csr, ret, mode);
1389 return ret;
1390 }
1391
1392 /* Dev Access */
dev_access_u32_csr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1393 static u64 dev_access_u32_csr(const struct cntr_entry *entry,
1394 void *context, int vl, int mode, u64 data)
1395 {
1396 struct hfi1_devdata *dd = context;
1397 u64 csr = entry->csr;
1398
1399 if (entry->flags & CNTR_SDMA) {
1400 if (vl == CNTR_INVALID_VL)
1401 return 0;
1402 csr += 0x100 * vl;
1403 } else {
1404 if (vl != CNTR_INVALID_VL)
1405 return 0;
1406 }
1407 return read_write_csr(dd, csr, mode, data);
1408 }
1409
access_sde_err_cnt(const struct cntr_entry * entry,void * context,int idx,int mode,u64 data)1410 static u64 access_sde_err_cnt(const struct cntr_entry *entry,
1411 void *context, int idx, int mode, u64 data)
1412 {
1413 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1414
1415 if (dd->per_sdma && idx < dd->num_sdma)
1416 return dd->per_sdma[idx].err_cnt;
1417 return 0;
1418 }
1419
access_sde_int_cnt(const struct cntr_entry * entry,void * context,int idx,int mode,u64 data)1420 static u64 access_sde_int_cnt(const struct cntr_entry *entry,
1421 void *context, int idx, int mode, u64 data)
1422 {
1423 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1424
1425 if (dd->per_sdma && idx < dd->num_sdma)
1426 return dd->per_sdma[idx].sdma_int_cnt;
1427 return 0;
1428 }
1429
access_sde_idle_int_cnt(const struct cntr_entry * entry,void * context,int idx,int mode,u64 data)1430 static u64 access_sde_idle_int_cnt(const struct cntr_entry *entry,
1431 void *context, int idx, int mode, u64 data)
1432 {
1433 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1434
1435 if (dd->per_sdma && idx < dd->num_sdma)
1436 return dd->per_sdma[idx].idle_int_cnt;
1437 return 0;
1438 }
1439
access_sde_progress_int_cnt(const struct cntr_entry * entry,void * context,int idx,int mode,u64 data)1440 static u64 access_sde_progress_int_cnt(const struct cntr_entry *entry,
1441 void *context, int idx, int mode,
1442 u64 data)
1443 {
1444 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1445
1446 if (dd->per_sdma && idx < dd->num_sdma)
1447 return dd->per_sdma[idx].progress_int_cnt;
1448 return 0;
1449 }
1450
dev_access_u64_csr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1451 static u64 dev_access_u64_csr(const struct cntr_entry *entry, void *context,
1452 int vl, int mode, u64 data)
1453 {
1454 struct hfi1_devdata *dd = context;
1455
1456 u64 val = 0;
1457 u64 csr = entry->csr;
1458
1459 if (entry->flags & CNTR_VL) {
1460 if (vl == CNTR_INVALID_VL)
1461 return 0;
1462 csr += 8 * vl;
1463 } else {
1464 if (vl != CNTR_INVALID_VL)
1465 return 0;
1466 }
1467
1468 val = read_write_csr(dd, csr, mode, data);
1469 return val;
1470 }
1471
dc_access_lcb_cntr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1472 static u64 dc_access_lcb_cntr(const struct cntr_entry *entry, void *context,
1473 int vl, int mode, u64 data)
1474 {
1475 struct hfi1_devdata *dd = context;
1476 u32 csr = entry->csr;
1477 int ret = 0;
1478
1479 if (vl != CNTR_INVALID_VL)
1480 return 0;
1481 if (mode == CNTR_MODE_R)
1482 ret = read_lcb_csr(dd, csr, &data);
1483 else if (mode == CNTR_MODE_W)
1484 ret = write_lcb_csr(dd, csr, data);
1485
1486 if (ret) {
1487 dd_dev_err(dd, "Could not acquire LCB for counter 0x%x", csr);
1488 return 0;
1489 }
1490
1491 hfi1_cdbg(CNTR, "csr 0x%x val 0x%llx mode %d", csr, data, mode);
1492 return data;
1493 }
1494
1495 /* Port Access */
port_access_u32_csr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1496 static u64 port_access_u32_csr(const struct cntr_entry *entry, void *context,
1497 int vl, int mode, u64 data)
1498 {
1499 struct hfi1_pportdata *ppd = context;
1500
1501 if (vl != CNTR_INVALID_VL)
1502 return 0;
1503 return read_write_csr(ppd->dd, entry->csr, mode, data);
1504 }
1505
port_access_u64_csr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1506 static u64 port_access_u64_csr(const struct cntr_entry *entry,
1507 void *context, int vl, int mode, u64 data)
1508 {
1509 struct hfi1_pportdata *ppd = context;
1510 u64 val;
1511 u64 csr = entry->csr;
1512
1513 if (entry->flags & CNTR_VL) {
1514 if (vl == CNTR_INVALID_VL)
1515 return 0;
1516 csr += 8 * vl;
1517 } else {
1518 if (vl != CNTR_INVALID_VL)
1519 return 0;
1520 }
1521 val = read_write_csr(ppd->dd, csr, mode, data);
1522 return val;
1523 }
1524
1525 /* Software defined */
read_write_sw(struct hfi1_devdata * dd,u64 * cntr,int mode,u64 data)1526 static inline u64 read_write_sw(struct hfi1_devdata *dd, u64 *cntr, int mode,
1527 u64 data)
1528 {
1529 u64 ret;
1530
1531 if (mode == CNTR_MODE_R) {
1532 ret = *cntr;
1533 } else if (mode == CNTR_MODE_W) {
1534 *cntr = data;
1535 ret = data;
1536 } else {
1537 dd_dev_err(dd, "Invalid cntr sw access mode");
1538 return 0;
1539 }
1540
1541 hfi1_cdbg(CNTR, "val 0x%llx mode %d", ret, mode);
1542
1543 return ret;
1544 }
1545
access_sw_link_dn_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1546 static u64 access_sw_link_dn_cnt(const struct cntr_entry *entry, void *context,
1547 int vl, int mode, u64 data)
1548 {
1549 struct hfi1_pportdata *ppd = context;
1550
1551 if (vl != CNTR_INVALID_VL)
1552 return 0;
1553 return read_write_sw(ppd->dd, &ppd->link_downed, mode, data);
1554 }
1555
access_sw_link_up_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1556 static u64 access_sw_link_up_cnt(const struct cntr_entry *entry, void *context,
1557 int vl, int mode, u64 data)
1558 {
1559 struct hfi1_pportdata *ppd = context;
1560
1561 if (vl != CNTR_INVALID_VL)
1562 return 0;
1563 return read_write_sw(ppd->dd, &ppd->link_up, mode, data);
1564 }
1565
access_sw_unknown_frame_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1566 static u64 access_sw_unknown_frame_cnt(const struct cntr_entry *entry,
1567 void *context, int vl, int mode,
1568 u64 data)
1569 {
1570 struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context;
1571
1572 if (vl != CNTR_INVALID_VL)
1573 return 0;
1574 return read_write_sw(ppd->dd, &ppd->unknown_frame_count, mode, data);
1575 }
1576
access_sw_xmit_discards(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1577 static u64 access_sw_xmit_discards(const struct cntr_entry *entry,
1578 void *context, int vl, int mode, u64 data)
1579 {
1580 struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context;
1581 u64 zero = 0;
1582 u64 *counter;
1583
1584 if (vl == CNTR_INVALID_VL)
1585 counter = &ppd->port_xmit_discards;
1586 else if (vl >= 0 && vl < C_VL_COUNT)
1587 counter = &ppd->port_xmit_discards_vl[vl];
1588 else
1589 counter = &zero;
1590
1591 return read_write_sw(ppd->dd, counter, mode, data);
1592 }
1593
access_xmit_constraint_errs(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1594 static u64 access_xmit_constraint_errs(const struct cntr_entry *entry,
1595 void *context, int vl, int mode,
1596 u64 data)
1597 {
1598 struct hfi1_pportdata *ppd = context;
1599
1600 if (vl != CNTR_INVALID_VL)
1601 return 0;
1602
1603 return read_write_sw(ppd->dd, &ppd->port_xmit_constraint_errors,
1604 mode, data);
1605 }
1606
access_rcv_constraint_errs(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1607 static u64 access_rcv_constraint_errs(const struct cntr_entry *entry,
1608 void *context, int vl, int mode, u64 data)
1609 {
1610 struct hfi1_pportdata *ppd = context;
1611
1612 if (vl != CNTR_INVALID_VL)
1613 return 0;
1614
1615 return read_write_sw(ppd->dd, &ppd->port_rcv_constraint_errors,
1616 mode, data);
1617 }
1618
get_all_cpu_total(u64 __percpu * cntr)1619 u64 get_all_cpu_total(u64 __percpu *cntr)
1620 {
1621 int cpu;
1622 u64 counter = 0;
1623
1624 for_each_possible_cpu(cpu)
1625 counter += *per_cpu_ptr(cntr, cpu);
1626 return counter;
1627 }
1628
read_write_cpu(struct hfi1_devdata * dd,u64 * z_val,u64 __percpu * cntr,int vl,int mode,u64 data)1629 static u64 read_write_cpu(struct hfi1_devdata *dd, u64 *z_val,
1630 u64 __percpu *cntr,
1631 int vl, int mode, u64 data)
1632 {
1633 u64 ret = 0;
1634
1635 if (vl != CNTR_INVALID_VL)
1636 return 0;
1637
1638 if (mode == CNTR_MODE_R) {
1639 ret = get_all_cpu_total(cntr) - *z_val;
1640 } else if (mode == CNTR_MODE_W) {
1641 /* A write can only zero the counter */
1642 if (data == 0)
1643 *z_val = get_all_cpu_total(cntr);
1644 else
1645 dd_dev_err(dd, "Per CPU cntrs can only be zeroed");
1646 } else {
1647 dd_dev_err(dd, "Invalid cntr sw cpu access mode");
1648 return 0;
1649 }
1650
1651 return ret;
1652 }
1653
access_sw_cpu_intr(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1654 static u64 access_sw_cpu_intr(const struct cntr_entry *entry,
1655 void *context, int vl, int mode, u64 data)
1656 {
1657 struct hfi1_devdata *dd = context;
1658
1659 return read_write_cpu(dd, &dd->z_int_counter, dd->int_counter, vl,
1660 mode, data);
1661 }
1662
access_sw_cpu_rcv_limit(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1663 static u64 access_sw_cpu_rcv_limit(const struct cntr_entry *entry,
1664 void *context, int vl, int mode, u64 data)
1665 {
1666 struct hfi1_devdata *dd = context;
1667
1668 return read_write_cpu(dd, &dd->z_rcv_limit, dd->rcv_limit, vl,
1669 mode, data);
1670 }
1671
access_sw_pio_wait(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1672 static u64 access_sw_pio_wait(const struct cntr_entry *entry,
1673 void *context, int vl, int mode, u64 data)
1674 {
1675 struct hfi1_devdata *dd = context;
1676
1677 return dd->verbs_dev.n_piowait;
1678 }
1679
access_sw_pio_drain(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1680 static u64 access_sw_pio_drain(const struct cntr_entry *entry,
1681 void *context, int vl, int mode, u64 data)
1682 {
1683 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1684
1685 return dd->verbs_dev.n_piodrain;
1686 }
1687
access_sw_vtx_wait(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1688 static u64 access_sw_vtx_wait(const struct cntr_entry *entry,
1689 void *context, int vl, int mode, u64 data)
1690 {
1691 struct hfi1_devdata *dd = context;
1692
1693 return dd->verbs_dev.n_txwait;
1694 }
1695
access_sw_kmem_wait(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1696 static u64 access_sw_kmem_wait(const struct cntr_entry *entry,
1697 void *context, int vl, int mode, u64 data)
1698 {
1699 struct hfi1_devdata *dd = context;
1700
1701 return dd->verbs_dev.n_kmem_wait;
1702 }
1703
access_sw_send_schedule(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1704 static u64 access_sw_send_schedule(const struct cntr_entry *entry,
1705 void *context, int vl, int mode, u64 data)
1706 {
1707 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1708
1709 return read_write_cpu(dd, &dd->z_send_schedule, dd->send_schedule, vl,
1710 mode, data);
1711 }
1712
1713 /* Software counters for the error status bits within MISC_ERR_STATUS */
access_misc_pll_lock_fail_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1714 static u64 access_misc_pll_lock_fail_err_cnt(const struct cntr_entry *entry,
1715 void *context, int vl, int mode,
1716 u64 data)
1717 {
1718 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1719
1720 return dd->misc_err_status_cnt[12];
1721 }
1722
access_misc_mbist_fail_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1723 static u64 access_misc_mbist_fail_err_cnt(const struct cntr_entry *entry,
1724 void *context, int vl, int mode,
1725 u64 data)
1726 {
1727 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1728
1729 return dd->misc_err_status_cnt[11];
1730 }
1731
access_misc_invalid_eep_cmd_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1732 static u64 access_misc_invalid_eep_cmd_err_cnt(const struct cntr_entry *entry,
1733 void *context, int vl, int mode,
1734 u64 data)
1735 {
1736 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1737
1738 return dd->misc_err_status_cnt[10];
1739 }
1740
access_misc_efuse_done_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1741 static u64 access_misc_efuse_done_parity_err_cnt(const struct cntr_entry *entry,
1742 void *context, int vl,
1743 int mode, u64 data)
1744 {
1745 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1746
1747 return dd->misc_err_status_cnt[9];
1748 }
1749
access_misc_efuse_write_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1750 static u64 access_misc_efuse_write_err_cnt(const struct cntr_entry *entry,
1751 void *context, int vl, int mode,
1752 u64 data)
1753 {
1754 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1755
1756 return dd->misc_err_status_cnt[8];
1757 }
1758
access_misc_efuse_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1759 static u64 access_misc_efuse_read_bad_addr_err_cnt(
1760 const struct cntr_entry *entry,
1761 void *context, int vl, int mode, u64 data)
1762 {
1763 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1764
1765 return dd->misc_err_status_cnt[7];
1766 }
1767
access_misc_efuse_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1768 static u64 access_misc_efuse_csr_parity_err_cnt(const struct cntr_entry *entry,
1769 void *context, int vl,
1770 int mode, u64 data)
1771 {
1772 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1773
1774 return dd->misc_err_status_cnt[6];
1775 }
1776
access_misc_fw_auth_failed_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1777 static u64 access_misc_fw_auth_failed_err_cnt(const struct cntr_entry *entry,
1778 void *context, int vl, int mode,
1779 u64 data)
1780 {
1781 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1782
1783 return dd->misc_err_status_cnt[5];
1784 }
1785
access_misc_key_mismatch_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1786 static u64 access_misc_key_mismatch_err_cnt(const struct cntr_entry *entry,
1787 void *context, int vl, int mode,
1788 u64 data)
1789 {
1790 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1791
1792 return dd->misc_err_status_cnt[4];
1793 }
1794
access_misc_sbus_write_failed_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1795 static u64 access_misc_sbus_write_failed_err_cnt(const struct cntr_entry *entry,
1796 void *context, int vl,
1797 int mode, u64 data)
1798 {
1799 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1800
1801 return dd->misc_err_status_cnt[3];
1802 }
1803
access_misc_csr_write_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1804 static u64 access_misc_csr_write_bad_addr_err_cnt(
1805 const struct cntr_entry *entry,
1806 void *context, int vl, int mode, u64 data)
1807 {
1808 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1809
1810 return dd->misc_err_status_cnt[2];
1811 }
1812
access_misc_csr_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1813 static u64 access_misc_csr_read_bad_addr_err_cnt(const struct cntr_entry *entry,
1814 void *context, int vl,
1815 int mode, u64 data)
1816 {
1817 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1818
1819 return dd->misc_err_status_cnt[1];
1820 }
1821
access_misc_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1822 static u64 access_misc_csr_parity_err_cnt(const struct cntr_entry *entry,
1823 void *context, int vl, int mode,
1824 u64 data)
1825 {
1826 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1827
1828 return dd->misc_err_status_cnt[0];
1829 }
1830
1831 /*
1832 * Software counter for the aggregate of
1833 * individual CceErrStatus counters
1834 */
access_sw_cce_err_status_aggregated_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1835 static u64 access_sw_cce_err_status_aggregated_cnt(
1836 const struct cntr_entry *entry,
1837 void *context, int vl, int mode, u64 data)
1838 {
1839 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1840
1841 return dd->sw_cce_err_status_aggregate;
1842 }
1843
1844 /*
1845 * Software counters corresponding to each of the
1846 * error status bits within CceErrStatus
1847 */
access_cce_msix_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1848 static u64 access_cce_msix_csr_parity_err_cnt(const struct cntr_entry *entry,
1849 void *context, int vl, int mode,
1850 u64 data)
1851 {
1852 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1853
1854 return dd->cce_err_status_cnt[40];
1855 }
1856
access_cce_int_map_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1857 static u64 access_cce_int_map_unc_err_cnt(const struct cntr_entry *entry,
1858 void *context, int vl, int mode,
1859 u64 data)
1860 {
1861 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1862
1863 return dd->cce_err_status_cnt[39];
1864 }
1865
access_cce_int_map_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1866 static u64 access_cce_int_map_cor_err_cnt(const struct cntr_entry *entry,
1867 void *context, int vl, int mode,
1868 u64 data)
1869 {
1870 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1871
1872 return dd->cce_err_status_cnt[38];
1873 }
1874
access_cce_msix_table_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1875 static u64 access_cce_msix_table_unc_err_cnt(const struct cntr_entry *entry,
1876 void *context, int vl, int mode,
1877 u64 data)
1878 {
1879 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1880
1881 return dd->cce_err_status_cnt[37];
1882 }
1883
access_cce_msix_table_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1884 static u64 access_cce_msix_table_cor_err_cnt(const struct cntr_entry *entry,
1885 void *context, int vl, int mode,
1886 u64 data)
1887 {
1888 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1889
1890 return dd->cce_err_status_cnt[36];
1891 }
1892
access_cce_rxdma_conv_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1893 static u64 access_cce_rxdma_conv_fifo_parity_err_cnt(
1894 const struct cntr_entry *entry,
1895 void *context, int vl, int mode, u64 data)
1896 {
1897 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1898
1899 return dd->cce_err_status_cnt[35];
1900 }
1901
access_cce_rcpl_async_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1902 static u64 access_cce_rcpl_async_fifo_parity_err_cnt(
1903 const struct cntr_entry *entry,
1904 void *context, int vl, int mode, u64 data)
1905 {
1906 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1907
1908 return dd->cce_err_status_cnt[34];
1909 }
1910
access_cce_seg_write_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1911 static u64 access_cce_seg_write_bad_addr_err_cnt(const struct cntr_entry *entry,
1912 void *context, int vl,
1913 int mode, u64 data)
1914 {
1915 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1916
1917 return dd->cce_err_status_cnt[33];
1918 }
1919
access_cce_seg_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1920 static u64 access_cce_seg_read_bad_addr_err_cnt(const struct cntr_entry *entry,
1921 void *context, int vl, int mode,
1922 u64 data)
1923 {
1924 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1925
1926 return dd->cce_err_status_cnt[32];
1927 }
1928
access_la_triggered_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1929 static u64 access_la_triggered_cnt(const struct cntr_entry *entry,
1930 void *context, int vl, int mode, u64 data)
1931 {
1932 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1933
1934 return dd->cce_err_status_cnt[31];
1935 }
1936
access_cce_trgt_cpl_timeout_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1937 static u64 access_cce_trgt_cpl_timeout_err_cnt(const struct cntr_entry *entry,
1938 void *context, int vl, int mode,
1939 u64 data)
1940 {
1941 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1942
1943 return dd->cce_err_status_cnt[30];
1944 }
1945
access_pcic_receive_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1946 static u64 access_pcic_receive_parity_err_cnt(const struct cntr_entry *entry,
1947 void *context, int vl, int mode,
1948 u64 data)
1949 {
1950 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1951
1952 return dd->cce_err_status_cnt[29];
1953 }
1954
access_pcic_transmit_back_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1955 static u64 access_pcic_transmit_back_parity_err_cnt(
1956 const struct cntr_entry *entry,
1957 void *context, int vl, int mode, u64 data)
1958 {
1959 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1960
1961 return dd->cce_err_status_cnt[28];
1962 }
1963
access_pcic_transmit_front_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1964 static u64 access_pcic_transmit_front_parity_err_cnt(
1965 const struct cntr_entry *entry,
1966 void *context, int vl, int mode, u64 data)
1967 {
1968 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1969
1970 return dd->cce_err_status_cnt[27];
1971 }
1972
access_pcic_cpl_dat_q_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1973 static u64 access_pcic_cpl_dat_q_unc_err_cnt(const struct cntr_entry *entry,
1974 void *context, int vl, int mode,
1975 u64 data)
1976 {
1977 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1978
1979 return dd->cce_err_status_cnt[26];
1980 }
1981
access_pcic_cpl_hd_q_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1982 static u64 access_pcic_cpl_hd_q_unc_err_cnt(const struct cntr_entry *entry,
1983 void *context, int vl, int mode,
1984 u64 data)
1985 {
1986 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1987
1988 return dd->cce_err_status_cnt[25];
1989 }
1990
access_pcic_post_dat_q_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)1991 static u64 access_pcic_post_dat_q_unc_err_cnt(const struct cntr_entry *entry,
1992 void *context, int vl, int mode,
1993 u64 data)
1994 {
1995 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
1996
1997 return dd->cce_err_status_cnt[24];
1998 }
1999
access_pcic_post_hd_q_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2000 static u64 access_pcic_post_hd_q_unc_err_cnt(const struct cntr_entry *entry,
2001 void *context, int vl, int mode,
2002 u64 data)
2003 {
2004 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2005
2006 return dd->cce_err_status_cnt[23];
2007 }
2008
access_pcic_retry_sot_mem_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2009 static u64 access_pcic_retry_sot_mem_unc_err_cnt(const struct cntr_entry *entry,
2010 void *context, int vl,
2011 int mode, u64 data)
2012 {
2013 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2014
2015 return dd->cce_err_status_cnt[22];
2016 }
2017
access_pcic_retry_mem_unc_err(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2018 static u64 access_pcic_retry_mem_unc_err(const struct cntr_entry *entry,
2019 void *context, int vl, int mode,
2020 u64 data)
2021 {
2022 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2023
2024 return dd->cce_err_status_cnt[21];
2025 }
2026
access_pcic_n_post_dat_q_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2027 static u64 access_pcic_n_post_dat_q_parity_err_cnt(
2028 const struct cntr_entry *entry,
2029 void *context, int vl, int mode, u64 data)
2030 {
2031 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2032
2033 return dd->cce_err_status_cnt[20];
2034 }
2035
access_pcic_n_post_h_q_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2036 static u64 access_pcic_n_post_h_q_parity_err_cnt(const struct cntr_entry *entry,
2037 void *context, int vl,
2038 int mode, u64 data)
2039 {
2040 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2041
2042 return dd->cce_err_status_cnt[19];
2043 }
2044
access_pcic_cpl_dat_q_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2045 static u64 access_pcic_cpl_dat_q_cor_err_cnt(const struct cntr_entry *entry,
2046 void *context, int vl, int mode,
2047 u64 data)
2048 {
2049 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2050
2051 return dd->cce_err_status_cnt[18];
2052 }
2053
access_pcic_cpl_hd_q_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2054 static u64 access_pcic_cpl_hd_q_cor_err_cnt(const struct cntr_entry *entry,
2055 void *context, int vl, int mode,
2056 u64 data)
2057 {
2058 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2059
2060 return dd->cce_err_status_cnt[17];
2061 }
2062
access_pcic_post_dat_q_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2063 static u64 access_pcic_post_dat_q_cor_err_cnt(const struct cntr_entry *entry,
2064 void *context, int vl, int mode,
2065 u64 data)
2066 {
2067 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2068
2069 return dd->cce_err_status_cnt[16];
2070 }
2071
access_pcic_post_hd_q_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2072 static u64 access_pcic_post_hd_q_cor_err_cnt(const struct cntr_entry *entry,
2073 void *context, int vl, int mode,
2074 u64 data)
2075 {
2076 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2077
2078 return dd->cce_err_status_cnt[15];
2079 }
2080
access_pcic_retry_sot_mem_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2081 static u64 access_pcic_retry_sot_mem_cor_err_cnt(const struct cntr_entry *entry,
2082 void *context, int vl,
2083 int mode, u64 data)
2084 {
2085 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2086
2087 return dd->cce_err_status_cnt[14];
2088 }
2089
access_pcic_retry_mem_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2090 static u64 access_pcic_retry_mem_cor_err_cnt(const struct cntr_entry *entry,
2091 void *context, int vl, int mode,
2092 u64 data)
2093 {
2094 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2095
2096 return dd->cce_err_status_cnt[13];
2097 }
2098
access_cce_cli1_async_fifo_dbg_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2099 static u64 access_cce_cli1_async_fifo_dbg_parity_err_cnt(
2100 const struct cntr_entry *entry,
2101 void *context, int vl, int mode, u64 data)
2102 {
2103 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2104
2105 return dd->cce_err_status_cnt[12];
2106 }
2107
access_cce_cli1_async_fifo_rxdma_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2108 static u64 access_cce_cli1_async_fifo_rxdma_parity_err_cnt(
2109 const struct cntr_entry *entry,
2110 void *context, int vl, int mode, u64 data)
2111 {
2112 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2113
2114 return dd->cce_err_status_cnt[11];
2115 }
2116
access_cce_cli1_async_fifo_sdma_hd_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2117 static u64 access_cce_cli1_async_fifo_sdma_hd_parity_err_cnt(
2118 const struct cntr_entry *entry,
2119 void *context, int vl, int mode, u64 data)
2120 {
2121 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2122
2123 return dd->cce_err_status_cnt[10];
2124 }
2125
access_cce_cl1_async_fifo_pio_crdt_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2126 static u64 access_cce_cl1_async_fifo_pio_crdt_parity_err_cnt(
2127 const struct cntr_entry *entry,
2128 void *context, int vl, int mode, u64 data)
2129 {
2130 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2131
2132 return dd->cce_err_status_cnt[9];
2133 }
2134
access_cce_cli2_async_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2135 static u64 access_cce_cli2_async_fifo_parity_err_cnt(
2136 const struct cntr_entry *entry,
2137 void *context, int vl, int mode, u64 data)
2138 {
2139 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2140
2141 return dd->cce_err_status_cnt[8];
2142 }
2143
access_cce_csr_cfg_bus_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2144 static u64 access_cce_csr_cfg_bus_parity_err_cnt(const struct cntr_entry *entry,
2145 void *context, int vl,
2146 int mode, u64 data)
2147 {
2148 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2149
2150 return dd->cce_err_status_cnt[7];
2151 }
2152
access_cce_cli0_async_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2153 static u64 access_cce_cli0_async_fifo_parity_err_cnt(
2154 const struct cntr_entry *entry,
2155 void *context, int vl, int mode, u64 data)
2156 {
2157 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2158
2159 return dd->cce_err_status_cnt[6];
2160 }
2161
access_cce_rspd_data_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2162 static u64 access_cce_rspd_data_parity_err_cnt(const struct cntr_entry *entry,
2163 void *context, int vl, int mode,
2164 u64 data)
2165 {
2166 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2167
2168 return dd->cce_err_status_cnt[5];
2169 }
2170
access_cce_trgt_access_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2171 static u64 access_cce_trgt_access_err_cnt(const struct cntr_entry *entry,
2172 void *context, int vl, int mode,
2173 u64 data)
2174 {
2175 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2176
2177 return dd->cce_err_status_cnt[4];
2178 }
2179
access_cce_trgt_async_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2180 static u64 access_cce_trgt_async_fifo_parity_err_cnt(
2181 const struct cntr_entry *entry,
2182 void *context, int vl, int mode, u64 data)
2183 {
2184 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2185
2186 return dd->cce_err_status_cnt[3];
2187 }
2188
access_cce_csr_write_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2189 static u64 access_cce_csr_write_bad_addr_err_cnt(const struct cntr_entry *entry,
2190 void *context, int vl,
2191 int mode, u64 data)
2192 {
2193 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2194
2195 return dd->cce_err_status_cnt[2];
2196 }
2197
access_cce_csr_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2198 static u64 access_cce_csr_read_bad_addr_err_cnt(const struct cntr_entry *entry,
2199 void *context, int vl,
2200 int mode, u64 data)
2201 {
2202 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2203
2204 return dd->cce_err_status_cnt[1];
2205 }
2206
access_ccs_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2207 static u64 access_ccs_csr_parity_err_cnt(const struct cntr_entry *entry,
2208 void *context, int vl, int mode,
2209 u64 data)
2210 {
2211 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2212
2213 return dd->cce_err_status_cnt[0];
2214 }
2215
2216 /*
2217 * Software counters corresponding to each of the
2218 * error status bits within RcvErrStatus
2219 */
access_rx_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2220 static u64 access_rx_csr_parity_err_cnt(const struct cntr_entry *entry,
2221 void *context, int vl, int mode,
2222 u64 data)
2223 {
2224 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2225
2226 return dd->rcv_err_status_cnt[63];
2227 }
2228
access_rx_csr_write_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2229 static u64 access_rx_csr_write_bad_addr_err_cnt(const struct cntr_entry *entry,
2230 void *context, int vl,
2231 int mode, u64 data)
2232 {
2233 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2234
2235 return dd->rcv_err_status_cnt[62];
2236 }
2237
access_rx_csr_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2238 static u64 access_rx_csr_read_bad_addr_err_cnt(const struct cntr_entry *entry,
2239 void *context, int vl, int mode,
2240 u64 data)
2241 {
2242 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2243
2244 return dd->rcv_err_status_cnt[61];
2245 }
2246
access_rx_dma_csr_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2247 static u64 access_rx_dma_csr_unc_err_cnt(const struct cntr_entry *entry,
2248 void *context, int vl, int mode,
2249 u64 data)
2250 {
2251 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2252
2253 return dd->rcv_err_status_cnt[60];
2254 }
2255
access_rx_dma_dq_fsm_encoding_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2256 static u64 access_rx_dma_dq_fsm_encoding_err_cnt(const struct cntr_entry *entry,
2257 void *context, int vl,
2258 int mode, u64 data)
2259 {
2260 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2261
2262 return dd->rcv_err_status_cnt[59];
2263 }
2264
access_rx_dma_eq_fsm_encoding_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2265 static u64 access_rx_dma_eq_fsm_encoding_err_cnt(const struct cntr_entry *entry,
2266 void *context, int vl,
2267 int mode, u64 data)
2268 {
2269 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2270
2271 return dd->rcv_err_status_cnt[58];
2272 }
2273
access_rx_dma_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2274 static u64 access_rx_dma_csr_parity_err_cnt(const struct cntr_entry *entry,
2275 void *context, int vl, int mode,
2276 u64 data)
2277 {
2278 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2279
2280 return dd->rcv_err_status_cnt[57];
2281 }
2282
access_rx_rbuf_data_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2283 static u64 access_rx_rbuf_data_cor_err_cnt(const struct cntr_entry *entry,
2284 void *context, int vl, int mode,
2285 u64 data)
2286 {
2287 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2288
2289 return dd->rcv_err_status_cnt[56];
2290 }
2291
access_rx_rbuf_data_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2292 static u64 access_rx_rbuf_data_unc_err_cnt(const struct cntr_entry *entry,
2293 void *context, int vl, int mode,
2294 u64 data)
2295 {
2296 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2297
2298 return dd->rcv_err_status_cnt[55];
2299 }
2300
access_rx_dma_data_fifo_rd_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2301 static u64 access_rx_dma_data_fifo_rd_cor_err_cnt(
2302 const struct cntr_entry *entry,
2303 void *context, int vl, int mode, u64 data)
2304 {
2305 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2306
2307 return dd->rcv_err_status_cnt[54];
2308 }
2309
access_rx_dma_data_fifo_rd_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2310 static u64 access_rx_dma_data_fifo_rd_unc_err_cnt(
2311 const struct cntr_entry *entry,
2312 void *context, int vl, int mode, u64 data)
2313 {
2314 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2315
2316 return dd->rcv_err_status_cnt[53];
2317 }
2318
access_rx_dma_hdr_fifo_rd_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2319 static u64 access_rx_dma_hdr_fifo_rd_cor_err_cnt(const struct cntr_entry *entry,
2320 void *context, int vl,
2321 int mode, u64 data)
2322 {
2323 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2324
2325 return dd->rcv_err_status_cnt[52];
2326 }
2327
access_rx_dma_hdr_fifo_rd_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2328 static u64 access_rx_dma_hdr_fifo_rd_unc_err_cnt(const struct cntr_entry *entry,
2329 void *context, int vl,
2330 int mode, u64 data)
2331 {
2332 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2333
2334 return dd->rcv_err_status_cnt[51];
2335 }
2336
access_rx_rbuf_desc_part2_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2337 static u64 access_rx_rbuf_desc_part2_cor_err_cnt(const struct cntr_entry *entry,
2338 void *context, int vl,
2339 int mode, u64 data)
2340 {
2341 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2342
2343 return dd->rcv_err_status_cnt[50];
2344 }
2345
access_rx_rbuf_desc_part2_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2346 static u64 access_rx_rbuf_desc_part2_unc_err_cnt(const struct cntr_entry *entry,
2347 void *context, int vl,
2348 int mode, u64 data)
2349 {
2350 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2351
2352 return dd->rcv_err_status_cnt[49];
2353 }
2354
access_rx_rbuf_desc_part1_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2355 static u64 access_rx_rbuf_desc_part1_cor_err_cnt(const struct cntr_entry *entry,
2356 void *context, int vl,
2357 int mode, u64 data)
2358 {
2359 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2360
2361 return dd->rcv_err_status_cnt[48];
2362 }
2363
access_rx_rbuf_desc_part1_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2364 static u64 access_rx_rbuf_desc_part1_unc_err_cnt(const struct cntr_entry *entry,
2365 void *context, int vl,
2366 int mode, u64 data)
2367 {
2368 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2369
2370 return dd->rcv_err_status_cnt[47];
2371 }
2372
access_rx_hq_intr_fsm_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2373 static u64 access_rx_hq_intr_fsm_err_cnt(const struct cntr_entry *entry,
2374 void *context, int vl, int mode,
2375 u64 data)
2376 {
2377 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2378
2379 return dd->rcv_err_status_cnt[46];
2380 }
2381
access_rx_hq_intr_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2382 static u64 access_rx_hq_intr_csr_parity_err_cnt(
2383 const struct cntr_entry *entry,
2384 void *context, int vl, int mode, u64 data)
2385 {
2386 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2387
2388 return dd->rcv_err_status_cnt[45];
2389 }
2390
access_rx_lookup_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2391 static u64 access_rx_lookup_csr_parity_err_cnt(
2392 const struct cntr_entry *entry,
2393 void *context, int vl, int mode, u64 data)
2394 {
2395 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2396
2397 return dd->rcv_err_status_cnt[44];
2398 }
2399
access_rx_lookup_rcv_array_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2400 static u64 access_rx_lookup_rcv_array_cor_err_cnt(
2401 const struct cntr_entry *entry,
2402 void *context, int vl, int mode, u64 data)
2403 {
2404 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2405
2406 return dd->rcv_err_status_cnt[43];
2407 }
2408
access_rx_lookup_rcv_array_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2409 static u64 access_rx_lookup_rcv_array_unc_err_cnt(
2410 const struct cntr_entry *entry,
2411 void *context, int vl, int mode, u64 data)
2412 {
2413 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2414
2415 return dd->rcv_err_status_cnt[42];
2416 }
2417
access_rx_lookup_des_part2_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2418 static u64 access_rx_lookup_des_part2_parity_err_cnt(
2419 const struct cntr_entry *entry,
2420 void *context, int vl, int mode, u64 data)
2421 {
2422 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2423
2424 return dd->rcv_err_status_cnt[41];
2425 }
2426
access_rx_lookup_des_part1_unc_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2427 static u64 access_rx_lookup_des_part1_unc_cor_err_cnt(
2428 const struct cntr_entry *entry,
2429 void *context, int vl, int mode, u64 data)
2430 {
2431 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2432
2433 return dd->rcv_err_status_cnt[40];
2434 }
2435
access_rx_lookup_des_part1_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2436 static u64 access_rx_lookup_des_part1_unc_err_cnt(
2437 const struct cntr_entry *entry,
2438 void *context, int vl, int mode, u64 data)
2439 {
2440 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2441
2442 return dd->rcv_err_status_cnt[39];
2443 }
2444
access_rx_rbuf_next_free_buf_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2445 static u64 access_rx_rbuf_next_free_buf_cor_err_cnt(
2446 const struct cntr_entry *entry,
2447 void *context, int vl, int mode, u64 data)
2448 {
2449 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2450
2451 return dd->rcv_err_status_cnt[38];
2452 }
2453
access_rx_rbuf_next_free_buf_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2454 static u64 access_rx_rbuf_next_free_buf_unc_err_cnt(
2455 const struct cntr_entry *entry,
2456 void *context, int vl, int mode, u64 data)
2457 {
2458 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2459
2460 return dd->rcv_err_status_cnt[37];
2461 }
2462
access_rbuf_fl_init_wr_addr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2463 static u64 access_rbuf_fl_init_wr_addr_parity_err_cnt(
2464 const struct cntr_entry *entry,
2465 void *context, int vl, int mode, u64 data)
2466 {
2467 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2468
2469 return dd->rcv_err_status_cnt[36];
2470 }
2471
access_rx_rbuf_fl_initdone_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2472 static u64 access_rx_rbuf_fl_initdone_parity_err_cnt(
2473 const struct cntr_entry *entry,
2474 void *context, int vl, int mode, u64 data)
2475 {
2476 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2477
2478 return dd->rcv_err_status_cnt[35];
2479 }
2480
access_rx_rbuf_fl_write_addr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2481 static u64 access_rx_rbuf_fl_write_addr_parity_err_cnt(
2482 const struct cntr_entry *entry,
2483 void *context, int vl, int mode, u64 data)
2484 {
2485 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2486
2487 return dd->rcv_err_status_cnt[34];
2488 }
2489
access_rx_rbuf_fl_rd_addr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2490 static u64 access_rx_rbuf_fl_rd_addr_parity_err_cnt(
2491 const struct cntr_entry *entry,
2492 void *context, int vl, int mode, u64 data)
2493 {
2494 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2495
2496 return dd->rcv_err_status_cnt[33];
2497 }
2498
access_rx_rbuf_empty_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2499 static u64 access_rx_rbuf_empty_err_cnt(const struct cntr_entry *entry,
2500 void *context, int vl, int mode,
2501 u64 data)
2502 {
2503 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2504
2505 return dd->rcv_err_status_cnt[32];
2506 }
2507
access_rx_rbuf_full_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2508 static u64 access_rx_rbuf_full_err_cnt(const struct cntr_entry *entry,
2509 void *context, int vl, int mode,
2510 u64 data)
2511 {
2512 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2513
2514 return dd->rcv_err_status_cnt[31];
2515 }
2516
access_rbuf_bad_lookup_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2517 static u64 access_rbuf_bad_lookup_err_cnt(const struct cntr_entry *entry,
2518 void *context, int vl, int mode,
2519 u64 data)
2520 {
2521 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2522
2523 return dd->rcv_err_status_cnt[30];
2524 }
2525
access_rbuf_ctx_id_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2526 static u64 access_rbuf_ctx_id_parity_err_cnt(const struct cntr_entry *entry,
2527 void *context, int vl, int mode,
2528 u64 data)
2529 {
2530 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2531
2532 return dd->rcv_err_status_cnt[29];
2533 }
2534
access_rbuf_csr_qeopdw_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2535 static u64 access_rbuf_csr_qeopdw_parity_err_cnt(const struct cntr_entry *entry,
2536 void *context, int vl,
2537 int mode, u64 data)
2538 {
2539 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2540
2541 return dd->rcv_err_status_cnt[28];
2542 }
2543
access_rx_rbuf_csr_q_num_of_pkt_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2544 static u64 access_rx_rbuf_csr_q_num_of_pkt_parity_err_cnt(
2545 const struct cntr_entry *entry,
2546 void *context, int vl, int mode, u64 data)
2547 {
2548 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2549
2550 return dd->rcv_err_status_cnt[27];
2551 }
2552
access_rx_rbuf_csr_q_t1_ptr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2553 static u64 access_rx_rbuf_csr_q_t1_ptr_parity_err_cnt(
2554 const struct cntr_entry *entry,
2555 void *context, int vl, int mode, u64 data)
2556 {
2557 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2558
2559 return dd->rcv_err_status_cnt[26];
2560 }
2561
access_rx_rbuf_csr_q_hd_ptr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2562 static u64 access_rx_rbuf_csr_q_hd_ptr_parity_err_cnt(
2563 const struct cntr_entry *entry,
2564 void *context, int vl, int mode, u64 data)
2565 {
2566 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2567
2568 return dd->rcv_err_status_cnt[25];
2569 }
2570
access_rx_rbuf_csr_q_vld_bit_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2571 static u64 access_rx_rbuf_csr_q_vld_bit_parity_err_cnt(
2572 const struct cntr_entry *entry,
2573 void *context, int vl, int mode, u64 data)
2574 {
2575 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2576
2577 return dd->rcv_err_status_cnt[24];
2578 }
2579
access_rx_rbuf_csr_q_next_buf_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2580 static u64 access_rx_rbuf_csr_q_next_buf_parity_err_cnt(
2581 const struct cntr_entry *entry,
2582 void *context, int vl, int mode, u64 data)
2583 {
2584 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2585
2586 return dd->rcv_err_status_cnt[23];
2587 }
2588
access_rx_rbuf_csr_q_ent_cnt_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2589 static u64 access_rx_rbuf_csr_q_ent_cnt_parity_err_cnt(
2590 const struct cntr_entry *entry,
2591 void *context, int vl, int mode, u64 data)
2592 {
2593 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2594
2595 return dd->rcv_err_status_cnt[22];
2596 }
2597
access_rx_rbuf_csr_q_head_buf_num_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2598 static u64 access_rx_rbuf_csr_q_head_buf_num_parity_err_cnt(
2599 const struct cntr_entry *entry,
2600 void *context, int vl, int mode, u64 data)
2601 {
2602 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2603
2604 return dd->rcv_err_status_cnt[21];
2605 }
2606
access_rx_rbuf_block_list_read_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2607 static u64 access_rx_rbuf_block_list_read_cor_err_cnt(
2608 const struct cntr_entry *entry,
2609 void *context, int vl, int mode, u64 data)
2610 {
2611 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2612
2613 return dd->rcv_err_status_cnt[20];
2614 }
2615
access_rx_rbuf_block_list_read_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2616 static u64 access_rx_rbuf_block_list_read_unc_err_cnt(
2617 const struct cntr_entry *entry,
2618 void *context, int vl, int mode, u64 data)
2619 {
2620 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2621
2622 return dd->rcv_err_status_cnt[19];
2623 }
2624
access_rx_rbuf_lookup_des_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2625 static u64 access_rx_rbuf_lookup_des_cor_err_cnt(const struct cntr_entry *entry,
2626 void *context, int vl,
2627 int mode, u64 data)
2628 {
2629 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2630
2631 return dd->rcv_err_status_cnt[18];
2632 }
2633
access_rx_rbuf_lookup_des_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2634 static u64 access_rx_rbuf_lookup_des_unc_err_cnt(const struct cntr_entry *entry,
2635 void *context, int vl,
2636 int mode, u64 data)
2637 {
2638 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2639
2640 return dd->rcv_err_status_cnt[17];
2641 }
2642
access_rx_rbuf_lookup_des_reg_unc_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2643 static u64 access_rx_rbuf_lookup_des_reg_unc_cor_err_cnt(
2644 const struct cntr_entry *entry,
2645 void *context, int vl, int mode, u64 data)
2646 {
2647 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2648
2649 return dd->rcv_err_status_cnt[16];
2650 }
2651
access_rx_rbuf_lookup_des_reg_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2652 static u64 access_rx_rbuf_lookup_des_reg_unc_err_cnt(
2653 const struct cntr_entry *entry,
2654 void *context, int vl, int mode, u64 data)
2655 {
2656 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2657
2658 return dd->rcv_err_status_cnt[15];
2659 }
2660
access_rx_rbuf_free_list_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2661 static u64 access_rx_rbuf_free_list_cor_err_cnt(const struct cntr_entry *entry,
2662 void *context, int vl,
2663 int mode, u64 data)
2664 {
2665 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2666
2667 return dd->rcv_err_status_cnt[14];
2668 }
2669
access_rx_rbuf_free_list_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2670 static u64 access_rx_rbuf_free_list_unc_err_cnt(const struct cntr_entry *entry,
2671 void *context, int vl,
2672 int mode, u64 data)
2673 {
2674 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2675
2676 return dd->rcv_err_status_cnt[13];
2677 }
2678
access_rx_rcv_fsm_encoding_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2679 static u64 access_rx_rcv_fsm_encoding_err_cnt(const struct cntr_entry *entry,
2680 void *context, int vl, int mode,
2681 u64 data)
2682 {
2683 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2684
2685 return dd->rcv_err_status_cnt[12];
2686 }
2687
access_rx_dma_flag_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2688 static u64 access_rx_dma_flag_cor_err_cnt(const struct cntr_entry *entry,
2689 void *context, int vl, int mode,
2690 u64 data)
2691 {
2692 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2693
2694 return dd->rcv_err_status_cnt[11];
2695 }
2696
access_rx_dma_flag_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2697 static u64 access_rx_dma_flag_unc_err_cnt(const struct cntr_entry *entry,
2698 void *context, int vl, int mode,
2699 u64 data)
2700 {
2701 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2702
2703 return dd->rcv_err_status_cnt[10];
2704 }
2705
access_rx_dc_sop_eop_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2706 static u64 access_rx_dc_sop_eop_parity_err_cnt(const struct cntr_entry *entry,
2707 void *context, int vl, int mode,
2708 u64 data)
2709 {
2710 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2711
2712 return dd->rcv_err_status_cnt[9];
2713 }
2714
access_rx_rcv_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2715 static u64 access_rx_rcv_csr_parity_err_cnt(const struct cntr_entry *entry,
2716 void *context, int vl, int mode,
2717 u64 data)
2718 {
2719 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2720
2721 return dd->rcv_err_status_cnt[8];
2722 }
2723
access_rx_rcv_qp_map_table_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2724 static u64 access_rx_rcv_qp_map_table_cor_err_cnt(
2725 const struct cntr_entry *entry,
2726 void *context, int vl, int mode, u64 data)
2727 {
2728 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2729
2730 return dd->rcv_err_status_cnt[7];
2731 }
2732
access_rx_rcv_qp_map_table_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2733 static u64 access_rx_rcv_qp_map_table_unc_err_cnt(
2734 const struct cntr_entry *entry,
2735 void *context, int vl, int mode, u64 data)
2736 {
2737 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2738
2739 return dd->rcv_err_status_cnt[6];
2740 }
2741
access_rx_rcv_data_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2742 static u64 access_rx_rcv_data_cor_err_cnt(const struct cntr_entry *entry,
2743 void *context, int vl, int mode,
2744 u64 data)
2745 {
2746 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2747
2748 return dd->rcv_err_status_cnt[5];
2749 }
2750
access_rx_rcv_data_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2751 static u64 access_rx_rcv_data_unc_err_cnt(const struct cntr_entry *entry,
2752 void *context, int vl, int mode,
2753 u64 data)
2754 {
2755 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2756
2757 return dd->rcv_err_status_cnt[4];
2758 }
2759
access_rx_rcv_hdr_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2760 static u64 access_rx_rcv_hdr_cor_err_cnt(const struct cntr_entry *entry,
2761 void *context, int vl, int mode,
2762 u64 data)
2763 {
2764 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2765
2766 return dd->rcv_err_status_cnt[3];
2767 }
2768
access_rx_rcv_hdr_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2769 static u64 access_rx_rcv_hdr_unc_err_cnt(const struct cntr_entry *entry,
2770 void *context, int vl, int mode,
2771 u64 data)
2772 {
2773 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2774
2775 return dd->rcv_err_status_cnt[2];
2776 }
2777
access_rx_dc_intf_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2778 static u64 access_rx_dc_intf_parity_err_cnt(const struct cntr_entry *entry,
2779 void *context, int vl, int mode,
2780 u64 data)
2781 {
2782 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2783
2784 return dd->rcv_err_status_cnt[1];
2785 }
2786
access_rx_dma_csr_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2787 static u64 access_rx_dma_csr_cor_err_cnt(const struct cntr_entry *entry,
2788 void *context, int vl, int mode,
2789 u64 data)
2790 {
2791 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2792
2793 return dd->rcv_err_status_cnt[0];
2794 }
2795
2796 /*
2797 * Software counters corresponding to each of the
2798 * error status bits within SendPioErrStatus
2799 */
access_pio_pec_sop_head_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2800 static u64 access_pio_pec_sop_head_parity_err_cnt(
2801 const struct cntr_entry *entry,
2802 void *context, int vl, int mode, u64 data)
2803 {
2804 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2805
2806 return dd->send_pio_err_status_cnt[35];
2807 }
2808
access_pio_pcc_sop_head_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2809 static u64 access_pio_pcc_sop_head_parity_err_cnt(
2810 const struct cntr_entry *entry,
2811 void *context, int vl, int mode, u64 data)
2812 {
2813 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2814
2815 return dd->send_pio_err_status_cnt[34];
2816 }
2817
access_pio_last_returned_cnt_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2818 static u64 access_pio_last_returned_cnt_parity_err_cnt(
2819 const struct cntr_entry *entry,
2820 void *context, int vl, int mode, u64 data)
2821 {
2822 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2823
2824 return dd->send_pio_err_status_cnt[33];
2825 }
2826
access_pio_current_free_cnt_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2827 static u64 access_pio_current_free_cnt_parity_err_cnt(
2828 const struct cntr_entry *entry,
2829 void *context, int vl, int mode, u64 data)
2830 {
2831 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2832
2833 return dd->send_pio_err_status_cnt[32];
2834 }
2835
access_pio_reserved_31_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2836 static u64 access_pio_reserved_31_err_cnt(const struct cntr_entry *entry,
2837 void *context, int vl, int mode,
2838 u64 data)
2839 {
2840 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2841
2842 return dd->send_pio_err_status_cnt[31];
2843 }
2844
access_pio_reserved_30_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2845 static u64 access_pio_reserved_30_err_cnt(const struct cntr_entry *entry,
2846 void *context, int vl, int mode,
2847 u64 data)
2848 {
2849 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2850
2851 return dd->send_pio_err_status_cnt[30];
2852 }
2853
access_pio_ppmc_sop_len_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2854 static u64 access_pio_ppmc_sop_len_err_cnt(const struct cntr_entry *entry,
2855 void *context, int vl, int mode,
2856 u64 data)
2857 {
2858 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2859
2860 return dd->send_pio_err_status_cnt[29];
2861 }
2862
access_pio_ppmc_bqc_mem_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2863 static u64 access_pio_ppmc_bqc_mem_parity_err_cnt(
2864 const struct cntr_entry *entry,
2865 void *context, int vl, int mode, u64 data)
2866 {
2867 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2868
2869 return dd->send_pio_err_status_cnt[28];
2870 }
2871
access_pio_vl_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2872 static u64 access_pio_vl_fifo_parity_err_cnt(const struct cntr_entry *entry,
2873 void *context, int vl, int mode,
2874 u64 data)
2875 {
2876 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2877
2878 return dd->send_pio_err_status_cnt[27];
2879 }
2880
access_pio_vlf_sop_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2881 static u64 access_pio_vlf_sop_parity_err_cnt(const struct cntr_entry *entry,
2882 void *context, int vl, int mode,
2883 u64 data)
2884 {
2885 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2886
2887 return dd->send_pio_err_status_cnt[26];
2888 }
2889
access_pio_vlf_v1_len_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2890 static u64 access_pio_vlf_v1_len_parity_err_cnt(const struct cntr_entry *entry,
2891 void *context, int vl,
2892 int mode, u64 data)
2893 {
2894 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2895
2896 return dd->send_pio_err_status_cnt[25];
2897 }
2898
access_pio_block_qw_count_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2899 static u64 access_pio_block_qw_count_parity_err_cnt(
2900 const struct cntr_entry *entry,
2901 void *context, int vl, int mode, u64 data)
2902 {
2903 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2904
2905 return dd->send_pio_err_status_cnt[24];
2906 }
2907
access_pio_write_qw_valid_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2908 static u64 access_pio_write_qw_valid_parity_err_cnt(
2909 const struct cntr_entry *entry,
2910 void *context, int vl, int mode, u64 data)
2911 {
2912 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2913
2914 return dd->send_pio_err_status_cnt[23];
2915 }
2916
access_pio_state_machine_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2917 static u64 access_pio_state_machine_err_cnt(const struct cntr_entry *entry,
2918 void *context, int vl, int mode,
2919 u64 data)
2920 {
2921 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2922
2923 return dd->send_pio_err_status_cnt[22];
2924 }
2925
access_pio_write_data_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2926 static u64 access_pio_write_data_parity_err_cnt(const struct cntr_entry *entry,
2927 void *context, int vl,
2928 int mode, u64 data)
2929 {
2930 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2931
2932 return dd->send_pio_err_status_cnt[21];
2933 }
2934
access_pio_host_addr_mem_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2935 static u64 access_pio_host_addr_mem_cor_err_cnt(const struct cntr_entry *entry,
2936 void *context, int vl,
2937 int mode, u64 data)
2938 {
2939 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2940
2941 return dd->send_pio_err_status_cnt[20];
2942 }
2943
access_pio_host_addr_mem_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2944 static u64 access_pio_host_addr_mem_unc_err_cnt(const struct cntr_entry *entry,
2945 void *context, int vl,
2946 int mode, u64 data)
2947 {
2948 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2949
2950 return dd->send_pio_err_status_cnt[19];
2951 }
2952
access_pio_pkt_evict_sm_or_arb_sm_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2953 static u64 access_pio_pkt_evict_sm_or_arb_sm_err_cnt(
2954 const struct cntr_entry *entry,
2955 void *context, int vl, int mode, u64 data)
2956 {
2957 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2958
2959 return dd->send_pio_err_status_cnt[18];
2960 }
2961
access_pio_init_sm_in_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2962 static u64 access_pio_init_sm_in_err_cnt(const struct cntr_entry *entry,
2963 void *context, int vl, int mode,
2964 u64 data)
2965 {
2966 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2967
2968 return dd->send_pio_err_status_cnt[17];
2969 }
2970
access_pio_ppmc_pbl_fifo_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2971 static u64 access_pio_ppmc_pbl_fifo_err_cnt(const struct cntr_entry *entry,
2972 void *context, int vl, int mode,
2973 u64 data)
2974 {
2975 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2976
2977 return dd->send_pio_err_status_cnt[16];
2978 }
2979
access_pio_credit_ret_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2980 static u64 access_pio_credit_ret_fifo_parity_err_cnt(
2981 const struct cntr_entry *entry,
2982 void *context, int vl, int mode, u64 data)
2983 {
2984 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2985
2986 return dd->send_pio_err_status_cnt[15];
2987 }
2988
access_pio_v1_len_mem_bank1_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2989 static u64 access_pio_v1_len_mem_bank1_cor_err_cnt(
2990 const struct cntr_entry *entry,
2991 void *context, int vl, int mode, u64 data)
2992 {
2993 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
2994
2995 return dd->send_pio_err_status_cnt[14];
2996 }
2997
access_pio_v1_len_mem_bank0_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)2998 static u64 access_pio_v1_len_mem_bank0_cor_err_cnt(
2999 const struct cntr_entry *entry,
3000 void *context, int vl, int mode, u64 data)
3001 {
3002 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3003
3004 return dd->send_pio_err_status_cnt[13];
3005 }
3006
access_pio_v1_len_mem_bank1_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3007 static u64 access_pio_v1_len_mem_bank1_unc_err_cnt(
3008 const struct cntr_entry *entry,
3009 void *context, int vl, int mode, u64 data)
3010 {
3011 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3012
3013 return dd->send_pio_err_status_cnt[12];
3014 }
3015
access_pio_v1_len_mem_bank0_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3016 static u64 access_pio_v1_len_mem_bank0_unc_err_cnt(
3017 const struct cntr_entry *entry,
3018 void *context, int vl, int mode, u64 data)
3019 {
3020 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3021
3022 return dd->send_pio_err_status_cnt[11];
3023 }
3024
access_pio_sm_pkt_reset_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3025 static u64 access_pio_sm_pkt_reset_parity_err_cnt(
3026 const struct cntr_entry *entry,
3027 void *context, int vl, int mode, u64 data)
3028 {
3029 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3030
3031 return dd->send_pio_err_status_cnt[10];
3032 }
3033
access_pio_pkt_evict_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3034 static u64 access_pio_pkt_evict_fifo_parity_err_cnt(
3035 const struct cntr_entry *entry,
3036 void *context, int vl, int mode, u64 data)
3037 {
3038 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3039
3040 return dd->send_pio_err_status_cnt[9];
3041 }
3042
access_pio_sbrdctrl_crrel_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3043 static u64 access_pio_sbrdctrl_crrel_fifo_parity_err_cnt(
3044 const struct cntr_entry *entry,
3045 void *context, int vl, int mode, u64 data)
3046 {
3047 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3048
3049 return dd->send_pio_err_status_cnt[8];
3050 }
3051
access_pio_sbrdctl_crrel_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3052 static u64 access_pio_sbrdctl_crrel_parity_err_cnt(
3053 const struct cntr_entry *entry,
3054 void *context, int vl, int mode, u64 data)
3055 {
3056 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3057
3058 return dd->send_pio_err_status_cnt[7];
3059 }
3060
access_pio_pec_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3061 static u64 access_pio_pec_fifo_parity_err_cnt(const struct cntr_entry *entry,
3062 void *context, int vl, int mode,
3063 u64 data)
3064 {
3065 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3066
3067 return dd->send_pio_err_status_cnt[6];
3068 }
3069
access_pio_pcc_fifo_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3070 static u64 access_pio_pcc_fifo_parity_err_cnt(const struct cntr_entry *entry,
3071 void *context, int vl, int mode,
3072 u64 data)
3073 {
3074 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3075
3076 return dd->send_pio_err_status_cnt[5];
3077 }
3078
access_pio_sb_mem_fifo1_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3079 static u64 access_pio_sb_mem_fifo1_err_cnt(const struct cntr_entry *entry,
3080 void *context, int vl, int mode,
3081 u64 data)
3082 {
3083 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3084
3085 return dd->send_pio_err_status_cnt[4];
3086 }
3087
access_pio_sb_mem_fifo0_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3088 static u64 access_pio_sb_mem_fifo0_err_cnt(const struct cntr_entry *entry,
3089 void *context, int vl, int mode,
3090 u64 data)
3091 {
3092 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3093
3094 return dd->send_pio_err_status_cnt[3];
3095 }
3096
access_pio_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3097 static u64 access_pio_csr_parity_err_cnt(const struct cntr_entry *entry,
3098 void *context, int vl, int mode,
3099 u64 data)
3100 {
3101 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3102
3103 return dd->send_pio_err_status_cnt[2];
3104 }
3105
access_pio_write_addr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3106 static u64 access_pio_write_addr_parity_err_cnt(const struct cntr_entry *entry,
3107 void *context, int vl,
3108 int mode, u64 data)
3109 {
3110 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3111
3112 return dd->send_pio_err_status_cnt[1];
3113 }
3114
access_pio_write_bad_ctxt_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3115 static u64 access_pio_write_bad_ctxt_err_cnt(const struct cntr_entry *entry,
3116 void *context, int vl, int mode,
3117 u64 data)
3118 {
3119 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3120
3121 return dd->send_pio_err_status_cnt[0];
3122 }
3123
3124 /*
3125 * Software counters corresponding to each of the
3126 * error status bits within SendDmaErrStatus
3127 */
access_sdma_pcie_req_tracking_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3128 static u64 access_sdma_pcie_req_tracking_cor_err_cnt(
3129 const struct cntr_entry *entry,
3130 void *context, int vl, int mode, u64 data)
3131 {
3132 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3133
3134 return dd->send_dma_err_status_cnt[3];
3135 }
3136
access_sdma_pcie_req_tracking_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3137 static u64 access_sdma_pcie_req_tracking_unc_err_cnt(
3138 const struct cntr_entry *entry,
3139 void *context, int vl, int mode, u64 data)
3140 {
3141 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3142
3143 return dd->send_dma_err_status_cnt[2];
3144 }
3145
access_sdma_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3146 static u64 access_sdma_csr_parity_err_cnt(const struct cntr_entry *entry,
3147 void *context, int vl, int mode,
3148 u64 data)
3149 {
3150 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3151
3152 return dd->send_dma_err_status_cnt[1];
3153 }
3154
access_sdma_rpy_tag_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3155 static u64 access_sdma_rpy_tag_err_cnt(const struct cntr_entry *entry,
3156 void *context, int vl, int mode,
3157 u64 data)
3158 {
3159 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3160
3161 return dd->send_dma_err_status_cnt[0];
3162 }
3163
3164 /*
3165 * Software counters corresponding to each of the
3166 * error status bits within SendEgressErrStatus
3167 */
access_tx_read_pio_memory_csr_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3168 static u64 access_tx_read_pio_memory_csr_unc_err_cnt(
3169 const struct cntr_entry *entry,
3170 void *context, int vl, int mode, u64 data)
3171 {
3172 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3173
3174 return dd->send_egress_err_status_cnt[63];
3175 }
3176
access_tx_read_sdma_memory_csr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3177 static u64 access_tx_read_sdma_memory_csr_err_cnt(
3178 const struct cntr_entry *entry,
3179 void *context, int vl, int mode, u64 data)
3180 {
3181 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3182
3183 return dd->send_egress_err_status_cnt[62];
3184 }
3185
access_tx_egress_fifo_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3186 static u64 access_tx_egress_fifo_cor_err_cnt(const struct cntr_entry *entry,
3187 void *context, int vl, int mode,
3188 u64 data)
3189 {
3190 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3191
3192 return dd->send_egress_err_status_cnt[61];
3193 }
3194
access_tx_read_pio_memory_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3195 static u64 access_tx_read_pio_memory_cor_err_cnt(const struct cntr_entry *entry,
3196 void *context, int vl,
3197 int mode, u64 data)
3198 {
3199 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3200
3201 return dd->send_egress_err_status_cnt[60];
3202 }
3203
access_tx_read_sdma_memory_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3204 static u64 access_tx_read_sdma_memory_cor_err_cnt(
3205 const struct cntr_entry *entry,
3206 void *context, int vl, int mode, u64 data)
3207 {
3208 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3209
3210 return dd->send_egress_err_status_cnt[59];
3211 }
3212
access_tx_sb_hdr_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3213 static u64 access_tx_sb_hdr_cor_err_cnt(const struct cntr_entry *entry,
3214 void *context, int vl, int mode,
3215 u64 data)
3216 {
3217 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3218
3219 return dd->send_egress_err_status_cnt[58];
3220 }
3221
access_tx_credit_overrun_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3222 static u64 access_tx_credit_overrun_err_cnt(const struct cntr_entry *entry,
3223 void *context, int vl, int mode,
3224 u64 data)
3225 {
3226 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3227
3228 return dd->send_egress_err_status_cnt[57];
3229 }
3230
access_tx_launch_fifo8_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3231 static u64 access_tx_launch_fifo8_cor_err_cnt(const struct cntr_entry *entry,
3232 void *context, int vl, int mode,
3233 u64 data)
3234 {
3235 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3236
3237 return dd->send_egress_err_status_cnt[56];
3238 }
3239
access_tx_launch_fifo7_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3240 static u64 access_tx_launch_fifo7_cor_err_cnt(const struct cntr_entry *entry,
3241 void *context, int vl, int mode,
3242 u64 data)
3243 {
3244 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3245
3246 return dd->send_egress_err_status_cnt[55];
3247 }
3248
access_tx_launch_fifo6_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3249 static u64 access_tx_launch_fifo6_cor_err_cnt(const struct cntr_entry *entry,
3250 void *context, int vl, int mode,
3251 u64 data)
3252 {
3253 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3254
3255 return dd->send_egress_err_status_cnt[54];
3256 }
3257
access_tx_launch_fifo5_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3258 static u64 access_tx_launch_fifo5_cor_err_cnt(const struct cntr_entry *entry,
3259 void *context, int vl, int mode,
3260 u64 data)
3261 {
3262 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3263
3264 return dd->send_egress_err_status_cnt[53];
3265 }
3266
access_tx_launch_fifo4_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3267 static u64 access_tx_launch_fifo4_cor_err_cnt(const struct cntr_entry *entry,
3268 void *context, int vl, int mode,
3269 u64 data)
3270 {
3271 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3272
3273 return dd->send_egress_err_status_cnt[52];
3274 }
3275
access_tx_launch_fifo3_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3276 static u64 access_tx_launch_fifo3_cor_err_cnt(const struct cntr_entry *entry,
3277 void *context, int vl, int mode,
3278 u64 data)
3279 {
3280 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3281
3282 return dd->send_egress_err_status_cnt[51];
3283 }
3284
access_tx_launch_fifo2_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3285 static u64 access_tx_launch_fifo2_cor_err_cnt(const struct cntr_entry *entry,
3286 void *context, int vl, int mode,
3287 u64 data)
3288 {
3289 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3290
3291 return dd->send_egress_err_status_cnt[50];
3292 }
3293
access_tx_launch_fifo1_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3294 static u64 access_tx_launch_fifo1_cor_err_cnt(const struct cntr_entry *entry,
3295 void *context, int vl, int mode,
3296 u64 data)
3297 {
3298 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3299
3300 return dd->send_egress_err_status_cnt[49];
3301 }
3302
access_tx_launch_fifo0_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3303 static u64 access_tx_launch_fifo0_cor_err_cnt(const struct cntr_entry *entry,
3304 void *context, int vl, int mode,
3305 u64 data)
3306 {
3307 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3308
3309 return dd->send_egress_err_status_cnt[48];
3310 }
3311
access_tx_credit_return_vl_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3312 static u64 access_tx_credit_return_vl_err_cnt(const struct cntr_entry *entry,
3313 void *context, int vl, int mode,
3314 u64 data)
3315 {
3316 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3317
3318 return dd->send_egress_err_status_cnt[47];
3319 }
3320
access_tx_hcrc_insertion_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3321 static u64 access_tx_hcrc_insertion_err_cnt(const struct cntr_entry *entry,
3322 void *context, int vl, int mode,
3323 u64 data)
3324 {
3325 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3326
3327 return dd->send_egress_err_status_cnt[46];
3328 }
3329
access_tx_egress_fifo_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3330 static u64 access_tx_egress_fifo_unc_err_cnt(const struct cntr_entry *entry,
3331 void *context, int vl, int mode,
3332 u64 data)
3333 {
3334 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3335
3336 return dd->send_egress_err_status_cnt[45];
3337 }
3338
access_tx_read_pio_memory_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3339 static u64 access_tx_read_pio_memory_unc_err_cnt(const struct cntr_entry *entry,
3340 void *context, int vl,
3341 int mode, u64 data)
3342 {
3343 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3344
3345 return dd->send_egress_err_status_cnt[44];
3346 }
3347
access_tx_read_sdma_memory_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3348 static u64 access_tx_read_sdma_memory_unc_err_cnt(
3349 const struct cntr_entry *entry,
3350 void *context, int vl, int mode, u64 data)
3351 {
3352 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3353
3354 return dd->send_egress_err_status_cnt[43];
3355 }
3356
access_tx_sb_hdr_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3357 static u64 access_tx_sb_hdr_unc_err_cnt(const struct cntr_entry *entry,
3358 void *context, int vl, int mode,
3359 u64 data)
3360 {
3361 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3362
3363 return dd->send_egress_err_status_cnt[42];
3364 }
3365
access_tx_credit_return_partiy_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3366 static u64 access_tx_credit_return_partiy_err_cnt(
3367 const struct cntr_entry *entry,
3368 void *context, int vl, int mode, u64 data)
3369 {
3370 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3371
3372 return dd->send_egress_err_status_cnt[41];
3373 }
3374
access_tx_launch_fifo8_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3375 static u64 access_tx_launch_fifo8_unc_or_parity_err_cnt(
3376 const struct cntr_entry *entry,
3377 void *context, int vl, int mode, u64 data)
3378 {
3379 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3380
3381 return dd->send_egress_err_status_cnt[40];
3382 }
3383
access_tx_launch_fifo7_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3384 static u64 access_tx_launch_fifo7_unc_or_parity_err_cnt(
3385 const struct cntr_entry *entry,
3386 void *context, int vl, int mode, u64 data)
3387 {
3388 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3389
3390 return dd->send_egress_err_status_cnt[39];
3391 }
3392
access_tx_launch_fifo6_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3393 static u64 access_tx_launch_fifo6_unc_or_parity_err_cnt(
3394 const struct cntr_entry *entry,
3395 void *context, int vl, int mode, u64 data)
3396 {
3397 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3398
3399 return dd->send_egress_err_status_cnt[38];
3400 }
3401
access_tx_launch_fifo5_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3402 static u64 access_tx_launch_fifo5_unc_or_parity_err_cnt(
3403 const struct cntr_entry *entry,
3404 void *context, int vl, int mode, u64 data)
3405 {
3406 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3407
3408 return dd->send_egress_err_status_cnt[37];
3409 }
3410
access_tx_launch_fifo4_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3411 static u64 access_tx_launch_fifo4_unc_or_parity_err_cnt(
3412 const struct cntr_entry *entry,
3413 void *context, int vl, int mode, u64 data)
3414 {
3415 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3416
3417 return dd->send_egress_err_status_cnt[36];
3418 }
3419
access_tx_launch_fifo3_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3420 static u64 access_tx_launch_fifo3_unc_or_parity_err_cnt(
3421 const struct cntr_entry *entry,
3422 void *context, int vl, int mode, u64 data)
3423 {
3424 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3425
3426 return dd->send_egress_err_status_cnt[35];
3427 }
3428
access_tx_launch_fifo2_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3429 static u64 access_tx_launch_fifo2_unc_or_parity_err_cnt(
3430 const struct cntr_entry *entry,
3431 void *context, int vl, int mode, u64 data)
3432 {
3433 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3434
3435 return dd->send_egress_err_status_cnt[34];
3436 }
3437
access_tx_launch_fifo1_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3438 static u64 access_tx_launch_fifo1_unc_or_parity_err_cnt(
3439 const struct cntr_entry *entry,
3440 void *context, int vl, int mode, u64 data)
3441 {
3442 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3443
3444 return dd->send_egress_err_status_cnt[33];
3445 }
3446
access_tx_launch_fifo0_unc_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3447 static u64 access_tx_launch_fifo0_unc_or_parity_err_cnt(
3448 const struct cntr_entry *entry,
3449 void *context, int vl, int mode, u64 data)
3450 {
3451 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3452
3453 return dd->send_egress_err_status_cnt[32];
3454 }
3455
access_tx_sdma15_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3456 static u64 access_tx_sdma15_disallowed_packet_err_cnt(
3457 const struct cntr_entry *entry,
3458 void *context, int vl, int mode, u64 data)
3459 {
3460 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3461
3462 return dd->send_egress_err_status_cnt[31];
3463 }
3464
access_tx_sdma14_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3465 static u64 access_tx_sdma14_disallowed_packet_err_cnt(
3466 const struct cntr_entry *entry,
3467 void *context, int vl, int mode, u64 data)
3468 {
3469 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3470
3471 return dd->send_egress_err_status_cnt[30];
3472 }
3473
access_tx_sdma13_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3474 static u64 access_tx_sdma13_disallowed_packet_err_cnt(
3475 const struct cntr_entry *entry,
3476 void *context, int vl, int mode, u64 data)
3477 {
3478 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3479
3480 return dd->send_egress_err_status_cnt[29];
3481 }
3482
access_tx_sdma12_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3483 static u64 access_tx_sdma12_disallowed_packet_err_cnt(
3484 const struct cntr_entry *entry,
3485 void *context, int vl, int mode, u64 data)
3486 {
3487 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3488
3489 return dd->send_egress_err_status_cnt[28];
3490 }
3491
access_tx_sdma11_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3492 static u64 access_tx_sdma11_disallowed_packet_err_cnt(
3493 const struct cntr_entry *entry,
3494 void *context, int vl, int mode, u64 data)
3495 {
3496 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3497
3498 return dd->send_egress_err_status_cnt[27];
3499 }
3500
access_tx_sdma10_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3501 static u64 access_tx_sdma10_disallowed_packet_err_cnt(
3502 const struct cntr_entry *entry,
3503 void *context, int vl, int mode, u64 data)
3504 {
3505 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3506
3507 return dd->send_egress_err_status_cnt[26];
3508 }
3509
access_tx_sdma9_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3510 static u64 access_tx_sdma9_disallowed_packet_err_cnt(
3511 const struct cntr_entry *entry,
3512 void *context, int vl, int mode, u64 data)
3513 {
3514 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3515
3516 return dd->send_egress_err_status_cnt[25];
3517 }
3518
access_tx_sdma8_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3519 static u64 access_tx_sdma8_disallowed_packet_err_cnt(
3520 const struct cntr_entry *entry,
3521 void *context, int vl, int mode, u64 data)
3522 {
3523 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3524
3525 return dd->send_egress_err_status_cnt[24];
3526 }
3527
access_tx_sdma7_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3528 static u64 access_tx_sdma7_disallowed_packet_err_cnt(
3529 const struct cntr_entry *entry,
3530 void *context, int vl, int mode, u64 data)
3531 {
3532 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3533
3534 return dd->send_egress_err_status_cnt[23];
3535 }
3536
access_tx_sdma6_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3537 static u64 access_tx_sdma6_disallowed_packet_err_cnt(
3538 const struct cntr_entry *entry,
3539 void *context, int vl, int mode, u64 data)
3540 {
3541 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3542
3543 return dd->send_egress_err_status_cnt[22];
3544 }
3545
access_tx_sdma5_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3546 static u64 access_tx_sdma5_disallowed_packet_err_cnt(
3547 const struct cntr_entry *entry,
3548 void *context, int vl, int mode, u64 data)
3549 {
3550 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3551
3552 return dd->send_egress_err_status_cnt[21];
3553 }
3554
access_tx_sdma4_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3555 static u64 access_tx_sdma4_disallowed_packet_err_cnt(
3556 const struct cntr_entry *entry,
3557 void *context, int vl, int mode, u64 data)
3558 {
3559 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3560
3561 return dd->send_egress_err_status_cnt[20];
3562 }
3563
access_tx_sdma3_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3564 static u64 access_tx_sdma3_disallowed_packet_err_cnt(
3565 const struct cntr_entry *entry,
3566 void *context, int vl, int mode, u64 data)
3567 {
3568 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3569
3570 return dd->send_egress_err_status_cnt[19];
3571 }
3572
access_tx_sdma2_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3573 static u64 access_tx_sdma2_disallowed_packet_err_cnt(
3574 const struct cntr_entry *entry,
3575 void *context, int vl, int mode, u64 data)
3576 {
3577 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3578
3579 return dd->send_egress_err_status_cnt[18];
3580 }
3581
access_tx_sdma1_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3582 static u64 access_tx_sdma1_disallowed_packet_err_cnt(
3583 const struct cntr_entry *entry,
3584 void *context, int vl, int mode, u64 data)
3585 {
3586 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3587
3588 return dd->send_egress_err_status_cnt[17];
3589 }
3590
access_tx_sdma0_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3591 static u64 access_tx_sdma0_disallowed_packet_err_cnt(
3592 const struct cntr_entry *entry,
3593 void *context, int vl, int mode, u64 data)
3594 {
3595 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3596
3597 return dd->send_egress_err_status_cnt[16];
3598 }
3599
access_tx_config_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3600 static u64 access_tx_config_parity_err_cnt(const struct cntr_entry *entry,
3601 void *context, int vl, int mode,
3602 u64 data)
3603 {
3604 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3605
3606 return dd->send_egress_err_status_cnt[15];
3607 }
3608
access_tx_sbrd_ctl_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3609 static u64 access_tx_sbrd_ctl_csr_parity_err_cnt(const struct cntr_entry *entry,
3610 void *context, int vl,
3611 int mode, u64 data)
3612 {
3613 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3614
3615 return dd->send_egress_err_status_cnt[14];
3616 }
3617
access_tx_launch_csr_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3618 static u64 access_tx_launch_csr_parity_err_cnt(const struct cntr_entry *entry,
3619 void *context, int vl, int mode,
3620 u64 data)
3621 {
3622 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3623
3624 return dd->send_egress_err_status_cnt[13];
3625 }
3626
access_tx_illegal_vl_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3627 static u64 access_tx_illegal_vl_err_cnt(const struct cntr_entry *entry,
3628 void *context, int vl, int mode,
3629 u64 data)
3630 {
3631 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3632
3633 return dd->send_egress_err_status_cnt[12];
3634 }
3635
access_tx_sbrd_ctl_state_machine_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3636 static u64 access_tx_sbrd_ctl_state_machine_parity_err_cnt(
3637 const struct cntr_entry *entry,
3638 void *context, int vl, int mode, u64 data)
3639 {
3640 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3641
3642 return dd->send_egress_err_status_cnt[11];
3643 }
3644
access_egress_reserved_10_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3645 static u64 access_egress_reserved_10_err_cnt(const struct cntr_entry *entry,
3646 void *context, int vl, int mode,
3647 u64 data)
3648 {
3649 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3650
3651 return dd->send_egress_err_status_cnt[10];
3652 }
3653
access_egress_reserved_9_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3654 static u64 access_egress_reserved_9_err_cnt(const struct cntr_entry *entry,
3655 void *context, int vl, int mode,
3656 u64 data)
3657 {
3658 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3659
3660 return dd->send_egress_err_status_cnt[9];
3661 }
3662
access_tx_sdma_launch_intf_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3663 static u64 access_tx_sdma_launch_intf_parity_err_cnt(
3664 const struct cntr_entry *entry,
3665 void *context, int vl, int mode, u64 data)
3666 {
3667 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3668
3669 return dd->send_egress_err_status_cnt[8];
3670 }
3671
access_tx_pio_launch_intf_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3672 static u64 access_tx_pio_launch_intf_parity_err_cnt(
3673 const struct cntr_entry *entry,
3674 void *context, int vl, int mode, u64 data)
3675 {
3676 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3677
3678 return dd->send_egress_err_status_cnt[7];
3679 }
3680
access_egress_reserved_6_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3681 static u64 access_egress_reserved_6_err_cnt(const struct cntr_entry *entry,
3682 void *context, int vl, int mode,
3683 u64 data)
3684 {
3685 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3686
3687 return dd->send_egress_err_status_cnt[6];
3688 }
3689
access_tx_incorrect_link_state_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3690 static u64 access_tx_incorrect_link_state_err_cnt(
3691 const struct cntr_entry *entry,
3692 void *context, int vl, int mode, u64 data)
3693 {
3694 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3695
3696 return dd->send_egress_err_status_cnt[5];
3697 }
3698
access_tx_linkdown_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3699 static u64 access_tx_linkdown_err_cnt(const struct cntr_entry *entry,
3700 void *context, int vl, int mode,
3701 u64 data)
3702 {
3703 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3704
3705 return dd->send_egress_err_status_cnt[4];
3706 }
3707
access_tx_egress_fifi_underrun_or_parity_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3708 static u64 access_tx_egress_fifi_underrun_or_parity_err_cnt(
3709 const struct cntr_entry *entry,
3710 void *context, int vl, int mode, u64 data)
3711 {
3712 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3713
3714 return dd->send_egress_err_status_cnt[3];
3715 }
3716
access_egress_reserved_2_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3717 static u64 access_egress_reserved_2_err_cnt(const struct cntr_entry *entry,
3718 void *context, int vl, int mode,
3719 u64 data)
3720 {
3721 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3722
3723 return dd->send_egress_err_status_cnt[2];
3724 }
3725
access_tx_pkt_integrity_mem_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3726 static u64 access_tx_pkt_integrity_mem_unc_err_cnt(
3727 const struct cntr_entry *entry,
3728 void *context, int vl, int mode, u64 data)
3729 {
3730 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3731
3732 return dd->send_egress_err_status_cnt[1];
3733 }
3734
access_tx_pkt_integrity_mem_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3735 static u64 access_tx_pkt_integrity_mem_cor_err_cnt(
3736 const struct cntr_entry *entry,
3737 void *context, int vl, int mode, u64 data)
3738 {
3739 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3740
3741 return dd->send_egress_err_status_cnt[0];
3742 }
3743
3744 /*
3745 * Software counters corresponding to each of the
3746 * error status bits within SendErrStatus
3747 */
access_send_csr_write_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3748 static u64 access_send_csr_write_bad_addr_err_cnt(
3749 const struct cntr_entry *entry,
3750 void *context, int vl, int mode, u64 data)
3751 {
3752 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3753
3754 return dd->send_err_status_cnt[2];
3755 }
3756
access_send_csr_read_bad_addr_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3757 static u64 access_send_csr_read_bad_addr_err_cnt(const struct cntr_entry *entry,
3758 void *context, int vl,
3759 int mode, u64 data)
3760 {
3761 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3762
3763 return dd->send_err_status_cnt[1];
3764 }
3765
access_send_csr_parity_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3766 static u64 access_send_csr_parity_cnt(const struct cntr_entry *entry,
3767 void *context, int vl, int mode,
3768 u64 data)
3769 {
3770 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3771
3772 return dd->send_err_status_cnt[0];
3773 }
3774
3775 /*
3776 * Software counters corresponding to each of the
3777 * error status bits within SendCtxtErrStatus
3778 */
access_pio_write_out_of_bounds_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3779 static u64 access_pio_write_out_of_bounds_err_cnt(
3780 const struct cntr_entry *entry,
3781 void *context, int vl, int mode, u64 data)
3782 {
3783 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3784
3785 return dd->sw_ctxt_err_status_cnt[4];
3786 }
3787
access_pio_write_overflow_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3788 static u64 access_pio_write_overflow_err_cnt(const struct cntr_entry *entry,
3789 void *context, int vl, int mode,
3790 u64 data)
3791 {
3792 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3793
3794 return dd->sw_ctxt_err_status_cnt[3];
3795 }
3796
access_pio_write_crosses_boundary_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3797 static u64 access_pio_write_crosses_boundary_err_cnt(
3798 const struct cntr_entry *entry,
3799 void *context, int vl, int mode, u64 data)
3800 {
3801 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3802
3803 return dd->sw_ctxt_err_status_cnt[2];
3804 }
3805
access_pio_disallowed_packet_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3806 static u64 access_pio_disallowed_packet_err_cnt(const struct cntr_entry *entry,
3807 void *context, int vl,
3808 int mode, u64 data)
3809 {
3810 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3811
3812 return dd->sw_ctxt_err_status_cnt[1];
3813 }
3814
access_pio_inconsistent_sop_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3815 static u64 access_pio_inconsistent_sop_err_cnt(const struct cntr_entry *entry,
3816 void *context, int vl, int mode,
3817 u64 data)
3818 {
3819 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3820
3821 return dd->sw_ctxt_err_status_cnt[0];
3822 }
3823
3824 /*
3825 * Software counters corresponding to each of the
3826 * error status bits within SendDmaEngErrStatus
3827 */
access_sdma_header_request_fifo_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3828 static u64 access_sdma_header_request_fifo_cor_err_cnt(
3829 const struct cntr_entry *entry,
3830 void *context, int vl, int mode, u64 data)
3831 {
3832 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3833
3834 return dd->sw_send_dma_eng_err_status_cnt[23];
3835 }
3836
access_sdma_header_storage_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3837 static u64 access_sdma_header_storage_cor_err_cnt(
3838 const struct cntr_entry *entry,
3839 void *context, int vl, int mode, u64 data)
3840 {
3841 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3842
3843 return dd->sw_send_dma_eng_err_status_cnt[22];
3844 }
3845
access_sdma_packet_tracking_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3846 static u64 access_sdma_packet_tracking_cor_err_cnt(
3847 const struct cntr_entry *entry,
3848 void *context, int vl, int mode, u64 data)
3849 {
3850 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3851
3852 return dd->sw_send_dma_eng_err_status_cnt[21];
3853 }
3854
access_sdma_assembly_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3855 static u64 access_sdma_assembly_cor_err_cnt(const struct cntr_entry *entry,
3856 void *context, int vl, int mode,
3857 u64 data)
3858 {
3859 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3860
3861 return dd->sw_send_dma_eng_err_status_cnt[20];
3862 }
3863
access_sdma_desc_table_cor_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3864 static u64 access_sdma_desc_table_cor_err_cnt(const struct cntr_entry *entry,
3865 void *context, int vl, int mode,
3866 u64 data)
3867 {
3868 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3869
3870 return dd->sw_send_dma_eng_err_status_cnt[19];
3871 }
3872
access_sdma_header_request_fifo_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3873 static u64 access_sdma_header_request_fifo_unc_err_cnt(
3874 const struct cntr_entry *entry,
3875 void *context, int vl, int mode, u64 data)
3876 {
3877 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3878
3879 return dd->sw_send_dma_eng_err_status_cnt[18];
3880 }
3881
access_sdma_header_storage_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3882 static u64 access_sdma_header_storage_unc_err_cnt(
3883 const struct cntr_entry *entry,
3884 void *context, int vl, int mode, u64 data)
3885 {
3886 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3887
3888 return dd->sw_send_dma_eng_err_status_cnt[17];
3889 }
3890
access_sdma_packet_tracking_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3891 static u64 access_sdma_packet_tracking_unc_err_cnt(
3892 const struct cntr_entry *entry,
3893 void *context, int vl, int mode, u64 data)
3894 {
3895 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3896
3897 return dd->sw_send_dma_eng_err_status_cnt[16];
3898 }
3899
access_sdma_assembly_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3900 static u64 access_sdma_assembly_unc_err_cnt(const struct cntr_entry *entry,
3901 void *context, int vl, int mode,
3902 u64 data)
3903 {
3904 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3905
3906 return dd->sw_send_dma_eng_err_status_cnt[15];
3907 }
3908
access_sdma_desc_table_unc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3909 static u64 access_sdma_desc_table_unc_err_cnt(const struct cntr_entry *entry,
3910 void *context, int vl, int mode,
3911 u64 data)
3912 {
3913 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3914
3915 return dd->sw_send_dma_eng_err_status_cnt[14];
3916 }
3917
access_sdma_timeout_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3918 static u64 access_sdma_timeout_err_cnt(const struct cntr_entry *entry,
3919 void *context, int vl, int mode,
3920 u64 data)
3921 {
3922 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3923
3924 return dd->sw_send_dma_eng_err_status_cnt[13];
3925 }
3926
access_sdma_header_length_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3927 static u64 access_sdma_header_length_err_cnt(const struct cntr_entry *entry,
3928 void *context, int vl, int mode,
3929 u64 data)
3930 {
3931 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3932
3933 return dd->sw_send_dma_eng_err_status_cnt[12];
3934 }
3935
access_sdma_header_address_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3936 static u64 access_sdma_header_address_err_cnt(const struct cntr_entry *entry,
3937 void *context, int vl, int mode,
3938 u64 data)
3939 {
3940 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3941
3942 return dd->sw_send_dma_eng_err_status_cnt[11];
3943 }
3944
access_sdma_header_select_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3945 static u64 access_sdma_header_select_err_cnt(const struct cntr_entry *entry,
3946 void *context, int vl, int mode,
3947 u64 data)
3948 {
3949 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3950
3951 return dd->sw_send_dma_eng_err_status_cnt[10];
3952 }
3953
access_sdma_reserved_9_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3954 static u64 access_sdma_reserved_9_err_cnt(const struct cntr_entry *entry,
3955 void *context, int vl, int mode,
3956 u64 data)
3957 {
3958 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3959
3960 return dd->sw_send_dma_eng_err_status_cnt[9];
3961 }
3962
access_sdma_packet_desc_overflow_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3963 static u64 access_sdma_packet_desc_overflow_err_cnt(
3964 const struct cntr_entry *entry,
3965 void *context, int vl, int mode, u64 data)
3966 {
3967 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3968
3969 return dd->sw_send_dma_eng_err_status_cnt[8];
3970 }
3971
access_sdma_length_mismatch_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3972 static u64 access_sdma_length_mismatch_err_cnt(const struct cntr_entry *entry,
3973 void *context, int vl,
3974 int mode, u64 data)
3975 {
3976 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3977
3978 return dd->sw_send_dma_eng_err_status_cnt[7];
3979 }
3980
access_sdma_halt_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3981 static u64 access_sdma_halt_err_cnt(const struct cntr_entry *entry,
3982 void *context, int vl, int mode, u64 data)
3983 {
3984 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3985
3986 return dd->sw_send_dma_eng_err_status_cnt[6];
3987 }
3988
access_sdma_mem_read_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3989 static u64 access_sdma_mem_read_err_cnt(const struct cntr_entry *entry,
3990 void *context, int vl, int mode,
3991 u64 data)
3992 {
3993 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
3994
3995 return dd->sw_send_dma_eng_err_status_cnt[5];
3996 }
3997
access_sdma_first_desc_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)3998 static u64 access_sdma_first_desc_err_cnt(const struct cntr_entry *entry,
3999 void *context, int vl, int mode,
4000 u64 data)
4001 {
4002 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4003
4004 return dd->sw_send_dma_eng_err_status_cnt[4];
4005 }
4006
access_sdma_tail_out_of_bounds_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)4007 static u64 access_sdma_tail_out_of_bounds_err_cnt(
4008 const struct cntr_entry *entry,
4009 void *context, int vl, int mode, u64 data)
4010 {
4011 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4012
4013 return dd->sw_send_dma_eng_err_status_cnt[3];
4014 }
4015
access_sdma_too_long_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)4016 static u64 access_sdma_too_long_err_cnt(const struct cntr_entry *entry,
4017 void *context, int vl, int mode,
4018 u64 data)
4019 {
4020 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4021
4022 return dd->sw_send_dma_eng_err_status_cnt[2];
4023 }
4024
access_sdma_gen_mismatch_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)4025 static u64 access_sdma_gen_mismatch_err_cnt(const struct cntr_entry *entry,
4026 void *context, int vl, int mode,
4027 u64 data)
4028 {
4029 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4030
4031 return dd->sw_send_dma_eng_err_status_cnt[1];
4032 }
4033
access_sdma_wrong_dw_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)4034 static u64 access_sdma_wrong_dw_err_cnt(const struct cntr_entry *entry,
4035 void *context, int vl, int mode,
4036 u64 data)
4037 {
4038 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4039
4040 return dd->sw_send_dma_eng_err_status_cnt[0];
4041 }
4042
access_dc_rcv_err_cnt(const struct cntr_entry * entry,void * context,int vl,int mode,u64 data)4043 static u64 access_dc_rcv_err_cnt(const struct cntr_entry *entry,
4044 void *context, int vl, int mode,
4045 u64 data)
4046 {
4047 struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
4048
4049 u64 val = 0;
4050 u64 csr = entry->csr;
4051
4052 val = read_write_csr(dd, csr, mode, data);
4053 if (mode == CNTR_MODE_R) {
4054 val = val > CNTR_MAX - dd->sw_rcv_bypass_packet_errors ?
4055 CNTR_MAX : val + dd->sw_rcv_bypass_packet_errors;
4056 } else if (mode == CNTR_MODE_W) {
4057 dd->sw_rcv_bypass_packet_errors = 0;
4058 } else {
4059 dd_dev_err(dd, "Invalid cntr register access mode");
4060 return 0;
4061 }
4062 return val;
4063 }
4064
4065 #define def_access_sw_cpu(cntr) \
4066 static u64 access_sw_cpu_##cntr(const struct cntr_entry *entry, \
4067 void *context, int vl, int mode, u64 data) \
4068 { \
4069 struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context; \
4070 return read_write_cpu(ppd->dd, &ppd->ibport_data.rvp.z_ ##cntr, \
4071 ppd->ibport_data.rvp.cntr, vl, \
4072 mode, data); \
4073 }
4074
4075 def_access_sw_cpu(rc_acks);
4076 def_access_sw_cpu(rc_qacks);
4077 def_access_sw_cpu(rc_delayed_comp);
4078
4079 #define def_access_ibp_counter(cntr) \
4080 static u64 access_ibp_##cntr(const struct cntr_entry *entry, \
4081 void *context, int vl, int mode, u64 data) \
4082 { \
4083 struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context; \
4084 \
4085 if (vl != CNTR_INVALID_VL) \
4086 return 0; \
4087 \
4088 return read_write_sw(ppd->dd, &ppd->ibport_data.rvp.n_ ##cntr, \
4089 mode, data); \
4090 }
4091
4092 def_access_ibp_counter(loop_pkts);
4093 def_access_ibp_counter(rc_resends);
4094 def_access_ibp_counter(rnr_naks);
4095 def_access_ibp_counter(other_naks);
4096 def_access_ibp_counter(rc_timeouts);
4097 def_access_ibp_counter(pkt_drops);
4098 def_access_ibp_counter(dmawait);
4099 def_access_ibp_counter(rc_seqnak);
4100 def_access_ibp_counter(rc_dupreq);
4101 def_access_ibp_counter(rdma_seq);
4102 def_access_ibp_counter(unaligned);
4103 def_access_ibp_counter(seq_naks);
4104 def_access_ibp_counter(rc_crwaits);
4105
4106 static struct cntr_entry dev_cntrs[DEV_CNTR_LAST] = {
4107 [C_RCV_OVF] = RXE32_DEV_CNTR_ELEM(RcvOverflow, RCV_BUF_OVFL_CNT, CNTR_SYNTH),
4108 [C_RX_LEN_ERR] = RXE32_DEV_CNTR_ELEM(RxLenErr, RCV_LENGTH_ERR_CNT, CNTR_SYNTH),
4109 [C_RX_ICRC_ERR] = RXE32_DEV_CNTR_ELEM(RxICrcErr, RCV_ICRC_ERR_CNT, CNTR_SYNTH),
4110 [C_RX_EBP] = RXE32_DEV_CNTR_ELEM(RxEbpCnt, RCV_EBP_CNT, CNTR_SYNTH),
4111 [C_RX_TID_FULL] = RXE32_DEV_CNTR_ELEM(RxTIDFullEr, RCV_TID_FULL_ERR_CNT,
4112 CNTR_NORMAL),
4113 [C_RX_TID_INVALID] = RXE32_DEV_CNTR_ELEM(RxTIDInvalid, RCV_TID_VALID_ERR_CNT,
4114 CNTR_NORMAL),
4115 [C_RX_TID_FLGMS] = RXE32_DEV_CNTR_ELEM(RxTidFLGMs,
4116 RCV_TID_FLOW_GEN_MISMATCH_CNT,
4117 CNTR_NORMAL),
4118 [C_RX_CTX_EGRS] = RXE32_DEV_CNTR_ELEM(RxCtxEgrS, RCV_CONTEXT_EGR_STALL,
4119 CNTR_NORMAL),
4120 [C_RCV_TID_FLSMS] = RXE32_DEV_CNTR_ELEM(RxTidFLSMs,
4121 RCV_TID_FLOW_SEQ_MISMATCH_CNT, CNTR_NORMAL),
4122 [C_CCE_PCI_CR_ST] = CCE_PERF_DEV_CNTR_ELEM(CcePciCrSt,
4123 CCE_PCIE_POSTED_CRDT_STALL_CNT, CNTR_NORMAL),
4124 [C_CCE_PCI_TR_ST] = CCE_PERF_DEV_CNTR_ELEM(CcePciTrSt, CCE_PCIE_TRGT_STALL_CNT,
4125 CNTR_NORMAL),
4126 [C_CCE_PIO_WR_ST] = CCE_PERF_DEV_CNTR_ELEM(CcePioWrSt, CCE_PIO_WR_STALL_CNT,
4127 CNTR_NORMAL),
4128 [C_CCE_ERR_INT] = CCE_INT_DEV_CNTR_ELEM(CceErrInt, CCE_ERR_INT_CNT,
4129 CNTR_NORMAL),
4130 [C_CCE_SDMA_INT] = CCE_INT_DEV_CNTR_ELEM(CceSdmaInt, CCE_SDMA_INT_CNT,
4131 CNTR_NORMAL),
4132 [C_CCE_MISC_INT] = CCE_INT_DEV_CNTR_ELEM(CceMiscInt, CCE_MISC_INT_CNT,
4133 CNTR_NORMAL),
4134 [C_CCE_RCV_AV_INT] = CCE_INT_DEV_CNTR_ELEM(CceRcvAvInt, CCE_RCV_AVAIL_INT_CNT,
4135 CNTR_NORMAL),
4136 [C_CCE_RCV_URG_INT] = CCE_INT_DEV_CNTR_ELEM(CceRcvUrgInt,
4137 CCE_RCV_URGENT_INT_CNT, CNTR_NORMAL),
4138 [C_CCE_SEND_CR_INT] = CCE_INT_DEV_CNTR_ELEM(CceSndCrInt,
4139 CCE_SEND_CREDIT_INT_CNT, CNTR_NORMAL),
4140 [C_DC_UNC_ERR] = DC_PERF_CNTR(DcUnctblErr, DCC_ERR_UNCORRECTABLE_CNT,
4141 CNTR_SYNTH),
4142 [C_DC_RCV_ERR] = CNTR_ELEM("DcRecvErr", DCC_ERR_PORTRCV_ERR_CNT, 0, CNTR_SYNTH,
4143 access_dc_rcv_err_cnt),
4144 [C_DC_FM_CFG_ERR] = DC_PERF_CNTR(DcFmCfgErr, DCC_ERR_FMCONFIG_ERR_CNT,
4145 CNTR_SYNTH),
4146 [C_DC_RMT_PHY_ERR] = DC_PERF_CNTR(DcRmtPhyErr, DCC_ERR_RCVREMOTE_PHY_ERR_CNT,
4147 CNTR_SYNTH),
4148 [C_DC_DROPPED_PKT] = DC_PERF_CNTR(DcDroppedPkt, DCC_ERR_DROPPED_PKT_CNT,
4149 CNTR_SYNTH),
4150 [C_DC_MC_XMIT_PKTS] = DC_PERF_CNTR(DcMcXmitPkts,
4151 DCC_PRF_PORT_XMIT_MULTICAST_CNT, CNTR_SYNTH),
4152 [C_DC_MC_RCV_PKTS] = DC_PERF_CNTR(DcMcRcvPkts,
4153 DCC_PRF_PORT_RCV_MULTICAST_PKT_CNT,
4154 CNTR_SYNTH),
4155 [C_DC_XMIT_CERR] = DC_PERF_CNTR(DcXmitCorr,
4156 DCC_PRF_PORT_XMIT_CORRECTABLE_CNT, CNTR_SYNTH),
4157 [C_DC_RCV_CERR] = DC_PERF_CNTR(DcRcvCorrCnt, DCC_PRF_PORT_RCV_CORRECTABLE_CNT,
4158 CNTR_SYNTH),
4159 [C_DC_RCV_FCC] = DC_PERF_CNTR(DcRxFCntl, DCC_PRF_RX_FLOW_CRTL_CNT,
4160 CNTR_SYNTH),
4161 [C_DC_XMIT_FCC] = DC_PERF_CNTR(DcXmitFCntl, DCC_PRF_TX_FLOW_CRTL_CNT,
4162 CNTR_SYNTH),
4163 [C_DC_XMIT_FLITS] = DC_PERF_CNTR(DcXmitFlits, DCC_PRF_PORT_XMIT_DATA_CNT,
4164 CNTR_SYNTH),
4165 [C_DC_RCV_FLITS] = DC_PERF_CNTR(DcRcvFlits, DCC_PRF_PORT_RCV_DATA_CNT,
4166 CNTR_SYNTH),
4167 [C_DC_XMIT_PKTS] = DC_PERF_CNTR(DcXmitPkts, DCC_PRF_PORT_XMIT_PKTS_CNT,
4168 CNTR_SYNTH),
4169 [C_DC_RCV_PKTS] = DC_PERF_CNTR(DcRcvPkts, DCC_PRF_PORT_RCV_PKTS_CNT,
4170 CNTR_SYNTH),
4171 [C_DC_RX_FLIT_VL] = DC_PERF_CNTR(DcRxFlitVl, DCC_PRF_PORT_VL_RCV_DATA_CNT,
4172 CNTR_SYNTH | CNTR_VL),
4173 [C_DC_RX_PKT_VL] = DC_PERF_CNTR(DcRxPktVl, DCC_PRF_PORT_VL_RCV_PKTS_CNT,
4174 CNTR_SYNTH | CNTR_VL),
4175 [C_DC_RCV_FCN] = DC_PERF_CNTR(DcRcvFcn, DCC_PRF_PORT_RCV_FECN_CNT, CNTR_SYNTH),
4176 [C_DC_RCV_FCN_VL] = DC_PERF_CNTR(DcRcvFcnVl, DCC_PRF_PORT_VL_RCV_FECN_CNT,
4177 CNTR_SYNTH | CNTR_VL),
4178 [C_DC_RCV_BCN] = DC_PERF_CNTR(DcRcvBcn, DCC_PRF_PORT_RCV_BECN_CNT, CNTR_SYNTH),
4179 [C_DC_RCV_BCN_VL] = DC_PERF_CNTR(DcRcvBcnVl, DCC_PRF_PORT_VL_RCV_BECN_CNT,
4180 CNTR_SYNTH | CNTR_VL),
4181 [C_DC_RCV_BBL] = DC_PERF_CNTR(DcRcvBbl, DCC_PRF_PORT_RCV_BUBBLE_CNT,
4182 CNTR_SYNTH),
4183 [C_DC_RCV_BBL_VL] = DC_PERF_CNTR(DcRcvBblVl, DCC_PRF_PORT_VL_RCV_BUBBLE_CNT,
4184 CNTR_SYNTH | CNTR_VL),
4185 [C_DC_MARK_FECN] = DC_PERF_CNTR(DcMarkFcn, DCC_PRF_PORT_MARK_FECN_CNT,
4186 CNTR_SYNTH),
4187 [C_DC_MARK_FECN_VL] = DC_PERF_CNTR(DcMarkFcnVl, DCC_PRF_PORT_VL_MARK_FECN_CNT,
4188 CNTR_SYNTH | CNTR_VL),
4189 [C_DC_TOTAL_CRC] =
4190 DC_PERF_CNTR_LCB(DcTotCrc, DC_LCB_ERR_INFO_TOTAL_CRC_ERR,
4191 CNTR_SYNTH),
4192 [C_DC_CRC_LN0] = DC_PERF_CNTR_LCB(DcCrcLn0, DC_LCB_ERR_INFO_CRC_ERR_LN0,
4193 CNTR_SYNTH),
4194 [C_DC_CRC_LN1] = DC_PERF_CNTR_LCB(DcCrcLn1, DC_LCB_ERR_INFO_CRC_ERR_LN1,
4195 CNTR_SYNTH),
4196 [C_DC_CRC_LN2] = DC_PERF_CNTR_LCB(DcCrcLn2, DC_LCB_ERR_INFO_CRC_ERR_LN2,
4197 CNTR_SYNTH),
4198 [C_DC_CRC_LN3] = DC_PERF_CNTR_LCB(DcCrcLn3, DC_LCB_ERR_INFO_CRC_ERR_LN3,
4199 CNTR_SYNTH),
4200 [C_DC_CRC_MULT_LN] =
4201 DC_PERF_CNTR_LCB(DcMultLn, DC_LCB_ERR_INFO_CRC_ERR_MULTI_LN,
4202 CNTR_SYNTH),
4203 [C_DC_TX_REPLAY] = DC_PERF_CNTR_LCB(DcTxReplay, DC_LCB_ERR_INFO_TX_REPLAY_CNT,
4204 CNTR_SYNTH),
4205 [C_DC_RX_REPLAY] = DC_PERF_CNTR_LCB(DcRxReplay, DC_LCB_ERR_INFO_RX_REPLAY_CNT,
4206 CNTR_SYNTH),
4207 [C_DC_SEQ_CRC_CNT] =
4208 DC_PERF_CNTR_LCB(DcLinkSeqCrc, DC_LCB_ERR_INFO_SEQ_CRC_CNT,
4209 CNTR_SYNTH),
4210 [C_DC_ESC0_ONLY_CNT] =
4211 DC_PERF_CNTR_LCB(DcEsc0, DC_LCB_ERR_INFO_ESCAPE_0_ONLY_CNT,
4212 CNTR_SYNTH),
4213 [C_DC_ESC0_PLUS1_CNT] =
4214 DC_PERF_CNTR_LCB(DcEsc1, DC_LCB_ERR_INFO_ESCAPE_0_PLUS1_CNT,
4215 CNTR_SYNTH),
4216 [C_DC_ESC0_PLUS2_CNT] =
4217 DC_PERF_CNTR_LCB(DcEsc0Plus2, DC_LCB_ERR_INFO_ESCAPE_0_PLUS2_CNT,
4218 CNTR_SYNTH),
4219 [C_DC_REINIT_FROM_PEER_CNT] =
4220 DC_PERF_CNTR_LCB(DcReinitPeer, DC_LCB_ERR_INFO_REINIT_FROM_PEER_CNT,
4221 CNTR_SYNTH),
4222 [C_DC_SBE_CNT] = DC_PERF_CNTR_LCB(DcSbe, DC_LCB_ERR_INFO_SBE_CNT,
4223 CNTR_SYNTH),
4224 [C_DC_MISC_FLG_CNT] =
4225 DC_PERF_CNTR_LCB(DcMiscFlg, DC_LCB_ERR_INFO_MISC_FLG_CNT,
4226 CNTR_SYNTH),
4227 [C_DC_PRF_GOOD_LTP_CNT] =
4228 DC_PERF_CNTR_LCB(DcGoodLTP, DC_LCB_PRF_GOOD_LTP_CNT, CNTR_SYNTH),
4229 [C_DC_PRF_ACCEPTED_LTP_CNT] =
4230 DC_PERF_CNTR_LCB(DcAccLTP, DC_LCB_PRF_ACCEPTED_LTP_CNT,
4231 CNTR_SYNTH),
4232 [C_DC_PRF_RX_FLIT_CNT] =
4233 DC_PERF_CNTR_LCB(DcPrfRxFlit, DC_LCB_PRF_RX_FLIT_CNT, CNTR_SYNTH),
4234 [C_DC_PRF_TX_FLIT_CNT] =
4235 DC_PERF_CNTR_LCB(DcPrfTxFlit, DC_LCB_PRF_TX_FLIT_CNT, CNTR_SYNTH),
4236 [C_DC_PRF_CLK_CNTR] =
4237 DC_PERF_CNTR_LCB(DcPrfClk, DC_LCB_PRF_CLK_CNTR, CNTR_SYNTH),
4238 [C_DC_PG_DBG_FLIT_CRDTS_CNT] =
4239 DC_PERF_CNTR_LCB(DcFltCrdts, DC_LCB_PG_DBG_FLIT_CRDTS_CNT, CNTR_SYNTH),
4240 [C_DC_PG_STS_PAUSE_COMPLETE_CNT] =
4241 DC_PERF_CNTR_LCB(DcPauseComp, DC_LCB_PG_STS_PAUSE_COMPLETE_CNT,
4242 CNTR_SYNTH),
4243 [C_DC_PG_STS_TX_SBE_CNT] =
4244 DC_PERF_CNTR_LCB(DcStsTxSbe, DC_LCB_PG_STS_TX_SBE_CNT, CNTR_SYNTH),
4245 [C_DC_PG_STS_TX_MBE_CNT] =
4246 DC_PERF_CNTR_LCB(DcStsTxMbe, DC_LCB_PG_STS_TX_MBE_CNT,
4247 CNTR_SYNTH),
4248 [C_SW_CPU_INTR] = CNTR_ELEM("Intr", 0, 0, CNTR_NORMAL,
4249 access_sw_cpu_intr),
4250 [C_SW_CPU_RCV_LIM] = CNTR_ELEM("RcvLimit", 0, 0, CNTR_NORMAL,
4251 access_sw_cpu_rcv_limit),
4252 [C_SW_VTX_WAIT] = CNTR_ELEM("vTxWait", 0, 0, CNTR_NORMAL,
4253 access_sw_vtx_wait),
4254 [C_SW_PIO_WAIT] = CNTR_ELEM("PioWait", 0, 0, CNTR_NORMAL,
4255 access_sw_pio_wait),
4256 [C_SW_PIO_DRAIN] = CNTR_ELEM("PioDrain", 0, 0, CNTR_NORMAL,
4257 access_sw_pio_drain),
4258 [C_SW_KMEM_WAIT] = CNTR_ELEM("KmemWait", 0, 0, CNTR_NORMAL,
4259 access_sw_kmem_wait),
4260 [C_SW_TID_WAIT] = CNTR_ELEM("TidWait", 0, 0, CNTR_NORMAL,
4261 hfi1_access_sw_tid_wait),
4262 [C_SW_SEND_SCHED] = CNTR_ELEM("SendSched", 0, 0, CNTR_NORMAL,
4263 access_sw_send_schedule),
4264 [C_SDMA_DESC_FETCHED_CNT] = CNTR_ELEM("SDEDscFdCn",
4265 SEND_DMA_DESC_FETCHED_CNT, 0,
4266 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
4267 dev_access_u32_csr),
4268 [C_SDMA_INT_CNT] = CNTR_ELEM("SDMAInt", 0, 0,
4269 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
4270 access_sde_int_cnt),
4271 [C_SDMA_ERR_CNT] = CNTR_ELEM("SDMAErrCt", 0, 0,
4272 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
4273 access_sde_err_cnt),
4274 [C_SDMA_IDLE_INT_CNT] = CNTR_ELEM("SDMAIdInt", 0, 0,
4275 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
4276 access_sde_idle_int_cnt),
4277 [C_SDMA_PROGRESS_INT_CNT] = CNTR_ELEM("SDMAPrIntCn", 0, 0,
4278 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
4279 access_sde_progress_int_cnt),
4280 /* MISC_ERR_STATUS */
4281 [C_MISC_PLL_LOCK_FAIL_ERR] = CNTR_ELEM("MISC_PLL_LOCK_FAIL_ERR", 0, 0,
4282 CNTR_NORMAL,
4283 access_misc_pll_lock_fail_err_cnt),
4284 [C_MISC_MBIST_FAIL_ERR] = CNTR_ELEM("MISC_MBIST_FAIL_ERR", 0, 0,
4285 CNTR_NORMAL,
4286 access_misc_mbist_fail_err_cnt),
4287 [C_MISC_INVALID_EEP_CMD_ERR] = CNTR_ELEM("MISC_INVALID_EEP_CMD_ERR", 0, 0,
4288 CNTR_NORMAL,
4289 access_misc_invalid_eep_cmd_err_cnt),
4290 [C_MISC_EFUSE_DONE_PARITY_ERR] = CNTR_ELEM("MISC_EFUSE_DONE_PARITY_ERR", 0, 0,
4291 CNTR_NORMAL,
4292 access_misc_efuse_done_parity_err_cnt),
4293 [C_MISC_EFUSE_WRITE_ERR] = CNTR_ELEM("MISC_EFUSE_WRITE_ERR", 0, 0,
4294 CNTR_NORMAL,
4295 access_misc_efuse_write_err_cnt),
4296 [C_MISC_EFUSE_READ_BAD_ADDR_ERR] = CNTR_ELEM("MISC_EFUSE_READ_BAD_ADDR_ERR", 0,
4297 0, CNTR_NORMAL,
4298 access_misc_efuse_read_bad_addr_err_cnt),
4299 [C_MISC_EFUSE_CSR_PARITY_ERR] = CNTR_ELEM("MISC_EFUSE_CSR_PARITY_ERR", 0, 0,
4300 CNTR_NORMAL,
4301 access_misc_efuse_csr_parity_err_cnt),
4302 [C_MISC_FW_AUTH_FAILED_ERR] = CNTR_ELEM("MISC_FW_AUTH_FAILED_ERR", 0, 0,
4303 CNTR_NORMAL,
4304 access_misc_fw_auth_failed_err_cnt),
4305 [C_MISC_KEY_MISMATCH_ERR] = CNTR_ELEM("MISC_KEY_MISMATCH_ERR", 0, 0,
4306 CNTR_NORMAL,
4307 access_misc_key_mismatch_err_cnt),
4308 [C_MISC_SBUS_WRITE_FAILED_ERR] = CNTR_ELEM("MISC_SBUS_WRITE_FAILED_ERR", 0, 0,
4309 CNTR_NORMAL,
4310 access_misc_sbus_write_failed_err_cnt),
4311 [C_MISC_CSR_WRITE_BAD_ADDR_ERR] = CNTR_ELEM("MISC_CSR_WRITE_BAD_ADDR_ERR", 0, 0,
4312 CNTR_NORMAL,
4313 access_misc_csr_write_bad_addr_err_cnt),
4314 [C_MISC_CSR_READ_BAD_ADDR_ERR] = CNTR_ELEM("MISC_CSR_READ_BAD_ADDR_ERR", 0, 0,
4315 CNTR_NORMAL,
4316 access_misc_csr_read_bad_addr_err_cnt),
4317 [C_MISC_CSR_PARITY_ERR] = CNTR_ELEM("MISC_CSR_PARITY_ERR", 0, 0,
4318 CNTR_NORMAL,
4319 access_misc_csr_parity_err_cnt),
4320 /* CceErrStatus */
4321 [C_CCE_ERR_STATUS_AGGREGATED_CNT] = CNTR_ELEM("CceErrStatusAggregatedCnt", 0, 0,
4322 CNTR_NORMAL,
4323 access_sw_cce_err_status_aggregated_cnt),
4324 [C_CCE_MSIX_CSR_PARITY_ERR] = CNTR_ELEM("CceMsixCsrParityErr", 0, 0,
4325 CNTR_NORMAL,
4326 access_cce_msix_csr_parity_err_cnt),
4327 [C_CCE_INT_MAP_UNC_ERR] = CNTR_ELEM("CceIntMapUncErr", 0, 0,
4328 CNTR_NORMAL,
4329 access_cce_int_map_unc_err_cnt),
4330 [C_CCE_INT_MAP_COR_ERR] = CNTR_ELEM("CceIntMapCorErr", 0, 0,
4331 CNTR_NORMAL,
4332 access_cce_int_map_cor_err_cnt),
4333 [C_CCE_MSIX_TABLE_UNC_ERR] = CNTR_ELEM("CceMsixTableUncErr", 0, 0,
4334 CNTR_NORMAL,
4335 access_cce_msix_table_unc_err_cnt),
4336 [C_CCE_MSIX_TABLE_COR_ERR] = CNTR_ELEM("CceMsixTableCorErr", 0, 0,
4337 CNTR_NORMAL,
4338 access_cce_msix_table_cor_err_cnt),
4339 [C_CCE_RXDMA_CONV_FIFO_PARITY_ERR] = CNTR_ELEM("CceRxdmaConvFifoParityErr", 0,
4340 0, CNTR_NORMAL,
4341 access_cce_rxdma_conv_fifo_parity_err_cnt),
4342 [C_CCE_RCPL_ASYNC_FIFO_PARITY_ERR] = CNTR_ELEM("CceRcplAsyncFifoParityErr", 0,
4343 0, CNTR_NORMAL,
4344 access_cce_rcpl_async_fifo_parity_err_cnt),
4345 [C_CCE_SEG_WRITE_BAD_ADDR_ERR] = CNTR_ELEM("CceSegWriteBadAddrErr", 0, 0,
4346 CNTR_NORMAL,
4347 access_cce_seg_write_bad_addr_err_cnt),
4348 [C_CCE_SEG_READ_BAD_ADDR_ERR] = CNTR_ELEM("CceSegReadBadAddrErr", 0, 0,
4349 CNTR_NORMAL,
4350 access_cce_seg_read_bad_addr_err_cnt),
4351 [C_LA_TRIGGERED] = CNTR_ELEM("Cce LATriggered", 0, 0,
4352 CNTR_NORMAL,
4353 access_la_triggered_cnt),
4354 [C_CCE_TRGT_CPL_TIMEOUT_ERR] = CNTR_ELEM("CceTrgtCplTimeoutErr", 0, 0,
4355 CNTR_NORMAL,
4356 access_cce_trgt_cpl_timeout_err_cnt),
4357 [C_PCIC_RECEIVE_PARITY_ERR] = CNTR_ELEM("PcicReceiveParityErr", 0, 0,
4358 CNTR_NORMAL,
4359 access_pcic_receive_parity_err_cnt),
4360 [C_PCIC_TRANSMIT_BACK_PARITY_ERR] = CNTR_ELEM("PcicTransmitBackParityErr", 0, 0,
4361 CNTR_NORMAL,
4362 access_pcic_transmit_back_parity_err_cnt),
4363 [C_PCIC_TRANSMIT_FRONT_PARITY_ERR] = CNTR_ELEM("PcicTransmitFrontParityErr", 0,
4364 0, CNTR_NORMAL,
4365 access_pcic_transmit_front_parity_err_cnt),
4366 [C_PCIC_CPL_DAT_Q_UNC_ERR] = CNTR_ELEM("PcicCplDatQUncErr", 0, 0,
4367 CNTR_NORMAL,
4368 access_pcic_cpl_dat_q_unc_err_cnt),
4369 [C_PCIC_CPL_HD_Q_UNC_ERR] = CNTR_ELEM("PcicCplHdQUncErr", 0, 0,
4370 CNTR_NORMAL,
4371 access_pcic_cpl_hd_q_unc_err_cnt),
4372 [C_PCIC_POST_DAT_Q_UNC_ERR] = CNTR_ELEM("PcicPostDatQUncErr", 0, 0,
4373 CNTR_NORMAL,
4374 access_pcic_post_dat_q_unc_err_cnt),
4375 [C_PCIC_POST_HD_Q_UNC_ERR] = CNTR_ELEM("PcicPostHdQUncErr", 0, 0,
4376 CNTR_NORMAL,
4377 access_pcic_post_hd_q_unc_err_cnt),
4378 [C_PCIC_RETRY_SOT_MEM_UNC_ERR] = CNTR_ELEM("PcicRetrySotMemUncErr", 0, 0,
4379 CNTR_NORMAL,
4380 access_pcic_retry_sot_mem_unc_err_cnt),
4381 [C_PCIC_RETRY_MEM_UNC_ERR] = CNTR_ELEM("PcicRetryMemUncErr", 0, 0,
4382 CNTR_NORMAL,
4383 access_pcic_retry_mem_unc_err),
4384 [C_PCIC_N_POST_DAT_Q_PARITY_ERR] = CNTR_ELEM("PcicNPostDatQParityErr", 0, 0,
4385 CNTR_NORMAL,
4386 access_pcic_n_post_dat_q_parity_err_cnt),
4387 [C_PCIC_N_POST_H_Q_PARITY_ERR] = CNTR_ELEM("PcicNPostHQParityErr", 0, 0,
4388 CNTR_NORMAL,
4389 access_pcic_n_post_h_q_parity_err_cnt),
4390 [C_PCIC_CPL_DAT_Q_COR_ERR] = CNTR_ELEM("PcicCplDatQCorErr", 0, 0,
4391 CNTR_NORMAL,
4392 access_pcic_cpl_dat_q_cor_err_cnt),
4393 [C_PCIC_CPL_HD_Q_COR_ERR] = CNTR_ELEM("PcicCplHdQCorErr", 0, 0,
4394 CNTR_NORMAL,
4395 access_pcic_cpl_hd_q_cor_err_cnt),
4396 [C_PCIC_POST_DAT_Q_COR_ERR] = CNTR_ELEM("PcicPostDatQCorErr", 0, 0,
4397 CNTR_NORMAL,
4398 access_pcic_post_dat_q_cor_err_cnt),
4399 [C_PCIC_POST_HD_Q_COR_ERR] = CNTR_ELEM("PcicPostHdQCorErr", 0, 0,
4400 CNTR_NORMAL,
4401 access_pcic_post_hd_q_cor_err_cnt),
4402 [C_PCIC_RETRY_SOT_MEM_COR_ERR] = CNTR_ELEM("PcicRetrySotMemCorErr", 0, 0,
4403 CNTR_NORMAL,
4404 access_pcic_retry_sot_mem_cor_err_cnt),
4405 [C_PCIC_RETRY_MEM_COR_ERR] = CNTR_ELEM("PcicRetryMemCorErr", 0, 0,
4406 CNTR_NORMAL,
4407 access_pcic_retry_mem_cor_err_cnt),
4408 [C_CCE_CLI1_ASYNC_FIFO_DBG_PARITY_ERR] = CNTR_ELEM(
4409 "CceCli1AsyncFifoDbgParityError", 0, 0,
4410 CNTR_NORMAL,
4411 access_cce_cli1_async_fifo_dbg_parity_err_cnt),
4412 [C_CCE_CLI1_ASYNC_FIFO_RXDMA_PARITY_ERR] = CNTR_ELEM(
4413 "CceCli1AsyncFifoRxdmaParityError", 0, 0,
4414 CNTR_NORMAL,
4415 access_cce_cli1_async_fifo_rxdma_parity_err_cnt
4416 ),
4417 [C_CCE_CLI1_ASYNC_FIFO_SDMA_HD_PARITY_ERR] = CNTR_ELEM(
4418 "CceCli1AsyncFifoSdmaHdParityErr", 0, 0,
4419 CNTR_NORMAL,
4420 access_cce_cli1_async_fifo_sdma_hd_parity_err_cnt),
4421 [C_CCE_CLI1_ASYNC_FIFO_PIO_CRDT_PARITY_ERR] = CNTR_ELEM(
4422 "CceCli1AsyncFifoPioCrdtParityErr", 0, 0,
4423 CNTR_NORMAL,
4424 access_cce_cl1_async_fifo_pio_crdt_parity_err_cnt),
4425 [C_CCE_CLI2_ASYNC_FIFO_PARITY_ERR] = CNTR_ELEM("CceCli2AsyncFifoParityErr", 0,
4426 0, CNTR_NORMAL,
4427 access_cce_cli2_async_fifo_parity_err_cnt),
4428 [C_CCE_CSR_CFG_BUS_PARITY_ERR] = CNTR_ELEM("CceCsrCfgBusParityErr", 0, 0,
4429 CNTR_NORMAL,
4430 access_cce_csr_cfg_bus_parity_err_cnt),
4431 [C_CCE_CLI0_ASYNC_FIFO_PARTIY_ERR] = CNTR_ELEM("CceCli0AsyncFifoParityErr", 0,
4432 0, CNTR_NORMAL,
4433 access_cce_cli0_async_fifo_parity_err_cnt),
4434 [C_CCE_RSPD_DATA_PARITY_ERR] = CNTR_ELEM("CceRspdDataParityErr", 0, 0,
4435 CNTR_NORMAL,
4436 access_cce_rspd_data_parity_err_cnt),
4437 [C_CCE_TRGT_ACCESS_ERR] = CNTR_ELEM("CceTrgtAccessErr", 0, 0,
4438 CNTR_NORMAL,
4439 access_cce_trgt_access_err_cnt),
4440 [C_CCE_TRGT_ASYNC_FIFO_PARITY_ERR] = CNTR_ELEM("CceTrgtAsyncFifoParityErr", 0,
4441 0, CNTR_NORMAL,
4442 access_cce_trgt_async_fifo_parity_err_cnt),
4443 [C_CCE_CSR_WRITE_BAD_ADDR_ERR] = CNTR_ELEM("CceCsrWriteBadAddrErr", 0, 0,
4444 CNTR_NORMAL,
4445 access_cce_csr_write_bad_addr_err_cnt),
4446 [C_CCE_CSR_READ_BAD_ADDR_ERR] = CNTR_ELEM("CceCsrReadBadAddrErr", 0, 0,
4447 CNTR_NORMAL,
4448 access_cce_csr_read_bad_addr_err_cnt),
4449 [C_CCE_CSR_PARITY_ERR] = CNTR_ELEM("CceCsrParityErr", 0, 0,
4450 CNTR_NORMAL,
4451 access_ccs_csr_parity_err_cnt),
4452
4453 /* RcvErrStatus */
4454 [C_RX_CSR_PARITY_ERR] = CNTR_ELEM("RxCsrParityErr", 0, 0,
4455 CNTR_NORMAL,
4456 access_rx_csr_parity_err_cnt),
4457 [C_RX_CSR_WRITE_BAD_ADDR_ERR] = CNTR_ELEM("RxCsrWriteBadAddrErr", 0, 0,
4458 CNTR_NORMAL,
4459 access_rx_csr_write_bad_addr_err_cnt),
4460 [C_RX_CSR_READ_BAD_ADDR_ERR] = CNTR_ELEM("RxCsrReadBadAddrErr", 0, 0,
4461 CNTR_NORMAL,
4462 access_rx_csr_read_bad_addr_err_cnt),
4463 [C_RX_DMA_CSR_UNC_ERR] = CNTR_ELEM("RxDmaCsrUncErr", 0, 0,
4464 CNTR_NORMAL,
4465 access_rx_dma_csr_unc_err_cnt),
4466 [C_RX_DMA_DQ_FSM_ENCODING_ERR] = CNTR_ELEM("RxDmaDqFsmEncodingErr", 0, 0,
4467 CNTR_NORMAL,
4468 access_rx_dma_dq_fsm_encoding_err_cnt),
4469 [C_RX_DMA_EQ_FSM_ENCODING_ERR] = CNTR_ELEM("RxDmaEqFsmEncodingErr", 0, 0,
4470 CNTR_NORMAL,
4471 access_rx_dma_eq_fsm_encoding_err_cnt),
4472 [C_RX_DMA_CSR_PARITY_ERR] = CNTR_ELEM("RxDmaCsrParityErr", 0, 0,
4473 CNTR_NORMAL,
4474 access_rx_dma_csr_parity_err_cnt),
4475 [C_RX_RBUF_DATA_COR_ERR] = CNTR_ELEM("RxRbufDataCorErr", 0, 0,
4476 CNTR_NORMAL,
4477 access_rx_rbuf_data_cor_err_cnt),
4478 [C_RX_RBUF_DATA_UNC_ERR] = CNTR_ELEM("RxRbufDataUncErr", 0, 0,
4479 CNTR_NORMAL,
4480 access_rx_rbuf_data_unc_err_cnt),
4481 [C_RX_DMA_DATA_FIFO_RD_COR_ERR] = CNTR_ELEM("RxDmaDataFifoRdCorErr", 0, 0,
4482 CNTR_NORMAL,
4483 access_rx_dma_data_fifo_rd_cor_err_cnt),
4484 [C_RX_DMA_DATA_FIFO_RD_UNC_ERR] = CNTR_ELEM("RxDmaDataFifoRdUncErr", 0, 0,
4485 CNTR_NORMAL,
4486 access_rx_dma_data_fifo_rd_unc_err_cnt),
4487 [C_RX_DMA_HDR_FIFO_RD_COR_ERR] = CNTR_ELEM("RxDmaHdrFifoRdCorErr", 0, 0,
4488 CNTR_NORMAL,
4489 access_rx_dma_hdr_fifo_rd_cor_err_cnt),
4490 [C_RX_DMA_HDR_FIFO_RD_UNC_ERR] = CNTR_ELEM("RxDmaHdrFifoRdUncErr", 0, 0,
4491 CNTR_NORMAL,
4492 access_rx_dma_hdr_fifo_rd_unc_err_cnt),
4493 [C_RX_RBUF_DESC_PART2_COR_ERR] = CNTR_ELEM("RxRbufDescPart2CorErr", 0, 0,
4494 CNTR_NORMAL,
4495 access_rx_rbuf_desc_part2_cor_err_cnt),
4496 [C_RX_RBUF_DESC_PART2_UNC_ERR] = CNTR_ELEM("RxRbufDescPart2UncErr", 0, 0,
4497 CNTR_NORMAL,
4498 access_rx_rbuf_desc_part2_unc_err_cnt),
4499 [C_RX_RBUF_DESC_PART1_COR_ERR] = CNTR_ELEM("RxRbufDescPart1CorErr", 0, 0,
4500 CNTR_NORMAL,
4501 access_rx_rbuf_desc_part1_cor_err_cnt),
4502 [C_RX_RBUF_DESC_PART1_UNC_ERR] = CNTR_ELEM("RxRbufDescPart1UncErr", 0, 0,
4503 CNTR_NORMAL,
4504 access_rx_rbuf_desc_part1_unc_err_cnt),
4505 [C_RX_HQ_INTR_FSM_ERR] = CNTR_ELEM("RxHqIntrFsmErr", 0, 0,
4506 CNTR_NORMAL,
4507 access_rx_hq_intr_fsm_err_cnt),
4508 [C_RX_HQ_INTR_CSR_PARITY_ERR] = CNTR_ELEM("RxHqIntrCsrParityErr", 0, 0,
4509 CNTR_NORMAL,
4510 access_rx_hq_intr_csr_parity_err_cnt),
4511 [C_RX_LOOKUP_CSR_PARITY_ERR] = CNTR_ELEM("RxLookupCsrParityErr", 0, 0,
4512 CNTR_NORMAL,
4513 access_rx_lookup_csr_parity_err_cnt),
4514 [C_RX_LOOKUP_RCV_ARRAY_COR_ERR] = CNTR_ELEM("RxLookupRcvArrayCorErr", 0, 0,
4515 CNTR_NORMAL,
4516 access_rx_lookup_rcv_array_cor_err_cnt),
4517 [C_RX_LOOKUP_RCV_ARRAY_UNC_ERR] = CNTR_ELEM("RxLookupRcvArrayUncErr", 0, 0,
4518 CNTR_NORMAL,
4519 access_rx_lookup_rcv_array_unc_err_cnt),
4520 [C_RX_LOOKUP_DES_PART2_PARITY_ERR] = CNTR_ELEM("RxLookupDesPart2ParityErr", 0,
4521 0, CNTR_NORMAL,
4522 access_rx_lookup_des_part2_parity_err_cnt),
4523 [C_RX_LOOKUP_DES_PART1_UNC_COR_ERR] = CNTR_ELEM("RxLookupDesPart1UncCorErr", 0,
4524 0, CNTR_NORMAL,
4525 access_rx_lookup_des_part1_unc_cor_err_cnt),
4526 [C_RX_LOOKUP_DES_PART1_UNC_ERR] = CNTR_ELEM("RxLookupDesPart1UncErr", 0, 0,
4527 CNTR_NORMAL,
4528 access_rx_lookup_des_part1_unc_err_cnt),
4529 [C_RX_RBUF_NEXT_FREE_BUF_COR_ERR] = CNTR_ELEM("RxRbufNextFreeBufCorErr", 0, 0,
4530 CNTR_NORMAL,
4531 access_rx_rbuf_next_free_buf_cor_err_cnt),
4532 [C_RX_RBUF_NEXT_FREE_BUF_UNC_ERR] = CNTR_ELEM("RxRbufNextFreeBufUncErr", 0, 0,
4533 CNTR_NORMAL,
4534 access_rx_rbuf_next_free_buf_unc_err_cnt),
4535 [C_RX_RBUF_FL_INIT_WR_ADDR_PARITY_ERR] = CNTR_ELEM(
4536 "RxRbufFlInitWrAddrParityErr", 0, 0,
4537 CNTR_NORMAL,
4538 access_rbuf_fl_init_wr_addr_parity_err_cnt),
4539 [C_RX_RBUF_FL_INITDONE_PARITY_ERR] = CNTR_ELEM("RxRbufFlInitdoneParityErr", 0,
4540 0, CNTR_NORMAL,
4541 access_rx_rbuf_fl_initdone_parity_err_cnt),
4542 [C_RX_RBUF_FL_WRITE_ADDR_PARITY_ERR] = CNTR_ELEM("RxRbufFlWrAddrParityErr", 0,
4543 0, CNTR_NORMAL,
4544 access_rx_rbuf_fl_write_addr_parity_err_cnt),
4545 [C_RX_RBUF_FL_RD_ADDR_PARITY_ERR] = CNTR_ELEM("RxRbufFlRdAddrParityErr", 0, 0,
4546 CNTR_NORMAL,
4547 access_rx_rbuf_fl_rd_addr_parity_err_cnt),
4548 [C_RX_RBUF_EMPTY_ERR] = CNTR_ELEM("RxRbufEmptyErr", 0, 0,
4549 CNTR_NORMAL,
4550 access_rx_rbuf_empty_err_cnt),
4551 [C_RX_RBUF_FULL_ERR] = CNTR_ELEM("RxRbufFullErr", 0, 0,
4552 CNTR_NORMAL,
4553 access_rx_rbuf_full_err_cnt),
4554 [C_RX_RBUF_BAD_LOOKUP_ERR] = CNTR_ELEM("RxRBufBadLookupErr", 0, 0,
4555 CNTR_NORMAL,
4556 access_rbuf_bad_lookup_err_cnt),
4557 [C_RX_RBUF_CTX_ID_PARITY_ERR] = CNTR_ELEM("RxRbufCtxIdParityErr", 0, 0,
4558 CNTR_NORMAL,
4559 access_rbuf_ctx_id_parity_err_cnt),
4560 [C_RX_RBUF_CSR_QEOPDW_PARITY_ERR] = CNTR_ELEM("RxRbufCsrQEOPDWParityErr", 0, 0,
4561 CNTR_NORMAL,
4562 access_rbuf_csr_qeopdw_parity_err_cnt),
4563 [C_RX_RBUF_CSR_Q_NUM_OF_PKT_PARITY_ERR] = CNTR_ELEM(
4564 "RxRbufCsrQNumOfPktParityErr", 0, 0,
4565 CNTR_NORMAL,
4566 access_rx_rbuf_csr_q_num_of_pkt_parity_err_cnt),
4567 [C_RX_RBUF_CSR_Q_T1_PTR_PARITY_ERR] = CNTR_ELEM(
4568 "RxRbufCsrQTlPtrParityErr", 0, 0,
4569 CNTR_NORMAL,
4570 access_rx_rbuf_csr_q_t1_ptr_parity_err_cnt),
4571 [C_RX_RBUF_CSR_Q_HD_PTR_PARITY_ERR] = CNTR_ELEM("RxRbufCsrQHdPtrParityErr", 0,
4572 0, CNTR_NORMAL,
4573 access_rx_rbuf_csr_q_hd_ptr_parity_err_cnt),
4574 [C_RX_RBUF_CSR_Q_VLD_BIT_PARITY_ERR] = CNTR_ELEM("RxRbufCsrQVldBitParityErr", 0,
4575 0, CNTR_NORMAL,
4576 access_rx_rbuf_csr_q_vld_bit_parity_err_cnt),
4577 [C_RX_RBUF_CSR_Q_NEXT_BUF_PARITY_ERR] = CNTR_ELEM("RxRbufCsrQNextBufParityErr",
4578 0, 0, CNTR_NORMAL,
4579 access_rx_rbuf_csr_q_next_buf_parity_err_cnt),
4580 [C_RX_RBUF_CSR_Q_ENT_CNT_PARITY_ERR] = CNTR_ELEM("RxRbufCsrQEntCntParityErr", 0,
4581 0, CNTR_NORMAL,
4582 access_rx_rbuf_csr_q_ent_cnt_parity_err_cnt),
4583 [C_RX_RBUF_CSR_Q_HEAD_BUF_NUM_PARITY_ERR] = CNTR_ELEM(
4584 "RxRbufCsrQHeadBufNumParityErr", 0, 0,
4585 CNTR_NORMAL,
4586 access_rx_rbuf_csr_q_head_buf_num_parity_err_cnt),
4587 [C_RX_RBUF_BLOCK_LIST_READ_COR_ERR] = CNTR_ELEM("RxRbufBlockListReadCorErr", 0,
4588 0, CNTR_NORMAL,
4589 access_rx_rbuf_block_list_read_cor_err_cnt),
4590 [C_RX_RBUF_BLOCK_LIST_READ_UNC_ERR] = CNTR_ELEM("RxRbufBlockListReadUncErr", 0,
4591 0, CNTR_NORMAL,
4592 access_rx_rbuf_block_list_read_unc_err_cnt),
4593 [C_RX_RBUF_LOOKUP_DES_COR_ERR] = CNTR_ELEM("RxRbufLookupDesCorErr", 0, 0,
4594 CNTR_NORMAL,
4595 access_rx_rbuf_lookup_des_cor_err_cnt),
4596 [C_RX_RBUF_LOOKUP_DES_UNC_ERR] = CNTR_ELEM("RxRbufLookupDesUncErr", 0, 0,
4597 CNTR_NORMAL,
4598 access_rx_rbuf_lookup_des_unc_err_cnt),
4599 [C_RX_RBUF_LOOKUP_DES_REG_UNC_COR_ERR] = CNTR_ELEM(
4600 "RxRbufLookupDesRegUncCorErr", 0, 0,
4601 CNTR_NORMAL,
4602 access_rx_rbuf_lookup_des_reg_unc_cor_err_cnt),
4603 [C_RX_RBUF_LOOKUP_DES_REG_UNC_ERR] = CNTR_ELEM("RxRbufLookupDesRegUncErr", 0, 0,
4604 CNTR_NORMAL,
4605 access_rx_rbuf_lookup_des_reg_unc_err_cnt),
4606 [C_RX_RBUF_FREE_LIST_COR_ERR] = CNTR_ELEM("RxRbufFreeListCorErr", 0, 0,
4607 CNTR_NORMAL,
4608 access_rx_rbuf_free_list_cor_err_cnt),
4609 [C_RX_RBUF_FREE_LIST_UNC_ERR] = CNTR_ELEM("RxRbufFreeListUncErr", 0, 0,
4610 CNTR_NORMAL,
4611 access_rx_rbuf_free_list_unc_err_cnt),
4612 [C_RX_RCV_FSM_ENCODING_ERR] = CNTR_ELEM("RxRcvFsmEncodingErr", 0, 0,
4613 CNTR_NORMAL,
4614 access_rx_rcv_fsm_encoding_err_cnt),
4615 [C_RX_DMA_FLAG_COR_ERR] = CNTR_ELEM("RxDmaFlagCorErr", 0, 0,
4616 CNTR_NORMAL,
4617 access_rx_dma_flag_cor_err_cnt),
4618 [C_RX_DMA_FLAG_UNC_ERR] = CNTR_ELEM("RxDmaFlagUncErr", 0, 0,
4619 CNTR_NORMAL,
4620 access_rx_dma_flag_unc_err_cnt),
4621 [C_RX_DC_SOP_EOP_PARITY_ERR] = CNTR_ELEM("RxDcSopEopParityErr", 0, 0,
4622 CNTR_NORMAL,
4623 access_rx_dc_sop_eop_parity_err_cnt),
4624 [C_RX_RCV_CSR_PARITY_ERR] = CNTR_ELEM("RxRcvCsrParityErr", 0, 0,
4625 CNTR_NORMAL,
4626 access_rx_rcv_csr_parity_err_cnt),
4627 [C_RX_RCV_QP_MAP_TABLE_COR_ERR] = CNTR_ELEM("RxRcvQpMapTableCorErr", 0, 0,
4628 CNTR_NORMAL,
4629 access_rx_rcv_qp_map_table_cor_err_cnt),
4630 [C_RX_RCV_QP_MAP_TABLE_UNC_ERR] = CNTR_ELEM("RxRcvQpMapTableUncErr", 0, 0,
4631 CNTR_NORMAL,
4632 access_rx_rcv_qp_map_table_unc_err_cnt),
4633 [C_RX_RCV_DATA_COR_ERR] = CNTR_ELEM("RxRcvDataCorErr", 0, 0,
4634 CNTR_NORMAL,
4635 access_rx_rcv_data_cor_err_cnt),
4636 [C_RX_RCV_DATA_UNC_ERR] = CNTR_ELEM("RxRcvDataUncErr", 0, 0,
4637 CNTR_NORMAL,
4638 access_rx_rcv_data_unc_err_cnt),
4639 [C_RX_RCV_HDR_COR_ERR] = CNTR_ELEM("RxRcvHdrCorErr", 0, 0,
4640 CNTR_NORMAL,
4641 access_rx_rcv_hdr_cor_err_cnt),
4642 [C_RX_RCV_HDR_UNC_ERR] = CNTR_ELEM("RxRcvHdrUncErr", 0, 0,
4643 CNTR_NORMAL,
4644 access_rx_rcv_hdr_unc_err_cnt),
4645 [C_RX_DC_INTF_PARITY_ERR] = CNTR_ELEM("RxDcIntfParityErr", 0, 0,
4646 CNTR_NORMAL,
4647 access_rx_dc_intf_parity_err_cnt),
4648 [C_RX_DMA_CSR_COR_ERR] = CNTR_ELEM("RxDmaCsrCorErr", 0, 0,
4649 CNTR_NORMAL,
4650 access_rx_dma_csr_cor_err_cnt),
4651 /* SendPioErrStatus */
4652 [C_PIO_PEC_SOP_HEAD_PARITY_ERR] = CNTR_ELEM("PioPecSopHeadParityErr", 0, 0,
4653 CNTR_NORMAL,
4654 access_pio_pec_sop_head_parity_err_cnt),
4655 [C_PIO_PCC_SOP_HEAD_PARITY_ERR] = CNTR_ELEM("PioPccSopHeadParityErr", 0, 0,
4656 CNTR_NORMAL,
4657 access_pio_pcc_sop_head_parity_err_cnt),
4658 [C_PIO_LAST_RETURNED_CNT_PARITY_ERR] = CNTR_ELEM("PioLastReturnedCntParityErr",
4659 0, 0, CNTR_NORMAL,
4660 access_pio_last_returned_cnt_parity_err_cnt),
4661 [C_PIO_CURRENT_FREE_CNT_PARITY_ERR] = CNTR_ELEM("PioCurrentFreeCntParityErr", 0,
4662 0, CNTR_NORMAL,
4663 access_pio_current_free_cnt_parity_err_cnt),
4664 [C_PIO_RSVD_31_ERR] = CNTR_ELEM("Pio Reserved 31", 0, 0,
4665 CNTR_NORMAL,
4666 access_pio_reserved_31_err_cnt),
4667 [C_PIO_RSVD_30_ERR] = CNTR_ELEM("Pio Reserved 30", 0, 0,
4668 CNTR_NORMAL,
4669 access_pio_reserved_30_err_cnt),
4670 [C_PIO_PPMC_SOP_LEN_ERR] = CNTR_ELEM("PioPpmcSopLenErr", 0, 0,
4671 CNTR_NORMAL,
4672 access_pio_ppmc_sop_len_err_cnt),
4673 [C_PIO_PPMC_BQC_MEM_PARITY_ERR] = CNTR_ELEM("PioPpmcBqcMemParityErr", 0, 0,
4674 CNTR_NORMAL,
4675 access_pio_ppmc_bqc_mem_parity_err_cnt),
4676 [C_PIO_VL_FIFO_PARITY_ERR] = CNTR_ELEM("PioVlFifoParityErr", 0, 0,
4677 CNTR_NORMAL,
4678 access_pio_vl_fifo_parity_err_cnt),
4679 [C_PIO_VLF_SOP_PARITY_ERR] = CNTR_ELEM("PioVlfSopParityErr", 0, 0,
4680 CNTR_NORMAL,
4681 access_pio_vlf_sop_parity_err_cnt),
4682 [C_PIO_VLF_V1_LEN_PARITY_ERR] = CNTR_ELEM("PioVlfVlLenParityErr", 0, 0,
4683 CNTR_NORMAL,
4684 access_pio_vlf_v1_len_parity_err_cnt),
4685 [C_PIO_BLOCK_QW_COUNT_PARITY_ERR] = CNTR_ELEM("PioBlockQwCountParityErr", 0, 0,
4686 CNTR_NORMAL,
4687 access_pio_block_qw_count_parity_err_cnt),
4688 [C_PIO_WRITE_QW_VALID_PARITY_ERR] = CNTR_ELEM("PioWriteQwValidParityErr", 0, 0,
4689 CNTR_NORMAL,
4690 access_pio_write_qw_valid_parity_err_cnt),
4691 [C_PIO_STATE_MACHINE_ERR] = CNTR_ELEM("PioStateMachineErr", 0, 0,
4692 CNTR_NORMAL,
4693 access_pio_state_machine_err_cnt),
4694 [C_PIO_WRITE_DATA_PARITY_ERR] = CNTR_ELEM("PioWriteDataParityErr", 0, 0,
4695 CNTR_NORMAL,
4696 access_pio_write_data_parity_err_cnt),
4697 [C_PIO_HOST_ADDR_MEM_COR_ERR] = CNTR_ELEM("PioHostAddrMemCorErr", 0, 0,
4698 CNTR_NORMAL,
4699 access_pio_host_addr_mem_cor_err_cnt),
4700 [C_PIO_HOST_ADDR_MEM_UNC_ERR] = CNTR_ELEM("PioHostAddrMemUncErr", 0, 0,
4701 CNTR_NORMAL,
4702 access_pio_host_addr_mem_unc_err_cnt),
4703 [C_PIO_PKT_EVICT_SM_OR_ARM_SM_ERR] = CNTR_ELEM("PioPktEvictSmOrArbSmErr", 0, 0,
4704 CNTR_NORMAL,
4705 access_pio_pkt_evict_sm_or_arb_sm_err_cnt),
4706 [C_PIO_INIT_SM_IN_ERR] = CNTR_ELEM("PioInitSmInErr", 0, 0,
4707 CNTR_NORMAL,
4708 access_pio_init_sm_in_err_cnt),
4709 [C_PIO_PPMC_PBL_FIFO_ERR] = CNTR_ELEM("PioPpmcPblFifoErr", 0, 0,
4710 CNTR_NORMAL,
4711 access_pio_ppmc_pbl_fifo_err_cnt),
4712 [C_PIO_CREDIT_RET_FIFO_PARITY_ERR] = CNTR_ELEM("PioCreditRetFifoParityErr", 0,
4713 0, CNTR_NORMAL,
4714 access_pio_credit_ret_fifo_parity_err_cnt),
4715 [C_PIO_V1_LEN_MEM_BANK1_COR_ERR] = CNTR_ELEM("PioVlLenMemBank1CorErr", 0, 0,
4716 CNTR_NORMAL,
4717 access_pio_v1_len_mem_bank1_cor_err_cnt),
4718 [C_PIO_V1_LEN_MEM_BANK0_COR_ERR] = CNTR_ELEM("PioVlLenMemBank0CorErr", 0, 0,
4719 CNTR_NORMAL,
4720 access_pio_v1_len_mem_bank0_cor_err_cnt),
4721 [C_PIO_V1_LEN_MEM_BANK1_UNC_ERR] = CNTR_ELEM("PioVlLenMemBank1UncErr", 0, 0,
4722 CNTR_NORMAL,
4723 access_pio_v1_len_mem_bank1_unc_err_cnt),
4724 [C_PIO_V1_LEN_MEM_BANK0_UNC_ERR] = CNTR_ELEM("PioVlLenMemBank0UncErr", 0, 0,
4725 CNTR_NORMAL,
4726 access_pio_v1_len_mem_bank0_unc_err_cnt),
4727 [C_PIO_SM_PKT_RESET_PARITY_ERR] = CNTR_ELEM("PioSmPktResetParityErr", 0, 0,
4728 CNTR_NORMAL,
4729 access_pio_sm_pkt_reset_parity_err_cnt),
4730 [C_PIO_PKT_EVICT_FIFO_PARITY_ERR] = CNTR_ELEM("PioPktEvictFifoParityErr", 0, 0,
4731 CNTR_NORMAL,
4732 access_pio_pkt_evict_fifo_parity_err_cnt),
4733 [C_PIO_SBRDCTRL_CRREL_FIFO_PARITY_ERR] = CNTR_ELEM(
4734 "PioSbrdctrlCrrelFifoParityErr", 0, 0,
4735 CNTR_NORMAL,
4736 access_pio_sbrdctrl_crrel_fifo_parity_err_cnt),
4737 [C_PIO_SBRDCTL_CRREL_PARITY_ERR] = CNTR_ELEM("PioSbrdctlCrrelParityErr", 0, 0,
4738 CNTR_NORMAL,
4739 access_pio_sbrdctl_crrel_parity_err_cnt),
4740 [C_PIO_PEC_FIFO_PARITY_ERR] = CNTR_ELEM("PioPecFifoParityErr", 0, 0,
4741 CNTR_NORMAL,
4742 access_pio_pec_fifo_parity_err_cnt),
4743 [C_PIO_PCC_FIFO_PARITY_ERR] = CNTR_ELEM("PioPccFifoParityErr", 0, 0,
4744 CNTR_NORMAL,
4745 access_pio_pcc_fifo_parity_err_cnt),
4746 [C_PIO_SB_MEM_FIFO1_ERR] = CNTR_ELEM("PioSbMemFifo1Err", 0, 0,
4747 CNTR_NORMAL,
4748 access_pio_sb_mem_fifo1_err_cnt),
4749 [C_PIO_SB_MEM_FIFO0_ERR] = CNTR_ELEM("PioSbMemFifo0Err", 0, 0,
4750 CNTR_NORMAL,
4751 access_pio_sb_mem_fifo0_err_cnt),
4752 [C_PIO_CSR_PARITY_ERR] = CNTR_ELEM("PioCsrParityErr", 0, 0,
4753 CNTR_NORMAL,
4754 access_pio_csr_parity_err_cnt),
4755 [C_PIO_WRITE_ADDR_PARITY_ERR] = CNTR_ELEM("PioWriteAddrParityErr", 0, 0,
4756 CNTR_NORMAL,
4757 access_pio_write_addr_parity_err_cnt),
4758 [C_PIO_WRITE_BAD_CTXT_ERR] = CNTR_ELEM("PioWriteBadCtxtErr", 0, 0,
4759 CNTR_NORMAL,
4760 access_pio_write_bad_ctxt_err_cnt),
4761 /* SendDmaErrStatus */
4762 [C_SDMA_PCIE_REQ_TRACKING_COR_ERR] = CNTR_ELEM("SDmaPcieReqTrackingCorErr", 0,
4763 0, CNTR_NORMAL,
4764 access_sdma_pcie_req_tracking_cor_err_cnt),
4765 [C_SDMA_PCIE_REQ_TRACKING_UNC_ERR] = CNTR_ELEM("SDmaPcieReqTrackingUncErr", 0,
4766 0, CNTR_NORMAL,
4767 access_sdma_pcie_req_tracking_unc_err_cnt),
4768 [C_SDMA_CSR_PARITY_ERR] = CNTR_ELEM("SDmaCsrParityErr", 0, 0,
4769 CNTR_NORMAL,
4770 access_sdma_csr_parity_err_cnt),
4771 [C_SDMA_RPY_TAG_ERR] = CNTR_ELEM("SDmaRpyTagErr", 0, 0,
4772 CNTR_NORMAL,
4773 access_sdma_rpy_tag_err_cnt),
4774 /* SendEgressErrStatus */
4775 [C_TX_READ_PIO_MEMORY_CSR_UNC_ERR] = CNTR_ELEM("TxReadPioMemoryCsrUncErr", 0, 0,
4776 CNTR_NORMAL,
4777 access_tx_read_pio_memory_csr_unc_err_cnt),
4778 [C_TX_READ_SDMA_MEMORY_CSR_UNC_ERR] = CNTR_ELEM("TxReadSdmaMemoryCsrUncErr", 0,
4779 0, CNTR_NORMAL,
4780 access_tx_read_sdma_memory_csr_err_cnt),
4781 [C_TX_EGRESS_FIFO_COR_ERR] = CNTR_ELEM("TxEgressFifoCorErr", 0, 0,
4782 CNTR_NORMAL,
4783 access_tx_egress_fifo_cor_err_cnt),
4784 [C_TX_READ_PIO_MEMORY_COR_ERR] = CNTR_ELEM("TxReadPioMemoryCorErr", 0, 0,
4785 CNTR_NORMAL,
4786 access_tx_read_pio_memory_cor_err_cnt),
4787 [C_TX_READ_SDMA_MEMORY_COR_ERR] = CNTR_ELEM("TxReadSdmaMemoryCorErr", 0, 0,
4788 CNTR_NORMAL,
4789 access_tx_read_sdma_memory_cor_err_cnt),
4790 [C_TX_SB_HDR_COR_ERR] = CNTR_ELEM("TxSbHdrCorErr", 0, 0,
4791 CNTR_NORMAL,
4792 access_tx_sb_hdr_cor_err_cnt),
4793 [C_TX_CREDIT_OVERRUN_ERR] = CNTR_ELEM("TxCreditOverrunErr", 0, 0,
4794 CNTR_NORMAL,
4795 access_tx_credit_overrun_err_cnt),
4796 [C_TX_LAUNCH_FIFO8_COR_ERR] = CNTR_ELEM("TxLaunchFifo8CorErr", 0, 0,
4797 CNTR_NORMAL,
4798 access_tx_launch_fifo8_cor_err_cnt),
4799 [C_TX_LAUNCH_FIFO7_COR_ERR] = CNTR_ELEM("TxLaunchFifo7CorErr", 0, 0,
4800 CNTR_NORMAL,
4801 access_tx_launch_fifo7_cor_err_cnt),
4802 [C_TX_LAUNCH_FIFO6_COR_ERR] = CNTR_ELEM("TxLaunchFifo6CorErr", 0, 0,
4803 CNTR_NORMAL,
4804 access_tx_launch_fifo6_cor_err_cnt),
4805 [C_TX_LAUNCH_FIFO5_COR_ERR] = CNTR_ELEM("TxLaunchFifo5CorErr", 0, 0,
4806 CNTR_NORMAL,
4807 access_tx_launch_fifo5_cor_err_cnt),
4808 [C_TX_LAUNCH_FIFO4_COR_ERR] = CNTR_ELEM("TxLaunchFifo4CorErr", 0, 0,
4809 CNTR_NORMAL,
4810 access_tx_launch_fifo4_cor_err_cnt),
4811 [C_TX_LAUNCH_FIFO3_COR_ERR] = CNTR_ELEM("TxLaunchFifo3CorErr", 0, 0,
4812 CNTR_NORMAL,
4813 access_tx_launch_fifo3_cor_err_cnt),
4814 [C_TX_LAUNCH_FIFO2_COR_ERR] = CNTR_ELEM("TxLaunchFifo2CorErr", 0, 0,
4815 CNTR_NORMAL,
4816 access_tx_launch_fifo2_cor_err_cnt),
4817 [C_TX_LAUNCH_FIFO1_COR_ERR] = CNTR_ELEM("TxLaunchFifo1CorErr", 0, 0,
4818 CNTR_NORMAL,
4819 access_tx_launch_fifo1_cor_err_cnt),
4820 [C_TX_LAUNCH_FIFO0_COR_ERR] = CNTR_ELEM("TxLaunchFifo0CorErr", 0, 0,
4821 CNTR_NORMAL,
4822 access_tx_launch_fifo0_cor_err_cnt),
4823 [C_TX_CREDIT_RETURN_VL_ERR] = CNTR_ELEM("TxCreditReturnVLErr", 0, 0,
4824 CNTR_NORMAL,
4825 access_tx_credit_return_vl_err_cnt),
4826 [C_TX_HCRC_INSERTION_ERR] = CNTR_ELEM("TxHcrcInsertionErr", 0, 0,
4827 CNTR_NORMAL,
4828 access_tx_hcrc_insertion_err_cnt),
4829 [C_TX_EGRESS_FIFI_UNC_ERR] = CNTR_ELEM("TxEgressFifoUncErr", 0, 0,
4830 CNTR_NORMAL,
4831 access_tx_egress_fifo_unc_err_cnt),
4832 [C_TX_READ_PIO_MEMORY_UNC_ERR] = CNTR_ELEM("TxReadPioMemoryUncErr", 0, 0,
4833 CNTR_NORMAL,
4834 access_tx_read_pio_memory_unc_err_cnt),
4835 [C_TX_READ_SDMA_MEMORY_UNC_ERR] = CNTR_ELEM("TxReadSdmaMemoryUncErr", 0, 0,
4836 CNTR_NORMAL,
4837 access_tx_read_sdma_memory_unc_err_cnt),
4838 [C_TX_SB_HDR_UNC_ERR] = CNTR_ELEM("TxSbHdrUncErr", 0, 0,
4839 CNTR_NORMAL,
4840 access_tx_sb_hdr_unc_err_cnt),
4841 [C_TX_CREDIT_RETURN_PARITY_ERR] = CNTR_ELEM("TxCreditReturnParityErr", 0, 0,
4842 CNTR_NORMAL,
4843 access_tx_credit_return_partiy_err_cnt),
4844 [C_TX_LAUNCH_FIFO8_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo8UncOrParityErr",
4845 0, 0, CNTR_NORMAL,
4846 access_tx_launch_fifo8_unc_or_parity_err_cnt),
4847 [C_TX_LAUNCH_FIFO7_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo7UncOrParityErr",
4848 0, 0, CNTR_NORMAL,
4849 access_tx_launch_fifo7_unc_or_parity_err_cnt),
4850 [C_TX_LAUNCH_FIFO6_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo6UncOrParityErr",
4851 0, 0, CNTR_NORMAL,
4852 access_tx_launch_fifo6_unc_or_parity_err_cnt),
4853 [C_TX_LAUNCH_FIFO5_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo5UncOrParityErr",
4854 0, 0, CNTR_NORMAL,
4855 access_tx_launch_fifo5_unc_or_parity_err_cnt),
4856 [C_TX_LAUNCH_FIFO4_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo4UncOrParityErr",
4857 0, 0, CNTR_NORMAL,
4858 access_tx_launch_fifo4_unc_or_parity_err_cnt),
4859 [C_TX_LAUNCH_FIFO3_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo3UncOrParityErr",
4860 0, 0, CNTR_NORMAL,
4861 access_tx_launch_fifo3_unc_or_parity_err_cnt),
4862 [C_TX_LAUNCH_FIFO2_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo2UncOrParityErr",
4863 0, 0, CNTR_NORMAL,
4864 access_tx_launch_fifo2_unc_or_parity_err_cnt),
4865 [C_TX_LAUNCH_FIFO1_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo1UncOrParityErr",
4866 0, 0, CNTR_NORMAL,
4867 access_tx_launch_fifo1_unc_or_parity_err_cnt),
4868 [C_TX_LAUNCH_FIFO0_UNC_OR_PARITY_ERR] = CNTR_ELEM("TxLaunchFifo0UncOrParityErr",
4869 0, 0, CNTR_NORMAL,
4870 access_tx_launch_fifo0_unc_or_parity_err_cnt),
4871 [C_TX_SDMA15_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma15DisallowedPacketErr",
4872 0, 0, CNTR_NORMAL,
4873 access_tx_sdma15_disallowed_packet_err_cnt),
4874 [C_TX_SDMA14_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma14DisallowedPacketErr",
4875 0, 0, CNTR_NORMAL,
4876 access_tx_sdma14_disallowed_packet_err_cnt),
4877 [C_TX_SDMA13_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma13DisallowedPacketErr",
4878 0, 0, CNTR_NORMAL,
4879 access_tx_sdma13_disallowed_packet_err_cnt),
4880 [C_TX_SDMA12_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma12DisallowedPacketErr",
4881 0, 0, CNTR_NORMAL,
4882 access_tx_sdma12_disallowed_packet_err_cnt),
4883 [C_TX_SDMA11_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma11DisallowedPacketErr",
4884 0, 0, CNTR_NORMAL,
4885 access_tx_sdma11_disallowed_packet_err_cnt),
4886 [C_TX_SDMA10_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma10DisallowedPacketErr",
4887 0, 0, CNTR_NORMAL,
4888 access_tx_sdma10_disallowed_packet_err_cnt),
4889 [C_TX_SDMA9_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma9DisallowedPacketErr",
4890 0, 0, CNTR_NORMAL,
4891 access_tx_sdma9_disallowed_packet_err_cnt),
4892 [C_TX_SDMA8_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma8DisallowedPacketErr",
4893 0, 0, CNTR_NORMAL,
4894 access_tx_sdma8_disallowed_packet_err_cnt),
4895 [C_TX_SDMA7_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma7DisallowedPacketErr",
4896 0, 0, CNTR_NORMAL,
4897 access_tx_sdma7_disallowed_packet_err_cnt),
4898 [C_TX_SDMA6_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma6DisallowedPacketErr",
4899 0, 0, CNTR_NORMAL,
4900 access_tx_sdma6_disallowed_packet_err_cnt),
4901 [C_TX_SDMA5_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma5DisallowedPacketErr",
4902 0, 0, CNTR_NORMAL,
4903 access_tx_sdma5_disallowed_packet_err_cnt),
4904 [C_TX_SDMA4_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma4DisallowedPacketErr",
4905 0, 0, CNTR_NORMAL,
4906 access_tx_sdma4_disallowed_packet_err_cnt),
4907 [C_TX_SDMA3_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma3DisallowedPacketErr",
4908 0, 0, CNTR_NORMAL,
4909 access_tx_sdma3_disallowed_packet_err_cnt),
4910 [C_TX_SDMA2_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma2DisallowedPacketErr",
4911 0, 0, CNTR_NORMAL,
4912 access_tx_sdma2_disallowed_packet_err_cnt),
4913 [C_TX_SDMA1_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma1DisallowedPacketErr",
4914 0, 0, CNTR_NORMAL,
4915 access_tx_sdma1_disallowed_packet_err_cnt),
4916 [C_TX_SDMA0_DISALLOWED_PACKET_ERR] = CNTR_ELEM("TxSdma0DisallowedPacketErr",
4917 0, 0, CNTR_NORMAL,
4918 access_tx_sdma0_disallowed_packet_err_cnt),
4919 [C_TX_CONFIG_PARITY_ERR] = CNTR_ELEM("TxConfigParityErr", 0, 0,
4920 CNTR_NORMAL,
4921 access_tx_config_parity_err_cnt),
4922 [C_TX_SBRD_CTL_CSR_PARITY_ERR] = CNTR_ELEM("TxSbrdCtlCsrParityErr", 0, 0,
4923 CNTR_NORMAL,
4924 access_tx_sbrd_ctl_csr_parity_err_cnt),
4925 [C_TX_LAUNCH_CSR_PARITY_ERR] = CNTR_ELEM("TxLaunchCsrParityErr", 0, 0,
4926 CNTR_NORMAL,
4927 access_tx_launch_csr_parity_err_cnt),
4928 [C_TX_ILLEGAL_CL_ERR] = CNTR_ELEM("TxIllegalVLErr", 0, 0,
4929 CNTR_NORMAL,
4930 access_tx_illegal_vl_err_cnt),
4931 [C_TX_SBRD_CTL_STATE_MACHINE_PARITY_ERR] = CNTR_ELEM(
4932 "TxSbrdCtlStateMachineParityErr", 0, 0,
4933 CNTR_NORMAL,
4934 access_tx_sbrd_ctl_state_machine_parity_err_cnt),
4935 [C_TX_RESERVED_10] = CNTR_ELEM("Tx Egress Reserved 10", 0, 0,
4936 CNTR_NORMAL,
4937 access_egress_reserved_10_err_cnt),
4938 [C_TX_RESERVED_9] = CNTR_ELEM("Tx Egress Reserved 9", 0, 0,
4939 CNTR_NORMAL,
4940 access_egress_reserved_9_err_cnt),
4941 [C_TX_SDMA_LAUNCH_INTF_PARITY_ERR] = CNTR_ELEM("TxSdmaLaunchIntfParityErr",
4942 0, 0, CNTR_NORMAL,
4943 access_tx_sdma_launch_intf_parity_err_cnt),
4944 [C_TX_PIO_LAUNCH_INTF_PARITY_ERR] = CNTR_ELEM("TxPioLaunchIntfParityErr", 0, 0,
4945 CNTR_NORMAL,
4946 access_tx_pio_launch_intf_parity_err_cnt),
4947 [C_TX_RESERVED_6] = CNTR_ELEM("Tx Egress Reserved 6", 0, 0,
4948 CNTR_NORMAL,
4949 access_egress_reserved_6_err_cnt),
4950 [C_TX_INCORRECT_LINK_STATE_ERR] = CNTR_ELEM("TxIncorrectLinkStateErr", 0, 0,
4951 CNTR_NORMAL,
4952 access_tx_incorrect_link_state_err_cnt),
4953 [C_TX_LINK_DOWN_ERR] = CNTR_ELEM("TxLinkdownErr", 0, 0,
4954 CNTR_NORMAL,
4955 access_tx_linkdown_err_cnt),
4956 [C_TX_EGRESS_FIFO_UNDERRUN_OR_PARITY_ERR] = CNTR_ELEM(
4957 "EgressFifoUnderrunOrParityErr", 0, 0,
4958 CNTR_NORMAL,
4959 access_tx_egress_fifi_underrun_or_parity_err_cnt),
4960 [C_TX_RESERVED_2] = CNTR_ELEM("Tx Egress Reserved 2", 0, 0,
4961 CNTR_NORMAL,
4962 access_egress_reserved_2_err_cnt),
4963 [C_TX_PKT_INTEGRITY_MEM_UNC_ERR] = CNTR_ELEM("TxPktIntegrityMemUncErr", 0, 0,
4964 CNTR_NORMAL,
4965 access_tx_pkt_integrity_mem_unc_err_cnt),
4966 [C_TX_PKT_INTEGRITY_MEM_COR_ERR] = CNTR_ELEM("TxPktIntegrityMemCorErr", 0, 0,
4967 CNTR_NORMAL,
4968 access_tx_pkt_integrity_mem_cor_err_cnt),
4969 /* SendErrStatus */
4970 [C_SEND_CSR_WRITE_BAD_ADDR_ERR] = CNTR_ELEM("SendCsrWriteBadAddrErr", 0, 0,
4971 CNTR_NORMAL,
4972 access_send_csr_write_bad_addr_err_cnt),
4973 [C_SEND_CSR_READ_BAD_ADD_ERR] = CNTR_ELEM("SendCsrReadBadAddrErr", 0, 0,
4974 CNTR_NORMAL,
4975 access_send_csr_read_bad_addr_err_cnt),
4976 [C_SEND_CSR_PARITY_ERR] = CNTR_ELEM("SendCsrParityErr", 0, 0,
4977 CNTR_NORMAL,
4978 access_send_csr_parity_cnt),
4979 /* SendCtxtErrStatus */
4980 [C_PIO_WRITE_OUT_OF_BOUNDS_ERR] = CNTR_ELEM("PioWriteOutOfBoundsErr", 0, 0,
4981 CNTR_NORMAL,
4982 access_pio_write_out_of_bounds_err_cnt),
4983 [C_PIO_WRITE_OVERFLOW_ERR] = CNTR_ELEM("PioWriteOverflowErr", 0, 0,
4984 CNTR_NORMAL,
4985 access_pio_write_overflow_err_cnt),
4986 [C_PIO_WRITE_CROSSES_BOUNDARY_ERR] = CNTR_ELEM("PioWriteCrossesBoundaryErr",
4987 0, 0, CNTR_NORMAL,
4988 access_pio_write_crosses_boundary_err_cnt),
4989 [C_PIO_DISALLOWED_PACKET_ERR] = CNTR_ELEM("PioDisallowedPacketErr", 0, 0,
4990 CNTR_NORMAL,
4991 access_pio_disallowed_packet_err_cnt),
4992 [C_PIO_INCONSISTENT_SOP_ERR] = CNTR_ELEM("PioInconsistentSopErr", 0, 0,
4993 CNTR_NORMAL,
4994 access_pio_inconsistent_sop_err_cnt),
4995 /* SendDmaEngErrStatus */
4996 [C_SDMA_HEADER_REQUEST_FIFO_COR_ERR] = CNTR_ELEM("SDmaHeaderRequestFifoCorErr",
4997 0, 0, CNTR_NORMAL,
4998 access_sdma_header_request_fifo_cor_err_cnt),
4999 [C_SDMA_HEADER_STORAGE_COR_ERR] = CNTR_ELEM("SDmaHeaderStorageCorErr", 0, 0,
5000 CNTR_NORMAL,
5001 access_sdma_header_storage_cor_err_cnt),
5002 [C_SDMA_PACKET_TRACKING_COR_ERR] = CNTR_ELEM("SDmaPacketTrackingCorErr", 0, 0,
5003 CNTR_NORMAL,
5004 access_sdma_packet_tracking_cor_err_cnt),
5005 [C_SDMA_ASSEMBLY_COR_ERR] = CNTR_ELEM("SDmaAssemblyCorErr", 0, 0,
5006 CNTR_NORMAL,
5007 access_sdma_assembly_cor_err_cnt),
5008 [C_SDMA_DESC_TABLE_COR_ERR] = CNTR_ELEM("SDmaDescTableCorErr", 0, 0,
5009 CNTR_NORMAL,
5010 access_sdma_desc_table_cor_err_cnt),
5011 [C_SDMA_HEADER_REQUEST_FIFO_UNC_ERR] = CNTR_ELEM("SDmaHeaderRequestFifoUncErr",
5012 0, 0, CNTR_NORMAL,
5013 access_sdma_header_request_fifo_unc_err_cnt),
5014 [C_SDMA_HEADER_STORAGE_UNC_ERR] = CNTR_ELEM("SDmaHeaderStorageUncErr", 0, 0,
5015 CNTR_NORMAL,
5016 access_sdma_header_storage_unc_err_cnt),
5017 [C_SDMA_PACKET_TRACKING_UNC_ERR] = CNTR_ELEM("SDmaPacketTrackingUncErr", 0, 0,
5018 CNTR_NORMAL,
5019 access_sdma_packet_tracking_unc_err_cnt),
5020 [C_SDMA_ASSEMBLY_UNC_ERR] = CNTR_ELEM("SDmaAssemblyUncErr", 0, 0,
5021 CNTR_NORMAL,
5022 access_sdma_assembly_unc_err_cnt),
5023 [C_SDMA_DESC_TABLE_UNC_ERR] = CNTR_ELEM("SDmaDescTableUncErr", 0, 0,
5024 CNTR_NORMAL,
5025 access_sdma_desc_table_unc_err_cnt),
5026 [C_SDMA_TIMEOUT_ERR] = CNTR_ELEM("SDmaTimeoutErr", 0, 0,
5027 CNTR_NORMAL,
5028 access_sdma_timeout_err_cnt),
5029 [C_SDMA_HEADER_LENGTH_ERR] = CNTR_ELEM("SDmaHeaderLengthErr", 0, 0,
5030 CNTR_NORMAL,
5031 access_sdma_header_length_err_cnt),
5032 [C_SDMA_HEADER_ADDRESS_ERR] = CNTR_ELEM("SDmaHeaderAddressErr", 0, 0,
5033 CNTR_NORMAL,
5034 access_sdma_header_address_err_cnt),
5035 [C_SDMA_HEADER_SELECT_ERR] = CNTR_ELEM("SDmaHeaderSelectErr", 0, 0,
5036 CNTR_NORMAL,
5037 access_sdma_header_select_err_cnt),
5038 [C_SMDA_RESERVED_9] = CNTR_ELEM("SDma Reserved 9", 0, 0,
5039 CNTR_NORMAL,
5040 access_sdma_reserved_9_err_cnt),
5041 [C_SDMA_PACKET_DESC_OVERFLOW_ERR] = CNTR_ELEM("SDmaPacketDescOverflowErr", 0, 0,
5042 CNTR_NORMAL,
5043 access_sdma_packet_desc_overflow_err_cnt),
5044 [C_SDMA_LENGTH_MISMATCH_ERR] = CNTR_ELEM("SDmaLengthMismatchErr", 0, 0,
5045 CNTR_NORMAL,
5046 access_sdma_length_mismatch_err_cnt),
5047 [C_SDMA_HALT_ERR] = CNTR_ELEM("SDmaHaltErr", 0, 0,
5048 CNTR_NORMAL,
5049 access_sdma_halt_err_cnt),
5050 [C_SDMA_MEM_READ_ERR] = CNTR_ELEM("SDmaMemReadErr", 0, 0,
5051 CNTR_NORMAL,
5052 access_sdma_mem_read_err_cnt),
5053 [C_SDMA_FIRST_DESC_ERR] = CNTR_ELEM("SDmaFirstDescErr", 0, 0,
5054 CNTR_NORMAL,
5055 access_sdma_first_desc_err_cnt),
5056 [C_SDMA_TAIL_OUT_OF_BOUNDS_ERR] = CNTR_ELEM("SDmaTailOutOfBoundsErr", 0, 0,
5057 CNTR_NORMAL,
5058 access_sdma_tail_out_of_bounds_err_cnt),
5059 [C_SDMA_TOO_LONG_ERR] = CNTR_ELEM("SDmaTooLongErr", 0, 0,
5060 CNTR_NORMAL,
5061 access_sdma_too_long_err_cnt),
5062 [C_SDMA_GEN_MISMATCH_ERR] = CNTR_ELEM("SDmaGenMismatchErr", 0, 0,
5063 CNTR_NORMAL,
5064 access_sdma_gen_mismatch_err_cnt),
5065 [C_SDMA_WRONG_DW_ERR] = CNTR_ELEM("SDmaWrongDwErr", 0, 0,
5066 CNTR_NORMAL,
5067 access_sdma_wrong_dw_err_cnt),
5068 };
5069
5070 static struct cntr_entry port_cntrs[PORT_CNTR_LAST] = {
5071 [C_TX_UNSUP_VL] = TXE32_PORT_CNTR_ELEM(TxUnVLErr, SEND_UNSUP_VL_ERR_CNT,
5072 CNTR_NORMAL),
5073 [C_TX_INVAL_LEN] = TXE32_PORT_CNTR_ELEM(TxInvalLen, SEND_LEN_ERR_CNT,
5074 CNTR_NORMAL),
5075 [C_TX_MM_LEN_ERR] = TXE32_PORT_CNTR_ELEM(TxMMLenErr, SEND_MAX_MIN_LEN_ERR_CNT,
5076 CNTR_NORMAL),
5077 [C_TX_UNDERRUN] = TXE32_PORT_CNTR_ELEM(TxUnderrun, SEND_UNDERRUN_CNT,
5078 CNTR_NORMAL),
5079 [C_TX_FLOW_STALL] = TXE32_PORT_CNTR_ELEM(TxFlowStall, SEND_FLOW_STALL_CNT,
5080 CNTR_NORMAL),
5081 [C_TX_DROPPED] = TXE32_PORT_CNTR_ELEM(TxDropped, SEND_DROPPED_PKT_CNT,
5082 CNTR_NORMAL),
5083 [C_TX_HDR_ERR] = TXE32_PORT_CNTR_ELEM(TxHdrErr, SEND_HEADERS_ERR_CNT,
5084 CNTR_NORMAL),
5085 [C_TX_PKT] = TXE64_PORT_CNTR_ELEM(TxPkt, SEND_DATA_PKT_CNT, CNTR_NORMAL),
5086 [C_TX_WORDS] = TXE64_PORT_CNTR_ELEM(TxWords, SEND_DWORD_CNT, CNTR_NORMAL),
5087 [C_TX_WAIT] = TXE64_PORT_CNTR_ELEM(TxWait, SEND_WAIT_CNT, CNTR_SYNTH),
5088 [C_TX_FLIT_VL] = TXE64_PORT_CNTR_ELEM(TxFlitVL, SEND_DATA_VL0_CNT,
5089 CNTR_SYNTH | CNTR_VL),
5090 [C_TX_PKT_VL] = TXE64_PORT_CNTR_ELEM(TxPktVL, SEND_DATA_PKT_VL0_CNT,
5091 CNTR_SYNTH | CNTR_VL),
5092 [C_TX_WAIT_VL] = TXE64_PORT_CNTR_ELEM(TxWaitVL, SEND_WAIT_VL0_CNT,
5093 CNTR_SYNTH | CNTR_VL),
5094 [C_RX_PKT] = RXE64_PORT_CNTR_ELEM(RxPkt, RCV_DATA_PKT_CNT, CNTR_NORMAL),
5095 [C_RX_WORDS] = RXE64_PORT_CNTR_ELEM(RxWords, RCV_DWORD_CNT, CNTR_NORMAL),
5096 [C_SW_LINK_DOWN] = CNTR_ELEM("SwLinkDown", 0, 0, CNTR_SYNTH | CNTR_32BIT,
5097 access_sw_link_dn_cnt),
5098 [C_SW_LINK_UP] = CNTR_ELEM("SwLinkUp", 0, 0, CNTR_SYNTH | CNTR_32BIT,
5099 access_sw_link_up_cnt),
5100 [C_SW_UNKNOWN_FRAME] = CNTR_ELEM("UnknownFrame", 0, 0, CNTR_NORMAL,
5101 access_sw_unknown_frame_cnt),
5102 [C_SW_XMIT_DSCD] = CNTR_ELEM("XmitDscd", 0, 0, CNTR_SYNTH | CNTR_32BIT,
5103 access_sw_xmit_discards),
5104 [C_SW_XMIT_DSCD_VL] = CNTR_ELEM("XmitDscdVl", 0, 0,
5105 CNTR_SYNTH | CNTR_32BIT | CNTR_VL,
5106 access_sw_xmit_discards),
5107 [C_SW_XMIT_CSTR_ERR] = CNTR_ELEM("XmitCstrErr", 0, 0, CNTR_SYNTH,
5108 access_xmit_constraint_errs),
5109 [C_SW_RCV_CSTR_ERR] = CNTR_ELEM("RcvCstrErr", 0, 0, CNTR_SYNTH,
5110 access_rcv_constraint_errs),
5111 [C_SW_IBP_LOOP_PKTS] = SW_IBP_CNTR(LoopPkts, loop_pkts),
5112 [C_SW_IBP_RC_RESENDS] = SW_IBP_CNTR(RcResend, rc_resends),
5113 [C_SW_IBP_RNR_NAKS] = SW_IBP_CNTR(RnrNak, rnr_naks),
5114 [C_SW_IBP_OTHER_NAKS] = SW_IBP_CNTR(OtherNak, other_naks),
5115 [C_SW_IBP_RC_TIMEOUTS] = SW_IBP_CNTR(RcTimeOut, rc_timeouts),
5116 [C_SW_IBP_PKT_DROPS] = SW_IBP_CNTR(PktDrop, pkt_drops),
5117 [C_SW_IBP_DMA_WAIT] = SW_IBP_CNTR(DmaWait, dmawait),
5118 [C_SW_IBP_RC_SEQNAK] = SW_IBP_CNTR(RcSeqNak, rc_seqnak),
5119 [C_SW_IBP_RC_DUPREQ] = SW_IBP_CNTR(RcDupRew, rc_dupreq),
5120 [C_SW_IBP_RDMA_SEQ] = SW_IBP_CNTR(RdmaSeq, rdma_seq),
5121 [C_SW_IBP_UNALIGNED] = SW_IBP_CNTR(Unaligned, unaligned),
5122 [C_SW_IBP_SEQ_NAK] = SW_IBP_CNTR(SeqNak, seq_naks),
5123 [C_SW_IBP_RC_CRWAITS] = SW_IBP_CNTR(RcCrWait, rc_crwaits),
5124 [C_SW_CPU_RC_ACKS] = CNTR_ELEM("RcAcks", 0, 0, CNTR_NORMAL,
5125 access_sw_cpu_rc_acks),
5126 [C_SW_CPU_RC_QACKS] = CNTR_ELEM("RcQacks", 0, 0, CNTR_NORMAL,
5127 access_sw_cpu_rc_qacks),
5128 [C_SW_CPU_RC_DELAYED_COMP] = CNTR_ELEM("RcDelayComp", 0, 0, CNTR_NORMAL,
5129 access_sw_cpu_rc_delayed_comp),
5130 [OVR_LBL(0)] = OVR_ELM(0), [OVR_LBL(1)] = OVR_ELM(1),
5131 [OVR_LBL(2)] = OVR_ELM(2), [OVR_LBL(3)] = OVR_ELM(3),
5132 [OVR_LBL(4)] = OVR_ELM(4), [OVR_LBL(5)] = OVR_ELM(5),
5133 [OVR_LBL(6)] = OVR_ELM(6), [OVR_LBL(7)] = OVR_ELM(7),
5134 [OVR_LBL(8)] = OVR_ELM(8), [OVR_LBL(9)] = OVR_ELM(9),
5135 [OVR_LBL(10)] = OVR_ELM(10), [OVR_LBL(11)] = OVR_ELM(11),
5136 [OVR_LBL(12)] = OVR_ELM(12), [OVR_LBL(13)] = OVR_ELM(13),
5137 [OVR_LBL(14)] = OVR_ELM(14), [OVR_LBL(15)] = OVR_ELM(15),
5138 [OVR_LBL(16)] = OVR_ELM(16), [OVR_LBL(17)] = OVR_ELM(17),
5139 [OVR_LBL(18)] = OVR_ELM(18), [OVR_LBL(19)] = OVR_ELM(19),
5140 [OVR_LBL(20)] = OVR_ELM(20), [OVR_LBL(21)] = OVR_ELM(21),
5141 [OVR_LBL(22)] = OVR_ELM(22), [OVR_LBL(23)] = OVR_ELM(23),
5142 [OVR_LBL(24)] = OVR_ELM(24), [OVR_LBL(25)] = OVR_ELM(25),
5143 [OVR_LBL(26)] = OVR_ELM(26), [OVR_LBL(27)] = OVR_ELM(27),
5144 [OVR_LBL(28)] = OVR_ELM(28), [OVR_LBL(29)] = OVR_ELM(29),
5145 [OVR_LBL(30)] = OVR_ELM(30), [OVR_LBL(31)] = OVR_ELM(31),
5146 [OVR_LBL(32)] = OVR_ELM(32), [OVR_LBL(33)] = OVR_ELM(33),
5147 [OVR_LBL(34)] = OVR_ELM(34), [OVR_LBL(35)] = OVR_ELM(35),
5148 [OVR_LBL(36)] = OVR_ELM(36), [OVR_LBL(37)] = OVR_ELM(37),
5149 [OVR_LBL(38)] = OVR_ELM(38), [OVR_LBL(39)] = OVR_ELM(39),
5150 [OVR_LBL(40)] = OVR_ELM(40), [OVR_LBL(41)] = OVR_ELM(41),
5151 [OVR_LBL(42)] = OVR_ELM(42), [OVR_LBL(43)] = OVR_ELM(43),
5152 [OVR_LBL(44)] = OVR_ELM(44), [OVR_LBL(45)] = OVR_ELM(45),
5153 [OVR_LBL(46)] = OVR_ELM(46), [OVR_LBL(47)] = OVR_ELM(47),
5154 [OVR_LBL(48)] = OVR_ELM(48), [OVR_LBL(49)] = OVR_ELM(49),
5155 [OVR_LBL(50)] = OVR_ELM(50), [OVR_LBL(51)] = OVR_ELM(51),
5156 [OVR_LBL(52)] = OVR_ELM(52), [OVR_LBL(53)] = OVR_ELM(53),
5157 [OVR_LBL(54)] = OVR_ELM(54), [OVR_LBL(55)] = OVR_ELM(55),
5158 [OVR_LBL(56)] = OVR_ELM(56), [OVR_LBL(57)] = OVR_ELM(57),
5159 [OVR_LBL(58)] = OVR_ELM(58), [OVR_LBL(59)] = OVR_ELM(59),
5160 [OVR_LBL(60)] = OVR_ELM(60), [OVR_LBL(61)] = OVR_ELM(61),
5161 [OVR_LBL(62)] = OVR_ELM(62), [OVR_LBL(63)] = OVR_ELM(63),
5162 [OVR_LBL(64)] = OVR_ELM(64), [OVR_LBL(65)] = OVR_ELM(65),
5163 [OVR_LBL(66)] = OVR_ELM(66), [OVR_LBL(67)] = OVR_ELM(67),
5164 [OVR_LBL(68)] = OVR_ELM(68), [OVR_LBL(69)] = OVR_ELM(69),
5165 [OVR_LBL(70)] = OVR_ELM(70), [OVR_LBL(71)] = OVR_ELM(71),
5166 [OVR_LBL(72)] = OVR_ELM(72), [OVR_LBL(73)] = OVR_ELM(73),
5167 [OVR_LBL(74)] = OVR_ELM(74), [OVR_LBL(75)] = OVR_ELM(75),
5168 [OVR_LBL(76)] = OVR_ELM(76), [OVR_LBL(77)] = OVR_ELM(77),
5169 [OVR_LBL(78)] = OVR_ELM(78), [OVR_LBL(79)] = OVR_ELM(79),
5170 [OVR_LBL(80)] = OVR_ELM(80), [OVR_LBL(81)] = OVR_ELM(81),
5171 [OVR_LBL(82)] = OVR_ELM(82), [OVR_LBL(83)] = OVR_ELM(83),
5172 [OVR_LBL(84)] = OVR_ELM(84), [OVR_LBL(85)] = OVR_ELM(85),
5173 [OVR_LBL(86)] = OVR_ELM(86), [OVR_LBL(87)] = OVR_ELM(87),
5174 [OVR_LBL(88)] = OVR_ELM(88), [OVR_LBL(89)] = OVR_ELM(89),
5175 [OVR_LBL(90)] = OVR_ELM(90), [OVR_LBL(91)] = OVR_ELM(91),
5176 [OVR_LBL(92)] = OVR_ELM(92), [OVR_LBL(93)] = OVR_ELM(93),
5177 [OVR_LBL(94)] = OVR_ELM(94), [OVR_LBL(95)] = OVR_ELM(95),
5178 [OVR_LBL(96)] = OVR_ELM(96), [OVR_LBL(97)] = OVR_ELM(97),
5179 [OVR_LBL(98)] = OVR_ELM(98), [OVR_LBL(99)] = OVR_ELM(99),
5180 [OVR_LBL(100)] = OVR_ELM(100), [OVR_LBL(101)] = OVR_ELM(101),
5181 [OVR_LBL(102)] = OVR_ELM(102), [OVR_LBL(103)] = OVR_ELM(103),
5182 [OVR_LBL(104)] = OVR_ELM(104), [OVR_LBL(105)] = OVR_ELM(105),
5183 [OVR_LBL(106)] = OVR_ELM(106), [OVR_LBL(107)] = OVR_ELM(107),
5184 [OVR_LBL(108)] = OVR_ELM(108), [OVR_LBL(109)] = OVR_ELM(109),
5185 [OVR_LBL(110)] = OVR_ELM(110), [OVR_LBL(111)] = OVR_ELM(111),
5186 [OVR_LBL(112)] = OVR_ELM(112), [OVR_LBL(113)] = OVR_ELM(113),
5187 [OVR_LBL(114)] = OVR_ELM(114), [OVR_LBL(115)] = OVR_ELM(115),
5188 [OVR_LBL(116)] = OVR_ELM(116), [OVR_LBL(117)] = OVR_ELM(117),
5189 [OVR_LBL(118)] = OVR_ELM(118), [OVR_LBL(119)] = OVR_ELM(119),
5190 [OVR_LBL(120)] = OVR_ELM(120), [OVR_LBL(121)] = OVR_ELM(121),
5191 [OVR_LBL(122)] = OVR_ELM(122), [OVR_LBL(123)] = OVR_ELM(123),
5192 [OVR_LBL(124)] = OVR_ELM(124), [OVR_LBL(125)] = OVR_ELM(125),
5193 [OVR_LBL(126)] = OVR_ELM(126), [OVR_LBL(127)] = OVR_ELM(127),
5194 [OVR_LBL(128)] = OVR_ELM(128), [OVR_LBL(129)] = OVR_ELM(129),
5195 [OVR_LBL(130)] = OVR_ELM(130), [OVR_LBL(131)] = OVR_ELM(131),
5196 [OVR_LBL(132)] = OVR_ELM(132), [OVR_LBL(133)] = OVR_ELM(133),
5197 [OVR_LBL(134)] = OVR_ELM(134), [OVR_LBL(135)] = OVR_ELM(135),
5198 [OVR_LBL(136)] = OVR_ELM(136), [OVR_LBL(137)] = OVR_ELM(137),
5199 [OVR_LBL(138)] = OVR_ELM(138), [OVR_LBL(139)] = OVR_ELM(139),
5200 [OVR_LBL(140)] = OVR_ELM(140), [OVR_LBL(141)] = OVR_ELM(141),
5201 [OVR_LBL(142)] = OVR_ELM(142), [OVR_LBL(143)] = OVR_ELM(143),
5202 [OVR_LBL(144)] = OVR_ELM(144), [OVR_LBL(145)] = OVR_ELM(145),
5203 [OVR_LBL(146)] = OVR_ELM(146), [OVR_LBL(147)] = OVR_ELM(147),
5204 [OVR_LBL(148)] = OVR_ELM(148), [OVR_LBL(149)] = OVR_ELM(149),
5205 [OVR_LBL(150)] = OVR_ELM(150), [OVR_LBL(151)] = OVR_ELM(151),
5206 [OVR_LBL(152)] = OVR_ELM(152), [OVR_LBL(153)] = OVR_ELM(153),
5207 [OVR_LBL(154)] = OVR_ELM(154), [OVR_LBL(155)] = OVR_ELM(155),
5208 [OVR_LBL(156)] = OVR_ELM(156), [OVR_LBL(157)] = OVR_ELM(157),
5209 [OVR_LBL(158)] = OVR_ELM(158), [OVR_LBL(159)] = OVR_ELM(159),
5210 };
5211
5212 /* ======================================================================== */
5213
5214 /* return true if this is chip revision revision a */
is_ax(struct hfi1_devdata * dd)5215 int is_ax(struct hfi1_devdata *dd)
5216 {
5217 u8 chip_rev_minor =
5218 dd->revision >> CCE_REVISION_CHIP_REV_MINOR_SHIFT
5219 & CCE_REVISION_CHIP_REV_MINOR_MASK;
5220 return (chip_rev_minor & 0xf0) == 0;
5221 }
5222
5223 /* return true if this is chip revision revision b */
is_bx(struct hfi1_devdata * dd)5224 int is_bx(struct hfi1_devdata *dd)
5225 {
5226 u8 chip_rev_minor =
5227 dd->revision >> CCE_REVISION_CHIP_REV_MINOR_SHIFT
5228 & CCE_REVISION_CHIP_REV_MINOR_MASK;
5229 return (chip_rev_minor & 0xF0) == 0x10;
5230 }
5231
5232 /* return true is kernel urg disabled for rcd */
is_urg_masked(struct hfi1_ctxtdata * rcd)5233 bool is_urg_masked(struct hfi1_ctxtdata *rcd)
5234 {
5235 u64 mask;
5236 u32 is = IS_RCVURGENT_START + rcd->ctxt;
5237 u8 bit = is % 64;
5238
5239 mask = read_csr(rcd->dd, CCE_INT_MASK + (8 * (is / 64)));
5240 return !(mask & BIT_ULL(bit));
5241 }
5242
5243 /*
5244 * Append string s to buffer buf. Arguments curp and len are the current
5245 * position and remaining length, respectively.
5246 *
5247 * return 0 on success, 1 on out of room
5248 */
append_str(char * buf,char ** curp,int * lenp,const char * s)5249 static int append_str(char *buf, char **curp, int *lenp, const char *s)
5250 {
5251 char *p = *curp;
5252 int len = *lenp;
5253 int result = 0; /* success */
5254 char c;
5255
5256 /* add a comma, if first in the buffer */
5257 if (p != buf) {
5258 if (len == 0) {
5259 result = 1; /* out of room */
5260 goto done;
5261 }
5262 *p++ = ',';
5263 len--;
5264 }
5265
5266 /* copy the string */
5267 while ((c = *s++) != 0) {
5268 if (len == 0) {
5269 result = 1; /* out of room */
5270 goto done;
5271 }
5272 *p++ = c;
5273 len--;
5274 }
5275
5276 done:
5277 /* write return values */
5278 *curp = p;
5279 *lenp = len;
5280
5281 return result;
5282 }
5283
5284 /*
5285 * Using the given flag table, print a comma separated string into
5286 * the buffer. End in '*' if the buffer is too short.
5287 */
flag_string(char * buf,int buf_len,u64 flags,struct flag_table * table,int table_size)5288 static char *flag_string(char *buf, int buf_len, u64 flags,
5289 struct flag_table *table, int table_size)
5290 {
5291 char extra[32];
5292 char *p = buf;
5293 int len = buf_len;
5294 int no_room = 0;
5295 int i;
5296
5297 /* make sure there is at least 2 so we can form "*" */
5298 if (len < 2)
5299 return "";
5300
5301 len--; /* leave room for a nul */
5302 for (i = 0; i < table_size; i++) {
5303 if (flags & table[i].flag) {
5304 no_room = append_str(buf, &p, &len, table[i].str);
5305 if (no_room)
5306 break;
5307 flags &= ~table[i].flag;
5308 }
5309 }
5310
5311 /* any undocumented bits left? */
5312 if (!no_room && flags) {
5313 snprintf(extra, sizeof(extra), "bits 0x%llx", flags);
5314 no_room = append_str(buf, &p, &len, extra);
5315 }
5316
5317 /* add * if ran out of room */
5318 if (no_room) {
5319 /* may need to back up to add space for a '*' */
5320 if (len == 0)
5321 --p;
5322 *p++ = '*';
5323 }
5324
5325 /* add final nul - space already allocated above */
5326 *p = 0;
5327 return buf;
5328 }
5329
5330 /* first 8 CCE error interrupt source names */
5331 static const char * const cce_misc_names[] = {
5332 "CceErrInt", /* 0 */
5333 "RxeErrInt", /* 1 */
5334 "MiscErrInt", /* 2 */
5335 "Reserved3", /* 3 */
5336 "PioErrInt", /* 4 */
5337 "SDmaErrInt", /* 5 */
5338 "EgressErrInt", /* 6 */
5339 "TxeErrInt" /* 7 */
5340 };
5341
5342 /*
5343 * Return the miscellaneous error interrupt name.
5344 */
is_misc_err_name(char * buf,size_t bsize,unsigned int source)5345 static char *is_misc_err_name(char *buf, size_t bsize, unsigned int source)
5346 {
5347 if (source < ARRAY_SIZE(cce_misc_names))
5348 strncpy(buf, cce_misc_names[source], bsize);
5349 else
5350 snprintf(buf, bsize, "Reserved%u",
5351 source + IS_GENERAL_ERR_START);
5352
5353 return buf;
5354 }
5355
5356 /*
5357 * Return the SDMA engine error interrupt name.
5358 */
is_sdma_eng_err_name(char * buf,size_t bsize,unsigned int source)5359 static char *is_sdma_eng_err_name(char *buf, size_t bsize, unsigned int source)
5360 {
5361 snprintf(buf, bsize, "SDmaEngErrInt%u", source);
5362 return buf;
5363 }
5364
5365 /*
5366 * Return the send context error interrupt name.
5367 */
is_sendctxt_err_name(char * buf,size_t bsize,unsigned int source)5368 static char *is_sendctxt_err_name(char *buf, size_t bsize, unsigned int source)
5369 {
5370 snprintf(buf, bsize, "SendCtxtErrInt%u", source);
5371 return buf;
5372 }
5373
5374 static const char * const various_names[] = {
5375 "PbcInt",
5376 "GpioAssertInt",
5377 "Qsfp1Int",
5378 "Qsfp2Int",
5379 "TCritInt"
5380 };
5381
5382 /*
5383 * Return the various interrupt name.
5384 */
is_various_name(char * buf,size_t bsize,unsigned int source)5385 static char *is_various_name(char *buf, size_t bsize, unsigned int source)
5386 {
5387 if (source < ARRAY_SIZE(various_names))
5388 strncpy(buf, various_names[source], bsize);
5389 else
5390 snprintf(buf, bsize, "Reserved%u", source + IS_VARIOUS_START);
5391 return buf;
5392 }
5393
5394 /*
5395 * Return the DC interrupt name.
5396 */
is_dc_name(char * buf,size_t bsize,unsigned int source)5397 static char *is_dc_name(char *buf, size_t bsize, unsigned int source)
5398 {
5399 static const char * const dc_int_names[] = {
5400 "common",
5401 "lcb",
5402 "8051",
5403 "lbm" /* local block merge */
5404 };
5405
5406 if (source < ARRAY_SIZE(dc_int_names))
5407 snprintf(buf, bsize, "dc_%s_int", dc_int_names[source]);
5408 else
5409 snprintf(buf, bsize, "DCInt%u", source);
5410 return buf;
5411 }
5412
5413 static const char * const sdma_int_names[] = {
5414 "SDmaInt",
5415 "SdmaIdleInt",
5416 "SdmaProgressInt",
5417 };
5418
5419 /*
5420 * Return the SDMA engine interrupt name.
5421 */
is_sdma_eng_name(char * buf,size_t bsize,unsigned int source)5422 static char *is_sdma_eng_name(char *buf, size_t bsize, unsigned int source)
5423 {
5424 /* what interrupt */
5425 unsigned int what = source / TXE_NUM_SDMA_ENGINES;
5426 /* which engine */
5427 unsigned int which = source % TXE_NUM_SDMA_ENGINES;
5428
5429 if (likely(what < 3))
5430 snprintf(buf, bsize, "%s%u", sdma_int_names[what], which);
5431 else
5432 snprintf(buf, bsize, "Invalid SDMA interrupt %u", source);
5433 return buf;
5434 }
5435
5436 /*
5437 * Return the receive available interrupt name.
5438 */
is_rcv_avail_name(char * buf,size_t bsize,unsigned int source)5439 static char *is_rcv_avail_name(char *buf, size_t bsize, unsigned int source)
5440 {
5441 snprintf(buf, bsize, "RcvAvailInt%u", source);
5442 return buf;
5443 }
5444
5445 /*
5446 * Return the receive urgent interrupt name.
5447 */
is_rcv_urgent_name(char * buf,size_t bsize,unsigned int source)5448 static char *is_rcv_urgent_name(char *buf, size_t bsize, unsigned int source)
5449 {
5450 snprintf(buf, bsize, "RcvUrgentInt%u", source);
5451 return buf;
5452 }
5453
5454 /*
5455 * Return the send credit interrupt name.
5456 */
is_send_credit_name(char * buf,size_t bsize,unsigned int source)5457 static char *is_send_credit_name(char *buf, size_t bsize, unsigned int source)
5458 {
5459 snprintf(buf, bsize, "SendCreditInt%u", source);
5460 return buf;
5461 }
5462
5463 /*
5464 * Return the reserved interrupt name.
5465 */
is_reserved_name(char * buf,size_t bsize,unsigned int source)5466 static char *is_reserved_name(char *buf, size_t bsize, unsigned int source)
5467 {
5468 snprintf(buf, bsize, "Reserved%u", source + IS_RESERVED_START);
5469 return buf;
5470 }
5471
cce_err_status_string(char * buf,int buf_len,u64 flags)5472 static char *cce_err_status_string(char *buf, int buf_len, u64 flags)
5473 {
5474 return flag_string(buf, buf_len, flags,
5475 cce_err_status_flags,
5476 ARRAY_SIZE(cce_err_status_flags));
5477 }
5478
rxe_err_status_string(char * buf,int buf_len,u64 flags)5479 static char *rxe_err_status_string(char *buf, int buf_len, u64 flags)
5480 {
5481 return flag_string(buf, buf_len, flags,
5482 rxe_err_status_flags,
5483 ARRAY_SIZE(rxe_err_status_flags));
5484 }
5485
misc_err_status_string(char * buf,int buf_len,u64 flags)5486 static char *misc_err_status_string(char *buf, int buf_len, u64 flags)
5487 {
5488 return flag_string(buf, buf_len, flags, misc_err_status_flags,
5489 ARRAY_SIZE(misc_err_status_flags));
5490 }
5491
pio_err_status_string(char * buf,int buf_len,u64 flags)5492 static char *pio_err_status_string(char *buf, int buf_len, u64 flags)
5493 {
5494 return flag_string(buf, buf_len, flags,
5495 pio_err_status_flags,
5496 ARRAY_SIZE(pio_err_status_flags));
5497 }
5498
sdma_err_status_string(char * buf,int buf_len,u64 flags)5499 static char *sdma_err_status_string(char *buf, int buf_len, u64 flags)
5500 {
5501 return flag_string(buf, buf_len, flags,
5502 sdma_err_status_flags,
5503 ARRAY_SIZE(sdma_err_status_flags));
5504 }
5505
egress_err_status_string(char * buf,int buf_len,u64 flags)5506 static char *egress_err_status_string(char *buf, int buf_len, u64 flags)
5507 {
5508 return flag_string(buf, buf_len, flags,
5509 egress_err_status_flags,
5510 ARRAY_SIZE(egress_err_status_flags));
5511 }
5512
egress_err_info_string(char * buf,int buf_len,u64 flags)5513 static char *egress_err_info_string(char *buf, int buf_len, u64 flags)
5514 {
5515 return flag_string(buf, buf_len, flags,
5516 egress_err_info_flags,
5517 ARRAY_SIZE(egress_err_info_flags));
5518 }
5519
send_err_status_string(char * buf,int buf_len,u64 flags)5520 static char *send_err_status_string(char *buf, int buf_len, u64 flags)
5521 {
5522 return flag_string(buf, buf_len, flags,
5523 send_err_status_flags,
5524 ARRAY_SIZE(send_err_status_flags));
5525 }
5526
handle_cce_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5527 static void handle_cce_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5528 {
5529 char buf[96];
5530 int i = 0;
5531
5532 /*
5533 * For most these errors, there is nothing that can be done except
5534 * report or record it.
5535 */
5536 dd_dev_info(dd, "CCE Error: %s\n",
5537 cce_err_status_string(buf, sizeof(buf), reg));
5538
5539 if ((reg & CCE_ERR_STATUS_CCE_CLI2_ASYNC_FIFO_PARITY_ERR_SMASK) &&
5540 is_ax(dd) && (dd->icode != ICODE_FUNCTIONAL_SIMULATOR)) {
5541 /* this error requires a manual drop into SPC freeze mode */
5542 /* then a fix up */
5543 start_freeze_handling(dd->pport, FREEZE_SELF);
5544 }
5545
5546 for (i = 0; i < NUM_CCE_ERR_STATUS_COUNTERS; i++) {
5547 if (reg & (1ull << i)) {
5548 incr_cntr64(&dd->cce_err_status_cnt[i]);
5549 /* maintain a counter over all cce_err_status errors */
5550 incr_cntr64(&dd->sw_cce_err_status_aggregate);
5551 }
5552 }
5553 }
5554
5555 /*
5556 * Check counters for receive errors that do not have an interrupt
5557 * associated with them.
5558 */
5559 #define RCVERR_CHECK_TIME 10
update_rcverr_timer(struct timer_list * t)5560 static void update_rcverr_timer(struct timer_list *t)
5561 {
5562 struct hfi1_devdata *dd = from_timer(dd, t, rcverr_timer);
5563 struct hfi1_pportdata *ppd = dd->pport;
5564 u32 cur_ovfl_cnt = read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL);
5565
5566 if (dd->rcv_ovfl_cnt < cur_ovfl_cnt &&
5567 ppd->port_error_action & OPA_PI_MASK_EX_BUFFER_OVERRUN) {
5568 dd_dev_info(dd, "%s: PortErrorAction bounce\n", __func__);
5569 set_link_down_reason(
5570 ppd, OPA_LINKDOWN_REASON_EXCESSIVE_BUFFER_OVERRUN, 0,
5571 OPA_LINKDOWN_REASON_EXCESSIVE_BUFFER_OVERRUN);
5572 queue_work(ppd->link_wq, &ppd->link_bounce_work);
5573 }
5574 dd->rcv_ovfl_cnt = (u32)cur_ovfl_cnt;
5575
5576 mod_timer(&dd->rcverr_timer, jiffies + HZ * RCVERR_CHECK_TIME);
5577 }
5578
init_rcverr(struct hfi1_devdata * dd)5579 static int init_rcverr(struct hfi1_devdata *dd)
5580 {
5581 timer_setup(&dd->rcverr_timer, update_rcverr_timer, 0);
5582 /* Assume the hardware counter has been reset */
5583 dd->rcv_ovfl_cnt = 0;
5584 return mod_timer(&dd->rcverr_timer, jiffies + HZ * RCVERR_CHECK_TIME);
5585 }
5586
free_rcverr(struct hfi1_devdata * dd)5587 static void free_rcverr(struct hfi1_devdata *dd)
5588 {
5589 if (dd->rcverr_timer.function)
5590 del_timer_sync(&dd->rcverr_timer);
5591 }
5592
handle_rxe_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5593 static void handle_rxe_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5594 {
5595 char buf[96];
5596 int i = 0;
5597
5598 dd_dev_info(dd, "Receive Error: %s\n",
5599 rxe_err_status_string(buf, sizeof(buf), reg));
5600
5601 if (reg & ALL_RXE_FREEZE_ERR) {
5602 int flags = 0;
5603
5604 /*
5605 * Freeze mode recovery is disabled for the errors
5606 * in RXE_FREEZE_ABORT_MASK
5607 */
5608 if (is_ax(dd) && (reg & RXE_FREEZE_ABORT_MASK))
5609 flags = FREEZE_ABORT;
5610
5611 start_freeze_handling(dd->pport, flags);
5612 }
5613
5614 for (i = 0; i < NUM_RCV_ERR_STATUS_COUNTERS; i++) {
5615 if (reg & (1ull << i))
5616 incr_cntr64(&dd->rcv_err_status_cnt[i]);
5617 }
5618 }
5619
handle_misc_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5620 static void handle_misc_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5621 {
5622 char buf[96];
5623 int i = 0;
5624
5625 dd_dev_info(dd, "Misc Error: %s",
5626 misc_err_status_string(buf, sizeof(buf), reg));
5627 for (i = 0; i < NUM_MISC_ERR_STATUS_COUNTERS; i++) {
5628 if (reg & (1ull << i))
5629 incr_cntr64(&dd->misc_err_status_cnt[i]);
5630 }
5631 }
5632
handle_pio_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5633 static void handle_pio_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5634 {
5635 char buf[96];
5636 int i = 0;
5637
5638 dd_dev_info(dd, "PIO Error: %s\n",
5639 pio_err_status_string(buf, sizeof(buf), reg));
5640
5641 if (reg & ALL_PIO_FREEZE_ERR)
5642 start_freeze_handling(dd->pport, 0);
5643
5644 for (i = 0; i < NUM_SEND_PIO_ERR_STATUS_COUNTERS; i++) {
5645 if (reg & (1ull << i))
5646 incr_cntr64(&dd->send_pio_err_status_cnt[i]);
5647 }
5648 }
5649
handle_sdma_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5650 static void handle_sdma_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5651 {
5652 char buf[96];
5653 int i = 0;
5654
5655 dd_dev_info(dd, "SDMA Error: %s\n",
5656 sdma_err_status_string(buf, sizeof(buf), reg));
5657
5658 if (reg & ALL_SDMA_FREEZE_ERR)
5659 start_freeze_handling(dd->pport, 0);
5660
5661 for (i = 0; i < NUM_SEND_DMA_ERR_STATUS_COUNTERS; i++) {
5662 if (reg & (1ull << i))
5663 incr_cntr64(&dd->send_dma_err_status_cnt[i]);
5664 }
5665 }
5666
__count_port_discards(struct hfi1_pportdata * ppd)5667 static inline void __count_port_discards(struct hfi1_pportdata *ppd)
5668 {
5669 incr_cntr64(&ppd->port_xmit_discards);
5670 }
5671
count_port_inactive(struct hfi1_devdata * dd)5672 static void count_port_inactive(struct hfi1_devdata *dd)
5673 {
5674 __count_port_discards(dd->pport);
5675 }
5676
5677 /*
5678 * We have had a "disallowed packet" error during egress. Determine the
5679 * integrity check which failed, and update relevant error counter, etc.
5680 *
5681 * Note that the SEND_EGRESS_ERR_INFO register has only a single
5682 * bit of state per integrity check, and so we can miss the reason for an
5683 * egress error if more than one packet fails the same integrity check
5684 * since we cleared the corresponding bit in SEND_EGRESS_ERR_INFO.
5685 */
handle_send_egress_err_info(struct hfi1_devdata * dd,int vl)5686 static void handle_send_egress_err_info(struct hfi1_devdata *dd,
5687 int vl)
5688 {
5689 struct hfi1_pportdata *ppd = dd->pport;
5690 u64 src = read_csr(dd, SEND_EGRESS_ERR_SOURCE); /* read first */
5691 u64 info = read_csr(dd, SEND_EGRESS_ERR_INFO);
5692 char buf[96];
5693
5694 /* clear down all observed info as quickly as possible after read */
5695 write_csr(dd, SEND_EGRESS_ERR_INFO, info);
5696
5697 dd_dev_info(dd,
5698 "Egress Error Info: 0x%llx, %s Egress Error Src 0x%llx\n",
5699 info, egress_err_info_string(buf, sizeof(buf), info), src);
5700
5701 /* Eventually add other counters for each bit */
5702 if (info & PORT_DISCARD_EGRESS_ERRS) {
5703 int weight, i;
5704
5705 /*
5706 * Count all applicable bits as individual errors and
5707 * attribute them to the packet that triggered this handler.
5708 * This may not be completely accurate due to limitations
5709 * on the available hardware error information. There is
5710 * a single information register and any number of error
5711 * packets may have occurred and contributed to it before
5712 * this routine is called. This means that:
5713 * a) If multiple packets with the same error occur before
5714 * this routine is called, earlier packets are missed.
5715 * There is only a single bit for each error type.
5716 * b) Errors may not be attributed to the correct VL.
5717 * The driver is attributing all bits in the info register
5718 * to the packet that triggered this call, but bits
5719 * could be an accumulation of different packets with
5720 * different VLs.
5721 * c) A single error packet may have multiple counts attached
5722 * to it. There is no way for the driver to know if
5723 * multiple bits set in the info register are due to a
5724 * single packet or multiple packets. The driver assumes
5725 * multiple packets.
5726 */
5727 weight = hweight64(info & PORT_DISCARD_EGRESS_ERRS);
5728 for (i = 0; i < weight; i++) {
5729 __count_port_discards(ppd);
5730 if (vl >= 0 && vl < TXE_NUM_DATA_VL)
5731 incr_cntr64(&ppd->port_xmit_discards_vl[vl]);
5732 else if (vl == 15)
5733 incr_cntr64(&ppd->port_xmit_discards_vl
5734 [C_VL_15]);
5735 }
5736 }
5737 }
5738
5739 /*
5740 * Input value is a bit position within the SEND_EGRESS_ERR_STATUS
5741 * register. Does it represent a 'port inactive' error?
5742 */
port_inactive_err(u64 posn)5743 static inline int port_inactive_err(u64 posn)
5744 {
5745 return (posn >= SEES(TX_LINKDOWN) &&
5746 posn <= SEES(TX_INCORRECT_LINK_STATE));
5747 }
5748
5749 /*
5750 * Input value is a bit position within the SEND_EGRESS_ERR_STATUS
5751 * register. Does it represent a 'disallowed packet' error?
5752 */
disallowed_pkt_err(int posn)5753 static inline int disallowed_pkt_err(int posn)
5754 {
5755 return (posn >= SEES(TX_SDMA0_DISALLOWED_PACKET) &&
5756 posn <= SEES(TX_SDMA15_DISALLOWED_PACKET));
5757 }
5758
5759 /*
5760 * Input value is a bit position of one of the SDMA engine disallowed
5761 * packet errors. Return which engine. Use of this must be guarded by
5762 * disallowed_pkt_err().
5763 */
disallowed_pkt_engine(int posn)5764 static inline int disallowed_pkt_engine(int posn)
5765 {
5766 return posn - SEES(TX_SDMA0_DISALLOWED_PACKET);
5767 }
5768
5769 /*
5770 * Translate an SDMA engine to a VL. Return -1 if the tranlation cannot
5771 * be done.
5772 */
engine_to_vl(struct hfi1_devdata * dd,int engine)5773 static int engine_to_vl(struct hfi1_devdata *dd, int engine)
5774 {
5775 struct sdma_vl_map *m;
5776 int vl;
5777
5778 /* range check */
5779 if (engine < 0 || engine >= TXE_NUM_SDMA_ENGINES)
5780 return -1;
5781
5782 rcu_read_lock();
5783 m = rcu_dereference(dd->sdma_map);
5784 vl = m->engine_to_vl[engine];
5785 rcu_read_unlock();
5786
5787 return vl;
5788 }
5789
5790 /*
5791 * Translate the send context (sofware index) into a VL. Return -1 if the
5792 * translation cannot be done.
5793 */
sc_to_vl(struct hfi1_devdata * dd,int sw_index)5794 static int sc_to_vl(struct hfi1_devdata *dd, int sw_index)
5795 {
5796 struct send_context_info *sci;
5797 struct send_context *sc;
5798 int i;
5799
5800 sci = &dd->send_contexts[sw_index];
5801
5802 /* there is no information for user (PSM) and ack contexts */
5803 if ((sci->type != SC_KERNEL) && (sci->type != SC_VL15))
5804 return -1;
5805
5806 sc = sci->sc;
5807 if (!sc)
5808 return -1;
5809 if (dd->vld[15].sc == sc)
5810 return 15;
5811 for (i = 0; i < num_vls; i++)
5812 if (dd->vld[i].sc == sc)
5813 return i;
5814
5815 return -1;
5816 }
5817
handle_egress_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5818 static void handle_egress_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5819 {
5820 u64 reg_copy = reg, handled = 0;
5821 char buf[96];
5822 int i = 0;
5823
5824 if (reg & ALL_TXE_EGRESS_FREEZE_ERR)
5825 start_freeze_handling(dd->pport, 0);
5826 else if (is_ax(dd) &&
5827 (reg & SEND_EGRESS_ERR_STATUS_TX_CREDIT_RETURN_VL_ERR_SMASK) &&
5828 (dd->icode != ICODE_FUNCTIONAL_SIMULATOR))
5829 start_freeze_handling(dd->pport, 0);
5830
5831 while (reg_copy) {
5832 int posn = fls64(reg_copy);
5833 /* fls64() returns a 1-based offset, we want it zero based */
5834 int shift = posn - 1;
5835 u64 mask = 1ULL << shift;
5836
5837 if (port_inactive_err(shift)) {
5838 count_port_inactive(dd);
5839 handled |= mask;
5840 } else if (disallowed_pkt_err(shift)) {
5841 int vl = engine_to_vl(dd, disallowed_pkt_engine(shift));
5842
5843 handle_send_egress_err_info(dd, vl);
5844 handled |= mask;
5845 }
5846 reg_copy &= ~mask;
5847 }
5848
5849 reg &= ~handled;
5850
5851 if (reg)
5852 dd_dev_info(dd, "Egress Error: %s\n",
5853 egress_err_status_string(buf, sizeof(buf), reg));
5854
5855 for (i = 0; i < NUM_SEND_EGRESS_ERR_STATUS_COUNTERS; i++) {
5856 if (reg & (1ull << i))
5857 incr_cntr64(&dd->send_egress_err_status_cnt[i]);
5858 }
5859 }
5860
handle_txe_err(struct hfi1_devdata * dd,u32 unused,u64 reg)5861 static void handle_txe_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
5862 {
5863 char buf[96];
5864 int i = 0;
5865
5866 dd_dev_info(dd, "Send Error: %s\n",
5867 send_err_status_string(buf, sizeof(buf), reg));
5868
5869 for (i = 0; i < NUM_SEND_ERR_STATUS_COUNTERS; i++) {
5870 if (reg & (1ull << i))
5871 incr_cntr64(&dd->send_err_status_cnt[i]);
5872 }
5873 }
5874
5875 /*
5876 * The maximum number of times the error clear down will loop before
5877 * blocking a repeating error. This value is arbitrary.
5878 */
5879 #define MAX_CLEAR_COUNT 20
5880
5881 /*
5882 * Clear and handle an error register. All error interrupts are funneled
5883 * through here to have a central location to correctly handle single-
5884 * or multi-shot errors.
5885 *
5886 * For non per-context registers, call this routine with a context value
5887 * of 0 so the per-context offset is zero.
5888 *
5889 * If the handler loops too many times, assume that something is wrong
5890 * and can't be fixed, so mask the error bits.
5891 */
interrupt_clear_down(struct hfi1_devdata * dd,u32 context,const struct err_reg_info * eri)5892 static void interrupt_clear_down(struct hfi1_devdata *dd,
5893 u32 context,
5894 const struct err_reg_info *eri)
5895 {
5896 u64 reg;
5897 u32 count;
5898
5899 /* read in a loop until no more errors are seen */
5900 count = 0;
5901 while (1) {
5902 reg = read_kctxt_csr(dd, context, eri->status);
5903 if (reg == 0)
5904 break;
5905 write_kctxt_csr(dd, context, eri->clear, reg);
5906 if (likely(eri->handler))
5907 eri->handler(dd, context, reg);
5908 count++;
5909 if (count > MAX_CLEAR_COUNT) {
5910 u64 mask;
5911
5912 dd_dev_err(dd, "Repeating %s bits 0x%llx - masking\n",
5913 eri->desc, reg);
5914 /*
5915 * Read-modify-write so any other masked bits
5916 * remain masked.
5917 */
5918 mask = read_kctxt_csr(dd, context, eri->mask);
5919 mask &= ~reg;
5920 write_kctxt_csr(dd, context, eri->mask, mask);
5921 break;
5922 }
5923 }
5924 }
5925
5926 /*
5927 * CCE block "misc" interrupt. Source is < 16.
5928 */
is_misc_err_int(struct hfi1_devdata * dd,unsigned int source)5929 static void is_misc_err_int(struct hfi1_devdata *dd, unsigned int source)
5930 {
5931 const struct err_reg_info *eri = &misc_errs[source];
5932
5933 if (eri->handler) {
5934 interrupt_clear_down(dd, 0, eri);
5935 } else {
5936 dd_dev_err(dd, "Unexpected misc interrupt (%u) - reserved\n",
5937 source);
5938 }
5939 }
5940
send_context_err_status_string(char * buf,int buf_len,u64 flags)5941 static char *send_context_err_status_string(char *buf, int buf_len, u64 flags)
5942 {
5943 return flag_string(buf, buf_len, flags,
5944 sc_err_status_flags,
5945 ARRAY_SIZE(sc_err_status_flags));
5946 }
5947
5948 /*
5949 * Send context error interrupt. Source (hw_context) is < 160.
5950 *
5951 * All send context errors cause the send context to halt. The normal
5952 * clear-down mechanism cannot be used because we cannot clear the
5953 * error bits until several other long-running items are done first.
5954 * This is OK because with the context halted, nothing else is going
5955 * to happen on it anyway.
5956 */
is_sendctxt_err_int(struct hfi1_devdata * dd,unsigned int hw_context)5957 static void is_sendctxt_err_int(struct hfi1_devdata *dd,
5958 unsigned int hw_context)
5959 {
5960 struct send_context_info *sci;
5961 struct send_context *sc;
5962 char flags[96];
5963 u64 status;
5964 u32 sw_index;
5965 int i = 0;
5966 unsigned long irq_flags;
5967
5968 sw_index = dd->hw_to_sw[hw_context];
5969 if (sw_index >= dd->num_send_contexts) {
5970 dd_dev_err(dd,
5971 "out of range sw index %u for send context %u\n",
5972 sw_index, hw_context);
5973 return;
5974 }
5975 sci = &dd->send_contexts[sw_index];
5976 spin_lock_irqsave(&dd->sc_lock, irq_flags);
5977 sc = sci->sc;
5978 if (!sc) {
5979 dd_dev_err(dd, "%s: context %u(%u): no sc?\n", __func__,
5980 sw_index, hw_context);
5981 spin_unlock_irqrestore(&dd->sc_lock, irq_flags);
5982 return;
5983 }
5984
5985 /* tell the software that a halt has begun */
5986 sc_stop(sc, SCF_HALTED);
5987
5988 status = read_kctxt_csr(dd, hw_context, SEND_CTXT_ERR_STATUS);
5989
5990 dd_dev_info(dd, "Send Context %u(%u) Error: %s\n", sw_index, hw_context,
5991 send_context_err_status_string(flags, sizeof(flags),
5992 status));
5993
5994 if (status & SEND_CTXT_ERR_STATUS_PIO_DISALLOWED_PACKET_ERR_SMASK)
5995 handle_send_egress_err_info(dd, sc_to_vl(dd, sw_index));
5996
5997 /*
5998 * Automatically restart halted kernel contexts out of interrupt
5999 * context. User contexts must ask the driver to restart the context.
6000 */
6001 if (sc->type != SC_USER)
6002 queue_work(dd->pport->hfi1_wq, &sc->halt_work);
6003 spin_unlock_irqrestore(&dd->sc_lock, irq_flags);
6004
6005 /*
6006 * Update the counters for the corresponding status bits.
6007 * Note that these particular counters are aggregated over all
6008 * 160 contexts.
6009 */
6010 for (i = 0; i < NUM_SEND_CTXT_ERR_STATUS_COUNTERS; i++) {
6011 if (status & (1ull << i))
6012 incr_cntr64(&dd->sw_ctxt_err_status_cnt[i]);
6013 }
6014 }
6015
handle_sdma_eng_err(struct hfi1_devdata * dd,unsigned int source,u64 status)6016 static void handle_sdma_eng_err(struct hfi1_devdata *dd,
6017 unsigned int source, u64 status)
6018 {
6019 struct sdma_engine *sde;
6020 int i = 0;
6021
6022 sde = &dd->per_sdma[source];
6023 #ifdef CONFIG_SDMA_VERBOSITY
6024 dd_dev_err(sde->dd, "CONFIG SDMA(%u) %s:%d %s()\n", sde->this_idx,
6025 slashstrip(__FILE__), __LINE__, __func__);
6026 dd_dev_err(sde->dd, "CONFIG SDMA(%u) source: %u status 0x%llx\n",
6027 sde->this_idx, source, (unsigned long long)status);
6028 #endif
6029 sde->err_cnt++;
6030 sdma_engine_error(sde, status);
6031
6032 /*
6033 * Update the counters for the corresponding status bits.
6034 * Note that these particular counters are aggregated over
6035 * all 16 DMA engines.
6036 */
6037 for (i = 0; i < NUM_SEND_DMA_ENG_ERR_STATUS_COUNTERS; i++) {
6038 if (status & (1ull << i))
6039 incr_cntr64(&dd->sw_send_dma_eng_err_status_cnt[i]);
6040 }
6041 }
6042
6043 /*
6044 * CCE block SDMA error interrupt. Source is < 16.
6045 */
is_sdma_eng_err_int(struct hfi1_devdata * dd,unsigned int source)6046 static void is_sdma_eng_err_int(struct hfi1_devdata *dd, unsigned int source)
6047 {
6048 #ifdef CONFIG_SDMA_VERBOSITY
6049 struct sdma_engine *sde = &dd->per_sdma[source];
6050
6051 dd_dev_err(dd, "CONFIG SDMA(%u) %s:%d %s()\n", sde->this_idx,
6052 slashstrip(__FILE__), __LINE__, __func__);
6053 dd_dev_err(dd, "CONFIG SDMA(%u) source: %u\n", sde->this_idx,
6054 source);
6055 sdma_dumpstate(sde);
6056 #endif
6057 interrupt_clear_down(dd, source, &sdma_eng_err);
6058 }
6059
6060 /*
6061 * CCE block "various" interrupt. Source is < 8.
6062 */
is_various_int(struct hfi1_devdata * dd,unsigned int source)6063 static void is_various_int(struct hfi1_devdata *dd, unsigned int source)
6064 {
6065 const struct err_reg_info *eri = &various_err[source];
6066
6067 /*
6068 * TCritInt cannot go through interrupt_clear_down()
6069 * because it is not a second tier interrupt. The handler
6070 * should be called directly.
6071 */
6072 if (source == TCRIT_INT_SOURCE)
6073 handle_temp_err(dd);
6074 else if (eri->handler)
6075 interrupt_clear_down(dd, 0, eri);
6076 else
6077 dd_dev_info(dd,
6078 "%s: Unimplemented/reserved interrupt %d\n",
6079 __func__, source);
6080 }
6081
handle_qsfp_int(struct hfi1_devdata * dd,u32 src_ctx,u64 reg)6082 static void handle_qsfp_int(struct hfi1_devdata *dd, u32 src_ctx, u64 reg)
6083 {
6084 /* src_ctx is always zero */
6085 struct hfi1_pportdata *ppd = dd->pport;
6086 unsigned long flags;
6087 u64 qsfp_int_mgmt = (u64)(QSFP_HFI0_INT_N | QSFP_HFI0_MODPRST_N);
6088
6089 if (reg & QSFP_HFI0_MODPRST_N) {
6090 if (!qsfp_mod_present(ppd)) {
6091 dd_dev_info(dd, "%s: QSFP module removed\n",
6092 __func__);
6093
6094 ppd->driver_link_ready = 0;
6095 /*
6096 * Cable removed, reset all our information about the
6097 * cache and cable capabilities
6098 */
6099
6100 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
6101 /*
6102 * We don't set cache_refresh_required here as we expect
6103 * an interrupt when a cable is inserted
6104 */
6105 ppd->qsfp_info.cache_valid = 0;
6106 ppd->qsfp_info.reset_needed = 0;
6107 ppd->qsfp_info.limiting_active = 0;
6108 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
6109 flags);
6110 /* Invert the ModPresent pin now to detect plug-in */
6111 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_INVERT :
6112 ASIC_QSFP1_INVERT, qsfp_int_mgmt);
6113
6114 if ((ppd->offline_disabled_reason >
6115 HFI1_ODR_MASK(
6116 OPA_LINKDOWN_REASON_LOCAL_MEDIA_NOT_INSTALLED)) ||
6117 (ppd->offline_disabled_reason ==
6118 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE)))
6119 ppd->offline_disabled_reason =
6120 HFI1_ODR_MASK(
6121 OPA_LINKDOWN_REASON_LOCAL_MEDIA_NOT_INSTALLED);
6122
6123 if (ppd->host_link_state == HLS_DN_POLL) {
6124 /*
6125 * The link is still in POLL. This means
6126 * that the normal link down processing
6127 * will not happen. We have to do it here
6128 * before turning the DC off.
6129 */
6130 queue_work(ppd->link_wq, &ppd->link_down_work);
6131 }
6132 } else {
6133 dd_dev_info(dd, "%s: QSFP module inserted\n",
6134 __func__);
6135
6136 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
6137 ppd->qsfp_info.cache_valid = 0;
6138 ppd->qsfp_info.cache_refresh_required = 1;
6139 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
6140 flags);
6141
6142 /*
6143 * Stop inversion of ModPresent pin to detect
6144 * removal of the cable
6145 */
6146 qsfp_int_mgmt &= ~(u64)QSFP_HFI0_MODPRST_N;
6147 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_INVERT :
6148 ASIC_QSFP1_INVERT, qsfp_int_mgmt);
6149
6150 ppd->offline_disabled_reason =
6151 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_TRANSIENT);
6152 }
6153 }
6154
6155 if (reg & QSFP_HFI0_INT_N) {
6156 dd_dev_info(dd, "%s: Interrupt received from QSFP module\n",
6157 __func__);
6158 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
6159 ppd->qsfp_info.check_interrupt_flags = 1;
6160 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags);
6161 }
6162
6163 /* Schedule the QSFP work only if there is a cable attached. */
6164 if (qsfp_mod_present(ppd))
6165 queue_work(ppd->link_wq, &ppd->qsfp_info.qsfp_work);
6166 }
6167
request_host_lcb_access(struct hfi1_devdata * dd)6168 static int request_host_lcb_access(struct hfi1_devdata *dd)
6169 {
6170 int ret;
6171
6172 ret = do_8051_command(dd, HCMD_MISC,
6173 (u64)HCMD_MISC_REQUEST_LCB_ACCESS <<
6174 LOAD_DATA_FIELD_ID_SHIFT, NULL);
6175 if (ret != HCMD_SUCCESS) {
6176 dd_dev_err(dd, "%s: command failed with error %d\n",
6177 __func__, ret);
6178 }
6179 return ret == HCMD_SUCCESS ? 0 : -EBUSY;
6180 }
6181
request_8051_lcb_access(struct hfi1_devdata * dd)6182 static int request_8051_lcb_access(struct hfi1_devdata *dd)
6183 {
6184 int ret;
6185
6186 ret = do_8051_command(dd, HCMD_MISC,
6187 (u64)HCMD_MISC_GRANT_LCB_ACCESS <<
6188 LOAD_DATA_FIELD_ID_SHIFT, NULL);
6189 if (ret != HCMD_SUCCESS) {
6190 dd_dev_err(dd, "%s: command failed with error %d\n",
6191 __func__, ret);
6192 }
6193 return ret == HCMD_SUCCESS ? 0 : -EBUSY;
6194 }
6195
6196 /*
6197 * Set the LCB selector - allow host access. The DCC selector always
6198 * points to the host.
6199 */
set_host_lcb_access(struct hfi1_devdata * dd)6200 static inline void set_host_lcb_access(struct hfi1_devdata *dd)
6201 {
6202 write_csr(dd, DC_DC8051_CFG_CSR_ACCESS_SEL,
6203 DC_DC8051_CFG_CSR_ACCESS_SEL_DCC_SMASK |
6204 DC_DC8051_CFG_CSR_ACCESS_SEL_LCB_SMASK);
6205 }
6206
6207 /*
6208 * Clear the LCB selector - allow 8051 access. The DCC selector always
6209 * points to the host.
6210 */
set_8051_lcb_access(struct hfi1_devdata * dd)6211 static inline void set_8051_lcb_access(struct hfi1_devdata *dd)
6212 {
6213 write_csr(dd, DC_DC8051_CFG_CSR_ACCESS_SEL,
6214 DC_DC8051_CFG_CSR_ACCESS_SEL_DCC_SMASK);
6215 }
6216
6217 /*
6218 * Acquire LCB access from the 8051. If the host already has access,
6219 * just increment a counter. Otherwise, inform the 8051 that the
6220 * host is taking access.
6221 *
6222 * Returns:
6223 * 0 on success
6224 * -EBUSY if the 8051 has control and cannot be disturbed
6225 * -errno if unable to acquire access from the 8051
6226 */
acquire_lcb_access(struct hfi1_devdata * dd,int sleep_ok)6227 int acquire_lcb_access(struct hfi1_devdata *dd, int sleep_ok)
6228 {
6229 struct hfi1_pportdata *ppd = dd->pport;
6230 int ret = 0;
6231
6232 /*
6233 * Use the host link state lock so the operation of this routine
6234 * { link state check, selector change, count increment } can occur
6235 * as a unit against a link state change. Otherwise there is a
6236 * race between the state change and the count increment.
6237 */
6238 if (sleep_ok) {
6239 mutex_lock(&ppd->hls_lock);
6240 } else {
6241 while (!mutex_trylock(&ppd->hls_lock))
6242 udelay(1);
6243 }
6244
6245 /* this access is valid only when the link is up */
6246 if (ppd->host_link_state & HLS_DOWN) {
6247 dd_dev_info(dd, "%s: link state %s not up\n",
6248 __func__, link_state_name(ppd->host_link_state));
6249 ret = -EBUSY;
6250 goto done;
6251 }
6252
6253 if (dd->lcb_access_count == 0) {
6254 ret = request_host_lcb_access(dd);
6255 if (ret) {
6256 dd_dev_err(dd,
6257 "%s: unable to acquire LCB access, err %d\n",
6258 __func__, ret);
6259 goto done;
6260 }
6261 set_host_lcb_access(dd);
6262 }
6263 dd->lcb_access_count++;
6264 done:
6265 mutex_unlock(&ppd->hls_lock);
6266 return ret;
6267 }
6268
6269 /*
6270 * Release LCB access by decrementing the use count. If the count is moving
6271 * from 1 to 0, inform 8051 that it has control back.
6272 *
6273 * Returns:
6274 * 0 on success
6275 * -errno if unable to release access to the 8051
6276 */
release_lcb_access(struct hfi1_devdata * dd,int sleep_ok)6277 int release_lcb_access(struct hfi1_devdata *dd, int sleep_ok)
6278 {
6279 int ret = 0;
6280
6281 /*
6282 * Use the host link state lock because the acquire needed it.
6283 * Here, we only need to keep { selector change, count decrement }
6284 * as a unit.
6285 */
6286 if (sleep_ok) {
6287 mutex_lock(&dd->pport->hls_lock);
6288 } else {
6289 while (!mutex_trylock(&dd->pport->hls_lock))
6290 udelay(1);
6291 }
6292
6293 if (dd->lcb_access_count == 0) {
6294 dd_dev_err(dd, "%s: LCB access count is zero. Skipping.\n",
6295 __func__);
6296 goto done;
6297 }
6298
6299 if (dd->lcb_access_count == 1) {
6300 set_8051_lcb_access(dd);
6301 ret = request_8051_lcb_access(dd);
6302 if (ret) {
6303 dd_dev_err(dd,
6304 "%s: unable to release LCB access, err %d\n",
6305 __func__, ret);
6306 /* restore host access if the grant didn't work */
6307 set_host_lcb_access(dd);
6308 goto done;
6309 }
6310 }
6311 dd->lcb_access_count--;
6312 done:
6313 mutex_unlock(&dd->pport->hls_lock);
6314 return ret;
6315 }
6316
6317 /*
6318 * Initialize LCB access variables and state. Called during driver load,
6319 * after most of the initialization is finished.
6320 *
6321 * The DC default is LCB access on for the host. The driver defaults to
6322 * leaving access to the 8051. Assign access now - this constrains the call
6323 * to this routine to be after all LCB set-up is done. In particular, after
6324 * hf1_init_dd() -> set_up_interrupts() -> clear_all_interrupts()
6325 */
init_lcb_access(struct hfi1_devdata * dd)6326 static void init_lcb_access(struct hfi1_devdata *dd)
6327 {
6328 dd->lcb_access_count = 0;
6329 }
6330
6331 /*
6332 * Write a response back to a 8051 request.
6333 */
hreq_response(struct hfi1_devdata * dd,u8 return_code,u16 rsp_data)6334 static void hreq_response(struct hfi1_devdata *dd, u8 return_code, u16 rsp_data)
6335 {
6336 write_csr(dd, DC_DC8051_CFG_EXT_DEV_0,
6337 DC_DC8051_CFG_EXT_DEV_0_COMPLETED_SMASK |
6338 (u64)return_code <<
6339 DC_DC8051_CFG_EXT_DEV_0_RETURN_CODE_SHIFT |
6340 (u64)rsp_data << DC_DC8051_CFG_EXT_DEV_0_RSP_DATA_SHIFT);
6341 }
6342
6343 /*
6344 * Handle host requests from the 8051.
6345 */
handle_8051_request(struct hfi1_pportdata * ppd)6346 static void handle_8051_request(struct hfi1_pportdata *ppd)
6347 {
6348 struct hfi1_devdata *dd = ppd->dd;
6349 u64 reg;
6350 u16 data = 0;
6351 u8 type;
6352
6353 reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_1);
6354 if ((reg & DC_DC8051_CFG_EXT_DEV_1_REQ_NEW_SMASK) == 0)
6355 return; /* no request */
6356
6357 /* zero out COMPLETED so the response is seen */
6358 write_csr(dd, DC_DC8051_CFG_EXT_DEV_0, 0);
6359
6360 /* extract request details */
6361 type = (reg >> DC_DC8051_CFG_EXT_DEV_1_REQ_TYPE_SHIFT)
6362 & DC_DC8051_CFG_EXT_DEV_1_REQ_TYPE_MASK;
6363 data = (reg >> DC_DC8051_CFG_EXT_DEV_1_REQ_DATA_SHIFT)
6364 & DC_DC8051_CFG_EXT_DEV_1_REQ_DATA_MASK;
6365
6366 switch (type) {
6367 case HREQ_LOAD_CONFIG:
6368 case HREQ_SAVE_CONFIG:
6369 case HREQ_READ_CONFIG:
6370 case HREQ_SET_TX_EQ_ABS:
6371 case HREQ_SET_TX_EQ_REL:
6372 case HREQ_ENABLE:
6373 dd_dev_info(dd, "8051 request: request 0x%x not supported\n",
6374 type);
6375 hreq_response(dd, HREQ_NOT_SUPPORTED, 0);
6376 break;
6377 case HREQ_LCB_RESET:
6378 /* Put the LCB, RX FPE and TX FPE into reset */
6379 write_csr(dd, DCC_CFG_RESET, LCB_RX_FPE_TX_FPE_INTO_RESET);
6380 /* Make sure the write completed */
6381 (void)read_csr(dd, DCC_CFG_RESET);
6382 /* Hold the reset long enough to take effect */
6383 udelay(1);
6384 /* Take the LCB, RX FPE and TX FPE out of reset */
6385 write_csr(dd, DCC_CFG_RESET, LCB_RX_FPE_TX_FPE_OUT_OF_RESET);
6386 hreq_response(dd, HREQ_SUCCESS, 0);
6387
6388 break;
6389 case HREQ_CONFIG_DONE:
6390 hreq_response(dd, HREQ_SUCCESS, 0);
6391 break;
6392
6393 case HREQ_INTERFACE_TEST:
6394 hreq_response(dd, HREQ_SUCCESS, data);
6395 break;
6396 default:
6397 dd_dev_err(dd, "8051 request: unknown request 0x%x\n", type);
6398 hreq_response(dd, HREQ_NOT_SUPPORTED, 0);
6399 break;
6400 }
6401 }
6402
6403 /*
6404 * Set up allocation unit vaulue.
6405 */
set_up_vau(struct hfi1_devdata * dd,u8 vau)6406 void set_up_vau(struct hfi1_devdata *dd, u8 vau)
6407 {
6408 u64 reg = read_csr(dd, SEND_CM_GLOBAL_CREDIT);
6409
6410 /* do not modify other values in the register */
6411 reg &= ~SEND_CM_GLOBAL_CREDIT_AU_SMASK;
6412 reg |= (u64)vau << SEND_CM_GLOBAL_CREDIT_AU_SHIFT;
6413 write_csr(dd, SEND_CM_GLOBAL_CREDIT, reg);
6414 }
6415
6416 /*
6417 * Set up initial VL15 credits of the remote. Assumes the rest of
6418 * the CM credit registers are zero from a previous global or credit reset.
6419 * Shared limit for VL15 will always be 0.
6420 */
set_up_vl15(struct hfi1_devdata * dd,u16 vl15buf)6421 void set_up_vl15(struct hfi1_devdata *dd, u16 vl15buf)
6422 {
6423 u64 reg = read_csr(dd, SEND_CM_GLOBAL_CREDIT);
6424
6425 /* set initial values for total and shared credit limit */
6426 reg &= ~(SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_SMASK |
6427 SEND_CM_GLOBAL_CREDIT_SHARED_LIMIT_SMASK);
6428
6429 /*
6430 * Set total limit to be equal to VL15 credits.
6431 * Leave shared limit at 0.
6432 */
6433 reg |= (u64)vl15buf << SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_SHIFT;
6434 write_csr(dd, SEND_CM_GLOBAL_CREDIT, reg);
6435
6436 write_csr(dd, SEND_CM_CREDIT_VL15, (u64)vl15buf
6437 << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
6438 }
6439
6440 /*
6441 * Zero all credit details from the previous connection and
6442 * reset the CM manager's internal counters.
6443 */
reset_link_credits(struct hfi1_devdata * dd)6444 void reset_link_credits(struct hfi1_devdata *dd)
6445 {
6446 int i;
6447
6448 /* remove all previous VL credit limits */
6449 for (i = 0; i < TXE_NUM_DATA_VL; i++)
6450 write_csr(dd, SEND_CM_CREDIT_VL + (8 * i), 0);
6451 write_csr(dd, SEND_CM_CREDIT_VL15, 0);
6452 write_csr(dd, SEND_CM_GLOBAL_CREDIT, 0);
6453 /* reset the CM block */
6454 pio_send_control(dd, PSC_CM_RESET);
6455 /* reset cached value */
6456 dd->vl15buf_cached = 0;
6457 }
6458
6459 /* convert a vCU to a CU */
vcu_to_cu(u8 vcu)6460 static u32 vcu_to_cu(u8 vcu)
6461 {
6462 return 1 << vcu;
6463 }
6464
6465 /* convert a CU to a vCU */
cu_to_vcu(u32 cu)6466 static u8 cu_to_vcu(u32 cu)
6467 {
6468 return ilog2(cu);
6469 }
6470
6471 /* convert a vAU to an AU */
vau_to_au(u8 vau)6472 static u32 vau_to_au(u8 vau)
6473 {
6474 return 8 * (1 << vau);
6475 }
6476
set_linkup_defaults(struct hfi1_pportdata * ppd)6477 static void set_linkup_defaults(struct hfi1_pportdata *ppd)
6478 {
6479 ppd->sm_trap_qp = 0x0;
6480 ppd->sa_qp = 0x1;
6481 }
6482
6483 /*
6484 * Graceful LCB shutdown. This leaves the LCB FIFOs in reset.
6485 */
lcb_shutdown(struct hfi1_devdata * dd,int abort)6486 static void lcb_shutdown(struct hfi1_devdata *dd, int abort)
6487 {
6488 u64 reg;
6489
6490 /* clear lcb run: LCB_CFG_RUN.EN = 0 */
6491 write_csr(dd, DC_LCB_CFG_RUN, 0);
6492 /* set tx fifo reset: LCB_CFG_TX_FIFOS_RESET.VAL = 1 */
6493 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET,
6494 1ull << DC_LCB_CFG_TX_FIFOS_RESET_VAL_SHIFT);
6495 /* set dcc reset csr: DCC_CFG_RESET.{reset_lcb,reset_rx_fpe} = 1 */
6496 dd->lcb_err_en = read_csr(dd, DC_LCB_ERR_EN);
6497 reg = read_csr(dd, DCC_CFG_RESET);
6498 write_csr(dd, DCC_CFG_RESET, reg |
6499 DCC_CFG_RESET_RESET_LCB | DCC_CFG_RESET_RESET_RX_FPE);
6500 (void)read_csr(dd, DCC_CFG_RESET); /* make sure the write completed */
6501 if (!abort) {
6502 udelay(1); /* must hold for the longer of 16cclks or 20ns */
6503 write_csr(dd, DCC_CFG_RESET, reg);
6504 write_csr(dd, DC_LCB_ERR_EN, dd->lcb_err_en);
6505 }
6506 }
6507
6508 /*
6509 * This routine should be called after the link has been transitioned to
6510 * OFFLINE (OFFLINE state has the side effect of putting the SerDes into
6511 * reset).
6512 *
6513 * The expectation is that the caller of this routine would have taken
6514 * care of properly transitioning the link into the correct state.
6515 * NOTE: the caller needs to acquire the dd->dc8051_lock lock
6516 * before calling this function.
6517 */
_dc_shutdown(struct hfi1_devdata * dd)6518 static void _dc_shutdown(struct hfi1_devdata *dd)
6519 {
6520 lockdep_assert_held(&dd->dc8051_lock);
6521
6522 if (dd->dc_shutdown)
6523 return;
6524
6525 dd->dc_shutdown = 1;
6526 /* Shutdown the LCB */
6527 lcb_shutdown(dd, 1);
6528 /*
6529 * Going to OFFLINE would have causes the 8051 to put the
6530 * SerDes into reset already. Just need to shut down the 8051,
6531 * itself.
6532 */
6533 write_csr(dd, DC_DC8051_CFG_RST, 0x1);
6534 }
6535
dc_shutdown(struct hfi1_devdata * dd)6536 static void dc_shutdown(struct hfi1_devdata *dd)
6537 {
6538 mutex_lock(&dd->dc8051_lock);
6539 _dc_shutdown(dd);
6540 mutex_unlock(&dd->dc8051_lock);
6541 }
6542
6543 /*
6544 * Calling this after the DC has been brought out of reset should not
6545 * do any damage.
6546 * NOTE: the caller needs to acquire the dd->dc8051_lock lock
6547 * before calling this function.
6548 */
_dc_start(struct hfi1_devdata * dd)6549 static void _dc_start(struct hfi1_devdata *dd)
6550 {
6551 lockdep_assert_held(&dd->dc8051_lock);
6552
6553 if (!dd->dc_shutdown)
6554 return;
6555
6556 /* Take the 8051 out of reset */
6557 write_csr(dd, DC_DC8051_CFG_RST, 0ull);
6558 /* Wait until 8051 is ready */
6559 if (wait_fm_ready(dd, TIMEOUT_8051_START))
6560 dd_dev_err(dd, "%s: timeout starting 8051 firmware\n",
6561 __func__);
6562
6563 /* Take away reset for LCB and RX FPE (set in lcb_shutdown). */
6564 write_csr(dd, DCC_CFG_RESET, LCB_RX_FPE_TX_FPE_OUT_OF_RESET);
6565 /* lcb_shutdown() with abort=1 does not restore these */
6566 write_csr(dd, DC_LCB_ERR_EN, dd->lcb_err_en);
6567 dd->dc_shutdown = 0;
6568 }
6569
dc_start(struct hfi1_devdata * dd)6570 static void dc_start(struct hfi1_devdata *dd)
6571 {
6572 mutex_lock(&dd->dc8051_lock);
6573 _dc_start(dd);
6574 mutex_unlock(&dd->dc8051_lock);
6575 }
6576
6577 /*
6578 * These LCB adjustments are for the Aurora SerDes core in the FPGA.
6579 */
adjust_lcb_for_fpga_serdes(struct hfi1_devdata * dd)6580 static void adjust_lcb_for_fpga_serdes(struct hfi1_devdata *dd)
6581 {
6582 u64 rx_radr, tx_radr;
6583 u32 version;
6584
6585 if (dd->icode != ICODE_FPGA_EMULATION)
6586 return;
6587
6588 /*
6589 * These LCB defaults on emulator _s are good, nothing to do here:
6590 * LCB_CFG_TX_FIFOS_RADR
6591 * LCB_CFG_RX_FIFOS_RADR
6592 * LCB_CFG_LN_DCLK
6593 * LCB_CFG_IGNORE_LOST_RCLK
6594 */
6595 if (is_emulator_s(dd))
6596 return;
6597 /* else this is _p */
6598
6599 version = emulator_rev(dd);
6600 if (!is_ax(dd))
6601 version = 0x2d; /* all B0 use 0x2d or higher settings */
6602
6603 if (version <= 0x12) {
6604 /* release 0x12 and below */
6605
6606 /*
6607 * LCB_CFG_RX_FIFOS_RADR.RST_VAL = 0x9
6608 * LCB_CFG_RX_FIFOS_RADR.OK_TO_JUMP_VAL = 0x9
6609 * LCB_CFG_RX_FIFOS_RADR.DO_NOT_JUMP_VAL = 0xa
6610 */
6611 rx_radr =
6612 0xaull << DC_LCB_CFG_RX_FIFOS_RADR_DO_NOT_JUMP_VAL_SHIFT
6613 | 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_OK_TO_JUMP_VAL_SHIFT
6614 | 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_RST_VAL_SHIFT;
6615 /*
6616 * LCB_CFG_TX_FIFOS_RADR.ON_REINIT = 0 (default)
6617 * LCB_CFG_TX_FIFOS_RADR.RST_VAL = 6
6618 */
6619 tx_radr = 6ull << DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT;
6620 } else if (version <= 0x18) {
6621 /* release 0x13 up to 0x18 */
6622 /* LCB_CFG_RX_FIFOS_RADR = 0x988 */
6623 rx_radr =
6624 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_DO_NOT_JUMP_VAL_SHIFT
6625 | 0x8ull << DC_LCB_CFG_RX_FIFOS_RADR_OK_TO_JUMP_VAL_SHIFT
6626 | 0x8ull << DC_LCB_CFG_RX_FIFOS_RADR_RST_VAL_SHIFT;
6627 tx_radr = 7ull << DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT;
6628 } else if (version == 0x19) {
6629 /* release 0x19 */
6630 /* LCB_CFG_RX_FIFOS_RADR = 0xa99 */
6631 rx_radr =
6632 0xAull << DC_LCB_CFG_RX_FIFOS_RADR_DO_NOT_JUMP_VAL_SHIFT
6633 | 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_OK_TO_JUMP_VAL_SHIFT
6634 | 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_RST_VAL_SHIFT;
6635 tx_radr = 3ull << DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT;
6636 } else if (version == 0x1a) {
6637 /* release 0x1a */
6638 /* LCB_CFG_RX_FIFOS_RADR = 0x988 */
6639 rx_radr =
6640 0x9ull << DC_LCB_CFG_RX_FIFOS_RADR_DO_NOT_JUMP_VAL_SHIFT
6641 | 0x8ull << DC_LCB_CFG_RX_FIFOS_RADR_OK_TO_JUMP_VAL_SHIFT
6642 | 0x8ull << DC_LCB_CFG_RX_FIFOS_RADR_RST_VAL_SHIFT;
6643 tx_radr = 7ull << DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT;
6644 write_csr(dd, DC_LCB_CFG_LN_DCLK, 1ull);
6645 } else {
6646 /* release 0x1b and higher */
6647 /* LCB_CFG_RX_FIFOS_RADR = 0x877 */
6648 rx_radr =
6649 0x8ull << DC_LCB_CFG_RX_FIFOS_RADR_DO_NOT_JUMP_VAL_SHIFT
6650 | 0x7ull << DC_LCB_CFG_RX_FIFOS_RADR_OK_TO_JUMP_VAL_SHIFT
6651 | 0x7ull << DC_LCB_CFG_RX_FIFOS_RADR_RST_VAL_SHIFT;
6652 tx_radr = 3ull << DC_LCB_CFG_TX_FIFOS_RADR_RST_VAL_SHIFT;
6653 }
6654
6655 write_csr(dd, DC_LCB_CFG_RX_FIFOS_RADR, rx_radr);
6656 /* LCB_CFG_IGNORE_LOST_RCLK.EN = 1 */
6657 write_csr(dd, DC_LCB_CFG_IGNORE_LOST_RCLK,
6658 DC_LCB_CFG_IGNORE_LOST_RCLK_EN_SMASK);
6659 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RADR, tx_radr);
6660 }
6661
6662 /*
6663 * Handle a SMA idle message
6664 *
6665 * This is a work-queue function outside of the interrupt.
6666 */
handle_sma_message(struct work_struct * work)6667 void handle_sma_message(struct work_struct *work)
6668 {
6669 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
6670 sma_message_work);
6671 struct hfi1_devdata *dd = ppd->dd;
6672 u64 msg;
6673 int ret;
6674
6675 /*
6676 * msg is bytes 1-4 of the 40-bit idle message - the command code
6677 * is stripped off
6678 */
6679 ret = read_idle_sma(dd, &msg);
6680 if (ret)
6681 return;
6682 dd_dev_info(dd, "%s: SMA message 0x%llx\n", __func__, msg);
6683 /*
6684 * React to the SMA message. Byte[1] (0 for us) is the command.
6685 */
6686 switch (msg & 0xff) {
6687 case SMA_IDLE_ARM:
6688 /*
6689 * See OPAv1 table 9-14 - HFI and External Switch Ports Key
6690 * State Transitions
6691 *
6692 * Only expected in INIT or ARMED, discard otherwise.
6693 */
6694 if (ppd->host_link_state & (HLS_UP_INIT | HLS_UP_ARMED))
6695 ppd->neighbor_normal = 1;
6696 break;
6697 case SMA_IDLE_ACTIVE:
6698 /*
6699 * See OPAv1 table 9-14 - HFI and External Switch Ports Key
6700 * State Transitions
6701 *
6702 * Can activate the node. Discard otherwise.
6703 */
6704 if (ppd->host_link_state == HLS_UP_ARMED &&
6705 ppd->is_active_optimize_enabled) {
6706 ppd->neighbor_normal = 1;
6707 ret = set_link_state(ppd, HLS_UP_ACTIVE);
6708 if (ret)
6709 dd_dev_err(
6710 dd,
6711 "%s: received Active SMA idle message, couldn't set link to Active\n",
6712 __func__);
6713 }
6714 break;
6715 default:
6716 dd_dev_err(dd,
6717 "%s: received unexpected SMA idle message 0x%llx\n",
6718 __func__, msg);
6719 break;
6720 }
6721 }
6722
adjust_rcvctrl(struct hfi1_devdata * dd,u64 add,u64 clear)6723 static void adjust_rcvctrl(struct hfi1_devdata *dd, u64 add, u64 clear)
6724 {
6725 u64 rcvctrl;
6726 unsigned long flags;
6727
6728 spin_lock_irqsave(&dd->rcvctrl_lock, flags);
6729 rcvctrl = read_csr(dd, RCV_CTRL);
6730 rcvctrl |= add;
6731 rcvctrl &= ~clear;
6732 write_csr(dd, RCV_CTRL, rcvctrl);
6733 spin_unlock_irqrestore(&dd->rcvctrl_lock, flags);
6734 }
6735
add_rcvctrl(struct hfi1_devdata * dd,u64 add)6736 static inline void add_rcvctrl(struct hfi1_devdata *dd, u64 add)
6737 {
6738 adjust_rcvctrl(dd, add, 0);
6739 }
6740
clear_rcvctrl(struct hfi1_devdata * dd,u64 clear)6741 static inline void clear_rcvctrl(struct hfi1_devdata *dd, u64 clear)
6742 {
6743 adjust_rcvctrl(dd, 0, clear);
6744 }
6745
6746 /*
6747 * Called from all interrupt handlers to start handling an SPC freeze.
6748 */
start_freeze_handling(struct hfi1_pportdata * ppd,int flags)6749 void start_freeze_handling(struct hfi1_pportdata *ppd, int flags)
6750 {
6751 struct hfi1_devdata *dd = ppd->dd;
6752 struct send_context *sc;
6753 int i;
6754 int sc_flags;
6755
6756 if (flags & FREEZE_SELF)
6757 write_csr(dd, CCE_CTRL, CCE_CTRL_SPC_FREEZE_SMASK);
6758
6759 /* enter frozen mode */
6760 dd->flags |= HFI1_FROZEN;
6761
6762 /* notify all SDMA engines that they are going into a freeze */
6763 sdma_freeze_notify(dd, !!(flags & FREEZE_LINK_DOWN));
6764
6765 sc_flags = SCF_FROZEN | SCF_HALTED | (flags & FREEZE_LINK_DOWN ?
6766 SCF_LINK_DOWN : 0);
6767 /* do halt pre-handling on all enabled send contexts */
6768 for (i = 0; i < dd->num_send_contexts; i++) {
6769 sc = dd->send_contexts[i].sc;
6770 if (sc && (sc->flags & SCF_ENABLED))
6771 sc_stop(sc, sc_flags);
6772 }
6773
6774 /* Send context are frozen. Notify user space */
6775 hfi1_set_uevent_bits(ppd, _HFI1_EVENT_FROZEN_BIT);
6776
6777 if (flags & FREEZE_ABORT) {
6778 dd_dev_err(dd,
6779 "Aborted freeze recovery. Please REBOOT system\n");
6780 return;
6781 }
6782 /* queue non-interrupt handler */
6783 queue_work(ppd->hfi1_wq, &ppd->freeze_work);
6784 }
6785
6786 /*
6787 * Wait until all 4 sub-blocks indicate that they have frozen or unfrozen,
6788 * depending on the "freeze" parameter.
6789 *
6790 * No need to return an error if it times out, our only option
6791 * is to proceed anyway.
6792 */
wait_for_freeze_status(struct hfi1_devdata * dd,int freeze)6793 static void wait_for_freeze_status(struct hfi1_devdata *dd, int freeze)
6794 {
6795 unsigned long timeout;
6796 u64 reg;
6797
6798 timeout = jiffies + msecs_to_jiffies(FREEZE_STATUS_TIMEOUT);
6799 while (1) {
6800 reg = read_csr(dd, CCE_STATUS);
6801 if (freeze) {
6802 /* waiting until all indicators are set */
6803 if ((reg & ALL_FROZE) == ALL_FROZE)
6804 return; /* all done */
6805 } else {
6806 /* waiting until all indicators are clear */
6807 if ((reg & ALL_FROZE) == 0)
6808 return; /* all done */
6809 }
6810
6811 if (time_after(jiffies, timeout)) {
6812 dd_dev_err(dd,
6813 "Time out waiting for SPC %sfreeze, bits 0x%llx, expecting 0x%llx, continuing",
6814 freeze ? "" : "un", reg & ALL_FROZE,
6815 freeze ? ALL_FROZE : 0ull);
6816 return;
6817 }
6818 usleep_range(80, 120);
6819 }
6820 }
6821
6822 /*
6823 * Do all freeze handling for the RXE block.
6824 */
rxe_freeze(struct hfi1_devdata * dd)6825 static void rxe_freeze(struct hfi1_devdata *dd)
6826 {
6827 int i;
6828 struct hfi1_ctxtdata *rcd;
6829
6830 /* disable port */
6831 clear_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
6832
6833 /* disable all receive contexts */
6834 for (i = 0; i < dd->num_rcv_contexts; i++) {
6835 rcd = hfi1_rcd_get_by_index(dd, i);
6836 hfi1_rcvctrl(dd, HFI1_RCVCTRL_CTXT_DIS, rcd);
6837 hfi1_rcd_put(rcd);
6838 }
6839 }
6840
6841 /*
6842 * Unfreeze handling for the RXE block - kernel contexts only.
6843 * This will also enable the port. User contexts will do unfreeze
6844 * handling on a per-context basis as they call into the driver.
6845 *
6846 */
rxe_kernel_unfreeze(struct hfi1_devdata * dd)6847 static void rxe_kernel_unfreeze(struct hfi1_devdata *dd)
6848 {
6849 u32 rcvmask;
6850 u16 i;
6851 struct hfi1_ctxtdata *rcd;
6852
6853 /* enable all kernel contexts */
6854 for (i = 0; i < dd->num_rcv_contexts; i++) {
6855 rcd = hfi1_rcd_get_by_index(dd, i);
6856
6857 /* Ensure all non-user contexts(including vnic) are enabled */
6858 if (!rcd ||
6859 (i >= dd->first_dyn_alloc_ctxt && !rcd->is_vnic)) {
6860 hfi1_rcd_put(rcd);
6861 continue;
6862 }
6863 rcvmask = HFI1_RCVCTRL_CTXT_ENB;
6864 /* HFI1_RCVCTRL_TAILUPD_[ENB|DIS] needs to be set explicitly */
6865 rcvmask |= rcd->rcvhdrtail_kvaddr ?
6866 HFI1_RCVCTRL_TAILUPD_ENB : HFI1_RCVCTRL_TAILUPD_DIS;
6867 hfi1_rcvctrl(dd, rcvmask, rcd);
6868 hfi1_rcd_put(rcd);
6869 }
6870
6871 /* enable port */
6872 add_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
6873 }
6874
6875 /*
6876 * Non-interrupt SPC freeze handling.
6877 *
6878 * This is a work-queue function outside of the triggering interrupt.
6879 */
handle_freeze(struct work_struct * work)6880 void handle_freeze(struct work_struct *work)
6881 {
6882 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
6883 freeze_work);
6884 struct hfi1_devdata *dd = ppd->dd;
6885
6886 /* wait for freeze indicators on all affected blocks */
6887 wait_for_freeze_status(dd, 1);
6888
6889 /* SPC is now frozen */
6890
6891 /* do send PIO freeze steps */
6892 pio_freeze(dd);
6893
6894 /* do send DMA freeze steps */
6895 sdma_freeze(dd);
6896
6897 /* do send egress freeze steps - nothing to do */
6898
6899 /* do receive freeze steps */
6900 rxe_freeze(dd);
6901
6902 /*
6903 * Unfreeze the hardware - clear the freeze, wait for each
6904 * block's frozen bit to clear, then clear the frozen flag.
6905 */
6906 write_csr(dd, CCE_CTRL, CCE_CTRL_SPC_UNFREEZE_SMASK);
6907 wait_for_freeze_status(dd, 0);
6908
6909 if (is_ax(dd)) {
6910 write_csr(dd, CCE_CTRL, CCE_CTRL_SPC_FREEZE_SMASK);
6911 wait_for_freeze_status(dd, 1);
6912 write_csr(dd, CCE_CTRL, CCE_CTRL_SPC_UNFREEZE_SMASK);
6913 wait_for_freeze_status(dd, 0);
6914 }
6915
6916 /* do send PIO unfreeze steps for kernel contexts */
6917 pio_kernel_unfreeze(dd);
6918
6919 /* do send DMA unfreeze steps */
6920 sdma_unfreeze(dd);
6921
6922 /* do send egress unfreeze steps - nothing to do */
6923
6924 /* do receive unfreeze steps for kernel contexts */
6925 rxe_kernel_unfreeze(dd);
6926
6927 /*
6928 * The unfreeze procedure touches global device registers when
6929 * it disables and re-enables RXE. Mark the device unfrozen
6930 * after all that is done so other parts of the driver waiting
6931 * for the device to unfreeze don't do things out of order.
6932 *
6933 * The above implies that the meaning of HFI1_FROZEN flag is
6934 * "Device has gone into freeze mode and freeze mode handling
6935 * is still in progress."
6936 *
6937 * The flag will be removed when freeze mode processing has
6938 * completed.
6939 */
6940 dd->flags &= ~HFI1_FROZEN;
6941 wake_up(&dd->event_queue);
6942
6943 /* no longer frozen */
6944 }
6945
6946 /**
6947 * update_xmit_counters - update PortXmitWait/PortVlXmitWait
6948 * counters.
6949 * @ppd: info of physical Hfi port
6950 * @link_width: new link width after link up or downgrade
6951 *
6952 * Update the PortXmitWait and PortVlXmitWait counters after
6953 * a link up or downgrade event to reflect a link width change.
6954 */
update_xmit_counters(struct hfi1_pportdata * ppd,u16 link_width)6955 static void update_xmit_counters(struct hfi1_pportdata *ppd, u16 link_width)
6956 {
6957 int i;
6958 u16 tx_width;
6959 u16 link_speed;
6960
6961 tx_width = tx_link_width(link_width);
6962 link_speed = get_link_speed(ppd->link_speed_active);
6963
6964 /*
6965 * There are C_VL_COUNT number of PortVLXmitWait counters.
6966 * Adding 1 to C_VL_COUNT to include the PortXmitWait counter.
6967 */
6968 for (i = 0; i < C_VL_COUNT + 1; i++)
6969 get_xmit_wait_counters(ppd, tx_width, link_speed, i);
6970 }
6971
6972 /*
6973 * Handle a link up interrupt from the 8051.
6974 *
6975 * This is a work-queue function outside of the interrupt.
6976 */
handle_link_up(struct work_struct * work)6977 void handle_link_up(struct work_struct *work)
6978 {
6979 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
6980 link_up_work);
6981 struct hfi1_devdata *dd = ppd->dd;
6982
6983 set_link_state(ppd, HLS_UP_INIT);
6984
6985 /* cache the read of DC_LCB_STS_ROUND_TRIP_LTP_CNT */
6986 read_ltp_rtt(dd);
6987 /*
6988 * OPA specifies that certain counters are cleared on a transition
6989 * to link up, so do that.
6990 */
6991 clear_linkup_counters(dd);
6992 /*
6993 * And (re)set link up default values.
6994 */
6995 set_linkup_defaults(ppd);
6996
6997 /*
6998 * Set VL15 credits. Use cached value from verify cap interrupt.
6999 * In case of quick linkup or simulator, vl15 value will be set by
7000 * handle_linkup_change. VerifyCap interrupt handler will not be
7001 * called in those scenarios.
7002 */
7003 if (!(quick_linkup || dd->icode == ICODE_FUNCTIONAL_SIMULATOR))
7004 set_up_vl15(dd, dd->vl15buf_cached);
7005
7006 /* enforce link speed enabled */
7007 if ((ppd->link_speed_active & ppd->link_speed_enabled) == 0) {
7008 /* oops - current speed is not enabled, bounce */
7009 dd_dev_err(dd,
7010 "Link speed active 0x%x is outside enabled 0x%x, downing link\n",
7011 ppd->link_speed_active, ppd->link_speed_enabled);
7012 set_link_down_reason(ppd, OPA_LINKDOWN_REASON_SPEED_POLICY, 0,
7013 OPA_LINKDOWN_REASON_SPEED_POLICY);
7014 set_link_state(ppd, HLS_DN_OFFLINE);
7015 start_link(ppd);
7016 }
7017 }
7018
7019 /*
7020 * Several pieces of LNI information were cached for SMA in ppd.
7021 * Reset these on link down
7022 */
reset_neighbor_info(struct hfi1_pportdata * ppd)7023 static void reset_neighbor_info(struct hfi1_pportdata *ppd)
7024 {
7025 ppd->neighbor_guid = 0;
7026 ppd->neighbor_port_number = 0;
7027 ppd->neighbor_type = 0;
7028 ppd->neighbor_fm_security = 0;
7029 }
7030
7031 static const char * const link_down_reason_strs[] = {
7032 [OPA_LINKDOWN_REASON_NONE] = "None",
7033 [OPA_LINKDOWN_REASON_RCV_ERROR_0] = "Receive error 0",
7034 [OPA_LINKDOWN_REASON_BAD_PKT_LEN] = "Bad packet length",
7035 [OPA_LINKDOWN_REASON_PKT_TOO_LONG] = "Packet too long",
7036 [OPA_LINKDOWN_REASON_PKT_TOO_SHORT] = "Packet too short",
7037 [OPA_LINKDOWN_REASON_BAD_SLID] = "Bad SLID",
7038 [OPA_LINKDOWN_REASON_BAD_DLID] = "Bad DLID",
7039 [OPA_LINKDOWN_REASON_BAD_L2] = "Bad L2",
7040 [OPA_LINKDOWN_REASON_BAD_SC] = "Bad SC",
7041 [OPA_LINKDOWN_REASON_RCV_ERROR_8] = "Receive error 8",
7042 [OPA_LINKDOWN_REASON_BAD_MID_TAIL] = "Bad mid tail",
7043 [OPA_LINKDOWN_REASON_RCV_ERROR_10] = "Receive error 10",
7044 [OPA_LINKDOWN_REASON_PREEMPT_ERROR] = "Preempt error",
7045 [OPA_LINKDOWN_REASON_PREEMPT_VL15] = "Preempt vl15",
7046 [OPA_LINKDOWN_REASON_BAD_VL_MARKER] = "Bad VL marker",
7047 [OPA_LINKDOWN_REASON_RCV_ERROR_14] = "Receive error 14",
7048 [OPA_LINKDOWN_REASON_RCV_ERROR_15] = "Receive error 15",
7049 [OPA_LINKDOWN_REASON_BAD_HEAD_DIST] = "Bad head distance",
7050 [OPA_LINKDOWN_REASON_BAD_TAIL_DIST] = "Bad tail distance",
7051 [OPA_LINKDOWN_REASON_BAD_CTRL_DIST] = "Bad control distance",
7052 [OPA_LINKDOWN_REASON_BAD_CREDIT_ACK] = "Bad credit ack",
7053 [OPA_LINKDOWN_REASON_UNSUPPORTED_VL_MARKER] = "Unsupported VL marker",
7054 [OPA_LINKDOWN_REASON_BAD_PREEMPT] = "Bad preempt",
7055 [OPA_LINKDOWN_REASON_BAD_CONTROL_FLIT] = "Bad control flit",
7056 [OPA_LINKDOWN_REASON_EXCEED_MULTICAST_LIMIT] = "Exceed multicast limit",
7057 [OPA_LINKDOWN_REASON_RCV_ERROR_24] = "Receive error 24",
7058 [OPA_LINKDOWN_REASON_RCV_ERROR_25] = "Receive error 25",
7059 [OPA_LINKDOWN_REASON_RCV_ERROR_26] = "Receive error 26",
7060 [OPA_LINKDOWN_REASON_RCV_ERROR_27] = "Receive error 27",
7061 [OPA_LINKDOWN_REASON_RCV_ERROR_28] = "Receive error 28",
7062 [OPA_LINKDOWN_REASON_RCV_ERROR_29] = "Receive error 29",
7063 [OPA_LINKDOWN_REASON_RCV_ERROR_30] = "Receive error 30",
7064 [OPA_LINKDOWN_REASON_EXCESSIVE_BUFFER_OVERRUN] =
7065 "Excessive buffer overrun",
7066 [OPA_LINKDOWN_REASON_UNKNOWN] = "Unknown",
7067 [OPA_LINKDOWN_REASON_REBOOT] = "Reboot",
7068 [OPA_LINKDOWN_REASON_NEIGHBOR_UNKNOWN] = "Neighbor unknown",
7069 [OPA_LINKDOWN_REASON_FM_BOUNCE] = "FM bounce",
7070 [OPA_LINKDOWN_REASON_SPEED_POLICY] = "Speed policy",
7071 [OPA_LINKDOWN_REASON_WIDTH_POLICY] = "Width policy",
7072 [OPA_LINKDOWN_REASON_DISCONNECTED] = "Disconnected",
7073 [OPA_LINKDOWN_REASON_LOCAL_MEDIA_NOT_INSTALLED] =
7074 "Local media not installed",
7075 [OPA_LINKDOWN_REASON_NOT_INSTALLED] = "Not installed",
7076 [OPA_LINKDOWN_REASON_CHASSIS_CONFIG] = "Chassis config",
7077 [OPA_LINKDOWN_REASON_END_TO_END_NOT_INSTALLED] =
7078 "End to end not installed",
7079 [OPA_LINKDOWN_REASON_POWER_POLICY] = "Power policy",
7080 [OPA_LINKDOWN_REASON_LINKSPEED_POLICY] = "Link speed policy",
7081 [OPA_LINKDOWN_REASON_LINKWIDTH_POLICY] = "Link width policy",
7082 [OPA_LINKDOWN_REASON_SWITCH_MGMT] = "Switch management",
7083 [OPA_LINKDOWN_REASON_SMA_DISABLED] = "SMA disabled",
7084 [OPA_LINKDOWN_REASON_TRANSIENT] = "Transient"
7085 };
7086
7087 /* return the neighbor link down reason string */
link_down_reason_str(u8 reason)7088 static const char *link_down_reason_str(u8 reason)
7089 {
7090 const char *str = NULL;
7091
7092 if (reason < ARRAY_SIZE(link_down_reason_strs))
7093 str = link_down_reason_strs[reason];
7094 if (!str)
7095 str = "(invalid)";
7096
7097 return str;
7098 }
7099
7100 /*
7101 * Handle a link down interrupt from the 8051.
7102 *
7103 * This is a work-queue function outside of the interrupt.
7104 */
handle_link_down(struct work_struct * work)7105 void handle_link_down(struct work_struct *work)
7106 {
7107 u8 lcl_reason, neigh_reason = 0;
7108 u8 link_down_reason;
7109 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
7110 link_down_work);
7111 int was_up;
7112 static const char ldr_str[] = "Link down reason: ";
7113
7114 if ((ppd->host_link_state &
7115 (HLS_DN_POLL | HLS_VERIFY_CAP | HLS_GOING_UP)) &&
7116 ppd->port_type == PORT_TYPE_FIXED)
7117 ppd->offline_disabled_reason =
7118 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NOT_INSTALLED);
7119
7120 /* Go offline first, then deal with reading/writing through 8051 */
7121 was_up = !!(ppd->host_link_state & HLS_UP);
7122 set_link_state(ppd, HLS_DN_OFFLINE);
7123 xchg(&ppd->is_link_down_queued, 0);
7124
7125 if (was_up) {
7126 lcl_reason = 0;
7127 /* link down reason is only valid if the link was up */
7128 read_link_down_reason(ppd->dd, &link_down_reason);
7129 switch (link_down_reason) {
7130 case LDR_LINK_TRANSFER_ACTIVE_LOW:
7131 /* the link went down, no idle message reason */
7132 dd_dev_info(ppd->dd, "%sUnexpected link down\n",
7133 ldr_str);
7134 break;
7135 case LDR_RECEIVED_LINKDOWN_IDLE_MSG:
7136 /*
7137 * The neighbor reason is only valid if an idle message
7138 * was received for it.
7139 */
7140 read_planned_down_reason_code(ppd->dd, &neigh_reason);
7141 dd_dev_info(ppd->dd,
7142 "%sNeighbor link down message %d, %s\n",
7143 ldr_str, neigh_reason,
7144 link_down_reason_str(neigh_reason));
7145 break;
7146 case LDR_RECEIVED_HOST_OFFLINE_REQ:
7147 dd_dev_info(ppd->dd,
7148 "%sHost requested link to go offline\n",
7149 ldr_str);
7150 break;
7151 default:
7152 dd_dev_info(ppd->dd, "%sUnknown reason 0x%x\n",
7153 ldr_str, link_down_reason);
7154 break;
7155 }
7156
7157 /*
7158 * If no reason, assume peer-initiated but missed
7159 * LinkGoingDown idle flits.
7160 */
7161 if (neigh_reason == 0)
7162 lcl_reason = OPA_LINKDOWN_REASON_NEIGHBOR_UNKNOWN;
7163 } else {
7164 /* went down while polling or going up */
7165 lcl_reason = OPA_LINKDOWN_REASON_TRANSIENT;
7166 }
7167
7168 set_link_down_reason(ppd, lcl_reason, neigh_reason, 0);
7169
7170 /* inform the SMA when the link transitions from up to down */
7171 if (was_up && ppd->local_link_down_reason.sma == 0 &&
7172 ppd->neigh_link_down_reason.sma == 0) {
7173 ppd->local_link_down_reason.sma =
7174 ppd->local_link_down_reason.latest;
7175 ppd->neigh_link_down_reason.sma =
7176 ppd->neigh_link_down_reason.latest;
7177 }
7178
7179 reset_neighbor_info(ppd);
7180
7181 /* disable the port */
7182 clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
7183
7184 /*
7185 * If there is no cable attached, turn the DC off. Otherwise,
7186 * start the link bring up.
7187 */
7188 if (ppd->port_type == PORT_TYPE_QSFP && !qsfp_mod_present(ppd))
7189 dc_shutdown(ppd->dd);
7190 else
7191 start_link(ppd);
7192 }
7193
handle_link_bounce(struct work_struct * work)7194 void handle_link_bounce(struct work_struct *work)
7195 {
7196 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
7197 link_bounce_work);
7198
7199 /*
7200 * Only do something if the link is currently up.
7201 */
7202 if (ppd->host_link_state & HLS_UP) {
7203 set_link_state(ppd, HLS_DN_OFFLINE);
7204 start_link(ppd);
7205 } else {
7206 dd_dev_info(ppd->dd, "%s: link not up (%s), nothing to do\n",
7207 __func__, link_state_name(ppd->host_link_state));
7208 }
7209 }
7210
7211 /*
7212 * Mask conversion: Capability exchange to Port LTP. The capability
7213 * exchange has an implicit 16b CRC that is mandatory.
7214 */
cap_to_port_ltp(int cap)7215 static int cap_to_port_ltp(int cap)
7216 {
7217 int port_ltp = PORT_LTP_CRC_MODE_16; /* this mode is mandatory */
7218
7219 if (cap & CAP_CRC_14B)
7220 port_ltp |= PORT_LTP_CRC_MODE_14;
7221 if (cap & CAP_CRC_48B)
7222 port_ltp |= PORT_LTP_CRC_MODE_48;
7223 if (cap & CAP_CRC_12B_16B_PER_LANE)
7224 port_ltp |= PORT_LTP_CRC_MODE_PER_LANE;
7225
7226 return port_ltp;
7227 }
7228
7229 /*
7230 * Convert an OPA Port LTP mask to capability mask
7231 */
port_ltp_to_cap(int port_ltp)7232 int port_ltp_to_cap(int port_ltp)
7233 {
7234 int cap_mask = 0;
7235
7236 if (port_ltp & PORT_LTP_CRC_MODE_14)
7237 cap_mask |= CAP_CRC_14B;
7238 if (port_ltp & PORT_LTP_CRC_MODE_48)
7239 cap_mask |= CAP_CRC_48B;
7240 if (port_ltp & PORT_LTP_CRC_MODE_PER_LANE)
7241 cap_mask |= CAP_CRC_12B_16B_PER_LANE;
7242
7243 return cap_mask;
7244 }
7245
7246 /*
7247 * Convert a single DC LCB CRC mode to an OPA Port LTP mask.
7248 */
lcb_to_port_ltp(int lcb_crc)7249 static int lcb_to_port_ltp(int lcb_crc)
7250 {
7251 int port_ltp = 0;
7252
7253 if (lcb_crc == LCB_CRC_12B_16B_PER_LANE)
7254 port_ltp = PORT_LTP_CRC_MODE_PER_LANE;
7255 else if (lcb_crc == LCB_CRC_48B)
7256 port_ltp = PORT_LTP_CRC_MODE_48;
7257 else if (lcb_crc == LCB_CRC_14B)
7258 port_ltp = PORT_LTP_CRC_MODE_14;
7259 else
7260 port_ltp = PORT_LTP_CRC_MODE_16;
7261
7262 return port_ltp;
7263 }
7264
clear_full_mgmt_pkey(struct hfi1_pportdata * ppd)7265 static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd)
7266 {
7267 if (ppd->pkeys[2] != 0) {
7268 ppd->pkeys[2] = 0;
7269 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0);
7270 hfi1_event_pkey_change(ppd->dd, ppd->port);
7271 }
7272 }
7273
7274 /*
7275 * Convert the given link width to the OPA link width bitmask.
7276 */
link_width_to_bits(struct hfi1_devdata * dd,u16 width)7277 static u16 link_width_to_bits(struct hfi1_devdata *dd, u16 width)
7278 {
7279 switch (width) {
7280 case 0:
7281 /*
7282 * Simulator and quick linkup do not set the width.
7283 * Just set it to 4x without complaint.
7284 */
7285 if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR || quick_linkup)
7286 return OPA_LINK_WIDTH_4X;
7287 return 0; /* no lanes up */
7288 case 1: return OPA_LINK_WIDTH_1X;
7289 case 2: return OPA_LINK_WIDTH_2X;
7290 case 3: return OPA_LINK_WIDTH_3X;
7291 default:
7292 dd_dev_info(dd, "%s: invalid width %d, using 4\n",
7293 __func__, width);
7294 /* fall through */
7295 case 4: return OPA_LINK_WIDTH_4X;
7296 }
7297 }
7298
7299 /*
7300 * Do a population count on the bottom nibble.
7301 */
7302 static const u8 bit_counts[16] = {
7303 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
7304 };
7305
nibble_to_count(u8 nibble)7306 static inline u8 nibble_to_count(u8 nibble)
7307 {
7308 return bit_counts[nibble & 0xf];
7309 }
7310
7311 /*
7312 * Read the active lane information from the 8051 registers and return
7313 * their widths.
7314 *
7315 * Active lane information is found in these 8051 registers:
7316 * enable_lane_tx
7317 * enable_lane_rx
7318 */
get_link_widths(struct hfi1_devdata * dd,u16 * tx_width,u16 * rx_width)7319 static void get_link_widths(struct hfi1_devdata *dd, u16 *tx_width,
7320 u16 *rx_width)
7321 {
7322 u16 tx, rx;
7323 u8 enable_lane_rx;
7324 u8 enable_lane_tx;
7325 u8 tx_polarity_inversion;
7326 u8 rx_polarity_inversion;
7327 u8 max_rate;
7328
7329 /* read the active lanes */
7330 read_tx_settings(dd, &enable_lane_tx, &tx_polarity_inversion,
7331 &rx_polarity_inversion, &max_rate);
7332 read_local_lni(dd, &enable_lane_rx);
7333
7334 /* convert to counts */
7335 tx = nibble_to_count(enable_lane_tx);
7336 rx = nibble_to_count(enable_lane_rx);
7337
7338 /*
7339 * Set link_speed_active here, overriding what was set in
7340 * handle_verify_cap(). The ASIC 8051 firmware does not correctly
7341 * set the max_rate field in handle_verify_cap until v0.19.
7342 */
7343 if ((dd->icode == ICODE_RTL_SILICON) &&
7344 (dd->dc8051_ver < dc8051_ver(0, 19, 0))) {
7345 /* max_rate: 0 = 12.5G, 1 = 25G */
7346 switch (max_rate) {
7347 case 0:
7348 dd->pport[0].link_speed_active = OPA_LINK_SPEED_12_5G;
7349 break;
7350 default:
7351 dd_dev_err(dd,
7352 "%s: unexpected max rate %d, using 25Gb\n",
7353 __func__, (int)max_rate);
7354 /* fall through */
7355 case 1:
7356 dd->pport[0].link_speed_active = OPA_LINK_SPEED_25G;
7357 break;
7358 }
7359 }
7360
7361 dd_dev_info(dd,
7362 "Fabric active lanes (width): tx 0x%x (%d), rx 0x%x (%d)\n",
7363 enable_lane_tx, tx, enable_lane_rx, rx);
7364 *tx_width = link_width_to_bits(dd, tx);
7365 *rx_width = link_width_to_bits(dd, rx);
7366 }
7367
7368 /*
7369 * Read verify_cap_local_fm_link_width[1] to obtain the link widths.
7370 * Valid after the end of VerifyCap and during LinkUp. Does not change
7371 * after link up. I.e. look elsewhere for downgrade information.
7372 *
7373 * Bits are:
7374 * + bits [7:4] contain the number of active transmitters
7375 * + bits [3:0] contain the number of active receivers
7376 * These are numbers 1 through 4 and can be different values if the
7377 * link is asymmetric.
7378 *
7379 * verify_cap_local_fm_link_width[0] retains its original value.
7380 */
get_linkup_widths(struct hfi1_devdata * dd,u16 * tx_width,u16 * rx_width)7381 static void get_linkup_widths(struct hfi1_devdata *dd, u16 *tx_width,
7382 u16 *rx_width)
7383 {
7384 u16 widths, tx, rx;
7385 u8 misc_bits, local_flags;
7386 u16 active_tx, active_rx;
7387
7388 read_vc_local_link_mode(dd, &misc_bits, &local_flags, &widths);
7389 tx = widths >> 12;
7390 rx = (widths >> 8) & 0xf;
7391
7392 *tx_width = link_width_to_bits(dd, tx);
7393 *rx_width = link_width_to_bits(dd, rx);
7394
7395 /* print the active widths */
7396 get_link_widths(dd, &active_tx, &active_rx);
7397 }
7398
7399 /*
7400 * Set ppd->link_width_active and ppd->link_width_downgrade_active using
7401 * hardware information when the link first comes up.
7402 *
7403 * The link width is not available until after VerifyCap.AllFramesReceived
7404 * (the trigger for handle_verify_cap), so this is outside that routine
7405 * and should be called when the 8051 signals linkup.
7406 */
get_linkup_link_widths(struct hfi1_pportdata * ppd)7407 void get_linkup_link_widths(struct hfi1_pportdata *ppd)
7408 {
7409 u16 tx_width, rx_width;
7410
7411 /* get end-of-LNI link widths */
7412 get_linkup_widths(ppd->dd, &tx_width, &rx_width);
7413
7414 /* use tx_width as the link is supposed to be symmetric on link up */
7415 ppd->link_width_active = tx_width;
7416 /* link width downgrade active (LWD.A) starts out matching LW.A */
7417 ppd->link_width_downgrade_tx_active = ppd->link_width_active;
7418 ppd->link_width_downgrade_rx_active = ppd->link_width_active;
7419 /* per OPA spec, on link up LWD.E resets to LWD.S */
7420 ppd->link_width_downgrade_enabled = ppd->link_width_downgrade_supported;
7421 /* cache the active egress rate (units {10^6 bits/sec]) */
7422 ppd->current_egress_rate = active_egress_rate(ppd);
7423 }
7424
7425 /*
7426 * Handle a verify capabilities interrupt from the 8051.
7427 *
7428 * This is a work-queue function outside of the interrupt.
7429 */
handle_verify_cap(struct work_struct * work)7430 void handle_verify_cap(struct work_struct *work)
7431 {
7432 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
7433 link_vc_work);
7434 struct hfi1_devdata *dd = ppd->dd;
7435 u64 reg;
7436 u8 power_management;
7437 u8 continuous;
7438 u8 vcu;
7439 u8 vau;
7440 u8 z;
7441 u16 vl15buf;
7442 u16 link_widths;
7443 u16 crc_mask;
7444 u16 crc_val;
7445 u16 device_id;
7446 u16 active_tx, active_rx;
7447 u8 partner_supported_crc;
7448 u8 remote_tx_rate;
7449 u8 device_rev;
7450
7451 set_link_state(ppd, HLS_VERIFY_CAP);
7452
7453 lcb_shutdown(dd, 0);
7454 adjust_lcb_for_fpga_serdes(dd);
7455
7456 read_vc_remote_phy(dd, &power_management, &continuous);
7457 read_vc_remote_fabric(dd, &vau, &z, &vcu, &vl15buf,
7458 &partner_supported_crc);
7459 read_vc_remote_link_width(dd, &remote_tx_rate, &link_widths);
7460 read_remote_device_id(dd, &device_id, &device_rev);
7461
7462 /* print the active widths */
7463 get_link_widths(dd, &active_tx, &active_rx);
7464 dd_dev_info(dd,
7465 "Peer PHY: power management 0x%x, continuous updates 0x%x\n",
7466 (int)power_management, (int)continuous);
7467 dd_dev_info(dd,
7468 "Peer Fabric: vAU %d, Z %d, vCU %d, vl15 credits 0x%x, CRC sizes 0x%x\n",
7469 (int)vau, (int)z, (int)vcu, (int)vl15buf,
7470 (int)partner_supported_crc);
7471 dd_dev_info(dd, "Peer Link Width: tx rate 0x%x, widths 0x%x\n",
7472 (u32)remote_tx_rate, (u32)link_widths);
7473 dd_dev_info(dd, "Peer Device ID: 0x%04x, Revision 0x%02x\n",
7474 (u32)device_id, (u32)device_rev);
7475 /*
7476 * The peer vAU value just read is the peer receiver value. HFI does
7477 * not support a transmit vAU of 0 (AU == 8). We advertised that
7478 * with Z=1 in the fabric capabilities sent to the peer. The peer
7479 * will see our Z=1, and, if it advertised a vAU of 0, will move its
7480 * receive to vAU of 1 (AU == 16). Do the same here. We do not care
7481 * about the peer Z value - our sent vAU is 3 (hardwired) and is not
7482 * subject to the Z value exception.
7483 */
7484 if (vau == 0)
7485 vau = 1;
7486 set_up_vau(dd, vau);
7487
7488 /*
7489 * Set VL15 credits to 0 in global credit register. Cache remote VL15
7490 * credits value and wait for link-up interrupt ot set it.
7491 */
7492 set_up_vl15(dd, 0);
7493 dd->vl15buf_cached = vl15buf;
7494
7495 /* set up the LCB CRC mode */
7496 crc_mask = ppd->port_crc_mode_enabled & partner_supported_crc;
7497
7498 /* order is important: use the lowest bit in common */
7499 if (crc_mask & CAP_CRC_14B)
7500 crc_val = LCB_CRC_14B;
7501 else if (crc_mask & CAP_CRC_48B)
7502 crc_val = LCB_CRC_48B;
7503 else if (crc_mask & CAP_CRC_12B_16B_PER_LANE)
7504 crc_val = LCB_CRC_12B_16B_PER_LANE;
7505 else
7506 crc_val = LCB_CRC_16B;
7507
7508 dd_dev_info(dd, "Final LCB CRC mode: %d\n", (int)crc_val);
7509 write_csr(dd, DC_LCB_CFG_CRC_MODE,
7510 (u64)crc_val << DC_LCB_CFG_CRC_MODE_TX_VAL_SHIFT);
7511
7512 /* set (14b only) or clear sideband credit */
7513 reg = read_csr(dd, SEND_CM_CTRL);
7514 if (crc_val == LCB_CRC_14B && crc_14b_sideband) {
7515 write_csr(dd, SEND_CM_CTRL,
7516 reg | SEND_CM_CTRL_FORCE_CREDIT_MODE_SMASK);
7517 } else {
7518 write_csr(dd, SEND_CM_CTRL,
7519 reg & ~SEND_CM_CTRL_FORCE_CREDIT_MODE_SMASK);
7520 }
7521
7522 ppd->link_speed_active = 0; /* invalid value */
7523 if (dd->dc8051_ver < dc8051_ver(0, 20, 0)) {
7524 /* remote_tx_rate: 0 = 12.5G, 1 = 25G */
7525 switch (remote_tx_rate) {
7526 case 0:
7527 ppd->link_speed_active = OPA_LINK_SPEED_12_5G;
7528 break;
7529 case 1:
7530 ppd->link_speed_active = OPA_LINK_SPEED_25G;
7531 break;
7532 }
7533 } else {
7534 /* actual rate is highest bit of the ANDed rates */
7535 u8 rate = remote_tx_rate & ppd->local_tx_rate;
7536
7537 if (rate & 2)
7538 ppd->link_speed_active = OPA_LINK_SPEED_25G;
7539 else if (rate & 1)
7540 ppd->link_speed_active = OPA_LINK_SPEED_12_5G;
7541 }
7542 if (ppd->link_speed_active == 0) {
7543 dd_dev_err(dd, "%s: unexpected remote tx rate %d, using 25Gb\n",
7544 __func__, (int)remote_tx_rate);
7545 ppd->link_speed_active = OPA_LINK_SPEED_25G;
7546 }
7547
7548 /*
7549 * Cache the values of the supported, enabled, and active
7550 * LTP CRC modes to return in 'portinfo' queries. But the bit
7551 * flags that are returned in the portinfo query differ from
7552 * what's in the link_crc_mask, crc_sizes, and crc_val
7553 * variables. Convert these here.
7554 */
7555 ppd->port_ltp_crc_mode = cap_to_port_ltp(link_crc_mask) << 8;
7556 /* supported crc modes */
7557 ppd->port_ltp_crc_mode |=
7558 cap_to_port_ltp(ppd->port_crc_mode_enabled) << 4;
7559 /* enabled crc modes */
7560 ppd->port_ltp_crc_mode |= lcb_to_port_ltp(crc_val);
7561 /* active crc mode */
7562
7563 /* set up the remote credit return table */
7564 assign_remote_cm_au_table(dd, vcu);
7565
7566 /*
7567 * The LCB is reset on entry to handle_verify_cap(), so this must
7568 * be applied on every link up.
7569 *
7570 * Adjust LCB error kill enable to kill the link if
7571 * these RBUF errors are seen:
7572 * REPLAY_BUF_MBE_SMASK
7573 * FLIT_INPUT_BUF_MBE_SMASK
7574 */
7575 if (is_ax(dd)) { /* fixed in B0 */
7576 reg = read_csr(dd, DC_LCB_CFG_LINK_KILL_EN);
7577 reg |= DC_LCB_CFG_LINK_KILL_EN_REPLAY_BUF_MBE_SMASK
7578 | DC_LCB_CFG_LINK_KILL_EN_FLIT_INPUT_BUF_MBE_SMASK;
7579 write_csr(dd, DC_LCB_CFG_LINK_KILL_EN, reg);
7580 }
7581
7582 /* pull LCB fifos out of reset - all fifo clocks must be stable */
7583 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0);
7584
7585 /* give 8051 access to the LCB CSRs */
7586 write_csr(dd, DC_LCB_ERR_EN, 0); /* mask LCB errors */
7587 set_8051_lcb_access(dd);
7588
7589 /* tell the 8051 to go to LinkUp */
7590 set_link_state(ppd, HLS_GOING_UP);
7591 }
7592
7593 /**
7594 * apply_link_downgrade_policy - Apply the link width downgrade enabled
7595 * policy against the current active link widths.
7596 * @ppd: info of physical Hfi port
7597 * @refresh_widths: True indicates link downgrade event
7598 * @return: True indicates a successful link downgrade. False indicates
7599 * link downgrade event failed and the link will bounce back to
7600 * default link width.
7601 *
7602 * Called when the enabled policy changes or the active link widths
7603 * change.
7604 * Refresh_widths indicates that a link downgrade occurred. The
7605 * link_downgraded variable is set by refresh_widths and
7606 * determines the success/failure of the policy application.
7607 */
apply_link_downgrade_policy(struct hfi1_pportdata * ppd,bool refresh_widths)7608 bool apply_link_downgrade_policy(struct hfi1_pportdata *ppd,
7609 bool refresh_widths)
7610 {
7611 int do_bounce = 0;
7612 int tries;
7613 u16 lwde;
7614 u16 tx, rx;
7615 bool link_downgraded = refresh_widths;
7616
7617 /* use the hls lock to avoid a race with actual link up */
7618 tries = 0;
7619 retry:
7620 mutex_lock(&ppd->hls_lock);
7621 /* only apply if the link is up */
7622 if (ppd->host_link_state & HLS_DOWN) {
7623 /* still going up..wait and retry */
7624 if (ppd->host_link_state & HLS_GOING_UP) {
7625 if (++tries < 1000) {
7626 mutex_unlock(&ppd->hls_lock);
7627 usleep_range(100, 120); /* arbitrary */
7628 goto retry;
7629 }
7630 dd_dev_err(ppd->dd,
7631 "%s: giving up waiting for link state change\n",
7632 __func__);
7633 }
7634 goto done;
7635 }
7636
7637 lwde = ppd->link_width_downgrade_enabled;
7638
7639 if (refresh_widths) {
7640 get_link_widths(ppd->dd, &tx, &rx);
7641 ppd->link_width_downgrade_tx_active = tx;
7642 ppd->link_width_downgrade_rx_active = rx;
7643 }
7644
7645 if (ppd->link_width_downgrade_tx_active == 0 ||
7646 ppd->link_width_downgrade_rx_active == 0) {
7647 /* the 8051 reported a dead link as a downgrade */
7648 dd_dev_err(ppd->dd, "Link downgrade is really a link down, ignoring\n");
7649 link_downgraded = false;
7650 } else if (lwde == 0) {
7651 /* downgrade is disabled */
7652
7653 /* bounce if not at starting active width */
7654 if ((ppd->link_width_active !=
7655 ppd->link_width_downgrade_tx_active) ||
7656 (ppd->link_width_active !=
7657 ppd->link_width_downgrade_rx_active)) {
7658 dd_dev_err(ppd->dd,
7659 "Link downgrade is disabled and link has downgraded, downing link\n");
7660 dd_dev_err(ppd->dd,
7661 " original 0x%x, tx active 0x%x, rx active 0x%x\n",
7662 ppd->link_width_active,
7663 ppd->link_width_downgrade_tx_active,
7664 ppd->link_width_downgrade_rx_active);
7665 do_bounce = 1;
7666 link_downgraded = false;
7667 }
7668 } else if ((lwde & ppd->link_width_downgrade_tx_active) == 0 ||
7669 (lwde & ppd->link_width_downgrade_rx_active) == 0) {
7670 /* Tx or Rx is outside the enabled policy */
7671 dd_dev_err(ppd->dd,
7672 "Link is outside of downgrade allowed, downing link\n");
7673 dd_dev_err(ppd->dd,
7674 " enabled 0x%x, tx active 0x%x, rx active 0x%x\n",
7675 lwde, ppd->link_width_downgrade_tx_active,
7676 ppd->link_width_downgrade_rx_active);
7677 do_bounce = 1;
7678 link_downgraded = false;
7679 }
7680
7681 done:
7682 mutex_unlock(&ppd->hls_lock);
7683
7684 if (do_bounce) {
7685 set_link_down_reason(ppd, OPA_LINKDOWN_REASON_WIDTH_POLICY, 0,
7686 OPA_LINKDOWN_REASON_WIDTH_POLICY);
7687 set_link_state(ppd, HLS_DN_OFFLINE);
7688 start_link(ppd);
7689 }
7690
7691 return link_downgraded;
7692 }
7693
7694 /*
7695 * Handle a link downgrade interrupt from the 8051.
7696 *
7697 * This is a work-queue function outside of the interrupt.
7698 */
handle_link_downgrade(struct work_struct * work)7699 void handle_link_downgrade(struct work_struct *work)
7700 {
7701 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
7702 link_downgrade_work);
7703
7704 dd_dev_info(ppd->dd, "8051: Link width downgrade\n");
7705 if (apply_link_downgrade_policy(ppd, true))
7706 update_xmit_counters(ppd, ppd->link_width_downgrade_tx_active);
7707 }
7708
dcc_err_string(char * buf,int buf_len,u64 flags)7709 static char *dcc_err_string(char *buf, int buf_len, u64 flags)
7710 {
7711 return flag_string(buf, buf_len, flags, dcc_err_flags,
7712 ARRAY_SIZE(dcc_err_flags));
7713 }
7714
lcb_err_string(char * buf,int buf_len,u64 flags)7715 static char *lcb_err_string(char *buf, int buf_len, u64 flags)
7716 {
7717 return flag_string(buf, buf_len, flags, lcb_err_flags,
7718 ARRAY_SIZE(lcb_err_flags));
7719 }
7720
dc8051_err_string(char * buf,int buf_len,u64 flags)7721 static char *dc8051_err_string(char *buf, int buf_len, u64 flags)
7722 {
7723 return flag_string(buf, buf_len, flags, dc8051_err_flags,
7724 ARRAY_SIZE(dc8051_err_flags));
7725 }
7726
dc8051_info_err_string(char * buf,int buf_len,u64 flags)7727 static char *dc8051_info_err_string(char *buf, int buf_len, u64 flags)
7728 {
7729 return flag_string(buf, buf_len, flags, dc8051_info_err_flags,
7730 ARRAY_SIZE(dc8051_info_err_flags));
7731 }
7732
dc8051_info_host_msg_string(char * buf,int buf_len,u64 flags)7733 static char *dc8051_info_host_msg_string(char *buf, int buf_len, u64 flags)
7734 {
7735 return flag_string(buf, buf_len, flags, dc8051_info_host_msg_flags,
7736 ARRAY_SIZE(dc8051_info_host_msg_flags));
7737 }
7738
handle_8051_interrupt(struct hfi1_devdata * dd,u32 unused,u64 reg)7739 static void handle_8051_interrupt(struct hfi1_devdata *dd, u32 unused, u64 reg)
7740 {
7741 struct hfi1_pportdata *ppd = dd->pport;
7742 u64 info, err, host_msg;
7743 int queue_link_down = 0;
7744 char buf[96];
7745
7746 /* look at the flags */
7747 if (reg & DC_DC8051_ERR_FLG_SET_BY_8051_SMASK) {
7748 /* 8051 information set by firmware */
7749 /* read DC8051_DBG_ERR_INFO_SET_BY_8051 for details */
7750 info = read_csr(dd, DC_DC8051_DBG_ERR_INFO_SET_BY_8051);
7751 err = (info >> DC_DC8051_DBG_ERR_INFO_SET_BY_8051_ERROR_SHIFT)
7752 & DC_DC8051_DBG_ERR_INFO_SET_BY_8051_ERROR_MASK;
7753 host_msg = (info >>
7754 DC_DC8051_DBG_ERR_INFO_SET_BY_8051_HOST_MSG_SHIFT)
7755 & DC_DC8051_DBG_ERR_INFO_SET_BY_8051_HOST_MSG_MASK;
7756
7757 /*
7758 * Handle error flags.
7759 */
7760 if (err & FAILED_LNI) {
7761 /*
7762 * LNI error indications are cleared by the 8051
7763 * only when starting polling. Only pay attention
7764 * to them when in the states that occur during
7765 * LNI.
7766 */
7767 if (ppd->host_link_state
7768 & (HLS_DN_POLL | HLS_VERIFY_CAP | HLS_GOING_UP)) {
7769 queue_link_down = 1;
7770 dd_dev_info(dd, "Link error: %s\n",
7771 dc8051_info_err_string(buf,
7772 sizeof(buf),
7773 err &
7774 FAILED_LNI));
7775 }
7776 err &= ~(u64)FAILED_LNI;
7777 }
7778 /* unknown frames can happen durning LNI, just count */
7779 if (err & UNKNOWN_FRAME) {
7780 ppd->unknown_frame_count++;
7781 err &= ~(u64)UNKNOWN_FRAME;
7782 }
7783 if (err) {
7784 /* report remaining errors, but do not do anything */
7785 dd_dev_err(dd, "8051 info error: %s\n",
7786 dc8051_info_err_string(buf, sizeof(buf),
7787 err));
7788 }
7789
7790 /*
7791 * Handle host message flags.
7792 */
7793 if (host_msg & HOST_REQ_DONE) {
7794 /*
7795 * Presently, the driver does a busy wait for
7796 * host requests to complete. This is only an
7797 * informational message.
7798 * NOTE: The 8051 clears the host message
7799 * information *on the next 8051 command*.
7800 * Therefore, when linkup is achieved,
7801 * this flag will still be set.
7802 */
7803 host_msg &= ~(u64)HOST_REQ_DONE;
7804 }
7805 if (host_msg & BC_SMA_MSG) {
7806 queue_work(ppd->link_wq, &ppd->sma_message_work);
7807 host_msg &= ~(u64)BC_SMA_MSG;
7808 }
7809 if (host_msg & LINKUP_ACHIEVED) {
7810 dd_dev_info(dd, "8051: Link up\n");
7811 queue_work(ppd->link_wq, &ppd->link_up_work);
7812 host_msg &= ~(u64)LINKUP_ACHIEVED;
7813 }
7814 if (host_msg & EXT_DEVICE_CFG_REQ) {
7815 handle_8051_request(ppd);
7816 host_msg &= ~(u64)EXT_DEVICE_CFG_REQ;
7817 }
7818 if (host_msg & VERIFY_CAP_FRAME) {
7819 queue_work(ppd->link_wq, &ppd->link_vc_work);
7820 host_msg &= ~(u64)VERIFY_CAP_FRAME;
7821 }
7822 if (host_msg & LINK_GOING_DOWN) {
7823 const char *extra = "";
7824 /* no downgrade action needed if going down */
7825 if (host_msg & LINK_WIDTH_DOWNGRADED) {
7826 host_msg &= ~(u64)LINK_WIDTH_DOWNGRADED;
7827 extra = " (ignoring downgrade)";
7828 }
7829 dd_dev_info(dd, "8051: Link down%s\n", extra);
7830 queue_link_down = 1;
7831 host_msg &= ~(u64)LINK_GOING_DOWN;
7832 }
7833 if (host_msg & LINK_WIDTH_DOWNGRADED) {
7834 queue_work(ppd->link_wq, &ppd->link_downgrade_work);
7835 host_msg &= ~(u64)LINK_WIDTH_DOWNGRADED;
7836 }
7837 if (host_msg) {
7838 /* report remaining messages, but do not do anything */
7839 dd_dev_info(dd, "8051 info host message: %s\n",
7840 dc8051_info_host_msg_string(buf,
7841 sizeof(buf),
7842 host_msg));
7843 }
7844
7845 reg &= ~DC_DC8051_ERR_FLG_SET_BY_8051_SMASK;
7846 }
7847 if (reg & DC_DC8051_ERR_FLG_LOST_8051_HEART_BEAT_SMASK) {
7848 /*
7849 * Lost the 8051 heartbeat. If this happens, we
7850 * receive constant interrupts about it. Disable
7851 * the interrupt after the first.
7852 */
7853 dd_dev_err(dd, "Lost 8051 heartbeat\n");
7854 write_csr(dd, DC_DC8051_ERR_EN,
7855 read_csr(dd, DC_DC8051_ERR_EN) &
7856 ~DC_DC8051_ERR_EN_LOST_8051_HEART_BEAT_SMASK);
7857
7858 reg &= ~DC_DC8051_ERR_FLG_LOST_8051_HEART_BEAT_SMASK;
7859 }
7860 if (reg) {
7861 /* report the error, but do not do anything */
7862 dd_dev_err(dd, "8051 error: %s\n",
7863 dc8051_err_string(buf, sizeof(buf), reg));
7864 }
7865
7866 if (queue_link_down) {
7867 /*
7868 * if the link is already going down or disabled, do not
7869 * queue another. If there's a link down entry already
7870 * queued, don't queue another one.
7871 */
7872 if ((ppd->host_link_state &
7873 (HLS_GOING_OFFLINE | HLS_LINK_COOLDOWN)) ||
7874 ppd->link_enabled == 0) {
7875 dd_dev_info(dd, "%s: not queuing link down. host_link_state %x, link_enabled %x\n",
7876 __func__, ppd->host_link_state,
7877 ppd->link_enabled);
7878 } else {
7879 if (xchg(&ppd->is_link_down_queued, 1) == 1)
7880 dd_dev_info(dd,
7881 "%s: link down request already queued\n",
7882 __func__);
7883 else
7884 queue_work(ppd->link_wq, &ppd->link_down_work);
7885 }
7886 }
7887 }
7888
7889 static const char * const fm_config_txt[] = {
7890 [0] =
7891 "BadHeadDist: Distance violation between two head flits",
7892 [1] =
7893 "BadTailDist: Distance violation between two tail flits",
7894 [2] =
7895 "BadCtrlDist: Distance violation between two credit control flits",
7896 [3] =
7897 "BadCrdAck: Credits return for unsupported VL",
7898 [4] =
7899 "UnsupportedVLMarker: Received VL Marker",
7900 [5] =
7901 "BadPreempt: Exceeded the preemption nesting level",
7902 [6] =
7903 "BadControlFlit: Received unsupported control flit",
7904 /* no 7 */
7905 [8] =
7906 "UnsupportedVLMarker: Received VL Marker for unconfigured or disabled VL",
7907 };
7908
7909 static const char * const port_rcv_txt[] = {
7910 [1] =
7911 "BadPktLen: Illegal PktLen",
7912 [2] =
7913 "PktLenTooLong: Packet longer than PktLen",
7914 [3] =
7915 "PktLenTooShort: Packet shorter than PktLen",
7916 [4] =
7917 "BadSLID: Illegal SLID (0, using multicast as SLID, does not include security validation of SLID)",
7918 [5] =
7919 "BadDLID: Illegal DLID (0, doesn't match HFI)",
7920 [6] =
7921 "BadL2: Illegal L2 opcode",
7922 [7] =
7923 "BadSC: Unsupported SC",
7924 [9] =
7925 "BadRC: Illegal RC",
7926 [11] =
7927 "PreemptError: Preempting with same VL",
7928 [12] =
7929 "PreemptVL15: Preempting a VL15 packet",
7930 };
7931
7932 #define OPA_LDR_FMCONFIG_OFFSET 16
7933 #define OPA_LDR_PORTRCV_OFFSET 0
handle_dcc_err(struct hfi1_devdata * dd,u32 unused,u64 reg)7934 static void handle_dcc_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
7935 {
7936 u64 info, hdr0, hdr1;
7937 const char *extra;
7938 char buf[96];
7939 struct hfi1_pportdata *ppd = dd->pport;
7940 u8 lcl_reason = 0;
7941 int do_bounce = 0;
7942
7943 if (reg & DCC_ERR_FLG_UNCORRECTABLE_ERR_SMASK) {
7944 if (!(dd->err_info_uncorrectable & OPA_EI_STATUS_SMASK)) {
7945 info = read_csr(dd, DCC_ERR_INFO_UNCORRECTABLE);
7946 dd->err_info_uncorrectable = info & OPA_EI_CODE_SMASK;
7947 /* set status bit */
7948 dd->err_info_uncorrectable |= OPA_EI_STATUS_SMASK;
7949 }
7950 reg &= ~DCC_ERR_FLG_UNCORRECTABLE_ERR_SMASK;
7951 }
7952
7953 if (reg & DCC_ERR_FLG_LINK_ERR_SMASK) {
7954 struct hfi1_pportdata *ppd = dd->pport;
7955 /* this counter saturates at (2^32) - 1 */
7956 if (ppd->link_downed < (u32)UINT_MAX)
7957 ppd->link_downed++;
7958 reg &= ~DCC_ERR_FLG_LINK_ERR_SMASK;
7959 }
7960
7961 if (reg & DCC_ERR_FLG_FMCONFIG_ERR_SMASK) {
7962 u8 reason_valid = 1;
7963
7964 info = read_csr(dd, DCC_ERR_INFO_FMCONFIG);
7965 if (!(dd->err_info_fmconfig & OPA_EI_STATUS_SMASK)) {
7966 dd->err_info_fmconfig = info & OPA_EI_CODE_SMASK;
7967 /* set status bit */
7968 dd->err_info_fmconfig |= OPA_EI_STATUS_SMASK;
7969 }
7970 switch (info) {
7971 case 0:
7972 case 1:
7973 case 2:
7974 case 3:
7975 case 4:
7976 case 5:
7977 case 6:
7978 extra = fm_config_txt[info];
7979 break;
7980 case 8:
7981 extra = fm_config_txt[info];
7982 if (ppd->port_error_action &
7983 OPA_PI_MASK_FM_CFG_UNSUPPORTED_VL_MARKER) {
7984 do_bounce = 1;
7985 /*
7986 * lcl_reason cannot be derived from info
7987 * for this error
7988 */
7989 lcl_reason =
7990 OPA_LINKDOWN_REASON_UNSUPPORTED_VL_MARKER;
7991 }
7992 break;
7993 default:
7994 reason_valid = 0;
7995 snprintf(buf, sizeof(buf), "reserved%lld", info);
7996 extra = buf;
7997 break;
7998 }
7999
8000 if (reason_valid && !do_bounce) {
8001 do_bounce = ppd->port_error_action &
8002 (1 << (OPA_LDR_FMCONFIG_OFFSET + info));
8003 lcl_reason = info + OPA_LINKDOWN_REASON_BAD_HEAD_DIST;
8004 }
8005
8006 /* just report this */
8007 dd_dev_info_ratelimited(dd, "DCC Error: fmconfig error: %s\n",
8008 extra);
8009 reg &= ~DCC_ERR_FLG_FMCONFIG_ERR_SMASK;
8010 }
8011
8012 if (reg & DCC_ERR_FLG_RCVPORT_ERR_SMASK) {
8013 u8 reason_valid = 1;
8014
8015 info = read_csr(dd, DCC_ERR_INFO_PORTRCV);
8016 hdr0 = read_csr(dd, DCC_ERR_INFO_PORTRCV_HDR0);
8017 hdr1 = read_csr(dd, DCC_ERR_INFO_PORTRCV_HDR1);
8018 if (!(dd->err_info_rcvport.status_and_code &
8019 OPA_EI_STATUS_SMASK)) {
8020 dd->err_info_rcvport.status_and_code =
8021 info & OPA_EI_CODE_SMASK;
8022 /* set status bit */
8023 dd->err_info_rcvport.status_and_code |=
8024 OPA_EI_STATUS_SMASK;
8025 /*
8026 * save first 2 flits in the packet that caused
8027 * the error
8028 */
8029 dd->err_info_rcvport.packet_flit1 = hdr0;
8030 dd->err_info_rcvport.packet_flit2 = hdr1;
8031 }
8032 switch (info) {
8033 case 1:
8034 case 2:
8035 case 3:
8036 case 4:
8037 case 5:
8038 case 6:
8039 case 7:
8040 case 9:
8041 case 11:
8042 case 12:
8043 extra = port_rcv_txt[info];
8044 break;
8045 default:
8046 reason_valid = 0;
8047 snprintf(buf, sizeof(buf), "reserved%lld", info);
8048 extra = buf;
8049 break;
8050 }
8051
8052 if (reason_valid && !do_bounce) {
8053 do_bounce = ppd->port_error_action &
8054 (1 << (OPA_LDR_PORTRCV_OFFSET + info));
8055 lcl_reason = info + OPA_LINKDOWN_REASON_RCV_ERROR_0;
8056 }
8057
8058 /* just report this */
8059 dd_dev_info_ratelimited(dd, "DCC Error: PortRcv error: %s\n"
8060 " hdr0 0x%llx, hdr1 0x%llx\n",
8061 extra, hdr0, hdr1);
8062
8063 reg &= ~DCC_ERR_FLG_RCVPORT_ERR_SMASK;
8064 }
8065
8066 if (reg & DCC_ERR_FLG_EN_CSR_ACCESS_BLOCKED_UC_SMASK) {
8067 /* informative only */
8068 dd_dev_info_ratelimited(dd, "8051 access to LCB blocked\n");
8069 reg &= ~DCC_ERR_FLG_EN_CSR_ACCESS_BLOCKED_UC_SMASK;
8070 }
8071 if (reg & DCC_ERR_FLG_EN_CSR_ACCESS_BLOCKED_HOST_SMASK) {
8072 /* informative only */
8073 dd_dev_info_ratelimited(dd, "host access to LCB blocked\n");
8074 reg &= ~DCC_ERR_FLG_EN_CSR_ACCESS_BLOCKED_HOST_SMASK;
8075 }
8076
8077 if (unlikely(hfi1_dbg_fault_suppress_err(&dd->verbs_dev)))
8078 reg &= ~DCC_ERR_FLG_LATE_EBP_ERR_SMASK;
8079
8080 /* report any remaining errors */
8081 if (reg)
8082 dd_dev_info_ratelimited(dd, "DCC Error: %s\n",
8083 dcc_err_string(buf, sizeof(buf), reg));
8084
8085 if (lcl_reason == 0)
8086 lcl_reason = OPA_LINKDOWN_REASON_UNKNOWN;
8087
8088 if (do_bounce) {
8089 dd_dev_info_ratelimited(dd, "%s: PortErrorAction bounce\n",
8090 __func__);
8091 set_link_down_reason(ppd, lcl_reason, 0, lcl_reason);
8092 queue_work(ppd->link_wq, &ppd->link_bounce_work);
8093 }
8094 }
8095
handle_lcb_err(struct hfi1_devdata * dd,u32 unused,u64 reg)8096 static void handle_lcb_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
8097 {
8098 char buf[96];
8099
8100 dd_dev_info(dd, "LCB Error: %s\n",
8101 lcb_err_string(buf, sizeof(buf), reg));
8102 }
8103
8104 /*
8105 * CCE block DC interrupt. Source is < 8.
8106 */
is_dc_int(struct hfi1_devdata * dd,unsigned int source)8107 static void is_dc_int(struct hfi1_devdata *dd, unsigned int source)
8108 {
8109 const struct err_reg_info *eri = &dc_errs[source];
8110
8111 if (eri->handler) {
8112 interrupt_clear_down(dd, 0, eri);
8113 } else if (source == 3 /* dc_lbm_int */) {
8114 /*
8115 * This indicates that a parity error has occurred on the
8116 * address/control lines presented to the LBM. The error
8117 * is a single pulse, there is no associated error flag,
8118 * and it is non-maskable. This is because if a parity
8119 * error occurs on the request the request is dropped.
8120 * This should never occur, but it is nice to know if it
8121 * ever does.
8122 */
8123 dd_dev_err(dd, "Parity error in DC LBM block\n");
8124 } else {
8125 dd_dev_err(dd, "Invalid DC interrupt %u\n", source);
8126 }
8127 }
8128
8129 /*
8130 * TX block send credit interrupt. Source is < 160.
8131 */
is_send_credit_int(struct hfi1_devdata * dd,unsigned int source)8132 static void is_send_credit_int(struct hfi1_devdata *dd, unsigned int source)
8133 {
8134 sc_group_release_update(dd, source);
8135 }
8136
8137 /*
8138 * TX block SDMA interrupt. Source is < 48.
8139 *
8140 * SDMA interrupts are grouped by type:
8141 *
8142 * 0 - N-1 = SDma
8143 * N - 2N-1 = SDmaProgress
8144 * 2N - 3N-1 = SDmaIdle
8145 */
is_sdma_eng_int(struct hfi1_devdata * dd,unsigned int source)8146 static void is_sdma_eng_int(struct hfi1_devdata *dd, unsigned int source)
8147 {
8148 /* what interrupt */
8149 unsigned int what = source / TXE_NUM_SDMA_ENGINES;
8150 /* which engine */
8151 unsigned int which = source % TXE_NUM_SDMA_ENGINES;
8152
8153 #ifdef CONFIG_SDMA_VERBOSITY
8154 dd_dev_err(dd, "CONFIG SDMA(%u) %s:%d %s()\n", which,
8155 slashstrip(__FILE__), __LINE__, __func__);
8156 sdma_dumpstate(&dd->per_sdma[which]);
8157 #endif
8158
8159 if (likely(what < 3 && which < dd->num_sdma)) {
8160 sdma_engine_interrupt(&dd->per_sdma[which], 1ull << source);
8161 } else {
8162 /* should not happen */
8163 dd_dev_err(dd, "Invalid SDMA interrupt 0x%x\n", source);
8164 }
8165 }
8166
8167 /**
8168 * is_rcv_avail_int() - User receive context available IRQ handler
8169 * @dd: valid dd
8170 * @source: logical IRQ source (offset from IS_RCVAVAIL_START)
8171 *
8172 * RX block receive available interrupt. Source is < 160.
8173 *
8174 * This is the general interrupt handler for user (PSM) receive contexts,
8175 * and can only be used for non-threaded IRQs.
8176 */
is_rcv_avail_int(struct hfi1_devdata * dd,unsigned int source)8177 static void is_rcv_avail_int(struct hfi1_devdata *dd, unsigned int source)
8178 {
8179 struct hfi1_ctxtdata *rcd;
8180 char *err_detail;
8181
8182 if (likely(source < dd->num_rcv_contexts)) {
8183 rcd = hfi1_rcd_get_by_index(dd, source);
8184 if (rcd) {
8185 handle_user_interrupt(rcd);
8186 hfi1_rcd_put(rcd);
8187 return; /* OK */
8188 }
8189 /* received an interrupt, but no rcd */
8190 err_detail = "dataless";
8191 } else {
8192 /* received an interrupt, but are not using that context */
8193 err_detail = "out of range";
8194 }
8195 dd_dev_err(dd, "unexpected %s receive available context interrupt %u\n",
8196 err_detail, source);
8197 }
8198
8199 /**
8200 * is_rcv_urgent_int() - User receive context urgent IRQ handler
8201 * @dd: valid dd
8202 * @source: logical IRQ source (offset from IS_RCVURGENT_START)
8203 *
8204 * RX block receive urgent interrupt. Source is < 160.
8205 *
8206 * NOTE: kernel receive contexts specifically do NOT enable this IRQ.
8207 */
is_rcv_urgent_int(struct hfi1_devdata * dd,unsigned int source)8208 static void is_rcv_urgent_int(struct hfi1_devdata *dd, unsigned int source)
8209 {
8210 struct hfi1_ctxtdata *rcd;
8211 char *err_detail;
8212
8213 if (likely(source < dd->num_rcv_contexts)) {
8214 rcd = hfi1_rcd_get_by_index(dd, source);
8215 if (rcd) {
8216 handle_user_interrupt(rcd);
8217 hfi1_rcd_put(rcd);
8218 return; /* OK */
8219 }
8220 /* received an interrupt, but no rcd */
8221 err_detail = "dataless";
8222 } else {
8223 /* received an interrupt, but are not using that context */
8224 err_detail = "out of range";
8225 }
8226 dd_dev_err(dd, "unexpected %s receive urgent context interrupt %u\n",
8227 err_detail, source);
8228 }
8229
8230 /*
8231 * Reserved range interrupt. Should not be called in normal operation.
8232 */
is_reserved_int(struct hfi1_devdata * dd,unsigned int source)8233 static void is_reserved_int(struct hfi1_devdata *dd, unsigned int source)
8234 {
8235 char name[64];
8236
8237 dd_dev_err(dd, "unexpected %s interrupt\n",
8238 is_reserved_name(name, sizeof(name), source));
8239 }
8240
8241 static const struct is_table is_table[] = {
8242 /*
8243 * start end
8244 * name func interrupt func
8245 */
8246 { IS_GENERAL_ERR_START, IS_GENERAL_ERR_END,
8247 is_misc_err_name, is_misc_err_int },
8248 { IS_SDMAENG_ERR_START, IS_SDMAENG_ERR_END,
8249 is_sdma_eng_err_name, is_sdma_eng_err_int },
8250 { IS_SENDCTXT_ERR_START, IS_SENDCTXT_ERR_END,
8251 is_sendctxt_err_name, is_sendctxt_err_int },
8252 { IS_SDMA_START, IS_SDMA_IDLE_END,
8253 is_sdma_eng_name, is_sdma_eng_int },
8254 { IS_VARIOUS_START, IS_VARIOUS_END,
8255 is_various_name, is_various_int },
8256 { IS_DC_START, IS_DC_END,
8257 is_dc_name, is_dc_int },
8258 { IS_RCVAVAIL_START, IS_RCVAVAIL_END,
8259 is_rcv_avail_name, is_rcv_avail_int },
8260 { IS_RCVURGENT_START, IS_RCVURGENT_END,
8261 is_rcv_urgent_name, is_rcv_urgent_int },
8262 { IS_SENDCREDIT_START, IS_SENDCREDIT_END,
8263 is_send_credit_name, is_send_credit_int},
8264 { IS_RESERVED_START, IS_RESERVED_END,
8265 is_reserved_name, is_reserved_int},
8266 };
8267
8268 /*
8269 * Interrupt source interrupt - called when the given source has an interrupt.
8270 * Source is a bit index into an array of 64-bit integers.
8271 */
is_interrupt(struct hfi1_devdata * dd,unsigned int source)8272 static void is_interrupt(struct hfi1_devdata *dd, unsigned int source)
8273 {
8274 const struct is_table *entry;
8275
8276 /* avoids a double compare by walking the table in-order */
8277 for (entry = &is_table[0]; entry->is_name; entry++) {
8278 if (source <= entry->end) {
8279 trace_hfi1_interrupt(dd, entry, source);
8280 entry->is_int(dd, source - entry->start);
8281 return;
8282 }
8283 }
8284 /* fell off the end */
8285 dd_dev_err(dd, "invalid interrupt source %u\n", source);
8286 }
8287
8288 /**
8289 * gerneral_interrupt() - General interrupt handler
8290 * @irq: MSIx IRQ vector
8291 * @data: hfi1 devdata
8292 *
8293 * This is able to correctly handle all non-threaded interrupts. Receive
8294 * context DATA IRQs are threaded and are not supported by this handler.
8295 *
8296 */
general_interrupt(int irq,void * data)8297 irqreturn_t general_interrupt(int irq, void *data)
8298 {
8299 struct hfi1_devdata *dd = data;
8300 u64 regs[CCE_NUM_INT_CSRS];
8301 u32 bit;
8302 int i;
8303 irqreturn_t handled = IRQ_NONE;
8304
8305 this_cpu_inc(*dd->int_counter);
8306
8307 /* phase 1: scan and clear all handled interrupts */
8308 for (i = 0; i < CCE_NUM_INT_CSRS; i++) {
8309 if (dd->gi_mask[i] == 0) {
8310 regs[i] = 0; /* used later */
8311 continue;
8312 }
8313 regs[i] = read_csr(dd, CCE_INT_STATUS + (8 * i)) &
8314 dd->gi_mask[i];
8315 /* only clear if anything is set */
8316 if (regs[i])
8317 write_csr(dd, CCE_INT_CLEAR + (8 * i), regs[i]);
8318 }
8319
8320 /* phase 2: call the appropriate handler */
8321 for_each_set_bit(bit, (unsigned long *)®s[0],
8322 CCE_NUM_INT_CSRS * 64) {
8323 is_interrupt(dd, bit);
8324 handled = IRQ_HANDLED;
8325 }
8326
8327 return handled;
8328 }
8329
sdma_interrupt(int irq,void * data)8330 irqreturn_t sdma_interrupt(int irq, void *data)
8331 {
8332 struct sdma_engine *sde = data;
8333 struct hfi1_devdata *dd = sde->dd;
8334 u64 status;
8335
8336 #ifdef CONFIG_SDMA_VERBOSITY
8337 dd_dev_err(dd, "CONFIG SDMA(%u) %s:%d %s()\n", sde->this_idx,
8338 slashstrip(__FILE__), __LINE__, __func__);
8339 sdma_dumpstate(sde);
8340 #endif
8341
8342 this_cpu_inc(*dd->int_counter);
8343
8344 /* This read_csr is really bad in the hot path */
8345 status = read_csr(dd,
8346 CCE_INT_STATUS + (8 * (IS_SDMA_START / 64)))
8347 & sde->imask;
8348 if (likely(status)) {
8349 /* clear the interrupt(s) */
8350 write_csr(dd,
8351 CCE_INT_CLEAR + (8 * (IS_SDMA_START / 64)),
8352 status);
8353
8354 /* handle the interrupt(s) */
8355 sdma_engine_interrupt(sde, status);
8356 } else {
8357 dd_dev_info_ratelimited(dd, "SDMA engine %u interrupt, but no status bits set\n",
8358 sde->this_idx);
8359 }
8360 return IRQ_HANDLED;
8361 }
8362
8363 /*
8364 * Clear the receive interrupt. Use a read of the interrupt clear CSR
8365 * to insure that the write completed. This does NOT guarantee that
8366 * queued DMA writes to memory from the chip are pushed.
8367 */
clear_recv_intr(struct hfi1_ctxtdata * rcd)8368 static inline void clear_recv_intr(struct hfi1_ctxtdata *rcd)
8369 {
8370 struct hfi1_devdata *dd = rcd->dd;
8371 u32 addr = CCE_INT_CLEAR + (8 * rcd->ireg);
8372
8373 write_csr(dd, addr, rcd->imask);
8374 /* force the above write on the chip and get a value back */
8375 (void)read_csr(dd, addr);
8376 }
8377
8378 /* force the receive interrupt */
force_recv_intr(struct hfi1_ctxtdata * rcd)8379 void force_recv_intr(struct hfi1_ctxtdata *rcd)
8380 {
8381 write_csr(rcd->dd, CCE_INT_FORCE + (8 * rcd->ireg), rcd->imask);
8382 }
8383
8384 /*
8385 * Return non-zero if a packet is present.
8386 *
8387 * This routine is called when rechecking for packets after the RcvAvail
8388 * interrupt has been cleared down. First, do a quick check of memory for
8389 * a packet present. If not found, use an expensive CSR read of the context
8390 * tail to determine the actual tail. The CSR read is necessary because there
8391 * is no method to push pending DMAs to memory other than an interrupt and we
8392 * are trying to determine if we need to force an interrupt.
8393 */
check_packet_present(struct hfi1_ctxtdata * rcd)8394 static inline int check_packet_present(struct hfi1_ctxtdata *rcd)
8395 {
8396 u32 tail;
8397 int present;
8398
8399 if (!rcd->rcvhdrtail_kvaddr)
8400 present = (rcd->seq_cnt ==
8401 rhf_rcv_seq(rhf_to_cpu(get_rhf_addr(rcd))));
8402 else /* is RDMA rtail */
8403 present = (rcd->head != get_rcvhdrtail(rcd));
8404
8405 if (present)
8406 return 1;
8407
8408 /* fall back to a CSR read, correct indpendent of DMA_RTAIL */
8409 tail = (u32)read_uctxt_csr(rcd->dd, rcd->ctxt, RCV_HDR_TAIL);
8410 return rcd->head != tail;
8411 }
8412
8413 /*
8414 * Receive packet IRQ handler. This routine expects to be on its own IRQ.
8415 * This routine will try to handle packets immediately (latency), but if
8416 * it finds too many, it will invoke the thread handler (bandwitdh). The
8417 * chip receive interrupt is *not* cleared down until this or the thread (if
8418 * invoked) is finished. The intent is to avoid extra interrupts while we
8419 * are processing packets anyway.
8420 */
receive_context_interrupt(int irq,void * data)8421 irqreturn_t receive_context_interrupt(int irq, void *data)
8422 {
8423 struct hfi1_ctxtdata *rcd = data;
8424 struct hfi1_devdata *dd = rcd->dd;
8425 int disposition;
8426 int present;
8427
8428 trace_hfi1_receive_interrupt(dd, rcd);
8429 this_cpu_inc(*dd->int_counter);
8430 aspm_ctx_disable(rcd);
8431
8432 /* receive interrupt remains blocked while processing packets */
8433 disposition = rcd->do_interrupt(rcd, 0);
8434
8435 /*
8436 * Too many packets were seen while processing packets in this
8437 * IRQ handler. Invoke the handler thread. The receive interrupt
8438 * remains blocked.
8439 */
8440 if (disposition == RCV_PKT_LIMIT)
8441 return IRQ_WAKE_THREAD;
8442
8443 /*
8444 * The packet processor detected no more packets. Clear the receive
8445 * interrupt and recheck for a packet packet that may have arrived
8446 * after the previous check and interrupt clear. If a packet arrived,
8447 * force another interrupt.
8448 */
8449 clear_recv_intr(rcd);
8450 present = check_packet_present(rcd);
8451 if (present)
8452 force_recv_intr(rcd);
8453
8454 return IRQ_HANDLED;
8455 }
8456
8457 /*
8458 * Receive packet thread handler. This expects to be invoked with the
8459 * receive interrupt still blocked.
8460 */
receive_context_thread(int irq,void * data)8461 irqreturn_t receive_context_thread(int irq, void *data)
8462 {
8463 struct hfi1_ctxtdata *rcd = data;
8464 int present;
8465
8466 /* receive interrupt is still blocked from the IRQ handler */
8467 (void)rcd->do_interrupt(rcd, 1);
8468
8469 /*
8470 * The packet processor will only return if it detected no more
8471 * packets. Hold IRQs here so we can safely clear the interrupt and
8472 * recheck for a packet that may have arrived after the previous
8473 * check and the interrupt clear. If a packet arrived, force another
8474 * interrupt.
8475 */
8476 local_irq_disable();
8477 clear_recv_intr(rcd);
8478 present = check_packet_present(rcd);
8479 if (present)
8480 force_recv_intr(rcd);
8481 local_irq_enable();
8482
8483 return IRQ_HANDLED;
8484 }
8485
8486 /* ========================================================================= */
8487
read_physical_state(struct hfi1_devdata * dd)8488 u32 read_physical_state(struct hfi1_devdata *dd)
8489 {
8490 u64 reg;
8491
8492 reg = read_csr(dd, DC_DC8051_STS_CUR_STATE);
8493 return (reg >> DC_DC8051_STS_CUR_STATE_PORT_SHIFT)
8494 & DC_DC8051_STS_CUR_STATE_PORT_MASK;
8495 }
8496
read_logical_state(struct hfi1_devdata * dd)8497 u32 read_logical_state(struct hfi1_devdata *dd)
8498 {
8499 u64 reg;
8500
8501 reg = read_csr(dd, DCC_CFG_PORT_CONFIG);
8502 return (reg >> DCC_CFG_PORT_CONFIG_LINK_STATE_SHIFT)
8503 & DCC_CFG_PORT_CONFIG_LINK_STATE_MASK;
8504 }
8505
set_logical_state(struct hfi1_devdata * dd,u32 chip_lstate)8506 static void set_logical_state(struct hfi1_devdata *dd, u32 chip_lstate)
8507 {
8508 u64 reg;
8509
8510 reg = read_csr(dd, DCC_CFG_PORT_CONFIG);
8511 /* clear current state, set new state */
8512 reg &= ~DCC_CFG_PORT_CONFIG_LINK_STATE_SMASK;
8513 reg |= (u64)chip_lstate << DCC_CFG_PORT_CONFIG_LINK_STATE_SHIFT;
8514 write_csr(dd, DCC_CFG_PORT_CONFIG, reg);
8515 }
8516
8517 /*
8518 * Use the 8051 to read a LCB CSR.
8519 */
read_lcb_via_8051(struct hfi1_devdata * dd,u32 addr,u64 * data)8520 static int read_lcb_via_8051(struct hfi1_devdata *dd, u32 addr, u64 *data)
8521 {
8522 u32 regno;
8523 int ret;
8524
8525 if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR) {
8526 if (acquire_lcb_access(dd, 0) == 0) {
8527 *data = read_csr(dd, addr);
8528 release_lcb_access(dd, 0);
8529 return 0;
8530 }
8531 return -EBUSY;
8532 }
8533
8534 /* register is an index of LCB registers: (offset - base) / 8 */
8535 regno = (addr - DC_LCB_CFG_RUN) >> 3;
8536 ret = do_8051_command(dd, HCMD_READ_LCB_CSR, regno, data);
8537 if (ret != HCMD_SUCCESS)
8538 return -EBUSY;
8539 return 0;
8540 }
8541
8542 /*
8543 * Provide a cache for some of the LCB registers in case the LCB is
8544 * unavailable.
8545 * (The LCB is unavailable in certain link states, for example.)
8546 */
8547 struct lcb_datum {
8548 u32 off;
8549 u64 val;
8550 };
8551
8552 static struct lcb_datum lcb_cache[] = {
8553 { DC_LCB_ERR_INFO_RX_REPLAY_CNT, 0},
8554 { DC_LCB_ERR_INFO_SEQ_CRC_CNT, 0 },
8555 { DC_LCB_ERR_INFO_REINIT_FROM_PEER_CNT, 0 },
8556 };
8557
update_lcb_cache(struct hfi1_devdata * dd)8558 static void update_lcb_cache(struct hfi1_devdata *dd)
8559 {
8560 int i;
8561 int ret;
8562 u64 val;
8563
8564 for (i = 0; i < ARRAY_SIZE(lcb_cache); i++) {
8565 ret = read_lcb_csr(dd, lcb_cache[i].off, &val);
8566
8567 /* Update if we get good data */
8568 if (likely(ret != -EBUSY))
8569 lcb_cache[i].val = val;
8570 }
8571 }
8572
read_lcb_cache(u32 off,u64 * val)8573 static int read_lcb_cache(u32 off, u64 *val)
8574 {
8575 int i;
8576
8577 for (i = 0; i < ARRAY_SIZE(lcb_cache); i++) {
8578 if (lcb_cache[i].off == off) {
8579 *val = lcb_cache[i].val;
8580 return 0;
8581 }
8582 }
8583
8584 pr_warn("%s bad offset 0x%x\n", __func__, off);
8585 return -1;
8586 }
8587
8588 /*
8589 * Read an LCB CSR. Access may not be in host control, so check.
8590 * Return 0 on success, -EBUSY on failure.
8591 */
read_lcb_csr(struct hfi1_devdata * dd,u32 addr,u64 * data)8592 int read_lcb_csr(struct hfi1_devdata *dd, u32 addr, u64 *data)
8593 {
8594 struct hfi1_pportdata *ppd = dd->pport;
8595
8596 /* if up, go through the 8051 for the value */
8597 if (ppd->host_link_state & HLS_UP)
8598 return read_lcb_via_8051(dd, addr, data);
8599 /* if going up or down, check the cache, otherwise, no access */
8600 if (ppd->host_link_state & (HLS_GOING_UP | HLS_GOING_OFFLINE)) {
8601 if (read_lcb_cache(addr, data))
8602 return -EBUSY;
8603 return 0;
8604 }
8605
8606 /* otherwise, host has access */
8607 *data = read_csr(dd, addr);
8608 return 0;
8609 }
8610
8611 /*
8612 * Use the 8051 to write a LCB CSR.
8613 */
write_lcb_via_8051(struct hfi1_devdata * dd,u32 addr,u64 data)8614 static int write_lcb_via_8051(struct hfi1_devdata *dd, u32 addr, u64 data)
8615 {
8616 u32 regno;
8617 int ret;
8618
8619 if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR ||
8620 (dd->dc8051_ver < dc8051_ver(0, 20, 0))) {
8621 if (acquire_lcb_access(dd, 0) == 0) {
8622 write_csr(dd, addr, data);
8623 release_lcb_access(dd, 0);
8624 return 0;
8625 }
8626 return -EBUSY;
8627 }
8628
8629 /* register is an index of LCB registers: (offset - base) / 8 */
8630 regno = (addr - DC_LCB_CFG_RUN) >> 3;
8631 ret = do_8051_command(dd, HCMD_WRITE_LCB_CSR, regno, &data);
8632 if (ret != HCMD_SUCCESS)
8633 return -EBUSY;
8634 return 0;
8635 }
8636
8637 /*
8638 * Write an LCB CSR. Access may not be in host control, so check.
8639 * Return 0 on success, -EBUSY on failure.
8640 */
write_lcb_csr(struct hfi1_devdata * dd,u32 addr,u64 data)8641 int write_lcb_csr(struct hfi1_devdata *dd, u32 addr, u64 data)
8642 {
8643 struct hfi1_pportdata *ppd = dd->pport;
8644
8645 /* if up, go through the 8051 for the value */
8646 if (ppd->host_link_state & HLS_UP)
8647 return write_lcb_via_8051(dd, addr, data);
8648 /* if going up or down, no access */
8649 if (ppd->host_link_state & (HLS_GOING_UP | HLS_GOING_OFFLINE))
8650 return -EBUSY;
8651 /* otherwise, host has access */
8652 write_csr(dd, addr, data);
8653 return 0;
8654 }
8655
8656 /*
8657 * Returns:
8658 * < 0 = Linux error, not able to get access
8659 * > 0 = 8051 command RETURN_CODE
8660 */
do_8051_command(struct hfi1_devdata * dd,u32 type,u64 in_data,u64 * out_data)8661 static int do_8051_command(struct hfi1_devdata *dd, u32 type, u64 in_data,
8662 u64 *out_data)
8663 {
8664 u64 reg, completed;
8665 int return_code;
8666 unsigned long timeout;
8667
8668 hfi1_cdbg(DC8051, "type %d, data 0x%012llx", type, in_data);
8669
8670 mutex_lock(&dd->dc8051_lock);
8671
8672 /* We can't send any commands to the 8051 if it's in reset */
8673 if (dd->dc_shutdown) {
8674 return_code = -ENODEV;
8675 goto fail;
8676 }
8677
8678 /*
8679 * If an 8051 host command timed out previously, then the 8051 is
8680 * stuck.
8681 *
8682 * On first timeout, attempt to reset and restart the entire DC
8683 * block (including 8051). (Is this too big of a hammer?)
8684 *
8685 * If the 8051 times out a second time, the reset did not bring it
8686 * back to healthy life. In that case, fail any subsequent commands.
8687 */
8688 if (dd->dc8051_timed_out) {
8689 if (dd->dc8051_timed_out > 1) {
8690 dd_dev_err(dd,
8691 "Previous 8051 host command timed out, skipping command %u\n",
8692 type);
8693 return_code = -ENXIO;
8694 goto fail;
8695 }
8696 _dc_shutdown(dd);
8697 _dc_start(dd);
8698 }
8699
8700 /*
8701 * If there is no timeout, then the 8051 command interface is
8702 * waiting for a command.
8703 */
8704
8705 /*
8706 * When writing a LCB CSR, out_data contains the full value to
8707 * to be written, while in_data contains the relative LCB
8708 * address in 7:0. Do the work here, rather than the caller,
8709 * of distrubting the write data to where it needs to go:
8710 *
8711 * Write data
8712 * 39:00 -> in_data[47:8]
8713 * 47:40 -> DC8051_CFG_EXT_DEV_0.RETURN_CODE
8714 * 63:48 -> DC8051_CFG_EXT_DEV_0.RSP_DATA
8715 */
8716 if (type == HCMD_WRITE_LCB_CSR) {
8717 in_data |= ((*out_data) & 0xffffffffffull) << 8;
8718 /* must preserve COMPLETED - it is tied to hardware */
8719 reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_0);
8720 reg &= DC_DC8051_CFG_EXT_DEV_0_COMPLETED_SMASK;
8721 reg |= ((((*out_data) >> 40) & 0xff) <<
8722 DC_DC8051_CFG_EXT_DEV_0_RETURN_CODE_SHIFT)
8723 | ((((*out_data) >> 48) & 0xffff) <<
8724 DC_DC8051_CFG_EXT_DEV_0_RSP_DATA_SHIFT);
8725 write_csr(dd, DC_DC8051_CFG_EXT_DEV_0, reg);
8726 }
8727
8728 /*
8729 * Do two writes: the first to stabilize the type and req_data, the
8730 * second to activate.
8731 */
8732 reg = ((u64)type & DC_DC8051_CFG_HOST_CMD_0_REQ_TYPE_MASK)
8733 << DC_DC8051_CFG_HOST_CMD_0_REQ_TYPE_SHIFT
8734 | (in_data & DC_DC8051_CFG_HOST_CMD_0_REQ_DATA_MASK)
8735 << DC_DC8051_CFG_HOST_CMD_0_REQ_DATA_SHIFT;
8736 write_csr(dd, DC_DC8051_CFG_HOST_CMD_0, reg);
8737 reg |= DC_DC8051_CFG_HOST_CMD_0_REQ_NEW_SMASK;
8738 write_csr(dd, DC_DC8051_CFG_HOST_CMD_0, reg);
8739
8740 /* wait for completion, alternate: interrupt */
8741 timeout = jiffies + msecs_to_jiffies(DC8051_COMMAND_TIMEOUT);
8742 while (1) {
8743 reg = read_csr(dd, DC_DC8051_CFG_HOST_CMD_1);
8744 completed = reg & DC_DC8051_CFG_HOST_CMD_1_COMPLETED_SMASK;
8745 if (completed)
8746 break;
8747 if (time_after(jiffies, timeout)) {
8748 dd->dc8051_timed_out++;
8749 dd_dev_err(dd, "8051 host command %u timeout\n", type);
8750 if (out_data)
8751 *out_data = 0;
8752 return_code = -ETIMEDOUT;
8753 goto fail;
8754 }
8755 udelay(2);
8756 }
8757
8758 if (out_data) {
8759 *out_data = (reg >> DC_DC8051_CFG_HOST_CMD_1_RSP_DATA_SHIFT)
8760 & DC_DC8051_CFG_HOST_CMD_1_RSP_DATA_MASK;
8761 if (type == HCMD_READ_LCB_CSR) {
8762 /* top 16 bits are in a different register */
8763 *out_data |= (read_csr(dd, DC_DC8051_CFG_EXT_DEV_1)
8764 & DC_DC8051_CFG_EXT_DEV_1_REQ_DATA_SMASK)
8765 << (48
8766 - DC_DC8051_CFG_EXT_DEV_1_REQ_DATA_SHIFT);
8767 }
8768 }
8769 return_code = (reg >> DC_DC8051_CFG_HOST_CMD_1_RETURN_CODE_SHIFT)
8770 & DC_DC8051_CFG_HOST_CMD_1_RETURN_CODE_MASK;
8771 dd->dc8051_timed_out = 0;
8772 /*
8773 * Clear command for next user.
8774 */
8775 write_csr(dd, DC_DC8051_CFG_HOST_CMD_0, 0);
8776
8777 fail:
8778 mutex_unlock(&dd->dc8051_lock);
8779 return return_code;
8780 }
8781
set_physical_link_state(struct hfi1_devdata * dd,u64 state)8782 static int set_physical_link_state(struct hfi1_devdata *dd, u64 state)
8783 {
8784 return do_8051_command(dd, HCMD_CHANGE_PHY_STATE, state, NULL);
8785 }
8786
load_8051_config(struct hfi1_devdata * dd,u8 field_id,u8 lane_id,u32 config_data)8787 int load_8051_config(struct hfi1_devdata *dd, u8 field_id,
8788 u8 lane_id, u32 config_data)
8789 {
8790 u64 data;
8791 int ret;
8792
8793 data = (u64)field_id << LOAD_DATA_FIELD_ID_SHIFT
8794 | (u64)lane_id << LOAD_DATA_LANE_ID_SHIFT
8795 | (u64)config_data << LOAD_DATA_DATA_SHIFT;
8796 ret = do_8051_command(dd, HCMD_LOAD_CONFIG_DATA, data, NULL);
8797 if (ret != HCMD_SUCCESS) {
8798 dd_dev_err(dd,
8799 "load 8051 config: field id %d, lane %d, err %d\n",
8800 (int)field_id, (int)lane_id, ret);
8801 }
8802 return ret;
8803 }
8804
8805 /*
8806 * Read the 8051 firmware "registers". Use the RAM directly. Always
8807 * set the result, even on error.
8808 * Return 0 on success, -errno on failure
8809 */
read_8051_config(struct hfi1_devdata * dd,u8 field_id,u8 lane_id,u32 * result)8810 int read_8051_config(struct hfi1_devdata *dd, u8 field_id, u8 lane_id,
8811 u32 *result)
8812 {
8813 u64 big_data;
8814 u32 addr;
8815 int ret;
8816
8817 /* address start depends on the lane_id */
8818 if (lane_id < 4)
8819 addr = (4 * NUM_GENERAL_FIELDS)
8820 + (lane_id * 4 * NUM_LANE_FIELDS);
8821 else
8822 addr = 0;
8823 addr += field_id * 4;
8824
8825 /* read is in 8-byte chunks, hardware will truncate the address down */
8826 ret = read_8051_data(dd, addr, 8, &big_data);
8827
8828 if (ret == 0) {
8829 /* extract the 4 bytes we want */
8830 if (addr & 0x4)
8831 *result = (u32)(big_data >> 32);
8832 else
8833 *result = (u32)big_data;
8834 } else {
8835 *result = 0;
8836 dd_dev_err(dd, "%s: direct read failed, lane %d, field %d!\n",
8837 __func__, lane_id, field_id);
8838 }
8839
8840 return ret;
8841 }
8842
write_vc_local_phy(struct hfi1_devdata * dd,u8 power_management,u8 continuous)8843 static int write_vc_local_phy(struct hfi1_devdata *dd, u8 power_management,
8844 u8 continuous)
8845 {
8846 u32 frame;
8847
8848 frame = continuous << CONTINIOUS_REMOTE_UPDATE_SUPPORT_SHIFT
8849 | power_management << POWER_MANAGEMENT_SHIFT;
8850 return load_8051_config(dd, VERIFY_CAP_LOCAL_PHY,
8851 GENERAL_CONFIG, frame);
8852 }
8853
write_vc_local_fabric(struct hfi1_devdata * dd,u8 vau,u8 z,u8 vcu,u16 vl15buf,u8 crc_sizes)8854 static int write_vc_local_fabric(struct hfi1_devdata *dd, u8 vau, u8 z, u8 vcu,
8855 u16 vl15buf, u8 crc_sizes)
8856 {
8857 u32 frame;
8858
8859 frame = (u32)vau << VAU_SHIFT
8860 | (u32)z << Z_SHIFT
8861 | (u32)vcu << VCU_SHIFT
8862 | (u32)vl15buf << VL15BUF_SHIFT
8863 | (u32)crc_sizes << CRC_SIZES_SHIFT;
8864 return load_8051_config(dd, VERIFY_CAP_LOCAL_FABRIC,
8865 GENERAL_CONFIG, frame);
8866 }
8867
read_vc_local_link_mode(struct hfi1_devdata * dd,u8 * misc_bits,u8 * flag_bits,u16 * link_widths)8868 static void read_vc_local_link_mode(struct hfi1_devdata *dd, u8 *misc_bits,
8869 u8 *flag_bits, u16 *link_widths)
8870 {
8871 u32 frame;
8872
8873 read_8051_config(dd, VERIFY_CAP_LOCAL_LINK_MODE, GENERAL_CONFIG,
8874 &frame);
8875 *misc_bits = (frame >> MISC_CONFIG_BITS_SHIFT) & MISC_CONFIG_BITS_MASK;
8876 *flag_bits = (frame >> LOCAL_FLAG_BITS_SHIFT) & LOCAL_FLAG_BITS_MASK;
8877 *link_widths = (frame >> LINK_WIDTH_SHIFT) & LINK_WIDTH_MASK;
8878 }
8879
write_vc_local_link_mode(struct hfi1_devdata * dd,u8 misc_bits,u8 flag_bits,u16 link_widths)8880 static int write_vc_local_link_mode(struct hfi1_devdata *dd,
8881 u8 misc_bits,
8882 u8 flag_bits,
8883 u16 link_widths)
8884 {
8885 u32 frame;
8886
8887 frame = (u32)misc_bits << MISC_CONFIG_BITS_SHIFT
8888 | (u32)flag_bits << LOCAL_FLAG_BITS_SHIFT
8889 | (u32)link_widths << LINK_WIDTH_SHIFT;
8890 return load_8051_config(dd, VERIFY_CAP_LOCAL_LINK_MODE, GENERAL_CONFIG,
8891 frame);
8892 }
8893
write_local_device_id(struct hfi1_devdata * dd,u16 device_id,u8 device_rev)8894 static int write_local_device_id(struct hfi1_devdata *dd, u16 device_id,
8895 u8 device_rev)
8896 {
8897 u32 frame;
8898
8899 frame = ((u32)device_id << LOCAL_DEVICE_ID_SHIFT)
8900 | ((u32)device_rev << LOCAL_DEVICE_REV_SHIFT);
8901 return load_8051_config(dd, LOCAL_DEVICE_ID, GENERAL_CONFIG, frame);
8902 }
8903
read_remote_device_id(struct hfi1_devdata * dd,u16 * device_id,u8 * device_rev)8904 static void read_remote_device_id(struct hfi1_devdata *dd, u16 *device_id,
8905 u8 *device_rev)
8906 {
8907 u32 frame;
8908
8909 read_8051_config(dd, REMOTE_DEVICE_ID, GENERAL_CONFIG, &frame);
8910 *device_id = (frame >> REMOTE_DEVICE_ID_SHIFT) & REMOTE_DEVICE_ID_MASK;
8911 *device_rev = (frame >> REMOTE_DEVICE_REV_SHIFT)
8912 & REMOTE_DEVICE_REV_MASK;
8913 }
8914
write_host_interface_version(struct hfi1_devdata * dd,u8 version)8915 int write_host_interface_version(struct hfi1_devdata *dd, u8 version)
8916 {
8917 u32 frame;
8918 u32 mask;
8919
8920 mask = (HOST_INTERFACE_VERSION_MASK << HOST_INTERFACE_VERSION_SHIFT);
8921 read_8051_config(dd, RESERVED_REGISTERS, GENERAL_CONFIG, &frame);
8922 /* Clear, then set field */
8923 frame &= ~mask;
8924 frame |= ((u32)version << HOST_INTERFACE_VERSION_SHIFT);
8925 return load_8051_config(dd, RESERVED_REGISTERS, GENERAL_CONFIG,
8926 frame);
8927 }
8928
read_misc_status(struct hfi1_devdata * dd,u8 * ver_major,u8 * ver_minor,u8 * ver_patch)8929 void read_misc_status(struct hfi1_devdata *dd, u8 *ver_major, u8 *ver_minor,
8930 u8 *ver_patch)
8931 {
8932 u32 frame;
8933
8934 read_8051_config(dd, MISC_STATUS, GENERAL_CONFIG, &frame);
8935 *ver_major = (frame >> STS_FM_VERSION_MAJOR_SHIFT) &
8936 STS_FM_VERSION_MAJOR_MASK;
8937 *ver_minor = (frame >> STS_FM_VERSION_MINOR_SHIFT) &
8938 STS_FM_VERSION_MINOR_MASK;
8939
8940 read_8051_config(dd, VERSION_PATCH, GENERAL_CONFIG, &frame);
8941 *ver_patch = (frame >> STS_FM_VERSION_PATCH_SHIFT) &
8942 STS_FM_VERSION_PATCH_MASK;
8943 }
8944
read_vc_remote_phy(struct hfi1_devdata * dd,u8 * power_management,u8 * continuous)8945 static void read_vc_remote_phy(struct hfi1_devdata *dd, u8 *power_management,
8946 u8 *continuous)
8947 {
8948 u32 frame;
8949
8950 read_8051_config(dd, VERIFY_CAP_REMOTE_PHY, GENERAL_CONFIG, &frame);
8951 *power_management = (frame >> POWER_MANAGEMENT_SHIFT)
8952 & POWER_MANAGEMENT_MASK;
8953 *continuous = (frame >> CONTINIOUS_REMOTE_UPDATE_SUPPORT_SHIFT)
8954 & CONTINIOUS_REMOTE_UPDATE_SUPPORT_MASK;
8955 }
8956
read_vc_remote_fabric(struct hfi1_devdata * dd,u8 * vau,u8 * z,u8 * vcu,u16 * vl15buf,u8 * crc_sizes)8957 static void read_vc_remote_fabric(struct hfi1_devdata *dd, u8 *vau, u8 *z,
8958 u8 *vcu, u16 *vl15buf, u8 *crc_sizes)
8959 {
8960 u32 frame;
8961
8962 read_8051_config(dd, VERIFY_CAP_REMOTE_FABRIC, GENERAL_CONFIG, &frame);
8963 *vau = (frame >> VAU_SHIFT) & VAU_MASK;
8964 *z = (frame >> Z_SHIFT) & Z_MASK;
8965 *vcu = (frame >> VCU_SHIFT) & VCU_MASK;
8966 *vl15buf = (frame >> VL15BUF_SHIFT) & VL15BUF_MASK;
8967 *crc_sizes = (frame >> CRC_SIZES_SHIFT) & CRC_SIZES_MASK;
8968 }
8969
read_vc_remote_link_width(struct hfi1_devdata * dd,u8 * remote_tx_rate,u16 * link_widths)8970 static void read_vc_remote_link_width(struct hfi1_devdata *dd,
8971 u8 *remote_tx_rate,
8972 u16 *link_widths)
8973 {
8974 u32 frame;
8975
8976 read_8051_config(dd, VERIFY_CAP_REMOTE_LINK_WIDTH, GENERAL_CONFIG,
8977 &frame);
8978 *remote_tx_rate = (frame >> REMOTE_TX_RATE_SHIFT)
8979 & REMOTE_TX_RATE_MASK;
8980 *link_widths = (frame >> LINK_WIDTH_SHIFT) & LINK_WIDTH_MASK;
8981 }
8982
read_local_lni(struct hfi1_devdata * dd,u8 * enable_lane_rx)8983 static void read_local_lni(struct hfi1_devdata *dd, u8 *enable_lane_rx)
8984 {
8985 u32 frame;
8986
8987 read_8051_config(dd, LOCAL_LNI_INFO, GENERAL_CONFIG, &frame);
8988 *enable_lane_rx = (frame >> ENABLE_LANE_RX_SHIFT) & ENABLE_LANE_RX_MASK;
8989 }
8990
read_last_local_state(struct hfi1_devdata * dd,u32 * lls)8991 static void read_last_local_state(struct hfi1_devdata *dd, u32 *lls)
8992 {
8993 read_8051_config(dd, LAST_LOCAL_STATE_COMPLETE, GENERAL_CONFIG, lls);
8994 }
8995
read_last_remote_state(struct hfi1_devdata * dd,u32 * lrs)8996 static void read_last_remote_state(struct hfi1_devdata *dd, u32 *lrs)
8997 {
8998 read_8051_config(dd, LAST_REMOTE_STATE_COMPLETE, GENERAL_CONFIG, lrs);
8999 }
9000
hfi1_read_link_quality(struct hfi1_devdata * dd,u8 * link_quality)9001 void hfi1_read_link_quality(struct hfi1_devdata *dd, u8 *link_quality)
9002 {
9003 u32 frame;
9004 int ret;
9005
9006 *link_quality = 0;
9007 if (dd->pport->host_link_state & HLS_UP) {
9008 ret = read_8051_config(dd, LINK_QUALITY_INFO, GENERAL_CONFIG,
9009 &frame);
9010 if (ret == 0)
9011 *link_quality = (frame >> LINK_QUALITY_SHIFT)
9012 & LINK_QUALITY_MASK;
9013 }
9014 }
9015
read_planned_down_reason_code(struct hfi1_devdata * dd,u8 * pdrrc)9016 static void read_planned_down_reason_code(struct hfi1_devdata *dd, u8 *pdrrc)
9017 {
9018 u32 frame;
9019
9020 read_8051_config(dd, LINK_QUALITY_INFO, GENERAL_CONFIG, &frame);
9021 *pdrrc = (frame >> DOWN_REMOTE_REASON_SHIFT) & DOWN_REMOTE_REASON_MASK;
9022 }
9023
read_link_down_reason(struct hfi1_devdata * dd,u8 * ldr)9024 static void read_link_down_reason(struct hfi1_devdata *dd, u8 *ldr)
9025 {
9026 u32 frame;
9027
9028 read_8051_config(dd, LINK_DOWN_REASON, GENERAL_CONFIG, &frame);
9029 *ldr = (frame & 0xff);
9030 }
9031
read_tx_settings(struct hfi1_devdata * dd,u8 * enable_lane_tx,u8 * tx_polarity_inversion,u8 * rx_polarity_inversion,u8 * max_rate)9032 static int read_tx_settings(struct hfi1_devdata *dd,
9033 u8 *enable_lane_tx,
9034 u8 *tx_polarity_inversion,
9035 u8 *rx_polarity_inversion,
9036 u8 *max_rate)
9037 {
9038 u32 frame;
9039 int ret;
9040
9041 ret = read_8051_config(dd, TX_SETTINGS, GENERAL_CONFIG, &frame);
9042 *enable_lane_tx = (frame >> ENABLE_LANE_TX_SHIFT)
9043 & ENABLE_LANE_TX_MASK;
9044 *tx_polarity_inversion = (frame >> TX_POLARITY_INVERSION_SHIFT)
9045 & TX_POLARITY_INVERSION_MASK;
9046 *rx_polarity_inversion = (frame >> RX_POLARITY_INVERSION_SHIFT)
9047 & RX_POLARITY_INVERSION_MASK;
9048 *max_rate = (frame >> MAX_RATE_SHIFT) & MAX_RATE_MASK;
9049 return ret;
9050 }
9051
write_tx_settings(struct hfi1_devdata * dd,u8 enable_lane_tx,u8 tx_polarity_inversion,u8 rx_polarity_inversion,u8 max_rate)9052 static int write_tx_settings(struct hfi1_devdata *dd,
9053 u8 enable_lane_tx,
9054 u8 tx_polarity_inversion,
9055 u8 rx_polarity_inversion,
9056 u8 max_rate)
9057 {
9058 u32 frame;
9059
9060 /* no need to mask, all variable sizes match field widths */
9061 frame = enable_lane_tx << ENABLE_LANE_TX_SHIFT
9062 | tx_polarity_inversion << TX_POLARITY_INVERSION_SHIFT
9063 | rx_polarity_inversion << RX_POLARITY_INVERSION_SHIFT
9064 | max_rate << MAX_RATE_SHIFT;
9065 return load_8051_config(dd, TX_SETTINGS, GENERAL_CONFIG, frame);
9066 }
9067
9068 /*
9069 * Read an idle LCB message.
9070 *
9071 * Returns 0 on success, -EINVAL on error
9072 */
read_idle_message(struct hfi1_devdata * dd,u64 type,u64 * data_out)9073 static int read_idle_message(struct hfi1_devdata *dd, u64 type, u64 *data_out)
9074 {
9075 int ret;
9076
9077 ret = do_8051_command(dd, HCMD_READ_LCB_IDLE_MSG, type, data_out);
9078 if (ret != HCMD_SUCCESS) {
9079 dd_dev_err(dd, "read idle message: type %d, err %d\n",
9080 (u32)type, ret);
9081 return -EINVAL;
9082 }
9083 dd_dev_info(dd, "%s: read idle message 0x%llx\n", __func__, *data_out);
9084 /* return only the payload as we already know the type */
9085 *data_out >>= IDLE_PAYLOAD_SHIFT;
9086 return 0;
9087 }
9088
9089 /*
9090 * Read an idle SMA message. To be done in response to a notification from
9091 * the 8051.
9092 *
9093 * Returns 0 on success, -EINVAL on error
9094 */
read_idle_sma(struct hfi1_devdata * dd,u64 * data)9095 static int read_idle_sma(struct hfi1_devdata *dd, u64 *data)
9096 {
9097 return read_idle_message(dd, (u64)IDLE_SMA << IDLE_MSG_TYPE_SHIFT,
9098 data);
9099 }
9100
9101 /*
9102 * Send an idle LCB message.
9103 *
9104 * Returns 0 on success, -EINVAL on error
9105 */
send_idle_message(struct hfi1_devdata * dd,u64 data)9106 static int send_idle_message(struct hfi1_devdata *dd, u64 data)
9107 {
9108 int ret;
9109
9110 dd_dev_info(dd, "%s: sending idle message 0x%llx\n", __func__, data);
9111 ret = do_8051_command(dd, HCMD_SEND_LCB_IDLE_MSG, data, NULL);
9112 if (ret != HCMD_SUCCESS) {
9113 dd_dev_err(dd, "send idle message: data 0x%llx, err %d\n",
9114 data, ret);
9115 return -EINVAL;
9116 }
9117 return 0;
9118 }
9119
9120 /*
9121 * Send an idle SMA message.
9122 *
9123 * Returns 0 on success, -EINVAL on error
9124 */
send_idle_sma(struct hfi1_devdata * dd,u64 message)9125 int send_idle_sma(struct hfi1_devdata *dd, u64 message)
9126 {
9127 u64 data;
9128
9129 data = ((message & IDLE_PAYLOAD_MASK) << IDLE_PAYLOAD_SHIFT) |
9130 ((u64)IDLE_SMA << IDLE_MSG_TYPE_SHIFT);
9131 return send_idle_message(dd, data);
9132 }
9133
9134 /*
9135 * Initialize the LCB then do a quick link up. This may or may not be
9136 * in loopback.
9137 *
9138 * return 0 on success, -errno on error
9139 */
do_quick_linkup(struct hfi1_devdata * dd)9140 static int do_quick_linkup(struct hfi1_devdata *dd)
9141 {
9142 int ret;
9143
9144 lcb_shutdown(dd, 0);
9145
9146 if (loopback) {
9147 /* LCB_CFG_LOOPBACK.VAL = 2 */
9148 /* LCB_CFG_LANE_WIDTH.VAL = 0 */
9149 write_csr(dd, DC_LCB_CFG_LOOPBACK,
9150 IB_PACKET_TYPE << DC_LCB_CFG_LOOPBACK_VAL_SHIFT);
9151 write_csr(dd, DC_LCB_CFG_LANE_WIDTH, 0);
9152 }
9153
9154 /* start the LCBs */
9155 /* LCB_CFG_TX_FIFOS_RESET.VAL = 0 */
9156 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0);
9157
9158 /* simulator only loopback steps */
9159 if (loopback && dd->icode == ICODE_FUNCTIONAL_SIMULATOR) {
9160 /* LCB_CFG_RUN.EN = 1 */
9161 write_csr(dd, DC_LCB_CFG_RUN,
9162 1ull << DC_LCB_CFG_RUN_EN_SHIFT);
9163
9164 ret = wait_link_transfer_active(dd, 10);
9165 if (ret)
9166 return ret;
9167
9168 write_csr(dd, DC_LCB_CFG_ALLOW_LINK_UP,
9169 1ull << DC_LCB_CFG_ALLOW_LINK_UP_VAL_SHIFT);
9170 }
9171
9172 if (!loopback) {
9173 /*
9174 * When doing quick linkup and not in loopback, both
9175 * sides must be done with LCB set-up before either
9176 * starts the quick linkup. Put a delay here so that
9177 * both sides can be started and have a chance to be
9178 * done with LCB set up before resuming.
9179 */
9180 dd_dev_err(dd,
9181 "Pausing for peer to be finished with LCB set up\n");
9182 msleep(5000);
9183 dd_dev_err(dd, "Continuing with quick linkup\n");
9184 }
9185
9186 write_csr(dd, DC_LCB_ERR_EN, 0); /* mask LCB errors */
9187 set_8051_lcb_access(dd);
9188
9189 /*
9190 * State "quick" LinkUp request sets the physical link state to
9191 * LinkUp without a verify capability sequence.
9192 * This state is in simulator v37 and later.
9193 */
9194 ret = set_physical_link_state(dd, PLS_QUICK_LINKUP);
9195 if (ret != HCMD_SUCCESS) {
9196 dd_dev_err(dd,
9197 "%s: set physical link state to quick LinkUp failed with return %d\n",
9198 __func__, ret);
9199
9200 set_host_lcb_access(dd);
9201 write_csr(dd, DC_LCB_ERR_EN, ~0ull); /* watch LCB errors */
9202
9203 if (ret >= 0)
9204 ret = -EINVAL;
9205 return ret;
9206 }
9207
9208 return 0; /* success */
9209 }
9210
9211 /*
9212 * Do all special steps to set up loopback.
9213 */
init_loopback(struct hfi1_devdata * dd)9214 static int init_loopback(struct hfi1_devdata *dd)
9215 {
9216 dd_dev_info(dd, "Entering loopback mode\n");
9217
9218 /* all loopbacks should disable self GUID check */
9219 write_csr(dd, DC_DC8051_CFG_MODE,
9220 (read_csr(dd, DC_DC8051_CFG_MODE) | DISABLE_SELF_GUID_CHECK));
9221
9222 /*
9223 * The simulator has only one loopback option - LCB. Switch
9224 * to that option, which includes quick link up.
9225 *
9226 * Accept all valid loopback values.
9227 */
9228 if ((dd->icode == ICODE_FUNCTIONAL_SIMULATOR) &&
9229 (loopback == LOOPBACK_SERDES || loopback == LOOPBACK_LCB ||
9230 loopback == LOOPBACK_CABLE)) {
9231 loopback = LOOPBACK_LCB;
9232 quick_linkup = 1;
9233 return 0;
9234 }
9235
9236 /*
9237 * SerDes loopback init sequence is handled in set_local_link_attributes
9238 */
9239 if (loopback == LOOPBACK_SERDES)
9240 return 0;
9241
9242 /* LCB loopback - handled at poll time */
9243 if (loopback == LOOPBACK_LCB) {
9244 quick_linkup = 1; /* LCB is always quick linkup */
9245
9246 /* not supported in emulation due to emulation RTL changes */
9247 if (dd->icode == ICODE_FPGA_EMULATION) {
9248 dd_dev_err(dd,
9249 "LCB loopback not supported in emulation\n");
9250 return -EINVAL;
9251 }
9252 return 0;
9253 }
9254
9255 /* external cable loopback requires no extra steps */
9256 if (loopback == LOOPBACK_CABLE)
9257 return 0;
9258
9259 dd_dev_err(dd, "Invalid loopback mode %d\n", loopback);
9260 return -EINVAL;
9261 }
9262
9263 /*
9264 * Translate from the OPA_LINK_WIDTH handed to us by the FM to bits
9265 * used in the Verify Capability link width attribute.
9266 */
opa_to_vc_link_widths(u16 opa_widths)9267 static u16 opa_to_vc_link_widths(u16 opa_widths)
9268 {
9269 int i;
9270 u16 result = 0;
9271
9272 static const struct link_bits {
9273 u16 from;
9274 u16 to;
9275 } opa_link_xlate[] = {
9276 { OPA_LINK_WIDTH_1X, 1 << (1 - 1) },
9277 { OPA_LINK_WIDTH_2X, 1 << (2 - 1) },
9278 { OPA_LINK_WIDTH_3X, 1 << (3 - 1) },
9279 { OPA_LINK_WIDTH_4X, 1 << (4 - 1) },
9280 };
9281
9282 for (i = 0; i < ARRAY_SIZE(opa_link_xlate); i++) {
9283 if (opa_widths & opa_link_xlate[i].from)
9284 result |= opa_link_xlate[i].to;
9285 }
9286 return result;
9287 }
9288
9289 /*
9290 * Set link attributes before moving to polling.
9291 */
set_local_link_attributes(struct hfi1_pportdata * ppd)9292 static int set_local_link_attributes(struct hfi1_pportdata *ppd)
9293 {
9294 struct hfi1_devdata *dd = ppd->dd;
9295 u8 enable_lane_tx;
9296 u8 tx_polarity_inversion;
9297 u8 rx_polarity_inversion;
9298 int ret;
9299 u32 misc_bits = 0;
9300 /* reset our fabric serdes to clear any lingering problems */
9301 fabric_serdes_reset(dd);
9302
9303 /* set the local tx rate - need to read-modify-write */
9304 ret = read_tx_settings(dd, &enable_lane_tx, &tx_polarity_inversion,
9305 &rx_polarity_inversion, &ppd->local_tx_rate);
9306 if (ret)
9307 goto set_local_link_attributes_fail;
9308
9309 if (dd->dc8051_ver < dc8051_ver(0, 20, 0)) {
9310 /* set the tx rate to the fastest enabled */
9311 if (ppd->link_speed_enabled & OPA_LINK_SPEED_25G)
9312 ppd->local_tx_rate = 1;
9313 else
9314 ppd->local_tx_rate = 0;
9315 } else {
9316 /* set the tx rate to all enabled */
9317 ppd->local_tx_rate = 0;
9318 if (ppd->link_speed_enabled & OPA_LINK_SPEED_25G)
9319 ppd->local_tx_rate |= 2;
9320 if (ppd->link_speed_enabled & OPA_LINK_SPEED_12_5G)
9321 ppd->local_tx_rate |= 1;
9322 }
9323
9324 enable_lane_tx = 0xF; /* enable all four lanes */
9325 ret = write_tx_settings(dd, enable_lane_tx, tx_polarity_inversion,
9326 rx_polarity_inversion, ppd->local_tx_rate);
9327 if (ret != HCMD_SUCCESS)
9328 goto set_local_link_attributes_fail;
9329
9330 ret = write_host_interface_version(dd, HOST_INTERFACE_VERSION);
9331 if (ret != HCMD_SUCCESS) {
9332 dd_dev_err(dd,
9333 "Failed to set host interface version, return 0x%x\n",
9334 ret);
9335 goto set_local_link_attributes_fail;
9336 }
9337
9338 /*
9339 * DC supports continuous updates.
9340 */
9341 ret = write_vc_local_phy(dd,
9342 0 /* no power management */,
9343 1 /* continuous updates */);
9344 if (ret != HCMD_SUCCESS)
9345 goto set_local_link_attributes_fail;
9346
9347 /* z=1 in the next call: AU of 0 is not supported by the hardware */
9348 ret = write_vc_local_fabric(dd, dd->vau, 1, dd->vcu, dd->vl15_init,
9349 ppd->port_crc_mode_enabled);
9350 if (ret != HCMD_SUCCESS)
9351 goto set_local_link_attributes_fail;
9352
9353 /*
9354 * SerDes loopback init sequence requires
9355 * setting bit 0 of MISC_CONFIG_BITS
9356 */
9357 if (loopback == LOOPBACK_SERDES)
9358 misc_bits |= 1 << LOOPBACK_SERDES_CONFIG_BIT_MASK_SHIFT;
9359
9360 /*
9361 * An external device configuration request is used to reset the LCB
9362 * to retry to obtain operational lanes when the first attempt is
9363 * unsuccesful.
9364 */
9365 if (dd->dc8051_ver >= dc8051_ver(1, 25, 0))
9366 misc_bits |= 1 << EXT_CFG_LCB_RESET_SUPPORTED_SHIFT;
9367
9368 ret = write_vc_local_link_mode(dd, misc_bits, 0,
9369 opa_to_vc_link_widths(
9370 ppd->link_width_enabled));
9371 if (ret != HCMD_SUCCESS)
9372 goto set_local_link_attributes_fail;
9373
9374 /* let peer know who we are */
9375 ret = write_local_device_id(dd, dd->pcidev->device, dd->minrev);
9376 if (ret == HCMD_SUCCESS)
9377 return 0;
9378
9379 set_local_link_attributes_fail:
9380 dd_dev_err(dd,
9381 "Failed to set local link attributes, return 0x%x\n",
9382 ret);
9383 return ret;
9384 }
9385
9386 /*
9387 * Call this to start the link.
9388 * Do not do anything if the link is disabled.
9389 * Returns 0 if link is disabled, moved to polling, or the driver is not ready.
9390 */
start_link(struct hfi1_pportdata * ppd)9391 int start_link(struct hfi1_pportdata *ppd)
9392 {
9393 /*
9394 * Tune the SerDes to a ballpark setting for optimal signal and bit
9395 * error rate. Needs to be done before starting the link.
9396 */
9397 tune_serdes(ppd);
9398
9399 if (!ppd->driver_link_ready) {
9400 dd_dev_info(ppd->dd,
9401 "%s: stopping link start because driver is not ready\n",
9402 __func__);
9403 return 0;
9404 }
9405
9406 /*
9407 * FULL_MGMT_P_KEY is cleared from the pkey table, so that the
9408 * pkey table can be configured properly if the HFI unit is connected
9409 * to switch port with MgmtAllowed=NO
9410 */
9411 clear_full_mgmt_pkey(ppd);
9412
9413 return set_link_state(ppd, HLS_DN_POLL);
9414 }
9415
wait_for_qsfp_init(struct hfi1_pportdata * ppd)9416 static void wait_for_qsfp_init(struct hfi1_pportdata *ppd)
9417 {
9418 struct hfi1_devdata *dd = ppd->dd;
9419 u64 mask;
9420 unsigned long timeout;
9421
9422 /*
9423 * Some QSFP cables have a quirk that asserts the IntN line as a side
9424 * effect of power up on plug-in. We ignore this false positive
9425 * interrupt until the module has finished powering up by waiting for
9426 * a minimum timeout of the module inrush initialization time of
9427 * 500 ms (SFF 8679 Table 5-6) to ensure the voltage rails in the
9428 * module have stabilized.
9429 */
9430 msleep(500);
9431
9432 /*
9433 * Check for QSFP interrupt for t_init (SFF 8679 Table 8-1)
9434 */
9435 timeout = jiffies + msecs_to_jiffies(2000);
9436 while (1) {
9437 mask = read_csr(dd, dd->hfi1_id ?
9438 ASIC_QSFP2_IN : ASIC_QSFP1_IN);
9439 if (!(mask & QSFP_HFI0_INT_N))
9440 break;
9441 if (time_after(jiffies, timeout)) {
9442 dd_dev_info(dd, "%s: No IntN detected, reset complete\n",
9443 __func__);
9444 break;
9445 }
9446 udelay(2);
9447 }
9448 }
9449
set_qsfp_int_n(struct hfi1_pportdata * ppd,u8 enable)9450 static void set_qsfp_int_n(struct hfi1_pportdata *ppd, u8 enable)
9451 {
9452 struct hfi1_devdata *dd = ppd->dd;
9453 u64 mask;
9454
9455 mask = read_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK);
9456 if (enable) {
9457 /*
9458 * Clear the status register to avoid an immediate interrupt
9459 * when we re-enable the IntN pin
9460 */
9461 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_CLEAR : ASIC_QSFP1_CLEAR,
9462 QSFP_HFI0_INT_N);
9463 mask |= (u64)QSFP_HFI0_INT_N;
9464 } else {
9465 mask &= ~(u64)QSFP_HFI0_INT_N;
9466 }
9467 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK, mask);
9468 }
9469
reset_qsfp(struct hfi1_pportdata * ppd)9470 int reset_qsfp(struct hfi1_pportdata *ppd)
9471 {
9472 struct hfi1_devdata *dd = ppd->dd;
9473 u64 mask, qsfp_mask;
9474
9475 /* Disable INT_N from triggering QSFP interrupts */
9476 set_qsfp_int_n(ppd, 0);
9477
9478 /* Reset the QSFP */
9479 mask = (u64)QSFP_HFI0_RESET_N;
9480
9481 qsfp_mask = read_csr(dd,
9482 dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT);
9483 qsfp_mask &= ~mask;
9484 write_csr(dd,
9485 dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT, qsfp_mask);
9486
9487 udelay(10);
9488
9489 qsfp_mask |= mask;
9490 write_csr(dd,
9491 dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT, qsfp_mask);
9492
9493 wait_for_qsfp_init(ppd);
9494
9495 /*
9496 * Allow INT_N to trigger the QSFP interrupt to watch
9497 * for alarms and warnings
9498 */
9499 set_qsfp_int_n(ppd, 1);
9500
9501 /*
9502 * After the reset, AOC transmitters are enabled by default. They need
9503 * to be turned off to complete the QSFP setup before they can be
9504 * enabled again.
9505 */
9506 return set_qsfp_tx(ppd, 0);
9507 }
9508
handle_qsfp_error_conditions(struct hfi1_pportdata * ppd,u8 * qsfp_interrupt_status)9509 static int handle_qsfp_error_conditions(struct hfi1_pportdata *ppd,
9510 u8 *qsfp_interrupt_status)
9511 {
9512 struct hfi1_devdata *dd = ppd->dd;
9513
9514 if ((qsfp_interrupt_status[0] & QSFP_HIGH_TEMP_ALARM) ||
9515 (qsfp_interrupt_status[0] & QSFP_HIGH_TEMP_WARNING))
9516 dd_dev_err(dd, "%s: QSFP cable temperature too high\n",
9517 __func__);
9518
9519 if ((qsfp_interrupt_status[0] & QSFP_LOW_TEMP_ALARM) ||
9520 (qsfp_interrupt_status[0] & QSFP_LOW_TEMP_WARNING))
9521 dd_dev_err(dd, "%s: QSFP cable temperature too low\n",
9522 __func__);
9523
9524 /*
9525 * The remaining alarms/warnings don't matter if the link is down.
9526 */
9527 if (ppd->host_link_state & HLS_DOWN)
9528 return 0;
9529
9530 if ((qsfp_interrupt_status[1] & QSFP_HIGH_VCC_ALARM) ||
9531 (qsfp_interrupt_status[1] & QSFP_HIGH_VCC_WARNING))
9532 dd_dev_err(dd, "%s: QSFP supply voltage too high\n",
9533 __func__);
9534
9535 if ((qsfp_interrupt_status[1] & QSFP_LOW_VCC_ALARM) ||
9536 (qsfp_interrupt_status[1] & QSFP_LOW_VCC_WARNING))
9537 dd_dev_err(dd, "%s: QSFP supply voltage too low\n",
9538 __func__);
9539
9540 /* Byte 2 is vendor specific */
9541
9542 if ((qsfp_interrupt_status[3] & QSFP_HIGH_POWER_ALARM) ||
9543 (qsfp_interrupt_status[3] & QSFP_HIGH_POWER_WARNING))
9544 dd_dev_err(dd, "%s: Cable RX channel 1/2 power too high\n",
9545 __func__);
9546
9547 if ((qsfp_interrupt_status[3] & QSFP_LOW_POWER_ALARM) ||
9548 (qsfp_interrupt_status[3] & QSFP_LOW_POWER_WARNING))
9549 dd_dev_err(dd, "%s: Cable RX channel 1/2 power too low\n",
9550 __func__);
9551
9552 if ((qsfp_interrupt_status[4] & QSFP_HIGH_POWER_ALARM) ||
9553 (qsfp_interrupt_status[4] & QSFP_HIGH_POWER_WARNING))
9554 dd_dev_err(dd, "%s: Cable RX channel 3/4 power too high\n",
9555 __func__);
9556
9557 if ((qsfp_interrupt_status[4] & QSFP_LOW_POWER_ALARM) ||
9558 (qsfp_interrupt_status[4] & QSFP_LOW_POWER_WARNING))
9559 dd_dev_err(dd, "%s: Cable RX channel 3/4 power too low\n",
9560 __func__);
9561
9562 if ((qsfp_interrupt_status[5] & QSFP_HIGH_BIAS_ALARM) ||
9563 (qsfp_interrupt_status[5] & QSFP_HIGH_BIAS_WARNING))
9564 dd_dev_err(dd, "%s: Cable TX channel 1/2 bias too high\n",
9565 __func__);
9566
9567 if ((qsfp_interrupt_status[5] & QSFP_LOW_BIAS_ALARM) ||
9568 (qsfp_interrupt_status[5] & QSFP_LOW_BIAS_WARNING))
9569 dd_dev_err(dd, "%s: Cable TX channel 1/2 bias too low\n",
9570 __func__);
9571
9572 if ((qsfp_interrupt_status[6] & QSFP_HIGH_BIAS_ALARM) ||
9573 (qsfp_interrupt_status[6] & QSFP_HIGH_BIAS_WARNING))
9574 dd_dev_err(dd, "%s: Cable TX channel 3/4 bias too high\n",
9575 __func__);
9576
9577 if ((qsfp_interrupt_status[6] & QSFP_LOW_BIAS_ALARM) ||
9578 (qsfp_interrupt_status[6] & QSFP_LOW_BIAS_WARNING))
9579 dd_dev_err(dd, "%s: Cable TX channel 3/4 bias too low\n",
9580 __func__);
9581
9582 if ((qsfp_interrupt_status[7] & QSFP_HIGH_POWER_ALARM) ||
9583 (qsfp_interrupt_status[7] & QSFP_HIGH_POWER_WARNING))
9584 dd_dev_err(dd, "%s: Cable TX channel 1/2 power too high\n",
9585 __func__);
9586
9587 if ((qsfp_interrupt_status[7] & QSFP_LOW_POWER_ALARM) ||
9588 (qsfp_interrupt_status[7] & QSFP_LOW_POWER_WARNING))
9589 dd_dev_err(dd, "%s: Cable TX channel 1/2 power too low\n",
9590 __func__);
9591
9592 if ((qsfp_interrupt_status[8] & QSFP_HIGH_POWER_ALARM) ||
9593 (qsfp_interrupt_status[8] & QSFP_HIGH_POWER_WARNING))
9594 dd_dev_err(dd, "%s: Cable TX channel 3/4 power too high\n",
9595 __func__);
9596
9597 if ((qsfp_interrupt_status[8] & QSFP_LOW_POWER_ALARM) ||
9598 (qsfp_interrupt_status[8] & QSFP_LOW_POWER_WARNING))
9599 dd_dev_err(dd, "%s: Cable TX channel 3/4 power too low\n",
9600 __func__);
9601
9602 /* Bytes 9-10 and 11-12 are reserved */
9603 /* Bytes 13-15 are vendor specific */
9604
9605 return 0;
9606 }
9607
9608 /* This routine will only be scheduled if the QSFP module present is asserted */
qsfp_event(struct work_struct * work)9609 void qsfp_event(struct work_struct *work)
9610 {
9611 struct qsfp_data *qd;
9612 struct hfi1_pportdata *ppd;
9613 struct hfi1_devdata *dd;
9614
9615 qd = container_of(work, struct qsfp_data, qsfp_work);
9616 ppd = qd->ppd;
9617 dd = ppd->dd;
9618
9619 /* Sanity check */
9620 if (!qsfp_mod_present(ppd))
9621 return;
9622
9623 if (ppd->host_link_state == HLS_DN_DISABLE) {
9624 dd_dev_info(ppd->dd,
9625 "%s: stopping link start because link is disabled\n",
9626 __func__);
9627 return;
9628 }
9629
9630 /*
9631 * Turn DC back on after cable has been re-inserted. Up until
9632 * now, the DC has been in reset to save power.
9633 */
9634 dc_start(dd);
9635
9636 if (qd->cache_refresh_required) {
9637 set_qsfp_int_n(ppd, 0);
9638
9639 wait_for_qsfp_init(ppd);
9640
9641 /*
9642 * Allow INT_N to trigger the QSFP interrupt to watch
9643 * for alarms and warnings
9644 */
9645 set_qsfp_int_n(ppd, 1);
9646
9647 start_link(ppd);
9648 }
9649
9650 if (qd->check_interrupt_flags) {
9651 u8 qsfp_interrupt_status[16] = {0,};
9652
9653 if (one_qsfp_read(ppd, dd->hfi1_id, 6,
9654 &qsfp_interrupt_status[0], 16) != 16) {
9655 dd_dev_info(dd,
9656 "%s: Failed to read status of QSFP module\n",
9657 __func__);
9658 } else {
9659 unsigned long flags;
9660
9661 handle_qsfp_error_conditions(
9662 ppd, qsfp_interrupt_status);
9663 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
9664 ppd->qsfp_info.check_interrupt_flags = 0;
9665 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
9666 flags);
9667 }
9668 }
9669 }
9670
init_qsfp_int(struct hfi1_devdata * dd)9671 void init_qsfp_int(struct hfi1_devdata *dd)
9672 {
9673 struct hfi1_pportdata *ppd = dd->pport;
9674 u64 qsfp_mask;
9675
9676 qsfp_mask = (u64)(QSFP_HFI0_INT_N | QSFP_HFI0_MODPRST_N);
9677 /* Clear current status to avoid spurious interrupts */
9678 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_CLEAR : ASIC_QSFP1_CLEAR,
9679 qsfp_mask);
9680 write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK,
9681 qsfp_mask);
9682
9683 set_qsfp_int_n(ppd, 0);
9684
9685 /* Handle active low nature of INT_N and MODPRST_N pins */
9686 if (qsfp_mod_present(ppd))
9687 qsfp_mask &= ~(u64)QSFP_HFI0_MODPRST_N;
9688 write_csr(dd,
9689 dd->hfi1_id ? ASIC_QSFP2_INVERT : ASIC_QSFP1_INVERT,
9690 qsfp_mask);
9691
9692 /* Enable the appropriate QSFP IRQ source */
9693 if (!dd->hfi1_id)
9694 set_intr_bits(dd, QSFP1_INT, QSFP1_INT, true);
9695 else
9696 set_intr_bits(dd, QSFP2_INT, QSFP2_INT, true);
9697 }
9698
9699 /*
9700 * Do a one-time initialize of the LCB block.
9701 */
init_lcb(struct hfi1_devdata * dd)9702 static void init_lcb(struct hfi1_devdata *dd)
9703 {
9704 /* simulator does not correctly handle LCB cclk loopback, skip */
9705 if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR)
9706 return;
9707
9708 /* the DC has been reset earlier in the driver load */
9709
9710 /* set LCB for cclk loopback on the port */
9711 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x01);
9712 write_csr(dd, DC_LCB_CFG_LANE_WIDTH, 0x00);
9713 write_csr(dd, DC_LCB_CFG_REINIT_AS_SLAVE, 0x00);
9714 write_csr(dd, DC_LCB_CFG_CNT_FOR_SKIP_STALL, 0x110);
9715 write_csr(dd, DC_LCB_CFG_CLK_CNTR, 0x08);
9716 write_csr(dd, DC_LCB_CFG_LOOPBACK, 0x02);
9717 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x00);
9718 }
9719
9720 /*
9721 * Perform a test read on the QSFP. Return 0 on success, -ERRNO
9722 * on error.
9723 */
test_qsfp_read(struct hfi1_pportdata * ppd)9724 static int test_qsfp_read(struct hfi1_pportdata *ppd)
9725 {
9726 int ret;
9727 u8 status;
9728
9729 /*
9730 * Report success if not a QSFP or, if it is a QSFP, but the cable is
9731 * not present
9732 */
9733 if (ppd->port_type != PORT_TYPE_QSFP || !qsfp_mod_present(ppd))
9734 return 0;
9735
9736 /* read byte 2, the status byte */
9737 ret = one_qsfp_read(ppd, ppd->dd->hfi1_id, 2, &status, 1);
9738 if (ret < 0)
9739 return ret;
9740 if (ret != 1)
9741 return -EIO;
9742
9743 return 0; /* success */
9744 }
9745
9746 /*
9747 * Values for QSFP retry.
9748 *
9749 * Give up after 10s (20 x 500ms). The overall timeout was empirically
9750 * arrived at from experience on a large cluster.
9751 */
9752 #define MAX_QSFP_RETRIES 20
9753 #define QSFP_RETRY_WAIT 500 /* msec */
9754
9755 /*
9756 * Try a QSFP read. If it fails, schedule a retry for later.
9757 * Called on first link activation after driver load.
9758 */
try_start_link(struct hfi1_pportdata * ppd)9759 static void try_start_link(struct hfi1_pportdata *ppd)
9760 {
9761 if (test_qsfp_read(ppd)) {
9762 /* read failed */
9763 if (ppd->qsfp_retry_count >= MAX_QSFP_RETRIES) {
9764 dd_dev_err(ppd->dd, "QSFP not responding, giving up\n");
9765 return;
9766 }
9767 dd_dev_info(ppd->dd,
9768 "QSFP not responding, waiting and retrying %d\n",
9769 (int)ppd->qsfp_retry_count);
9770 ppd->qsfp_retry_count++;
9771 queue_delayed_work(ppd->link_wq, &ppd->start_link_work,
9772 msecs_to_jiffies(QSFP_RETRY_WAIT));
9773 return;
9774 }
9775 ppd->qsfp_retry_count = 0;
9776
9777 start_link(ppd);
9778 }
9779
9780 /*
9781 * Workqueue function to start the link after a delay.
9782 */
handle_start_link(struct work_struct * work)9783 void handle_start_link(struct work_struct *work)
9784 {
9785 struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
9786 start_link_work.work);
9787 try_start_link(ppd);
9788 }
9789
bringup_serdes(struct hfi1_pportdata * ppd)9790 int bringup_serdes(struct hfi1_pportdata *ppd)
9791 {
9792 struct hfi1_devdata *dd = ppd->dd;
9793 u64 guid;
9794 int ret;
9795
9796 if (HFI1_CAP_IS_KSET(EXTENDED_PSN))
9797 add_rcvctrl(dd, RCV_CTRL_RCV_EXTENDED_PSN_ENABLE_SMASK);
9798
9799 guid = ppd->guids[HFI1_PORT_GUID_INDEX];
9800 if (!guid) {
9801 if (dd->base_guid)
9802 guid = dd->base_guid + ppd->port - 1;
9803 ppd->guids[HFI1_PORT_GUID_INDEX] = guid;
9804 }
9805
9806 /* Set linkinit_reason on power up per OPA spec */
9807 ppd->linkinit_reason = OPA_LINKINIT_REASON_LINKUP;
9808
9809 /* one-time init of the LCB */
9810 init_lcb(dd);
9811
9812 if (loopback) {
9813 ret = init_loopback(dd);
9814 if (ret < 0)
9815 return ret;
9816 }
9817
9818 get_port_type(ppd);
9819 if (ppd->port_type == PORT_TYPE_QSFP) {
9820 set_qsfp_int_n(ppd, 0);
9821 wait_for_qsfp_init(ppd);
9822 set_qsfp_int_n(ppd, 1);
9823 }
9824
9825 try_start_link(ppd);
9826 return 0;
9827 }
9828
hfi1_quiet_serdes(struct hfi1_pportdata * ppd)9829 void hfi1_quiet_serdes(struct hfi1_pportdata *ppd)
9830 {
9831 struct hfi1_devdata *dd = ppd->dd;
9832
9833 /*
9834 * Shut down the link and keep it down. First turn off that the
9835 * driver wants to allow the link to be up (driver_link_ready).
9836 * Then make sure the link is not automatically restarted
9837 * (link_enabled). Cancel any pending restart. And finally
9838 * go offline.
9839 */
9840 ppd->driver_link_ready = 0;
9841 ppd->link_enabled = 0;
9842
9843 ppd->qsfp_retry_count = MAX_QSFP_RETRIES; /* prevent more retries */
9844 flush_delayed_work(&ppd->start_link_work);
9845 cancel_delayed_work_sync(&ppd->start_link_work);
9846
9847 ppd->offline_disabled_reason =
9848 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_REBOOT);
9849 set_link_down_reason(ppd, OPA_LINKDOWN_REASON_REBOOT, 0,
9850 OPA_LINKDOWN_REASON_REBOOT);
9851 set_link_state(ppd, HLS_DN_OFFLINE);
9852
9853 /* disable the port */
9854 clear_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
9855 cancel_work_sync(&ppd->freeze_work);
9856 }
9857
init_cpu_counters(struct hfi1_devdata * dd)9858 static inline int init_cpu_counters(struct hfi1_devdata *dd)
9859 {
9860 struct hfi1_pportdata *ppd;
9861 int i;
9862
9863 ppd = (struct hfi1_pportdata *)(dd + 1);
9864 for (i = 0; i < dd->num_pports; i++, ppd++) {
9865 ppd->ibport_data.rvp.rc_acks = NULL;
9866 ppd->ibport_data.rvp.rc_qacks = NULL;
9867 ppd->ibport_data.rvp.rc_acks = alloc_percpu(u64);
9868 ppd->ibport_data.rvp.rc_qacks = alloc_percpu(u64);
9869 ppd->ibport_data.rvp.rc_delayed_comp = alloc_percpu(u64);
9870 if (!ppd->ibport_data.rvp.rc_acks ||
9871 !ppd->ibport_data.rvp.rc_delayed_comp ||
9872 !ppd->ibport_data.rvp.rc_qacks)
9873 return -ENOMEM;
9874 }
9875
9876 return 0;
9877 }
9878
9879 /*
9880 * index is the index into the receive array
9881 */
hfi1_put_tid(struct hfi1_devdata * dd,u32 index,u32 type,unsigned long pa,u16 order)9882 void hfi1_put_tid(struct hfi1_devdata *dd, u32 index,
9883 u32 type, unsigned long pa, u16 order)
9884 {
9885 u64 reg;
9886
9887 if (!(dd->flags & HFI1_PRESENT))
9888 goto done;
9889
9890 if (type == PT_INVALID || type == PT_INVALID_FLUSH) {
9891 pa = 0;
9892 order = 0;
9893 } else if (type > PT_INVALID) {
9894 dd_dev_err(dd,
9895 "unexpected receive array type %u for index %u, not handled\n",
9896 type, index);
9897 goto done;
9898 }
9899 trace_hfi1_put_tid(dd, index, type, pa, order);
9900
9901 #define RT_ADDR_SHIFT 12 /* 4KB kernel address boundary */
9902 reg = RCV_ARRAY_RT_WRITE_ENABLE_SMASK
9903 | (u64)order << RCV_ARRAY_RT_BUF_SIZE_SHIFT
9904 | ((pa >> RT_ADDR_SHIFT) & RCV_ARRAY_RT_ADDR_MASK)
9905 << RCV_ARRAY_RT_ADDR_SHIFT;
9906 trace_hfi1_write_rcvarray(dd->rcvarray_wc + (index * 8), reg);
9907 writeq(reg, dd->rcvarray_wc + (index * 8));
9908
9909 if (type == PT_EAGER || type == PT_INVALID_FLUSH || (index & 3) == 3)
9910 /*
9911 * Eager entries are written and flushed
9912 *
9913 * Expected entries are flushed every 4 writes
9914 */
9915 flush_wc();
9916 done:
9917 return;
9918 }
9919
hfi1_clear_tids(struct hfi1_ctxtdata * rcd)9920 void hfi1_clear_tids(struct hfi1_ctxtdata *rcd)
9921 {
9922 struct hfi1_devdata *dd = rcd->dd;
9923 u32 i;
9924
9925 /* this could be optimized */
9926 for (i = rcd->eager_base; i < rcd->eager_base +
9927 rcd->egrbufs.alloced; i++)
9928 hfi1_put_tid(dd, i, PT_INVALID, 0, 0);
9929
9930 for (i = rcd->expected_base;
9931 i < rcd->expected_base + rcd->expected_count; i++)
9932 hfi1_put_tid(dd, i, PT_INVALID, 0, 0);
9933 }
9934
9935 static const char * const ib_cfg_name_strings[] = {
9936 "HFI1_IB_CFG_LIDLMC",
9937 "HFI1_IB_CFG_LWID_DG_ENB",
9938 "HFI1_IB_CFG_LWID_ENB",
9939 "HFI1_IB_CFG_LWID",
9940 "HFI1_IB_CFG_SPD_ENB",
9941 "HFI1_IB_CFG_SPD",
9942 "HFI1_IB_CFG_RXPOL_ENB",
9943 "HFI1_IB_CFG_LREV_ENB",
9944 "HFI1_IB_CFG_LINKLATENCY",
9945 "HFI1_IB_CFG_HRTBT",
9946 "HFI1_IB_CFG_OP_VLS",
9947 "HFI1_IB_CFG_VL_HIGH_CAP",
9948 "HFI1_IB_CFG_VL_LOW_CAP",
9949 "HFI1_IB_CFG_OVERRUN_THRESH",
9950 "HFI1_IB_CFG_PHYERR_THRESH",
9951 "HFI1_IB_CFG_LINKDEFAULT",
9952 "HFI1_IB_CFG_PKEYS",
9953 "HFI1_IB_CFG_MTU",
9954 "HFI1_IB_CFG_LSTATE",
9955 "HFI1_IB_CFG_VL_HIGH_LIMIT",
9956 "HFI1_IB_CFG_PMA_TICKS",
9957 "HFI1_IB_CFG_PORT"
9958 };
9959
ib_cfg_name(int which)9960 static const char *ib_cfg_name(int which)
9961 {
9962 if (which < 0 || which >= ARRAY_SIZE(ib_cfg_name_strings))
9963 return "invalid";
9964 return ib_cfg_name_strings[which];
9965 }
9966
hfi1_get_ib_cfg(struct hfi1_pportdata * ppd,int which)9967 int hfi1_get_ib_cfg(struct hfi1_pportdata *ppd, int which)
9968 {
9969 struct hfi1_devdata *dd = ppd->dd;
9970 int val = 0;
9971
9972 switch (which) {
9973 case HFI1_IB_CFG_LWID_ENB: /* allowed Link-width */
9974 val = ppd->link_width_enabled;
9975 break;
9976 case HFI1_IB_CFG_LWID: /* currently active Link-width */
9977 val = ppd->link_width_active;
9978 break;
9979 case HFI1_IB_CFG_SPD_ENB: /* allowed Link speeds */
9980 val = ppd->link_speed_enabled;
9981 break;
9982 case HFI1_IB_CFG_SPD: /* current Link speed */
9983 val = ppd->link_speed_active;
9984 break;
9985
9986 case HFI1_IB_CFG_RXPOL_ENB: /* Auto-RX-polarity enable */
9987 case HFI1_IB_CFG_LREV_ENB: /* Auto-Lane-reversal enable */
9988 case HFI1_IB_CFG_LINKLATENCY:
9989 goto unimplemented;
9990
9991 case HFI1_IB_CFG_OP_VLS:
9992 val = ppd->actual_vls_operational;
9993 break;
9994 case HFI1_IB_CFG_VL_HIGH_CAP: /* VL arb high priority table size */
9995 val = VL_ARB_HIGH_PRIO_TABLE_SIZE;
9996 break;
9997 case HFI1_IB_CFG_VL_LOW_CAP: /* VL arb low priority table size */
9998 val = VL_ARB_LOW_PRIO_TABLE_SIZE;
9999 break;
10000 case HFI1_IB_CFG_OVERRUN_THRESH: /* IB overrun threshold */
10001 val = ppd->overrun_threshold;
10002 break;
10003 case HFI1_IB_CFG_PHYERR_THRESH: /* IB PHY error threshold */
10004 val = ppd->phy_error_threshold;
10005 break;
10006 case HFI1_IB_CFG_LINKDEFAULT: /* IB link default (sleep/poll) */
10007 val = HLS_DEFAULT;
10008 break;
10009
10010 case HFI1_IB_CFG_HRTBT: /* Heartbeat off/enable/auto */
10011 case HFI1_IB_CFG_PMA_TICKS:
10012 default:
10013 unimplemented:
10014 if (HFI1_CAP_IS_KSET(PRINT_UNIMPL))
10015 dd_dev_info(
10016 dd,
10017 "%s: which %s: not implemented\n",
10018 __func__,
10019 ib_cfg_name(which));
10020 break;
10021 }
10022
10023 return val;
10024 }
10025
10026 /*
10027 * The largest MAD packet size.
10028 */
10029 #define MAX_MAD_PACKET 2048
10030
10031 /*
10032 * Return the maximum header bytes that can go on the _wire_
10033 * for this device. This count includes the ICRC which is
10034 * not part of the packet held in memory but it is appended
10035 * by the HW.
10036 * This is dependent on the device's receive header entry size.
10037 * HFI allows this to be set per-receive context, but the
10038 * driver presently enforces a global value.
10039 */
lrh_max_header_bytes(struct hfi1_devdata * dd)10040 u32 lrh_max_header_bytes(struct hfi1_devdata *dd)
10041 {
10042 /*
10043 * The maximum non-payload (MTU) bytes in LRH.PktLen are
10044 * the Receive Header Entry Size minus the PBC (or RHF) size
10045 * plus one DW for the ICRC appended by HW.
10046 *
10047 * dd->rcd[0].rcvhdrqentsize is in DW.
10048 * We use rcd[0] as all context will have the same value. Also,
10049 * the first kernel context would have been allocated by now so
10050 * we are guaranteed a valid value.
10051 */
10052 return (dd->rcd[0]->rcvhdrqentsize - 2/*PBC/RHF*/ + 1/*ICRC*/) << 2;
10053 }
10054
10055 /*
10056 * Set Send Length
10057 * @ppd - per port data
10058 *
10059 * Set the MTU by limiting how many DWs may be sent. The SendLenCheck*
10060 * registers compare against LRH.PktLen, so use the max bytes included
10061 * in the LRH.
10062 *
10063 * This routine changes all VL values except VL15, which it maintains at
10064 * the same value.
10065 */
set_send_length(struct hfi1_pportdata * ppd)10066 static void set_send_length(struct hfi1_pportdata *ppd)
10067 {
10068 struct hfi1_devdata *dd = ppd->dd;
10069 u32 max_hb = lrh_max_header_bytes(dd), dcmtu;
10070 u32 maxvlmtu = dd->vld[15].mtu;
10071 u64 len1 = 0, len2 = (((dd->vld[15].mtu + max_hb) >> 2)
10072 & SEND_LEN_CHECK1_LEN_VL15_MASK) <<
10073 SEND_LEN_CHECK1_LEN_VL15_SHIFT;
10074 int i, j;
10075 u32 thres;
10076
10077 for (i = 0; i < ppd->vls_supported; i++) {
10078 if (dd->vld[i].mtu > maxvlmtu)
10079 maxvlmtu = dd->vld[i].mtu;
10080 if (i <= 3)
10081 len1 |= (((dd->vld[i].mtu + max_hb) >> 2)
10082 & SEND_LEN_CHECK0_LEN_VL0_MASK) <<
10083 ((i % 4) * SEND_LEN_CHECK0_LEN_VL1_SHIFT);
10084 else
10085 len2 |= (((dd->vld[i].mtu + max_hb) >> 2)
10086 & SEND_LEN_CHECK1_LEN_VL4_MASK) <<
10087 ((i % 4) * SEND_LEN_CHECK1_LEN_VL5_SHIFT);
10088 }
10089 write_csr(dd, SEND_LEN_CHECK0, len1);
10090 write_csr(dd, SEND_LEN_CHECK1, len2);
10091 /* adjust kernel credit return thresholds based on new MTUs */
10092 /* all kernel receive contexts have the same hdrqentsize */
10093 for (i = 0; i < ppd->vls_supported; i++) {
10094 thres = min(sc_percent_to_threshold(dd->vld[i].sc, 50),
10095 sc_mtu_to_threshold(dd->vld[i].sc,
10096 dd->vld[i].mtu,
10097 dd->rcd[0]->rcvhdrqentsize));
10098 for (j = 0; j < INIT_SC_PER_VL; j++)
10099 sc_set_cr_threshold(
10100 pio_select_send_context_vl(dd, j, i),
10101 thres);
10102 }
10103 thres = min(sc_percent_to_threshold(dd->vld[15].sc, 50),
10104 sc_mtu_to_threshold(dd->vld[15].sc,
10105 dd->vld[15].mtu,
10106 dd->rcd[0]->rcvhdrqentsize));
10107 sc_set_cr_threshold(dd->vld[15].sc, thres);
10108
10109 /* Adjust maximum MTU for the port in DC */
10110 dcmtu = maxvlmtu == 10240 ? DCC_CFG_PORT_MTU_CAP_10240 :
10111 (ilog2(maxvlmtu >> 8) + 1);
10112 len1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG);
10113 len1 &= ~DCC_CFG_PORT_CONFIG_MTU_CAP_SMASK;
10114 len1 |= ((u64)dcmtu & DCC_CFG_PORT_CONFIG_MTU_CAP_MASK) <<
10115 DCC_CFG_PORT_CONFIG_MTU_CAP_SHIFT;
10116 write_csr(ppd->dd, DCC_CFG_PORT_CONFIG, len1);
10117 }
10118
set_lidlmc(struct hfi1_pportdata * ppd)10119 static void set_lidlmc(struct hfi1_pportdata *ppd)
10120 {
10121 int i;
10122 u64 sreg = 0;
10123 struct hfi1_devdata *dd = ppd->dd;
10124 u32 mask = ~((1U << ppd->lmc) - 1);
10125 u64 c1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG1);
10126 u32 lid;
10127
10128 /*
10129 * Program 0 in CSR if port lid is extended. This prevents
10130 * 9B packets being sent out for large lids.
10131 */
10132 lid = (ppd->lid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) ? 0 : ppd->lid;
10133 c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK
10134 | DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK);
10135 c1 |= ((lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
10136 << DCC_CFG_PORT_CONFIG1_TARGET_DLID_SHIFT) |
10137 ((mask & DCC_CFG_PORT_CONFIG1_DLID_MASK_MASK)
10138 << DCC_CFG_PORT_CONFIG1_DLID_MASK_SHIFT);
10139 write_csr(ppd->dd, DCC_CFG_PORT_CONFIG1, c1);
10140
10141 /*
10142 * Iterate over all the send contexts and set their SLID check
10143 */
10144 sreg = ((mask & SEND_CTXT_CHECK_SLID_MASK_MASK) <<
10145 SEND_CTXT_CHECK_SLID_MASK_SHIFT) |
10146 (((lid & mask) & SEND_CTXT_CHECK_SLID_VALUE_MASK) <<
10147 SEND_CTXT_CHECK_SLID_VALUE_SHIFT);
10148
10149 for (i = 0; i < chip_send_contexts(dd); i++) {
10150 hfi1_cdbg(LINKVERB, "SendContext[%d].SLID_CHECK = 0x%x",
10151 i, (u32)sreg);
10152 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_SLID, sreg);
10153 }
10154
10155 /* Now we have to do the same thing for the sdma engines */
10156 sdma_update_lmc(dd, mask, lid);
10157 }
10158
state_completed_string(u32 completed)10159 static const char *state_completed_string(u32 completed)
10160 {
10161 static const char * const state_completed[] = {
10162 "EstablishComm",
10163 "OptimizeEQ",
10164 "VerifyCap"
10165 };
10166
10167 if (completed < ARRAY_SIZE(state_completed))
10168 return state_completed[completed];
10169
10170 return "unknown";
10171 }
10172
10173 static const char all_lanes_dead_timeout_expired[] =
10174 "All lanes were inactive – was the interconnect media removed?";
10175 static const char tx_out_of_policy[] =
10176 "Passing lanes on local port do not meet the local link width policy";
10177 static const char no_state_complete[] =
10178 "State timeout occurred before link partner completed the state";
10179 static const char * const state_complete_reasons[] = {
10180 [0x00] = "Reason unknown",
10181 [0x01] = "Link was halted by driver, refer to LinkDownReason",
10182 [0x02] = "Link partner reported failure",
10183 [0x10] = "Unable to achieve frame sync on any lane",
10184 [0x11] =
10185 "Unable to find a common bit rate with the link partner",
10186 [0x12] =
10187 "Unable to achieve frame sync on sufficient lanes to meet the local link width policy",
10188 [0x13] =
10189 "Unable to identify preset equalization on sufficient lanes to meet the local link width policy",
10190 [0x14] = no_state_complete,
10191 [0x15] =
10192 "State timeout occurred before link partner identified equalization presets",
10193 [0x16] =
10194 "Link partner completed the EstablishComm state, but the passing lanes do not meet the local link width policy",
10195 [0x17] = tx_out_of_policy,
10196 [0x20] = all_lanes_dead_timeout_expired,
10197 [0x21] =
10198 "Unable to achieve acceptable BER on sufficient lanes to meet the local link width policy",
10199 [0x22] = no_state_complete,
10200 [0x23] =
10201 "Link partner completed the OptimizeEq state, but the passing lanes do not meet the local link width policy",
10202 [0x24] = tx_out_of_policy,
10203 [0x30] = all_lanes_dead_timeout_expired,
10204 [0x31] =
10205 "State timeout occurred waiting for host to process received frames",
10206 [0x32] = no_state_complete,
10207 [0x33] =
10208 "Link partner completed the VerifyCap state, but the passing lanes do not meet the local link width policy",
10209 [0x34] = tx_out_of_policy,
10210 [0x35] = "Negotiated link width is mutually exclusive",
10211 [0x36] =
10212 "Timed out before receiving verifycap frames in VerifyCap.Exchange",
10213 [0x37] = "Unable to resolve secure data exchange",
10214 };
10215
state_complete_reason_code_string(struct hfi1_pportdata * ppd,u32 code)10216 static const char *state_complete_reason_code_string(struct hfi1_pportdata *ppd,
10217 u32 code)
10218 {
10219 const char *str = NULL;
10220
10221 if (code < ARRAY_SIZE(state_complete_reasons))
10222 str = state_complete_reasons[code];
10223
10224 if (str)
10225 return str;
10226 return "Reserved";
10227 }
10228
10229 /* describe the given last state complete frame */
decode_state_complete(struct hfi1_pportdata * ppd,u32 frame,const char * prefix)10230 static void decode_state_complete(struct hfi1_pportdata *ppd, u32 frame,
10231 const char *prefix)
10232 {
10233 struct hfi1_devdata *dd = ppd->dd;
10234 u32 success;
10235 u32 state;
10236 u32 reason;
10237 u32 lanes;
10238
10239 /*
10240 * Decode frame:
10241 * [ 0: 0] - success
10242 * [ 3: 1] - state
10243 * [ 7: 4] - next state timeout
10244 * [15: 8] - reason code
10245 * [31:16] - lanes
10246 */
10247 success = frame & 0x1;
10248 state = (frame >> 1) & 0x7;
10249 reason = (frame >> 8) & 0xff;
10250 lanes = (frame >> 16) & 0xffff;
10251
10252 dd_dev_err(dd, "Last %s LNI state complete frame 0x%08x:\n",
10253 prefix, frame);
10254 dd_dev_err(dd, " last reported state state: %s (0x%x)\n",
10255 state_completed_string(state), state);
10256 dd_dev_err(dd, " state successfully completed: %s\n",
10257 success ? "yes" : "no");
10258 dd_dev_err(dd, " fail reason 0x%x: %s\n",
10259 reason, state_complete_reason_code_string(ppd, reason));
10260 dd_dev_err(dd, " passing lane mask: 0x%x", lanes);
10261 }
10262
10263 /*
10264 * Read the last state complete frames and explain them. This routine
10265 * expects to be called if the link went down during link negotiation
10266 * and initialization (LNI). That is, anywhere between polling and link up.
10267 */
check_lni_states(struct hfi1_pportdata * ppd)10268 static void check_lni_states(struct hfi1_pportdata *ppd)
10269 {
10270 u32 last_local_state;
10271 u32 last_remote_state;
10272
10273 read_last_local_state(ppd->dd, &last_local_state);
10274 read_last_remote_state(ppd->dd, &last_remote_state);
10275
10276 /*
10277 * Don't report anything if there is nothing to report. A value of
10278 * 0 means the link was taken down while polling and there was no
10279 * training in-process.
10280 */
10281 if (last_local_state == 0 && last_remote_state == 0)
10282 return;
10283
10284 decode_state_complete(ppd, last_local_state, "transmitted");
10285 decode_state_complete(ppd, last_remote_state, "received");
10286 }
10287
10288 /* wait for wait_ms for LINK_TRANSFER_ACTIVE to go to 1 */
wait_link_transfer_active(struct hfi1_devdata * dd,int wait_ms)10289 static int wait_link_transfer_active(struct hfi1_devdata *dd, int wait_ms)
10290 {
10291 u64 reg;
10292 unsigned long timeout;
10293
10294 /* watch LCB_STS_LINK_TRANSFER_ACTIVE */
10295 timeout = jiffies + msecs_to_jiffies(wait_ms);
10296 while (1) {
10297 reg = read_csr(dd, DC_LCB_STS_LINK_TRANSFER_ACTIVE);
10298 if (reg)
10299 break;
10300 if (time_after(jiffies, timeout)) {
10301 dd_dev_err(dd,
10302 "timeout waiting for LINK_TRANSFER_ACTIVE\n");
10303 return -ETIMEDOUT;
10304 }
10305 udelay(2);
10306 }
10307 return 0;
10308 }
10309
10310 /* called when the logical link state is not down as it should be */
force_logical_link_state_down(struct hfi1_pportdata * ppd)10311 static void force_logical_link_state_down(struct hfi1_pportdata *ppd)
10312 {
10313 struct hfi1_devdata *dd = ppd->dd;
10314
10315 /*
10316 * Bring link up in LCB loopback
10317 */
10318 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 1);
10319 write_csr(dd, DC_LCB_CFG_IGNORE_LOST_RCLK,
10320 DC_LCB_CFG_IGNORE_LOST_RCLK_EN_SMASK);
10321
10322 write_csr(dd, DC_LCB_CFG_LANE_WIDTH, 0);
10323 write_csr(dd, DC_LCB_CFG_REINIT_AS_SLAVE, 0);
10324 write_csr(dd, DC_LCB_CFG_CNT_FOR_SKIP_STALL, 0x110);
10325 write_csr(dd, DC_LCB_CFG_LOOPBACK, 0x2);
10326
10327 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0);
10328 (void)read_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET);
10329 udelay(3);
10330 write_csr(dd, DC_LCB_CFG_ALLOW_LINK_UP, 1);
10331 write_csr(dd, DC_LCB_CFG_RUN, 1ull << DC_LCB_CFG_RUN_EN_SHIFT);
10332
10333 wait_link_transfer_active(dd, 100);
10334
10335 /*
10336 * Bring the link down again.
10337 */
10338 write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 1);
10339 write_csr(dd, DC_LCB_CFG_ALLOW_LINK_UP, 0);
10340 write_csr(dd, DC_LCB_CFG_IGNORE_LOST_RCLK, 0);
10341
10342 dd_dev_info(ppd->dd, "logical state forced to LINK_DOWN\n");
10343 }
10344
10345 /*
10346 * Helper for set_link_state(). Do not call except from that routine.
10347 * Expects ppd->hls_mutex to be held.
10348 *
10349 * @rem_reason value to be sent to the neighbor
10350 *
10351 * LinkDownReasons only set if transition succeeds.
10352 */
goto_offline(struct hfi1_pportdata * ppd,u8 rem_reason)10353 static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
10354 {
10355 struct hfi1_devdata *dd = ppd->dd;
10356 u32 previous_state;
10357 int offline_state_ret;
10358 int ret;
10359
10360 update_lcb_cache(dd);
10361
10362 previous_state = ppd->host_link_state;
10363 ppd->host_link_state = HLS_GOING_OFFLINE;
10364
10365 /* start offline transition */
10366 ret = set_physical_link_state(dd, (rem_reason << 8) | PLS_OFFLINE);
10367
10368 if (ret != HCMD_SUCCESS) {
10369 dd_dev_err(dd,
10370 "Failed to transition to Offline link state, return %d\n",
10371 ret);
10372 return -EINVAL;
10373 }
10374 if (ppd->offline_disabled_reason ==
10375 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE))
10376 ppd->offline_disabled_reason =
10377 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_TRANSIENT);
10378
10379 offline_state_ret = wait_phys_link_offline_substates(ppd, 10000);
10380 if (offline_state_ret < 0)
10381 return offline_state_ret;
10382
10383 /* Disabling AOC transmitters */
10384 if (ppd->port_type == PORT_TYPE_QSFP &&
10385 ppd->qsfp_info.limiting_active &&
10386 qsfp_mod_present(ppd)) {
10387 int ret;
10388
10389 ret = acquire_chip_resource(dd, qsfp_resource(dd), QSFP_WAIT);
10390 if (ret == 0) {
10391 set_qsfp_tx(ppd, 0);
10392 release_chip_resource(dd, qsfp_resource(dd));
10393 } else {
10394 /* not fatal, but should warn */
10395 dd_dev_err(dd,
10396 "Unable to acquire lock to turn off QSFP TX\n");
10397 }
10398 }
10399
10400 /*
10401 * Wait for the offline.Quiet transition if it hasn't happened yet. It
10402 * can take a while for the link to go down.
10403 */
10404 if (offline_state_ret != PLS_OFFLINE_QUIET) {
10405 ret = wait_physical_linkstate(ppd, PLS_OFFLINE, 30000);
10406 if (ret < 0)
10407 return ret;
10408 }
10409
10410 /*
10411 * Now in charge of LCB - must be after the physical state is
10412 * offline.quiet and before host_link_state is changed.
10413 */
10414 set_host_lcb_access(dd);
10415 write_csr(dd, DC_LCB_ERR_EN, ~0ull); /* watch LCB errors */
10416
10417 /* make sure the logical state is also down */
10418 ret = wait_logical_linkstate(ppd, IB_PORT_DOWN, 1000);
10419 if (ret)
10420 force_logical_link_state_down(ppd);
10421
10422 ppd->host_link_state = HLS_LINK_COOLDOWN; /* LCB access allowed */
10423 update_statusp(ppd, IB_PORT_DOWN);
10424
10425 /*
10426 * The LNI has a mandatory wait time after the physical state
10427 * moves to Offline.Quiet. The wait time may be different
10428 * depending on how the link went down. The 8051 firmware
10429 * will observe the needed wait time and only move to ready
10430 * when that is completed. The largest of the quiet timeouts
10431 * is 6s, so wait that long and then at least 0.5s more for
10432 * other transitions, and another 0.5s for a buffer.
10433 */
10434 ret = wait_fm_ready(dd, 7000);
10435 if (ret) {
10436 dd_dev_err(dd,
10437 "After going offline, timed out waiting for the 8051 to become ready to accept host requests\n");
10438 /* state is really offline, so make it so */
10439 ppd->host_link_state = HLS_DN_OFFLINE;
10440 return ret;
10441 }
10442
10443 /*
10444 * The state is now offline and the 8051 is ready to accept host
10445 * requests.
10446 * - change our state
10447 * - notify others if we were previously in a linkup state
10448 */
10449 ppd->host_link_state = HLS_DN_OFFLINE;
10450 if (previous_state & HLS_UP) {
10451 /* went down while link was up */
10452 handle_linkup_change(dd, 0);
10453 } else if (previous_state
10454 & (HLS_DN_POLL | HLS_VERIFY_CAP | HLS_GOING_UP)) {
10455 /* went down while attempting link up */
10456 check_lni_states(ppd);
10457
10458 /* The QSFP doesn't need to be reset on LNI failure */
10459 ppd->qsfp_info.reset_needed = 0;
10460 }
10461
10462 /* the active link width (downgrade) is 0 on link down */
10463 ppd->link_width_active = 0;
10464 ppd->link_width_downgrade_tx_active = 0;
10465 ppd->link_width_downgrade_rx_active = 0;
10466 ppd->current_egress_rate = 0;
10467 return 0;
10468 }
10469
10470 /* return the link state name */
link_state_name(u32 state)10471 static const char *link_state_name(u32 state)
10472 {
10473 const char *name;
10474 int n = ilog2(state);
10475 static const char * const names[] = {
10476 [__HLS_UP_INIT_BP] = "INIT",
10477 [__HLS_UP_ARMED_BP] = "ARMED",
10478 [__HLS_UP_ACTIVE_BP] = "ACTIVE",
10479 [__HLS_DN_DOWNDEF_BP] = "DOWNDEF",
10480 [__HLS_DN_POLL_BP] = "POLL",
10481 [__HLS_DN_DISABLE_BP] = "DISABLE",
10482 [__HLS_DN_OFFLINE_BP] = "OFFLINE",
10483 [__HLS_VERIFY_CAP_BP] = "VERIFY_CAP",
10484 [__HLS_GOING_UP_BP] = "GOING_UP",
10485 [__HLS_GOING_OFFLINE_BP] = "GOING_OFFLINE",
10486 [__HLS_LINK_COOLDOWN_BP] = "LINK_COOLDOWN"
10487 };
10488
10489 name = n < ARRAY_SIZE(names) ? names[n] : NULL;
10490 return name ? name : "unknown";
10491 }
10492
10493 /* return the link state reason name */
link_state_reason_name(struct hfi1_pportdata * ppd,u32 state)10494 static const char *link_state_reason_name(struct hfi1_pportdata *ppd, u32 state)
10495 {
10496 if (state == HLS_UP_INIT) {
10497 switch (ppd->linkinit_reason) {
10498 case OPA_LINKINIT_REASON_LINKUP:
10499 return "(LINKUP)";
10500 case OPA_LINKINIT_REASON_FLAPPING:
10501 return "(FLAPPING)";
10502 case OPA_LINKINIT_OUTSIDE_POLICY:
10503 return "(OUTSIDE_POLICY)";
10504 case OPA_LINKINIT_QUARANTINED:
10505 return "(QUARANTINED)";
10506 case OPA_LINKINIT_INSUFIC_CAPABILITY:
10507 return "(INSUFIC_CAPABILITY)";
10508 default:
10509 break;
10510 }
10511 }
10512 return "";
10513 }
10514
10515 /*
10516 * driver_pstate - convert the driver's notion of a port's
10517 * state (an HLS_*) into a physical state (a {IB,OPA}_PORTPHYSSTATE_*).
10518 * Return -1 (converted to a u32) to indicate error.
10519 */
driver_pstate(struct hfi1_pportdata * ppd)10520 u32 driver_pstate(struct hfi1_pportdata *ppd)
10521 {
10522 switch (ppd->host_link_state) {
10523 case HLS_UP_INIT:
10524 case HLS_UP_ARMED:
10525 case HLS_UP_ACTIVE:
10526 return IB_PORTPHYSSTATE_LINKUP;
10527 case HLS_DN_POLL:
10528 return IB_PORTPHYSSTATE_POLLING;
10529 case HLS_DN_DISABLE:
10530 return IB_PORTPHYSSTATE_DISABLED;
10531 case HLS_DN_OFFLINE:
10532 return OPA_PORTPHYSSTATE_OFFLINE;
10533 case HLS_VERIFY_CAP:
10534 return IB_PORTPHYSSTATE_TRAINING;
10535 case HLS_GOING_UP:
10536 return IB_PORTPHYSSTATE_TRAINING;
10537 case HLS_GOING_OFFLINE:
10538 return OPA_PORTPHYSSTATE_OFFLINE;
10539 case HLS_LINK_COOLDOWN:
10540 return OPA_PORTPHYSSTATE_OFFLINE;
10541 case HLS_DN_DOWNDEF:
10542 default:
10543 dd_dev_err(ppd->dd, "invalid host_link_state 0x%x\n",
10544 ppd->host_link_state);
10545 return -1;
10546 }
10547 }
10548
10549 /*
10550 * driver_lstate - convert the driver's notion of a port's
10551 * state (an HLS_*) into a logical state (a IB_PORT_*). Return -1
10552 * (converted to a u32) to indicate error.
10553 */
driver_lstate(struct hfi1_pportdata * ppd)10554 u32 driver_lstate(struct hfi1_pportdata *ppd)
10555 {
10556 if (ppd->host_link_state && (ppd->host_link_state & HLS_DOWN))
10557 return IB_PORT_DOWN;
10558
10559 switch (ppd->host_link_state & HLS_UP) {
10560 case HLS_UP_INIT:
10561 return IB_PORT_INIT;
10562 case HLS_UP_ARMED:
10563 return IB_PORT_ARMED;
10564 case HLS_UP_ACTIVE:
10565 return IB_PORT_ACTIVE;
10566 default:
10567 dd_dev_err(ppd->dd, "invalid host_link_state 0x%x\n",
10568 ppd->host_link_state);
10569 return -1;
10570 }
10571 }
10572
set_link_down_reason(struct hfi1_pportdata * ppd,u8 lcl_reason,u8 neigh_reason,u8 rem_reason)10573 void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason,
10574 u8 neigh_reason, u8 rem_reason)
10575 {
10576 if (ppd->local_link_down_reason.latest == 0 &&
10577 ppd->neigh_link_down_reason.latest == 0) {
10578 ppd->local_link_down_reason.latest = lcl_reason;
10579 ppd->neigh_link_down_reason.latest = neigh_reason;
10580 ppd->remote_link_down_reason = rem_reason;
10581 }
10582 }
10583
10584 /**
10585 * data_vls_operational() - Verify if data VL BCT credits and MTU
10586 * are both set.
10587 * @ppd: pointer to hfi1_pportdata structure
10588 *
10589 * Return: true - Ok, false -otherwise.
10590 */
data_vls_operational(struct hfi1_pportdata * ppd)10591 static inline bool data_vls_operational(struct hfi1_pportdata *ppd)
10592 {
10593 int i;
10594 u64 reg;
10595
10596 if (!ppd->actual_vls_operational)
10597 return false;
10598
10599 for (i = 0; i < ppd->vls_supported; i++) {
10600 reg = read_csr(ppd->dd, SEND_CM_CREDIT_VL + (8 * i));
10601 if ((reg && !ppd->dd->vld[i].mtu) ||
10602 (!reg && ppd->dd->vld[i].mtu))
10603 return false;
10604 }
10605
10606 return true;
10607 }
10608
10609 /*
10610 * Change the physical and/or logical link state.
10611 *
10612 * Do not call this routine while inside an interrupt. It contains
10613 * calls to routines that can take multiple seconds to finish.
10614 *
10615 * Returns 0 on success, -errno on failure.
10616 */
set_link_state(struct hfi1_pportdata * ppd,u32 state)10617 int set_link_state(struct hfi1_pportdata *ppd, u32 state)
10618 {
10619 struct hfi1_devdata *dd = ppd->dd;
10620 struct ib_event event = {.device = NULL};
10621 int ret1, ret = 0;
10622 int orig_new_state, poll_bounce;
10623
10624 mutex_lock(&ppd->hls_lock);
10625
10626 orig_new_state = state;
10627 if (state == HLS_DN_DOWNDEF)
10628 state = HLS_DEFAULT;
10629
10630 /* interpret poll -> poll as a link bounce */
10631 poll_bounce = ppd->host_link_state == HLS_DN_POLL &&
10632 state == HLS_DN_POLL;
10633
10634 dd_dev_info(dd, "%s: current %s, new %s %s%s\n", __func__,
10635 link_state_name(ppd->host_link_state),
10636 link_state_name(orig_new_state),
10637 poll_bounce ? "(bounce) " : "",
10638 link_state_reason_name(ppd, state));
10639
10640 /*
10641 * If we're going to a (HLS_*) link state that implies the logical
10642 * link state is neither of (IB_PORT_ARMED, IB_PORT_ACTIVE), then
10643 * reset is_sm_config_started to 0.
10644 */
10645 if (!(state & (HLS_UP_ARMED | HLS_UP_ACTIVE)))
10646 ppd->is_sm_config_started = 0;
10647
10648 /*
10649 * Do nothing if the states match. Let a poll to poll link bounce
10650 * go through.
10651 */
10652 if (ppd->host_link_state == state && !poll_bounce)
10653 goto done;
10654
10655 switch (state) {
10656 case HLS_UP_INIT:
10657 if (ppd->host_link_state == HLS_DN_POLL &&
10658 (quick_linkup || dd->icode == ICODE_FUNCTIONAL_SIMULATOR)) {
10659 /*
10660 * Quick link up jumps from polling to here.
10661 *
10662 * Whether in normal or loopback mode, the
10663 * simulator jumps from polling to link up.
10664 * Accept that here.
10665 */
10666 /* OK */
10667 } else if (ppd->host_link_state != HLS_GOING_UP) {
10668 goto unexpected;
10669 }
10670
10671 /*
10672 * Wait for Link_Up physical state.
10673 * Physical and Logical states should already be
10674 * be transitioned to LinkUp and LinkInit respectively.
10675 */
10676 ret = wait_physical_linkstate(ppd, PLS_LINKUP, 1000);
10677 if (ret) {
10678 dd_dev_err(dd,
10679 "%s: physical state did not change to LINK-UP\n",
10680 __func__);
10681 break;
10682 }
10683
10684 ret = wait_logical_linkstate(ppd, IB_PORT_INIT, 1000);
10685 if (ret) {
10686 dd_dev_err(dd,
10687 "%s: logical state did not change to INIT\n",
10688 __func__);
10689 break;
10690 }
10691
10692 /* clear old transient LINKINIT_REASON code */
10693 if (ppd->linkinit_reason >= OPA_LINKINIT_REASON_CLEAR)
10694 ppd->linkinit_reason =
10695 OPA_LINKINIT_REASON_LINKUP;
10696
10697 /* enable the port */
10698 add_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
10699
10700 handle_linkup_change(dd, 1);
10701 pio_kernel_linkup(dd);
10702
10703 /*
10704 * After link up, a new link width will have been set.
10705 * Update the xmit counters with regards to the new
10706 * link width.
10707 */
10708 update_xmit_counters(ppd, ppd->link_width_active);
10709
10710 ppd->host_link_state = HLS_UP_INIT;
10711 update_statusp(ppd, IB_PORT_INIT);
10712 break;
10713 case HLS_UP_ARMED:
10714 if (ppd->host_link_state != HLS_UP_INIT)
10715 goto unexpected;
10716
10717 if (!data_vls_operational(ppd)) {
10718 dd_dev_err(dd,
10719 "%s: Invalid data VL credits or mtu\n",
10720 __func__);
10721 ret = -EINVAL;
10722 break;
10723 }
10724
10725 set_logical_state(dd, LSTATE_ARMED);
10726 ret = wait_logical_linkstate(ppd, IB_PORT_ARMED, 1000);
10727 if (ret) {
10728 dd_dev_err(dd,
10729 "%s: logical state did not change to ARMED\n",
10730 __func__);
10731 break;
10732 }
10733 ppd->host_link_state = HLS_UP_ARMED;
10734 update_statusp(ppd, IB_PORT_ARMED);
10735 /*
10736 * The simulator does not currently implement SMA messages,
10737 * so neighbor_normal is not set. Set it here when we first
10738 * move to Armed.
10739 */
10740 if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR)
10741 ppd->neighbor_normal = 1;
10742 break;
10743 case HLS_UP_ACTIVE:
10744 if (ppd->host_link_state != HLS_UP_ARMED)
10745 goto unexpected;
10746
10747 set_logical_state(dd, LSTATE_ACTIVE);
10748 ret = wait_logical_linkstate(ppd, IB_PORT_ACTIVE, 1000);
10749 if (ret) {
10750 dd_dev_err(dd,
10751 "%s: logical state did not change to ACTIVE\n",
10752 __func__);
10753 } else {
10754 /* tell all engines to go running */
10755 sdma_all_running(dd);
10756 ppd->host_link_state = HLS_UP_ACTIVE;
10757 update_statusp(ppd, IB_PORT_ACTIVE);
10758
10759 /* Signal the IB layer that the port has went active */
10760 event.device = &dd->verbs_dev.rdi.ibdev;
10761 event.element.port_num = ppd->port;
10762 event.event = IB_EVENT_PORT_ACTIVE;
10763 }
10764 break;
10765 case HLS_DN_POLL:
10766 if ((ppd->host_link_state == HLS_DN_DISABLE ||
10767 ppd->host_link_state == HLS_DN_OFFLINE) &&
10768 dd->dc_shutdown)
10769 dc_start(dd);
10770 /* Hand LED control to the DC */
10771 write_csr(dd, DCC_CFG_LED_CNTRL, 0);
10772
10773 if (ppd->host_link_state != HLS_DN_OFFLINE) {
10774 u8 tmp = ppd->link_enabled;
10775
10776 ret = goto_offline(ppd, ppd->remote_link_down_reason);
10777 if (ret) {
10778 ppd->link_enabled = tmp;
10779 break;
10780 }
10781 ppd->remote_link_down_reason = 0;
10782
10783 if (ppd->driver_link_ready)
10784 ppd->link_enabled = 1;
10785 }
10786
10787 set_all_slowpath(ppd->dd);
10788 ret = set_local_link_attributes(ppd);
10789 if (ret)
10790 break;
10791
10792 ppd->port_error_action = 0;
10793
10794 if (quick_linkup) {
10795 /* quick linkup does not go into polling */
10796 ret = do_quick_linkup(dd);
10797 } else {
10798 ret1 = set_physical_link_state(dd, PLS_POLLING);
10799 if (!ret1)
10800 ret1 = wait_phys_link_out_of_offline(ppd,
10801 3000);
10802 if (ret1 != HCMD_SUCCESS) {
10803 dd_dev_err(dd,
10804 "Failed to transition to Polling link state, return 0x%x\n",
10805 ret1);
10806 ret = -EINVAL;
10807 }
10808 }
10809
10810 /*
10811 * Change the host link state after requesting DC8051 to
10812 * change its physical state so that we can ignore any
10813 * interrupt with stale LNI(XX) error, which will not be
10814 * cleared until DC8051 transitions to Polling state.
10815 */
10816 ppd->host_link_state = HLS_DN_POLL;
10817 ppd->offline_disabled_reason =
10818 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE);
10819 /*
10820 * If an error occurred above, go back to offline. The
10821 * caller may reschedule another attempt.
10822 */
10823 if (ret)
10824 goto_offline(ppd, 0);
10825 else
10826 log_physical_state(ppd, PLS_POLLING);
10827 break;
10828 case HLS_DN_DISABLE:
10829 /* link is disabled */
10830 ppd->link_enabled = 0;
10831
10832 /* allow any state to transition to disabled */
10833
10834 /* must transition to offline first */
10835 if (ppd->host_link_state != HLS_DN_OFFLINE) {
10836 ret = goto_offline(ppd, ppd->remote_link_down_reason);
10837 if (ret)
10838 break;
10839 ppd->remote_link_down_reason = 0;
10840 }
10841
10842 if (!dd->dc_shutdown) {
10843 ret1 = set_physical_link_state(dd, PLS_DISABLED);
10844 if (ret1 != HCMD_SUCCESS) {
10845 dd_dev_err(dd,
10846 "Failed to transition to Disabled link state, return 0x%x\n",
10847 ret1);
10848 ret = -EINVAL;
10849 break;
10850 }
10851 ret = wait_physical_linkstate(ppd, PLS_DISABLED, 10000);
10852 if (ret) {
10853 dd_dev_err(dd,
10854 "%s: physical state did not change to DISABLED\n",
10855 __func__);
10856 break;
10857 }
10858 dc_shutdown(dd);
10859 }
10860 ppd->host_link_state = HLS_DN_DISABLE;
10861 break;
10862 case HLS_DN_OFFLINE:
10863 if (ppd->host_link_state == HLS_DN_DISABLE)
10864 dc_start(dd);
10865
10866 /* allow any state to transition to offline */
10867 ret = goto_offline(ppd, ppd->remote_link_down_reason);
10868 if (!ret)
10869 ppd->remote_link_down_reason = 0;
10870 break;
10871 case HLS_VERIFY_CAP:
10872 if (ppd->host_link_state != HLS_DN_POLL)
10873 goto unexpected;
10874 ppd->host_link_state = HLS_VERIFY_CAP;
10875 log_physical_state(ppd, PLS_CONFIGPHY_VERIFYCAP);
10876 break;
10877 case HLS_GOING_UP:
10878 if (ppd->host_link_state != HLS_VERIFY_CAP)
10879 goto unexpected;
10880
10881 ret1 = set_physical_link_state(dd, PLS_LINKUP);
10882 if (ret1 != HCMD_SUCCESS) {
10883 dd_dev_err(dd,
10884 "Failed to transition to link up state, return 0x%x\n",
10885 ret1);
10886 ret = -EINVAL;
10887 break;
10888 }
10889 ppd->host_link_state = HLS_GOING_UP;
10890 break;
10891
10892 case HLS_GOING_OFFLINE: /* transient within goto_offline() */
10893 case HLS_LINK_COOLDOWN: /* transient within goto_offline() */
10894 default:
10895 dd_dev_info(dd, "%s: state 0x%x: not supported\n",
10896 __func__, state);
10897 ret = -EINVAL;
10898 break;
10899 }
10900
10901 goto done;
10902
10903 unexpected:
10904 dd_dev_err(dd, "%s: unexpected state transition from %s to %s\n",
10905 __func__, link_state_name(ppd->host_link_state),
10906 link_state_name(state));
10907 ret = -EINVAL;
10908
10909 done:
10910 mutex_unlock(&ppd->hls_lock);
10911
10912 if (event.device)
10913 ib_dispatch_event(&event);
10914
10915 return ret;
10916 }
10917
hfi1_set_ib_cfg(struct hfi1_pportdata * ppd,int which,u32 val)10918 int hfi1_set_ib_cfg(struct hfi1_pportdata *ppd, int which, u32 val)
10919 {
10920 u64 reg;
10921 int ret = 0;
10922
10923 switch (which) {
10924 case HFI1_IB_CFG_LIDLMC:
10925 set_lidlmc(ppd);
10926 break;
10927 case HFI1_IB_CFG_VL_HIGH_LIMIT:
10928 /*
10929 * The VL Arbitrator high limit is sent in units of 4k
10930 * bytes, while HFI stores it in units of 64 bytes.
10931 */
10932 val *= 4096 / 64;
10933 reg = ((u64)val & SEND_HIGH_PRIORITY_LIMIT_LIMIT_MASK)
10934 << SEND_HIGH_PRIORITY_LIMIT_LIMIT_SHIFT;
10935 write_csr(ppd->dd, SEND_HIGH_PRIORITY_LIMIT, reg);
10936 break;
10937 case HFI1_IB_CFG_LINKDEFAULT: /* IB link default (sleep/poll) */
10938 /* HFI only supports POLL as the default link down state */
10939 if (val != HLS_DN_POLL)
10940 ret = -EINVAL;
10941 break;
10942 case HFI1_IB_CFG_OP_VLS:
10943 if (ppd->vls_operational != val) {
10944 ppd->vls_operational = val;
10945 if (!ppd->port)
10946 ret = -EINVAL;
10947 }
10948 break;
10949 /*
10950 * For link width, link width downgrade, and speed enable, always AND
10951 * the setting with what is actually supported. This has two benefits.
10952 * First, enabled can't have unsupported values, no matter what the
10953 * SM or FM might want. Second, the ALL_SUPPORTED wildcards that mean
10954 * "fill in with your supported value" have all the bits in the
10955 * field set, so simply ANDing with supported has the desired result.
10956 */
10957 case HFI1_IB_CFG_LWID_ENB: /* set allowed Link-width */
10958 ppd->link_width_enabled = val & ppd->link_width_supported;
10959 break;
10960 case HFI1_IB_CFG_LWID_DG_ENB: /* set allowed link width downgrade */
10961 ppd->link_width_downgrade_enabled =
10962 val & ppd->link_width_downgrade_supported;
10963 break;
10964 case HFI1_IB_CFG_SPD_ENB: /* allowed Link speeds */
10965 ppd->link_speed_enabled = val & ppd->link_speed_supported;
10966 break;
10967 case HFI1_IB_CFG_OVERRUN_THRESH: /* IB overrun threshold */
10968 /*
10969 * HFI does not follow IB specs, save this value
10970 * so we can report it, if asked.
10971 */
10972 ppd->overrun_threshold = val;
10973 break;
10974 case HFI1_IB_CFG_PHYERR_THRESH: /* IB PHY error threshold */
10975 /*
10976 * HFI does not follow IB specs, save this value
10977 * so we can report it, if asked.
10978 */
10979 ppd->phy_error_threshold = val;
10980 break;
10981
10982 case HFI1_IB_CFG_MTU:
10983 set_send_length(ppd);
10984 break;
10985
10986 case HFI1_IB_CFG_PKEYS:
10987 if (HFI1_CAP_IS_KSET(PKEY_CHECK))
10988 set_partition_keys(ppd);
10989 break;
10990
10991 default:
10992 if (HFI1_CAP_IS_KSET(PRINT_UNIMPL))
10993 dd_dev_info(ppd->dd,
10994 "%s: which %s, val 0x%x: not implemented\n",
10995 __func__, ib_cfg_name(which), val);
10996 break;
10997 }
10998 return ret;
10999 }
11000
11001 /* begin functions related to vl arbitration table caching */
init_vl_arb_caches(struct hfi1_pportdata * ppd)11002 static void init_vl_arb_caches(struct hfi1_pportdata *ppd)
11003 {
11004 int i;
11005
11006 BUILD_BUG_ON(VL_ARB_TABLE_SIZE !=
11007 VL_ARB_LOW_PRIO_TABLE_SIZE);
11008 BUILD_BUG_ON(VL_ARB_TABLE_SIZE !=
11009 VL_ARB_HIGH_PRIO_TABLE_SIZE);
11010
11011 /*
11012 * Note that we always return values directly from the
11013 * 'vl_arb_cache' (and do no CSR reads) in response to a
11014 * 'Get(VLArbTable)'. This is obviously correct after a
11015 * 'Set(VLArbTable)', since the cache will then be up to
11016 * date. But it's also correct prior to any 'Set(VLArbTable)'
11017 * since then both the cache, and the relevant h/w registers
11018 * will be zeroed.
11019 */
11020
11021 for (i = 0; i < MAX_PRIO_TABLE; i++)
11022 spin_lock_init(&ppd->vl_arb_cache[i].lock);
11023 }
11024
11025 /*
11026 * vl_arb_lock_cache
11027 *
11028 * All other vl_arb_* functions should be called only after locking
11029 * the cache.
11030 */
11031 static inline struct vl_arb_cache *
vl_arb_lock_cache(struct hfi1_pportdata * ppd,int idx)11032 vl_arb_lock_cache(struct hfi1_pportdata *ppd, int idx)
11033 {
11034 if (idx != LO_PRIO_TABLE && idx != HI_PRIO_TABLE)
11035 return NULL;
11036 spin_lock(&ppd->vl_arb_cache[idx].lock);
11037 return &ppd->vl_arb_cache[idx];
11038 }
11039
vl_arb_unlock_cache(struct hfi1_pportdata * ppd,int idx)11040 static inline void vl_arb_unlock_cache(struct hfi1_pportdata *ppd, int idx)
11041 {
11042 spin_unlock(&ppd->vl_arb_cache[idx].lock);
11043 }
11044
vl_arb_get_cache(struct vl_arb_cache * cache,struct ib_vl_weight_elem * vl)11045 static void vl_arb_get_cache(struct vl_arb_cache *cache,
11046 struct ib_vl_weight_elem *vl)
11047 {
11048 memcpy(vl, cache->table, VL_ARB_TABLE_SIZE * sizeof(*vl));
11049 }
11050
vl_arb_set_cache(struct vl_arb_cache * cache,struct ib_vl_weight_elem * vl)11051 static void vl_arb_set_cache(struct vl_arb_cache *cache,
11052 struct ib_vl_weight_elem *vl)
11053 {
11054 memcpy(cache->table, vl, VL_ARB_TABLE_SIZE * sizeof(*vl));
11055 }
11056
vl_arb_match_cache(struct vl_arb_cache * cache,struct ib_vl_weight_elem * vl)11057 static int vl_arb_match_cache(struct vl_arb_cache *cache,
11058 struct ib_vl_weight_elem *vl)
11059 {
11060 return !memcmp(cache->table, vl, VL_ARB_TABLE_SIZE * sizeof(*vl));
11061 }
11062
11063 /* end functions related to vl arbitration table caching */
11064
set_vl_weights(struct hfi1_pportdata * ppd,u32 target,u32 size,struct ib_vl_weight_elem * vl)11065 static int set_vl_weights(struct hfi1_pportdata *ppd, u32 target,
11066 u32 size, struct ib_vl_weight_elem *vl)
11067 {
11068 struct hfi1_devdata *dd = ppd->dd;
11069 u64 reg;
11070 unsigned int i, is_up = 0;
11071 int drain, ret = 0;
11072
11073 mutex_lock(&ppd->hls_lock);
11074
11075 if (ppd->host_link_state & HLS_UP)
11076 is_up = 1;
11077
11078 drain = !is_ax(dd) && is_up;
11079
11080 if (drain)
11081 /*
11082 * Before adjusting VL arbitration weights, empty per-VL
11083 * FIFOs, otherwise a packet whose VL weight is being
11084 * set to 0 could get stuck in a FIFO with no chance to
11085 * egress.
11086 */
11087 ret = stop_drain_data_vls(dd);
11088
11089 if (ret) {
11090 dd_dev_err(
11091 dd,
11092 "%s: cannot stop/drain VLs - refusing to change VL arbitration weights\n",
11093 __func__);
11094 goto err;
11095 }
11096
11097 for (i = 0; i < size; i++, vl++) {
11098 /*
11099 * NOTE: The low priority shift and mask are used here, but
11100 * they are the same for both the low and high registers.
11101 */
11102 reg = (((u64)vl->vl & SEND_LOW_PRIORITY_LIST_VL_MASK)
11103 << SEND_LOW_PRIORITY_LIST_VL_SHIFT)
11104 | (((u64)vl->weight
11105 & SEND_LOW_PRIORITY_LIST_WEIGHT_MASK)
11106 << SEND_LOW_PRIORITY_LIST_WEIGHT_SHIFT);
11107 write_csr(dd, target + (i * 8), reg);
11108 }
11109 pio_send_control(dd, PSC_GLOBAL_VLARB_ENABLE);
11110
11111 if (drain)
11112 open_fill_data_vls(dd); /* reopen all VLs */
11113
11114 err:
11115 mutex_unlock(&ppd->hls_lock);
11116
11117 return ret;
11118 }
11119
11120 /*
11121 * Read one credit merge VL register.
11122 */
read_one_cm_vl(struct hfi1_devdata * dd,u32 csr,struct vl_limit * vll)11123 static void read_one_cm_vl(struct hfi1_devdata *dd, u32 csr,
11124 struct vl_limit *vll)
11125 {
11126 u64 reg = read_csr(dd, csr);
11127
11128 vll->dedicated = cpu_to_be16(
11129 (reg >> SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_SHIFT)
11130 & SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_MASK);
11131 vll->shared = cpu_to_be16(
11132 (reg >> SEND_CM_CREDIT_VL_SHARED_LIMIT_VL_SHIFT)
11133 & SEND_CM_CREDIT_VL_SHARED_LIMIT_VL_MASK);
11134 }
11135
11136 /*
11137 * Read the current credit merge limits.
11138 */
get_buffer_control(struct hfi1_devdata * dd,struct buffer_control * bc,u16 * overall_limit)11139 static int get_buffer_control(struct hfi1_devdata *dd,
11140 struct buffer_control *bc, u16 *overall_limit)
11141 {
11142 u64 reg;
11143 int i;
11144
11145 /* not all entries are filled in */
11146 memset(bc, 0, sizeof(*bc));
11147
11148 /* OPA and HFI have a 1-1 mapping */
11149 for (i = 0; i < TXE_NUM_DATA_VL; i++)
11150 read_one_cm_vl(dd, SEND_CM_CREDIT_VL + (8 * i), &bc->vl[i]);
11151
11152 /* NOTE: assumes that VL* and VL15 CSRs are bit-wise identical */
11153 read_one_cm_vl(dd, SEND_CM_CREDIT_VL15, &bc->vl[15]);
11154
11155 reg = read_csr(dd, SEND_CM_GLOBAL_CREDIT);
11156 bc->overall_shared_limit = cpu_to_be16(
11157 (reg >> SEND_CM_GLOBAL_CREDIT_SHARED_LIMIT_SHIFT)
11158 & SEND_CM_GLOBAL_CREDIT_SHARED_LIMIT_MASK);
11159 if (overall_limit)
11160 *overall_limit = (reg
11161 >> SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_SHIFT)
11162 & SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_MASK;
11163 return sizeof(struct buffer_control);
11164 }
11165
get_sc2vlnt(struct hfi1_devdata * dd,struct sc2vlnt * dp)11166 static int get_sc2vlnt(struct hfi1_devdata *dd, struct sc2vlnt *dp)
11167 {
11168 u64 reg;
11169 int i;
11170
11171 /* each register contains 16 SC->VLnt mappings, 4 bits each */
11172 reg = read_csr(dd, DCC_CFG_SC_VL_TABLE_15_0);
11173 for (i = 0; i < sizeof(u64); i++) {
11174 u8 byte = *(((u8 *)®) + i);
11175
11176 dp->vlnt[2 * i] = byte & 0xf;
11177 dp->vlnt[(2 * i) + 1] = (byte & 0xf0) >> 4;
11178 }
11179
11180 reg = read_csr(dd, DCC_CFG_SC_VL_TABLE_31_16);
11181 for (i = 0; i < sizeof(u64); i++) {
11182 u8 byte = *(((u8 *)®) + i);
11183
11184 dp->vlnt[16 + (2 * i)] = byte & 0xf;
11185 dp->vlnt[16 + (2 * i) + 1] = (byte & 0xf0) >> 4;
11186 }
11187 return sizeof(struct sc2vlnt);
11188 }
11189
get_vlarb_preempt(struct hfi1_devdata * dd,u32 nelems,struct ib_vl_weight_elem * vl)11190 static void get_vlarb_preempt(struct hfi1_devdata *dd, u32 nelems,
11191 struct ib_vl_weight_elem *vl)
11192 {
11193 unsigned int i;
11194
11195 for (i = 0; i < nelems; i++, vl++) {
11196 vl->vl = 0xf;
11197 vl->weight = 0;
11198 }
11199 }
11200
set_sc2vlnt(struct hfi1_devdata * dd,struct sc2vlnt * dp)11201 static void set_sc2vlnt(struct hfi1_devdata *dd, struct sc2vlnt *dp)
11202 {
11203 write_csr(dd, DCC_CFG_SC_VL_TABLE_15_0,
11204 DC_SC_VL_VAL(15_0,
11205 0, dp->vlnt[0] & 0xf,
11206 1, dp->vlnt[1] & 0xf,
11207 2, dp->vlnt[2] & 0xf,
11208 3, dp->vlnt[3] & 0xf,
11209 4, dp->vlnt[4] & 0xf,
11210 5, dp->vlnt[5] & 0xf,
11211 6, dp->vlnt[6] & 0xf,
11212 7, dp->vlnt[7] & 0xf,
11213 8, dp->vlnt[8] & 0xf,
11214 9, dp->vlnt[9] & 0xf,
11215 10, dp->vlnt[10] & 0xf,
11216 11, dp->vlnt[11] & 0xf,
11217 12, dp->vlnt[12] & 0xf,
11218 13, dp->vlnt[13] & 0xf,
11219 14, dp->vlnt[14] & 0xf,
11220 15, dp->vlnt[15] & 0xf));
11221 write_csr(dd, DCC_CFG_SC_VL_TABLE_31_16,
11222 DC_SC_VL_VAL(31_16,
11223 16, dp->vlnt[16] & 0xf,
11224 17, dp->vlnt[17] & 0xf,
11225 18, dp->vlnt[18] & 0xf,
11226 19, dp->vlnt[19] & 0xf,
11227 20, dp->vlnt[20] & 0xf,
11228 21, dp->vlnt[21] & 0xf,
11229 22, dp->vlnt[22] & 0xf,
11230 23, dp->vlnt[23] & 0xf,
11231 24, dp->vlnt[24] & 0xf,
11232 25, dp->vlnt[25] & 0xf,
11233 26, dp->vlnt[26] & 0xf,
11234 27, dp->vlnt[27] & 0xf,
11235 28, dp->vlnt[28] & 0xf,
11236 29, dp->vlnt[29] & 0xf,
11237 30, dp->vlnt[30] & 0xf,
11238 31, dp->vlnt[31] & 0xf));
11239 }
11240
nonzero_msg(struct hfi1_devdata * dd,int idx,const char * what,u16 limit)11241 static void nonzero_msg(struct hfi1_devdata *dd, int idx, const char *what,
11242 u16 limit)
11243 {
11244 if (limit != 0)
11245 dd_dev_info(dd, "Invalid %s limit %d on VL %d, ignoring\n",
11246 what, (int)limit, idx);
11247 }
11248
11249 /* change only the shared limit portion of SendCmGLobalCredit */
set_global_shared(struct hfi1_devdata * dd,u16 limit)11250 static void set_global_shared(struct hfi1_devdata *dd, u16 limit)
11251 {
11252 u64 reg;
11253
11254 reg = read_csr(dd, SEND_CM_GLOBAL_CREDIT);
11255 reg &= ~SEND_CM_GLOBAL_CREDIT_SHARED_LIMIT_SMASK;
11256 reg |= (u64)limit << SEND_CM_GLOBAL_CREDIT_SHARED_LIMIT_SHIFT;
11257 write_csr(dd, SEND_CM_GLOBAL_CREDIT, reg);
11258 }
11259
11260 /* change only the total credit limit portion of SendCmGLobalCredit */
set_global_limit(struct hfi1_devdata * dd,u16 limit)11261 static void set_global_limit(struct hfi1_devdata *dd, u16 limit)
11262 {
11263 u64 reg;
11264
11265 reg = read_csr(dd, SEND_CM_GLOBAL_CREDIT);
11266 reg &= ~SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_SMASK;
11267 reg |= (u64)limit << SEND_CM_GLOBAL_CREDIT_TOTAL_CREDIT_LIMIT_SHIFT;
11268 write_csr(dd, SEND_CM_GLOBAL_CREDIT, reg);
11269 }
11270
11271 /* set the given per-VL shared limit */
set_vl_shared(struct hfi1_devdata * dd,int vl,u16 limit)11272 static void set_vl_shared(struct hfi1_devdata *dd, int vl, u16 limit)
11273 {
11274 u64 reg;
11275 u32 addr;
11276
11277 if (vl < TXE_NUM_DATA_VL)
11278 addr = SEND_CM_CREDIT_VL + (8 * vl);
11279 else
11280 addr = SEND_CM_CREDIT_VL15;
11281
11282 reg = read_csr(dd, addr);
11283 reg &= ~SEND_CM_CREDIT_VL_SHARED_LIMIT_VL_SMASK;
11284 reg |= (u64)limit << SEND_CM_CREDIT_VL_SHARED_LIMIT_VL_SHIFT;
11285 write_csr(dd, addr, reg);
11286 }
11287
11288 /* set the given per-VL dedicated limit */
set_vl_dedicated(struct hfi1_devdata * dd,int vl,u16 limit)11289 static void set_vl_dedicated(struct hfi1_devdata *dd, int vl, u16 limit)
11290 {
11291 u64 reg;
11292 u32 addr;
11293
11294 if (vl < TXE_NUM_DATA_VL)
11295 addr = SEND_CM_CREDIT_VL + (8 * vl);
11296 else
11297 addr = SEND_CM_CREDIT_VL15;
11298
11299 reg = read_csr(dd, addr);
11300 reg &= ~SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_SMASK;
11301 reg |= (u64)limit << SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_SHIFT;
11302 write_csr(dd, addr, reg);
11303 }
11304
11305 /* spin until the given per-VL status mask bits clear */
wait_for_vl_status_clear(struct hfi1_devdata * dd,u64 mask,const char * which)11306 static void wait_for_vl_status_clear(struct hfi1_devdata *dd, u64 mask,
11307 const char *which)
11308 {
11309 unsigned long timeout;
11310 u64 reg;
11311
11312 timeout = jiffies + msecs_to_jiffies(VL_STATUS_CLEAR_TIMEOUT);
11313 while (1) {
11314 reg = read_csr(dd, SEND_CM_CREDIT_USED_STATUS) & mask;
11315
11316 if (reg == 0)
11317 return; /* success */
11318 if (time_after(jiffies, timeout))
11319 break; /* timed out */
11320 udelay(1);
11321 }
11322
11323 dd_dev_err(dd,
11324 "%s credit change status not clearing after %dms, mask 0x%llx, not clear 0x%llx\n",
11325 which, VL_STATUS_CLEAR_TIMEOUT, mask, reg);
11326 /*
11327 * If this occurs, it is likely there was a credit loss on the link.
11328 * The only recovery from that is a link bounce.
11329 */
11330 dd_dev_err(dd,
11331 "Continuing anyway. A credit loss may occur. Suggest a link bounce\n");
11332 }
11333
11334 /*
11335 * The number of credits on the VLs may be changed while everything
11336 * is "live", but the following algorithm must be followed due to
11337 * how the hardware is actually implemented. In particular,
11338 * Return_Credit_Status[] is the only correct status check.
11339 *
11340 * if (reducing Global_Shared_Credit_Limit or any shared limit changing)
11341 * set Global_Shared_Credit_Limit = 0
11342 * use_all_vl = 1
11343 * mask0 = all VLs that are changing either dedicated or shared limits
11344 * set Shared_Limit[mask0] = 0
11345 * spin until Return_Credit_Status[use_all_vl ? all VL : mask0] == 0
11346 * if (changing any dedicated limit)
11347 * mask1 = all VLs that are lowering dedicated limits
11348 * lower Dedicated_Limit[mask1]
11349 * spin until Return_Credit_Status[mask1] == 0
11350 * raise Dedicated_Limits
11351 * raise Shared_Limits
11352 * raise Global_Shared_Credit_Limit
11353 *
11354 * lower = if the new limit is lower, set the limit to the new value
11355 * raise = if the new limit is higher than the current value (may be changed
11356 * earlier in the algorithm), set the new limit to the new value
11357 */
set_buffer_control(struct hfi1_pportdata * ppd,struct buffer_control * new_bc)11358 int set_buffer_control(struct hfi1_pportdata *ppd,
11359 struct buffer_control *new_bc)
11360 {
11361 struct hfi1_devdata *dd = ppd->dd;
11362 u64 changing_mask, ld_mask, stat_mask;
11363 int change_count;
11364 int i, use_all_mask;
11365 int this_shared_changing;
11366 int vl_count = 0, ret;
11367 /*
11368 * A0: add the variable any_shared_limit_changing below and in the
11369 * algorithm above. If removing A0 support, it can be removed.
11370 */
11371 int any_shared_limit_changing;
11372 struct buffer_control cur_bc;
11373 u8 changing[OPA_MAX_VLS];
11374 u8 lowering_dedicated[OPA_MAX_VLS];
11375 u16 cur_total;
11376 u32 new_total = 0;
11377 const u64 all_mask =
11378 SEND_CM_CREDIT_USED_STATUS_VL0_RETURN_CREDIT_STATUS_SMASK
11379 | SEND_CM_CREDIT_USED_STATUS_VL1_RETURN_CREDIT_STATUS_SMASK
11380 | SEND_CM_CREDIT_USED_STATUS_VL2_RETURN_CREDIT_STATUS_SMASK
11381 | SEND_CM_CREDIT_USED_STATUS_VL3_RETURN_CREDIT_STATUS_SMASK
11382 | SEND_CM_CREDIT_USED_STATUS_VL4_RETURN_CREDIT_STATUS_SMASK
11383 | SEND_CM_CREDIT_USED_STATUS_VL5_RETURN_CREDIT_STATUS_SMASK
11384 | SEND_CM_CREDIT_USED_STATUS_VL6_RETURN_CREDIT_STATUS_SMASK
11385 | SEND_CM_CREDIT_USED_STATUS_VL7_RETURN_CREDIT_STATUS_SMASK
11386 | SEND_CM_CREDIT_USED_STATUS_VL15_RETURN_CREDIT_STATUS_SMASK;
11387
11388 #define valid_vl(idx) ((idx) < TXE_NUM_DATA_VL || (idx) == 15)
11389 #define NUM_USABLE_VLS 16 /* look at VL15 and less */
11390
11391 /* find the new total credits, do sanity check on unused VLs */
11392 for (i = 0; i < OPA_MAX_VLS; i++) {
11393 if (valid_vl(i)) {
11394 new_total += be16_to_cpu(new_bc->vl[i].dedicated);
11395 continue;
11396 }
11397 nonzero_msg(dd, i, "dedicated",
11398 be16_to_cpu(new_bc->vl[i].dedicated));
11399 nonzero_msg(dd, i, "shared",
11400 be16_to_cpu(new_bc->vl[i].shared));
11401 new_bc->vl[i].dedicated = 0;
11402 new_bc->vl[i].shared = 0;
11403 }
11404 new_total += be16_to_cpu(new_bc->overall_shared_limit);
11405
11406 /* fetch the current values */
11407 get_buffer_control(dd, &cur_bc, &cur_total);
11408
11409 /*
11410 * Create the masks we will use.
11411 */
11412 memset(changing, 0, sizeof(changing));
11413 memset(lowering_dedicated, 0, sizeof(lowering_dedicated));
11414 /*
11415 * NOTE: Assumes that the individual VL bits are adjacent and in
11416 * increasing order
11417 */
11418 stat_mask =
11419 SEND_CM_CREDIT_USED_STATUS_VL0_RETURN_CREDIT_STATUS_SMASK;
11420 changing_mask = 0;
11421 ld_mask = 0;
11422 change_count = 0;
11423 any_shared_limit_changing = 0;
11424 for (i = 0; i < NUM_USABLE_VLS; i++, stat_mask <<= 1) {
11425 if (!valid_vl(i))
11426 continue;
11427 this_shared_changing = new_bc->vl[i].shared
11428 != cur_bc.vl[i].shared;
11429 if (this_shared_changing)
11430 any_shared_limit_changing = 1;
11431 if (new_bc->vl[i].dedicated != cur_bc.vl[i].dedicated ||
11432 this_shared_changing) {
11433 changing[i] = 1;
11434 changing_mask |= stat_mask;
11435 change_count++;
11436 }
11437 if (be16_to_cpu(new_bc->vl[i].dedicated) <
11438 be16_to_cpu(cur_bc.vl[i].dedicated)) {
11439 lowering_dedicated[i] = 1;
11440 ld_mask |= stat_mask;
11441 }
11442 }
11443
11444 /* bracket the credit change with a total adjustment */
11445 if (new_total > cur_total)
11446 set_global_limit(dd, new_total);
11447
11448 /*
11449 * Start the credit change algorithm.
11450 */
11451 use_all_mask = 0;
11452 if ((be16_to_cpu(new_bc->overall_shared_limit) <
11453 be16_to_cpu(cur_bc.overall_shared_limit)) ||
11454 (is_ax(dd) && any_shared_limit_changing)) {
11455 set_global_shared(dd, 0);
11456 cur_bc.overall_shared_limit = 0;
11457 use_all_mask = 1;
11458 }
11459
11460 for (i = 0; i < NUM_USABLE_VLS; i++) {
11461 if (!valid_vl(i))
11462 continue;
11463
11464 if (changing[i]) {
11465 set_vl_shared(dd, i, 0);
11466 cur_bc.vl[i].shared = 0;
11467 }
11468 }
11469
11470 wait_for_vl_status_clear(dd, use_all_mask ? all_mask : changing_mask,
11471 "shared");
11472
11473 if (change_count > 0) {
11474 for (i = 0; i < NUM_USABLE_VLS; i++) {
11475 if (!valid_vl(i))
11476 continue;
11477
11478 if (lowering_dedicated[i]) {
11479 set_vl_dedicated(dd, i,
11480 be16_to_cpu(new_bc->
11481 vl[i].dedicated));
11482 cur_bc.vl[i].dedicated =
11483 new_bc->vl[i].dedicated;
11484 }
11485 }
11486
11487 wait_for_vl_status_clear(dd, ld_mask, "dedicated");
11488
11489 /* now raise all dedicated that are going up */
11490 for (i = 0; i < NUM_USABLE_VLS; i++) {
11491 if (!valid_vl(i))
11492 continue;
11493
11494 if (be16_to_cpu(new_bc->vl[i].dedicated) >
11495 be16_to_cpu(cur_bc.vl[i].dedicated))
11496 set_vl_dedicated(dd, i,
11497 be16_to_cpu(new_bc->
11498 vl[i].dedicated));
11499 }
11500 }
11501
11502 /* next raise all shared that are going up */
11503 for (i = 0; i < NUM_USABLE_VLS; i++) {
11504 if (!valid_vl(i))
11505 continue;
11506
11507 if (be16_to_cpu(new_bc->vl[i].shared) >
11508 be16_to_cpu(cur_bc.vl[i].shared))
11509 set_vl_shared(dd, i, be16_to_cpu(new_bc->vl[i].shared));
11510 }
11511
11512 /* finally raise the global shared */
11513 if (be16_to_cpu(new_bc->overall_shared_limit) >
11514 be16_to_cpu(cur_bc.overall_shared_limit))
11515 set_global_shared(dd,
11516 be16_to_cpu(new_bc->overall_shared_limit));
11517
11518 /* bracket the credit change with a total adjustment */
11519 if (new_total < cur_total)
11520 set_global_limit(dd, new_total);
11521
11522 /*
11523 * Determine the actual number of operational VLS using the number of
11524 * dedicated and shared credits for each VL.
11525 */
11526 if (change_count > 0) {
11527 for (i = 0; i < TXE_NUM_DATA_VL; i++)
11528 if (be16_to_cpu(new_bc->vl[i].dedicated) > 0 ||
11529 be16_to_cpu(new_bc->vl[i].shared) > 0)
11530 vl_count++;
11531 ppd->actual_vls_operational = vl_count;
11532 ret = sdma_map_init(dd, ppd->port - 1, vl_count ?
11533 ppd->actual_vls_operational :
11534 ppd->vls_operational,
11535 NULL);
11536 if (ret == 0)
11537 ret = pio_map_init(dd, ppd->port - 1, vl_count ?
11538 ppd->actual_vls_operational :
11539 ppd->vls_operational, NULL);
11540 if (ret)
11541 return ret;
11542 }
11543 return 0;
11544 }
11545
11546 /*
11547 * Read the given fabric manager table. Return the size of the
11548 * table (in bytes) on success, and a negative error code on
11549 * failure.
11550 */
fm_get_table(struct hfi1_pportdata * ppd,int which,void * t)11551 int fm_get_table(struct hfi1_pportdata *ppd, int which, void *t)
11552
11553 {
11554 int size;
11555 struct vl_arb_cache *vlc;
11556
11557 switch (which) {
11558 case FM_TBL_VL_HIGH_ARB:
11559 size = 256;
11560 /*
11561 * OPA specifies 128 elements (of 2 bytes each), though
11562 * HFI supports only 16 elements in h/w.
11563 */
11564 vlc = vl_arb_lock_cache(ppd, HI_PRIO_TABLE);
11565 vl_arb_get_cache(vlc, t);
11566 vl_arb_unlock_cache(ppd, HI_PRIO_TABLE);
11567 break;
11568 case FM_TBL_VL_LOW_ARB:
11569 size = 256;
11570 /*
11571 * OPA specifies 128 elements (of 2 bytes each), though
11572 * HFI supports only 16 elements in h/w.
11573 */
11574 vlc = vl_arb_lock_cache(ppd, LO_PRIO_TABLE);
11575 vl_arb_get_cache(vlc, t);
11576 vl_arb_unlock_cache(ppd, LO_PRIO_TABLE);
11577 break;
11578 case FM_TBL_BUFFER_CONTROL:
11579 size = get_buffer_control(ppd->dd, t, NULL);
11580 break;
11581 case FM_TBL_SC2VLNT:
11582 size = get_sc2vlnt(ppd->dd, t);
11583 break;
11584 case FM_TBL_VL_PREEMPT_ELEMS:
11585 size = 256;
11586 /* OPA specifies 128 elements, of 2 bytes each */
11587 get_vlarb_preempt(ppd->dd, OPA_MAX_VLS, t);
11588 break;
11589 case FM_TBL_VL_PREEMPT_MATRIX:
11590 size = 256;
11591 /*
11592 * OPA specifies that this is the same size as the VL
11593 * arbitration tables (i.e., 256 bytes).
11594 */
11595 break;
11596 default:
11597 return -EINVAL;
11598 }
11599 return size;
11600 }
11601
11602 /*
11603 * Write the given fabric manager table.
11604 */
fm_set_table(struct hfi1_pportdata * ppd,int which,void * t)11605 int fm_set_table(struct hfi1_pportdata *ppd, int which, void *t)
11606 {
11607 int ret = 0;
11608 struct vl_arb_cache *vlc;
11609
11610 switch (which) {
11611 case FM_TBL_VL_HIGH_ARB:
11612 vlc = vl_arb_lock_cache(ppd, HI_PRIO_TABLE);
11613 if (vl_arb_match_cache(vlc, t)) {
11614 vl_arb_unlock_cache(ppd, HI_PRIO_TABLE);
11615 break;
11616 }
11617 vl_arb_set_cache(vlc, t);
11618 vl_arb_unlock_cache(ppd, HI_PRIO_TABLE);
11619 ret = set_vl_weights(ppd, SEND_HIGH_PRIORITY_LIST,
11620 VL_ARB_HIGH_PRIO_TABLE_SIZE, t);
11621 break;
11622 case FM_TBL_VL_LOW_ARB:
11623 vlc = vl_arb_lock_cache(ppd, LO_PRIO_TABLE);
11624 if (vl_arb_match_cache(vlc, t)) {
11625 vl_arb_unlock_cache(ppd, LO_PRIO_TABLE);
11626 break;
11627 }
11628 vl_arb_set_cache(vlc, t);
11629 vl_arb_unlock_cache(ppd, LO_PRIO_TABLE);
11630 ret = set_vl_weights(ppd, SEND_LOW_PRIORITY_LIST,
11631 VL_ARB_LOW_PRIO_TABLE_SIZE, t);
11632 break;
11633 case FM_TBL_BUFFER_CONTROL:
11634 ret = set_buffer_control(ppd, t);
11635 break;
11636 case FM_TBL_SC2VLNT:
11637 set_sc2vlnt(ppd->dd, t);
11638 break;
11639 default:
11640 ret = -EINVAL;
11641 }
11642 return ret;
11643 }
11644
11645 /*
11646 * Disable all data VLs.
11647 *
11648 * Return 0 if disabled, non-zero if the VLs cannot be disabled.
11649 */
disable_data_vls(struct hfi1_devdata * dd)11650 static int disable_data_vls(struct hfi1_devdata *dd)
11651 {
11652 if (is_ax(dd))
11653 return 1;
11654
11655 pio_send_control(dd, PSC_DATA_VL_DISABLE);
11656
11657 return 0;
11658 }
11659
11660 /*
11661 * open_fill_data_vls() - the counterpart to stop_drain_data_vls().
11662 * Just re-enables all data VLs (the "fill" part happens
11663 * automatically - the name was chosen for symmetry with
11664 * stop_drain_data_vls()).
11665 *
11666 * Return 0 if successful, non-zero if the VLs cannot be enabled.
11667 */
open_fill_data_vls(struct hfi1_devdata * dd)11668 int open_fill_data_vls(struct hfi1_devdata *dd)
11669 {
11670 if (is_ax(dd))
11671 return 1;
11672
11673 pio_send_control(dd, PSC_DATA_VL_ENABLE);
11674
11675 return 0;
11676 }
11677
11678 /*
11679 * drain_data_vls() - assumes that disable_data_vls() has been called,
11680 * wait for occupancy (of per-VL FIFOs) for all contexts, and SDMA
11681 * engines to drop to 0.
11682 */
drain_data_vls(struct hfi1_devdata * dd)11683 static void drain_data_vls(struct hfi1_devdata *dd)
11684 {
11685 sc_wait(dd);
11686 sdma_wait(dd);
11687 pause_for_credit_return(dd);
11688 }
11689
11690 /*
11691 * stop_drain_data_vls() - disable, then drain all per-VL fifos.
11692 *
11693 * Use open_fill_data_vls() to resume using data VLs. This pair is
11694 * meant to be used like this:
11695 *
11696 * stop_drain_data_vls(dd);
11697 * // do things with per-VL resources
11698 * open_fill_data_vls(dd);
11699 */
stop_drain_data_vls(struct hfi1_devdata * dd)11700 int stop_drain_data_vls(struct hfi1_devdata *dd)
11701 {
11702 int ret;
11703
11704 ret = disable_data_vls(dd);
11705 if (ret == 0)
11706 drain_data_vls(dd);
11707
11708 return ret;
11709 }
11710
11711 /*
11712 * Convert a nanosecond time to a cclock count. No matter how slow
11713 * the cclock, a non-zero ns will always have a non-zero result.
11714 */
ns_to_cclock(struct hfi1_devdata * dd,u32 ns)11715 u32 ns_to_cclock(struct hfi1_devdata *dd, u32 ns)
11716 {
11717 u32 cclocks;
11718
11719 if (dd->icode == ICODE_FPGA_EMULATION)
11720 cclocks = (ns * 1000) / FPGA_CCLOCK_PS;
11721 else /* simulation pretends to be ASIC */
11722 cclocks = (ns * 1000) / ASIC_CCLOCK_PS;
11723 if (ns && !cclocks) /* if ns nonzero, must be at least 1 */
11724 cclocks = 1;
11725 return cclocks;
11726 }
11727
11728 /*
11729 * Convert a cclock count to nanoseconds. Not matter how slow
11730 * the cclock, a non-zero cclocks will always have a non-zero result.
11731 */
cclock_to_ns(struct hfi1_devdata * dd,u32 cclocks)11732 u32 cclock_to_ns(struct hfi1_devdata *dd, u32 cclocks)
11733 {
11734 u32 ns;
11735
11736 if (dd->icode == ICODE_FPGA_EMULATION)
11737 ns = (cclocks * FPGA_CCLOCK_PS) / 1000;
11738 else /* simulation pretends to be ASIC */
11739 ns = (cclocks * ASIC_CCLOCK_PS) / 1000;
11740 if (cclocks && !ns)
11741 ns = 1;
11742 return ns;
11743 }
11744
11745 /*
11746 * Dynamically adjust the receive interrupt timeout for a context based on
11747 * incoming packet rate.
11748 *
11749 * NOTE: Dynamic adjustment does not allow rcv_intr_count to be zero.
11750 */
adjust_rcv_timeout(struct hfi1_ctxtdata * rcd,u32 npkts)11751 static void adjust_rcv_timeout(struct hfi1_ctxtdata *rcd, u32 npkts)
11752 {
11753 struct hfi1_devdata *dd = rcd->dd;
11754 u32 timeout = rcd->rcvavail_timeout;
11755
11756 /*
11757 * This algorithm doubles or halves the timeout depending on whether
11758 * the number of packets received in this interrupt were less than or
11759 * greater equal the interrupt count.
11760 *
11761 * The calculations below do not allow a steady state to be achieved.
11762 * Only at the endpoints it is possible to have an unchanging
11763 * timeout.
11764 */
11765 if (npkts < rcv_intr_count) {
11766 /*
11767 * Not enough packets arrived before the timeout, adjust
11768 * timeout downward.
11769 */
11770 if (timeout < 2) /* already at minimum? */
11771 return;
11772 timeout >>= 1;
11773 } else {
11774 /*
11775 * More than enough packets arrived before the timeout, adjust
11776 * timeout upward.
11777 */
11778 if (timeout >= dd->rcv_intr_timeout_csr) /* already at max? */
11779 return;
11780 timeout = min(timeout << 1, dd->rcv_intr_timeout_csr);
11781 }
11782
11783 rcd->rcvavail_timeout = timeout;
11784 /*
11785 * timeout cannot be larger than rcv_intr_timeout_csr which has already
11786 * been verified to be in range
11787 */
11788 write_kctxt_csr(dd, rcd->ctxt, RCV_AVAIL_TIME_OUT,
11789 (u64)timeout <<
11790 RCV_AVAIL_TIME_OUT_TIME_OUT_RELOAD_SHIFT);
11791 }
11792
update_usrhead(struct hfi1_ctxtdata * rcd,u32 hd,u32 updegr,u32 egrhd,u32 intr_adjust,u32 npkts)11793 void update_usrhead(struct hfi1_ctxtdata *rcd, u32 hd, u32 updegr, u32 egrhd,
11794 u32 intr_adjust, u32 npkts)
11795 {
11796 struct hfi1_devdata *dd = rcd->dd;
11797 u64 reg;
11798 u32 ctxt = rcd->ctxt;
11799
11800 /*
11801 * Need to write timeout register before updating RcvHdrHead to ensure
11802 * that a new value is used when the HW decides to restart counting.
11803 */
11804 if (intr_adjust)
11805 adjust_rcv_timeout(rcd, npkts);
11806 if (updegr) {
11807 reg = (egrhd & RCV_EGR_INDEX_HEAD_HEAD_MASK)
11808 << RCV_EGR_INDEX_HEAD_HEAD_SHIFT;
11809 write_uctxt_csr(dd, ctxt, RCV_EGR_INDEX_HEAD, reg);
11810 }
11811 reg = ((u64)rcv_intr_count << RCV_HDR_HEAD_COUNTER_SHIFT) |
11812 (((u64)hd & RCV_HDR_HEAD_HEAD_MASK)
11813 << RCV_HDR_HEAD_HEAD_SHIFT);
11814 write_uctxt_csr(dd, ctxt, RCV_HDR_HEAD, reg);
11815 }
11816
hdrqempty(struct hfi1_ctxtdata * rcd)11817 u32 hdrqempty(struct hfi1_ctxtdata *rcd)
11818 {
11819 u32 head, tail;
11820
11821 head = (read_uctxt_csr(rcd->dd, rcd->ctxt, RCV_HDR_HEAD)
11822 & RCV_HDR_HEAD_HEAD_SMASK) >> RCV_HDR_HEAD_HEAD_SHIFT;
11823
11824 if (rcd->rcvhdrtail_kvaddr)
11825 tail = get_rcvhdrtail(rcd);
11826 else
11827 tail = read_uctxt_csr(rcd->dd, rcd->ctxt, RCV_HDR_TAIL);
11828
11829 return head == tail;
11830 }
11831
11832 /*
11833 * Context Control and Receive Array encoding for buffer size:
11834 * 0x0 invalid
11835 * 0x1 4 KB
11836 * 0x2 8 KB
11837 * 0x3 16 KB
11838 * 0x4 32 KB
11839 * 0x5 64 KB
11840 * 0x6 128 KB
11841 * 0x7 256 KB
11842 * 0x8 512 KB (Receive Array only)
11843 * 0x9 1 MB (Receive Array only)
11844 * 0xa 2 MB (Receive Array only)
11845 *
11846 * 0xB-0xF - reserved (Receive Array only)
11847 *
11848 *
11849 * This routine assumes that the value has already been sanity checked.
11850 */
encoded_size(u32 size)11851 static u32 encoded_size(u32 size)
11852 {
11853 switch (size) {
11854 case 4 * 1024: return 0x1;
11855 case 8 * 1024: return 0x2;
11856 case 16 * 1024: return 0x3;
11857 case 32 * 1024: return 0x4;
11858 case 64 * 1024: return 0x5;
11859 case 128 * 1024: return 0x6;
11860 case 256 * 1024: return 0x7;
11861 case 512 * 1024: return 0x8;
11862 case 1 * 1024 * 1024: return 0x9;
11863 case 2 * 1024 * 1024: return 0xa;
11864 }
11865 return 0x1; /* if invalid, go with the minimum size */
11866 }
11867
hfi1_rcvctrl(struct hfi1_devdata * dd,unsigned int op,struct hfi1_ctxtdata * rcd)11868 void hfi1_rcvctrl(struct hfi1_devdata *dd, unsigned int op,
11869 struct hfi1_ctxtdata *rcd)
11870 {
11871 u64 rcvctrl, reg;
11872 int did_enable = 0;
11873 u16 ctxt;
11874
11875 if (!rcd)
11876 return;
11877
11878 ctxt = rcd->ctxt;
11879
11880 hfi1_cdbg(RCVCTRL, "ctxt %d op 0x%x", ctxt, op);
11881
11882 rcvctrl = read_kctxt_csr(dd, ctxt, RCV_CTXT_CTRL);
11883 /* if the context already enabled, don't do the extra steps */
11884 if ((op & HFI1_RCVCTRL_CTXT_ENB) &&
11885 !(rcvctrl & RCV_CTXT_CTRL_ENABLE_SMASK)) {
11886 /* reset the tail and hdr addresses, and sequence count */
11887 write_kctxt_csr(dd, ctxt, RCV_HDR_ADDR,
11888 rcd->rcvhdrq_dma);
11889 if (rcd->rcvhdrtail_kvaddr)
11890 write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
11891 rcd->rcvhdrqtailaddr_dma);
11892 rcd->seq_cnt = 1;
11893
11894 /* reset the cached receive header queue head value */
11895 rcd->head = 0;
11896
11897 /*
11898 * Zero the receive header queue so we don't get false
11899 * positives when checking the sequence number. The
11900 * sequence numbers could land exactly on the same spot.
11901 * E.g. a rcd restart before the receive header wrapped.
11902 */
11903 memset(rcd->rcvhdrq, 0, rcvhdrq_size(rcd));
11904
11905 /* starting timeout */
11906 rcd->rcvavail_timeout = dd->rcv_intr_timeout_csr;
11907
11908 /* enable the context */
11909 rcvctrl |= RCV_CTXT_CTRL_ENABLE_SMASK;
11910
11911 /* clean the egr buffer size first */
11912 rcvctrl &= ~RCV_CTXT_CTRL_EGR_BUF_SIZE_SMASK;
11913 rcvctrl |= ((u64)encoded_size(rcd->egrbufs.rcvtid_size)
11914 & RCV_CTXT_CTRL_EGR_BUF_SIZE_MASK)
11915 << RCV_CTXT_CTRL_EGR_BUF_SIZE_SHIFT;
11916
11917 /* zero RcvHdrHead - set RcvHdrHead.Counter after enable */
11918 write_uctxt_csr(dd, ctxt, RCV_HDR_HEAD, 0);
11919 did_enable = 1;
11920
11921 /* zero RcvEgrIndexHead */
11922 write_uctxt_csr(dd, ctxt, RCV_EGR_INDEX_HEAD, 0);
11923
11924 /* set eager count and base index */
11925 reg = (((u64)(rcd->egrbufs.alloced >> RCV_SHIFT)
11926 & RCV_EGR_CTRL_EGR_CNT_MASK)
11927 << RCV_EGR_CTRL_EGR_CNT_SHIFT) |
11928 (((rcd->eager_base >> RCV_SHIFT)
11929 & RCV_EGR_CTRL_EGR_BASE_INDEX_MASK)
11930 << RCV_EGR_CTRL_EGR_BASE_INDEX_SHIFT);
11931 write_kctxt_csr(dd, ctxt, RCV_EGR_CTRL, reg);
11932
11933 /*
11934 * Set TID (expected) count and base index.
11935 * rcd->expected_count is set to individual RcvArray entries,
11936 * not pairs, and the CSR takes a pair-count in groups of
11937 * four, so divide by 8.
11938 */
11939 reg = (((rcd->expected_count >> RCV_SHIFT)
11940 & RCV_TID_CTRL_TID_PAIR_CNT_MASK)
11941 << RCV_TID_CTRL_TID_PAIR_CNT_SHIFT) |
11942 (((rcd->expected_base >> RCV_SHIFT)
11943 & RCV_TID_CTRL_TID_BASE_INDEX_MASK)
11944 << RCV_TID_CTRL_TID_BASE_INDEX_SHIFT);
11945 write_kctxt_csr(dd, ctxt, RCV_TID_CTRL, reg);
11946 if (ctxt == HFI1_CTRL_CTXT)
11947 write_csr(dd, RCV_VL15, HFI1_CTRL_CTXT);
11948 }
11949 if (op & HFI1_RCVCTRL_CTXT_DIS) {
11950 write_csr(dd, RCV_VL15, 0);
11951 /*
11952 * When receive context is being disabled turn on tail
11953 * update with a dummy tail address and then disable
11954 * receive context.
11955 */
11956 if (dd->rcvhdrtail_dummy_dma) {
11957 write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
11958 dd->rcvhdrtail_dummy_dma);
11959 /* Enabling RcvCtxtCtrl.TailUpd is intentional. */
11960 rcvctrl |= RCV_CTXT_CTRL_TAIL_UPD_SMASK;
11961 }
11962
11963 rcvctrl &= ~RCV_CTXT_CTRL_ENABLE_SMASK;
11964 }
11965 if (op & HFI1_RCVCTRL_INTRAVAIL_ENB) {
11966 set_intr_bits(dd, IS_RCVAVAIL_START + rcd->ctxt,
11967 IS_RCVAVAIL_START + rcd->ctxt, true);
11968 rcvctrl |= RCV_CTXT_CTRL_INTR_AVAIL_SMASK;
11969 }
11970 if (op & HFI1_RCVCTRL_INTRAVAIL_DIS) {
11971 set_intr_bits(dd, IS_RCVAVAIL_START + rcd->ctxt,
11972 IS_RCVAVAIL_START + rcd->ctxt, false);
11973 rcvctrl &= ~RCV_CTXT_CTRL_INTR_AVAIL_SMASK;
11974 }
11975 if ((op & HFI1_RCVCTRL_TAILUPD_ENB) && rcd->rcvhdrtail_kvaddr)
11976 rcvctrl |= RCV_CTXT_CTRL_TAIL_UPD_SMASK;
11977 if (op & HFI1_RCVCTRL_TAILUPD_DIS) {
11978 /* See comment on RcvCtxtCtrl.TailUpd above */
11979 if (!(op & HFI1_RCVCTRL_CTXT_DIS))
11980 rcvctrl &= ~RCV_CTXT_CTRL_TAIL_UPD_SMASK;
11981 }
11982 if (op & HFI1_RCVCTRL_TIDFLOW_ENB)
11983 rcvctrl |= RCV_CTXT_CTRL_TID_FLOW_ENABLE_SMASK;
11984 if (op & HFI1_RCVCTRL_TIDFLOW_DIS)
11985 rcvctrl &= ~RCV_CTXT_CTRL_TID_FLOW_ENABLE_SMASK;
11986 if (op & HFI1_RCVCTRL_ONE_PKT_EGR_ENB) {
11987 /*
11988 * In one-packet-per-eager mode, the size comes from
11989 * the RcvArray entry.
11990 */
11991 rcvctrl &= ~RCV_CTXT_CTRL_EGR_BUF_SIZE_SMASK;
11992 rcvctrl |= RCV_CTXT_CTRL_ONE_PACKET_PER_EGR_BUFFER_SMASK;
11993 }
11994 if (op & HFI1_RCVCTRL_ONE_PKT_EGR_DIS)
11995 rcvctrl &= ~RCV_CTXT_CTRL_ONE_PACKET_PER_EGR_BUFFER_SMASK;
11996 if (op & HFI1_RCVCTRL_NO_RHQ_DROP_ENB)
11997 rcvctrl |= RCV_CTXT_CTRL_DONT_DROP_RHQ_FULL_SMASK;
11998 if (op & HFI1_RCVCTRL_NO_RHQ_DROP_DIS)
11999 rcvctrl &= ~RCV_CTXT_CTRL_DONT_DROP_RHQ_FULL_SMASK;
12000 if (op & HFI1_RCVCTRL_NO_EGR_DROP_ENB)
12001 rcvctrl |= RCV_CTXT_CTRL_DONT_DROP_EGR_FULL_SMASK;
12002 if (op & HFI1_RCVCTRL_NO_EGR_DROP_DIS)
12003 rcvctrl &= ~RCV_CTXT_CTRL_DONT_DROP_EGR_FULL_SMASK;
12004 if (op & HFI1_RCVCTRL_URGENT_ENB)
12005 set_intr_bits(dd, IS_RCVURGENT_START + rcd->ctxt,
12006 IS_RCVURGENT_START + rcd->ctxt, true);
12007 if (op & HFI1_RCVCTRL_URGENT_DIS)
12008 set_intr_bits(dd, IS_RCVURGENT_START + rcd->ctxt,
12009 IS_RCVURGENT_START + rcd->ctxt, false);
12010
12011 hfi1_cdbg(RCVCTRL, "ctxt %d rcvctrl 0x%llx\n", ctxt, rcvctrl);
12012 write_kctxt_csr(dd, ctxt, RCV_CTXT_CTRL, rcvctrl);
12013
12014 /* work around sticky RcvCtxtStatus.BlockedRHQFull */
12015 if (did_enable &&
12016 (rcvctrl & RCV_CTXT_CTRL_DONT_DROP_RHQ_FULL_SMASK)) {
12017 reg = read_kctxt_csr(dd, ctxt, RCV_CTXT_STATUS);
12018 if (reg != 0) {
12019 dd_dev_info(dd, "ctxt %d status %lld (blocked)\n",
12020 ctxt, reg);
12021 read_uctxt_csr(dd, ctxt, RCV_HDR_HEAD);
12022 write_uctxt_csr(dd, ctxt, RCV_HDR_HEAD, 0x10);
12023 write_uctxt_csr(dd, ctxt, RCV_HDR_HEAD, 0x00);
12024 read_uctxt_csr(dd, ctxt, RCV_HDR_HEAD);
12025 reg = read_kctxt_csr(dd, ctxt, RCV_CTXT_STATUS);
12026 dd_dev_info(dd, "ctxt %d status %lld (%s blocked)\n",
12027 ctxt, reg, reg == 0 ? "not" : "still");
12028 }
12029 }
12030
12031 if (did_enable) {
12032 /*
12033 * The interrupt timeout and count must be set after
12034 * the context is enabled to take effect.
12035 */
12036 /* set interrupt timeout */
12037 write_kctxt_csr(dd, ctxt, RCV_AVAIL_TIME_OUT,
12038 (u64)rcd->rcvavail_timeout <<
12039 RCV_AVAIL_TIME_OUT_TIME_OUT_RELOAD_SHIFT);
12040
12041 /* set RcvHdrHead.Counter, zero RcvHdrHead.Head (again) */
12042 reg = (u64)rcv_intr_count << RCV_HDR_HEAD_COUNTER_SHIFT;
12043 write_uctxt_csr(dd, ctxt, RCV_HDR_HEAD, reg);
12044 }
12045
12046 if (op & (HFI1_RCVCTRL_TAILUPD_DIS | HFI1_RCVCTRL_CTXT_DIS))
12047 /*
12048 * If the context has been disabled and the Tail Update has
12049 * been cleared, set the RCV_HDR_TAIL_ADDR CSR to dummy address
12050 * so it doesn't contain an address that is invalid.
12051 */
12052 write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
12053 dd->rcvhdrtail_dummy_dma);
12054 }
12055
hfi1_read_cntrs(struct hfi1_devdata * dd,char ** namep,u64 ** cntrp)12056 u32 hfi1_read_cntrs(struct hfi1_devdata *dd, char **namep, u64 **cntrp)
12057 {
12058 int ret;
12059 u64 val = 0;
12060
12061 if (namep) {
12062 ret = dd->cntrnameslen;
12063 *namep = dd->cntrnames;
12064 } else {
12065 const struct cntr_entry *entry;
12066 int i, j;
12067
12068 ret = (dd->ndevcntrs) * sizeof(u64);
12069
12070 /* Get the start of the block of counters */
12071 *cntrp = dd->cntrs;
12072
12073 /*
12074 * Now go and fill in each counter in the block.
12075 */
12076 for (i = 0; i < DEV_CNTR_LAST; i++) {
12077 entry = &dev_cntrs[i];
12078 hfi1_cdbg(CNTR, "reading %s", entry->name);
12079 if (entry->flags & CNTR_DISABLED) {
12080 /* Nothing */
12081 hfi1_cdbg(CNTR, "\tDisabled\n");
12082 } else {
12083 if (entry->flags & CNTR_VL) {
12084 hfi1_cdbg(CNTR, "\tPer VL\n");
12085 for (j = 0; j < C_VL_COUNT; j++) {
12086 val = entry->rw_cntr(entry,
12087 dd, j,
12088 CNTR_MODE_R,
12089 0);
12090 hfi1_cdbg(
12091 CNTR,
12092 "\t\tRead 0x%llx for %d\n",
12093 val, j);
12094 dd->cntrs[entry->offset + j] =
12095 val;
12096 }
12097 } else if (entry->flags & CNTR_SDMA) {
12098 hfi1_cdbg(CNTR,
12099 "\t Per SDMA Engine\n");
12100 for (j = 0; j < chip_sdma_engines(dd);
12101 j++) {
12102 val =
12103 entry->rw_cntr(entry, dd, j,
12104 CNTR_MODE_R, 0);
12105 hfi1_cdbg(CNTR,
12106 "\t\tRead 0x%llx for %d\n",
12107 val, j);
12108 dd->cntrs[entry->offset + j] =
12109 val;
12110 }
12111 } else {
12112 val = entry->rw_cntr(entry, dd,
12113 CNTR_INVALID_VL,
12114 CNTR_MODE_R, 0);
12115 dd->cntrs[entry->offset] = val;
12116 hfi1_cdbg(CNTR, "\tRead 0x%llx", val);
12117 }
12118 }
12119 }
12120 }
12121 return ret;
12122 }
12123
12124 /*
12125 * Used by sysfs to create files for hfi stats to read
12126 */
hfi1_read_portcntrs(struct hfi1_pportdata * ppd,char ** namep,u64 ** cntrp)12127 u32 hfi1_read_portcntrs(struct hfi1_pportdata *ppd, char **namep, u64 **cntrp)
12128 {
12129 int ret;
12130 u64 val = 0;
12131
12132 if (namep) {
12133 ret = ppd->dd->portcntrnameslen;
12134 *namep = ppd->dd->portcntrnames;
12135 } else {
12136 const struct cntr_entry *entry;
12137 int i, j;
12138
12139 ret = ppd->dd->nportcntrs * sizeof(u64);
12140 *cntrp = ppd->cntrs;
12141
12142 for (i = 0; i < PORT_CNTR_LAST; i++) {
12143 entry = &port_cntrs[i];
12144 hfi1_cdbg(CNTR, "reading %s", entry->name);
12145 if (entry->flags & CNTR_DISABLED) {
12146 /* Nothing */
12147 hfi1_cdbg(CNTR, "\tDisabled\n");
12148 continue;
12149 }
12150
12151 if (entry->flags & CNTR_VL) {
12152 hfi1_cdbg(CNTR, "\tPer VL");
12153 for (j = 0; j < C_VL_COUNT; j++) {
12154 val = entry->rw_cntr(entry, ppd, j,
12155 CNTR_MODE_R,
12156 0);
12157 hfi1_cdbg(
12158 CNTR,
12159 "\t\tRead 0x%llx for %d",
12160 val, j);
12161 ppd->cntrs[entry->offset + j] = val;
12162 }
12163 } else {
12164 val = entry->rw_cntr(entry, ppd,
12165 CNTR_INVALID_VL,
12166 CNTR_MODE_R,
12167 0);
12168 ppd->cntrs[entry->offset] = val;
12169 hfi1_cdbg(CNTR, "\tRead 0x%llx", val);
12170 }
12171 }
12172 }
12173 return ret;
12174 }
12175
free_cntrs(struct hfi1_devdata * dd)12176 static void free_cntrs(struct hfi1_devdata *dd)
12177 {
12178 struct hfi1_pportdata *ppd;
12179 int i;
12180
12181 if (dd->synth_stats_timer.function)
12182 del_timer_sync(&dd->synth_stats_timer);
12183 ppd = (struct hfi1_pportdata *)(dd + 1);
12184 for (i = 0; i < dd->num_pports; i++, ppd++) {
12185 kfree(ppd->cntrs);
12186 kfree(ppd->scntrs);
12187 free_percpu(ppd->ibport_data.rvp.rc_acks);
12188 free_percpu(ppd->ibport_data.rvp.rc_qacks);
12189 free_percpu(ppd->ibport_data.rvp.rc_delayed_comp);
12190 ppd->cntrs = NULL;
12191 ppd->scntrs = NULL;
12192 ppd->ibport_data.rvp.rc_acks = NULL;
12193 ppd->ibport_data.rvp.rc_qacks = NULL;
12194 ppd->ibport_data.rvp.rc_delayed_comp = NULL;
12195 }
12196 kfree(dd->portcntrnames);
12197 dd->portcntrnames = NULL;
12198 kfree(dd->cntrs);
12199 dd->cntrs = NULL;
12200 kfree(dd->scntrs);
12201 dd->scntrs = NULL;
12202 kfree(dd->cntrnames);
12203 dd->cntrnames = NULL;
12204 if (dd->update_cntr_wq) {
12205 destroy_workqueue(dd->update_cntr_wq);
12206 dd->update_cntr_wq = NULL;
12207 }
12208 }
12209
read_dev_port_cntr(struct hfi1_devdata * dd,struct cntr_entry * entry,u64 * psval,void * context,int vl)12210 static u64 read_dev_port_cntr(struct hfi1_devdata *dd, struct cntr_entry *entry,
12211 u64 *psval, void *context, int vl)
12212 {
12213 u64 val;
12214 u64 sval = *psval;
12215
12216 if (entry->flags & CNTR_DISABLED) {
12217 dd_dev_err(dd, "Counter %s not enabled", entry->name);
12218 return 0;
12219 }
12220
12221 hfi1_cdbg(CNTR, "cntr: %s vl %d psval 0x%llx", entry->name, vl, *psval);
12222
12223 val = entry->rw_cntr(entry, context, vl, CNTR_MODE_R, 0);
12224
12225 /* If its a synthetic counter there is more work we need to do */
12226 if (entry->flags & CNTR_SYNTH) {
12227 if (sval == CNTR_MAX) {
12228 /* No need to read already saturated */
12229 return CNTR_MAX;
12230 }
12231
12232 if (entry->flags & CNTR_32BIT) {
12233 /* 32bit counters can wrap multiple times */
12234 u64 upper = sval >> 32;
12235 u64 lower = (sval << 32) >> 32;
12236
12237 if (lower > val) { /* hw wrapped */
12238 if (upper == CNTR_32BIT_MAX)
12239 val = CNTR_MAX;
12240 else
12241 upper++;
12242 }
12243
12244 if (val != CNTR_MAX)
12245 val = (upper << 32) | val;
12246
12247 } else {
12248 /* If we rolled we are saturated */
12249 if ((val < sval) || (val > CNTR_MAX))
12250 val = CNTR_MAX;
12251 }
12252 }
12253
12254 *psval = val;
12255
12256 hfi1_cdbg(CNTR, "\tNew val=0x%llx", val);
12257
12258 return val;
12259 }
12260
write_dev_port_cntr(struct hfi1_devdata * dd,struct cntr_entry * entry,u64 * psval,void * context,int vl,u64 data)12261 static u64 write_dev_port_cntr(struct hfi1_devdata *dd,
12262 struct cntr_entry *entry,
12263 u64 *psval, void *context, int vl, u64 data)
12264 {
12265 u64 val;
12266
12267 if (entry->flags & CNTR_DISABLED) {
12268 dd_dev_err(dd, "Counter %s not enabled", entry->name);
12269 return 0;
12270 }
12271
12272 hfi1_cdbg(CNTR, "cntr: %s vl %d psval 0x%llx", entry->name, vl, *psval);
12273
12274 if (entry->flags & CNTR_SYNTH) {
12275 *psval = data;
12276 if (entry->flags & CNTR_32BIT) {
12277 val = entry->rw_cntr(entry, context, vl, CNTR_MODE_W,
12278 (data << 32) >> 32);
12279 val = data; /* return the full 64bit value */
12280 } else {
12281 val = entry->rw_cntr(entry, context, vl, CNTR_MODE_W,
12282 data);
12283 }
12284 } else {
12285 val = entry->rw_cntr(entry, context, vl, CNTR_MODE_W, data);
12286 }
12287
12288 *psval = val;
12289
12290 hfi1_cdbg(CNTR, "\tNew val=0x%llx", val);
12291
12292 return val;
12293 }
12294
read_dev_cntr(struct hfi1_devdata * dd,int index,int vl)12295 u64 read_dev_cntr(struct hfi1_devdata *dd, int index, int vl)
12296 {
12297 struct cntr_entry *entry;
12298 u64 *sval;
12299
12300 entry = &dev_cntrs[index];
12301 sval = dd->scntrs + entry->offset;
12302
12303 if (vl != CNTR_INVALID_VL)
12304 sval += vl;
12305
12306 return read_dev_port_cntr(dd, entry, sval, dd, vl);
12307 }
12308
write_dev_cntr(struct hfi1_devdata * dd,int index,int vl,u64 data)12309 u64 write_dev_cntr(struct hfi1_devdata *dd, int index, int vl, u64 data)
12310 {
12311 struct cntr_entry *entry;
12312 u64 *sval;
12313
12314 entry = &dev_cntrs[index];
12315 sval = dd->scntrs + entry->offset;
12316
12317 if (vl != CNTR_INVALID_VL)
12318 sval += vl;
12319
12320 return write_dev_port_cntr(dd, entry, sval, dd, vl, data);
12321 }
12322
read_port_cntr(struct hfi1_pportdata * ppd,int index,int vl)12323 u64 read_port_cntr(struct hfi1_pportdata *ppd, int index, int vl)
12324 {
12325 struct cntr_entry *entry;
12326 u64 *sval;
12327
12328 entry = &port_cntrs[index];
12329 sval = ppd->scntrs + entry->offset;
12330
12331 if (vl != CNTR_INVALID_VL)
12332 sval += vl;
12333
12334 if ((index >= C_RCV_HDR_OVF_FIRST + ppd->dd->num_rcv_contexts) &&
12335 (index <= C_RCV_HDR_OVF_LAST)) {
12336 /* We do not want to bother for disabled contexts */
12337 return 0;
12338 }
12339
12340 return read_dev_port_cntr(ppd->dd, entry, sval, ppd, vl);
12341 }
12342
write_port_cntr(struct hfi1_pportdata * ppd,int index,int vl,u64 data)12343 u64 write_port_cntr(struct hfi1_pportdata *ppd, int index, int vl, u64 data)
12344 {
12345 struct cntr_entry *entry;
12346 u64 *sval;
12347
12348 entry = &port_cntrs[index];
12349 sval = ppd->scntrs + entry->offset;
12350
12351 if (vl != CNTR_INVALID_VL)
12352 sval += vl;
12353
12354 if ((index >= C_RCV_HDR_OVF_FIRST + ppd->dd->num_rcv_contexts) &&
12355 (index <= C_RCV_HDR_OVF_LAST)) {
12356 /* We do not want to bother for disabled contexts */
12357 return 0;
12358 }
12359
12360 return write_dev_port_cntr(ppd->dd, entry, sval, ppd, vl, data);
12361 }
12362
do_update_synth_timer(struct work_struct * work)12363 static void do_update_synth_timer(struct work_struct *work)
12364 {
12365 u64 cur_tx;
12366 u64 cur_rx;
12367 u64 total_flits;
12368 u8 update = 0;
12369 int i, j, vl;
12370 struct hfi1_pportdata *ppd;
12371 struct cntr_entry *entry;
12372 struct hfi1_devdata *dd = container_of(work, struct hfi1_devdata,
12373 update_cntr_work);
12374
12375 /*
12376 * Rather than keep beating on the CSRs pick a minimal set that we can
12377 * check to watch for potential roll over. We can do this by looking at
12378 * the number of flits sent/recv. If the total flits exceeds 32bits then
12379 * we have to iterate all the counters and update.
12380 */
12381 entry = &dev_cntrs[C_DC_RCV_FLITS];
12382 cur_rx = entry->rw_cntr(entry, dd, CNTR_INVALID_VL, CNTR_MODE_R, 0);
12383
12384 entry = &dev_cntrs[C_DC_XMIT_FLITS];
12385 cur_tx = entry->rw_cntr(entry, dd, CNTR_INVALID_VL, CNTR_MODE_R, 0);
12386
12387 hfi1_cdbg(
12388 CNTR,
12389 "[%d] curr tx=0x%llx rx=0x%llx :: last tx=0x%llx rx=0x%llx\n",
12390 dd->unit, cur_tx, cur_rx, dd->last_tx, dd->last_rx);
12391
12392 if ((cur_tx < dd->last_tx) || (cur_rx < dd->last_rx)) {
12393 /*
12394 * May not be strictly necessary to update but it won't hurt and
12395 * simplifies the logic here.
12396 */
12397 update = 1;
12398 hfi1_cdbg(CNTR, "[%d] Tripwire counter rolled, updating",
12399 dd->unit);
12400 } else {
12401 total_flits = (cur_tx - dd->last_tx) + (cur_rx - dd->last_rx);
12402 hfi1_cdbg(CNTR,
12403 "[%d] total flits 0x%llx limit 0x%llx\n", dd->unit,
12404 total_flits, (u64)CNTR_32BIT_MAX);
12405 if (total_flits >= CNTR_32BIT_MAX) {
12406 hfi1_cdbg(CNTR, "[%d] 32bit limit hit, updating",
12407 dd->unit);
12408 update = 1;
12409 }
12410 }
12411
12412 if (update) {
12413 hfi1_cdbg(CNTR, "[%d] Updating dd and ppd counters", dd->unit);
12414 for (i = 0; i < DEV_CNTR_LAST; i++) {
12415 entry = &dev_cntrs[i];
12416 if (entry->flags & CNTR_VL) {
12417 for (vl = 0; vl < C_VL_COUNT; vl++)
12418 read_dev_cntr(dd, i, vl);
12419 } else {
12420 read_dev_cntr(dd, i, CNTR_INVALID_VL);
12421 }
12422 }
12423 ppd = (struct hfi1_pportdata *)(dd + 1);
12424 for (i = 0; i < dd->num_pports; i++, ppd++) {
12425 for (j = 0; j < PORT_CNTR_LAST; j++) {
12426 entry = &port_cntrs[j];
12427 if (entry->flags & CNTR_VL) {
12428 for (vl = 0; vl < C_VL_COUNT; vl++)
12429 read_port_cntr(ppd, j, vl);
12430 } else {
12431 read_port_cntr(ppd, j, CNTR_INVALID_VL);
12432 }
12433 }
12434 }
12435
12436 /*
12437 * We want the value in the register. The goal is to keep track
12438 * of the number of "ticks" not the counter value. In other
12439 * words if the register rolls we want to notice it and go ahead
12440 * and force an update.
12441 */
12442 entry = &dev_cntrs[C_DC_XMIT_FLITS];
12443 dd->last_tx = entry->rw_cntr(entry, dd, CNTR_INVALID_VL,
12444 CNTR_MODE_R, 0);
12445
12446 entry = &dev_cntrs[C_DC_RCV_FLITS];
12447 dd->last_rx = entry->rw_cntr(entry, dd, CNTR_INVALID_VL,
12448 CNTR_MODE_R, 0);
12449
12450 hfi1_cdbg(CNTR, "[%d] setting last tx/rx to 0x%llx 0x%llx",
12451 dd->unit, dd->last_tx, dd->last_rx);
12452
12453 } else {
12454 hfi1_cdbg(CNTR, "[%d] No update necessary", dd->unit);
12455 }
12456 }
12457
update_synth_timer(struct timer_list * t)12458 static void update_synth_timer(struct timer_list *t)
12459 {
12460 struct hfi1_devdata *dd = from_timer(dd, t, synth_stats_timer);
12461
12462 queue_work(dd->update_cntr_wq, &dd->update_cntr_work);
12463 mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME);
12464 }
12465
12466 #define C_MAX_NAME 16 /* 15 chars + one for /0 */
init_cntrs(struct hfi1_devdata * dd)12467 static int init_cntrs(struct hfi1_devdata *dd)
12468 {
12469 int i, rcv_ctxts, j;
12470 size_t sz;
12471 char *p;
12472 char name[C_MAX_NAME];
12473 struct hfi1_pportdata *ppd;
12474 const char *bit_type_32 = ",32";
12475 const int bit_type_32_sz = strlen(bit_type_32);
12476 u32 sdma_engines = chip_sdma_engines(dd);
12477
12478 /* set up the stats timer; the add_timer is done at the end */
12479 timer_setup(&dd->synth_stats_timer, update_synth_timer, 0);
12480
12481 /***********************/
12482 /* per device counters */
12483 /***********************/
12484
12485 /* size names and determine how many we have*/
12486 dd->ndevcntrs = 0;
12487 sz = 0;
12488
12489 for (i = 0; i < DEV_CNTR_LAST; i++) {
12490 if (dev_cntrs[i].flags & CNTR_DISABLED) {
12491 hfi1_dbg_early("\tSkipping %s\n", dev_cntrs[i].name);
12492 continue;
12493 }
12494
12495 if (dev_cntrs[i].flags & CNTR_VL) {
12496 dev_cntrs[i].offset = dd->ndevcntrs;
12497 for (j = 0; j < C_VL_COUNT; j++) {
12498 snprintf(name, C_MAX_NAME, "%s%d",
12499 dev_cntrs[i].name, vl_from_idx(j));
12500 sz += strlen(name);
12501 /* Add ",32" for 32-bit counters */
12502 if (dev_cntrs[i].flags & CNTR_32BIT)
12503 sz += bit_type_32_sz;
12504 sz++;
12505 dd->ndevcntrs++;
12506 }
12507 } else if (dev_cntrs[i].flags & CNTR_SDMA) {
12508 dev_cntrs[i].offset = dd->ndevcntrs;
12509 for (j = 0; j < sdma_engines; j++) {
12510 snprintf(name, C_MAX_NAME, "%s%d",
12511 dev_cntrs[i].name, j);
12512 sz += strlen(name);
12513 /* Add ",32" for 32-bit counters */
12514 if (dev_cntrs[i].flags & CNTR_32BIT)
12515 sz += bit_type_32_sz;
12516 sz++;
12517 dd->ndevcntrs++;
12518 }
12519 } else {
12520 /* +1 for newline. */
12521 sz += strlen(dev_cntrs[i].name) + 1;
12522 /* Add ",32" for 32-bit counters */
12523 if (dev_cntrs[i].flags & CNTR_32BIT)
12524 sz += bit_type_32_sz;
12525 dev_cntrs[i].offset = dd->ndevcntrs;
12526 dd->ndevcntrs++;
12527 }
12528 }
12529
12530 /* allocate space for the counter values */
12531 dd->cntrs = kcalloc(dd->ndevcntrs + num_driver_cntrs, sizeof(u64),
12532 GFP_KERNEL);
12533 if (!dd->cntrs)
12534 goto bail;
12535
12536 dd->scntrs = kcalloc(dd->ndevcntrs, sizeof(u64), GFP_KERNEL);
12537 if (!dd->scntrs)
12538 goto bail;
12539
12540 /* allocate space for the counter names */
12541 dd->cntrnameslen = sz;
12542 dd->cntrnames = kmalloc(sz, GFP_KERNEL);
12543 if (!dd->cntrnames)
12544 goto bail;
12545
12546 /* fill in the names */
12547 for (p = dd->cntrnames, i = 0; i < DEV_CNTR_LAST; i++) {
12548 if (dev_cntrs[i].flags & CNTR_DISABLED) {
12549 /* Nothing */
12550 } else if (dev_cntrs[i].flags & CNTR_VL) {
12551 for (j = 0; j < C_VL_COUNT; j++) {
12552 snprintf(name, C_MAX_NAME, "%s%d",
12553 dev_cntrs[i].name,
12554 vl_from_idx(j));
12555 memcpy(p, name, strlen(name));
12556 p += strlen(name);
12557
12558 /* Counter is 32 bits */
12559 if (dev_cntrs[i].flags & CNTR_32BIT) {
12560 memcpy(p, bit_type_32, bit_type_32_sz);
12561 p += bit_type_32_sz;
12562 }
12563
12564 *p++ = '\n';
12565 }
12566 } else if (dev_cntrs[i].flags & CNTR_SDMA) {
12567 for (j = 0; j < sdma_engines; j++) {
12568 snprintf(name, C_MAX_NAME, "%s%d",
12569 dev_cntrs[i].name, j);
12570 memcpy(p, name, strlen(name));
12571 p += strlen(name);
12572
12573 /* Counter is 32 bits */
12574 if (dev_cntrs[i].flags & CNTR_32BIT) {
12575 memcpy(p, bit_type_32, bit_type_32_sz);
12576 p += bit_type_32_sz;
12577 }
12578
12579 *p++ = '\n';
12580 }
12581 } else {
12582 memcpy(p, dev_cntrs[i].name, strlen(dev_cntrs[i].name));
12583 p += strlen(dev_cntrs[i].name);
12584
12585 /* Counter is 32 bits */
12586 if (dev_cntrs[i].flags & CNTR_32BIT) {
12587 memcpy(p, bit_type_32, bit_type_32_sz);
12588 p += bit_type_32_sz;
12589 }
12590
12591 *p++ = '\n';
12592 }
12593 }
12594
12595 /*********************/
12596 /* per port counters */
12597 /*********************/
12598
12599 /*
12600 * Go through the counters for the overflows and disable the ones we
12601 * don't need. This varies based on platform so we need to do it
12602 * dynamically here.
12603 */
12604 rcv_ctxts = dd->num_rcv_contexts;
12605 for (i = C_RCV_HDR_OVF_FIRST + rcv_ctxts;
12606 i <= C_RCV_HDR_OVF_LAST; i++) {
12607 port_cntrs[i].flags |= CNTR_DISABLED;
12608 }
12609
12610 /* size port counter names and determine how many we have*/
12611 sz = 0;
12612 dd->nportcntrs = 0;
12613 for (i = 0; i < PORT_CNTR_LAST; i++) {
12614 if (port_cntrs[i].flags & CNTR_DISABLED) {
12615 hfi1_dbg_early("\tSkipping %s\n", port_cntrs[i].name);
12616 continue;
12617 }
12618
12619 if (port_cntrs[i].flags & CNTR_VL) {
12620 port_cntrs[i].offset = dd->nportcntrs;
12621 for (j = 0; j < C_VL_COUNT; j++) {
12622 snprintf(name, C_MAX_NAME, "%s%d",
12623 port_cntrs[i].name, vl_from_idx(j));
12624 sz += strlen(name);
12625 /* Add ",32" for 32-bit counters */
12626 if (port_cntrs[i].flags & CNTR_32BIT)
12627 sz += bit_type_32_sz;
12628 sz++;
12629 dd->nportcntrs++;
12630 }
12631 } else {
12632 /* +1 for newline */
12633 sz += strlen(port_cntrs[i].name) + 1;
12634 /* Add ",32" for 32-bit counters */
12635 if (port_cntrs[i].flags & CNTR_32BIT)
12636 sz += bit_type_32_sz;
12637 port_cntrs[i].offset = dd->nportcntrs;
12638 dd->nportcntrs++;
12639 }
12640 }
12641
12642 /* allocate space for the counter names */
12643 dd->portcntrnameslen = sz;
12644 dd->portcntrnames = kmalloc(sz, GFP_KERNEL);
12645 if (!dd->portcntrnames)
12646 goto bail;
12647
12648 /* fill in port cntr names */
12649 for (p = dd->portcntrnames, i = 0; i < PORT_CNTR_LAST; i++) {
12650 if (port_cntrs[i].flags & CNTR_DISABLED)
12651 continue;
12652
12653 if (port_cntrs[i].flags & CNTR_VL) {
12654 for (j = 0; j < C_VL_COUNT; j++) {
12655 snprintf(name, C_MAX_NAME, "%s%d",
12656 port_cntrs[i].name, vl_from_idx(j));
12657 memcpy(p, name, strlen(name));
12658 p += strlen(name);
12659
12660 /* Counter is 32 bits */
12661 if (port_cntrs[i].flags & CNTR_32BIT) {
12662 memcpy(p, bit_type_32, bit_type_32_sz);
12663 p += bit_type_32_sz;
12664 }
12665
12666 *p++ = '\n';
12667 }
12668 } else {
12669 memcpy(p, port_cntrs[i].name,
12670 strlen(port_cntrs[i].name));
12671 p += strlen(port_cntrs[i].name);
12672
12673 /* Counter is 32 bits */
12674 if (port_cntrs[i].flags & CNTR_32BIT) {
12675 memcpy(p, bit_type_32, bit_type_32_sz);
12676 p += bit_type_32_sz;
12677 }
12678
12679 *p++ = '\n';
12680 }
12681 }
12682
12683 /* allocate per port storage for counter values */
12684 ppd = (struct hfi1_pportdata *)(dd + 1);
12685 for (i = 0; i < dd->num_pports; i++, ppd++) {
12686 ppd->cntrs = kcalloc(dd->nportcntrs, sizeof(u64), GFP_KERNEL);
12687 if (!ppd->cntrs)
12688 goto bail;
12689
12690 ppd->scntrs = kcalloc(dd->nportcntrs, sizeof(u64), GFP_KERNEL);
12691 if (!ppd->scntrs)
12692 goto bail;
12693 }
12694
12695 /* CPU counters need to be allocated and zeroed */
12696 if (init_cpu_counters(dd))
12697 goto bail;
12698
12699 dd->update_cntr_wq = alloc_ordered_workqueue("hfi1_update_cntr_%d",
12700 WQ_MEM_RECLAIM, dd->unit);
12701 if (!dd->update_cntr_wq)
12702 goto bail;
12703
12704 INIT_WORK(&dd->update_cntr_work, do_update_synth_timer);
12705
12706 mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME);
12707 return 0;
12708 bail:
12709 free_cntrs(dd);
12710 return -ENOMEM;
12711 }
12712
chip_to_opa_lstate(struct hfi1_devdata * dd,u32 chip_lstate)12713 static u32 chip_to_opa_lstate(struct hfi1_devdata *dd, u32 chip_lstate)
12714 {
12715 switch (chip_lstate) {
12716 default:
12717 dd_dev_err(dd,
12718 "Unknown logical state 0x%x, reporting IB_PORT_DOWN\n",
12719 chip_lstate);
12720 /* fall through */
12721 case LSTATE_DOWN:
12722 return IB_PORT_DOWN;
12723 case LSTATE_INIT:
12724 return IB_PORT_INIT;
12725 case LSTATE_ARMED:
12726 return IB_PORT_ARMED;
12727 case LSTATE_ACTIVE:
12728 return IB_PORT_ACTIVE;
12729 }
12730 }
12731
chip_to_opa_pstate(struct hfi1_devdata * dd,u32 chip_pstate)12732 u32 chip_to_opa_pstate(struct hfi1_devdata *dd, u32 chip_pstate)
12733 {
12734 /* look at the HFI meta-states only */
12735 switch (chip_pstate & 0xf0) {
12736 default:
12737 dd_dev_err(dd, "Unexpected chip physical state of 0x%x\n",
12738 chip_pstate);
12739 /* fall through */
12740 case PLS_DISABLED:
12741 return IB_PORTPHYSSTATE_DISABLED;
12742 case PLS_OFFLINE:
12743 return OPA_PORTPHYSSTATE_OFFLINE;
12744 case PLS_POLLING:
12745 return IB_PORTPHYSSTATE_POLLING;
12746 case PLS_CONFIGPHY:
12747 return IB_PORTPHYSSTATE_TRAINING;
12748 case PLS_LINKUP:
12749 return IB_PORTPHYSSTATE_LINKUP;
12750 case PLS_PHYTEST:
12751 return IB_PORTPHYSSTATE_PHY_TEST;
12752 }
12753 }
12754
12755 /* return the OPA port logical state name */
opa_lstate_name(u32 lstate)12756 const char *opa_lstate_name(u32 lstate)
12757 {
12758 static const char * const port_logical_names[] = {
12759 "PORT_NOP",
12760 "PORT_DOWN",
12761 "PORT_INIT",
12762 "PORT_ARMED",
12763 "PORT_ACTIVE",
12764 "PORT_ACTIVE_DEFER",
12765 };
12766 if (lstate < ARRAY_SIZE(port_logical_names))
12767 return port_logical_names[lstate];
12768 return "unknown";
12769 }
12770
12771 /* return the OPA port physical state name */
opa_pstate_name(u32 pstate)12772 const char *opa_pstate_name(u32 pstate)
12773 {
12774 static const char * const port_physical_names[] = {
12775 "PHYS_NOP",
12776 "reserved1",
12777 "PHYS_POLL",
12778 "PHYS_DISABLED",
12779 "PHYS_TRAINING",
12780 "PHYS_LINKUP",
12781 "PHYS_LINK_ERR_RECOVER",
12782 "PHYS_PHY_TEST",
12783 "reserved8",
12784 "PHYS_OFFLINE",
12785 "PHYS_GANGED",
12786 "PHYS_TEST",
12787 };
12788 if (pstate < ARRAY_SIZE(port_physical_names))
12789 return port_physical_names[pstate];
12790 return "unknown";
12791 }
12792
12793 /**
12794 * update_statusp - Update userspace status flag
12795 * @ppd: Port data structure
12796 * @state: port state information
12797 *
12798 * Actual port status is determined by the host_link_state value
12799 * in the ppd.
12800 *
12801 * host_link_state MUST be updated before updating the user space
12802 * statusp.
12803 */
update_statusp(struct hfi1_pportdata * ppd,u32 state)12804 static void update_statusp(struct hfi1_pportdata *ppd, u32 state)
12805 {
12806 /*
12807 * Set port status flags in the page mapped into userspace
12808 * memory. Do it here to ensure a reliable state - this is
12809 * the only function called by all state handling code.
12810 * Always set the flags due to the fact that the cache value
12811 * might have been changed explicitly outside of this
12812 * function.
12813 */
12814 if (ppd->statusp) {
12815 switch (state) {
12816 case IB_PORT_DOWN:
12817 case IB_PORT_INIT:
12818 *ppd->statusp &= ~(HFI1_STATUS_IB_CONF |
12819 HFI1_STATUS_IB_READY);
12820 break;
12821 case IB_PORT_ARMED:
12822 *ppd->statusp |= HFI1_STATUS_IB_CONF;
12823 break;
12824 case IB_PORT_ACTIVE:
12825 *ppd->statusp |= HFI1_STATUS_IB_READY;
12826 break;
12827 }
12828 }
12829 dd_dev_info(ppd->dd, "logical state changed to %s (0x%x)\n",
12830 opa_lstate_name(state), state);
12831 }
12832
12833 /**
12834 * wait_logical_linkstate - wait for an IB link state change to occur
12835 * @ppd: port device
12836 * @state: the state to wait for
12837 * @msecs: the number of milliseconds to wait
12838 *
12839 * Wait up to msecs milliseconds for IB link state change to occur.
12840 * For now, take the easy polling route.
12841 * Returns 0 if state reached, otherwise -ETIMEDOUT.
12842 */
wait_logical_linkstate(struct hfi1_pportdata * ppd,u32 state,int msecs)12843 static int wait_logical_linkstate(struct hfi1_pportdata *ppd, u32 state,
12844 int msecs)
12845 {
12846 unsigned long timeout;
12847 u32 new_state;
12848
12849 timeout = jiffies + msecs_to_jiffies(msecs);
12850 while (1) {
12851 new_state = chip_to_opa_lstate(ppd->dd,
12852 read_logical_state(ppd->dd));
12853 if (new_state == state)
12854 break;
12855 if (time_after(jiffies, timeout)) {
12856 dd_dev_err(ppd->dd,
12857 "timeout waiting for link state 0x%x\n",
12858 state);
12859 return -ETIMEDOUT;
12860 }
12861 msleep(20);
12862 }
12863
12864 return 0;
12865 }
12866
log_state_transition(struct hfi1_pportdata * ppd,u32 state)12867 static void log_state_transition(struct hfi1_pportdata *ppd, u32 state)
12868 {
12869 u32 ib_pstate = chip_to_opa_pstate(ppd->dd, state);
12870
12871 dd_dev_info(ppd->dd,
12872 "physical state changed to %s (0x%x), phy 0x%x\n",
12873 opa_pstate_name(ib_pstate), ib_pstate, state);
12874 }
12875
12876 /*
12877 * Read the physical hardware link state and check if it matches host
12878 * drivers anticipated state.
12879 */
log_physical_state(struct hfi1_pportdata * ppd,u32 state)12880 static void log_physical_state(struct hfi1_pportdata *ppd, u32 state)
12881 {
12882 u32 read_state = read_physical_state(ppd->dd);
12883
12884 if (read_state == state) {
12885 log_state_transition(ppd, state);
12886 } else {
12887 dd_dev_err(ppd->dd,
12888 "anticipated phy link state 0x%x, read 0x%x\n",
12889 state, read_state);
12890 }
12891 }
12892
12893 /*
12894 * wait_physical_linkstate - wait for an physical link state change to occur
12895 * @ppd: port device
12896 * @state: the state to wait for
12897 * @msecs: the number of milliseconds to wait
12898 *
12899 * Wait up to msecs milliseconds for physical link state change to occur.
12900 * Returns 0 if state reached, otherwise -ETIMEDOUT.
12901 */
wait_physical_linkstate(struct hfi1_pportdata * ppd,u32 state,int msecs)12902 static int wait_physical_linkstate(struct hfi1_pportdata *ppd, u32 state,
12903 int msecs)
12904 {
12905 u32 read_state;
12906 unsigned long timeout;
12907
12908 timeout = jiffies + msecs_to_jiffies(msecs);
12909 while (1) {
12910 read_state = read_physical_state(ppd->dd);
12911 if (read_state == state)
12912 break;
12913 if (time_after(jiffies, timeout)) {
12914 dd_dev_err(ppd->dd,
12915 "timeout waiting for phy link state 0x%x\n",
12916 state);
12917 return -ETIMEDOUT;
12918 }
12919 usleep_range(1950, 2050); /* sleep 2ms-ish */
12920 }
12921
12922 log_state_transition(ppd, state);
12923 return 0;
12924 }
12925
12926 /*
12927 * wait_phys_link_offline_quiet_substates - wait for any offline substate
12928 * @ppd: port device
12929 * @msecs: the number of milliseconds to wait
12930 *
12931 * Wait up to msecs milliseconds for any offline physical link
12932 * state change to occur.
12933 * Returns 0 if at least one state is reached, otherwise -ETIMEDOUT.
12934 */
wait_phys_link_offline_substates(struct hfi1_pportdata * ppd,int msecs)12935 static int wait_phys_link_offline_substates(struct hfi1_pportdata *ppd,
12936 int msecs)
12937 {
12938 u32 read_state;
12939 unsigned long timeout;
12940
12941 timeout = jiffies + msecs_to_jiffies(msecs);
12942 while (1) {
12943 read_state = read_physical_state(ppd->dd);
12944 if ((read_state & 0xF0) == PLS_OFFLINE)
12945 break;
12946 if (time_after(jiffies, timeout)) {
12947 dd_dev_err(ppd->dd,
12948 "timeout waiting for phy link offline.quiet substates. Read state 0x%x, %dms\n",
12949 read_state, msecs);
12950 return -ETIMEDOUT;
12951 }
12952 usleep_range(1950, 2050); /* sleep 2ms-ish */
12953 }
12954
12955 log_state_transition(ppd, read_state);
12956 return read_state;
12957 }
12958
12959 /*
12960 * wait_phys_link_out_of_offline - wait for any out of offline state
12961 * @ppd: port device
12962 * @msecs: the number of milliseconds to wait
12963 *
12964 * Wait up to msecs milliseconds for any out of offline physical link
12965 * state change to occur.
12966 * Returns 0 if at least one state is reached, otherwise -ETIMEDOUT.
12967 */
wait_phys_link_out_of_offline(struct hfi1_pportdata * ppd,int msecs)12968 static int wait_phys_link_out_of_offline(struct hfi1_pportdata *ppd,
12969 int msecs)
12970 {
12971 u32 read_state;
12972 unsigned long timeout;
12973
12974 timeout = jiffies + msecs_to_jiffies(msecs);
12975 while (1) {
12976 read_state = read_physical_state(ppd->dd);
12977 if ((read_state & 0xF0) != PLS_OFFLINE)
12978 break;
12979 if (time_after(jiffies, timeout)) {
12980 dd_dev_err(ppd->dd,
12981 "timeout waiting for phy link out of offline. Read state 0x%x, %dms\n",
12982 read_state, msecs);
12983 return -ETIMEDOUT;
12984 }
12985 usleep_range(1950, 2050); /* sleep 2ms-ish */
12986 }
12987
12988 log_state_transition(ppd, read_state);
12989 return read_state;
12990 }
12991
12992 #define CLEAR_STATIC_RATE_CONTROL_SMASK(r) \
12993 (r &= ~SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
12994
12995 #define SET_STATIC_RATE_CONTROL_SMASK(r) \
12996 (r |= SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
12997
hfi1_init_ctxt(struct send_context * sc)12998 void hfi1_init_ctxt(struct send_context *sc)
12999 {
13000 if (sc) {
13001 struct hfi1_devdata *dd = sc->dd;
13002 u64 reg;
13003 u8 set = (sc->type == SC_USER ?
13004 HFI1_CAP_IS_USET(STATIC_RATE_CTRL) :
13005 HFI1_CAP_IS_KSET(STATIC_RATE_CTRL));
13006 reg = read_kctxt_csr(dd, sc->hw_context,
13007 SEND_CTXT_CHECK_ENABLE);
13008 if (set)
13009 CLEAR_STATIC_RATE_CONTROL_SMASK(reg);
13010 else
13011 SET_STATIC_RATE_CONTROL_SMASK(reg);
13012 write_kctxt_csr(dd, sc->hw_context,
13013 SEND_CTXT_CHECK_ENABLE, reg);
13014 }
13015 }
13016
hfi1_tempsense_rd(struct hfi1_devdata * dd,struct hfi1_temp * temp)13017 int hfi1_tempsense_rd(struct hfi1_devdata *dd, struct hfi1_temp *temp)
13018 {
13019 int ret = 0;
13020 u64 reg;
13021
13022 if (dd->icode != ICODE_RTL_SILICON) {
13023 if (HFI1_CAP_IS_KSET(PRINT_UNIMPL))
13024 dd_dev_info(dd, "%s: tempsense not supported by HW\n",
13025 __func__);
13026 return -EINVAL;
13027 }
13028 reg = read_csr(dd, ASIC_STS_THERM);
13029 temp->curr = ((reg >> ASIC_STS_THERM_CURR_TEMP_SHIFT) &
13030 ASIC_STS_THERM_CURR_TEMP_MASK);
13031 temp->lo_lim = ((reg >> ASIC_STS_THERM_LO_TEMP_SHIFT) &
13032 ASIC_STS_THERM_LO_TEMP_MASK);
13033 temp->hi_lim = ((reg >> ASIC_STS_THERM_HI_TEMP_SHIFT) &
13034 ASIC_STS_THERM_HI_TEMP_MASK);
13035 temp->crit_lim = ((reg >> ASIC_STS_THERM_CRIT_TEMP_SHIFT) &
13036 ASIC_STS_THERM_CRIT_TEMP_MASK);
13037 /* triggers is a 3-bit value - 1 bit per trigger. */
13038 temp->triggers = (u8)((reg >> ASIC_STS_THERM_LOW_SHIFT) & 0x7);
13039
13040 return ret;
13041 }
13042
13043 /* ========================================================================= */
13044
13045 /**
13046 * read_mod_write() - Calculate the IRQ register index and set/clear the bits
13047 * @dd: valid devdata
13048 * @src: IRQ source to determine register index from
13049 * @bits: the bits to set or clear
13050 * @set: true == set the bits, false == clear the bits
13051 *
13052 */
read_mod_write(struct hfi1_devdata * dd,u16 src,u64 bits,bool set)13053 static void read_mod_write(struct hfi1_devdata *dd, u16 src, u64 bits,
13054 bool set)
13055 {
13056 u64 reg;
13057 u16 idx = src / BITS_PER_REGISTER;
13058
13059 spin_lock(&dd->irq_src_lock);
13060 reg = read_csr(dd, CCE_INT_MASK + (8 * idx));
13061 if (set)
13062 reg |= bits;
13063 else
13064 reg &= ~bits;
13065 write_csr(dd, CCE_INT_MASK + (8 * idx), reg);
13066 spin_unlock(&dd->irq_src_lock);
13067 }
13068
13069 /**
13070 * set_intr_bits() - Enable/disable a range (one or more) IRQ sources
13071 * @dd: valid devdata
13072 * @first: first IRQ source to set/clear
13073 * @last: last IRQ source (inclusive) to set/clear
13074 * @set: true == set the bits, false == clear the bits
13075 *
13076 * If first == last, set the exact source.
13077 */
set_intr_bits(struct hfi1_devdata * dd,u16 first,u16 last,bool set)13078 int set_intr_bits(struct hfi1_devdata *dd, u16 first, u16 last, bool set)
13079 {
13080 u64 bits = 0;
13081 u64 bit;
13082 u16 src;
13083
13084 if (first > NUM_INTERRUPT_SOURCES || last > NUM_INTERRUPT_SOURCES)
13085 return -EINVAL;
13086
13087 if (last < first)
13088 return -ERANGE;
13089
13090 for (src = first; src <= last; src++) {
13091 bit = src % BITS_PER_REGISTER;
13092 /* wrapped to next register? */
13093 if (!bit && bits) {
13094 read_mod_write(dd, src - 1, bits, set);
13095 bits = 0;
13096 }
13097 bits |= BIT_ULL(bit);
13098 }
13099 read_mod_write(dd, last, bits, set);
13100
13101 return 0;
13102 }
13103
13104 /*
13105 * Clear all interrupt sources on the chip.
13106 */
clear_all_interrupts(struct hfi1_devdata * dd)13107 void clear_all_interrupts(struct hfi1_devdata *dd)
13108 {
13109 int i;
13110
13111 for (i = 0; i < CCE_NUM_INT_CSRS; i++)
13112 write_csr(dd, CCE_INT_CLEAR + (8 * i), ~(u64)0);
13113
13114 write_csr(dd, CCE_ERR_CLEAR, ~(u64)0);
13115 write_csr(dd, MISC_ERR_CLEAR, ~(u64)0);
13116 write_csr(dd, RCV_ERR_CLEAR, ~(u64)0);
13117 write_csr(dd, SEND_ERR_CLEAR, ~(u64)0);
13118 write_csr(dd, SEND_PIO_ERR_CLEAR, ~(u64)0);
13119 write_csr(dd, SEND_DMA_ERR_CLEAR, ~(u64)0);
13120 write_csr(dd, SEND_EGRESS_ERR_CLEAR, ~(u64)0);
13121 for (i = 0; i < chip_send_contexts(dd); i++)
13122 write_kctxt_csr(dd, i, SEND_CTXT_ERR_CLEAR, ~(u64)0);
13123 for (i = 0; i < chip_sdma_engines(dd); i++)
13124 write_kctxt_csr(dd, i, SEND_DMA_ENG_ERR_CLEAR, ~(u64)0);
13125
13126 write_csr(dd, DCC_ERR_FLG_CLR, ~(u64)0);
13127 write_csr(dd, DC_LCB_ERR_CLR, ~(u64)0);
13128 write_csr(dd, DC_DC8051_ERR_CLR, ~(u64)0);
13129 }
13130
13131 /*
13132 * Remap the interrupt source from the general handler to the given MSI-X
13133 * interrupt.
13134 */
remap_intr(struct hfi1_devdata * dd,int isrc,int msix_intr)13135 void remap_intr(struct hfi1_devdata *dd, int isrc, int msix_intr)
13136 {
13137 u64 reg;
13138 int m, n;
13139
13140 /* clear from the handled mask of the general interrupt */
13141 m = isrc / 64;
13142 n = isrc % 64;
13143 if (likely(m < CCE_NUM_INT_CSRS)) {
13144 dd->gi_mask[m] &= ~((u64)1 << n);
13145 } else {
13146 dd_dev_err(dd, "remap interrupt err\n");
13147 return;
13148 }
13149
13150 /* direct the chip source to the given MSI-X interrupt */
13151 m = isrc / 8;
13152 n = isrc % 8;
13153 reg = read_csr(dd, CCE_INT_MAP + (8 * m));
13154 reg &= ~((u64)0xff << (8 * n));
13155 reg |= ((u64)msix_intr & 0xff) << (8 * n);
13156 write_csr(dd, CCE_INT_MAP + (8 * m), reg);
13157 }
13158
remap_sdma_interrupts(struct hfi1_devdata * dd,int engine,int msix_intr)13159 void remap_sdma_interrupts(struct hfi1_devdata *dd, int engine, int msix_intr)
13160 {
13161 /*
13162 * SDMA engine interrupt sources grouped by type, rather than
13163 * engine. Per-engine interrupts are as follows:
13164 * SDMA
13165 * SDMAProgress
13166 * SDMAIdle
13167 */
13168 remap_intr(dd, IS_SDMA_START + engine, msix_intr);
13169 remap_intr(dd, IS_SDMA_PROGRESS_START + engine, msix_intr);
13170 remap_intr(dd, IS_SDMA_IDLE_START + engine, msix_intr);
13171 }
13172
13173 /*
13174 * Set the general handler to accept all interrupts, remap all
13175 * chip interrupts back to MSI-X 0.
13176 */
reset_interrupts(struct hfi1_devdata * dd)13177 void reset_interrupts(struct hfi1_devdata *dd)
13178 {
13179 int i;
13180
13181 /* all interrupts handled by the general handler */
13182 for (i = 0; i < CCE_NUM_INT_CSRS; i++)
13183 dd->gi_mask[i] = ~(u64)0;
13184
13185 /* all chip interrupts map to MSI-X 0 */
13186 for (i = 0; i < CCE_NUM_INT_MAP_CSRS; i++)
13187 write_csr(dd, CCE_INT_MAP + (8 * i), 0);
13188 }
13189
13190 /**
13191 * set_up_interrupts() - Initialize the IRQ resources and state
13192 * @dd: valid devdata
13193 *
13194 */
set_up_interrupts(struct hfi1_devdata * dd)13195 static int set_up_interrupts(struct hfi1_devdata *dd)
13196 {
13197 int ret;
13198
13199 /* mask all interrupts */
13200 set_intr_bits(dd, IS_FIRST_SOURCE, IS_LAST_SOURCE, false);
13201
13202 /* clear all pending interrupts */
13203 clear_all_interrupts(dd);
13204
13205 /* reset general handler mask, chip MSI-X mappings */
13206 reset_interrupts(dd);
13207
13208 /* ask for MSI-X interrupts */
13209 ret = msix_initialize(dd);
13210 if (ret)
13211 return ret;
13212
13213 ret = msix_request_irqs(dd);
13214 if (ret)
13215 msix_clean_up_interrupts(dd);
13216
13217 return ret;
13218 }
13219
13220 /*
13221 * Set up context values in dd. Sets:
13222 *
13223 * num_rcv_contexts - number of contexts being used
13224 * n_krcv_queues - number of kernel contexts
13225 * first_dyn_alloc_ctxt - first dynamically allocated context
13226 * in array of contexts
13227 * freectxts - number of free user contexts
13228 * num_send_contexts - number of PIO send contexts being used
13229 * num_vnic_contexts - number of contexts reserved for VNIC
13230 */
set_up_context_variables(struct hfi1_devdata * dd)13231 static int set_up_context_variables(struct hfi1_devdata *dd)
13232 {
13233 unsigned long num_kernel_contexts;
13234 u16 num_vnic_contexts = HFI1_NUM_VNIC_CTXT;
13235 int total_contexts;
13236 int ret;
13237 unsigned ngroups;
13238 int rmt_count;
13239 int user_rmt_reduced;
13240 u32 n_usr_ctxts;
13241 u32 send_contexts = chip_send_contexts(dd);
13242 u32 rcv_contexts = chip_rcv_contexts(dd);
13243
13244 /*
13245 * Kernel receive contexts:
13246 * - Context 0 - control context (VL15/multicast/error)
13247 * - Context 1 - first kernel context
13248 * - Context 2 - second kernel context
13249 * ...
13250 */
13251 if (n_krcvqs)
13252 /*
13253 * n_krcvqs is the sum of module parameter kernel receive
13254 * contexts, krcvqs[]. It does not include the control
13255 * context, so add that.
13256 */
13257 num_kernel_contexts = n_krcvqs + 1;
13258 else
13259 num_kernel_contexts = DEFAULT_KRCVQS + 1;
13260 /*
13261 * Every kernel receive context needs an ACK send context.
13262 * one send context is allocated for each VL{0-7} and VL15
13263 */
13264 if (num_kernel_contexts > (send_contexts - num_vls - 1)) {
13265 dd_dev_err(dd,
13266 "Reducing # kernel rcv contexts to: %d, from %lu\n",
13267 send_contexts - num_vls - 1,
13268 num_kernel_contexts);
13269 num_kernel_contexts = send_contexts - num_vls - 1;
13270 }
13271
13272 /* Accommodate VNIC contexts if possible */
13273 if ((num_kernel_contexts + num_vnic_contexts) > rcv_contexts) {
13274 dd_dev_err(dd, "No receive contexts available for VNIC\n");
13275 num_vnic_contexts = 0;
13276 }
13277 total_contexts = num_kernel_contexts + num_vnic_contexts;
13278
13279 /*
13280 * User contexts:
13281 * - default to 1 user context per real (non-HT) CPU core if
13282 * num_user_contexts is negative
13283 */
13284 if (num_user_contexts < 0)
13285 n_usr_ctxts = cpumask_weight(&node_affinity.real_cpu_mask);
13286 else
13287 n_usr_ctxts = num_user_contexts;
13288 /*
13289 * Adjust the counts given a global max.
13290 */
13291 if (total_contexts + n_usr_ctxts > rcv_contexts) {
13292 dd_dev_err(dd,
13293 "Reducing # user receive contexts to: %d, from %u\n",
13294 rcv_contexts - total_contexts,
13295 n_usr_ctxts);
13296 /* recalculate */
13297 n_usr_ctxts = rcv_contexts - total_contexts;
13298 }
13299
13300 /*
13301 * The RMT entries are currently allocated as shown below:
13302 * 1. QOS (0 to 128 entries);
13303 * 2. FECN (num_kernel_context - 1 + num_user_contexts +
13304 * num_vnic_contexts);
13305 * 3. VNIC (num_vnic_contexts).
13306 * It should be noted that FECN oversubscribe num_vnic_contexts
13307 * entries of RMT because both VNIC and PSM could allocate any receive
13308 * context between dd->first_dyn_alloc_text and dd->num_rcv_contexts,
13309 * and PSM FECN must reserve an RMT entry for each possible PSM receive
13310 * context.
13311 */
13312 rmt_count = qos_rmt_entries(dd, NULL, NULL) + (num_vnic_contexts * 2);
13313 if (HFI1_CAP_IS_KSET(TID_RDMA))
13314 rmt_count += num_kernel_contexts - 1;
13315 if (rmt_count + n_usr_ctxts > NUM_MAP_ENTRIES) {
13316 user_rmt_reduced = NUM_MAP_ENTRIES - rmt_count;
13317 dd_dev_err(dd,
13318 "RMT size is reducing the number of user receive contexts from %u to %d\n",
13319 n_usr_ctxts,
13320 user_rmt_reduced);
13321 /* recalculate */
13322 n_usr_ctxts = user_rmt_reduced;
13323 }
13324
13325 total_contexts += n_usr_ctxts;
13326
13327 /* the first N are kernel contexts, the rest are user/vnic contexts */
13328 dd->num_rcv_contexts = total_contexts;
13329 dd->n_krcv_queues = num_kernel_contexts;
13330 dd->first_dyn_alloc_ctxt = num_kernel_contexts;
13331 dd->num_vnic_contexts = num_vnic_contexts;
13332 dd->num_user_contexts = n_usr_ctxts;
13333 dd->freectxts = n_usr_ctxts;
13334 dd_dev_info(dd,
13335 "rcv contexts: chip %d, used %d (kernel %d, vnic %u, user %u)\n",
13336 rcv_contexts,
13337 (int)dd->num_rcv_contexts,
13338 (int)dd->n_krcv_queues,
13339 dd->num_vnic_contexts,
13340 dd->num_user_contexts);
13341
13342 /*
13343 * Receive array allocation:
13344 * All RcvArray entries are divided into groups of 8. This
13345 * is required by the hardware and will speed up writes to
13346 * consecutive entries by using write-combining of the entire
13347 * cacheline.
13348 *
13349 * The number of groups are evenly divided among all contexts.
13350 * any left over groups will be given to the first N user
13351 * contexts.
13352 */
13353 dd->rcv_entries.group_size = RCV_INCREMENT;
13354 ngroups = chip_rcv_array_count(dd) / dd->rcv_entries.group_size;
13355 dd->rcv_entries.ngroups = ngroups / dd->num_rcv_contexts;
13356 dd->rcv_entries.nctxt_extra = ngroups -
13357 (dd->num_rcv_contexts * dd->rcv_entries.ngroups);
13358 dd_dev_info(dd, "RcvArray groups %u, ctxts extra %u\n",
13359 dd->rcv_entries.ngroups,
13360 dd->rcv_entries.nctxt_extra);
13361 if (dd->rcv_entries.ngroups * dd->rcv_entries.group_size >
13362 MAX_EAGER_ENTRIES * 2) {
13363 dd->rcv_entries.ngroups = (MAX_EAGER_ENTRIES * 2) /
13364 dd->rcv_entries.group_size;
13365 dd_dev_info(dd,
13366 "RcvArray group count too high, change to %u\n",
13367 dd->rcv_entries.ngroups);
13368 dd->rcv_entries.nctxt_extra = 0;
13369 }
13370 /*
13371 * PIO send contexts
13372 */
13373 ret = init_sc_pools_and_sizes(dd);
13374 if (ret >= 0) { /* success */
13375 dd->num_send_contexts = ret;
13376 dd_dev_info(
13377 dd,
13378 "send contexts: chip %d, used %d (kernel %d, ack %d, user %d, vl15 %d)\n",
13379 send_contexts,
13380 dd->num_send_contexts,
13381 dd->sc_sizes[SC_KERNEL].count,
13382 dd->sc_sizes[SC_ACK].count,
13383 dd->sc_sizes[SC_USER].count,
13384 dd->sc_sizes[SC_VL15].count);
13385 ret = 0; /* success */
13386 }
13387
13388 return ret;
13389 }
13390
13391 /*
13392 * Set the device/port partition key table. The MAD code
13393 * will ensure that, at least, the partial management
13394 * partition key is present in the table.
13395 */
set_partition_keys(struct hfi1_pportdata * ppd)13396 static void set_partition_keys(struct hfi1_pportdata *ppd)
13397 {
13398 struct hfi1_devdata *dd = ppd->dd;
13399 u64 reg = 0;
13400 int i;
13401
13402 dd_dev_info(dd, "Setting partition keys\n");
13403 for (i = 0; i < hfi1_get_npkeys(dd); i++) {
13404 reg |= (ppd->pkeys[i] &
13405 RCV_PARTITION_KEY_PARTITION_KEY_A_MASK) <<
13406 ((i % 4) *
13407 RCV_PARTITION_KEY_PARTITION_KEY_B_SHIFT);
13408 /* Each register holds 4 PKey values. */
13409 if ((i % 4) == 3) {
13410 write_csr(dd, RCV_PARTITION_KEY +
13411 ((i - 3) * 2), reg);
13412 reg = 0;
13413 }
13414 }
13415
13416 /* Always enable HW pkeys check when pkeys table is set */
13417 add_rcvctrl(dd, RCV_CTRL_RCV_PARTITION_KEY_ENABLE_SMASK);
13418 }
13419
13420 /*
13421 * These CSRs and memories are uninitialized on reset and must be
13422 * written before reading to set the ECC/parity bits.
13423 *
13424 * NOTE: All user context CSRs that are not mmaped write-only
13425 * (e.g. the TID flows) must be initialized even if the driver never
13426 * reads them.
13427 */
write_uninitialized_csrs_and_memories(struct hfi1_devdata * dd)13428 static void write_uninitialized_csrs_and_memories(struct hfi1_devdata *dd)
13429 {
13430 int i, j;
13431
13432 /* CceIntMap */
13433 for (i = 0; i < CCE_NUM_INT_MAP_CSRS; i++)
13434 write_csr(dd, CCE_INT_MAP + (8 * i), 0);
13435
13436 /* SendCtxtCreditReturnAddr */
13437 for (i = 0; i < chip_send_contexts(dd); i++)
13438 write_kctxt_csr(dd, i, SEND_CTXT_CREDIT_RETURN_ADDR, 0);
13439
13440 /* PIO Send buffers */
13441 /* SDMA Send buffers */
13442 /*
13443 * These are not normally read, and (presently) have no method
13444 * to be read, so are not pre-initialized
13445 */
13446
13447 /* RcvHdrAddr */
13448 /* RcvHdrTailAddr */
13449 /* RcvTidFlowTable */
13450 for (i = 0; i < chip_rcv_contexts(dd); i++) {
13451 write_kctxt_csr(dd, i, RCV_HDR_ADDR, 0);
13452 write_kctxt_csr(dd, i, RCV_HDR_TAIL_ADDR, 0);
13453 for (j = 0; j < RXE_NUM_TID_FLOWS; j++)
13454 write_uctxt_csr(dd, i, RCV_TID_FLOW_TABLE + (8 * j), 0);
13455 }
13456
13457 /* RcvArray */
13458 for (i = 0; i < chip_rcv_array_count(dd); i++)
13459 hfi1_put_tid(dd, i, PT_INVALID_FLUSH, 0, 0);
13460
13461 /* RcvQPMapTable */
13462 for (i = 0; i < 32; i++)
13463 write_csr(dd, RCV_QP_MAP_TABLE + (8 * i), 0);
13464 }
13465
13466 /*
13467 * Use the ctrl_bits in CceCtrl to clear the status_bits in CceStatus.
13468 */
clear_cce_status(struct hfi1_devdata * dd,u64 status_bits,u64 ctrl_bits)13469 static void clear_cce_status(struct hfi1_devdata *dd, u64 status_bits,
13470 u64 ctrl_bits)
13471 {
13472 unsigned long timeout;
13473 u64 reg;
13474
13475 /* is the condition present? */
13476 reg = read_csr(dd, CCE_STATUS);
13477 if ((reg & status_bits) == 0)
13478 return;
13479
13480 /* clear the condition */
13481 write_csr(dd, CCE_CTRL, ctrl_bits);
13482
13483 /* wait for the condition to clear */
13484 timeout = jiffies + msecs_to_jiffies(CCE_STATUS_TIMEOUT);
13485 while (1) {
13486 reg = read_csr(dd, CCE_STATUS);
13487 if ((reg & status_bits) == 0)
13488 return;
13489 if (time_after(jiffies, timeout)) {
13490 dd_dev_err(dd,
13491 "Timeout waiting for CceStatus to clear bits 0x%llx, remaining 0x%llx\n",
13492 status_bits, reg & status_bits);
13493 return;
13494 }
13495 udelay(1);
13496 }
13497 }
13498
13499 /* set CCE CSRs to chip reset defaults */
reset_cce_csrs(struct hfi1_devdata * dd)13500 static void reset_cce_csrs(struct hfi1_devdata *dd)
13501 {
13502 int i;
13503
13504 /* CCE_REVISION read-only */
13505 /* CCE_REVISION2 read-only */
13506 /* CCE_CTRL - bits clear automatically */
13507 /* CCE_STATUS read-only, use CceCtrl to clear */
13508 clear_cce_status(dd, ALL_FROZE, CCE_CTRL_SPC_UNFREEZE_SMASK);
13509 clear_cce_status(dd, ALL_TXE_PAUSE, CCE_CTRL_TXE_RESUME_SMASK);
13510 clear_cce_status(dd, ALL_RXE_PAUSE, CCE_CTRL_RXE_RESUME_SMASK);
13511 for (i = 0; i < CCE_NUM_SCRATCH; i++)
13512 write_csr(dd, CCE_SCRATCH + (8 * i), 0);
13513 /* CCE_ERR_STATUS read-only */
13514 write_csr(dd, CCE_ERR_MASK, 0);
13515 write_csr(dd, CCE_ERR_CLEAR, ~0ull);
13516 /* CCE_ERR_FORCE leave alone */
13517 for (i = 0; i < CCE_NUM_32_BIT_COUNTERS; i++)
13518 write_csr(dd, CCE_COUNTER_ARRAY32 + (8 * i), 0);
13519 write_csr(dd, CCE_DC_CTRL, CCE_DC_CTRL_RESETCSR);
13520 /* CCE_PCIE_CTRL leave alone */
13521 for (i = 0; i < CCE_NUM_MSIX_VECTORS; i++) {
13522 write_csr(dd, CCE_MSIX_TABLE_LOWER + (8 * i), 0);
13523 write_csr(dd, CCE_MSIX_TABLE_UPPER + (8 * i),
13524 CCE_MSIX_TABLE_UPPER_RESETCSR);
13525 }
13526 for (i = 0; i < CCE_NUM_MSIX_PBAS; i++) {
13527 /* CCE_MSIX_PBA read-only */
13528 write_csr(dd, CCE_MSIX_INT_GRANTED, ~0ull);
13529 write_csr(dd, CCE_MSIX_VEC_CLR_WITHOUT_INT, ~0ull);
13530 }
13531 for (i = 0; i < CCE_NUM_INT_MAP_CSRS; i++)
13532 write_csr(dd, CCE_INT_MAP, 0);
13533 for (i = 0; i < CCE_NUM_INT_CSRS; i++) {
13534 /* CCE_INT_STATUS read-only */
13535 write_csr(dd, CCE_INT_MASK + (8 * i), 0);
13536 write_csr(dd, CCE_INT_CLEAR + (8 * i), ~0ull);
13537 /* CCE_INT_FORCE leave alone */
13538 /* CCE_INT_BLOCKED read-only */
13539 }
13540 for (i = 0; i < CCE_NUM_32_BIT_INT_COUNTERS; i++)
13541 write_csr(dd, CCE_INT_COUNTER_ARRAY32 + (8 * i), 0);
13542 }
13543
13544 /* set MISC CSRs to chip reset defaults */
reset_misc_csrs(struct hfi1_devdata * dd)13545 static void reset_misc_csrs(struct hfi1_devdata *dd)
13546 {
13547 int i;
13548
13549 for (i = 0; i < 32; i++) {
13550 write_csr(dd, MISC_CFG_RSA_R2 + (8 * i), 0);
13551 write_csr(dd, MISC_CFG_RSA_SIGNATURE + (8 * i), 0);
13552 write_csr(dd, MISC_CFG_RSA_MODULUS + (8 * i), 0);
13553 }
13554 /*
13555 * MISC_CFG_SHA_PRELOAD leave alone - always reads 0 and can
13556 * only be written 128-byte chunks
13557 */
13558 /* init RSA engine to clear lingering errors */
13559 write_csr(dd, MISC_CFG_RSA_CMD, 1);
13560 write_csr(dd, MISC_CFG_RSA_MU, 0);
13561 write_csr(dd, MISC_CFG_FW_CTRL, 0);
13562 /* MISC_STS_8051_DIGEST read-only */
13563 /* MISC_STS_SBM_DIGEST read-only */
13564 /* MISC_STS_PCIE_DIGEST read-only */
13565 /* MISC_STS_FAB_DIGEST read-only */
13566 /* MISC_ERR_STATUS read-only */
13567 write_csr(dd, MISC_ERR_MASK, 0);
13568 write_csr(dd, MISC_ERR_CLEAR, ~0ull);
13569 /* MISC_ERR_FORCE leave alone */
13570 }
13571
13572 /* set TXE CSRs to chip reset defaults */
reset_txe_csrs(struct hfi1_devdata * dd)13573 static void reset_txe_csrs(struct hfi1_devdata *dd)
13574 {
13575 int i;
13576
13577 /*
13578 * TXE Kernel CSRs
13579 */
13580 write_csr(dd, SEND_CTRL, 0);
13581 __cm_reset(dd, 0); /* reset CM internal state */
13582 /* SEND_CONTEXTS read-only */
13583 /* SEND_DMA_ENGINES read-only */
13584 /* SEND_PIO_MEM_SIZE read-only */
13585 /* SEND_DMA_MEM_SIZE read-only */
13586 write_csr(dd, SEND_HIGH_PRIORITY_LIMIT, 0);
13587 pio_reset_all(dd); /* SEND_PIO_INIT_CTXT */
13588 /* SEND_PIO_ERR_STATUS read-only */
13589 write_csr(dd, SEND_PIO_ERR_MASK, 0);
13590 write_csr(dd, SEND_PIO_ERR_CLEAR, ~0ull);
13591 /* SEND_PIO_ERR_FORCE leave alone */
13592 /* SEND_DMA_ERR_STATUS read-only */
13593 write_csr(dd, SEND_DMA_ERR_MASK, 0);
13594 write_csr(dd, SEND_DMA_ERR_CLEAR, ~0ull);
13595 /* SEND_DMA_ERR_FORCE leave alone */
13596 /* SEND_EGRESS_ERR_STATUS read-only */
13597 write_csr(dd, SEND_EGRESS_ERR_MASK, 0);
13598 write_csr(dd, SEND_EGRESS_ERR_CLEAR, ~0ull);
13599 /* SEND_EGRESS_ERR_FORCE leave alone */
13600 write_csr(dd, SEND_BTH_QP, 0);
13601 write_csr(dd, SEND_STATIC_RATE_CONTROL, 0);
13602 write_csr(dd, SEND_SC2VLT0, 0);
13603 write_csr(dd, SEND_SC2VLT1, 0);
13604 write_csr(dd, SEND_SC2VLT2, 0);
13605 write_csr(dd, SEND_SC2VLT3, 0);
13606 write_csr(dd, SEND_LEN_CHECK0, 0);
13607 write_csr(dd, SEND_LEN_CHECK1, 0);
13608 /* SEND_ERR_STATUS read-only */
13609 write_csr(dd, SEND_ERR_MASK, 0);
13610 write_csr(dd, SEND_ERR_CLEAR, ~0ull);
13611 /* SEND_ERR_FORCE read-only */
13612 for (i = 0; i < VL_ARB_LOW_PRIO_TABLE_SIZE; i++)
13613 write_csr(dd, SEND_LOW_PRIORITY_LIST + (8 * i), 0);
13614 for (i = 0; i < VL_ARB_HIGH_PRIO_TABLE_SIZE; i++)
13615 write_csr(dd, SEND_HIGH_PRIORITY_LIST + (8 * i), 0);
13616 for (i = 0; i < chip_send_contexts(dd) / NUM_CONTEXTS_PER_SET; i++)
13617 write_csr(dd, SEND_CONTEXT_SET_CTRL + (8 * i), 0);
13618 for (i = 0; i < TXE_NUM_32_BIT_COUNTER; i++)
13619 write_csr(dd, SEND_COUNTER_ARRAY32 + (8 * i), 0);
13620 for (i = 0; i < TXE_NUM_64_BIT_COUNTER; i++)
13621 write_csr(dd, SEND_COUNTER_ARRAY64 + (8 * i), 0);
13622 write_csr(dd, SEND_CM_CTRL, SEND_CM_CTRL_RESETCSR);
13623 write_csr(dd, SEND_CM_GLOBAL_CREDIT, SEND_CM_GLOBAL_CREDIT_RESETCSR);
13624 /* SEND_CM_CREDIT_USED_STATUS read-only */
13625 write_csr(dd, SEND_CM_TIMER_CTRL, 0);
13626 write_csr(dd, SEND_CM_LOCAL_AU_TABLE0_TO3, 0);
13627 write_csr(dd, SEND_CM_LOCAL_AU_TABLE4_TO7, 0);
13628 write_csr(dd, SEND_CM_REMOTE_AU_TABLE0_TO3, 0);
13629 write_csr(dd, SEND_CM_REMOTE_AU_TABLE4_TO7, 0);
13630 for (i = 0; i < TXE_NUM_DATA_VL; i++)
13631 write_csr(dd, SEND_CM_CREDIT_VL + (8 * i), 0);
13632 write_csr(dd, SEND_CM_CREDIT_VL15, 0);
13633 /* SEND_CM_CREDIT_USED_VL read-only */
13634 /* SEND_CM_CREDIT_USED_VL15 read-only */
13635 /* SEND_EGRESS_CTXT_STATUS read-only */
13636 /* SEND_EGRESS_SEND_DMA_STATUS read-only */
13637 write_csr(dd, SEND_EGRESS_ERR_INFO, ~0ull);
13638 /* SEND_EGRESS_ERR_INFO read-only */
13639 /* SEND_EGRESS_ERR_SOURCE read-only */
13640
13641 /*
13642 * TXE Per-Context CSRs
13643 */
13644 for (i = 0; i < chip_send_contexts(dd); i++) {
13645 write_kctxt_csr(dd, i, SEND_CTXT_CTRL, 0);
13646 write_kctxt_csr(dd, i, SEND_CTXT_CREDIT_CTRL, 0);
13647 write_kctxt_csr(dd, i, SEND_CTXT_CREDIT_RETURN_ADDR, 0);
13648 write_kctxt_csr(dd, i, SEND_CTXT_CREDIT_FORCE, 0);
13649 write_kctxt_csr(dd, i, SEND_CTXT_ERR_MASK, 0);
13650 write_kctxt_csr(dd, i, SEND_CTXT_ERR_CLEAR, ~0ull);
13651 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_ENABLE, 0);
13652 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_VL, 0);
13653 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_JOB_KEY, 0);
13654 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_PARTITION_KEY, 0);
13655 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_SLID, 0);
13656 write_kctxt_csr(dd, i, SEND_CTXT_CHECK_OPCODE, 0);
13657 }
13658
13659 /*
13660 * TXE Per-SDMA CSRs
13661 */
13662 for (i = 0; i < chip_sdma_engines(dd); i++) {
13663 write_kctxt_csr(dd, i, SEND_DMA_CTRL, 0);
13664 /* SEND_DMA_STATUS read-only */
13665 write_kctxt_csr(dd, i, SEND_DMA_BASE_ADDR, 0);
13666 write_kctxt_csr(dd, i, SEND_DMA_LEN_GEN, 0);
13667 write_kctxt_csr(dd, i, SEND_DMA_TAIL, 0);
13668 /* SEND_DMA_HEAD read-only */
13669 write_kctxt_csr(dd, i, SEND_DMA_HEAD_ADDR, 0);
13670 write_kctxt_csr(dd, i, SEND_DMA_PRIORITY_THLD, 0);
13671 /* SEND_DMA_IDLE_CNT read-only */
13672 write_kctxt_csr(dd, i, SEND_DMA_RELOAD_CNT, 0);
13673 write_kctxt_csr(dd, i, SEND_DMA_DESC_CNT, 0);
13674 /* SEND_DMA_DESC_FETCHED_CNT read-only */
13675 /* SEND_DMA_ENG_ERR_STATUS read-only */
13676 write_kctxt_csr(dd, i, SEND_DMA_ENG_ERR_MASK, 0);
13677 write_kctxt_csr(dd, i, SEND_DMA_ENG_ERR_CLEAR, ~0ull);
13678 /* SEND_DMA_ENG_ERR_FORCE leave alone */
13679 write_kctxt_csr(dd, i, SEND_DMA_CHECK_ENABLE, 0);
13680 write_kctxt_csr(dd, i, SEND_DMA_CHECK_VL, 0);
13681 write_kctxt_csr(dd, i, SEND_DMA_CHECK_JOB_KEY, 0);
13682 write_kctxt_csr(dd, i, SEND_DMA_CHECK_PARTITION_KEY, 0);
13683 write_kctxt_csr(dd, i, SEND_DMA_CHECK_SLID, 0);
13684 write_kctxt_csr(dd, i, SEND_DMA_CHECK_OPCODE, 0);
13685 write_kctxt_csr(dd, i, SEND_DMA_MEMORY, 0);
13686 }
13687 }
13688
13689 /*
13690 * Expect on entry:
13691 * o Packet ingress is disabled, i.e. RcvCtrl.RcvPortEnable == 0
13692 */
init_rbufs(struct hfi1_devdata * dd)13693 static void init_rbufs(struct hfi1_devdata *dd)
13694 {
13695 u64 reg;
13696 int count;
13697
13698 /*
13699 * Wait for DMA to stop: RxRbufPktPending and RxPktInProgress are
13700 * clear.
13701 */
13702 count = 0;
13703 while (1) {
13704 reg = read_csr(dd, RCV_STATUS);
13705 if ((reg & (RCV_STATUS_RX_RBUF_PKT_PENDING_SMASK
13706 | RCV_STATUS_RX_PKT_IN_PROGRESS_SMASK)) == 0)
13707 break;
13708 /*
13709 * Give up after 1ms - maximum wait time.
13710 *
13711 * RBuf size is 136KiB. Slowest possible is PCIe Gen1 x1 at
13712 * 250MB/s bandwidth. Lower rate to 66% for overhead to get:
13713 * 136 KB / (66% * 250MB/s) = 844us
13714 */
13715 if (count++ > 500) {
13716 dd_dev_err(dd,
13717 "%s: in-progress DMA not clearing: RcvStatus 0x%llx, continuing\n",
13718 __func__, reg);
13719 break;
13720 }
13721 udelay(2); /* do not busy-wait the CSR */
13722 }
13723
13724 /* start the init - expect RcvCtrl to be 0 */
13725 write_csr(dd, RCV_CTRL, RCV_CTRL_RX_RBUF_INIT_SMASK);
13726
13727 /*
13728 * Read to force the write of Rcvtrl.RxRbufInit. There is a brief
13729 * period after the write before RcvStatus.RxRbufInitDone is valid.
13730 * The delay in the first run through the loop below is sufficient and
13731 * required before the first read of RcvStatus.RxRbufInintDone.
13732 */
13733 read_csr(dd, RCV_CTRL);
13734
13735 /* wait for the init to finish */
13736 count = 0;
13737 while (1) {
13738 /* delay is required first time through - see above */
13739 udelay(2); /* do not busy-wait the CSR */
13740 reg = read_csr(dd, RCV_STATUS);
13741 if (reg & (RCV_STATUS_RX_RBUF_INIT_DONE_SMASK))
13742 break;
13743
13744 /* give up after 100us - slowest possible at 33MHz is 73us */
13745 if (count++ > 50) {
13746 dd_dev_err(dd,
13747 "%s: RcvStatus.RxRbufInit not set, continuing\n",
13748 __func__);
13749 break;
13750 }
13751 }
13752 }
13753
13754 /* set RXE CSRs to chip reset defaults */
reset_rxe_csrs(struct hfi1_devdata * dd)13755 static void reset_rxe_csrs(struct hfi1_devdata *dd)
13756 {
13757 int i, j;
13758
13759 /*
13760 * RXE Kernel CSRs
13761 */
13762 write_csr(dd, RCV_CTRL, 0);
13763 init_rbufs(dd);
13764 /* RCV_STATUS read-only */
13765 /* RCV_CONTEXTS read-only */
13766 /* RCV_ARRAY_CNT read-only */
13767 /* RCV_BUF_SIZE read-only */
13768 write_csr(dd, RCV_BTH_QP, 0);
13769 write_csr(dd, RCV_MULTICAST, 0);
13770 write_csr(dd, RCV_BYPASS, 0);
13771 write_csr(dd, RCV_VL15, 0);
13772 /* this is a clear-down */
13773 write_csr(dd, RCV_ERR_INFO,
13774 RCV_ERR_INFO_RCV_EXCESS_BUFFER_OVERRUN_SMASK);
13775 /* RCV_ERR_STATUS read-only */
13776 write_csr(dd, RCV_ERR_MASK, 0);
13777 write_csr(dd, RCV_ERR_CLEAR, ~0ull);
13778 /* RCV_ERR_FORCE leave alone */
13779 for (i = 0; i < 32; i++)
13780 write_csr(dd, RCV_QP_MAP_TABLE + (8 * i), 0);
13781 for (i = 0; i < 4; i++)
13782 write_csr(dd, RCV_PARTITION_KEY + (8 * i), 0);
13783 for (i = 0; i < RXE_NUM_32_BIT_COUNTERS; i++)
13784 write_csr(dd, RCV_COUNTER_ARRAY32 + (8 * i), 0);
13785 for (i = 0; i < RXE_NUM_64_BIT_COUNTERS; i++)
13786 write_csr(dd, RCV_COUNTER_ARRAY64 + (8 * i), 0);
13787 for (i = 0; i < RXE_NUM_RSM_INSTANCES; i++)
13788 clear_rsm_rule(dd, i);
13789 for (i = 0; i < 32; i++)
13790 write_csr(dd, RCV_RSM_MAP_TABLE + (8 * i), 0);
13791
13792 /*
13793 * RXE Kernel and User Per-Context CSRs
13794 */
13795 for (i = 0; i < chip_rcv_contexts(dd); i++) {
13796 /* kernel */
13797 write_kctxt_csr(dd, i, RCV_CTXT_CTRL, 0);
13798 /* RCV_CTXT_STATUS read-only */
13799 write_kctxt_csr(dd, i, RCV_EGR_CTRL, 0);
13800 write_kctxt_csr(dd, i, RCV_TID_CTRL, 0);
13801 write_kctxt_csr(dd, i, RCV_KEY_CTRL, 0);
13802 write_kctxt_csr(dd, i, RCV_HDR_ADDR, 0);
13803 write_kctxt_csr(dd, i, RCV_HDR_CNT, 0);
13804 write_kctxt_csr(dd, i, RCV_HDR_ENT_SIZE, 0);
13805 write_kctxt_csr(dd, i, RCV_HDR_SIZE, 0);
13806 write_kctxt_csr(dd, i, RCV_HDR_TAIL_ADDR, 0);
13807 write_kctxt_csr(dd, i, RCV_AVAIL_TIME_OUT, 0);
13808 write_kctxt_csr(dd, i, RCV_HDR_OVFL_CNT, 0);
13809
13810 /* user */
13811 /* RCV_HDR_TAIL read-only */
13812 write_uctxt_csr(dd, i, RCV_HDR_HEAD, 0);
13813 /* RCV_EGR_INDEX_TAIL read-only */
13814 write_uctxt_csr(dd, i, RCV_EGR_INDEX_HEAD, 0);
13815 /* RCV_EGR_OFFSET_TAIL read-only */
13816 for (j = 0; j < RXE_NUM_TID_FLOWS; j++) {
13817 write_uctxt_csr(dd, i,
13818 RCV_TID_FLOW_TABLE + (8 * j), 0);
13819 }
13820 }
13821 }
13822
13823 /*
13824 * Set sc2vl tables.
13825 *
13826 * They power on to zeros, so to avoid send context errors
13827 * they need to be set:
13828 *
13829 * SC 0-7 -> VL 0-7 (respectively)
13830 * SC 15 -> VL 15
13831 * otherwise
13832 * -> VL 0
13833 */
init_sc2vl_tables(struct hfi1_devdata * dd)13834 static void init_sc2vl_tables(struct hfi1_devdata *dd)
13835 {
13836 int i;
13837 /* init per architecture spec, constrained by hardware capability */
13838
13839 /* HFI maps sent packets */
13840 write_csr(dd, SEND_SC2VLT0, SC2VL_VAL(
13841 0,
13842 0, 0, 1, 1,
13843 2, 2, 3, 3,
13844 4, 4, 5, 5,
13845 6, 6, 7, 7));
13846 write_csr(dd, SEND_SC2VLT1, SC2VL_VAL(
13847 1,
13848 8, 0, 9, 0,
13849 10, 0, 11, 0,
13850 12, 0, 13, 0,
13851 14, 0, 15, 15));
13852 write_csr(dd, SEND_SC2VLT2, SC2VL_VAL(
13853 2,
13854 16, 0, 17, 0,
13855 18, 0, 19, 0,
13856 20, 0, 21, 0,
13857 22, 0, 23, 0));
13858 write_csr(dd, SEND_SC2VLT3, SC2VL_VAL(
13859 3,
13860 24, 0, 25, 0,
13861 26, 0, 27, 0,
13862 28, 0, 29, 0,
13863 30, 0, 31, 0));
13864
13865 /* DC maps received packets */
13866 write_csr(dd, DCC_CFG_SC_VL_TABLE_15_0, DC_SC_VL_VAL(
13867 15_0,
13868 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
13869 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 15));
13870 write_csr(dd, DCC_CFG_SC_VL_TABLE_31_16, DC_SC_VL_VAL(
13871 31_16,
13872 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, 23, 0,
13873 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0, 30, 0, 31, 0));
13874
13875 /* initialize the cached sc2vl values consistently with h/w */
13876 for (i = 0; i < 32; i++) {
13877 if (i < 8 || i == 15)
13878 *((u8 *)(dd->sc2vl) + i) = (u8)i;
13879 else
13880 *((u8 *)(dd->sc2vl) + i) = 0;
13881 }
13882 }
13883
13884 /*
13885 * Read chip sizes and then reset parts to sane, disabled, values. We cannot
13886 * depend on the chip going through a power-on reset - a driver may be loaded
13887 * and unloaded many times.
13888 *
13889 * Do not write any CSR values to the chip in this routine - there may be
13890 * a reset following the (possible) FLR in this routine.
13891 *
13892 */
init_chip(struct hfi1_devdata * dd)13893 static int init_chip(struct hfi1_devdata *dd)
13894 {
13895 int i;
13896 int ret = 0;
13897
13898 /*
13899 * Put the HFI CSRs in a known state.
13900 * Combine this with a DC reset.
13901 *
13902 * Stop the device from doing anything while we do a
13903 * reset. We know there are no other active users of
13904 * the device since we are now in charge. Turn off
13905 * off all outbound and inbound traffic and make sure
13906 * the device does not generate any interrupts.
13907 */
13908
13909 /* disable send contexts and SDMA engines */
13910 write_csr(dd, SEND_CTRL, 0);
13911 for (i = 0; i < chip_send_contexts(dd); i++)
13912 write_kctxt_csr(dd, i, SEND_CTXT_CTRL, 0);
13913 for (i = 0; i < chip_sdma_engines(dd); i++)
13914 write_kctxt_csr(dd, i, SEND_DMA_CTRL, 0);
13915 /* disable port (turn off RXE inbound traffic) and contexts */
13916 write_csr(dd, RCV_CTRL, 0);
13917 for (i = 0; i < chip_rcv_contexts(dd); i++)
13918 write_csr(dd, RCV_CTXT_CTRL, 0);
13919 /* mask all interrupt sources */
13920 for (i = 0; i < CCE_NUM_INT_CSRS; i++)
13921 write_csr(dd, CCE_INT_MASK + (8 * i), 0ull);
13922
13923 /*
13924 * DC Reset: do a full DC reset before the register clear.
13925 * A recommended length of time to hold is one CSR read,
13926 * so reread the CceDcCtrl. Then, hold the DC in reset
13927 * across the clear.
13928 */
13929 write_csr(dd, CCE_DC_CTRL, CCE_DC_CTRL_DC_RESET_SMASK);
13930 (void)read_csr(dd, CCE_DC_CTRL);
13931
13932 if (use_flr) {
13933 /*
13934 * A FLR will reset the SPC core and part of the PCIe.
13935 * The parts that need to be restored have already been
13936 * saved.
13937 */
13938 dd_dev_info(dd, "Resetting CSRs with FLR\n");
13939
13940 /* do the FLR, the DC reset will remain */
13941 pcie_flr(dd->pcidev);
13942
13943 /* restore command and BARs */
13944 ret = restore_pci_variables(dd);
13945 if (ret) {
13946 dd_dev_err(dd, "%s: Could not restore PCI variables\n",
13947 __func__);
13948 return ret;
13949 }
13950
13951 if (is_ax(dd)) {
13952 dd_dev_info(dd, "Resetting CSRs with FLR\n");
13953 pcie_flr(dd->pcidev);
13954 ret = restore_pci_variables(dd);
13955 if (ret) {
13956 dd_dev_err(dd, "%s: Could not restore PCI variables\n",
13957 __func__);
13958 return ret;
13959 }
13960 }
13961 } else {
13962 dd_dev_info(dd, "Resetting CSRs with writes\n");
13963 reset_cce_csrs(dd);
13964 reset_txe_csrs(dd);
13965 reset_rxe_csrs(dd);
13966 reset_misc_csrs(dd);
13967 }
13968 /* clear the DC reset */
13969 write_csr(dd, CCE_DC_CTRL, 0);
13970
13971 /* Set the LED off */
13972 setextled(dd, 0);
13973
13974 /*
13975 * Clear the QSFP reset.
13976 * An FLR enforces a 0 on all out pins. The driver does not touch
13977 * ASIC_QSFPn_OUT otherwise. This leaves RESET_N low and
13978 * anything plugged constantly in reset, if it pays attention
13979 * to RESET_N.
13980 * Prime examples of this are optical cables. Set all pins high.
13981 * I2CCLK and I2CDAT will change per direction, and INT_N and
13982 * MODPRS_N are input only and their value is ignored.
13983 */
13984 write_csr(dd, ASIC_QSFP1_OUT, 0x1f);
13985 write_csr(dd, ASIC_QSFP2_OUT, 0x1f);
13986 init_chip_resources(dd);
13987 return ret;
13988 }
13989
init_early_variables(struct hfi1_devdata * dd)13990 static void init_early_variables(struct hfi1_devdata *dd)
13991 {
13992 int i;
13993
13994 /* assign link credit variables */
13995 dd->vau = CM_VAU;
13996 dd->link_credits = CM_GLOBAL_CREDITS;
13997 if (is_ax(dd))
13998 dd->link_credits--;
13999 dd->vcu = cu_to_vcu(hfi1_cu);
14000 /* enough room for 8 MAD packets plus header - 17K */
14001 dd->vl15_init = (8 * (2048 + 128)) / vau_to_au(dd->vau);
14002 if (dd->vl15_init > dd->link_credits)
14003 dd->vl15_init = dd->link_credits;
14004
14005 write_uninitialized_csrs_and_memories(dd);
14006
14007 if (HFI1_CAP_IS_KSET(PKEY_CHECK))
14008 for (i = 0; i < dd->num_pports; i++) {
14009 struct hfi1_pportdata *ppd = &dd->pport[i];
14010
14011 set_partition_keys(ppd);
14012 }
14013 init_sc2vl_tables(dd);
14014 }
14015
init_kdeth_qp(struct hfi1_devdata * dd)14016 static void init_kdeth_qp(struct hfi1_devdata *dd)
14017 {
14018 /* user changed the KDETH_QP */
14019 if (kdeth_qp != 0 && kdeth_qp >= 0xff) {
14020 /* out of range or illegal value */
14021 dd_dev_err(dd, "Invalid KDETH queue pair prefix, ignoring");
14022 kdeth_qp = 0;
14023 }
14024 if (kdeth_qp == 0) /* not set, or failed range check */
14025 kdeth_qp = DEFAULT_KDETH_QP;
14026
14027 write_csr(dd, SEND_BTH_QP,
14028 (kdeth_qp & SEND_BTH_QP_KDETH_QP_MASK) <<
14029 SEND_BTH_QP_KDETH_QP_SHIFT);
14030
14031 write_csr(dd, RCV_BTH_QP,
14032 (kdeth_qp & RCV_BTH_QP_KDETH_QP_MASK) <<
14033 RCV_BTH_QP_KDETH_QP_SHIFT);
14034 }
14035
14036 /**
14037 * hfi1_get_qp_map
14038 * @dd: device data
14039 * @idx: index to read
14040 */
hfi1_get_qp_map(struct hfi1_devdata * dd,u8 idx)14041 u8 hfi1_get_qp_map(struct hfi1_devdata *dd, u8 idx)
14042 {
14043 u64 reg = read_csr(dd, RCV_QP_MAP_TABLE + (idx / 8) * 8);
14044
14045 reg >>= (idx % 8) * 8;
14046 return reg;
14047 }
14048
14049 /**
14050 * init_qpmap_table
14051 * @dd - device data
14052 * @first_ctxt - first context
14053 * @last_ctxt - first context
14054 *
14055 * This return sets the qpn mapping table that
14056 * is indexed by qpn[8:1].
14057 *
14058 * The routine will round robin the 256 settings
14059 * from first_ctxt to last_ctxt.
14060 *
14061 * The first/last looks ahead to having specialized
14062 * receive contexts for mgmt and bypass. Normal
14063 * verbs traffic will assumed to be on a range
14064 * of receive contexts.
14065 */
init_qpmap_table(struct hfi1_devdata * dd,u32 first_ctxt,u32 last_ctxt)14066 static void init_qpmap_table(struct hfi1_devdata *dd,
14067 u32 first_ctxt,
14068 u32 last_ctxt)
14069 {
14070 u64 reg = 0;
14071 u64 regno = RCV_QP_MAP_TABLE;
14072 int i;
14073 u64 ctxt = first_ctxt;
14074
14075 for (i = 0; i < 256; i++) {
14076 reg |= ctxt << (8 * (i % 8));
14077 ctxt++;
14078 if (ctxt > last_ctxt)
14079 ctxt = first_ctxt;
14080 if (i % 8 == 7) {
14081 write_csr(dd, regno, reg);
14082 reg = 0;
14083 regno += 8;
14084 }
14085 }
14086
14087 add_rcvctrl(dd, RCV_CTRL_RCV_QP_MAP_ENABLE_SMASK
14088 | RCV_CTRL_RCV_BYPASS_ENABLE_SMASK);
14089 }
14090
14091 struct rsm_map_table {
14092 u64 map[NUM_MAP_REGS];
14093 unsigned int used;
14094 };
14095
14096 struct rsm_rule_data {
14097 u8 offset;
14098 u8 pkt_type;
14099 u32 field1_off;
14100 u32 field2_off;
14101 u32 index1_off;
14102 u32 index1_width;
14103 u32 index2_off;
14104 u32 index2_width;
14105 u32 mask1;
14106 u32 value1;
14107 u32 mask2;
14108 u32 value2;
14109 };
14110
14111 /*
14112 * Return an initialized RMT map table for users to fill in. OK if it
14113 * returns NULL, indicating no table.
14114 */
alloc_rsm_map_table(struct hfi1_devdata * dd)14115 static struct rsm_map_table *alloc_rsm_map_table(struct hfi1_devdata *dd)
14116 {
14117 struct rsm_map_table *rmt;
14118 u8 rxcontext = is_ax(dd) ? 0 : 0xff; /* 0 is default if a0 ver. */
14119
14120 rmt = kmalloc(sizeof(*rmt), GFP_KERNEL);
14121 if (rmt) {
14122 memset(rmt->map, rxcontext, sizeof(rmt->map));
14123 rmt->used = 0;
14124 }
14125
14126 return rmt;
14127 }
14128
14129 /*
14130 * Write the final RMT map table to the chip and free the table. OK if
14131 * table is NULL.
14132 */
complete_rsm_map_table(struct hfi1_devdata * dd,struct rsm_map_table * rmt)14133 static void complete_rsm_map_table(struct hfi1_devdata *dd,
14134 struct rsm_map_table *rmt)
14135 {
14136 int i;
14137
14138 if (rmt) {
14139 /* write table to chip */
14140 for (i = 0; i < NUM_MAP_REGS; i++)
14141 write_csr(dd, RCV_RSM_MAP_TABLE + (8 * i), rmt->map[i]);
14142
14143 /* enable RSM */
14144 add_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK);
14145 }
14146 }
14147
14148 /*
14149 * Add a receive side mapping rule.
14150 */
add_rsm_rule(struct hfi1_devdata * dd,u8 rule_index,struct rsm_rule_data * rrd)14151 static void add_rsm_rule(struct hfi1_devdata *dd, u8 rule_index,
14152 struct rsm_rule_data *rrd)
14153 {
14154 write_csr(dd, RCV_RSM_CFG + (8 * rule_index),
14155 (u64)rrd->offset << RCV_RSM_CFG_OFFSET_SHIFT |
14156 1ull << rule_index | /* enable bit */
14157 (u64)rrd->pkt_type << RCV_RSM_CFG_PACKET_TYPE_SHIFT);
14158 write_csr(dd, RCV_RSM_SELECT + (8 * rule_index),
14159 (u64)rrd->field1_off << RCV_RSM_SELECT_FIELD1_OFFSET_SHIFT |
14160 (u64)rrd->field2_off << RCV_RSM_SELECT_FIELD2_OFFSET_SHIFT |
14161 (u64)rrd->index1_off << RCV_RSM_SELECT_INDEX1_OFFSET_SHIFT |
14162 (u64)rrd->index1_width << RCV_RSM_SELECT_INDEX1_WIDTH_SHIFT |
14163 (u64)rrd->index2_off << RCV_RSM_SELECT_INDEX2_OFFSET_SHIFT |
14164 (u64)rrd->index2_width << RCV_RSM_SELECT_INDEX2_WIDTH_SHIFT);
14165 write_csr(dd, RCV_RSM_MATCH + (8 * rule_index),
14166 (u64)rrd->mask1 << RCV_RSM_MATCH_MASK1_SHIFT |
14167 (u64)rrd->value1 << RCV_RSM_MATCH_VALUE1_SHIFT |
14168 (u64)rrd->mask2 << RCV_RSM_MATCH_MASK2_SHIFT |
14169 (u64)rrd->value2 << RCV_RSM_MATCH_VALUE2_SHIFT);
14170 }
14171
14172 /*
14173 * Clear a receive side mapping rule.
14174 */
clear_rsm_rule(struct hfi1_devdata * dd,u8 rule_index)14175 static void clear_rsm_rule(struct hfi1_devdata *dd, u8 rule_index)
14176 {
14177 write_csr(dd, RCV_RSM_CFG + (8 * rule_index), 0);
14178 write_csr(dd, RCV_RSM_SELECT + (8 * rule_index), 0);
14179 write_csr(dd, RCV_RSM_MATCH + (8 * rule_index), 0);
14180 }
14181
14182 /* return the number of RSM map table entries that will be used for QOS */
qos_rmt_entries(struct hfi1_devdata * dd,unsigned int * mp,unsigned int * np)14183 static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
14184 unsigned int *np)
14185 {
14186 int i;
14187 unsigned int m, n;
14188 u8 max_by_vl = 0;
14189
14190 /* is QOS active at all? */
14191 if (dd->n_krcv_queues <= MIN_KERNEL_KCTXTS ||
14192 num_vls == 1 ||
14193 krcvqsset <= 1)
14194 goto no_qos;
14195
14196 /* determine bits for qpn */
14197 for (i = 0; i < min_t(unsigned int, num_vls, krcvqsset); i++)
14198 if (krcvqs[i] > max_by_vl)
14199 max_by_vl = krcvqs[i];
14200 if (max_by_vl > 32)
14201 goto no_qos;
14202 m = ilog2(__roundup_pow_of_two(max_by_vl));
14203
14204 /* determine bits for vl */
14205 n = ilog2(__roundup_pow_of_two(num_vls));
14206
14207 /* reject if too much is used */
14208 if ((m + n) > 7)
14209 goto no_qos;
14210
14211 if (mp)
14212 *mp = m;
14213 if (np)
14214 *np = n;
14215
14216 return 1 << (m + n);
14217
14218 no_qos:
14219 if (mp)
14220 *mp = 0;
14221 if (np)
14222 *np = 0;
14223 return 0;
14224 }
14225
14226 /**
14227 * init_qos - init RX qos
14228 * @dd - device data
14229 * @rmt - RSM map table
14230 *
14231 * This routine initializes Rule 0 and the RSM map table to implement
14232 * quality of service (qos).
14233 *
14234 * If all of the limit tests succeed, qos is applied based on the array
14235 * interpretation of krcvqs where entry 0 is VL0.
14236 *
14237 * The number of vl bits (n) and the number of qpn bits (m) are computed to
14238 * feed both the RSM map table and the single rule.
14239 */
init_qos(struct hfi1_devdata * dd,struct rsm_map_table * rmt)14240 static void init_qos(struct hfi1_devdata *dd, struct rsm_map_table *rmt)
14241 {
14242 struct rsm_rule_data rrd;
14243 unsigned qpns_per_vl, ctxt, i, qpn, n = 1, m;
14244 unsigned int rmt_entries;
14245 u64 reg;
14246
14247 if (!rmt)
14248 goto bail;
14249 rmt_entries = qos_rmt_entries(dd, &m, &n);
14250 if (rmt_entries == 0)
14251 goto bail;
14252 qpns_per_vl = 1 << m;
14253
14254 /* enough room in the map table? */
14255 rmt_entries = 1 << (m + n);
14256 if (rmt->used + rmt_entries >= NUM_MAP_ENTRIES)
14257 goto bail;
14258
14259 /* add qos entries to the the RSM map table */
14260 for (i = 0, ctxt = FIRST_KERNEL_KCTXT; i < num_vls; i++) {
14261 unsigned tctxt;
14262
14263 for (qpn = 0, tctxt = ctxt;
14264 krcvqs[i] && qpn < qpns_per_vl; qpn++) {
14265 unsigned idx, regoff, regidx;
14266
14267 /* generate the index the hardware will produce */
14268 idx = rmt->used + ((qpn << n) ^ i);
14269 regoff = (idx % 8) * 8;
14270 regidx = idx / 8;
14271 /* replace default with context number */
14272 reg = rmt->map[regidx];
14273 reg &= ~(RCV_RSM_MAP_TABLE_RCV_CONTEXT_A_MASK
14274 << regoff);
14275 reg |= (u64)(tctxt++) << regoff;
14276 rmt->map[regidx] = reg;
14277 if (tctxt == ctxt + krcvqs[i])
14278 tctxt = ctxt;
14279 }
14280 ctxt += krcvqs[i];
14281 }
14282
14283 rrd.offset = rmt->used;
14284 rrd.pkt_type = 2;
14285 rrd.field1_off = LRH_BTH_MATCH_OFFSET;
14286 rrd.field2_off = LRH_SC_MATCH_OFFSET;
14287 rrd.index1_off = LRH_SC_SELECT_OFFSET;
14288 rrd.index1_width = n;
14289 rrd.index2_off = QPN_SELECT_OFFSET;
14290 rrd.index2_width = m + n;
14291 rrd.mask1 = LRH_BTH_MASK;
14292 rrd.value1 = LRH_BTH_VALUE;
14293 rrd.mask2 = LRH_SC_MASK;
14294 rrd.value2 = LRH_SC_VALUE;
14295
14296 /* add rule 0 */
14297 add_rsm_rule(dd, RSM_INS_VERBS, &rrd);
14298
14299 /* mark RSM map entries as used */
14300 rmt->used += rmt_entries;
14301 /* map everything else to the mcast/err/vl15 context */
14302 init_qpmap_table(dd, HFI1_CTRL_CTXT, HFI1_CTRL_CTXT);
14303 dd->qos_shift = n + 1;
14304 return;
14305 bail:
14306 dd->qos_shift = 1;
14307 init_qpmap_table(dd, FIRST_KERNEL_KCTXT, dd->n_krcv_queues - 1);
14308 }
14309
init_fecn_handling(struct hfi1_devdata * dd,struct rsm_map_table * rmt)14310 static void init_fecn_handling(struct hfi1_devdata *dd,
14311 struct rsm_map_table *rmt)
14312 {
14313 struct rsm_rule_data rrd;
14314 u64 reg;
14315 int i, idx, regoff, regidx, start;
14316 u8 offset;
14317 u32 total_cnt;
14318
14319 if (HFI1_CAP_IS_KSET(TID_RDMA))
14320 /* Exclude context 0 */
14321 start = 1;
14322 else
14323 start = dd->first_dyn_alloc_ctxt;
14324
14325 total_cnt = dd->num_rcv_contexts - start;
14326
14327 /* there needs to be enough room in the map table */
14328 if (rmt->used + total_cnt >= NUM_MAP_ENTRIES) {
14329 dd_dev_err(dd, "FECN handling disabled - too many contexts allocated\n");
14330 return;
14331 }
14332
14333 /*
14334 * RSM will extract the destination context as an index into the
14335 * map table. The destination contexts are a sequential block
14336 * in the range start...num_rcv_contexts-1 (inclusive).
14337 * Map entries are accessed as offset + extracted value. Adjust
14338 * the added offset so this sequence can be placed anywhere in
14339 * the table - as long as the entries themselves do not wrap.
14340 * There are only enough bits in offset for the table size, so
14341 * start with that to allow for a "negative" offset.
14342 */
14343 offset = (u8)(NUM_MAP_ENTRIES + rmt->used - start);
14344
14345 for (i = start, idx = rmt->used; i < dd->num_rcv_contexts;
14346 i++, idx++) {
14347 /* replace with identity mapping */
14348 regoff = (idx % 8) * 8;
14349 regidx = idx / 8;
14350 reg = rmt->map[regidx];
14351 reg &= ~(RCV_RSM_MAP_TABLE_RCV_CONTEXT_A_MASK << regoff);
14352 reg |= (u64)i << regoff;
14353 rmt->map[regidx] = reg;
14354 }
14355
14356 /*
14357 * For RSM intercept of Expected FECN packets:
14358 * o packet type 0 - expected
14359 * o match on F (bit 95), using select/match 1, and
14360 * o match on SH (bit 133), using select/match 2.
14361 *
14362 * Use index 1 to extract the 8-bit receive context from DestQP
14363 * (start at bit 64). Use that as the RSM map table index.
14364 */
14365 rrd.offset = offset;
14366 rrd.pkt_type = 0;
14367 rrd.field1_off = 95;
14368 rrd.field2_off = 133;
14369 rrd.index1_off = 64;
14370 rrd.index1_width = 8;
14371 rrd.index2_off = 0;
14372 rrd.index2_width = 0;
14373 rrd.mask1 = 1;
14374 rrd.value1 = 1;
14375 rrd.mask2 = 1;
14376 rrd.value2 = 1;
14377
14378 /* add rule 1 */
14379 add_rsm_rule(dd, RSM_INS_FECN, &rrd);
14380
14381 rmt->used += total_cnt;
14382 }
14383
14384 /* Initialize RSM for VNIC */
hfi1_init_vnic_rsm(struct hfi1_devdata * dd)14385 void hfi1_init_vnic_rsm(struct hfi1_devdata *dd)
14386 {
14387 u8 i, j;
14388 u8 ctx_id = 0;
14389 u64 reg;
14390 u32 regoff;
14391 struct rsm_rule_data rrd;
14392
14393 if (hfi1_vnic_is_rsm_full(dd, NUM_VNIC_MAP_ENTRIES)) {
14394 dd_dev_err(dd, "Vnic RSM disabled, rmt entries used = %d\n",
14395 dd->vnic.rmt_start);
14396 return;
14397 }
14398
14399 dev_dbg(&(dd)->pcidev->dev, "Vnic rsm start = %d, end %d\n",
14400 dd->vnic.rmt_start,
14401 dd->vnic.rmt_start + NUM_VNIC_MAP_ENTRIES);
14402
14403 /* Update RSM mapping table, 32 regs, 256 entries - 1 ctx per byte */
14404 regoff = RCV_RSM_MAP_TABLE + (dd->vnic.rmt_start / 8) * 8;
14405 reg = read_csr(dd, regoff);
14406 for (i = 0; i < NUM_VNIC_MAP_ENTRIES; i++) {
14407 /* Update map register with vnic context */
14408 j = (dd->vnic.rmt_start + i) % 8;
14409 reg &= ~(0xffllu << (j * 8));
14410 reg |= (u64)dd->vnic.ctxt[ctx_id++]->ctxt << (j * 8);
14411 /* Wrap up vnic ctx index */
14412 ctx_id %= dd->vnic.num_ctxt;
14413 /* Write back map register */
14414 if (j == 7 || ((i + 1) == NUM_VNIC_MAP_ENTRIES)) {
14415 dev_dbg(&(dd)->pcidev->dev,
14416 "Vnic rsm map reg[%d] =0x%llx\n",
14417 regoff - RCV_RSM_MAP_TABLE, reg);
14418
14419 write_csr(dd, regoff, reg);
14420 regoff += 8;
14421 if (i < (NUM_VNIC_MAP_ENTRIES - 1))
14422 reg = read_csr(dd, regoff);
14423 }
14424 }
14425
14426 /* Add rule for vnic */
14427 rrd.offset = dd->vnic.rmt_start;
14428 rrd.pkt_type = 4;
14429 /* Match 16B packets */
14430 rrd.field1_off = L2_TYPE_MATCH_OFFSET;
14431 rrd.mask1 = L2_TYPE_MASK;
14432 rrd.value1 = L2_16B_VALUE;
14433 /* Match ETH L4 packets */
14434 rrd.field2_off = L4_TYPE_MATCH_OFFSET;
14435 rrd.mask2 = L4_16B_TYPE_MASK;
14436 rrd.value2 = L4_16B_ETH_VALUE;
14437 /* Calc context from veswid and entropy */
14438 rrd.index1_off = L4_16B_HDR_VESWID_OFFSET;
14439 rrd.index1_width = ilog2(NUM_VNIC_MAP_ENTRIES);
14440 rrd.index2_off = L2_16B_ENTROPY_OFFSET;
14441 rrd.index2_width = ilog2(NUM_VNIC_MAP_ENTRIES);
14442 add_rsm_rule(dd, RSM_INS_VNIC, &rrd);
14443
14444 /* Enable RSM if not already enabled */
14445 add_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK);
14446 }
14447
hfi1_deinit_vnic_rsm(struct hfi1_devdata * dd)14448 void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd)
14449 {
14450 clear_rsm_rule(dd, RSM_INS_VNIC);
14451
14452 /* Disable RSM if used only by vnic */
14453 if (dd->vnic.rmt_start == 0)
14454 clear_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK);
14455 }
14456
init_rxe(struct hfi1_devdata * dd)14457 static int init_rxe(struct hfi1_devdata *dd)
14458 {
14459 struct rsm_map_table *rmt;
14460 u64 val;
14461
14462 /* enable all receive errors */
14463 write_csr(dd, RCV_ERR_MASK, ~0ull);
14464
14465 rmt = alloc_rsm_map_table(dd);
14466 if (!rmt)
14467 return -ENOMEM;
14468
14469 /* set up QOS, including the QPN map table */
14470 init_qos(dd, rmt);
14471 init_fecn_handling(dd, rmt);
14472 complete_rsm_map_table(dd, rmt);
14473 /* record number of used rsm map entries for vnic */
14474 dd->vnic.rmt_start = rmt->used;
14475 kfree(rmt);
14476
14477 /*
14478 * make sure RcvCtrl.RcvWcb <= PCIe Device Control
14479 * Register Max_Payload_Size (PCI_EXP_DEVCTL in Linux PCIe config
14480 * space, PciCfgCap2.MaxPayloadSize in HFI). There is only one
14481 * invalid configuration: RcvCtrl.RcvWcb set to its max of 256 and
14482 * Max_PayLoad_Size set to its minimum of 128.
14483 *
14484 * Presently, RcvCtrl.RcvWcb is not modified from its default of 0
14485 * (64 bytes). Max_Payload_Size is possibly modified upward in
14486 * tune_pcie_caps() which is called after this routine.
14487 */
14488
14489 /* Have 16 bytes (4DW) of bypass header available in header queue */
14490 val = read_csr(dd, RCV_BYPASS);
14491 val &= ~RCV_BYPASS_HDR_SIZE_SMASK;
14492 val |= ((4ull & RCV_BYPASS_HDR_SIZE_MASK) <<
14493 RCV_BYPASS_HDR_SIZE_SHIFT);
14494 write_csr(dd, RCV_BYPASS, val);
14495 return 0;
14496 }
14497
init_other(struct hfi1_devdata * dd)14498 static void init_other(struct hfi1_devdata *dd)
14499 {
14500 /* enable all CCE errors */
14501 write_csr(dd, CCE_ERR_MASK, ~0ull);
14502 /* enable *some* Misc errors */
14503 write_csr(dd, MISC_ERR_MASK, DRIVER_MISC_MASK);
14504 /* enable all DC errors, except LCB */
14505 write_csr(dd, DCC_ERR_FLG_EN, ~0ull);
14506 write_csr(dd, DC_DC8051_ERR_EN, ~0ull);
14507 }
14508
14509 /*
14510 * Fill out the given AU table using the given CU. A CU is defined in terms
14511 * AUs. The table is a an encoding: given the index, how many AUs does that
14512 * represent?
14513 *
14514 * NOTE: Assumes that the register layout is the same for the
14515 * local and remote tables.
14516 */
assign_cm_au_table(struct hfi1_devdata * dd,u32 cu,u32 csr0to3,u32 csr4to7)14517 static void assign_cm_au_table(struct hfi1_devdata *dd, u32 cu,
14518 u32 csr0to3, u32 csr4to7)
14519 {
14520 write_csr(dd, csr0to3,
14521 0ull << SEND_CM_LOCAL_AU_TABLE0_TO3_LOCAL_AU_TABLE0_SHIFT |
14522 1ull << SEND_CM_LOCAL_AU_TABLE0_TO3_LOCAL_AU_TABLE1_SHIFT |
14523 2ull * cu <<
14524 SEND_CM_LOCAL_AU_TABLE0_TO3_LOCAL_AU_TABLE2_SHIFT |
14525 4ull * cu <<
14526 SEND_CM_LOCAL_AU_TABLE0_TO3_LOCAL_AU_TABLE3_SHIFT);
14527 write_csr(dd, csr4to7,
14528 8ull * cu <<
14529 SEND_CM_LOCAL_AU_TABLE4_TO7_LOCAL_AU_TABLE4_SHIFT |
14530 16ull * cu <<
14531 SEND_CM_LOCAL_AU_TABLE4_TO7_LOCAL_AU_TABLE5_SHIFT |
14532 32ull * cu <<
14533 SEND_CM_LOCAL_AU_TABLE4_TO7_LOCAL_AU_TABLE6_SHIFT |
14534 64ull * cu <<
14535 SEND_CM_LOCAL_AU_TABLE4_TO7_LOCAL_AU_TABLE7_SHIFT);
14536 }
14537
assign_local_cm_au_table(struct hfi1_devdata * dd,u8 vcu)14538 static void assign_local_cm_au_table(struct hfi1_devdata *dd, u8 vcu)
14539 {
14540 assign_cm_au_table(dd, vcu_to_cu(vcu), SEND_CM_LOCAL_AU_TABLE0_TO3,
14541 SEND_CM_LOCAL_AU_TABLE4_TO7);
14542 }
14543
assign_remote_cm_au_table(struct hfi1_devdata * dd,u8 vcu)14544 void assign_remote_cm_au_table(struct hfi1_devdata *dd, u8 vcu)
14545 {
14546 assign_cm_au_table(dd, vcu_to_cu(vcu), SEND_CM_REMOTE_AU_TABLE0_TO3,
14547 SEND_CM_REMOTE_AU_TABLE4_TO7);
14548 }
14549
init_txe(struct hfi1_devdata * dd)14550 static void init_txe(struct hfi1_devdata *dd)
14551 {
14552 int i;
14553
14554 /* enable all PIO, SDMA, general, and Egress errors */
14555 write_csr(dd, SEND_PIO_ERR_MASK, ~0ull);
14556 write_csr(dd, SEND_DMA_ERR_MASK, ~0ull);
14557 write_csr(dd, SEND_ERR_MASK, ~0ull);
14558 write_csr(dd, SEND_EGRESS_ERR_MASK, ~0ull);
14559
14560 /* enable all per-context and per-SDMA engine errors */
14561 for (i = 0; i < chip_send_contexts(dd); i++)
14562 write_kctxt_csr(dd, i, SEND_CTXT_ERR_MASK, ~0ull);
14563 for (i = 0; i < chip_sdma_engines(dd); i++)
14564 write_kctxt_csr(dd, i, SEND_DMA_ENG_ERR_MASK, ~0ull);
14565
14566 /* set the local CU to AU mapping */
14567 assign_local_cm_au_table(dd, dd->vcu);
14568
14569 /*
14570 * Set reasonable default for Credit Return Timer
14571 * Don't set on Simulator - causes it to choke.
14572 */
14573 if (dd->icode != ICODE_FUNCTIONAL_SIMULATOR)
14574 write_csr(dd, SEND_CM_TIMER_CTRL, HFI1_CREDIT_RETURN_RATE);
14575 }
14576
hfi1_set_ctxt_jkey(struct hfi1_devdata * dd,struct hfi1_ctxtdata * rcd,u16 jkey)14577 int hfi1_set_ctxt_jkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd,
14578 u16 jkey)
14579 {
14580 u8 hw_ctxt;
14581 u64 reg;
14582
14583 if (!rcd || !rcd->sc)
14584 return -EINVAL;
14585
14586 hw_ctxt = rcd->sc->hw_context;
14587 reg = SEND_CTXT_CHECK_JOB_KEY_MASK_SMASK | /* mask is always 1's */
14588 ((jkey & SEND_CTXT_CHECK_JOB_KEY_VALUE_MASK) <<
14589 SEND_CTXT_CHECK_JOB_KEY_VALUE_SHIFT);
14590 /* JOB_KEY_ALLOW_PERMISSIVE is not allowed by default */
14591 if (HFI1_CAP_KGET_MASK(rcd->flags, ALLOW_PERM_JKEY))
14592 reg |= SEND_CTXT_CHECK_JOB_KEY_ALLOW_PERMISSIVE_SMASK;
14593 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_JOB_KEY, reg);
14594 /*
14595 * Enable send-side J_KEY integrity check, unless this is A0 h/w
14596 */
14597 if (!is_ax(dd)) {
14598 reg = read_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE);
14599 reg |= SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
14600 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE, reg);
14601 }
14602
14603 /* Enable J_KEY check on receive context. */
14604 reg = RCV_KEY_CTRL_JOB_KEY_ENABLE_SMASK |
14605 ((jkey & RCV_KEY_CTRL_JOB_KEY_VALUE_MASK) <<
14606 RCV_KEY_CTRL_JOB_KEY_VALUE_SHIFT);
14607 write_kctxt_csr(dd, rcd->ctxt, RCV_KEY_CTRL, reg);
14608
14609 return 0;
14610 }
14611
hfi1_clear_ctxt_jkey(struct hfi1_devdata * dd,struct hfi1_ctxtdata * rcd)14612 int hfi1_clear_ctxt_jkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
14613 {
14614 u8 hw_ctxt;
14615 u64 reg;
14616
14617 if (!rcd || !rcd->sc)
14618 return -EINVAL;
14619
14620 hw_ctxt = rcd->sc->hw_context;
14621 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_JOB_KEY, 0);
14622 /*
14623 * Disable send-side J_KEY integrity check, unless this is A0 h/w.
14624 * This check would not have been enabled for A0 h/w, see
14625 * set_ctxt_jkey().
14626 */
14627 if (!is_ax(dd)) {
14628 reg = read_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE);
14629 reg &= ~SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
14630 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE, reg);
14631 }
14632 /* Turn off the J_KEY on the receive side */
14633 write_kctxt_csr(dd, rcd->ctxt, RCV_KEY_CTRL, 0);
14634
14635 return 0;
14636 }
14637
hfi1_set_ctxt_pkey(struct hfi1_devdata * dd,struct hfi1_ctxtdata * rcd,u16 pkey)14638 int hfi1_set_ctxt_pkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd,
14639 u16 pkey)
14640 {
14641 u8 hw_ctxt;
14642 u64 reg;
14643
14644 if (!rcd || !rcd->sc)
14645 return -EINVAL;
14646
14647 hw_ctxt = rcd->sc->hw_context;
14648 reg = ((u64)pkey & SEND_CTXT_CHECK_PARTITION_KEY_VALUE_MASK) <<
14649 SEND_CTXT_CHECK_PARTITION_KEY_VALUE_SHIFT;
14650 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_PARTITION_KEY, reg);
14651 reg = read_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE);
14652 reg |= SEND_CTXT_CHECK_ENABLE_CHECK_PARTITION_KEY_SMASK;
14653 reg &= ~SEND_CTXT_CHECK_ENABLE_DISALLOW_KDETH_PACKETS_SMASK;
14654 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE, reg);
14655
14656 return 0;
14657 }
14658
hfi1_clear_ctxt_pkey(struct hfi1_devdata * dd,struct hfi1_ctxtdata * ctxt)14659 int hfi1_clear_ctxt_pkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *ctxt)
14660 {
14661 u8 hw_ctxt;
14662 u64 reg;
14663
14664 if (!ctxt || !ctxt->sc)
14665 return -EINVAL;
14666
14667 hw_ctxt = ctxt->sc->hw_context;
14668 reg = read_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE);
14669 reg &= ~SEND_CTXT_CHECK_ENABLE_CHECK_PARTITION_KEY_SMASK;
14670 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_ENABLE, reg);
14671 write_kctxt_csr(dd, hw_ctxt, SEND_CTXT_CHECK_PARTITION_KEY, 0);
14672
14673 return 0;
14674 }
14675
14676 /*
14677 * Start doing the clean up the the chip. Our clean up happens in multiple
14678 * stages and this is just the first.
14679 */
hfi1_start_cleanup(struct hfi1_devdata * dd)14680 void hfi1_start_cleanup(struct hfi1_devdata *dd)
14681 {
14682 aspm_exit(dd);
14683 free_cntrs(dd);
14684 free_rcverr(dd);
14685 finish_chip_resources(dd);
14686 }
14687
14688 #define HFI_BASE_GUID(dev) \
14689 ((dev)->base_guid & ~(1ULL << GUID_HFI_INDEX_SHIFT))
14690
14691 /*
14692 * Information can be shared between the two HFIs on the same ASIC
14693 * in the same OS. This function finds the peer device and sets
14694 * up a shared structure.
14695 */
init_asic_data(struct hfi1_devdata * dd)14696 static int init_asic_data(struct hfi1_devdata *dd)
14697 {
14698 unsigned long index;
14699 struct hfi1_devdata *peer;
14700 struct hfi1_asic_data *asic_data;
14701 int ret = 0;
14702
14703 /* pre-allocate the asic structure in case we are the first device */
14704 asic_data = kzalloc(sizeof(*dd->asic_data), GFP_KERNEL);
14705 if (!asic_data)
14706 return -ENOMEM;
14707
14708 xa_lock_irq(&hfi1_dev_table);
14709 /* Find our peer device */
14710 xa_for_each(&hfi1_dev_table, index, peer) {
14711 if ((HFI_BASE_GUID(dd) == HFI_BASE_GUID(peer)) &&
14712 dd->unit != peer->unit)
14713 break;
14714 }
14715
14716 if (peer) {
14717 /* use already allocated structure */
14718 dd->asic_data = peer->asic_data;
14719 kfree(asic_data);
14720 } else {
14721 dd->asic_data = asic_data;
14722 mutex_init(&dd->asic_data->asic_resource_mutex);
14723 }
14724 dd->asic_data->dds[dd->hfi1_id] = dd; /* self back-pointer */
14725 xa_unlock_irq(&hfi1_dev_table);
14726
14727 /* first one through - set up i2c devices */
14728 if (!peer)
14729 ret = set_up_i2c(dd, dd->asic_data);
14730
14731 return ret;
14732 }
14733
14734 /*
14735 * Set dd->boardname. Use a generic name if a name is not returned from
14736 * EFI variable space.
14737 *
14738 * Return 0 on success, -ENOMEM if space could not be allocated.
14739 */
obtain_boardname(struct hfi1_devdata * dd)14740 static int obtain_boardname(struct hfi1_devdata *dd)
14741 {
14742 /* generic board description */
14743 const char generic[] =
14744 "Intel Omni-Path Host Fabric Interface Adapter 100 Series";
14745 unsigned long size;
14746 int ret;
14747
14748 ret = read_hfi1_efi_var(dd, "description", &size,
14749 (void **)&dd->boardname);
14750 if (ret) {
14751 dd_dev_info(dd, "Board description not found\n");
14752 /* use generic description */
14753 dd->boardname = kstrdup(generic, GFP_KERNEL);
14754 if (!dd->boardname)
14755 return -ENOMEM;
14756 }
14757 return 0;
14758 }
14759
14760 /*
14761 * Check the interrupt registers to make sure that they are mapped correctly.
14762 * It is intended to help user identify any mismapping by VMM when the driver
14763 * is running in a VM. This function should only be called before interrupt
14764 * is set up properly.
14765 *
14766 * Return 0 on success, -EINVAL on failure.
14767 */
check_int_registers(struct hfi1_devdata * dd)14768 static int check_int_registers(struct hfi1_devdata *dd)
14769 {
14770 u64 reg;
14771 u64 all_bits = ~(u64)0;
14772 u64 mask;
14773
14774 /* Clear CceIntMask[0] to avoid raising any interrupts */
14775 mask = read_csr(dd, CCE_INT_MASK);
14776 write_csr(dd, CCE_INT_MASK, 0ull);
14777 reg = read_csr(dd, CCE_INT_MASK);
14778 if (reg)
14779 goto err_exit;
14780
14781 /* Clear all interrupt status bits */
14782 write_csr(dd, CCE_INT_CLEAR, all_bits);
14783 reg = read_csr(dd, CCE_INT_STATUS);
14784 if (reg)
14785 goto err_exit;
14786
14787 /* Set all interrupt status bits */
14788 write_csr(dd, CCE_INT_FORCE, all_bits);
14789 reg = read_csr(dd, CCE_INT_STATUS);
14790 if (reg != all_bits)
14791 goto err_exit;
14792
14793 /* Restore the interrupt mask */
14794 write_csr(dd, CCE_INT_CLEAR, all_bits);
14795 write_csr(dd, CCE_INT_MASK, mask);
14796
14797 return 0;
14798 err_exit:
14799 write_csr(dd, CCE_INT_MASK, mask);
14800 dd_dev_err(dd, "Interrupt registers not properly mapped by VMM\n");
14801 return -EINVAL;
14802 }
14803
14804 /**
14805 * hfi1_init_dd() - Initialize most of the dd structure.
14806 * @dev: the pci_dev for hfi1_ib device
14807 * @ent: pci_device_id struct for this dev
14808 *
14809 * This is global, and is called directly at init to set up the
14810 * chip-specific function pointers for later use.
14811 */
hfi1_init_dd(struct hfi1_devdata * dd)14812 int hfi1_init_dd(struct hfi1_devdata *dd)
14813 {
14814 struct pci_dev *pdev = dd->pcidev;
14815 struct hfi1_pportdata *ppd;
14816 u64 reg;
14817 int i, ret;
14818 static const char * const inames[] = { /* implementation names */
14819 "RTL silicon",
14820 "RTL VCS simulation",
14821 "RTL FPGA emulation",
14822 "Functional simulator"
14823 };
14824 struct pci_dev *parent = pdev->bus->self;
14825 u32 sdma_engines = chip_sdma_engines(dd);
14826
14827 ppd = dd->pport;
14828 for (i = 0; i < dd->num_pports; i++, ppd++) {
14829 int vl;
14830 /* init common fields */
14831 hfi1_init_pportdata(pdev, ppd, dd, 0, 1);
14832 /* DC supports 4 link widths */
14833 ppd->link_width_supported =
14834 OPA_LINK_WIDTH_1X | OPA_LINK_WIDTH_2X |
14835 OPA_LINK_WIDTH_3X | OPA_LINK_WIDTH_4X;
14836 ppd->link_width_downgrade_supported =
14837 ppd->link_width_supported;
14838 /* start out enabling only 4X */
14839 ppd->link_width_enabled = OPA_LINK_WIDTH_4X;
14840 ppd->link_width_downgrade_enabled =
14841 ppd->link_width_downgrade_supported;
14842 /* link width active is 0 when link is down */
14843 /* link width downgrade active is 0 when link is down */
14844
14845 if (num_vls < HFI1_MIN_VLS_SUPPORTED ||
14846 num_vls > HFI1_MAX_VLS_SUPPORTED) {
14847 dd_dev_err(dd, "Invalid num_vls %u, using %u VLs\n",
14848 num_vls, HFI1_MAX_VLS_SUPPORTED);
14849 num_vls = HFI1_MAX_VLS_SUPPORTED;
14850 }
14851 ppd->vls_supported = num_vls;
14852 ppd->vls_operational = ppd->vls_supported;
14853 /* Set the default MTU. */
14854 for (vl = 0; vl < num_vls; vl++)
14855 dd->vld[vl].mtu = hfi1_max_mtu;
14856 dd->vld[15].mtu = MAX_MAD_PACKET;
14857 /*
14858 * Set the initial values to reasonable default, will be set
14859 * for real when link is up.
14860 */
14861 ppd->overrun_threshold = 0x4;
14862 ppd->phy_error_threshold = 0xf;
14863 ppd->port_crc_mode_enabled = link_crc_mask;
14864 /* initialize supported LTP CRC mode */
14865 ppd->port_ltp_crc_mode = cap_to_port_ltp(link_crc_mask) << 8;
14866 /* initialize enabled LTP CRC mode */
14867 ppd->port_ltp_crc_mode |= cap_to_port_ltp(link_crc_mask) << 4;
14868 /* start in offline */
14869 ppd->host_link_state = HLS_DN_OFFLINE;
14870 init_vl_arb_caches(ppd);
14871 }
14872
14873 /*
14874 * Do remaining PCIe setup and save PCIe values in dd.
14875 * Any error printing is already done by the init code.
14876 * On return, we have the chip mapped.
14877 */
14878 ret = hfi1_pcie_ddinit(dd, pdev);
14879 if (ret < 0)
14880 goto bail_free;
14881
14882 /* Save PCI space registers to rewrite after device reset */
14883 ret = save_pci_variables(dd);
14884 if (ret < 0)
14885 goto bail_cleanup;
14886
14887 dd->majrev = (dd->revision >> CCE_REVISION_CHIP_REV_MAJOR_SHIFT)
14888 & CCE_REVISION_CHIP_REV_MAJOR_MASK;
14889 dd->minrev = (dd->revision >> CCE_REVISION_CHIP_REV_MINOR_SHIFT)
14890 & CCE_REVISION_CHIP_REV_MINOR_MASK;
14891
14892 /*
14893 * Check interrupt registers mapping if the driver has no access to
14894 * the upstream component. In this case, it is likely that the driver
14895 * is running in a VM.
14896 */
14897 if (!parent) {
14898 ret = check_int_registers(dd);
14899 if (ret)
14900 goto bail_cleanup;
14901 }
14902
14903 /*
14904 * obtain the hardware ID - NOT related to unit, which is a
14905 * software enumeration
14906 */
14907 reg = read_csr(dd, CCE_REVISION2);
14908 dd->hfi1_id = (reg >> CCE_REVISION2_HFI_ID_SHIFT)
14909 & CCE_REVISION2_HFI_ID_MASK;
14910 /* the variable size will remove unwanted bits */
14911 dd->icode = reg >> CCE_REVISION2_IMPL_CODE_SHIFT;
14912 dd->irev = reg >> CCE_REVISION2_IMPL_REVISION_SHIFT;
14913 dd_dev_info(dd, "Implementation: %s, revision 0x%x\n",
14914 dd->icode < ARRAY_SIZE(inames) ?
14915 inames[dd->icode] : "unknown", (int)dd->irev);
14916
14917 /* speeds the hardware can support */
14918 dd->pport->link_speed_supported = OPA_LINK_SPEED_25G;
14919 /* speeds allowed to run at */
14920 dd->pport->link_speed_enabled = dd->pport->link_speed_supported;
14921 /* give a reasonable active value, will be set on link up */
14922 dd->pport->link_speed_active = OPA_LINK_SPEED_25G;
14923
14924 /* fix up link widths for emulation _p */
14925 ppd = dd->pport;
14926 if (dd->icode == ICODE_FPGA_EMULATION && is_emulator_p(dd)) {
14927 ppd->link_width_supported =
14928 ppd->link_width_enabled =
14929 ppd->link_width_downgrade_supported =
14930 ppd->link_width_downgrade_enabled =
14931 OPA_LINK_WIDTH_1X;
14932 }
14933 /* insure num_vls isn't larger than number of sdma engines */
14934 if (HFI1_CAP_IS_KSET(SDMA) && num_vls > sdma_engines) {
14935 dd_dev_err(dd, "num_vls %u too large, using %u VLs\n",
14936 num_vls, sdma_engines);
14937 num_vls = sdma_engines;
14938 ppd->vls_supported = sdma_engines;
14939 ppd->vls_operational = ppd->vls_supported;
14940 }
14941
14942 /*
14943 * Convert the ns parameter to the 64 * cclocks used in the CSR.
14944 * Limit the max if larger than the field holds. If timeout is
14945 * non-zero, then the calculated field will be at least 1.
14946 *
14947 * Must be after icode is set up - the cclock rate depends
14948 * on knowing the hardware being used.
14949 */
14950 dd->rcv_intr_timeout_csr = ns_to_cclock(dd, rcv_intr_timeout) / 64;
14951 if (dd->rcv_intr_timeout_csr >
14952 RCV_AVAIL_TIME_OUT_TIME_OUT_RELOAD_MASK)
14953 dd->rcv_intr_timeout_csr =
14954 RCV_AVAIL_TIME_OUT_TIME_OUT_RELOAD_MASK;
14955 else if (dd->rcv_intr_timeout_csr == 0 && rcv_intr_timeout)
14956 dd->rcv_intr_timeout_csr = 1;
14957
14958 /* needs to be done before we look for the peer device */
14959 read_guid(dd);
14960
14961 /* set up shared ASIC data with peer device */
14962 ret = init_asic_data(dd);
14963 if (ret)
14964 goto bail_cleanup;
14965
14966 /* obtain chip sizes, reset chip CSRs */
14967 ret = init_chip(dd);
14968 if (ret)
14969 goto bail_cleanup;
14970
14971 /* read in the PCIe link speed information */
14972 ret = pcie_speeds(dd);
14973 if (ret)
14974 goto bail_cleanup;
14975
14976 /* call before get_platform_config(), after init_chip_resources() */
14977 ret = eprom_init(dd);
14978 if (ret)
14979 goto bail_free_rcverr;
14980
14981 /* Needs to be called before hfi1_firmware_init */
14982 get_platform_config(dd);
14983
14984 /* read in firmware */
14985 ret = hfi1_firmware_init(dd);
14986 if (ret)
14987 goto bail_cleanup;
14988
14989 /*
14990 * In general, the PCIe Gen3 transition must occur after the
14991 * chip has been idled (so it won't initiate any PCIe transactions
14992 * e.g. an interrupt) and before the driver changes any registers
14993 * (the transition will reset the registers).
14994 *
14995 * In particular, place this call after:
14996 * - init_chip() - the chip will not initiate any PCIe transactions
14997 * - pcie_speeds() - reads the current link speed
14998 * - hfi1_firmware_init() - the needed firmware is ready to be
14999 * downloaded
15000 */
15001 ret = do_pcie_gen3_transition(dd);
15002 if (ret)
15003 goto bail_cleanup;
15004
15005 /*
15006 * This should probably occur in hfi1_pcie_init(), but historically
15007 * occurs after the do_pcie_gen3_transition() code.
15008 */
15009 tune_pcie_caps(dd);
15010
15011 /* start setting dd values and adjusting CSRs */
15012 init_early_variables(dd);
15013
15014 parse_platform_config(dd);
15015
15016 ret = obtain_boardname(dd);
15017 if (ret)
15018 goto bail_cleanup;
15019
15020 snprintf(dd->boardversion, BOARD_VERS_MAX,
15021 "ChipABI %u.%u, ChipRev %u.%u, SW Compat %llu\n",
15022 HFI1_CHIP_VERS_MAJ, HFI1_CHIP_VERS_MIN,
15023 (u32)dd->majrev,
15024 (u32)dd->minrev,
15025 (dd->revision >> CCE_REVISION_SW_SHIFT)
15026 & CCE_REVISION_SW_MASK);
15027
15028 ret = set_up_context_variables(dd);
15029 if (ret)
15030 goto bail_cleanup;
15031
15032 /* set initial RXE CSRs */
15033 ret = init_rxe(dd);
15034 if (ret)
15035 goto bail_cleanup;
15036
15037 /* set initial TXE CSRs */
15038 init_txe(dd);
15039 /* set initial non-RXE, non-TXE CSRs */
15040 init_other(dd);
15041 /* set up KDETH QP prefix in both RX and TX CSRs */
15042 init_kdeth_qp(dd);
15043
15044 ret = hfi1_dev_affinity_init(dd);
15045 if (ret)
15046 goto bail_cleanup;
15047
15048 /* send contexts must be set up before receive contexts */
15049 ret = init_send_contexts(dd);
15050 if (ret)
15051 goto bail_cleanup;
15052
15053 ret = hfi1_create_kctxts(dd);
15054 if (ret)
15055 goto bail_cleanup;
15056
15057 /*
15058 * Initialize aspm, to be done after gen3 transition and setting up
15059 * contexts and before enabling interrupts
15060 */
15061 aspm_init(dd);
15062
15063 ret = init_pervl_scs(dd);
15064 if (ret)
15065 goto bail_cleanup;
15066
15067 /* sdma init */
15068 for (i = 0; i < dd->num_pports; ++i) {
15069 ret = sdma_init(dd, i);
15070 if (ret)
15071 goto bail_cleanup;
15072 }
15073
15074 /* use contexts created by hfi1_create_kctxts */
15075 ret = set_up_interrupts(dd);
15076 if (ret)
15077 goto bail_cleanup;
15078
15079 ret = hfi1_comp_vectors_set_up(dd);
15080 if (ret)
15081 goto bail_clear_intr;
15082
15083 /* set up LCB access - must be after set_up_interrupts() */
15084 init_lcb_access(dd);
15085
15086 /*
15087 * Serial number is created from the base guid:
15088 * [27:24] = base guid [38:35]
15089 * [23: 0] = base guid [23: 0]
15090 */
15091 snprintf(dd->serial, SERIAL_MAX, "0x%08llx\n",
15092 (dd->base_guid & 0xFFFFFF) |
15093 ((dd->base_guid >> 11) & 0xF000000));
15094
15095 dd->oui1 = dd->base_guid >> 56 & 0xFF;
15096 dd->oui2 = dd->base_guid >> 48 & 0xFF;
15097 dd->oui3 = dd->base_guid >> 40 & 0xFF;
15098
15099 ret = load_firmware(dd); /* asymmetric with dispose_firmware() */
15100 if (ret)
15101 goto bail_clear_intr;
15102
15103 thermal_init(dd);
15104
15105 ret = init_cntrs(dd);
15106 if (ret)
15107 goto bail_clear_intr;
15108
15109 ret = init_rcverr(dd);
15110 if (ret)
15111 goto bail_free_cntrs;
15112
15113 init_completion(&dd->user_comp);
15114
15115 /* The user refcount starts with one to inidicate an active device */
15116 atomic_set(&dd->user_refcount, 1);
15117
15118 goto bail;
15119
15120 bail_free_rcverr:
15121 free_rcverr(dd);
15122 bail_free_cntrs:
15123 free_cntrs(dd);
15124 bail_clear_intr:
15125 hfi1_comp_vectors_clean_up(dd);
15126 msix_clean_up_interrupts(dd);
15127 bail_cleanup:
15128 hfi1_pcie_ddcleanup(dd);
15129 bail_free:
15130 hfi1_free_devdata(dd);
15131 bail:
15132 return ret;
15133 }
15134
delay_cycles(struct hfi1_pportdata * ppd,u32 desired_egress_rate,u32 dw_len)15135 static u16 delay_cycles(struct hfi1_pportdata *ppd, u32 desired_egress_rate,
15136 u32 dw_len)
15137 {
15138 u32 delta_cycles;
15139 u32 current_egress_rate = ppd->current_egress_rate;
15140 /* rates here are in units of 10^6 bits/sec */
15141
15142 if (desired_egress_rate == -1)
15143 return 0; /* shouldn't happen */
15144
15145 if (desired_egress_rate >= current_egress_rate)
15146 return 0; /* we can't help go faster, only slower */
15147
15148 delta_cycles = egress_cycles(dw_len * 4, desired_egress_rate) -
15149 egress_cycles(dw_len * 4, current_egress_rate);
15150
15151 return (u16)delta_cycles;
15152 }
15153
15154 /**
15155 * create_pbc - build a pbc for transmission
15156 * @flags: special case flags or-ed in built pbc
15157 * @srate: static rate
15158 * @vl: vl
15159 * @dwlen: dword length (header words + data words + pbc words)
15160 *
15161 * Create a PBC with the given flags, rate, VL, and length.
15162 *
15163 * NOTE: The PBC created will not insert any HCRC - all callers but one are
15164 * for verbs, which does not use this PSM feature. The lone other caller
15165 * is for the diagnostic interface which calls this if the user does not
15166 * supply their own PBC.
15167 */
create_pbc(struct hfi1_pportdata * ppd,u64 flags,int srate_mbs,u32 vl,u32 dw_len)15168 u64 create_pbc(struct hfi1_pportdata *ppd, u64 flags, int srate_mbs, u32 vl,
15169 u32 dw_len)
15170 {
15171 u64 pbc, delay = 0;
15172
15173 if (unlikely(srate_mbs))
15174 delay = delay_cycles(ppd, srate_mbs, dw_len);
15175
15176 pbc = flags
15177 | (delay << PBC_STATIC_RATE_CONTROL_COUNT_SHIFT)
15178 | ((u64)PBC_IHCRC_NONE << PBC_INSERT_HCRC_SHIFT)
15179 | (vl & PBC_VL_MASK) << PBC_VL_SHIFT
15180 | (dw_len & PBC_LENGTH_DWS_MASK)
15181 << PBC_LENGTH_DWS_SHIFT;
15182
15183 return pbc;
15184 }
15185
15186 #define SBUS_THERMAL 0x4f
15187 #define SBUS_THERM_MONITOR_MODE 0x1
15188
15189 #define THERM_FAILURE(dev, ret, reason) \
15190 dd_dev_err((dd), \
15191 "Thermal sensor initialization failed: %s (%d)\n", \
15192 (reason), (ret))
15193
15194 /*
15195 * Initialize the thermal sensor.
15196 *
15197 * After initialization, enable polling of thermal sensor through
15198 * SBus interface. In order for this to work, the SBus Master
15199 * firmware has to be loaded due to the fact that the HW polling
15200 * logic uses SBus interrupts, which are not supported with
15201 * default firmware. Otherwise, no data will be returned through
15202 * the ASIC_STS_THERM CSR.
15203 */
thermal_init(struct hfi1_devdata * dd)15204 static int thermal_init(struct hfi1_devdata *dd)
15205 {
15206 int ret = 0;
15207
15208 if (dd->icode != ICODE_RTL_SILICON ||
15209 check_chip_resource(dd, CR_THERM_INIT, NULL))
15210 return ret;
15211
15212 ret = acquire_chip_resource(dd, CR_SBUS, SBUS_TIMEOUT);
15213 if (ret) {
15214 THERM_FAILURE(dd, ret, "Acquire SBus");
15215 return ret;
15216 }
15217
15218 dd_dev_info(dd, "Initializing thermal sensor\n");
15219 /* Disable polling of thermal readings */
15220 write_csr(dd, ASIC_CFG_THERM_POLL_EN, 0x0);
15221 msleep(100);
15222 /* Thermal Sensor Initialization */
15223 /* Step 1: Reset the Thermal SBus Receiver */
15224 ret = sbus_request_slow(dd, SBUS_THERMAL, 0x0,
15225 RESET_SBUS_RECEIVER, 0);
15226 if (ret) {
15227 THERM_FAILURE(dd, ret, "Bus Reset");
15228 goto done;
15229 }
15230 /* Step 2: Set Reset bit in Thermal block */
15231 ret = sbus_request_slow(dd, SBUS_THERMAL, 0x0,
15232 WRITE_SBUS_RECEIVER, 0x1);
15233 if (ret) {
15234 THERM_FAILURE(dd, ret, "Therm Block Reset");
15235 goto done;
15236 }
15237 /* Step 3: Write clock divider value (100MHz -> 2MHz) */
15238 ret = sbus_request_slow(dd, SBUS_THERMAL, 0x1,
15239 WRITE_SBUS_RECEIVER, 0x32);
15240 if (ret) {
15241 THERM_FAILURE(dd, ret, "Write Clock Div");
15242 goto done;
15243 }
15244 /* Step 4: Select temperature mode */
15245 ret = sbus_request_slow(dd, SBUS_THERMAL, 0x3,
15246 WRITE_SBUS_RECEIVER,
15247 SBUS_THERM_MONITOR_MODE);
15248 if (ret) {
15249 THERM_FAILURE(dd, ret, "Write Mode Sel");
15250 goto done;
15251 }
15252 /* Step 5: De-assert block reset and start conversion */
15253 ret = sbus_request_slow(dd, SBUS_THERMAL, 0x0,
15254 WRITE_SBUS_RECEIVER, 0x2);
15255 if (ret) {
15256 THERM_FAILURE(dd, ret, "Write Reset Deassert");
15257 goto done;
15258 }
15259 /* Step 5.1: Wait for first conversion (21.5ms per spec) */
15260 msleep(22);
15261
15262 /* Enable polling of thermal readings */
15263 write_csr(dd, ASIC_CFG_THERM_POLL_EN, 0x1);
15264
15265 /* Set initialized flag */
15266 ret = acquire_chip_resource(dd, CR_THERM_INIT, 0);
15267 if (ret)
15268 THERM_FAILURE(dd, ret, "Unable to set thermal init flag");
15269
15270 done:
15271 release_chip_resource(dd, CR_SBUS);
15272 return ret;
15273 }
15274
handle_temp_err(struct hfi1_devdata * dd)15275 static void handle_temp_err(struct hfi1_devdata *dd)
15276 {
15277 struct hfi1_pportdata *ppd = &dd->pport[0];
15278 /*
15279 * Thermal Critical Interrupt
15280 * Put the device into forced freeze mode, take link down to
15281 * offline, and put DC into reset.
15282 */
15283 dd_dev_emerg(dd,
15284 "Critical temperature reached! Forcing device into freeze mode!\n");
15285 dd->flags |= HFI1_FORCED_FREEZE;
15286 start_freeze_handling(ppd, FREEZE_SELF | FREEZE_ABORT);
15287 /*
15288 * Shut DC down as much and as quickly as possible.
15289 *
15290 * Step 1: Take the link down to OFFLINE. This will cause the
15291 * 8051 to put the Serdes in reset. However, we don't want to
15292 * go through the entire link state machine since we want to
15293 * shutdown ASAP. Furthermore, this is not a graceful shutdown
15294 * but rather an attempt to save the chip.
15295 * Code below is almost the same as quiet_serdes() but avoids
15296 * all the extra work and the sleeps.
15297 */
15298 ppd->driver_link_ready = 0;
15299 ppd->link_enabled = 0;
15300 set_physical_link_state(dd, (OPA_LINKDOWN_REASON_SMA_DISABLED << 8) |
15301 PLS_OFFLINE);
15302 /*
15303 * Step 2: Shutdown LCB and 8051
15304 * After shutdown, do not restore DC_CFG_RESET value.
15305 */
15306 dc_shutdown(dd);
15307 }
15308