1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <linux/delay.h>
36#include "cxgb4.h"
37#include "t4_regs.h"
38#include "t4_values.h"
39#include "t4fw_api.h"
40#include "t4fw_version.h"
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57static int t4_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
58 int polarity, int attempts, int delay, u32 *valp)
59{
60 while (1) {
61 u32 val = t4_read_reg(adapter, reg);
62
63 if (!!(val & mask) == polarity) {
64 if (valp)
65 *valp = val;
66 return 0;
67 }
68 if (--attempts == 0)
69 return -EAGAIN;
70 if (delay)
71 udelay(delay);
72 }
73}
74
75static inline int t4_wait_op_done(struct adapter *adapter, int reg, u32 mask,
76 int polarity, int attempts, int delay)
77{
78 return t4_wait_op_done_val(adapter, reg, mask, polarity, attempts,
79 delay, NULL);
80}
81
82
83
84
85
86
87
88
89
90
91
92void t4_set_reg_field(struct adapter *adapter, unsigned int addr, u32 mask,
93 u32 val)
94{
95 u32 v = t4_read_reg(adapter, addr) & ~mask;
96
97 t4_write_reg(adapter, addr, v | val);
98 (void) t4_read_reg(adapter, addr);
99}
100
101
102
103
104
105
106
107
108
109
110
111
112
113void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
114 unsigned int data_reg, u32 *vals,
115 unsigned int nregs, unsigned int start_idx)
116{
117 while (nregs--) {
118 t4_write_reg(adap, addr_reg, start_idx);
119 *vals++ = t4_read_reg(adap, data_reg);
120 start_idx++;
121 }
122}
123
124
125
126
127
128
129
130
131
132
133
134
135
136void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
137 unsigned int data_reg, const u32 *vals,
138 unsigned int nregs, unsigned int start_idx)
139{
140 while (nregs--) {
141 t4_write_reg(adap, addr_reg, start_idx++);
142 t4_write_reg(adap, data_reg, *vals++);
143 }
144}
145
146
147
148
149
150
151
152void t4_hw_pci_read_cfg4(struct adapter *adap, int reg, u32 *val)
153{
154 u32 req = FUNCTION_V(adap->pf) | REGISTER_V(reg);
155
156 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
157 req |= ENABLE_F;
158 else
159 req |= T6_ENABLE_F;
160
161 if (is_t4(adap->params.chip))
162 req |= LOCALCFG_F;
163
164 t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, req);
165 *val = t4_read_reg(adap, PCIE_CFG_SPACE_DATA_A);
166
167
168
169
170
171
172 t4_write_reg(adap, PCIE_CFG_SPACE_REQ_A, 0);
173}
174
175
176
177
178
179
180
181
182
183static void t4_report_fw_error(struct adapter *adap)
184{
185 static const char *const reason[] = {
186 "Crash",
187 "During Device Preparation",
188 "During Device Configuration",
189 "During Device Initialization",
190 "Unexpected Event",
191 "Insufficient Airflow",
192 "Device Shutdown",
193 "Reserved",
194 };
195 u32 pcie_fw;
196
197 pcie_fw = t4_read_reg(adap, PCIE_FW_A);
198 if (pcie_fw & PCIE_FW_ERR_F) {
199 dev_err(adap->pdev_dev, "Firmware reports adapter error: %s\n",
200 reason[PCIE_FW_EVAL_G(pcie_fw)]);
201 adap->flags &= ~FW_OK;
202 }
203}
204
205
206
207
208static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit,
209 u32 mbox_addr)
210{
211 for ( ; nflit; nflit--, mbox_addr += 8)
212 *rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr));
213}
214
215
216
217
218static void fw_asrt(struct adapter *adap, u32 mbox_addr)
219{
220 struct fw_debug_cmd asrt;
221
222 get_mbox_rpl(adap, (__be64 *)&asrt, sizeof(asrt) / 8, mbox_addr);
223 dev_alert(adap->pdev_dev,
224 "FW assertion at %.16s:%u, val0 %#x, val1 %#x\n",
225 asrt.u.assert.filename_0_7, be32_to_cpu(asrt.u.assert.line),
226 be32_to_cpu(asrt.u.assert.x), be32_to_cpu(asrt.u.assert.y));
227}
228
229
230
231
232
233
234
235
236
237static void t4_record_mbox(struct adapter *adapter,
238 const __be64 *cmd, unsigned int size,
239 int access, int execute)
240{
241 struct mbox_cmd_log *log = adapter->mbox_log;
242 struct mbox_cmd *entry;
243 int i;
244
245 entry = mbox_cmd_log_entry(log, log->cursor++);
246 if (log->cursor == log->size)
247 log->cursor = 0;
248
249 for (i = 0; i < size / 8; i++)
250 entry->cmd[i] = be64_to_cpu(cmd[i]);
251 while (i < MBOX_LEN / 8)
252 entry->cmd[i++] = 0;
253 entry->timestamp = jiffies;
254 entry->seqno = log->seqno++;
255 entry->access = access;
256 entry->execute = execute;
257}
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
283 int size, void *rpl, bool sleep_ok, int timeout)
284{
285 static const int delay[] = {
286 1, 1, 3, 5, 10, 10, 20, 50, 100, 200
287 };
288
289 struct mbox_list entry;
290 u16 access = 0;
291 u16 execute = 0;
292 u32 v;
293 u64 res;
294 int i, ms, delay_idx, ret;
295 const __be64 *p = cmd;
296 u32 data_reg = PF_REG(mbox, CIM_PF_MAILBOX_DATA_A);
297 u32 ctl_reg = PF_REG(mbox, CIM_PF_MAILBOX_CTRL_A);
298 __be64 cmd_rpl[MBOX_LEN / 8];
299 u32 pcie_fw;
300
301 if ((size & 15) || size > MBOX_LEN)
302 return -EINVAL;
303
304
305
306
307
308 if (adap->pdev->error_state != pci_channel_io_normal)
309 return -EIO;
310
311
312 if (timeout < 0) {
313 sleep_ok = false;
314 timeout = -timeout;
315 }
316
317
318
319
320
321
322 spin_lock_bh(&adap->mbox_lock);
323 list_add_tail(&entry.list, &adap->mlist.list);
324 spin_unlock_bh(&adap->mbox_lock);
325
326 delay_idx = 0;
327 ms = delay[0];
328
329 for (i = 0; ; i += ms) {
330
331
332
333
334
335 pcie_fw = t4_read_reg(adap, PCIE_FW_A);
336 if (i > FW_CMD_MAX_TIMEOUT || (pcie_fw & PCIE_FW_ERR_F)) {
337 spin_lock_bh(&adap->mbox_lock);
338 list_del(&entry.list);
339 spin_unlock_bh(&adap->mbox_lock);
340 ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -EBUSY;
341 t4_record_mbox(adap, cmd, size, access, ret);
342 return ret;
343 }
344
345
346
347
348 if (list_first_entry(&adap->mlist.list, struct mbox_list,
349 list) == &entry)
350 break;
351
352
353 if (sleep_ok) {
354 ms = delay[delay_idx];
355 if (delay_idx < ARRAY_SIZE(delay) - 1)
356 delay_idx++;
357 msleep(ms);
358 } else {
359 mdelay(ms);
360 }
361 }
362
363
364
365
366 v = MBOWNER_G(t4_read_reg(adap, ctl_reg));
367 for (i = 0; v == MBOX_OWNER_NONE && i < 3; i++)
368 v = MBOWNER_G(t4_read_reg(adap, ctl_reg));
369 if (v != MBOX_OWNER_DRV) {
370 spin_lock_bh(&adap->mbox_lock);
371 list_del(&entry.list);
372 spin_unlock_bh(&adap->mbox_lock);
373 ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT;
374 t4_record_mbox(adap, cmd, size, access, ret);
375 return ret;
376 }
377
378
379 t4_record_mbox(adap, cmd, size, access, 0);
380 for (i = 0; i < size; i += 8)
381 t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++));
382
383 t4_write_reg(adap, ctl_reg, MBMSGVALID_F | MBOWNER_V(MBOX_OWNER_FW));
384 t4_read_reg(adap, ctl_reg);
385
386 delay_idx = 0;
387 ms = delay[0];
388
389 for (i = 0;
390 !((pcie_fw = t4_read_reg(adap, PCIE_FW_A)) & PCIE_FW_ERR_F) &&
391 i < timeout;
392 i += ms) {
393 if (sleep_ok) {
394 ms = delay[delay_idx];
395 if (delay_idx < ARRAY_SIZE(delay) - 1)
396 delay_idx++;
397 msleep(ms);
398 } else
399 mdelay(ms);
400
401 v = t4_read_reg(adap, ctl_reg);
402 if (MBOWNER_G(v) == MBOX_OWNER_DRV) {
403 if (!(v & MBMSGVALID_F)) {
404 t4_write_reg(adap, ctl_reg, 0);
405 continue;
406 }
407
408 get_mbox_rpl(adap, cmd_rpl, MBOX_LEN / 8, data_reg);
409 res = be64_to_cpu(cmd_rpl[0]);
410
411 if (FW_CMD_OP_G(res >> 32) == FW_DEBUG_CMD) {
412 fw_asrt(adap, data_reg);
413 res = FW_CMD_RETVAL_V(EIO);
414 } else if (rpl) {
415 memcpy(rpl, cmd_rpl, size);
416 }
417
418 t4_write_reg(adap, ctl_reg, 0);
419
420 execute = i + ms;
421 t4_record_mbox(adap, cmd_rpl,
422 MBOX_LEN, access, execute);
423 spin_lock_bh(&adap->mbox_lock);
424 list_del(&entry.list);
425 spin_unlock_bh(&adap->mbox_lock);
426 return -FW_CMD_RETVAL_G((int)res);
427 }
428 }
429
430 ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -ETIMEDOUT;
431 t4_record_mbox(adap, cmd, size, access, ret);
432 dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n",
433 *(const u8 *)cmd, mbox);
434 t4_report_fw_error(adap);
435 spin_lock_bh(&adap->mbox_lock);
436 list_del(&entry.list);
437 spin_unlock_bh(&adap->mbox_lock);
438 t4_fatal_err(adap);
439 return ret;
440}
441
442int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size,
443 void *rpl, bool sleep_ok)
444{
445 return t4_wr_mbox_meat_timeout(adap, mbox, cmd, size, rpl, sleep_ok,
446 FW_CMD_MAX_TIMEOUT);
447}
448
449static int t4_edc_err_read(struct adapter *adap, int idx)
450{
451 u32 edc_ecc_err_addr_reg;
452 u32 rdata_reg;
453
454 if (is_t4(adap->params.chip)) {
455 CH_WARN(adap, "%s: T4 NOT supported.\n", __func__);
456 return 0;
457 }
458 if (idx != 0 && idx != 1) {
459 CH_WARN(adap, "%s: idx %d NOT supported.\n", __func__, idx);
460 return 0;
461 }
462
463 edc_ecc_err_addr_reg = EDC_T5_REG(EDC_H_ECC_ERR_ADDR_A, idx);
464 rdata_reg = EDC_T5_REG(EDC_H_BIST_STATUS_RDATA_A, idx);
465
466 CH_WARN(adap,
467 "edc%d err addr 0x%x: 0x%x.\n",
468 idx, edc_ecc_err_addr_reg,
469 t4_read_reg(adap, edc_ecc_err_addr_reg));
470 CH_WARN(adap,
471 "bist: 0x%x, status %llx %llx %llx %llx %llx %llx %llx %llx %llx.\n",
472 rdata_reg,
473 (unsigned long long)t4_read_reg64(adap, rdata_reg),
474 (unsigned long long)t4_read_reg64(adap, rdata_reg + 8),
475 (unsigned long long)t4_read_reg64(adap, rdata_reg + 16),
476 (unsigned long long)t4_read_reg64(adap, rdata_reg + 24),
477 (unsigned long long)t4_read_reg64(adap, rdata_reg + 32),
478 (unsigned long long)t4_read_reg64(adap, rdata_reg + 40),
479 (unsigned long long)t4_read_reg64(adap, rdata_reg + 48),
480 (unsigned long long)t4_read_reg64(adap, rdata_reg + 56),
481 (unsigned long long)t4_read_reg64(adap, rdata_reg + 64));
482
483 return 0;
484}
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr,
504 u32 len, void *hbuf, int dir)
505{
506 u32 pos, offset, resid, memoffset;
507 u32 edc_size, mc_size, win_pf, mem_reg, mem_aperture, mem_base;
508 u32 *buf;
509
510
511
512 if (addr & 0x3 || (uintptr_t)hbuf & 0x3)
513 return -EINVAL;
514 buf = (u32 *)hbuf;
515
516
517
518
519
520
521 resid = len & 0x3;
522 len -= resid;
523
524
525
526
527
528
529
530
531 edc_size = EDRAM0_SIZE_G(t4_read_reg(adap, MA_EDRAM0_BAR_A));
532 if (mtype == MEM_HMA) {
533 memoffset = 2 * (edc_size * 1024 * 1024);
534 } else if (mtype != MEM_MC1) {
535 memoffset = (mtype * (edc_size * 1024 * 1024));
536 } else {
537 mc_size = EXT_MEM0_SIZE_G(t4_read_reg(adap,
538 MA_EXT_MEMORY0_BAR_A));
539 memoffset = (MEM_MC0 * edc_size + mc_size) * 1024 * 1024;
540 }
541
542
543 addr = addr + memoffset;
544
545
546
547
548
549
550
551
552
553 mem_reg = t4_read_reg(adap,
554 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A,
555 win));
556 mem_aperture = 1 << (WINDOW_G(mem_reg) + WINDOW_SHIFT_X);
557 mem_base = PCIEOFST_G(mem_reg) << PCIEOFST_SHIFT_X;
558 if (is_t4(adap->params.chip))
559 mem_base -= adap->t4_bar0;
560 win_pf = is_t4(adap->params.chip) ? 0 : PFNUM_V(adap->pf);
561
562
563
564
565 pos = addr & ~(mem_aperture-1);
566 offset = addr - pos;
567
568
569
570
571
572 t4_write_reg(adap,
573 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win),
574 pos | win_pf);
575 t4_read_reg(adap,
576 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A, win));
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612 while (len > 0) {
613 if (dir == T4_MEMORY_READ)
614 *buf++ = le32_to_cpu((__force __le32)t4_read_reg(adap,
615 mem_base + offset));
616 else
617 t4_write_reg(adap, mem_base + offset,
618 (__force u32)cpu_to_le32(*buf++));
619 offset += sizeof(__be32);
620 len -= sizeof(__be32);
621
622
623
624
625
626
627
628 if (offset == mem_aperture) {
629 pos += mem_aperture;
630 offset = 0;
631 t4_write_reg(adap,
632 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A,
633 win), pos | win_pf);
634 t4_read_reg(adap,
635 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_OFFSET_A,
636 win));
637 }
638 }
639
640
641
642
643
644
645 if (resid) {
646 union {
647 u32 word;
648 char byte[4];
649 } last;
650 unsigned char *bp;
651 int i;
652
653 if (dir == T4_MEMORY_READ) {
654 last.word = le32_to_cpu(
655 (__force __le32)t4_read_reg(adap,
656 mem_base + offset));
657 for (bp = (unsigned char *)buf, i = resid; i < 4; i++)
658 bp[i] = last.byte[i];
659 } else {
660 last.word = *buf;
661 for (i = resid; i < 4; i++)
662 last.byte[i] = 0;
663 t4_write_reg(adap, mem_base + offset,
664 (__force u32)cpu_to_le32(last.word));
665 }
666 }
667
668 return 0;
669}
670
671
672
673
674
675
676u32 t4_read_pcie_cfg4(struct adapter *adap, int reg)
677{
678 u32 val, ldst_addrspace;
679
680
681
682
683 struct fw_ldst_cmd ldst_cmd;
684 int ret;
685
686 memset(&ldst_cmd, 0, sizeof(ldst_cmd));
687 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FUNC_PCIE);
688 ldst_cmd.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
689 FW_CMD_REQUEST_F |
690 FW_CMD_READ_F |
691 ldst_addrspace);
692 ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd));
693 ldst_cmd.u.pcie.select_naccess = FW_LDST_CMD_NACCESS_V(1);
694 ldst_cmd.u.pcie.ctrl_to_fn =
695 (FW_LDST_CMD_LC_F | FW_LDST_CMD_FN_V(adap->pf));
696 ldst_cmd.u.pcie.r = reg;
697
698
699
700
701 ret = t4_wr_mbox(adap, adap->mbox, &ldst_cmd, sizeof(ldst_cmd),
702 &ldst_cmd);
703 if (ret == 0)
704 val = be32_to_cpu(ldst_cmd.u.pcie.data[0]);
705 else
706
707
708
709 t4_hw_pci_read_cfg4(adap, reg, &val);
710 return val;
711}
712
713
714
715
716
717static u32 t4_get_window(struct adapter *adap, u32 pci_base, u64 pci_mask,
718 u32 memwin_base)
719{
720 u32 ret;
721
722 if (is_t4(adap->params.chip)) {
723 u32 bar0;
724
725
726
727
728
729
730
731
732
733
734 bar0 = t4_read_pcie_cfg4(adap, pci_base);
735 bar0 &= pci_mask;
736 adap->t4_bar0 = bar0;
737
738 ret = bar0 + memwin_base;
739 } else {
740
741 ret = memwin_base;
742 }
743 return ret;
744}
745
746
747u32 t4_get_util_window(struct adapter *adap)
748{
749 return t4_get_window(adap, PCI_BASE_ADDRESS_0,
750 PCI_BASE_ADDRESS_MEM_MASK, MEMWIN0_BASE);
751}
752
753
754
755
756
757void t4_setup_memwin(struct adapter *adap, u32 memwin_base, u32 window)
758{
759 t4_write_reg(adap,
760 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window),
761 memwin_base | BIR_V(0) |
762 WINDOW_V(ilog2(MEMWIN0_APERTURE) - WINDOW_SHIFT_X));
763 t4_read_reg(adap,
764 PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN_A, window));
765}
766
767
768
769
770
771
772
773unsigned int t4_get_regs_len(struct adapter *adapter)
774{
775 unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
776
777 switch (chip_version) {
778 case CHELSIO_T4:
779 return T4_REGMAP_SIZE;
780
781 case CHELSIO_T5:
782 case CHELSIO_T6:
783 return T5_REGMAP_SIZE;
784 }
785
786 dev_err(adapter->pdev_dev,
787 "Unsupported chip version %d\n", chip_version);
788 return 0;
789}
790
791
792
793
794
795
796
797
798
799
800
801void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
802{
803 static const unsigned int t4_reg_ranges[] = {
804 0x1008, 0x1108,
805 0x1180, 0x1184,
806 0x1190, 0x1194,
807 0x11a0, 0x11a4,
808 0x11b0, 0x11b4,
809 0x11fc, 0x123c,
810 0x1300, 0x173c,
811 0x1800, 0x18fc,
812 0x3000, 0x30d8,
813 0x30e0, 0x30e4,
814 0x30ec, 0x5910,
815 0x5920, 0x5924,
816 0x5960, 0x5960,
817 0x5968, 0x5968,
818 0x5970, 0x5970,
819 0x5978, 0x5978,
820 0x5980, 0x5980,
821 0x5988, 0x5988,
822 0x5990, 0x5990,
823 0x5998, 0x5998,
824 0x59a0, 0x59d4,
825 0x5a00, 0x5ae0,
826 0x5ae8, 0x5ae8,
827 0x5af0, 0x5af0,
828 0x5af8, 0x5af8,
829 0x6000, 0x6098,
830 0x6100, 0x6150,
831 0x6200, 0x6208,
832 0x6240, 0x6248,
833 0x6280, 0x62b0,
834 0x62c0, 0x6338,
835 0x6370, 0x638c,
836 0x6400, 0x643c,
837 0x6500, 0x6524,
838 0x6a00, 0x6a04,
839 0x6a14, 0x6a38,
840 0x6a60, 0x6a70,
841 0x6a78, 0x6a78,
842 0x6b00, 0x6b0c,
843 0x6b1c, 0x6b84,
844 0x6bf0, 0x6bf8,
845 0x6c00, 0x6c0c,
846 0x6c1c, 0x6c84,
847 0x6cf0, 0x6cf8,
848 0x6d00, 0x6d0c,
849 0x6d1c, 0x6d84,
850 0x6df0, 0x6df8,
851 0x6e00, 0x6e0c,
852 0x6e1c, 0x6e84,
853 0x6ef0, 0x6ef8,
854 0x6f00, 0x6f0c,
855 0x6f1c, 0x6f84,
856 0x6ff0, 0x6ff8,
857 0x7000, 0x700c,
858 0x701c, 0x7084,
859 0x70f0, 0x70f8,
860 0x7100, 0x710c,
861 0x711c, 0x7184,
862 0x71f0, 0x71f8,
863 0x7200, 0x720c,
864 0x721c, 0x7284,
865 0x72f0, 0x72f8,
866 0x7300, 0x730c,
867 0x731c, 0x7384,
868 0x73f0, 0x73f8,
869 0x7400, 0x7450,
870 0x7500, 0x7530,
871 0x7600, 0x760c,
872 0x7614, 0x761c,
873 0x7680, 0x76cc,
874 0x7700, 0x7798,
875 0x77c0, 0x77fc,
876 0x7900, 0x79fc,
877 0x7b00, 0x7b58,
878 0x7b60, 0x7b84,
879 0x7b8c, 0x7c38,
880 0x7d00, 0x7d38,
881 0x7d40, 0x7d80,
882 0x7d8c, 0x7ddc,
883 0x7de4, 0x7e04,
884 0x7e10, 0x7e1c,
885 0x7e24, 0x7e38,
886 0x7e40, 0x7e44,
887 0x7e4c, 0x7e78,
888 0x7e80, 0x7ea4,
889 0x7eac, 0x7edc,
890 0x7ee8, 0x7efc,
891 0x8dc0, 0x8e04,
892 0x8e10, 0x8e1c,
893 0x8e30, 0x8e78,
894 0x8ea0, 0x8eb8,
895 0x8ec0, 0x8f6c,
896 0x8fc0, 0x9008,
897 0x9010, 0x9058,
898 0x9060, 0x9060,
899 0x9068, 0x9074,
900 0x90fc, 0x90fc,
901 0x9400, 0x9408,
902 0x9410, 0x9458,
903 0x9600, 0x9600,
904 0x9608, 0x9638,
905 0x9640, 0x96bc,
906 0x9800, 0x9808,
907 0x9820, 0x983c,
908 0x9850, 0x9864,
909 0x9c00, 0x9c6c,
910 0x9c80, 0x9cec,
911 0x9d00, 0x9d6c,
912 0x9d80, 0x9dec,
913 0x9e00, 0x9e6c,
914 0x9e80, 0x9eec,
915 0x9f00, 0x9f6c,
916 0x9f80, 0x9fec,
917 0xd004, 0xd004,
918 0xd010, 0xd03c,
919 0xdfc0, 0xdfe0,
920 0xe000, 0xea7c,
921 0xf000, 0x11110,
922 0x11118, 0x11190,
923 0x19040, 0x1906c,
924 0x19078, 0x19080,
925 0x1908c, 0x190e4,
926 0x190f0, 0x190f8,
927 0x19100, 0x19110,
928 0x19120, 0x19124,
929 0x19150, 0x19194,
930 0x1919c, 0x191b0,
931 0x191d0, 0x191e8,
932 0x19238, 0x1924c,
933 0x193f8, 0x1943c,
934 0x1944c, 0x19474,
935 0x19490, 0x194e0,
936 0x194f0, 0x194f8,
937 0x19800, 0x19c08,
938 0x19c10, 0x19c90,
939 0x19ca0, 0x19ce4,
940 0x19cf0, 0x19d40,
941 0x19d50, 0x19d94,
942 0x19da0, 0x19de8,
943 0x19df0, 0x19e40,
944 0x19e50, 0x19e90,
945 0x19ea0, 0x19f4c,
946 0x1a000, 0x1a004,
947 0x1a010, 0x1a06c,
948 0x1a0b0, 0x1a0e4,
949 0x1a0ec, 0x1a0f4,
950 0x1a100, 0x1a108,
951 0x1a114, 0x1a120,
952 0x1a128, 0x1a130,
953 0x1a138, 0x1a138,
954 0x1a190, 0x1a1c4,
955 0x1a1fc, 0x1a1fc,
956 0x1e040, 0x1e04c,
957 0x1e284, 0x1e28c,
958 0x1e2c0, 0x1e2c0,
959 0x1e2e0, 0x1e2e0,
960 0x1e300, 0x1e384,
961 0x1e3c0, 0x1e3c8,
962 0x1e440, 0x1e44c,
963 0x1e684, 0x1e68c,
964 0x1e6c0, 0x1e6c0,
965 0x1e6e0, 0x1e6e0,
966 0x1e700, 0x1e784,
967 0x1e7c0, 0x1e7c8,
968 0x1e840, 0x1e84c,
969 0x1ea84, 0x1ea8c,
970 0x1eac0, 0x1eac0,
971 0x1eae0, 0x1eae0,
972 0x1eb00, 0x1eb84,
973 0x1ebc0, 0x1ebc8,
974 0x1ec40, 0x1ec4c,
975 0x1ee84, 0x1ee8c,
976 0x1eec0, 0x1eec0,
977 0x1eee0, 0x1eee0,
978 0x1ef00, 0x1ef84,
979 0x1efc0, 0x1efc8,
980 0x1f040, 0x1f04c,
981 0x1f284, 0x1f28c,
982 0x1f2c0, 0x1f2c0,
983 0x1f2e0, 0x1f2e0,
984 0x1f300, 0x1f384,
985 0x1f3c0, 0x1f3c8,
986 0x1f440, 0x1f44c,
987 0x1f684, 0x1f68c,
988 0x1f6c0, 0x1f6c0,
989 0x1f6e0, 0x1f6e0,
990 0x1f700, 0x1f784,
991 0x1f7c0, 0x1f7c8,
992 0x1f840, 0x1f84c,
993 0x1fa84, 0x1fa8c,
994 0x1fac0, 0x1fac0,
995 0x1fae0, 0x1fae0,
996 0x1fb00, 0x1fb84,
997 0x1fbc0, 0x1fbc8,
998 0x1fc40, 0x1fc4c,
999 0x1fe84, 0x1fe8c,
1000 0x1fec0, 0x1fec0,
1001 0x1fee0, 0x1fee0,
1002 0x1ff00, 0x1ff84,
1003 0x1ffc0, 0x1ffc8,
1004 0x20000, 0x2002c,
1005 0x20100, 0x2013c,
1006 0x20190, 0x201a0,
1007 0x201a8, 0x201b8,
1008 0x201c4, 0x201c8,
1009 0x20200, 0x20318,
1010 0x20400, 0x204b4,
1011 0x204c0, 0x20528,
1012 0x20540, 0x20614,
1013 0x21000, 0x21040,
1014 0x2104c, 0x21060,
1015 0x210c0, 0x210ec,
1016 0x21200, 0x21268,
1017 0x21270, 0x21284,
1018 0x212fc, 0x21388,
1019 0x21400, 0x21404,
1020 0x21500, 0x21500,
1021 0x21510, 0x21518,
1022 0x2152c, 0x21530,
1023 0x2153c, 0x2153c,
1024 0x21550, 0x21554,
1025 0x21600, 0x21600,
1026 0x21608, 0x2161c,
1027 0x21624, 0x21628,
1028 0x21630, 0x21634,
1029 0x2163c, 0x2163c,
1030 0x21700, 0x2171c,
1031 0x21780, 0x2178c,
1032 0x21800, 0x21818,
1033 0x21820, 0x21828,
1034 0x21830, 0x21848,
1035 0x21850, 0x21854,
1036 0x21860, 0x21868,
1037 0x21870, 0x21870,
1038 0x21878, 0x21898,
1039 0x218a0, 0x218a8,
1040 0x218b0, 0x218c8,
1041 0x218d0, 0x218d4,
1042 0x218e0, 0x218e8,
1043 0x218f0, 0x218f0,
1044 0x218f8, 0x21a18,
1045 0x21a20, 0x21a28,
1046 0x21a30, 0x21a48,
1047 0x21a50, 0x21a54,
1048 0x21a60, 0x21a68,
1049 0x21a70, 0x21a70,
1050 0x21a78, 0x21a98,
1051 0x21aa0, 0x21aa8,
1052 0x21ab0, 0x21ac8,
1053 0x21ad0, 0x21ad4,
1054 0x21ae0, 0x21ae8,
1055 0x21af0, 0x21af0,
1056 0x21af8, 0x21c18,
1057 0x21c20, 0x21c20,
1058 0x21c28, 0x21c30,
1059 0x21c38, 0x21c38,
1060 0x21c80, 0x21c98,
1061 0x21ca0, 0x21ca8,
1062 0x21cb0, 0x21cc8,
1063 0x21cd0, 0x21cd4,
1064 0x21ce0, 0x21ce8,
1065 0x21cf0, 0x21cf0,
1066 0x21cf8, 0x21d7c,
1067 0x21e00, 0x21e04,
1068 0x22000, 0x2202c,
1069 0x22100, 0x2213c,
1070 0x22190, 0x221a0,
1071 0x221a8, 0x221b8,
1072 0x221c4, 0x221c8,
1073 0x22200, 0x22318,
1074 0x22400, 0x224b4,
1075 0x224c0, 0x22528,
1076 0x22540, 0x22614,
1077 0x23000, 0x23040,
1078 0x2304c, 0x23060,
1079 0x230c0, 0x230ec,
1080 0x23200, 0x23268,
1081 0x23270, 0x23284,
1082 0x232fc, 0x23388,
1083 0x23400, 0x23404,
1084 0x23500, 0x23500,
1085 0x23510, 0x23518,
1086 0x2352c, 0x23530,
1087 0x2353c, 0x2353c,
1088 0x23550, 0x23554,
1089 0x23600, 0x23600,
1090 0x23608, 0x2361c,
1091 0x23624, 0x23628,
1092 0x23630, 0x23634,
1093 0x2363c, 0x2363c,
1094 0x23700, 0x2371c,
1095 0x23780, 0x2378c,
1096 0x23800, 0x23818,
1097 0x23820, 0x23828,
1098 0x23830, 0x23848,
1099 0x23850, 0x23854,
1100 0x23860, 0x23868,
1101 0x23870, 0x23870,
1102 0x23878, 0x23898,
1103 0x238a0, 0x238a8,
1104 0x238b0, 0x238c8,
1105 0x238d0, 0x238d4,
1106 0x238e0, 0x238e8,
1107 0x238f0, 0x238f0,
1108 0x238f8, 0x23a18,
1109 0x23a20, 0x23a28,
1110 0x23a30, 0x23a48,
1111 0x23a50, 0x23a54,
1112 0x23a60, 0x23a68,
1113 0x23a70, 0x23a70,
1114 0x23a78, 0x23a98,
1115 0x23aa0, 0x23aa8,
1116 0x23ab0, 0x23ac8,
1117 0x23ad0, 0x23ad4,
1118 0x23ae0, 0x23ae8,
1119 0x23af0, 0x23af0,
1120 0x23af8, 0x23c18,
1121 0x23c20, 0x23c20,
1122 0x23c28, 0x23c30,
1123 0x23c38, 0x23c38,
1124 0x23c80, 0x23c98,
1125 0x23ca0, 0x23ca8,
1126 0x23cb0, 0x23cc8,
1127 0x23cd0, 0x23cd4,
1128 0x23ce0, 0x23ce8,
1129 0x23cf0, 0x23cf0,
1130 0x23cf8, 0x23d7c,
1131 0x23e00, 0x23e04,
1132 0x24000, 0x2402c,
1133 0x24100, 0x2413c,
1134 0x24190, 0x241a0,
1135 0x241a8, 0x241b8,
1136 0x241c4, 0x241c8,
1137 0x24200, 0x24318,
1138 0x24400, 0x244b4,
1139 0x244c0, 0x24528,
1140 0x24540, 0x24614,
1141 0x25000, 0x25040,
1142 0x2504c, 0x25060,
1143 0x250c0, 0x250ec,
1144 0x25200, 0x25268,
1145 0x25270, 0x25284,
1146 0x252fc, 0x25388,
1147 0x25400, 0x25404,
1148 0x25500, 0x25500,
1149 0x25510, 0x25518,
1150 0x2552c, 0x25530,
1151 0x2553c, 0x2553c,
1152 0x25550, 0x25554,
1153 0x25600, 0x25600,
1154 0x25608, 0x2561c,
1155 0x25624, 0x25628,
1156 0x25630, 0x25634,
1157 0x2563c, 0x2563c,
1158 0x25700, 0x2571c,
1159 0x25780, 0x2578c,
1160 0x25800, 0x25818,
1161 0x25820, 0x25828,
1162 0x25830, 0x25848,
1163 0x25850, 0x25854,
1164 0x25860, 0x25868,
1165 0x25870, 0x25870,
1166 0x25878, 0x25898,
1167 0x258a0, 0x258a8,
1168 0x258b0, 0x258c8,
1169 0x258d0, 0x258d4,
1170 0x258e0, 0x258e8,
1171 0x258f0, 0x258f0,
1172 0x258f8, 0x25a18,
1173 0x25a20, 0x25a28,
1174 0x25a30, 0x25a48,
1175 0x25a50, 0x25a54,
1176 0x25a60, 0x25a68,
1177 0x25a70, 0x25a70,
1178 0x25a78, 0x25a98,
1179 0x25aa0, 0x25aa8,
1180 0x25ab0, 0x25ac8,
1181 0x25ad0, 0x25ad4,
1182 0x25ae0, 0x25ae8,
1183 0x25af0, 0x25af0,
1184 0x25af8, 0x25c18,
1185 0x25c20, 0x25c20,
1186 0x25c28, 0x25c30,
1187 0x25c38, 0x25c38,
1188 0x25c80, 0x25c98,
1189 0x25ca0, 0x25ca8,
1190 0x25cb0, 0x25cc8,
1191 0x25cd0, 0x25cd4,
1192 0x25ce0, 0x25ce8,
1193 0x25cf0, 0x25cf0,
1194 0x25cf8, 0x25d7c,
1195 0x25e00, 0x25e04,
1196 0x26000, 0x2602c,
1197 0x26100, 0x2613c,
1198 0x26190, 0x261a0,
1199 0x261a8, 0x261b8,
1200 0x261c4, 0x261c8,
1201 0x26200, 0x26318,
1202 0x26400, 0x264b4,
1203 0x264c0, 0x26528,
1204 0x26540, 0x26614,
1205 0x27000, 0x27040,
1206 0x2704c, 0x27060,
1207 0x270c0, 0x270ec,
1208 0x27200, 0x27268,
1209 0x27270, 0x27284,
1210 0x272fc, 0x27388,
1211 0x27400, 0x27404,
1212 0x27500, 0x27500,
1213 0x27510, 0x27518,
1214 0x2752c, 0x27530,
1215 0x2753c, 0x2753c,
1216 0x27550, 0x27554,
1217 0x27600, 0x27600,
1218 0x27608, 0x2761c,
1219 0x27624, 0x27628,
1220 0x27630, 0x27634,
1221 0x2763c, 0x2763c,
1222 0x27700, 0x2771c,
1223 0x27780, 0x2778c,
1224 0x27800, 0x27818,
1225 0x27820, 0x27828,
1226 0x27830, 0x27848,
1227 0x27850, 0x27854,
1228 0x27860, 0x27868,
1229 0x27870, 0x27870,
1230 0x27878, 0x27898,
1231 0x278a0, 0x278a8,
1232 0x278b0, 0x278c8,
1233 0x278d0, 0x278d4,
1234 0x278e0, 0x278e8,
1235 0x278f0, 0x278f0,
1236 0x278f8, 0x27a18,
1237 0x27a20, 0x27a28,
1238 0x27a30, 0x27a48,
1239 0x27a50, 0x27a54,
1240 0x27a60, 0x27a68,
1241 0x27a70, 0x27a70,
1242 0x27a78, 0x27a98,
1243 0x27aa0, 0x27aa8,
1244 0x27ab0, 0x27ac8,
1245 0x27ad0, 0x27ad4,
1246 0x27ae0, 0x27ae8,
1247 0x27af0, 0x27af0,
1248 0x27af8, 0x27c18,
1249 0x27c20, 0x27c20,
1250 0x27c28, 0x27c30,
1251 0x27c38, 0x27c38,
1252 0x27c80, 0x27c98,
1253 0x27ca0, 0x27ca8,
1254 0x27cb0, 0x27cc8,
1255 0x27cd0, 0x27cd4,
1256 0x27ce0, 0x27ce8,
1257 0x27cf0, 0x27cf0,
1258 0x27cf8, 0x27d7c,
1259 0x27e00, 0x27e04,
1260 };
1261
1262 static const unsigned int t5_reg_ranges[] = {
1263 0x1008, 0x10c0,
1264 0x10cc, 0x10f8,
1265 0x1100, 0x1100,
1266 0x110c, 0x1148,
1267 0x1180, 0x1184,
1268 0x1190, 0x1194,
1269 0x11a0, 0x11a4,
1270 0x11b0, 0x11b4,
1271 0x11fc, 0x123c,
1272 0x1280, 0x173c,
1273 0x1800, 0x18fc,
1274 0x3000, 0x3028,
1275 0x3060, 0x30b0,
1276 0x30b8, 0x30d8,
1277 0x30e0, 0x30fc,
1278 0x3140, 0x357c,
1279 0x35a8, 0x35cc,
1280 0x35ec, 0x35ec,
1281 0x3600, 0x5624,
1282 0x56cc, 0x56ec,
1283 0x56f4, 0x5720,
1284 0x5728, 0x575c,
1285 0x580c, 0x5814,
1286 0x5890, 0x589c,
1287 0x58a4, 0x58ac,
1288 0x58b8, 0x58bc,
1289 0x5940, 0x59c8,
1290 0x59d0, 0x59dc,
1291 0x59fc, 0x5a18,
1292 0x5a60, 0x5a70,
1293 0x5a80, 0x5a9c,
1294 0x5b94, 0x5bfc,
1295 0x6000, 0x6020,
1296 0x6028, 0x6040,
1297 0x6058, 0x609c,
1298 0x60a8, 0x614c,
1299 0x7700, 0x7798,
1300 0x77c0, 0x78fc,
1301 0x7b00, 0x7b58,
1302 0x7b60, 0x7b84,
1303 0x7b8c, 0x7c54,
1304 0x7d00, 0x7d38,
1305 0x7d40, 0x7d80,
1306 0x7d8c, 0x7ddc,
1307 0x7de4, 0x7e04,
1308 0x7e10, 0x7e1c,
1309 0x7e24, 0x7e38,
1310 0x7e40, 0x7e44,
1311 0x7e4c, 0x7e78,
1312 0x7e80, 0x7edc,
1313 0x7ee8, 0x7efc,
1314 0x8dc0, 0x8de0,
1315 0x8df8, 0x8e04,
1316 0x8e10, 0x8e84,
1317 0x8ea0, 0x8f84,
1318 0x8fc0, 0x9058,
1319 0x9060, 0x9060,
1320 0x9068, 0x90f8,
1321 0x9400, 0x9408,
1322 0x9410, 0x9470,
1323 0x9600, 0x9600,
1324 0x9608, 0x9638,
1325 0x9640, 0x96f4,
1326 0x9800, 0x9808,
1327 0x9820, 0x983c,
1328 0x9850, 0x9864,
1329 0x9c00, 0x9c6c,
1330 0x9c80, 0x9cec,
1331 0x9d00, 0x9d6c,
1332 0x9d80, 0x9dec,
1333 0x9e00, 0x9e6c,
1334 0x9e80, 0x9eec,
1335 0x9f00, 0x9f6c,
1336 0x9f80, 0xa020,
1337 0xd004, 0xd004,
1338 0xd010, 0xd03c,
1339 0xdfc0, 0xdfe0,
1340 0xe000, 0x1106c,
1341 0x11074, 0x11088,
1342 0x1109c, 0x1117c,
1343 0x11190, 0x11204,
1344 0x19040, 0x1906c,
1345 0x19078, 0x19080,
1346 0x1908c, 0x190e8,
1347 0x190f0, 0x190f8,
1348 0x19100, 0x19110,
1349 0x19120, 0x19124,
1350 0x19150, 0x19194,
1351 0x1919c, 0x191b0,
1352 0x191d0, 0x191e8,
1353 0x19238, 0x19290,
1354 0x193f8, 0x19428,
1355 0x19430, 0x19444,
1356 0x1944c, 0x1946c,
1357 0x19474, 0x19474,
1358 0x19490, 0x194cc,
1359 0x194f0, 0x194f8,
1360 0x19c00, 0x19c08,
1361 0x19c10, 0x19c60,
1362 0x19c94, 0x19ce4,
1363 0x19cf0, 0x19d40,
1364 0x19d50, 0x19d94,
1365 0x19da0, 0x19de8,
1366 0x19df0, 0x19e10,
1367 0x19e50, 0x19e90,
1368 0x19ea0, 0x19f24,
1369 0x19f34, 0x19f34,
1370 0x19f40, 0x19f50,
1371 0x19f90, 0x19fb4,
1372 0x19fc4, 0x19fe4,
1373 0x1a000, 0x1a004,
1374 0x1a010, 0x1a06c,
1375 0x1a0b0, 0x1a0e4,
1376 0x1a0ec, 0x1a0f8,
1377 0x1a100, 0x1a108,
1378 0x1a114, 0x1a120,
1379 0x1a128, 0x1a130,
1380 0x1a138, 0x1a138,
1381 0x1a190, 0x1a1c4,
1382 0x1a1fc, 0x1a1fc,
1383 0x1e008, 0x1e00c,
1384 0x1e040, 0x1e044,
1385 0x1e04c, 0x1e04c,
1386 0x1e284, 0x1e290,
1387 0x1e2c0, 0x1e2c0,
1388 0x1e2e0, 0x1e2e0,
1389 0x1e300, 0x1e384,
1390 0x1e3c0, 0x1e3c8,
1391 0x1e408, 0x1e40c,
1392 0x1e440, 0x1e444,
1393 0x1e44c, 0x1e44c,
1394 0x1e684, 0x1e690,
1395 0x1e6c0, 0x1e6c0,
1396 0x1e6e0, 0x1e6e0,
1397 0x1e700, 0x1e784,
1398 0x1e7c0, 0x1e7c8,
1399 0x1e808, 0x1e80c,
1400 0x1e840, 0x1e844,
1401 0x1e84c, 0x1e84c,
1402 0x1ea84, 0x1ea90,
1403 0x1eac0, 0x1eac0,
1404 0x1eae0, 0x1eae0,
1405 0x1eb00, 0x1eb84,
1406 0x1ebc0, 0x1ebc8,
1407 0x1ec08, 0x1ec0c,
1408 0x1ec40, 0x1ec44,
1409 0x1ec4c, 0x1ec4c,
1410 0x1ee84, 0x1ee90,
1411 0x1eec0, 0x1eec0,
1412 0x1eee0, 0x1eee0,
1413 0x1ef00, 0x1ef84,
1414 0x1efc0, 0x1efc8,
1415 0x1f008, 0x1f00c,
1416 0x1f040, 0x1f044,
1417 0x1f04c, 0x1f04c,
1418 0x1f284, 0x1f290,
1419 0x1f2c0, 0x1f2c0,
1420 0x1f2e0, 0x1f2e0,
1421 0x1f300, 0x1f384,
1422 0x1f3c0, 0x1f3c8,
1423 0x1f408, 0x1f40c,
1424 0x1f440, 0x1f444,
1425 0x1f44c, 0x1f44c,
1426 0x1f684, 0x1f690,
1427 0x1f6c0, 0x1f6c0,
1428 0x1f6e0, 0x1f6e0,
1429 0x1f700, 0x1f784,
1430 0x1f7c0, 0x1f7c8,
1431 0x1f808, 0x1f80c,
1432 0x1f840, 0x1f844,
1433 0x1f84c, 0x1f84c,
1434 0x1fa84, 0x1fa90,
1435 0x1fac0, 0x1fac0,
1436 0x1fae0, 0x1fae0,
1437 0x1fb00, 0x1fb84,
1438 0x1fbc0, 0x1fbc8,
1439 0x1fc08, 0x1fc0c,
1440 0x1fc40, 0x1fc44,
1441 0x1fc4c, 0x1fc4c,
1442 0x1fe84, 0x1fe90,
1443 0x1fec0, 0x1fec0,
1444 0x1fee0, 0x1fee0,
1445 0x1ff00, 0x1ff84,
1446 0x1ffc0, 0x1ffc8,
1447 0x30000, 0x30030,
1448 0x30100, 0x30144,
1449 0x30190, 0x301a0,
1450 0x301a8, 0x301b8,
1451 0x301c4, 0x301c8,
1452 0x301d0, 0x301d0,
1453 0x30200, 0x30318,
1454 0x30400, 0x304b4,
1455 0x304c0, 0x3052c,
1456 0x30540, 0x3061c,
1457 0x30800, 0x30828,
1458 0x30834, 0x30834,
1459 0x308c0, 0x30908,
1460 0x30910, 0x309ac,
1461 0x30a00, 0x30a14,
1462 0x30a1c, 0x30a2c,
1463 0x30a44, 0x30a50,
1464 0x30a74, 0x30a74,
1465 0x30a7c, 0x30afc,
1466 0x30b08, 0x30c24,
1467 0x30d00, 0x30d00,
1468 0x30d08, 0x30d14,
1469 0x30d1c, 0x30d20,
1470 0x30d3c, 0x30d3c,
1471 0x30d48, 0x30d50,
1472 0x31200, 0x3120c,
1473 0x31220, 0x31220,
1474 0x31240, 0x31240,
1475 0x31600, 0x3160c,
1476 0x31a00, 0x31a1c,
1477 0x31e00, 0x31e20,
1478 0x31e38, 0x31e3c,
1479 0x31e80, 0x31e80,
1480 0x31e88, 0x31ea8,
1481 0x31eb0, 0x31eb4,
1482 0x31ec8, 0x31ed4,
1483 0x31fb8, 0x32004,
1484 0x32200, 0x32200,
1485 0x32208, 0x32240,
1486 0x32248, 0x32280,
1487 0x32288, 0x322c0,
1488 0x322c8, 0x322fc,
1489 0x32600, 0x32630,
1490 0x32a00, 0x32abc,
1491 0x32b00, 0x32b10,
1492 0x32b20, 0x32b30,
1493 0x32b40, 0x32b50,
1494 0x32b60, 0x32b70,
1495 0x33000, 0x33028,
1496 0x33030, 0x33048,
1497 0x33060, 0x33068,
1498 0x33070, 0x3309c,
1499 0x330f0, 0x33128,
1500 0x33130, 0x33148,
1501 0x33160, 0x33168,
1502 0x33170, 0x3319c,
1503 0x331f0, 0x33238,
1504 0x33240, 0x33240,
1505 0x33248, 0x33250,
1506 0x3325c, 0x33264,
1507 0x33270, 0x332b8,
1508 0x332c0, 0x332e4,
1509 0x332f8, 0x33338,
1510 0x33340, 0x33340,
1511 0x33348, 0x33350,
1512 0x3335c, 0x33364,
1513 0x33370, 0x333b8,
1514 0x333c0, 0x333e4,
1515 0x333f8, 0x33428,
1516 0x33430, 0x33448,
1517 0x33460, 0x33468,
1518 0x33470, 0x3349c,
1519 0x334f0, 0x33528,
1520 0x33530, 0x33548,
1521 0x33560, 0x33568,
1522 0x33570, 0x3359c,
1523 0x335f0, 0x33638,
1524 0x33640, 0x33640,
1525 0x33648, 0x33650,
1526 0x3365c, 0x33664,
1527 0x33670, 0x336b8,
1528 0x336c0, 0x336e4,
1529 0x336f8, 0x33738,
1530 0x33740, 0x33740,
1531 0x33748, 0x33750,
1532 0x3375c, 0x33764,
1533 0x33770, 0x337b8,
1534 0x337c0, 0x337e4,
1535 0x337f8, 0x337fc,
1536 0x33814, 0x33814,
1537 0x3382c, 0x3382c,
1538 0x33880, 0x3388c,
1539 0x338e8, 0x338ec,
1540 0x33900, 0x33928,
1541 0x33930, 0x33948,
1542 0x33960, 0x33968,
1543 0x33970, 0x3399c,
1544 0x339f0, 0x33a38,
1545 0x33a40, 0x33a40,
1546 0x33a48, 0x33a50,
1547 0x33a5c, 0x33a64,
1548 0x33a70, 0x33ab8,
1549 0x33ac0, 0x33ae4,
1550 0x33af8, 0x33b10,
1551 0x33b28, 0x33b28,
1552 0x33b3c, 0x33b50,
1553 0x33bf0, 0x33c10,
1554 0x33c28, 0x33c28,
1555 0x33c3c, 0x33c50,
1556 0x33cf0, 0x33cfc,
1557 0x34000, 0x34030,
1558 0x34100, 0x34144,
1559 0x34190, 0x341a0,
1560 0x341a8, 0x341b8,
1561 0x341c4, 0x341c8,
1562 0x341d0, 0x341d0,
1563 0x34200, 0x34318,
1564 0x34400, 0x344b4,
1565 0x344c0, 0x3452c,
1566 0x34540, 0x3461c,
1567 0x34800, 0x34828,
1568 0x34834, 0x34834,
1569 0x348c0, 0x34908,
1570 0x34910, 0x349ac,
1571 0x34a00, 0x34a14,
1572 0x34a1c, 0x34a2c,
1573 0x34a44, 0x34a50,
1574 0x34a74, 0x34a74,
1575 0x34a7c, 0x34afc,
1576 0x34b08, 0x34c24,
1577 0x34d00, 0x34d00,
1578 0x34d08, 0x34d14,
1579 0x34d1c, 0x34d20,
1580 0x34d3c, 0x34d3c,
1581 0x34d48, 0x34d50,
1582 0x35200, 0x3520c,
1583 0x35220, 0x35220,
1584 0x35240, 0x35240,
1585 0x35600, 0x3560c,
1586 0x35a00, 0x35a1c,
1587 0x35e00, 0x35e20,
1588 0x35e38, 0x35e3c,
1589 0x35e80, 0x35e80,
1590 0x35e88, 0x35ea8,
1591 0x35eb0, 0x35eb4,
1592 0x35ec8, 0x35ed4,
1593 0x35fb8, 0x36004,
1594 0x36200, 0x36200,
1595 0x36208, 0x36240,
1596 0x36248, 0x36280,
1597 0x36288, 0x362c0,
1598 0x362c8, 0x362fc,
1599 0x36600, 0x36630,
1600 0x36a00, 0x36abc,
1601 0x36b00, 0x36b10,
1602 0x36b20, 0x36b30,
1603 0x36b40, 0x36b50,
1604 0x36b60, 0x36b70,
1605 0x37000, 0x37028,
1606 0x37030, 0x37048,
1607 0x37060, 0x37068,
1608 0x37070, 0x3709c,
1609 0x370f0, 0x37128,
1610 0x37130, 0x37148,
1611 0x37160, 0x37168,
1612 0x37170, 0x3719c,
1613 0x371f0, 0x37238,
1614 0x37240, 0x37240,
1615 0x37248, 0x37250,
1616 0x3725c, 0x37264,
1617 0x37270, 0x372b8,
1618 0x372c0, 0x372e4,
1619 0x372f8, 0x37338,
1620 0x37340, 0x37340,
1621 0x37348, 0x37350,
1622 0x3735c, 0x37364,
1623 0x37370, 0x373b8,
1624 0x373c0, 0x373e4,
1625 0x373f8, 0x37428,
1626 0x37430, 0x37448,
1627 0x37460, 0x37468,
1628 0x37470, 0x3749c,
1629 0x374f0, 0x37528,
1630 0x37530, 0x37548,
1631 0x37560, 0x37568,
1632 0x37570, 0x3759c,
1633 0x375f0, 0x37638,
1634 0x37640, 0x37640,
1635 0x37648, 0x37650,
1636 0x3765c, 0x37664,
1637 0x37670, 0x376b8,
1638 0x376c0, 0x376e4,
1639 0x376f8, 0x37738,
1640 0x37740, 0x37740,
1641 0x37748, 0x37750,
1642 0x3775c, 0x37764,
1643 0x37770, 0x377b8,
1644 0x377c0, 0x377e4,
1645 0x377f8, 0x377fc,
1646 0x37814, 0x37814,
1647 0x3782c, 0x3782c,
1648 0x37880, 0x3788c,
1649 0x378e8, 0x378ec,
1650 0x37900, 0x37928,
1651 0x37930, 0x37948,
1652 0x37960, 0x37968,
1653 0x37970, 0x3799c,
1654 0x379f0, 0x37a38,
1655 0x37a40, 0x37a40,
1656 0x37a48, 0x37a50,
1657 0x37a5c, 0x37a64,
1658 0x37a70, 0x37ab8,
1659 0x37ac0, 0x37ae4,
1660 0x37af8, 0x37b10,
1661 0x37b28, 0x37b28,
1662 0x37b3c, 0x37b50,
1663 0x37bf0, 0x37c10,
1664 0x37c28, 0x37c28,
1665 0x37c3c, 0x37c50,
1666 0x37cf0, 0x37cfc,
1667 0x38000, 0x38030,
1668 0x38100, 0x38144,
1669 0x38190, 0x381a0,
1670 0x381a8, 0x381b8,
1671 0x381c4, 0x381c8,
1672 0x381d0, 0x381d0,
1673 0x38200, 0x38318,
1674 0x38400, 0x384b4,
1675 0x384c0, 0x3852c,
1676 0x38540, 0x3861c,
1677 0x38800, 0x38828,
1678 0x38834, 0x38834,
1679 0x388c0, 0x38908,
1680 0x38910, 0x389ac,
1681 0x38a00, 0x38a14,
1682 0x38a1c, 0x38a2c,
1683 0x38a44, 0x38a50,
1684 0x38a74, 0x38a74,
1685 0x38a7c, 0x38afc,
1686 0x38b08, 0x38c24,
1687 0x38d00, 0x38d00,
1688 0x38d08, 0x38d14,
1689 0x38d1c, 0x38d20,
1690 0x38d3c, 0x38d3c,
1691 0x38d48, 0x38d50,
1692 0x39200, 0x3920c,
1693 0x39220, 0x39220,
1694 0x39240, 0x39240,
1695 0x39600, 0x3960c,
1696 0x39a00, 0x39a1c,
1697 0x39e00, 0x39e20,
1698 0x39e38, 0x39e3c,
1699 0x39e80, 0x39e80,
1700 0x39e88, 0x39ea8,
1701 0x39eb0, 0x39eb4,
1702 0x39ec8, 0x39ed4,
1703 0x39fb8, 0x3a004,
1704 0x3a200, 0x3a200,
1705 0x3a208, 0x3a240,
1706 0x3a248, 0x3a280,
1707 0x3a288, 0x3a2c0,
1708 0x3a2c8, 0x3a2fc,
1709 0x3a600, 0x3a630,
1710 0x3aa00, 0x3aabc,
1711 0x3ab00, 0x3ab10,
1712 0x3ab20, 0x3ab30,
1713 0x3ab40, 0x3ab50,
1714 0x3ab60, 0x3ab70,
1715 0x3b000, 0x3b028,
1716 0x3b030, 0x3b048,
1717 0x3b060, 0x3b068,
1718 0x3b070, 0x3b09c,
1719 0x3b0f0, 0x3b128,
1720 0x3b130, 0x3b148,
1721 0x3b160, 0x3b168,
1722 0x3b170, 0x3b19c,
1723 0x3b1f0, 0x3b238,
1724 0x3b240, 0x3b240,
1725 0x3b248, 0x3b250,
1726 0x3b25c, 0x3b264,
1727 0x3b270, 0x3b2b8,
1728 0x3b2c0, 0x3b2e4,
1729 0x3b2f8, 0x3b338,
1730 0x3b340, 0x3b340,
1731 0x3b348, 0x3b350,
1732 0x3b35c, 0x3b364,
1733 0x3b370, 0x3b3b8,
1734 0x3b3c0, 0x3b3e4,
1735 0x3b3f8, 0x3b428,
1736 0x3b430, 0x3b448,
1737 0x3b460, 0x3b468,
1738 0x3b470, 0x3b49c,
1739 0x3b4f0, 0x3b528,
1740 0x3b530, 0x3b548,
1741 0x3b560, 0x3b568,
1742 0x3b570, 0x3b59c,
1743 0x3b5f0, 0x3b638,
1744 0x3b640, 0x3b640,
1745 0x3b648, 0x3b650,
1746 0x3b65c, 0x3b664,
1747 0x3b670, 0x3b6b8,
1748 0x3b6c0, 0x3b6e4,
1749 0x3b6f8, 0x3b738,
1750 0x3b740, 0x3b740,
1751 0x3b748, 0x3b750,
1752 0x3b75c, 0x3b764,
1753 0x3b770, 0x3b7b8,
1754 0x3b7c0, 0x3b7e4,
1755 0x3b7f8, 0x3b7fc,
1756 0x3b814, 0x3b814,
1757 0x3b82c, 0x3b82c,
1758 0x3b880, 0x3b88c,
1759 0x3b8e8, 0x3b8ec,
1760 0x3b900, 0x3b928,
1761 0x3b930, 0x3b948,
1762 0x3b960, 0x3b968,
1763 0x3b970, 0x3b99c,
1764 0x3b9f0, 0x3ba38,
1765 0x3ba40, 0x3ba40,
1766 0x3ba48, 0x3ba50,
1767 0x3ba5c, 0x3ba64,
1768 0x3ba70, 0x3bab8,
1769 0x3bac0, 0x3bae4,
1770 0x3baf8, 0x3bb10,
1771 0x3bb28, 0x3bb28,
1772 0x3bb3c, 0x3bb50,
1773 0x3bbf0, 0x3bc10,
1774 0x3bc28, 0x3bc28,
1775 0x3bc3c, 0x3bc50,
1776 0x3bcf0, 0x3bcfc,
1777 0x3c000, 0x3c030,
1778 0x3c100, 0x3c144,
1779 0x3c190, 0x3c1a0,
1780 0x3c1a8, 0x3c1b8,
1781 0x3c1c4, 0x3c1c8,
1782 0x3c1d0, 0x3c1d0,
1783 0x3c200, 0x3c318,
1784 0x3c400, 0x3c4b4,
1785 0x3c4c0, 0x3c52c,
1786 0x3c540, 0x3c61c,
1787 0x3c800, 0x3c828,
1788 0x3c834, 0x3c834,
1789 0x3c8c0, 0x3c908,
1790 0x3c910, 0x3c9ac,
1791 0x3ca00, 0x3ca14,
1792 0x3ca1c, 0x3ca2c,
1793 0x3ca44, 0x3ca50,
1794 0x3ca74, 0x3ca74,
1795 0x3ca7c, 0x3cafc,
1796 0x3cb08, 0x3cc24,
1797 0x3cd00, 0x3cd00,
1798 0x3cd08, 0x3cd14,
1799 0x3cd1c, 0x3cd20,
1800 0x3cd3c, 0x3cd3c,
1801 0x3cd48, 0x3cd50,
1802 0x3d200, 0x3d20c,
1803 0x3d220, 0x3d220,
1804 0x3d240, 0x3d240,
1805 0x3d600, 0x3d60c,
1806 0x3da00, 0x3da1c,
1807 0x3de00, 0x3de20,
1808 0x3de38, 0x3de3c,
1809 0x3de80, 0x3de80,
1810 0x3de88, 0x3dea8,
1811 0x3deb0, 0x3deb4,
1812 0x3dec8, 0x3ded4,
1813 0x3dfb8, 0x3e004,
1814 0x3e200, 0x3e200,
1815 0x3e208, 0x3e240,
1816 0x3e248, 0x3e280,
1817 0x3e288, 0x3e2c0,
1818 0x3e2c8, 0x3e2fc,
1819 0x3e600, 0x3e630,
1820 0x3ea00, 0x3eabc,
1821 0x3eb00, 0x3eb10,
1822 0x3eb20, 0x3eb30,
1823 0x3eb40, 0x3eb50,
1824 0x3eb60, 0x3eb70,
1825 0x3f000, 0x3f028,
1826 0x3f030, 0x3f048,
1827 0x3f060, 0x3f068,
1828 0x3f070, 0x3f09c,
1829 0x3f0f0, 0x3f128,
1830 0x3f130, 0x3f148,
1831 0x3f160, 0x3f168,
1832 0x3f170, 0x3f19c,
1833 0x3f1f0, 0x3f238,
1834 0x3f240, 0x3f240,
1835 0x3f248, 0x3f250,
1836 0x3f25c, 0x3f264,
1837 0x3f270, 0x3f2b8,
1838 0x3f2c0, 0x3f2e4,
1839 0x3f2f8, 0x3f338,
1840 0x3f340, 0x3f340,
1841 0x3f348, 0x3f350,
1842 0x3f35c, 0x3f364,
1843 0x3f370, 0x3f3b8,
1844 0x3f3c0, 0x3f3e4,
1845 0x3f3f8, 0x3f428,
1846 0x3f430, 0x3f448,
1847 0x3f460, 0x3f468,
1848 0x3f470, 0x3f49c,
1849 0x3f4f0, 0x3f528,
1850 0x3f530, 0x3f548,
1851 0x3f560, 0x3f568,
1852 0x3f570, 0x3f59c,
1853 0x3f5f0, 0x3f638,
1854 0x3f640, 0x3f640,
1855 0x3f648, 0x3f650,
1856 0x3f65c, 0x3f664,
1857 0x3f670, 0x3f6b8,
1858 0x3f6c0, 0x3f6e4,
1859 0x3f6f8, 0x3f738,
1860 0x3f740, 0x3f740,
1861 0x3f748, 0x3f750,
1862 0x3f75c, 0x3f764,
1863 0x3f770, 0x3f7b8,
1864 0x3f7c0, 0x3f7e4,
1865 0x3f7f8, 0x3f7fc,
1866 0x3f814, 0x3f814,
1867 0x3f82c, 0x3f82c,
1868 0x3f880, 0x3f88c,
1869 0x3f8e8, 0x3f8ec,
1870 0x3f900, 0x3f928,
1871 0x3f930, 0x3f948,
1872 0x3f960, 0x3f968,
1873 0x3f970, 0x3f99c,
1874 0x3f9f0, 0x3fa38,
1875 0x3fa40, 0x3fa40,
1876 0x3fa48, 0x3fa50,
1877 0x3fa5c, 0x3fa64,
1878 0x3fa70, 0x3fab8,
1879 0x3fac0, 0x3fae4,
1880 0x3faf8, 0x3fb10,
1881 0x3fb28, 0x3fb28,
1882 0x3fb3c, 0x3fb50,
1883 0x3fbf0, 0x3fc10,
1884 0x3fc28, 0x3fc28,
1885 0x3fc3c, 0x3fc50,
1886 0x3fcf0, 0x3fcfc,
1887 0x40000, 0x4000c,
1888 0x40040, 0x40050,
1889 0x40060, 0x40068,
1890 0x4007c, 0x4008c,
1891 0x40094, 0x400b0,
1892 0x400c0, 0x40144,
1893 0x40180, 0x4018c,
1894 0x40200, 0x40254,
1895 0x40260, 0x40264,
1896 0x40270, 0x40288,
1897 0x40290, 0x40298,
1898 0x402ac, 0x402c8,
1899 0x402d0, 0x402e0,
1900 0x402f0, 0x402f0,
1901 0x40300, 0x4033c,
1902 0x403f8, 0x403fc,
1903 0x41304, 0x413c4,
1904 0x41400, 0x4140c,
1905 0x41414, 0x4141c,
1906 0x41480, 0x414d0,
1907 0x44000, 0x44054,
1908 0x4405c, 0x44078,
1909 0x440c0, 0x44174,
1910 0x44180, 0x441ac,
1911 0x441b4, 0x441b8,
1912 0x441c0, 0x44254,
1913 0x4425c, 0x44278,
1914 0x442c0, 0x44374,
1915 0x44380, 0x443ac,
1916 0x443b4, 0x443b8,
1917 0x443c0, 0x44454,
1918 0x4445c, 0x44478,
1919 0x444c0, 0x44574,
1920 0x44580, 0x445ac,
1921 0x445b4, 0x445b8,
1922 0x445c0, 0x44654,
1923 0x4465c, 0x44678,
1924 0x446c0, 0x44774,
1925 0x44780, 0x447ac,
1926 0x447b4, 0x447b8,
1927 0x447c0, 0x44854,
1928 0x4485c, 0x44878,
1929 0x448c0, 0x44974,
1930 0x44980, 0x449ac,
1931 0x449b4, 0x449b8,
1932 0x449c0, 0x449fc,
1933 0x45000, 0x45004,
1934 0x45010, 0x45030,
1935 0x45040, 0x45060,
1936 0x45068, 0x45068,
1937 0x45080, 0x45084,
1938 0x450a0, 0x450b0,
1939 0x45200, 0x45204,
1940 0x45210, 0x45230,
1941 0x45240, 0x45260,
1942 0x45268, 0x45268,
1943 0x45280, 0x45284,
1944 0x452a0, 0x452b0,
1945 0x460c0, 0x460e4,
1946 0x47000, 0x4703c,
1947 0x47044, 0x4708c,
1948 0x47200, 0x47250,
1949 0x47400, 0x47408,
1950 0x47414, 0x47420,
1951 0x47600, 0x47618,
1952 0x47800, 0x47814,
1953 0x48000, 0x4800c,
1954 0x48040, 0x48050,
1955 0x48060, 0x48068,
1956 0x4807c, 0x4808c,
1957 0x48094, 0x480b0,
1958 0x480c0, 0x48144,
1959 0x48180, 0x4818c,
1960 0x48200, 0x48254,
1961 0x48260, 0x48264,
1962 0x48270, 0x48288,
1963 0x48290, 0x48298,
1964 0x482ac, 0x482c8,
1965 0x482d0, 0x482e0,
1966 0x482f0, 0x482f0,
1967 0x48300, 0x4833c,
1968 0x483f8, 0x483fc,
1969 0x49304, 0x493c4,
1970 0x49400, 0x4940c,
1971 0x49414, 0x4941c,
1972 0x49480, 0x494d0,
1973 0x4c000, 0x4c054,
1974 0x4c05c, 0x4c078,
1975 0x4c0c0, 0x4c174,
1976 0x4c180, 0x4c1ac,
1977 0x4c1b4, 0x4c1b8,
1978 0x4c1c0, 0x4c254,
1979 0x4c25c, 0x4c278,
1980 0x4c2c0, 0x4c374,
1981 0x4c380, 0x4c3ac,
1982 0x4c3b4, 0x4c3b8,
1983 0x4c3c0, 0x4c454,
1984 0x4c45c, 0x4c478,
1985 0x4c4c0, 0x4c574,
1986 0x4c580, 0x4c5ac,
1987 0x4c5b4, 0x4c5b8,
1988 0x4c5c0, 0x4c654,
1989 0x4c65c, 0x4c678,
1990 0x4c6c0, 0x4c774,
1991 0x4c780, 0x4c7ac,
1992 0x4c7b4, 0x4c7b8,
1993 0x4c7c0, 0x4c854,
1994 0x4c85c, 0x4c878,
1995 0x4c8c0, 0x4c974,
1996 0x4c980, 0x4c9ac,
1997 0x4c9b4, 0x4c9b8,
1998 0x4c9c0, 0x4c9fc,
1999 0x4d000, 0x4d004,
2000 0x4d010, 0x4d030,
2001 0x4d040, 0x4d060,
2002 0x4d068, 0x4d068,
2003 0x4d080, 0x4d084,
2004 0x4d0a0, 0x4d0b0,
2005 0x4d200, 0x4d204,
2006 0x4d210, 0x4d230,
2007 0x4d240, 0x4d260,
2008 0x4d268, 0x4d268,
2009 0x4d280, 0x4d284,
2010 0x4d2a0, 0x4d2b0,
2011 0x4e0c0, 0x4e0e4,
2012 0x4f000, 0x4f03c,
2013 0x4f044, 0x4f08c,
2014 0x4f200, 0x4f250,
2015 0x4f400, 0x4f408,
2016 0x4f414, 0x4f420,
2017 0x4f600, 0x4f618,
2018 0x4f800, 0x4f814,
2019 0x50000, 0x50084,
2020 0x50090, 0x500cc,
2021 0x50400, 0x50400,
2022 0x50800, 0x50884,
2023 0x50890, 0x508cc,
2024 0x50c00, 0x50c00,
2025 0x51000, 0x5101c,
2026 0x51300, 0x51308,
2027 };
2028
2029 static const unsigned int t6_reg_ranges[] = {
2030 0x1008, 0x101c,
2031 0x1024, 0x10a8,
2032 0x10b4, 0x10f8,
2033 0x1100, 0x1114,
2034 0x111c, 0x112c,
2035 0x1138, 0x113c,
2036 0x1144, 0x114c,
2037 0x1180, 0x1184,
2038 0x1190, 0x1194,
2039 0x11a0, 0x11a4,
2040 0x11b0, 0x11b4,
2041 0x11fc, 0x1274,
2042 0x1280, 0x133c,
2043 0x1800, 0x18fc,
2044 0x3000, 0x302c,
2045 0x3060, 0x30b0,
2046 0x30b8, 0x30d8,
2047 0x30e0, 0x30fc,
2048 0x3140, 0x357c,
2049 0x35a8, 0x35cc,
2050 0x35ec, 0x35ec,
2051 0x3600, 0x5624,
2052 0x56cc, 0x56ec,
2053 0x56f4, 0x5720,
2054 0x5728, 0x575c,
2055 0x580c, 0x5814,
2056 0x5890, 0x589c,
2057 0x58a4, 0x58ac,
2058 0x58b8, 0x58bc,
2059 0x5940, 0x595c,
2060 0x5980, 0x598c,
2061 0x59b0, 0x59c8,
2062 0x59d0, 0x59dc,
2063 0x59fc, 0x5a18,
2064 0x5a60, 0x5a6c,
2065 0x5a80, 0x5a8c,
2066 0x5a94, 0x5a9c,
2067 0x5b94, 0x5bfc,
2068 0x5c10, 0x5e48,
2069 0x5e50, 0x5e94,
2070 0x5ea0, 0x5eb0,
2071 0x5ec0, 0x5ec0,
2072 0x5ec8, 0x5ed0,
2073 0x5ee0, 0x5ee0,
2074 0x5ef0, 0x5ef0,
2075 0x5f00, 0x5f00,
2076 0x6000, 0x6020,
2077 0x6028, 0x6040,
2078 0x6058, 0x609c,
2079 0x60a8, 0x619c,
2080 0x7700, 0x7798,
2081 0x77c0, 0x7880,
2082 0x78cc, 0x78fc,
2083 0x7b00, 0x7b58,
2084 0x7b60, 0x7b84,
2085 0x7b8c, 0x7c54,
2086 0x7d00, 0x7d38,
2087 0x7d40, 0x7d84,
2088 0x7d8c, 0x7ddc,
2089 0x7de4, 0x7e04,
2090 0x7e10, 0x7e1c,
2091 0x7e24, 0x7e38,
2092 0x7e40, 0x7e44,
2093 0x7e4c, 0x7e78,
2094 0x7e80, 0x7edc,
2095 0x7ee8, 0x7efc,
2096 0x8dc0, 0x8de4,
2097 0x8df8, 0x8e04,
2098 0x8e10, 0x8e84,
2099 0x8ea0, 0x8f88,
2100 0x8fb8, 0x9058,
2101 0x9060, 0x9060,
2102 0x9068, 0x90f8,
2103 0x9100, 0x9124,
2104 0x9400, 0x9470,
2105 0x9600, 0x9600,
2106 0x9608, 0x9638,
2107 0x9640, 0x9704,
2108 0x9710, 0x971c,
2109 0x9800, 0x9808,
2110 0x9820, 0x983c,
2111 0x9850, 0x9864,
2112 0x9c00, 0x9c6c,
2113 0x9c80, 0x9cec,
2114 0x9d00, 0x9d6c,
2115 0x9d80, 0x9dec,
2116 0x9e00, 0x9e6c,
2117 0x9e80, 0x9eec,
2118 0x9f00, 0x9f6c,
2119 0x9f80, 0xa020,
2120 0xd004, 0xd03c,
2121 0xd100, 0xd118,
2122 0xd200, 0xd214,
2123 0xd220, 0xd234,
2124 0xd240, 0xd254,
2125 0xd260, 0xd274,
2126 0xd280, 0xd294,
2127 0xd2a0, 0xd2b4,
2128 0xd2c0, 0xd2d4,
2129 0xd2e0, 0xd2f4,
2130 0xd300, 0xd31c,
2131 0xdfc0, 0xdfe0,
2132 0xe000, 0xf008,
2133 0xf010, 0xf018,
2134 0xf020, 0xf028,
2135 0x11000, 0x11014,
2136 0x11048, 0x1106c,
2137 0x11074, 0x11088,
2138 0x11098, 0x11120,
2139 0x1112c, 0x1117c,
2140 0x11190, 0x112e0,
2141 0x11300, 0x1130c,
2142 0x12000, 0x1206c,
2143 0x19040, 0x1906c,
2144 0x19078, 0x19080,
2145 0x1908c, 0x190e8,
2146 0x190f0, 0x190f8,
2147 0x19100, 0x19110,
2148 0x19120, 0x19124,
2149 0x19150, 0x19194,
2150 0x1919c, 0x191b0,
2151 0x191d0, 0x191e8,
2152 0x19238, 0x19290,
2153 0x192a4, 0x192b0,
2154 0x192bc, 0x192bc,
2155 0x19348, 0x1934c,
2156 0x193f8, 0x19418,
2157 0x19420, 0x19428,
2158 0x19430, 0x19444,
2159 0x1944c, 0x1946c,
2160 0x19474, 0x19474,
2161 0x19490, 0x194cc,
2162 0x194f0, 0x194f8,
2163 0x19c00, 0x19c48,
2164 0x19c50, 0x19c80,
2165 0x19c94, 0x19c98,
2166 0x19ca0, 0x19cbc,
2167 0x19ce4, 0x19ce4,
2168 0x19cf0, 0x19cf8,
2169 0x19d00, 0x19d28,
2170 0x19d50, 0x19d78,
2171 0x19d94, 0x19d98,
2172 0x19da0, 0x19dc8,
2173 0x19df0, 0x19e10,
2174 0x19e50, 0x19e6c,
2175 0x19ea0, 0x19ebc,
2176 0x19ec4, 0x19ef4,
2177 0x19f04, 0x19f2c,
2178 0x19f34, 0x19f34,
2179 0x19f40, 0x19f50,
2180 0x19f90, 0x19fac,
2181 0x19fc4, 0x19fc8,
2182 0x19fd0, 0x19fe4,
2183 0x1a000, 0x1a004,
2184 0x1a010, 0x1a06c,
2185 0x1a0b0, 0x1a0e4,
2186 0x1a0ec, 0x1a0f8,
2187 0x1a100, 0x1a108,
2188 0x1a114, 0x1a120,
2189 0x1a128, 0x1a130,
2190 0x1a138, 0x1a138,
2191 0x1a190, 0x1a1c4,
2192 0x1a1fc, 0x1a1fc,
2193 0x1e008, 0x1e00c,
2194 0x1e040, 0x1e044,
2195 0x1e04c, 0x1e04c,
2196 0x1e284, 0x1e290,
2197 0x1e2c0, 0x1e2c0,
2198 0x1e2e0, 0x1e2e0,
2199 0x1e300, 0x1e384,
2200 0x1e3c0, 0x1e3c8,
2201 0x1e408, 0x1e40c,
2202 0x1e440, 0x1e444,
2203 0x1e44c, 0x1e44c,
2204 0x1e684, 0x1e690,
2205 0x1e6c0, 0x1e6c0,
2206 0x1e6e0, 0x1e6e0,
2207 0x1e700, 0x1e784,
2208 0x1e7c0, 0x1e7c8,
2209 0x1e808, 0x1e80c,
2210 0x1e840, 0x1e844,
2211 0x1e84c, 0x1e84c,
2212 0x1ea84, 0x1ea90,
2213 0x1eac0, 0x1eac0,
2214 0x1eae0, 0x1eae0,
2215 0x1eb00, 0x1eb84,
2216 0x1ebc0, 0x1ebc8,
2217 0x1ec08, 0x1ec0c,
2218 0x1ec40, 0x1ec44,
2219 0x1ec4c, 0x1ec4c,
2220 0x1ee84, 0x1ee90,
2221 0x1eec0, 0x1eec0,
2222 0x1eee0, 0x1eee0,
2223 0x1ef00, 0x1ef84,
2224 0x1efc0, 0x1efc8,
2225 0x1f008, 0x1f00c,
2226 0x1f040, 0x1f044,
2227 0x1f04c, 0x1f04c,
2228 0x1f284, 0x1f290,
2229 0x1f2c0, 0x1f2c0,
2230 0x1f2e0, 0x1f2e0,
2231 0x1f300, 0x1f384,
2232 0x1f3c0, 0x1f3c8,
2233 0x1f408, 0x1f40c,
2234 0x1f440, 0x1f444,
2235 0x1f44c, 0x1f44c,
2236 0x1f684, 0x1f690,
2237 0x1f6c0, 0x1f6c0,
2238 0x1f6e0, 0x1f6e0,
2239 0x1f700, 0x1f784,
2240 0x1f7c0, 0x1f7c8,
2241 0x1f808, 0x1f80c,
2242 0x1f840, 0x1f844,
2243 0x1f84c, 0x1f84c,
2244 0x1fa84, 0x1fa90,
2245 0x1fac0, 0x1fac0,
2246 0x1fae0, 0x1fae0,
2247 0x1fb00, 0x1fb84,
2248 0x1fbc0, 0x1fbc8,
2249 0x1fc08, 0x1fc0c,
2250 0x1fc40, 0x1fc44,
2251 0x1fc4c, 0x1fc4c,
2252 0x1fe84, 0x1fe90,
2253 0x1fec0, 0x1fec0,
2254 0x1fee0, 0x1fee0,
2255 0x1ff00, 0x1ff84,
2256 0x1ffc0, 0x1ffc8,
2257 0x30000, 0x30030,
2258 0x30100, 0x30168,
2259 0x30190, 0x301a0,
2260 0x301a8, 0x301b8,
2261 0x301c4, 0x301c8,
2262 0x301d0, 0x301d0,
2263 0x30200, 0x30320,
2264 0x30400, 0x304b4,
2265 0x304c0, 0x3052c,
2266 0x30540, 0x3061c,
2267 0x30800, 0x308a0,
2268 0x308c0, 0x30908,
2269 0x30910, 0x309b8,
2270 0x30a00, 0x30a04,
2271 0x30a0c, 0x30a14,
2272 0x30a1c, 0x30a2c,
2273 0x30a44, 0x30a50,
2274 0x30a74, 0x30a74,
2275 0x30a7c, 0x30afc,
2276 0x30b08, 0x30c24,
2277 0x30d00, 0x30d14,
2278 0x30d1c, 0x30d3c,
2279 0x30d44, 0x30d4c,
2280 0x30d54, 0x30d74,
2281 0x30d7c, 0x30d7c,
2282 0x30de0, 0x30de0,
2283 0x30e00, 0x30ed4,
2284 0x30f00, 0x30fa4,
2285 0x30fc0, 0x30fc4,
2286 0x31000, 0x31004,
2287 0x31080, 0x310fc,
2288 0x31208, 0x31220,
2289 0x3123c, 0x31254,
2290 0x31300, 0x31300,
2291 0x31308, 0x3131c,
2292 0x31338, 0x3133c,
2293 0x31380, 0x31380,
2294 0x31388, 0x313a8,
2295 0x313b4, 0x313b4,
2296 0x31400, 0x31420,
2297 0x31438, 0x3143c,
2298 0x31480, 0x31480,
2299 0x314a8, 0x314a8,
2300 0x314b0, 0x314b4,
2301 0x314c8, 0x314d4,
2302 0x31a40, 0x31a4c,
2303 0x31af0, 0x31b20,
2304 0x31b38, 0x31b3c,
2305 0x31b80, 0x31b80,
2306 0x31ba8, 0x31ba8,
2307 0x31bb0, 0x31bb4,
2308 0x31bc8, 0x31bd4,
2309 0x32140, 0x3218c,
2310 0x321f0, 0x321f4,
2311 0x32200, 0x32200,
2312 0x32218, 0x32218,
2313 0x32400, 0x32400,
2314 0x32408, 0x3241c,
2315 0x32618, 0x32620,
2316 0x32664, 0x32664,
2317 0x326a8, 0x326a8,
2318 0x326ec, 0x326ec,
2319 0x32a00, 0x32abc,
2320 0x32b00, 0x32b18,
2321 0x32b20, 0x32b38,
2322 0x32b40, 0x32b58,
2323 0x32b60, 0x32b78,
2324 0x32c00, 0x32c00,
2325 0x32c08, 0x32c3c,
2326 0x33000, 0x3302c,
2327 0x33034, 0x33050,
2328 0x33058, 0x33058,
2329 0x33060, 0x3308c,
2330 0x3309c, 0x330ac,
2331 0x330c0, 0x330c0,
2332 0x330c8, 0x330d0,
2333 0x330d8, 0x330e0,
2334 0x330ec, 0x3312c,
2335 0x33134, 0x33150,
2336 0x33158, 0x33158,
2337 0x33160, 0x3318c,
2338 0x3319c, 0x331ac,
2339 0x331c0, 0x331c0,
2340 0x331c8, 0x331d0,
2341 0x331d8, 0x331e0,
2342 0x331ec, 0x33290,
2343 0x33298, 0x332c4,
2344 0x332e4, 0x33390,
2345 0x33398, 0x333c4,
2346 0x333e4, 0x3342c,
2347 0x33434, 0x33450,
2348 0x33458, 0x33458,
2349 0x33460, 0x3348c,
2350 0x3349c, 0x334ac,
2351 0x334c0, 0x334c0,
2352 0x334c8, 0x334d0,
2353 0x334d8, 0x334e0,
2354 0x334ec, 0x3352c,
2355 0x33534, 0x33550,
2356 0x33558, 0x33558,
2357 0x33560, 0x3358c,
2358 0x3359c, 0x335ac,
2359 0x335c0, 0x335c0,
2360 0x335c8, 0x335d0,
2361 0x335d8, 0x335e0,
2362 0x335ec, 0x33690,
2363 0x33698, 0x336c4,
2364 0x336e4, 0x33790,
2365 0x33798, 0x337c4,
2366 0x337e4, 0x337fc,
2367 0x33814, 0x33814,
2368 0x33854, 0x33868,
2369 0x33880, 0x3388c,
2370 0x338c0, 0x338d0,
2371 0x338e8, 0x338ec,
2372 0x33900, 0x3392c,
2373 0x33934, 0x33950,
2374 0x33958, 0x33958,
2375 0x33960, 0x3398c,
2376 0x3399c, 0x339ac,
2377 0x339c0, 0x339c0,
2378 0x339c8, 0x339d0,
2379 0x339d8, 0x339e0,
2380 0x339ec, 0x33a90,
2381 0x33a98, 0x33ac4,
2382 0x33ae4, 0x33b10,
2383 0x33b24, 0x33b28,
2384 0x33b38, 0x33b50,
2385 0x33bf0, 0x33c10,
2386 0x33c24, 0x33c28,
2387 0x33c38, 0x33c50,
2388 0x33cf0, 0x33cfc,
2389 0x34000, 0x34030,
2390 0x34100, 0x34168,
2391 0x34190, 0x341a0,
2392 0x341a8, 0x341b8,
2393 0x341c4, 0x341c8,
2394 0x341d0, 0x341d0,
2395 0x34200, 0x34320,
2396 0x34400, 0x344b4,
2397 0x344c0, 0x3452c,
2398 0x34540, 0x3461c,
2399 0x34800, 0x348a0,
2400 0x348c0, 0x34908,
2401 0x34910, 0x349b8,
2402 0x34a00, 0x34a04,
2403 0x34a0c, 0x34a14,
2404 0x34a1c, 0x34a2c,
2405 0x34a44, 0x34a50,
2406 0x34a74, 0x34a74,
2407 0x34a7c, 0x34afc,
2408 0x34b08, 0x34c24,
2409 0x34d00, 0x34d14,
2410 0x34d1c, 0x34d3c,
2411 0x34d44, 0x34d4c,
2412 0x34d54, 0x34d74,
2413 0x34d7c, 0x34d7c,
2414 0x34de0, 0x34de0,
2415 0x34e00, 0x34ed4,
2416 0x34f00, 0x34fa4,
2417 0x34fc0, 0x34fc4,
2418 0x35000, 0x35004,
2419 0x35080, 0x350fc,
2420 0x35208, 0x35220,
2421 0x3523c, 0x35254,
2422 0x35300, 0x35300,
2423 0x35308, 0x3531c,
2424 0x35338, 0x3533c,
2425 0x35380, 0x35380,
2426 0x35388, 0x353a8,
2427 0x353b4, 0x353b4,
2428 0x35400, 0x35420,
2429 0x35438, 0x3543c,
2430 0x35480, 0x35480,
2431 0x354a8, 0x354a8,
2432 0x354b0, 0x354b4,
2433 0x354c8, 0x354d4,
2434 0x35a40, 0x35a4c,
2435 0x35af0, 0x35b20,
2436 0x35b38, 0x35b3c,
2437 0x35b80, 0x35b80,
2438 0x35ba8, 0x35ba8,
2439 0x35bb0, 0x35bb4,
2440 0x35bc8, 0x35bd4,
2441 0x36140, 0x3618c,
2442 0x361f0, 0x361f4,
2443 0x36200, 0x36200,
2444 0x36218, 0x36218,
2445 0x36400, 0x36400,
2446 0x36408, 0x3641c,
2447 0x36618, 0x36620,
2448 0x36664, 0x36664,
2449 0x366a8, 0x366a8,
2450 0x366ec, 0x366ec,
2451 0x36a00, 0x36abc,
2452 0x36b00, 0x36b18,
2453 0x36b20, 0x36b38,
2454 0x36b40, 0x36b58,
2455 0x36b60, 0x36b78,
2456 0x36c00, 0x36c00,
2457 0x36c08, 0x36c3c,
2458 0x37000, 0x3702c,
2459 0x37034, 0x37050,
2460 0x37058, 0x37058,
2461 0x37060, 0x3708c,
2462 0x3709c, 0x370ac,
2463 0x370c0, 0x370c0,
2464 0x370c8, 0x370d0,
2465 0x370d8, 0x370e0,
2466 0x370ec, 0x3712c,
2467 0x37134, 0x37150,
2468 0x37158, 0x37158,
2469 0x37160, 0x3718c,
2470 0x3719c, 0x371ac,
2471 0x371c0, 0x371c0,
2472 0x371c8, 0x371d0,
2473 0x371d8, 0x371e0,
2474 0x371ec, 0x37290,
2475 0x37298, 0x372c4,
2476 0x372e4, 0x37390,
2477 0x37398, 0x373c4,
2478 0x373e4, 0x3742c,
2479 0x37434, 0x37450,
2480 0x37458, 0x37458,
2481 0x37460, 0x3748c,
2482 0x3749c, 0x374ac,
2483 0x374c0, 0x374c0,
2484 0x374c8, 0x374d0,
2485 0x374d8, 0x374e0,
2486 0x374ec, 0x3752c,
2487 0x37534, 0x37550,
2488 0x37558, 0x37558,
2489 0x37560, 0x3758c,
2490 0x3759c, 0x375ac,
2491 0x375c0, 0x375c0,
2492 0x375c8, 0x375d0,
2493 0x375d8, 0x375e0,
2494 0x375ec, 0x37690,
2495 0x37698, 0x376c4,
2496 0x376e4, 0x37790,
2497 0x37798, 0x377c4,
2498 0x377e4, 0x377fc,
2499 0x37814, 0x37814,
2500 0x37854, 0x37868,
2501 0x37880, 0x3788c,
2502 0x378c0, 0x378d0,
2503 0x378e8, 0x378ec,
2504 0x37900, 0x3792c,
2505 0x37934, 0x37950,
2506 0x37958, 0x37958,
2507 0x37960, 0x3798c,
2508 0x3799c, 0x379ac,
2509 0x379c0, 0x379c0,
2510 0x379c8, 0x379d0,
2511 0x379d8, 0x379e0,
2512 0x379ec, 0x37a90,
2513 0x37a98, 0x37ac4,
2514 0x37ae4, 0x37b10,
2515 0x37b24, 0x37b28,
2516 0x37b38, 0x37b50,
2517 0x37bf0, 0x37c10,
2518 0x37c24, 0x37c28,
2519 0x37c38, 0x37c50,
2520 0x37cf0, 0x37cfc,
2521 0x40040, 0x40040,
2522 0x40080, 0x40084,
2523 0x40100, 0x40100,
2524 0x40140, 0x401bc,
2525 0x40200, 0x40214,
2526 0x40228, 0x40228,
2527 0x40240, 0x40258,
2528 0x40280, 0x40280,
2529 0x40304, 0x40304,
2530 0x40330, 0x4033c,
2531 0x41304, 0x413c8,
2532 0x413d0, 0x413dc,
2533 0x413f0, 0x413f0,
2534 0x41400, 0x4140c,
2535 0x41414, 0x4141c,
2536 0x41480, 0x414d0,
2537 0x44000, 0x4407c,
2538 0x440c0, 0x441ac,
2539 0x441b4, 0x4427c,
2540 0x442c0, 0x443ac,
2541 0x443b4, 0x4447c,
2542 0x444c0, 0x445ac,
2543 0x445b4, 0x4467c,
2544 0x446c0, 0x447ac,
2545 0x447b4, 0x4487c,
2546 0x448c0, 0x449ac,
2547 0x449b4, 0x44a7c,
2548 0x44ac0, 0x44bac,
2549 0x44bb4, 0x44c7c,
2550 0x44cc0, 0x44dac,
2551 0x44db4, 0x44e7c,
2552 0x44ec0, 0x44fac,
2553 0x44fb4, 0x4507c,
2554 0x450c0, 0x451ac,
2555 0x451b4, 0x451fc,
2556 0x45800, 0x45804,
2557 0x45810, 0x45830,
2558 0x45840, 0x45860,
2559 0x45868, 0x45868,
2560 0x45880, 0x45884,
2561 0x458a0, 0x458b0,
2562 0x45a00, 0x45a04,
2563 0x45a10, 0x45a30,
2564 0x45a40, 0x45a60,
2565 0x45a68, 0x45a68,
2566 0x45a80, 0x45a84,
2567 0x45aa0, 0x45ab0,
2568 0x460c0, 0x460e4,
2569 0x47000, 0x4703c,
2570 0x47044, 0x4708c,
2571 0x47200, 0x47250,
2572 0x47400, 0x47408,
2573 0x47414, 0x47420,
2574 0x47600, 0x47618,
2575 0x47800, 0x47814,
2576 0x47820, 0x4782c,
2577 0x50000, 0x50084,
2578 0x50090, 0x500cc,
2579 0x50300, 0x50384,
2580 0x50400, 0x50400,
2581 0x50800, 0x50884,
2582 0x50890, 0x508cc,
2583 0x50b00, 0x50b84,
2584 0x50c00, 0x50c00,
2585 0x51000, 0x51020,
2586 0x51028, 0x510b0,
2587 0x51300, 0x51324,
2588 };
2589
2590 u32 *buf_end = (u32 *)((char *)buf + buf_size);
2591 const unsigned int *reg_ranges;
2592 int reg_ranges_size, range;
2593 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
2594
2595
2596
2597
2598 switch (chip_version) {
2599 case CHELSIO_T4:
2600 reg_ranges = t4_reg_ranges;
2601 reg_ranges_size = ARRAY_SIZE(t4_reg_ranges);
2602 break;
2603
2604 case CHELSIO_T5:
2605 reg_ranges = t5_reg_ranges;
2606 reg_ranges_size = ARRAY_SIZE(t5_reg_ranges);
2607 break;
2608
2609 case CHELSIO_T6:
2610 reg_ranges = t6_reg_ranges;
2611 reg_ranges_size = ARRAY_SIZE(t6_reg_ranges);
2612 break;
2613
2614 default:
2615 dev_err(adap->pdev_dev,
2616 "Unsupported chip version %d\n", chip_version);
2617 return;
2618 }
2619
2620
2621
2622
2623 memset(buf, 0, buf_size);
2624 for (range = 0; range < reg_ranges_size; range += 2) {
2625 unsigned int reg = reg_ranges[range];
2626 unsigned int last_reg = reg_ranges[range + 1];
2627 u32 *bufp = (u32 *)((char *)buf + reg);
2628
2629
2630
2631
2632 while (reg <= last_reg && bufp < buf_end) {
2633 *bufp++ = t4_read_reg(adap, reg);
2634 reg += sizeof(u32);
2635 }
2636 }
2637}
2638
2639#define EEPROM_STAT_ADDR 0x7bfc
2640#define VPD_BASE 0x400
2641#define VPD_BASE_OLD 0
2642#define VPD_LEN 1024
2643#define CHELSIO_VPD_UNIQUE_ID 0x82
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662int t4_eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
2663{
2664 fn *= sz;
2665 if (phys_addr < 1024)
2666 return phys_addr + (31 << 10);
2667 if (phys_addr < 1024 + fn)
2668 return 31744 - fn + phys_addr - 1024;
2669 if (phys_addr < EEPROMSIZE)
2670 return phys_addr - 1024 - fn;
2671 return -EINVAL;
2672}
2673
2674
2675
2676
2677
2678
2679
2680
2681int t4_seeprom_wp(struct adapter *adapter, bool enable)
2682{
2683 unsigned int v = enable ? 0xc : 0;
2684 int ret = pci_write_vpd(adapter->pdev, EEPROM_STAT_ADDR, 4, &v);
2685 return ret < 0 ? ret : 0;
2686}
2687
2688
2689
2690
2691
2692
2693
2694
2695int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
2696{
2697 int i, ret = 0, addr;
2698 int ec, sn, pn, na;
2699 u8 *vpd, csum;
2700 unsigned int vpdr_len, kw_offset, id_len;
2701
2702 vpd = vmalloc(VPD_LEN);
2703 if (!vpd)
2704 return -ENOMEM;
2705
2706
2707
2708
2709 ret = pci_read_vpd(adapter->pdev, VPD_BASE, sizeof(u32), vpd);
2710 if (ret < 0)
2711 goto out;
2712
2713
2714
2715
2716
2717
2718
2719 addr = *vpd == CHELSIO_VPD_UNIQUE_ID ? VPD_BASE : VPD_BASE_OLD;
2720
2721 ret = pci_read_vpd(adapter->pdev, addr, VPD_LEN, vpd);
2722 if (ret < 0)
2723 goto out;
2724
2725 if (vpd[0] != PCI_VPD_LRDT_ID_STRING) {
2726 dev_err(adapter->pdev_dev, "missing VPD ID string\n");
2727 ret = -EINVAL;
2728 goto out;
2729 }
2730
2731 id_len = pci_vpd_lrdt_size(vpd);
2732 if (id_len > ID_LEN)
2733 id_len = ID_LEN;
2734
2735 i = pci_vpd_find_tag(vpd, 0, VPD_LEN, PCI_VPD_LRDT_RO_DATA);
2736 if (i < 0) {
2737 dev_err(adapter->pdev_dev, "missing VPD-R section\n");
2738 ret = -EINVAL;
2739 goto out;
2740 }
2741
2742 vpdr_len = pci_vpd_lrdt_size(&vpd[i]);
2743 kw_offset = i + PCI_VPD_LRDT_TAG_SIZE;
2744 if (vpdr_len + kw_offset > VPD_LEN) {
2745 dev_err(adapter->pdev_dev, "bad VPD-R length %u\n", vpdr_len);
2746 ret = -EINVAL;
2747 goto out;
2748 }
2749
2750#define FIND_VPD_KW(var, name) do { \
2751 var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
2752 if (var < 0) { \
2753 dev_err(adapter->pdev_dev, "missing VPD keyword " name "\n"); \
2754 ret = -EINVAL; \
2755 goto out; \
2756 } \
2757 var += PCI_VPD_INFO_FLD_HDR_SIZE; \
2758} while (0)
2759
2760 FIND_VPD_KW(i, "RV");
2761 for (csum = 0; i >= 0; i--)
2762 csum += vpd[i];
2763
2764 if (csum) {
2765 dev_err(adapter->pdev_dev,
2766 "corrupted VPD EEPROM, actual csum %u\n", csum);
2767 ret = -EINVAL;
2768 goto out;
2769 }
2770
2771 FIND_VPD_KW(ec, "EC");
2772 FIND_VPD_KW(sn, "SN");
2773 FIND_VPD_KW(pn, "PN");
2774 FIND_VPD_KW(na, "NA");
2775#undef FIND_VPD_KW
2776
2777 memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
2778 strim(p->id);
2779 memcpy(p->ec, vpd + ec, EC_LEN);
2780 strim(p->ec);
2781 i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
2782 memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
2783 strim(p->sn);
2784 i = pci_vpd_info_field_size(vpd + pn - PCI_VPD_INFO_FLD_HDR_SIZE);
2785 memcpy(p->pn, vpd + pn, min(i, PN_LEN));
2786 strim(p->pn);
2787 memcpy(p->na, vpd + na, min(i, MACADDR_LEN));
2788 strim((char *)p->na);
2789
2790out:
2791 vfree(vpd);
2792 return ret < 0 ? ret : 0;
2793}
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804int t4_get_vpd_params(struct adapter *adapter, struct vpd_params *p)
2805{
2806 u32 cclk_param, cclk_val;
2807 int ret;
2808
2809
2810
2811 ret = t4_get_raw_vpd_params(adapter, p);
2812 if (ret)
2813 return ret;
2814
2815
2816
2817
2818 cclk_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
2819 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_CCLK));
2820 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
2821 1, &cclk_param, &cclk_val);
2822
2823 if (ret)
2824 return ret;
2825 p->cclk = cclk_val;
2826
2827 return 0;
2828}
2829
2830
2831enum {
2832 SF_ATTEMPTS = 10,
2833
2834
2835 SF_PROG_PAGE = 2,
2836 SF_WR_DISABLE = 4,
2837 SF_RD_STATUS = 5,
2838 SF_WR_ENABLE = 6,
2839 SF_RD_DATA_FAST = 0xb,
2840 SF_RD_ID = 0x9f,
2841 SF_ERASE_SECTOR = 0xd8,
2842};
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856static int sf1_read(struct adapter *adapter, unsigned int byte_cnt, int cont,
2857 int lock, u32 *valp)
2858{
2859 int ret;
2860
2861 if (!byte_cnt || byte_cnt > 4)
2862 return -EINVAL;
2863 if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F)
2864 return -EBUSY;
2865 t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) |
2866 SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1));
2867 ret = t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5);
2868 if (!ret)
2869 *valp = t4_read_reg(adapter, SF_DATA_A);
2870 return ret;
2871}
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885static int sf1_write(struct adapter *adapter, unsigned int byte_cnt, int cont,
2886 int lock, u32 val)
2887{
2888 if (!byte_cnt || byte_cnt > 4)
2889 return -EINVAL;
2890 if (t4_read_reg(adapter, SF_OP_A) & SF_BUSY_F)
2891 return -EBUSY;
2892 t4_write_reg(adapter, SF_DATA_A, val);
2893 t4_write_reg(adapter, SF_OP_A, SF_LOCK_V(lock) |
2894 SF_CONT_V(cont) | BYTECNT_V(byte_cnt - 1) | OP_V(1));
2895 return t4_wait_op_done(adapter, SF_OP_A, SF_BUSY_F, 0, SF_ATTEMPTS, 5);
2896}
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906static int flash_wait_op(struct adapter *adapter, int attempts, int delay)
2907{
2908 int ret;
2909 u32 status;
2910
2911 while (1) {
2912 if ((ret = sf1_write(adapter, 1, 1, 1, SF_RD_STATUS)) != 0 ||
2913 (ret = sf1_read(adapter, 1, 0, 1, &status)) != 0)
2914 return ret;
2915 if (!(status & 1))
2916 return 0;
2917 if (--attempts == 0)
2918 return -EAGAIN;
2919 if (delay)
2920 msleep(delay);
2921 }
2922}
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937int t4_read_flash(struct adapter *adapter, unsigned int addr,
2938 unsigned int nwords, u32 *data, int byte_oriented)
2939{
2940 int ret;
2941
2942 if (addr + nwords * sizeof(u32) > adapter->params.sf_size || (addr & 3))
2943 return -EINVAL;
2944
2945 addr = swab32(addr) | SF_RD_DATA_FAST;
2946
2947 if ((ret = sf1_write(adapter, 4, 1, 0, addr)) != 0 ||
2948 (ret = sf1_read(adapter, 1, 1, 0, data)) != 0)
2949 return ret;
2950
2951 for ( ; nwords; nwords--, data++) {
2952 ret = sf1_read(adapter, 4, nwords > 1, nwords == 1, data);
2953 if (nwords == 1)
2954 t4_write_reg(adapter, SF_OP_A, 0);
2955 if (ret)
2956 return ret;
2957 if (byte_oriented)
2958 *data = (__force __u32)(cpu_to_be32(*data));
2959 }
2960 return 0;
2961}
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973static int t4_write_flash(struct adapter *adapter, unsigned int addr,
2974 unsigned int n, const u8 *data)
2975{
2976 int ret;
2977 u32 buf[64];
2978 unsigned int i, c, left, val, offset = addr & 0xff;
2979
2980 if (addr >= adapter->params.sf_size || offset + n > SF_PAGE_SIZE)
2981 return -EINVAL;
2982
2983 val = swab32(addr) | SF_PROG_PAGE;
2984
2985 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
2986 (ret = sf1_write(adapter, 4, 1, 1, val)) != 0)
2987 goto unlock;
2988
2989 for (left = n; left; left -= c) {
2990 c = min(left, 4U);
2991 for (val = 0, i = 0; i < c; ++i)
2992 val = (val << 8) + *data++;
2993
2994 ret = sf1_write(adapter, c, c != left, 1, val);
2995 if (ret)
2996 goto unlock;
2997 }
2998 ret = flash_wait_op(adapter, 8, 1);
2999 if (ret)
3000 goto unlock;
3001
3002 t4_write_reg(adapter, SF_OP_A, 0);
3003
3004
3005 ret = t4_read_flash(adapter, addr & ~0xff, ARRAY_SIZE(buf), buf, 1);
3006 if (ret)
3007 return ret;
3008
3009 if (memcmp(data - n, (u8 *)buf + offset, n)) {
3010 dev_err(adapter->pdev_dev,
3011 "failed to correctly write the flash page at %#x\n",
3012 addr);
3013 return -EIO;
3014 }
3015 return 0;
3016
3017unlock:
3018 t4_write_reg(adapter, SF_OP_A, 0);
3019 return ret;
3020}
3021
3022
3023
3024
3025
3026
3027
3028
3029int t4_get_fw_version(struct adapter *adapter, u32 *vers)
3030{
3031 return t4_read_flash(adapter, FLASH_FW_START +
3032 offsetof(struct fw_hdr, fw_ver), 1,
3033 vers, 0);
3034}
3035
3036
3037
3038
3039
3040
3041
3042
3043int t4_get_bs_version(struct adapter *adapter, u32 *vers)
3044{
3045 return t4_read_flash(adapter, FLASH_FWBOOTSTRAP_START +
3046 offsetof(struct fw_hdr, fw_ver), 1,
3047 vers, 0);
3048}
3049
3050
3051
3052
3053
3054
3055
3056
3057int t4_get_tp_version(struct adapter *adapter, u32 *vers)
3058{
3059 return t4_read_flash(adapter, FLASH_FW_START +
3060 offsetof(struct fw_hdr, tp_microcode_ver),
3061 1, vers, 0);
3062}
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074int t4_get_exprom_version(struct adapter *adap, u32 *vers)
3075{
3076 struct exprom_header {
3077 unsigned char hdr_arr[16];
3078 unsigned char hdr_ver[4];
3079 } *hdr;
3080 u32 exprom_header_buf[DIV_ROUND_UP(sizeof(struct exprom_header),
3081 sizeof(u32))];
3082 int ret;
3083
3084 ret = t4_read_flash(adap, FLASH_EXP_ROM_START,
3085 ARRAY_SIZE(exprom_header_buf), exprom_header_buf,
3086 0);
3087 if (ret)
3088 return ret;
3089
3090 hdr = (struct exprom_header *)exprom_header_buf;
3091 if (hdr->hdr_arr[0] != 0x55 || hdr->hdr_arr[1] != 0xaa)
3092 return -ENOENT;
3093
3094 *vers = (FW_HDR_FW_VER_MAJOR_V(hdr->hdr_ver[0]) |
3095 FW_HDR_FW_VER_MINOR_V(hdr->hdr_ver[1]) |
3096 FW_HDR_FW_VER_MICRO_V(hdr->hdr_ver[2]) |
3097 FW_HDR_FW_VER_BUILD_V(hdr->hdr_ver[3]));
3098 return 0;
3099}
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122int t4_get_vpd_version(struct adapter *adapter, u32 *vers)
3123{
3124 u32 vpdrev_param;
3125 int ret;
3126
3127 vpdrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3128 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_VPDREV));
3129 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
3130 1, &vpdrev_param, vers);
3131 if (ret)
3132 *vers = 0;
3133 return ret;
3134}
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159int t4_get_scfg_version(struct adapter *adapter, u32 *vers)
3160{
3161 u32 scfgrev_param;
3162 int ret;
3163
3164 scfgrev_param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3165 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_SCFGREV));
3166 ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
3167 1, &scfgrev_param, vers);
3168 if (ret)
3169 *vers = 0;
3170 return ret;
3171}
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182int t4_get_version_info(struct adapter *adapter)
3183{
3184 int ret = 0;
3185
3186 #define FIRST_RET(__getvinfo) \
3187 do { \
3188 int __ret = __getvinfo; \
3189 if (__ret && !ret) \
3190 ret = __ret; \
3191 } while (0)
3192
3193 FIRST_RET(t4_get_fw_version(adapter, &adapter->params.fw_vers));
3194 FIRST_RET(t4_get_bs_version(adapter, &adapter->params.bs_vers));
3195 FIRST_RET(t4_get_tp_version(adapter, &adapter->params.tp_vers));
3196 FIRST_RET(t4_get_exprom_version(adapter, &adapter->params.er_vers));
3197 FIRST_RET(t4_get_scfg_version(adapter, &adapter->params.scfg_vers));
3198 FIRST_RET(t4_get_vpd_version(adapter, &adapter->params.vpd_vers));
3199
3200 #undef FIRST_RET
3201 return ret;
3202}
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212void t4_dump_version_info(struct adapter *adapter)
3213{
3214
3215 dev_info(adapter->pdev_dev, "Chelsio %s rev %d\n",
3216 adapter->params.vpd.id,
3217 CHELSIO_CHIP_RELEASE(adapter->params.chip));
3218 dev_info(adapter->pdev_dev, "S/N: %s, P/N: %s\n",
3219 adapter->params.vpd.sn, adapter->params.vpd.pn);
3220
3221
3222 if (!adapter->params.fw_vers)
3223 dev_warn(adapter->pdev_dev, "No firmware loaded\n");
3224 else
3225 dev_info(adapter->pdev_dev, "Firmware version: %u.%u.%u.%u\n",
3226 FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers),
3227 FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers),
3228 FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers),
3229 FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers));
3230
3231
3232
3233
3234 if (!adapter->params.bs_vers)
3235 dev_info(adapter->pdev_dev, "No bootstrap loaded\n");
3236 else
3237 dev_info(adapter->pdev_dev, "Bootstrap version: %u.%u.%u.%u\n",
3238 FW_HDR_FW_VER_MAJOR_G(adapter->params.bs_vers),
3239 FW_HDR_FW_VER_MINOR_G(adapter->params.bs_vers),
3240 FW_HDR_FW_VER_MICRO_G(adapter->params.bs_vers),
3241 FW_HDR_FW_VER_BUILD_G(adapter->params.bs_vers));
3242
3243
3244 if (!adapter->params.tp_vers)
3245 dev_warn(adapter->pdev_dev, "No TP Microcode loaded\n");
3246 else
3247 dev_info(adapter->pdev_dev,
3248 "TP Microcode version: %u.%u.%u.%u\n",
3249 FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers),
3250 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
3251 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
3252 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
3253
3254
3255 if (!adapter->params.er_vers)
3256 dev_info(adapter->pdev_dev, "No Expansion ROM loaded\n");
3257 else
3258 dev_info(adapter->pdev_dev,
3259 "Expansion ROM version: %u.%u.%u.%u\n",
3260 FW_HDR_FW_VER_MAJOR_G(adapter->params.er_vers),
3261 FW_HDR_FW_VER_MINOR_G(adapter->params.er_vers),
3262 FW_HDR_FW_VER_MICRO_G(adapter->params.er_vers),
3263 FW_HDR_FW_VER_BUILD_G(adapter->params.er_vers));
3264
3265
3266 dev_info(adapter->pdev_dev, "Serial Configuration version: %#x\n",
3267 adapter->params.scfg_vers);
3268
3269
3270 dev_info(adapter->pdev_dev, "VPD version: %#x\n",
3271 adapter->params.vpd_vers);
3272}
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282int t4_check_fw_version(struct adapter *adap)
3283{
3284 int i, ret, major, minor, micro;
3285 int exp_major, exp_minor, exp_micro;
3286 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
3287
3288 ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3289
3290 for (i = 0; (ret == -EBUSY || ret == -EAGAIN) && i < 3; i++)
3291 ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3292
3293 if (ret)
3294 return ret;
3295
3296 major = FW_HDR_FW_VER_MAJOR_G(adap->params.fw_vers);
3297 minor = FW_HDR_FW_VER_MINOR_G(adap->params.fw_vers);
3298 micro = FW_HDR_FW_VER_MICRO_G(adap->params.fw_vers);
3299
3300 switch (chip_version) {
3301 case CHELSIO_T4:
3302 exp_major = T4FW_MIN_VERSION_MAJOR;
3303 exp_minor = T4FW_MIN_VERSION_MINOR;
3304 exp_micro = T4FW_MIN_VERSION_MICRO;
3305 break;
3306 case CHELSIO_T5:
3307 exp_major = T5FW_MIN_VERSION_MAJOR;
3308 exp_minor = T5FW_MIN_VERSION_MINOR;
3309 exp_micro = T5FW_MIN_VERSION_MICRO;
3310 break;
3311 case CHELSIO_T6:
3312 exp_major = T6FW_MIN_VERSION_MAJOR;
3313 exp_minor = T6FW_MIN_VERSION_MINOR;
3314 exp_micro = T6FW_MIN_VERSION_MICRO;
3315 break;
3316 default:
3317 dev_err(adap->pdev_dev, "Unsupported chip type, %x\n",
3318 adap->chip);
3319 return -EINVAL;
3320 }
3321
3322 if (major < exp_major || (major == exp_major && minor < exp_minor) ||
3323 (major == exp_major && minor == exp_minor && micro < exp_micro)) {
3324 dev_err(adap->pdev_dev,
3325 "Card has firmware version %u.%u.%u, minimum "
3326 "supported firmware is %u.%u.%u.\n", major, minor,
3327 micro, exp_major, exp_minor, exp_micro);
3328 return -EFAULT;
3329 }
3330 return 0;
3331}
3332
3333
3334
3335
3336static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
3337{
3338
3339
3340 if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
3341 return 1;
3342
3343#define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
3344 if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
3345 SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe))
3346 return 1;
3347#undef SAME_INTF
3348
3349 return 0;
3350}
3351
3352
3353
3354
3355
3356static int should_install_fs_fw(struct adapter *adap, int card_fw_usable,
3357 int k, int c)
3358{
3359 const char *reason;
3360
3361 if (!card_fw_usable) {
3362 reason = "incompatible or unusable";
3363 goto install;
3364 }
3365
3366 if (k > c) {
3367 reason = "older than the version supported with this driver";
3368 goto install;
3369 }
3370
3371 return 0;
3372
3373install:
3374 dev_err(adap->pdev_dev, "firmware on card (%u.%u.%u.%u) is %s, "
3375 "installing firmware %u.%u.%u.%u on card.\n",
3376 FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
3377 FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), reason,
3378 FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
3379 FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
3380
3381 return 1;
3382}
3383
3384int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
3385 const u8 *fw_data, unsigned int fw_size,
3386 struct fw_hdr *card_fw, enum dev_state state,
3387 int *reset)
3388{
3389 int ret, card_fw_usable, fs_fw_usable;
3390 const struct fw_hdr *fs_fw;
3391 const struct fw_hdr *drv_fw;
3392
3393 drv_fw = &fw_info->fw_hdr;
3394
3395
3396 ret = -t4_read_flash(adap, FLASH_FW_START,
3397 sizeof(*card_fw) / sizeof(uint32_t),
3398 (uint32_t *)card_fw, 1);
3399 if (ret == 0) {
3400 card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw);
3401 } else {
3402 dev_err(adap->pdev_dev,
3403 "Unable to read card's firmware header: %d\n", ret);
3404 card_fw_usable = 0;
3405 }
3406
3407 if (fw_data != NULL) {
3408 fs_fw = (const void *)fw_data;
3409 fs_fw_usable = fw_compatible(drv_fw, fs_fw);
3410 } else {
3411 fs_fw = NULL;
3412 fs_fw_usable = 0;
3413 }
3414
3415 if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
3416 (!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) {
3417
3418
3419
3420
3421 } else if (fs_fw_usable && state == DEV_STATE_UNINIT &&
3422 should_install_fs_fw(adap, card_fw_usable,
3423 be32_to_cpu(fs_fw->fw_ver),
3424 be32_to_cpu(card_fw->fw_ver))) {
3425 ret = -t4_fw_upgrade(adap, adap->mbox, fw_data,
3426 fw_size, 0);
3427 if (ret != 0) {
3428 dev_err(adap->pdev_dev,
3429 "failed to install firmware: %d\n", ret);
3430 goto bye;
3431 }
3432
3433
3434 *card_fw = *fs_fw;
3435 card_fw_usable = 1;
3436 *reset = 0;
3437 }
3438
3439 if (!card_fw_usable) {
3440 uint32_t d, c, k;
3441
3442 d = be32_to_cpu(drv_fw->fw_ver);
3443 c = be32_to_cpu(card_fw->fw_ver);
3444 k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0;
3445
3446 dev_err(adap->pdev_dev, "Cannot find a usable firmware: "
3447 "chip state %d, "
3448 "driver compiled with %d.%d.%d.%d, "
3449 "card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n",
3450 state,
3451 FW_HDR_FW_VER_MAJOR_G(d), FW_HDR_FW_VER_MINOR_G(d),
3452 FW_HDR_FW_VER_MICRO_G(d), FW_HDR_FW_VER_BUILD_G(d),
3453 FW_HDR_FW_VER_MAJOR_G(c), FW_HDR_FW_VER_MINOR_G(c),
3454 FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c),
3455 FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k),
3456 FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k));
3457 ret = EINVAL;
3458 goto bye;
3459 }
3460
3461
3462 adap->params.fw_vers = be32_to_cpu(card_fw->fw_ver);
3463 adap->params.tp_vers = be32_to_cpu(card_fw->tp_microcode_ver);
3464
3465bye:
3466 return ret;
3467}
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477static int t4_flash_erase_sectors(struct adapter *adapter, int start, int end)
3478{
3479 int ret = 0;
3480
3481 if (end >= adapter->params.sf_nsec)
3482 return -EINVAL;
3483
3484 while (start <= end) {
3485 if ((ret = sf1_write(adapter, 1, 0, 1, SF_WR_ENABLE)) != 0 ||
3486 (ret = sf1_write(adapter, 4, 0, 1,
3487 SF_ERASE_SECTOR | (start << 8))) != 0 ||
3488 (ret = flash_wait_op(adapter, 14, 500)) != 0) {
3489 dev_err(adapter->pdev_dev,
3490 "erase of flash sector %d failed, error %d\n",
3491 start, ret);
3492 break;
3493 }
3494 start++;
3495 }
3496 t4_write_reg(adapter, SF_OP_A, 0);
3497 return ret;
3498}
3499
3500
3501
3502
3503
3504
3505
3506
3507unsigned int t4_flash_cfg_addr(struct adapter *adapter)
3508{
3509 if (adapter->params.sf_size == 0x100000)
3510 return FLASH_FPGA_CFG_START;
3511 else
3512 return FLASH_CFG_START;
3513}
3514
3515
3516
3517
3518
3519
3520static bool t4_fw_matches_chip(const struct adapter *adap,
3521 const struct fw_hdr *hdr)
3522{
3523
3524
3525
3526 if ((is_t4(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T4) ||
3527 (is_t5(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T5) ||
3528 (is_t6(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T6))
3529 return true;
3530
3531 dev_err(adap->pdev_dev,
3532 "FW image (%d) is not suitable for this adapter (%d)\n",
3533 hdr->chip, CHELSIO_CHIP_VERSION(adap->params.chip));
3534 return false;
3535}
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size)
3546{
3547 u32 csum;
3548 int ret, addr;
3549 unsigned int i;
3550 u8 first_page[SF_PAGE_SIZE];
3551 const __be32 *p = (const __be32 *)fw_data;
3552 const struct fw_hdr *hdr = (const struct fw_hdr *)fw_data;
3553 unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
3554 unsigned int fw_start_sec = FLASH_FW_START_SEC;
3555 unsigned int fw_size = FLASH_FW_MAX_SIZE;
3556 unsigned int fw_start = FLASH_FW_START;
3557
3558 if (!size) {
3559 dev_err(adap->pdev_dev, "FW image has no data\n");
3560 return -EINVAL;
3561 }
3562 if (size & 511) {
3563 dev_err(adap->pdev_dev,
3564 "FW image size not multiple of 512 bytes\n");
3565 return -EINVAL;
3566 }
3567 if ((unsigned int)be16_to_cpu(hdr->len512) * 512 != size) {
3568 dev_err(adap->pdev_dev,
3569 "FW image size differs from size in FW header\n");
3570 return -EINVAL;
3571 }
3572 if (size > fw_size) {
3573 dev_err(adap->pdev_dev, "FW image too large, max is %u bytes\n",
3574 fw_size);
3575 return -EFBIG;
3576 }
3577 if (!t4_fw_matches_chip(adap, hdr))
3578 return -EINVAL;
3579
3580 for (csum = 0, i = 0; i < size / sizeof(csum); i++)
3581 csum += be32_to_cpu(p[i]);
3582
3583 if (csum != 0xffffffff) {
3584 dev_err(adap->pdev_dev,
3585 "corrupted firmware image, checksum %#x\n", csum);
3586 return -EINVAL;
3587 }
3588
3589 i = DIV_ROUND_UP(size, sf_sec_size);
3590 ret = t4_flash_erase_sectors(adap, fw_start_sec, fw_start_sec + i - 1);
3591 if (ret)
3592 goto out;
3593
3594
3595
3596
3597
3598
3599 memcpy(first_page, fw_data, SF_PAGE_SIZE);
3600 ((struct fw_hdr *)first_page)->fw_ver = cpu_to_be32(0xffffffff);
3601 ret = t4_write_flash(adap, fw_start, SF_PAGE_SIZE, first_page);
3602 if (ret)
3603 goto out;
3604
3605 addr = fw_start;
3606 for (size -= SF_PAGE_SIZE; size; size -= SF_PAGE_SIZE) {
3607 addr += SF_PAGE_SIZE;
3608 fw_data += SF_PAGE_SIZE;
3609 ret = t4_write_flash(adap, addr, SF_PAGE_SIZE, fw_data);
3610 if (ret)
3611 goto out;
3612 }
3613
3614 ret = t4_write_flash(adap,
3615 fw_start + offsetof(struct fw_hdr, fw_ver),
3616 sizeof(hdr->fw_ver), (const u8 *)&hdr->fw_ver);
3617out:
3618 if (ret)
3619 dev_err(adap->pdev_dev, "firmware download failed, error %d\n",
3620 ret);
3621 else
3622 ret = t4_get_fw_version(adap, &adap->params.fw_vers);
3623 return ret;
3624}
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634int t4_phy_fw_ver(struct adapter *adap, int *phy_fw_ver)
3635{
3636 u32 param, val;
3637 int ret;
3638
3639 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3640 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3641 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3642 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_VERSION));
3643 ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 1,
3644 ¶m, &val);
3645 if (ret < 0)
3646 return ret;
3647 *phy_fw_ver = val;
3648 return 0;
3649}
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678int t4_load_phy_fw(struct adapter *adap,
3679 int win, spinlock_t *win_lock,
3680 int (*phy_fw_version)(const u8 *, size_t),
3681 const u8 *phy_fw_data, size_t phy_fw_size)
3682{
3683 unsigned long mtype = 0, maddr = 0;
3684 u32 param, val;
3685 int cur_phy_fw_ver = 0, new_phy_fw_vers = 0;
3686 int ret;
3687
3688
3689
3690
3691 if (phy_fw_version) {
3692 new_phy_fw_vers = phy_fw_version(phy_fw_data, phy_fw_size);
3693 ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver);
3694 if (ret < 0)
3695 return ret;
3696
3697 if (cur_phy_fw_ver >= new_phy_fw_vers) {
3698 CH_WARN(adap, "PHY Firmware already up-to-date, "
3699 "version %#x\n", cur_phy_fw_ver);
3700 return 0;
3701 }
3702 }
3703
3704
3705
3706
3707
3708
3709
3710 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3711 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3712 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3713 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD));
3714 val = phy_fw_size;
3715 ret = t4_query_params_rw(adap, adap->mbox, adap->pf, 0, 1,
3716 ¶m, &val, 1, true);
3717 if (ret < 0)
3718 return ret;
3719 mtype = val >> 8;
3720 maddr = (val & 0xff) << 16;
3721
3722
3723
3724
3725 if (win_lock)
3726 spin_lock_bh(win_lock);
3727 ret = t4_memory_rw(adap, win, mtype, maddr,
3728 phy_fw_size, (__be32 *)phy_fw_data,
3729 T4_MEMORY_WRITE);
3730 if (win_lock)
3731 spin_unlock_bh(win_lock);
3732 if (ret)
3733 return ret;
3734
3735
3736
3737
3738
3739
3740 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3741 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_PHYFW) |
3742 FW_PARAMS_PARAM_Y_V(adap->params.portvec) |
3743 FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD));
3744 ret = t4_set_params_timeout(adap, adap->mbox, adap->pf, 0, 1,
3745 ¶m, &val, 30000);
3746
3747
3748
3749
3750 if (phy_fw_version) {
3751 ret = t4_phy_fw_ver(adap, &cur_phy_fw_ver);
3752 if (ret < 0)
3753 return ret;
3754
3755 if (cur_phy_fw_ver != new_phy_fw_vers) {
3756 CH_WARN(adap, "PHY Firmware did not update: "
3757 "version on adapter %#x, "
3758 "version flashed %#x\n",
3759 cur_phy_fw_ver, new_phy_fw_vers);
3760 return -ENXIO;
3761 }
3762 }
3763
3764 return 1;
3765}
3766
3767
3768
3769
3770
3771
3772int t4_fwcache(struct adapter *adap, enum fw_params_param_dev_fwcache op)
3773{
3774 struct fw_params_cmd c;
3775
3776 memset(&c, 0, sizeof(c));
3777 c.op_to_vfn =
3778 cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
3779 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
3780 FW_PARAMS_CMD_PFN_V(adap->pf) |
3781 FW_PARAMS_CMD_VFN_V(0));
3782 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
3783 c.param[0].mnem =
3784 cpu_to_be32(FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
3785 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_FWCACHE));
3786 c.param[0].val = (__force __be32)op;
3787
3788 return t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), NULL);
3789}
3790
3791void t4_cim_read_pif_la(struct adapter *adap, u32 *pif_req, u32 *pif_rsp,
3792 unsigned int *pif_req_wrptr,
3793 unsigned int *pif_rsp_wrptr)
3794{
3795 int i, j;
3796 u32 cfg, val, req, rsp;
3797
3798 cfg = t4_read_reg(adap, CIM_DEBUGCFG_A);
3799 if (cfg & LADBGEN_F)
3800 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F);
3801
3802 val = t4_read_reg(adap, CIM_DEBUGSTS_A);
3803 req = POLADBGWRPTR_G(val);
3804 rsp = PILADBGWRPTR_G(val);
3805 if (pif_req_wrptr)
3806 *pif_req_wrptr = req;
3807 if (pif_rsp_wrptr)
3808 *pif_rsp_wrptr = rsp;
3809
3810 for (i = 0; i < CIM_PIFLA_SIZE; i++) {
3811 for (j = 0; j < 6; j++) {
3812 t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(req) |
3813 PILADBGRDPTR_V(rsp));
3814 *pif_req++ = t4_read_reg(adap, CIM_PO_LA_DEBUGDATA_A);
3815 *pif_rsp++ = t4_read_reg(adap, CIM_PI_LA_DEBUGDATA_A);
3816 req++;
3817 rsp++;
3818 }
3819 req = (req + 2) & POLADBGRDPTR_M;
3820 rsp = (rsp + 2) & PILADBGRDPTR_M;
3821 }
3822 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg);
3823}
3824
3825void t4_cim_read_ma_la(struct adapter *adap, u32 *ma_req, u32 *ma_rsp)
3826{
3827 u32 cfg;
3828 int i, j, idx;
3829
3830 cfg = t4_read_reg(adap, CIM_DEBUGCFG_A);
3831 if (cfg & LADBGEN_F)
3832 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg ^ LADBGEN_F);
3833
3834 for (i = 0; i < CIM_MALA_SIZE; i++) {
3835 for (j = 0; j < 5; j++) {
3836 idx = 8 * i + j;
3837 t4_write_reg(adap, CIM_DEBUGCFG_A, POLADBGRDPTR_V(idx) |
3838 PILADBGRDPTR_V(idx));
3839 *ma_req++ = t4_read_reg(adap, CIM_PO_LA_MADEBUGDATA_A);
3840 *ma_rsp++ = t4_read_reg(adap, CIM_PI_LA_MADEBUGDATA_A);
3841 }
3842 }
3843 t4_write_reg(adap, CIM_DEBUGCFG_A, cfg);
3844}
3845
3846void t4_ulprx_read_la(struct adapter *adap, u32 *la_buf)
3847{
3848 unsigned int i, j;
3849
3850 for (i = 0; i < 8; i++) {
3851 u32 *p = la_buf + i;
3852
3853 t4_write_reg(adap, ULP_RX_LA_CTL_A, i);
3854 j = t4_read_reg(adap, ULP_RX_LA_WRPTR_A);
3855 t4_write_reg(adap, ULP_RX_LA_RDPTR_A, j);
3856 for (j = 0; j < ULPRX_LA_SIZE; j++, p += 8)
3857 *p = t4_read_reg(adap, ULP_RX_LA_RDDATA_A);
3858 }
3859}
3860
3861#define ADVERT_MASK (FW_PORT_CAP32_SPEED_V(FW_PORT_CAP32_SPEED_M) | \
3862 FW_PORT_CAP32_ANEG)
3863
3864
3865
3866
3867
3868
3869
3870static fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16)
3871{
3872 fw_port_cap32_t caps32 = 0;
3873
3874 #define CAP16_TO_CAP32(__cap) \
3875 do { \
3876 if (caps16 & FW_PORT_CAP_##__cap) \
3877 caps32 |= FW_PORT_CAP32_##__cap; \
3878 } while (0)
3879
3880 CAP16_TO_CAP32(SPEED_100M);
3881 CAP16_TO_CAP32(SPEED_1G);
3882 CAP16_TO_CAP32(SPEED_25G);
3883 CAP16_TO_CAP32(SPEED_10G);
3884 CAP16_TO_CAP32(SPEED_40G);
3885 CAP16_TO_CAP32(SPEED_100G);
3886 CAP16_TO_CAP32(FC_RX);
3887 CAP16_TO_CAP32(FC_TX);
3888 CAP16_TO_CAP32(ANEG);
3889 CAP16_TO_CAP32(MDIX);
3890 CAP16_TO_CAP32(MDIAUTO);
3891 CAP16_TO_CAP32(FEC_RS);
3892 CAP16_TO_CAP32(FEC_BASER_RS);
3893 CAP16_TO_CAP32(802_3_PAUSE);
3894 CAP16_TO_CAP32(802_3_ASM_DIR);
3895
3896 #undef CAP16_TO_CAP32
3897
3898 return caps32;
3899}
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909static fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32)
3910{
3911 fw_port_cap16_t caps16 = 0;
3912
3913 #define CAP32_TO_CAP16(__cap) \
3914 do { \
3915 if (caps32 & FW_PORT_CAP32_##__cap) \
3916 caps16 |= FW_PORT_CAP_##__cap; \
3917 } while (0)
3918
3919 CAP32_TO_CAP16(SPEED_100M);
3920 CAP32_TO_CAP16(SPEED_1G);
3921 CAP32_TO_CAP16(SPEED_10G);
3922 CAP32_TO_CAP16(SPEED_25G);
3923 CAP32_TO_CAP16(SPEED_40G);
3924 CAP32_TO_CAP16(SPEED_100G);
3925 CAP32_TO_CAP16(FC_RX);
3926 CAP32_TO_CAP16(FC_TX);
3927 CAP32_TO_CAP16(802_3_PAUSE);
3928 CAP32_TO_CAP16(802_3_ASM_DIR);
3929 CAP32_TO_CAP16(ANEG);
3930 CAP32_TO_CAP16(MDIX);
3931 CAP32_TO_CAP16(MDIAUTO);
3932 CAP32_TO_CAP16(FEC_RS);
3933 CAP32_TO_CAP16(FEC_BASER_RS);
3934
3935 #undef CAP32_TO_CAP16
3936
3937 return caps16;
3938}
3939
3940
3941static inline enum cc_pause fwcap_to_cc_pause(fw_port_cap32_t fw_pause)
3942{
3943 enum cc_pause cc_pause = 0;
3944
3945 if (fw_pause & FW_PORT_CAP32_FC_RX)
3946 cc_pause |= PAUSE_RX;
3947 if (fw_pause & FW_PORT_CAP32_FC_TX)
3948 cc_pause |= PAUSE_TX;
3949
3950 return cc_pause;
3951}
3952
3953
3954static inline fw_port_cap32_t cc_to_fwcap_pause(enum cc_pause cc_pause)
3955{
3956 fw_port_cap32_t fw_pause = 0;
3957
3958 if (cc_pause & PAUSE_RX)
3959 fw_pause |= FW_PORT_CAP32_FC_RX;
3960 if (cc_pause & PAUSE_TX)
3961 fw_pause |= FW_PORT_CAP32_FC_TX;
3962
3963 return fw_pause;
3964}
3965
3966
3967static inline enum cc_fec fwcap_to_cc_fec(fw_port_cap32_t fw_fec)
3968{
3969 enum cc_fec cc_fec = 0;
3970
3971 if (fw_fec & FW_PORT_CAP32_FEC_RS)
3972 cc_fec |= FEC_RS;
3973 if (fw_fec & FW_PORT_CAP32_FEC_BASER_RS)
3974 cc_fec |= FEC_BASER_RS;
3975
3976 return cc_fec;
3977}
3978
3979
3980static inline fw_port_cap32_t cc_to_fwcap_fec(enum cc_fec cc_fec)
3981{
3982 fw_port_cap32_t fw_fec = 0;
3983
3984 if (cc_fec & FEC_RS)
3985 fw_fec |= FW_PORT_CAP32_FEC_RS;
3986 if (cc_fec & FEC_BASER_RS)
3987 fw_fec |= FW_PORT_CAP32_FEC_BASER_RS;
3988
3989 return fw_fec;
3990}
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006int t4_link_l1cfg(struct adapter *adapter, unsigned int mbox,
4007 unsigned int port, struct link_config *lc)
4008{
4009 unsigned int fw_caps = adapter->params.fw_caps_support;
4010 struct fw_port_cmd cmd;
4011 unsigned int fw_mdi = FW_PORT_CAP32_MDI_V(FW_PORT_CAP32_MDI_AUTO);
4012 fw_port_cap32_t fw_fc, cc_fec, fw_fec, rcap;
4013
4014 lc->link_ok = 0;
4015
4016
4017
4018
4019 fw_fc = cc_to_fwcap_pause(lc->requested_fc);
4020
4021
4022
4023
4024
4025
4026
4027
4028 if (lc->requested_fec & FEC_AUTO)
4029 cc_fec = fwcap_to_cc_fec(lc->def_acaps);
4030 else
4031 cc_fec = lc->requested_fec;
4032 fw_fec = cc_to_fwcap_fec(cc_fec);
4033
4034
4035
4036 if (!(lc->pcaps & FW_PORT_CAP32_ANEG)) {
4037 rcap = (lc->pcaps & ADVERT_MASK) | fw_fc | fw_fec;
4038 lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
4039 lc->fec = cc_fec;
4040 } else if (lc->autoneg == AUTONEG_DISABLE) {
4041 rcap = lc->speed_caps | fw_fc | fw_fec | fw_mdi;
4042 lc->fc = lc->requested_fc & ~PAUSE_AUTONEG;
4043 lc->fec = cc_fec;
4044 } else {
4045 rcap = lc->acaps | fw_fc | fw_fec | fw_mdi;
4046 }
4047
4048
4049
4050 memset(&cmd, 0, sizeof(cmd));
4051 cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
4052 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
4053 FW_PORT_CMD_PORTID_V(port));
4054 cmd.action_to_len16 =
4055 cpu_to_be32(FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
4056 ? FW_PORT_ACTION_L1_CFG
4057 : FW_PORT_ACTION_L1_CFG32) |
4058 FW_LEN16(cmd));
4059 if (fw_caps == FW_CAPS16)
4060 cmd.u.l1cfg.rcap = cpu_to_be32(fwcaps32_to_caps16(rcap));
4061 else
4062 cmd.u.l1cfg32.rcap32 = cpu_to_be32(rcap);
4063 return t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
4064}
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port)
4075{
4076 struct fw_port_cmd c;
4077
4078 memset(&c, 0, sizeof(c));
4079 c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
4080 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
4081 FW_PORT_CMD_PORTID_V(port));
4082 c.action_to_len16 =
4083 cpu_to_be32(FW_PORT_CMD_ACTION_V(FW_PORT_ACTION_L1_CFG) |
4084 FW_LEN16(c));
4085 c.u.l1cfg.rcap = cpu_to_be32(FW_PORT_CAP32_ANEG);
4086 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
4087}
4088
4089typedef void (*int_handler_t)(struct adapter *adap);
4090
4091struct intr_info {
4092 unsigned int mask;
4093 const char *msg;
4094 short stat_idx;
4095 unsigned short fatal;
4096 int_handler_t int_handler;
4097};
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112static int t4_handle_intr_status(struct adapter *adapter, unsigned int reg,
4113 const struct intr_info *acts)
4114{
4115 int fatal = 0;
4116 unsigned int mask = 0;
4117 unsigned int status = t4_read_reg(adapter, reg);
4118
4119 for ( ; acts->mask; ++acts) {
4120 if (!(status & acts->mask))
4121 continue;
4122 if (acts->fatal) {
4123 fatal++;
4124 dev_alert(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
4125 status & acts->mask);
4126 } else if (acts->msg && printk_ratelimit())
4127 dev_warn(adapter->pdev_dev, "%s (0x%x)\n", acts->msg,
4128 status & acts->mask);
4129 if (acts->int_handler)
4130 acts->int_handler(adapter);
4131 mask |= acts->mask;
4132 }
4133 status &= mask;
4134 if (status)
4135 t4_write_reg(adapter, reg, status);
4136 return fatal;
4137}
4138
4139
4140
4141
4142static void pcie_intr_handler(struct adapter *adapter)
4143{
4144 static const struct intr_info sysbus_intr_info[] = {
4145 { RNPP_F, "RXNP array parity error", -1, 1 },
4146 { RPCP_F, "RXPC array parity error", -1, 1 },
4147 { RCIP_F, "RXCIF array parity error", -1, 1 },
4148 { RCCP_F, "Rx completions control array parity error", -1, 1 },
4149 { RFTP_F, "RXFT array parity error", -1, 1 },
4150 { 0 }
4151 };
4152 static const struct intr_info pcie_port_intr_info[] = {
4153 { TPCP_F, "TXPC array parity error", -1, 1 },
4154 { TNPP_F, "TXNP array parity error", -1, 1 },
4155 { TFTP_F, "TXFT array parity error", -1, 1 },
4156 { TCAP_F, "TXCA array parity error", -1, 1 },
4157 { TCIP_F, "TXCIF array parity error", -1, 1 },
4158 { RCAP_F, "RXCA array parity error", -1, 1 },
4159 { OTDD_F, "outbound request TLP discarded", -1, 1 },
4160 { RDPE_F, "Rx data parity error", -1, 1 },
4161 { TDUE_F, "Tx uncorrectable data error", -1, 1 },
4162 { 0 }
4163 };
4164 static const struct intr_info pcie_intr_info[] = {
4165 { MSIADDRLPERR_F, "MSI AddrL parity error", -1, 1 },
4166 { MSIADDRHPERR_F, "MSI AddrH parity error", -1, 1 },
4167 { MSIDATAPERR_F, "MSI data parity error", -1, 1 },
4168 { MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 },
4169 { MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 },
4170 { MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 },
4171 { MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 },
4172 { PIOCPLPERR_F, "PCI PIO completion FIFO parity error", -1, 1 },
4173 { PIOREQPERR_F, "PCI PIO request FIFO parity error", -1, 1 },
4174 { TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 },
4175 { CCNTPERR_F, "PCI CMD channel count parity error", -1, 1 },
4176 { CREQPERR_F, "PCI CMD channel request parity error", -1, 1 },
4177 { CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 },
4178 { DCNTPERR_F, "PCI DMA channel count parity error", -1, 1 },
4179 { DREQPERR_F, "PCI DMA channel request parity error", -1, 1 },
4180 { DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 },
4181 { HCNTPERR_F, "PCI HMA channel count parity error", -1, 1 },
4182 { HREQPERR_F, "PCI HMA channel request parity error", -1, 1 },
4183 { HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 },
4184 { CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 },
4185 { FIDPERR_F, "PCI FID parity error", -1, 1 },
4186 { INTXCLRPERR_F, "PCI INTx clear parity error", -1, 1 },
4187 { MATAGPERR_F, "PCI MA tag parity error", -1, 1 },
4188 { PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 },
4189 { RXCPLPERR_F, "PCI Rx completion parity error", -1, 1 },
4190 { RXWRPERR_F, "PCI Rx write parity error", -1, 1 },
4191 { RPLPERR_F, "PCI replay buffer parity error", -1, 1 },
4192 { PCIESINT_F, "PCI core secondary fault", -1, 1 },
4193 { PCIEPINT_F, "PCI core primary fault", -1, 1 },
4194 { UNXSPLCPLERR_F, "PCI unexpected split completion error",
4195 -1, 0 },
4196 { 0 }
4197 };
4198
4199 static struct intr_info t5_pcie_intr_info[] = {
4200 { MSTGRPPERR_F, "Master Response Read Queue parity error",
4201 -1, 1 },
4202 { MSTTIMEOUTPERR_F, "Master Timeout FIFO parity error", -1, 1 },
4203 { MSIXSTIPERR_F, "MSI-X STI SRAM parity error", -1, 1 },
4204 { MSIXADDRLPERR_F, "MSI-X AddrL parity error", -1, 1 },
4205 { MSIXADDRHPERR_F, "MSI-X AddrH parity error", -1, 1 },
4206 { MSIXDATAPERR_F, "MSI-X data parity error", -1, 1 },
4207 { MSIXDIPERR_F, "MSI-X DI parity error", -1, 1 },
4208 { PIOCPLGRPPERR_F, "PCI PIO completion Group FIFO parity error",
4209 -1, 1 },
4210 { PIOREQGRPPERR_F, "PCI PIO request Group FIFO parity error",
4211 -1, 1 },
4212 { TARTAGPERR_F, "PCI PCI target tag FIFO parity error", -1, 1 },
4213 { MSTTAGQPERR_F, "PCI master tag queue parity error", -1, 1 },
4214 { CREQPERR_F, "PCI CMD channel request parity error", -1, 1 },
4215 { CRSPPERR_F, "PCI CMD channel response parity error", -1, 1 },
4216 { DREQWRPERR_F, "PCI DMA channel write request parity error",
4217 -1, 1 },
4218 { DREQPERR_F, "PCI DMA channel request parity error", -1, 1 },
4219 { DRSPPERR_F, "PCI DMA channel response parity error", -1, 1 },
4220 { HREQWRPERR_F, "PCI HMA channel count parity error", -1, 1 },
4221 { HREQPERR_F, "PCI HMA channel request parity error", -1, 1 },
4222 { HRSPPERR_F, "PCI HMA channel response parity error", -1, 1 },
4223 { CFGSNPPERR_F, "PCI config snoop FIFO parity error", -1, 1 },
4224 { FIDPERR_F, "PCI FID parity error", -1, 1 },
4225 { VFIDPERR_F, "PCI INTx clear parity error", -1, 1 },
4226 { MAGRPPERR_F, "PCI MA group FIFO parity error", -1, 1 },
4227 { PIOTAGPERR_F, "PCI PIO tag parity error", -1, 1 },
4228 { IPRXHDRGRPPERR_F, "PCI IP Rx header group parity error",
4229 -1, 1 },
4230 { IPRXDATAGRPPERR_F, "PCI IP Rx data group parity error",
4231 -1, 1 },
4232 { RPLPERR_F, "PCI IP replay buffer parity error", -1, 1 },
4233 { IPSOTPERR_F, "PCI IP SOT buffer parity error", -1, 1 },
4234 { TRGT1GRPPERR_F, "PCI TRGT1 group FIFOs parity error", -1, 1 },
4235 { READRSPERR_F, "Outbound read error", -1, 0 },
4236 { 0 }
4237 };
4238
4239 int fat;
4240
4241 if (is_t4(adapter->params.chip))
4242 fat = t4_handle_intr_status(adapter,
4243 PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS_A,
4244 sysbus_intr_info) +
4245 t4_handle_intr_status(adapter,
4246 PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS_A,
4247 pcie_port_intr_info) +
4248 t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A,
4249 pcie_intr_info);
4250 else
4251 fat = t4_handle_intr_status(adapter, PCIE_INT_CAUSE_A,
4252 t5_pcie_intr_info);
4253
4254 if (fat)
4255 t4_fatal_err(adapter);
4256}
4257
4258
4259
4260
4261static void tp_intr_handler(struct adapter *adapter)
4262{
4263 static const struct intr_info tp_intr_info[] = {
4264 { 0x3fffffff, "TP parity error", -1, 1 },
4265 { FLMTXFLSTEMPTY_F, "TP out of Tx pages", -1, 1 },
4266 { 0 }
4267 };
4268
4269 if (t4_handle_intr_status(adapter, TP_INT_CAUSE_A, tp_intr_info))
4270 t4_fatal_err(adapter);
4271}
4272
4273
4274
4275
4276static void sge_intr_handler(struct adapter *adapter)
4277{
4278 u64 v;
4279 u32 err;
4280
4281 static const struct intr_info sge_intr_info[] = {
4282 { ERR_CPL_EXCEED_IQE_SIZE_F,
4283 "SGE received CPL exceeding IQE size", -1, 1 },
4284 { ERR_INVALID_CIDX_INC_F,
4285 "SGE GTS CIDX increment too large", -1, 0 },
4286 { ERR_CPL_OPCODE_0_F, "SGE received 0-length CPL", -1, 0 },
4287 { DBFIFO_LP_INT_F, NULL, -1, 0, t4_db_full },
4288 { ERR_DATA_CPL_ON_HIGH_QID1_F | ERR_DATA_CPL_ON_HIGH_QID0_F,
4289 "SGE IQID > 1023 received CPL for FL", -1, 0 },
4290 { ERR_BAD_DB_PIDX3_F, "SGE DBP 3 pidx increment too large", -1,
4291 0 },
4292 { ERR_BAD_DB_PIDX2_F, "SGE DBP 2 pidx increment too large", -1,
4293 0 },
4294 { ERR_BAD_DB_PIDX1_F, "SGE DBP 1 pidx increment too large", -1,
4295 0 },
4296 { ERR_BAD_DB_PIDX0_F, "SGE DBP 0 pidx increment too large", -1,
4297 0 },
4298 { ERR_ING_CTXT_PRIO_F,
4299 "SGE too many priority ingress contexts", -1, 0 },
4300 { INGRESS_SIZE_ERR_F, "SGE illegal ingress QID", -1, 0 },
4301 { EGRESS_SIZE_ERR_F, "SGE illegal egress QID", -1, 0 },
4302 { 0 }
4303 };
4304
4305 static struct intr_info t4t5_sge_intr_info[] = {
4306 { ERR_DROPPED_DB_F, NULL, -1, 0, t4_db_dropped },
4307 { DBFIFO_HP_INT_F, NULL, -1, 0, t4_db_full },
4308 { ERR_EGR_CTXT_PRIO_F,
4309 "SGE too many priority egress contexts", -1, 0 },
4310 { 0 }
4311 };
4312
4313 v = (u64)t4_read_reg(adapter, SGE_INT_CAUSE1_A) |
4314 ((u64)t4_read_reg(adapter, SGE_INT_CAUSE2_A) << 32);
4315 if (v) {
4316 dev_alert(adapter->pdev_dev, "SGE parity error (%#llx)\n",
4317 (unsigned long long)v);
4318 t4_write_reg(adapter, SGE_INT_CAUSE1_A, v);
4319 t4_write_reg(adapter, SGE_INT_CAUSE2_A, v >> 32);
4320 }
4321
4322 v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A, sge_intr_info);
4323 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
4324 v |= t4_handle_intr_status(adapter, SGE_INT_CAUSE3_A,
4325 t4t5_sge_intr_info);
4326
4327 err = t4_read_reg(adapter, SGE_ERROR_STATS_A);
4328 if (err & ERROR_QID_VALID_F) {
4329 dev_err(adapter->pdev_dev, "SGE error for queue %u\n",
4330 ERROR_QID_G(err));
4331 if (err & UNCAPTURED_ERROR_F)
4332 dev_err(adapter->pdev_dev,
4333 "SGE UNCAPTURED_ERROR set (clearing)\n");
4334 t4_write_reg(adapter, SGE_ERROR_STATS_A, ERROR_QID_VALID_F |
4335 UNCAPTURED_ERROR_F);
4336 }
4337
4338 if (v != 0)
4339 t4_fatal_err(adapter);
4340}
4341
4342#define CIM_OBQ_INTR (OBQULP0PARERR_F | OBQULP1PARERR_F | OBQULP2PARERR_F |\
4343 OBQULP3PARERR_F | OBQSGEPARERR_F | OBQNCSIPARERR_F)
4344#define CIM_IBQ_INTR (IBQTP0PARERR_F | IBQTP1PARERR_F | IBQULPPARERR_F |\
4345 IBQSGEHIPARERR_F | IBQSGELOPARERR_F | IBQNCSIPARERR_F)
4346
4347
4348
4349
4350static void cim_intr_handler(struct adapter *adapter)
4351{
4352 static const struct intr_info cim_intr_info[] = {
4353 { PREFDROPINT_F, "CIM control register prefetch drop", -1, 1 },
4354 { CIM_OBQ_INTR, "CIM OBQ parity error", -1, 1 },
4355 { CIM_IBQ_INTR, "CIM IBQ parity error", -1, 1 },
4356 { MBUPPARERR_F, "CIM mailbox uP parity error", -1, 1 },
4357 { MBHOSTPARERR_F, "CIM mailbox host parity error", -1, 1 },
4358 { TIEQINPARERRINT_F, "CIM TIEQ outgoing parity error", -1, 1 },
4359 { TIEQOUTPARERRINT_F, "CIM TIEQ incoming parity error", -1, 1 },
4360 { TIMER0INT_F, "CIM TIMER0 interrupt", -1, 1 },
4361 { 0 }
4362 };
4363 static const struct intr_info cim_upintr_info[] = {
4364 { RSVDSPACEINT_F, "CIM reserved space access", -1, 1 },
4365 { ILLTRANSINT_F, "CIM illegal transaction", -1, 1 },
4366 { ILLWRINT_F, "CIM illegal write", -1, 1 },
4367 { ILLRDINT_F, "CIM illegal read", -1, 1 },
4368 { ILLRDBEINT_F, "CIM illegal read BE", -1, 1 },
4369 { ILLWRBEINT_F, "CIM illegal write BE", -1, 1 },
4370 { SGLRDBOOTINT_F, "CIM single read from boot space", -1, 1 },
4371 { SGLWRBOOTINT_F, "CIM single write to boot space", -1, 1 },
4372 { BLKWRBOOTINT_F, "CIM block write to boot space", -1, 1 },
4373 { SGLRDFLASHINT_F, "CIM single read from flash space", -1, 1 },
4374 { SGLWRFLASHINT_F, "CIM single write to flash space", -1, 1 },
4375 { BLKWRFLASHINT_F, "CIM block write to flash space", -1, 1 },
4376 { SGLRDEEPROMINT_F, "CIM single EEPROM read", -1, 1 },
4377 { SGLWREEPROMINT_F, "CIM single EEPROM write", -1, 1 },
4378 { BLKRDEEPROMINT_F, "CIM block EEPROM read", -1, 1 },
4379 { BLKWREEPROMINT_F, "CIM block EEPROM write", -1, 1 },
4380 { SGLRDCTLINT_F, "CIM single read from CTL space", -1, 1 },
4381 { SGLWRCTLINT_F, "CIM single write to CTL space", -1, 1 },
4382 { BLKRDCTLINT_F, "CIM block read from CTL space", -1, 1 },
4383 { BLKWRCTLINT_F, "CIM block write to CTL space", -1, 1 },
4384 { SGLRDPLINT_F, "CIM single read from PL space", -1, 1 },
4385 { SGLWRPLINT_F, "CIM single write to PL space", -1, 1 },
4386 { BLKRDPLINT_F, "CIM block read from PL space", -1, 1 },
4387 { BLKWRPLINT_F, "CIM block write to PL space", -1, 1 },
4388 { REQOVRLOOKUPINT_F, "CIM request FIFO overwrite", -1, 1 },
4389 { RSPOVRLOOKUPINT_F, "CIM response FIFO overwrite", -1, 1 },
4390 { TIMEOUTINT_F, "CIM PIF timeout", -1, 1 },
4391 { TIMEOUTMAINT_F, "CIM PIF MA timeout", -1, 1 },
4392 { 0 }
4393 };
4394
4395 u32 val, fw_err;
4396 int fat;
4397
4398 fw_err = t4_read_reg(adapter, PCIE_FW_A);
4399 if (fw_err & PCIE_FW_ERR_F)
4400 t4_report_fw_error(adapter);
4401
4402
4403
4404
4405
4406
4407
4408
4409 val = t4_read_reg(adapter, CIM_HOST_INT_CAUSE_A);
4410 if (val & TIMER0INT_F)
4411 if (!(fw_err & PCIE_FW_ERR_F) ||
4412 (PCIE_FW_EVAL_G(fw_err) != PCIE_FW_EVAL_CRASH))
4413 t4_write_reg(adapter, CIM_HOST_INT_CAUSE_A,
4414 TIMER0INT_F);
4415
4416 fat = t4_handle_intr_status(adapter, CIM_HOST_INT_CAUSE_A,
4417 cim_intr_info) +
4418 t4_handle_intr_status(adapter, CIM_HOST_UPACC_INT_CAUSE_A,
4419 cim_upintr_info);
4420 if (fat)
4421 t4_fatal_err(adapter);
4422}
4423
4424
4425
4426
4427static void ulprx_intr_handler(struct adapter *adapter)
4428{
4429 static const struct intr_info ulprx_intr_info[] = {
4430 { 0x1800000, "ULPRX context error", -1, 1 },
4431 { 0x7fffff, "ULPRX parity error", -1, 1 },
4432 { 0 }
4433 };
4434
4435 if (t4_handle_intr_status(adapter, ULP_RX_INT_CAUSE_A, ulprx_intr_info))
4436 t4_fatal_err(adapter);
4437}
4438
4439
4440
4441
4442static void ulptx_intr_handler(struct adapter *adapter)
4443{
4444 static const struct intr_info ulptx_intr_info[] = {
4445 { PBL_BOUND_ERR_CH3_F, "ULPTX channel 3 PBL out of bounds", -1,
4446 0 },
4447 { PBL_BOUND_ERR_CH2_F, "ULPTX channel 2 PBL out of bounds", -1,
4448 0 },
4449 { PBL_BOUND_ERR_CH1_F, "ULPTX channel 1 PBL out of bounds", -1,
4450 0 },
4451 { PBL_BOUND_ERR_CH0_F, "ULPTX channel 0 PBL out of bounds", -1,
4452 0 },
4453 { 0xfffffff, "ULPTX parity error", -1, 1 },
4454 { 0 }
4455 };
4456
4457 if (t4_handle_intr_status(adapter, ULP_TX_INT_CAUSE_A, ulptx_intr_info))
4458 t4_fatal_err(adapter);
4459}
4460
4461
4462
4463
4464static void pmtx_intr_handler(struct adapter *adapter)
4465{
4466 static const struct intr_info pmtx_intr_info[] = {
4467 { PCMD_LEN_OVFL0_F, "PMTX channel 0 pcmd too large", -1, 1 },
4468 { PCMD_LEN_OVFL1_F, "PMTX channel 1 pcmd too large", -1, 1 },
4469 { PCMD_LEN_OVFL2_F, "PMTX channel 2 pcmd too large", -1, 1 },
4470 { ZERO_C_CMD_ERROR_F, "PMTX 0-length pcmd", -1, 1 },
4471 { PMTX_FRAMING_ERROR_F, "PMTX framing error", -1, 1 },
4472 { OESPI_PAR_ERROR_F, "PMTX oespi parity error", -1, 1 },
4473 { DB_OPTIONS_PAR_ERROR_F, "PMTX db_options parity error",
4474 -1, 1 },
4475 { ICSPI_PAR_ERROR_F, "PMTX icspi parity error", -1, 1 },
4476 { PMTX_C_PCMD_PAR_ERROR_F, "PMTX c_pcmd parity error", -1, 1},
4477 { 0 }
4478 };
4479
4480 if (t4_handle_intr_status(adapter, PM_TX_INT_CAUSE_A, pmtx_intr_info))
4481 t4_fatal_err(adapter);
4482}
4483
4484
4485
4486
4487static void pmrx_intr_handler(struct adapter *adapter)
4488{
4489 static const struct intr_info pmrx_intr_info[] = {
4490 { ZERO_E_CMD_ERROR_F, "PMRX 0-length pcmd", -1, 1 },
4491 { PMRX_FRAMING_ERROR_F, "PMRX framing error", -1, 1 },
4492 { OCSPI_PAR_ERROR_F, "PMRX ocspi parity error", -1, 1 },
4493 { DB_OPTIONS_PAR_ERROR_F, "PMRX db_options parity error",
4494 -1, 1 },
4495 { IESPI_PAR_ERROR_F, "PMRX iespi parity error", -1, 1 },
4496 { PMRX_E_PCMD_PAR_ERROR_F, "PMRX e_pcmd parity error", -1, 1},
4497 { 0 }
4498 };
4499
4500 if (t4_handle_intr_status(adapter, PM_RX_INT_CAUSE_A, pmrx_intr_info))
4501 t4_fatal_err(adapter);
4502}
4503
4504
4505
4506
4507static void cplsw_intr_handler(struct adapter *adapter)
4508{
4509 static const struct intr_info cplsw_intr_info[] = {
4510 { CIM_OP_MAP_PERR_F, "CPLSW CIM op_map parity error", -1, 1 },
4511 { CIM_OVFL_ERROR_F, "CPLSW CIM overflow", -1, 1 },
4512 { TP_FRAMING_ERROR_F, "CPLSW TP framing error", -1, 1 },
4513 { SGE_FRAMING_ERROR_F, "CPLSW SGE framing error", -1, 1 },
4514 { CIM_FRAMING_ERROR_F, "CPLSW CIM framing error", -1, 1 },
4515 { ZERO_SWITCH_ERROR_F, "CPLSW no-switch error", -1, 1 },
4516 { 0 }
4517 };
4518
4519 if (t4_handle_intr_status(adapter, CPL_INTR_CAUSE_A, cplsw_intr_info))
4520 t4_fatal_err(adapter);
4521}
4522
4523
4524
4525
4526static void le_intr_handler(struct adapter *adap)
4527{
4528 enum chip_type chip = CHELSIO_CHIP_VERSION(adap->params.chip);
4529 static const struct intr_info le_intr_info[] = {
4530 { LIPMISS_F, "LE LIP miss", -1, 0 },
4531 { LIP0_F, "LE 0 LIP error", -1, 0 },
4532 { PARITYERR_F, "LE parity error", -1, 1 },
4533 { UNKNOWNCMD_F, "LE unknown command", -1, 1 },
4534 { REQQPARERR_F, "LE request queue parity error", -1, 1 },
4535 { 0 }
4536 };
4537
4538 static struct intr_info t6_le_intr_info[] = {
4539 { T6_LIPMISS_F, "LE LIP miss", -1, 0 },
4540 { T6_LIP0_F, "LE 0 LIP error", -1, 0 },
4541 { TCAMINTPERR_F, "LE parity error", -1, 1 },
4542 { T6_UNKNOWNCMD_F, "LE unknown command", -1, 1 },
4543 { SSRAMINTPERR_F, "LE request queue parity error", -1, 1 },
4544 { 0 }
4545 };
4546
4547 if (t4_handle_intr_status(adap, LE_DB_INT_CAUSE_A,
4548 (chip <= CHELSIO_T5) ?
4549 le_intr_info : t6_le_intr_info))
4550 t4_fatal_err(adap);
4551}
4552
4553
4554
4555
4556static void mps_intr_handler(struct adapter *adapter)
4557{
4558 static const struct intr_info mps_rx_intr_info[] = {
4559 { 0xffffff, "MPS Rx parity error", -1, 1 },
4560 { 0 }
4561 };
4562 static const struct intr_info mps_tx_intr_info[] = {
4563 { TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 },
4564 { NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 },
4565 { TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error",
4566 -1, 1 },
4567 { TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error",
4568 -1, 1 },
4569 { BUBBLE_F, "MPS Tx underflow", -1, 1 },
4570 { SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 },
4571 { FRMERR_F, "MPS Tx framing error", -1, 1 },
4572 { 0 }
4573 };
4574 static const struct intr_info t6_mps_tx_intr_info[] = {
4575 { TPFIFO_V(TPFIFO_M), "MPS Tx TP FIFO parity error", -1, 1 },
4576 { NCSIFIFO_F, "MPS Tx NC-SI FIFO parity error", -1, 1 },
4577 { TXDATAFIFO_V(TXDATAFIFO_M), "MPS Tx data FIFO parity error",
4578 -1, 1 },
4579 { TXDESCFIFO_V(TXDESCFIFO_M), "MPS Tx desc FIFO parity error",
4580 -1, 1 },
4581
4582 { SECNTERR_F, "MPS Tx SOP/EOP error", -1, 1 },
4583 { FRMERR_F, "MPS Tx framing error", -1, 1 },
4584 { 0 }
4585 };
4586 static const struct intr_info mps_trc_intr_info[] = {
4587 { FILTMEM_V(FILTMEM_M), "MPS TRC filter parity error", -1, 1 },
4588 { PKTFIFO_V(PKTFIFO_M), "MPS TRC packet FIFO parity error",
4589 -1, 1 },
4590 { MISCPERR_F, "MPS TRC misc parity error", -1, 1 },
4591 { 0 }
4592 };
4593 static const struct intr_info mps_stat_sram_intr_info[] = {
4594 { 0x1fffff, "MPS statistics SRAM parity error", -1, 1 },
4595 { 0 }
4596 };
4597 static const struct intr_info mps_stat_tx_intr_info[] = {
4598 { 0xfffff, "MPS statistics Tx FIFO parity error", -1, 1 },
4599 { 0 }
4600 };
4601 static const struct intr_info mps_stat_rx_intr_info[] = {
4602 { 0xffffff, "MPS statistics Rx FIFO parity error", -1, 1 },
4603 { 0 }
4604 };
4605 static const struct intr_info mps_cls_intr_info[] = {
4606 { MATCHSRAM_F, "MPS match SRAM parity error", -1, 1 },
4607 { MATCHTCAM_F, "MPS match TCAM parity error", -1, 1 },
4608 { HASHSRAM_F, "MPS hash SRAM parity error", -1, 1 },
4609 { 0 }
4610 };
4611
4612 int fat;
4613
4614 fat = t4_handle_intr_status(adapter, MPS_RX_PERR_INT_CAUSE_A,
4615 mps_rx_intr_info) +
4616 t4_handle_intr_status(adapter, MPS_TX_INT_CAUSE_A,
4617 is_t6(adapter->params.chip)
4618 ? t6_mps_tx_intr_info
4619 : mps_tx_intr_info) +
4620 t4_handle_intr_status(adapter, MPS_TRC_INT_CAUSE_A,
4621 mps_trc_intr_info) +
4622 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_SRAM_A,
4623 mps_stat_sram_intr_info) +
4624 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_TX_FIFO_A,
4625 mps_stat_tx_intr_info) +
4626 t4_handle_intr_status(adapter, MPS_STAT_PERR_INT_CAUSE_RX_FIFO_A,
4627 mps_stat_rx_intr_info) +
4628 t4_handle_intr_status(adapter, MPS_CLS_INT_CAUSE_A,
4629 mps_cls_intr_info);
4630
4631 t4_write_reg(adapter, MPS_INT_CAUSE_A, 0);
4632 t4_read_reg(adapter, MPS_INT_CAUSE_A);
4633 if (fat)
4634 t4_fatal_err(adapter);
4635}
4636
4637#define MEM_INT_MASK (PERR_INT_CAUSE_F | ECC_CE_INT_CAUSE_F | \
4638 ECC_UE_INT_CAUSE_F)
4639
4640
4641
4642
4643static void mem_intr_handler(struct adapter *adapter, int idx)
4644{
4645 static const char name[4][7] = { "EDC0", "EDC1", "MC/MC0", "MC1" };
4646
4647 unsigned int addr, cnt_addr, v;
4648
4649 if (idx <= MEM_EDC1) {
4650 addr = EDC_REG(EDC_INT_CAUSE_A, idx);
4651 cnt_addr = EDC_REG(EDC_ECC_STATUS_A, idx);
4652 } else if (idx == MEM_MC) {
4653 if (is_t4(adapter->params.chip)) {
4654 addr = MC_INT_CAUSE_A;
4655 cnt_addr = MC_ECC_STATUS_A;
4656 } else {
4657 addr = MC_P_INT_CAUSE_A;
4658 cnt_addr = MC_P_ECC_STATUS_A;
4659 }
4660 } else {
4661 addr = MC_REG(MC_P_INT_CAUSE_A, 1);
4662 cnt_addr = MC_REG(MC_P_ECC_STATUS_A, 1);
4663 }
4664
4665 v = t4_read_reg(adapter, addr) & MEM_INT_MASK;
4666 if (v & PERR_INT_CAUSE_F)
4667 dev_alert(adapter->pdev_dev, "%s FIFO parity error\n",
4668 name[idx]);
4669 if (v & ECC_CE_INT_CAUSE_F) {
4670 u32 cnt = ECC_CECNT_G(t4_read_reg(adapter, cnt_addr));
4671
4672 t4_edc_err_read(adapter, idx);
4673
4674 t4_write_reg(adapter, cnt_addr, ECC_CECNT_V(ECC_CECNT_M));
4675 if (printk_ratelimit())
4676 dev_warn(adapter->pdev_dev,
4677 "%u %s correctable ECC data error%s\n",
4678 cnt, name[idx], cnt > 1 ? "s" : "");
4679 }
4680 if (v & ECC_UE_INT_CAUSE_F)
4681 dev_alert(adapter->pdev_dev,
4682 "%s uncorrectable ECC data error\n", name[idx]);
4683
4684 t4_write_reg(adapter, addr, v);
4685 if (v & (PERR_INT_CAUSE_F | ECC_UE_INT_CAUSE_F))
4686 t4_fatal_err(adapter);
4687}
4688
4689
4690
4691
4692static void ma_intr_handler(struct adapter *adap)
4693{
4694 u32 v, status = t4_read_reg(adap, MA_INT_CAUSE_A);
4695
4696 if (status & MEM_PERR_INT_CAUSE_F) {
4697 dev_alert(adap->pdev_dev,
4698 "MA parity error, parity status %#x\n",
4699 t4_read_reg(adap, MA_PARITY_ERROR_STATUS1_A));
4700 if (is_t5(adap->params.chip))
4701 dev_alert(adap->pdev_dev,
4702 "MA parity error, parity status %#x\n",
4703 t4_read_reg(adap,
4704 MA_PARITY_ERROR_STATUS2_A));
4705 }
4706 if (status & MEM_WRAP_INT_CAUSE_F) {
4707 v = t4_read_reg(adap, MA_INT_WRAP_STATUS_A);
4708 dev_alert(adap->pdev_dev, "MA address wrap-around error by "
4709 "client %u to address %#x\n",
4710 MEM_WRAP_CLIENT_NUM_G(v),
4711 MEM_WRAP_ADDRESS_G(v) << 4);
4712 }
4713 t4_write_reg(adap, MA_INT_CAUSE_A, status);
4714 t4_fatal_err(adap);
4715}
4716
4717
4718
4719
4720static void smb_intr_handler(struct adapter *adap)
4721{
4722 static const struct intr_info smb_intr_info[] = {
4723 { MSTTXFIFOPARINT_F, "SMB master Tx FIFO parity error", -1, 1 },
4724 { MSTRXFIFOPARINT_F, "SMB master Rx FIFO parity error", -1, 1 },
4725 { SLVFIFOPARINT_F, "SMB slave FIFO parity error", -1, 1 },
4726 { 0 }
4727 };
4728
4729 if (t4_handle_intr_status(adap, SMB_INT_CAUSE_A, smb_intr_info))
4730 t4_fatal_err(adap);
4731}
4732
4733
4734
4735
4736static void ncsi_intr_handler(struct adapter *adap)
4737{
4738 static const struct intr_info ncsi_intr_info[] = {
4739 { CIM_DM_PRTY_ERR_F, "NC-SI CIM parity error", -1, 1 },
4740 { MPS_DM_PRTY_ERR_F, "NC-SI MPS parity error", -1, 1 },
4741 { TXFIFO_PRTY_ERR_F, "NC-SI Tx FIFO parity error", -1, 1 },
4742 { RXFIFO_PRTY_ERR_F, "NC-SI Rx FIFO parity error", -1, 1 },
4743 { 0 }
4744 };
4745
4746 if (t4_handle_intr_status(adap, NCSI_INT_CAUSE_A, ncsi_intr_info))
4747 t4_fatal_err(adap);
4748}
4749
4750
4751
4752
4753static void xgmac_intr_handler(struct adapter *adap, int port)
4754{
4755 u32 v, int_cause_reg;
4756
4757 if (is_t4(adap->params.chip))
4758 int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE_A);
4759 else
4760 int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE_A);
4761
4762 v = t4_read_reg(adap, int_cause_reg);
4763
4764 v &= TXFIFO_PRTY_ERR_F | RXFIFO_PRTY_ERR_F;
4765 if (!v)
4766 return;
4767
4768 if (v & TXFIFO_PRTY_ERR_F)
4769 dev_alert(adap->pdev_dev, "XGMAC %d Tx FIFO parity error\n",
4770 port);
4771 if (v & RXFIFO_PRTY_ERR_F)
4772 dev_alert(adap->pdev_dev, "XGMAC %d Rx FIFO parity error\n",
4773 port);
4774 t4_write_reg(adap, PORT_REG(port, XGMAC_PORT_INT_CAUSE_A), v);
4775 t4_fatal_err(adap);
4776}
4777
4778
4779
4780
4781static void pl_intr_handler(struct adapter *adap)
4782{
4783 static const struct intr_info pl_intr_info[] = {
4784 { FATALPERR_F, "T4 fatal parity error", -1, 1 },
4785 { PERRVFID_F, "PL VFID_MAP parity error", -1, 1 },
4786 { 0 }
4787 };
4788
4789 if (t4_handle_intr_status(adap, PL_PL_INT_CAUSE_A, pl_intr_info))
4790 t4_fatal_err(adap);
4791}
4792
4793#define PF_INTR_MASK (PFSW_F)
4794#define GLBL_INTR_MASK (CIM_F | MPS_F | PL_F | PCIE_F | MC_F | EDC0_F | \
4795 EDC1_F | LE_F | TP_F | MA_F | PM_TX_F | PM_RX_F | ULP_RX_F | \
4796 CPL_SWITCH_F | SGE_F | ULP_TX_F | SF_F)
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806int t4_slow_intr_handler(struct adapter *adapter)
4807{
4808 u32 cause = t4_read_reg(adapter, PL_INT_CAUSE_A);
4809
4810 if (!(cause & GLBL_INTR_MASK))
4811 return 0;
4812 if (cause & CIM_F)
4813 cim_intr_handler(adapter);
4814 if (cause & MPS_F)
4815 mps_intr_handler(adapter);
4816 if (cause & NCSI_F)
4817 ncsi_intr_handler(adapter);
4818 if (cause & PL_F)
4819 pl_intr_handler(adapter);
4820 if (cause & SMB_F)
4821 smb_intr_handler(adapter);
4822 if (cause & XGMAC0_F)
4823 xgmac_intr_handler(adapter, 0);
4824 if (cause & XGMAC1_F)
4825 xgmac_intr_handler(adapter, 1);
4826 if (cause & XGMAC_KR0_F)
4827 xgmac_intr_handler(adapter, 2);
4828 if (cause & XGMAC_KR1_F)
4829 xgmac_intr_handler(adapter, 3);
4830 if (cause & PCIE_F)
4831 pcie_intr_handler(adapter);
4832 if (cause & MC_F)
4833 mem_intr_handler(adapter, MEM_MC);
4834 if (is_t5(adapter->params.chip) && (cause & MC1_F))
4835 mem_intr_handler(adapter, MEM_MC1);
4836 if (cause & EDC0_F)
4837 mem_intr_handler(adapter, MEM_EDC0);
4838 if (cause & EDC1_F)
4839 mem_intr_handler(adapter, MEM_EDC1);
4840 if (cause & LE_F)
4841 le_intr_handler(adapter);
4842 if (cause & TP_F)
4843 tp_intr_handler(adapter);
4844 if (cause & MA_F)
4845 ma_intr_handler(adapter);
4846 if (cause & PM_TX_F)
4847 pmtx_intr_handler(adapter);
4848 if (cause & PM_RX_F)
4849 pmrx_intr_handler(adapter);
4850 if (cause & ULP_RX_F)
4851 ulprx_intr_handler(adapter);
4852 if (cause & CPL_SWITCH_F)
4853 cplsw_intr_handler(adapter);
4854 if (cause & SGE_F)
4855 sge_intr_handler(adapter);
4856 if (cause & ULP_TX_F)
4857 ulptx_intr_handler(adapter);
4858
4859
4860 t4_write_reg(adapter, PL_INT_CAUSE_A, cause & GLBL_INTR_MASK);
4861 (void)t4_read_reg(adapter, PL_INT_CAUSE_A);
4862 return 1;
4863}
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878void t4_intr_enable(struct adapter *adapter)
4879{
4880 u32 val = 0;
4881 u32 whoami = t4_read_reg(adapter, PL_WHOAMI_A);
4882 u32 pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ?
4883 SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami);
4884
4885 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
4886 val = ERR_DROPPED_DB_F | ERR_EGR_CTXT_PRIO_F | DBFIFO_HP_INT_F;
4887 t4_write_reg(adapter, SGE_INT_ENABLE3_A, ERR_CPL_EXCEED_IQE_SIZE_F |
4888 ERR_INVALID_CIDX_INC_F | ERR_CPL_OPCODE_0_F |
4889 ERR_DATA_CPL_ON_HIGH_QID1_F | INGRESS_SIZE_ERR_F |
4890 ERR_DATA_CPL_ON_HIGH_QID0_F | ERR_BAD_DB_PIDX3_F |
4891 ERR_BAD_DB_PIDX2_F | ERR_BAD_DB_PIDX1_F |
4892 ERR_BAD_DB_PIDX0_F | ERR_ING_CTXT_PRIO_F |
4893 DBFIFO_LP_INT_F | EGRESS_SIZE_ERR_F | val);
4894 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), PF_INTR_MASK);
4895 t4_set_reg_field(adapter, PL_INT_MAP0_A, 0, 1 << pf);
4896}
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906void t4_intr_disable(struct adapter *adapter)
4907{
4908 u32 whoami, pf;
4909
4910 if (pci_channel_offline(adapter->pdev))
4911 return;
4912
4913 whoami = t4_read_reg(adapter, PL_WHOAMI_A);
4914 pf = CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5 ?
4915 SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami);
4916
4917 t4_write_reg(adapter, MYPF_REG(PL_PF_INT_ENABLE_A), 0);
4918 t4_set_reg_field(adapter, PL_INT_MAP0_A, 1 << pf, 0);
4919}
4920
4921unsigned int t4_chip_rss_size(struct adapter *adap)
4922{
4923 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
4924 return RSS_NENTRIES;
4925 else
4926 return T6_RSS_NENTRIES;
4927}
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
4947 int start, int n, const u16 *rspq, unsigned int nrspq)
4948{
4949 int ret;
4950 const u16 *rsp = rspq;
4951 const u16 *rsp_end = rspq + nrspq;
4952 struct fw_rss_ind_tbl_cmd cmd;
4953
4954 memset(&cmd, 0, sizeof(cmd));
4955 cmd.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_IND_TBL_CMD) |
4956 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
4957 FW_RSS_IND_TBL_CMD_VIID_V(viid));
4958 cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd));
4959
4960
4961 while (n > 0) {
4962 int nq = min(n, 32);
4963 __be32 *qp = &cmd.iq0_to_iq2;
4964
4965 cmd.niqid = cpu_to_be16(nq);
4966 cmd.startidx = cpu_to_be16(start);
4967
4968 start += nq;
4969 n -= nq;
4970
4971 while (nq > 0) {
4972 unsigned int v;
4973
4974 v = FW_RSS_IND_TBL_CMD_IQ0_V(*rsp);
4975 if (++rsp >= rsp_end)
4976 rsp = rspq;
4977 v |= FW_RSS_IND_TBL_CMD_IQ1_V(*rsp);
4978 if (++rsp >= rsp_end)
4979 rsp = rspq;
4980 v |= FW_RSS_IND_TBL_CMD_IQ2_V(*rsp);
4981 if (++rsp >= rsp_end)
4982 rsp = rspq;
4983
4984 *qp++ = cpu_to_be32(v);
4985 nq -= 3;
4986 }
4987
4988 ret = t4_wr_mbox(adapter, mbox, &cmd, sizeof(cmd), NULL);
4989 if (ret)
4990 return ret;
4991 }
4992 return 0;
4993}
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
5005 unsigned int flags)
5006{
5007 struct fw_rss_glb_config_cmd c;
5008
5009 memset(&c, 0, sizeof(c));
5010 c.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_RSS_GLB_CONFIG_CMD) |
5011 FW_CMD_REQUEST_F | FW_CMD_WRITE_F);
5012 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
5013 if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_MANUAL) {
5014 c.u.manual.mode_pkd =
5015 cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode));
5016 } else if (mode == FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) {
5017 c.u.basicvirtual.mode_pkd =
5018 cpu_to_be32(FW_RSS_GLB_CONFIG_CMD_MODE_V(mode));
5019 c.u.basicvirtual.synmapen_to_hashtoeplitz = cpu_to_be32(flags);
5020 } else
5021 return -EINVAL;
5022 return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
5023}
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
5036 unsigned int flags, unsigned int defq)
5037{
5038 struct fw_rss_vi_config_cmd c;
5039
5040 memset(&c, 0, sizeof(c));
5041 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) |
5042 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
5043 FW_RSS_VI_CONFIG_CMD_VIID_V(viid));
5044 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
5045 c.u.basicvirtual.defaultq_to_udpen = cpu_to_be32(flags |
5046 FW_RSS_VI_CONFIG_CMD_DEFAULTQ_V(defq));
5047 return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
5048}
5049
5050
5051static int rd_rss_row(struct adapter *adap, int row, u32 *val)
5052{
5053 t4_write_reg(adap, TP_RSS_LKP_TABLE_A, 0xfff00000 | row);
5054 return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE_A, LKPTBLROWVLD_F, 1,
5055 5, 0, val);
5056}
5057
5058
5059
5060
5061
5062
5063
5064
5065int t4_read_rss(struct adapter *adapter, u16 *map)
5066{
5067 int i, ret, nentries;
5068 u32 val;
5069
5070 nentries = t4_chip_rss_size(adapter);
5071 for (i = 0; i < nentries / 2; ++i) {
5072 ret = rd_rss_row(adapter, i, &val);
5073 if (ret)
5074 return ret;
5075 *map++ = LKPTBLQUEUE0_G(val);
5076 *map++ = LKPTBLQUEUE1_G(val);
5077 }
5078 return 0;
5079}
5080
5081static unsigned int t4_use_ldst(struct adapter *adap)
5082{
5083 return (adap->flags & FW_OK) && !adap->use_bd;
5084}
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098static int t4_tp_fw_ldst_rw(struct adapter *adap, int cmd, u32 *vals,
5099 unsigned int nregs, unsigned int start_index,
5100 unsigned int rw, bool sleep_ok)
5101{
5102 int ret = 0;
5103 unsigned int i;
5104 struct fw_ldst_cmd c;
5105
5106 for (i = 0; i < nregs; i++) {
5107 memset(&c, 0, sizeof(c));
5108 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
5109 FW_CMD_REQUEST_F |
5110 (rw ? FW_CMD_READ_F :
5111 FW_CMD_WRITE_F) |
5112 FW_LDST_CMD_ADDRSPACE_V(cmd));
5113 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
5114
5115 c.u.addrval.addr = cpu_to_be32(start_index + i);
5116 c.u.addrval.val = rw ? 0 : cpu_to_be32(vals[i]);
5117 ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c,
5118 sleep_ok);
5119 if (ret)
5120 return ret;
5121
5122 if (rw)
5123 vals[i] = be32_to_cpu(c.u.addrval.val);
5124 }
5125 return 0;
5126}
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142static void t4_tp_indirect_rw(struct adapter *adap, u32 reg_addr, u32 reg_data,
5143 u32 *buff, u32 nregs, u32 start_index, int rw,
5144 bool sleep_ok)
5145{
5146 int rc = -EINVAL;
5147 int cmd;
5148
5149 switch (reg_addr) {
5150 case TP_PIO_ADDR_A:
5151 cmd = FW_LDST_ADDRSPC_TP_PIO;
5152 break;
5153 case TP_TM_PIO_ADDR_A:
5154 cmd = FW_LDST_ADDRSPC_TP_TM_PIO;
5155 break;
5156 case TP_MIB_INDEX_A:
5157 cmd = FW_LDST_ADDRSPC_TP_MIB;
5158 break;
5159 default:
5160 goto indirect_access;
5161 }
5162
5163 if (t4_use_ldst(adap))
5164 rc = t4_tp_fw_ldst_rw(adap, cmd, buff, nregs, start_index, rw,
5165 sleep_ok);
5166
5167indirect_access:
5168
5169 if (rc) {
5170 if (rw)
5171 t4_read_indirect(adap, reg_addr, reg_data, buff, nregs,
5172 start_index);
5173 else
5174 t4_write_indirect(adap, reg_addr, reg_data, buff, nregs,
5175 start_index);
5176 }
5177}
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189void t4_tp_pio_read(struct adapter *adap, u32 *buff, u32 nregs,
5190 u32 start_index, bool sleep_ok)
5191{
5192 t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs,
5193 start_index, 1, sleep_ok);
5194}
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206static void t4_tp_pio_write(struct adapter *adap, u32 *buff, u32 nregs,
5207 u32 start_index, bool sleep_ok)
5208{
5209 t4_tp_indirect_rw(adap, TP_PIO_ADDR_A, TP_PIO_DATA_A, buff, nregs,
5210 start_index, 0, sleep_ok);
5211}
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223void t4_tp_tm_pio_read(struct adapter *adap, u32 *buff, u32 nregs,
5224 u32 start_index, bool sleep_ok)
5225{
5226 t4_tp_indirect_rw(adap, TP_TM_PIO_ADDR_A, TP_TM_PIO_DATA_A, buff,
5227 nregs, start_index, 1, sleep_ok);
5228}
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240void t4_tp_mib_read(struct adapter *adap, u32 *buff, u32 nregs, u32 start_index,
5241 bool sleep_ok)
5242{
5243 t4_tp_indirect_rw(adap, TP_MIB_INDEX_A, TP_MIB_DATA_A, buff, nregs,
5244 start_index, 1, sleep_ok);
5245}
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255void t4_read_rss_key(struct adapter *adap, u32 *key, bool sleep_ok)
5256{
5257 t4_tp_pio_read(adap, key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok);
5258}
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271void t4_write_rss_key(struct adapter *adap, const u32 *key, int idx,
5272 bool sleep_ok)
5273{
5274 u8 rss_key_addr_cnt = 16;
5275 u32 vrt = t4_read_reg(adap, TP_RSS_CONFIG_VRT_A);
5276
5277
5278
5279
5280
5281 if ((CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) &&
5282 (vrt & KEYEXTEND_F) && (KEYMODE_G(vrt) == 3))
5283 rss_key_addr_cnt = 32;
5284
5285 t4_tp_pio_write(adap, (void *)key, 10, TP_RSS_SECRET_KEY0_A, sleep_ok);
5286
5287 if (idx >= 0 && idx < rss_key_addr_cnt) {
5288 if (rss_key_addr_cnt > 16)
5289 t4_write_reg(adap, TP_RSS_CONFIG_VRT_A,
5290 KEYWRADDRX_V(idx >> 4) |
5291 T6_VFWRADDR_V(idx) | KEYWREN_F);
5292 else
5293 t4_write_reg(adap, TP_RSS_CONFIG_VRT_A,
5294 KEYWRADDR_V(idx) | KEYWREN_F);
5295 }
5296}
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308void t4_read_rss_pf_config(struct adapter *adapter, unsigned int index,
5309 u32 *valp, bool sleep_ok)
5310{
5311 t4_tp_pio_read(adapter, valp, 1, TP_RSS_PF0_CONFIG_A + index, sleep_ok);
5312}
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325void t4_read_rss_vf_config(struct adapter *adapter, unsigned int index,
5326 u32 *vfl, u32 *vfh, bool sleep_ok)
5327{
5328 u32 vrt, mask, data;
5329
5330 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) {
5331 mask = VFWRADDR_V(VFWRADDR_M);
5332 data = VFWRADDR_V(index);
5333 } else {
5334 mask = T6_VFWRADDR_V(T6_VFWRADDR_M);
5335 data = T6_VFWRADDR_V(index);
5336 }
5337
5338
5339
5340 vrt = t4_read_reg(adapter, TP_RSS_CONFIG_VRT_A);
5341 vrt &= ~(VFRDRG_F | VFWREN_F | KEYWREN_F | mask);
5342 vrt |= data | VFRDEN_F;
5343 t4_write_reg(adapter, TP_RSS_CONFIG_VRT_A, vrt);
5344
5345
5346
5347 t4_tp_pio_read(adapter, vfl, 1, TP_RSS_VFL_CONFIG_A, sleep_ok);
5348 t4_tp_pio_read(adapter, vfh, 1, TP_RSS_VFH_CONFIG_A, sleep_ok);
5349}
5350
5351
5352
5353
5354
5355
5356
5357
5358u32 t4_read_rss_pf_map(struct adapter *adapter, bool sleep_ok)
5359{
5360 u32 pfmap;
5361
5362 t4_tp_pio_read(adapter, &pfmap, 1, TP_RSS_PF_MAP_A, sleep_ok);
5363 return pfmap;
5364}
5365
5366
5367
5368
5369
5370
5371
5372
5373u32 t4_read_rss_pf_mask(struct adapter *adapter, bool sleep_ok)
5374{
5375 u32 pfmask;
5376
5377 t4_tp_pio_read(adapter, &pfmask, 1, TP_RSS_PF_MSK_A, sleep_ok);
5378 return pfmask;
5379}
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
5392 struct tp_tcp_stats *v6, bool sleep_ok)
5393{
5394 u32 val[TP_MIB_TCP_RXT_SEG_LO_A - TP_MIB_TCP_OUT_RST_A + 1];
5395
5396#define STAT_IDX(x) ((TP_MIB_TCP_##x##_A) - TP_MIB_TCP_OUT_RST_A)
5397#define STAT(x) val[STAT_IDX(x)]
5398#define STAT64(x) (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
5399
5400 if (v4) {
5401 t4_tp_mib_read(adap, val, ARRAY_SIZE(val),
5402 TP_MIB_TCP_OUT_RST_A, sleep_ok);
5403 v4->tcp_out_rsts = STAT(OUT_RST);
5404 v4->tcp_in_segs = STAT64(IN_SEG);
5405 v4->tcp_out_segs = STAT64(OUT_SEG);
5406 v4->tcp_retrans_segs = STAT64(RXT_SEG);
5407 }
5408 if (v6) {
5409 t4_tp_mib_read(adap, val, ARRAY_SIZE(val),
5410 TP_MIB_TCP_V6OUT_RST_A, sleep_ok);
5411 v6->tcp_out_rsts = STAT(OUT_RST);
5412 v6->tcp_in_segs = STAT64(IN_SEG);
5413 v6->tcp_out_segs = STAT64(OUT_SEG);
5414 v6->tcp_retrans_segs = STAT64(RXT_SEG);
5415 }
5416#undef STAT64
5417#undef STAT
5418#undef STAT_IDX
5419}
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st,
5430 bool sleep_ok)
5431{
5432 int nchan = adap->params.arch.nchan;
5433
5434 t4_tp_mib_read(adap, st->mac_in_errs, nchan, TP_MIB_MAC_IN_ERR_0_A,
5435 sleep_ok);
5436 t4_tp_mib_read(adap, st->hdr_in_errs, nchan, TP_MIB_HDR_IN_ERR_0_A,
5437 sleep_ok);
5438 t4_tp_mib_read(adap, st->tcp_in_errs, nchan, TP_MIB_TCP_IN_ERR_0_A,
5439 sleep_ok);
5440 t4_tp_mib_read(adap, st->tnl_cong_drops, nchan,
5441 TP_MIB_TNL_CNG_DROP_0_A, sleep_ok);
5442 t4_tp_mib_read(adap, st->ofld_chan_drops, nchan,
5443 TP_MIB_OFD_CHN_DROP_0_A, sleep_ok);
5444 t4_tp_mib_read(adap, st->tnl_tx_drops, nchan, TP_MIB_TNL_DROP_0_A,
5445 sleep_ok);
5446 t4_tp_mib_read(adap, st->ofld_vlan_drops, nchan,
5447 TP_MIB_OFD_VLN_DROP_0_A, sleep_ok);
5448 t4_tp_mib_read(adap, st->tcp6_in_errs, nchan,
5449 TP_MIB_TCP_V6IN_ERR_0_A, sleep_ok);
5450 t4_tp_mib_read(adap, &st->ofld_no_neigh, 2, TP_MIB_OFD_ARP_DROP_A,
5451 sleep_ok);
5452}
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462void t4_tp_get_cpl_stats(struct adapter *adap, struct tp_cpl_stats *st,
5463 bool sleep_ok)
5464{
5465 int nchan = adap->params.arch.nchan;
5466
5467 t4_tp_mib_read(adap, st->req, nchan, TP_MIB_CPL_IN_REQ_0_A, sleep_ok);
5468
5469 t4_tp_mib_read(adap, st->rsp, nchan, TP_MIB_CPL_OUT_RSP_0_A, sleep_ok);
5470}
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480void t4_tp_get_rdma_stats(struct adapter *adap, struct tp_rdma_stats *st,
5481 bool sleep_ok)
5482{
5483 t4_tp_mib_read(adap, &st->rqe_dfr_pkt, 2, TP_MIB_RQE_DFR_PKT_A,
5484 sleep_ok);
5485}
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496void t4_get_fcoe_stats(struct adapter *adap, unsigned int idx,
5497 struct tp_fcoe_stats *st, bool sleep_ok)
5498{
5499 u32 val[2];
5500
5501 t4_tp_mib_read(adap, &st->frames_ddp, 1, TP_MIB_FCOE_DDP_0_A + idx,
5502 sleep_ok);
5503
5504 t4_tp_mib_read(adap, &st->frames_drop, 1,
5505 TP_MIB_FCOE_DROP_0_A + idx, sleep_ok);
5506
5507 t4_tp_mib_read(adap, val, 2, TP_MIB_FCOE_BYTE_0_HI_A + 2 * idx,
5508 sleep_ok);
5509
5510 st->octets_ddp = ((u64)val[0] << 32) | val[1];
5511}
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st,
5522 bool sleep_ok)
5523{
5524 u32 val[4];
5525
5526 t4_tp_mib_read(adap, val, 4, TP_MIB_USM_PKTS_A, sleep_ok);
5527 st->frames = val[0];
5528 st->drops = val[1];
5529 st->octets = ((u64)val[2] << 32) | val[3];
5530}
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log)
5541{
5542 u32 v;
5543 int i;
5544
5545 for (i = 0; i < NMTUS; ++i) {
5546 t4_write_reg(adap, TP_MTU_TABLE_A,
5547 MTUINDEX_V(0xff) | MTUVALUE_V(i));
5548 v = t4_read_reg(adap, TP_MTU_TABLE_A);
5549 mtus[i] = MTUVALUE_G(v);
5550 if (mtu_log)
5551 mtu_log[i] = MTUWIDTH_G(v);
5552 }
5553}
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563void t4_read_cong_tbl(struct adapter *adap, u16 incr[NMTUS][NCCTRL_WIN])
5564{
5565 unsigned int mtu, w;
5566
5567 for (mtu = 0; mtu < NMTUS; ++mtu)
5568 for (w = 0; w < NCCTRL_WIN; ++w) {
5569 t4_write_reg(adap, TP_CCTRL_TABLE_A,
5570 ROWINDEX_V(0xffff) | (mtu << 5) | w);
5571 incr[mtu][w] = (u16)t4_read_reg(adap,
5572 TP_CCTRL_TABLE_A) & 0x1fff;
5573 }
5574}
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
5586 unsigned int mask, unsigned int val)
5587{
5588 t4_write_reg(adap, TP_PIO_ADDR_A, addr);
5589 val |= t4_read_reg(adap, TP_PIO_DATA_A) & ~mask;
5590 t4_write_reg(adap, TP_PIO_DATA_A, val);
5591}
5592
5593
5594
5595
5596
5597
5598
5599
5600static void init_cong_ctrl(unsigned short *a, unsigned short *b)
5601{
5602 a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = 1;
5603 a[9] = 2;
5604 a[10] = 3;
5605 a[11] = 4;
5606 a[12] = 5;
5607 a[13] = 6;
5608 a[14] = 7;
5609 a[15] = 8;
5610 a[16] = 9;
5611 a[17] = 10;
5612 a[18] = 14;
5613 a[19] = 17;
5614 a[20] = 21;
5615 a[21] = 25;
5616 a[22] = 30;
5617 a[23] = 35;
5618 a[24] = 45;
5619 a[25] = 60;
5620 a[26] = 80;
5621 a[27] = 100;
5622 a[28] = 200;
5623 a[29] = 300;
5624 a[30] = 400;
5625 a[31] = 500;
5626
5627 b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = b[6] = b[7] = b[8] = 0;
5628 b[9] = b[10] = 1;
5629 b[11] = b[12] = 2;
5630 b[13] = b[14] = b[15] = b[16] = 3;
5631 b[17] = b[18] = b[19] = b[20] = b[21] = 4;
5632 b[22] = b[23] = b[24] = b[25] = b[26] = b[27] = 5;
5633 b[28] = b[29] = 6;
5634 b[30] = b[31] = 7;
5635}
5636
5637
5638#define CC_MIN_INCR 2U
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
5653 const unsigned short *alpha, const unsigned short *beta)
5654{
5655 static const unsigned int avg_pkts[NCCTRL_WIN] = {
5656 2, 6, 10, 14, 20, 28, 40, 56, 80, 112, 160, 224, 320, 448, 640,
5657 896, 1281, 1792, 2560, 3584, 5120, 7168, 10240, 14336, 20480,
5658 28672, 40960, 57344, 81920, 114688, 163840, 229376
5659 };
5660
5661 unsigned int i, w;
5662
5663 for (i = 0; i < NMTUS; ++i) {
5664 unsigned int mtu = mtus[i];
5665 unsigned int log2 = fls(mtu);
5666
5667 if (!(mtu & ((1 << log2) >> 2)))
5668 log2--;
5669 t4_write_reg(adap, TP_MTU_TABLE_A, MTUINDEX_V(i) |
5670 MTUWIDTH_V(log2) | MTUVALUE_V(mtu));
5671
5672 for (w = 0; w < NCCTRL_WIN; ++w) {
5673 unsigned int inc;
5674
5675 inc = max(((mtu - 40) * alpha[w]) / avg_pkts[w],
5676 CC_MIN_INCR);
5677
5678 t4_write_reg(adap, TP_CCTRL_TABLE_A, (i << 21) |
5679 (w << 16) | (beta[w] << 13) | inc);
5680 }
5681 }
5682}
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693static u64 chan_rate(struct adapter *adap, unsigned int bytes256)
5694{
5695 u64 v = bytes256 * adap->params.vpd.cclk;
5696
5697 return v * 62 + v / 2;
5698}
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709void t4_get_chan_txrate(struct adapter *adap, u64 *nic_rate, u64 *ofld_rate)
5710{
5711 u32 v;
5712
5713 v = t4_read_reg(adap, TP_TX_TRATE_A);
5714 nic_rate[0] = chan_rate(adap, TNLRATE0_G(v));
5715 nic_rate[1] = chan_rate(adap, TNLRATE1_G(v));
5716 if (adap->params.arch.nchan == NCHAN) {
5717 nic_rate[2] = chan_rate(adap, TNLRATE2_G(v));
5718 nic_rate[3] = chan_rate(adap, TNLRATE3_G(v));
5719 }
5720
5721 v = t4_read_reg(adap, TP_TX_ORATE_A);
5722 ofld_rate[0] = chan_rate(adap, OFDRATE0_G(v));
5723 ofld_rate[1] = chan_rate(adap, OFDRATE1_G(v));
5724 if (adap->params.arch.nchan == NCHAN) {
5725 ofld_rate[2] = chan_rate(adap, OFDRATE2_G(v));
5726 ofld_rate[3] = chan_rate(adap, OFDRATE3_G(v));
5727 }
5728}
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp,
5742 int idx, int enable)
5743{
5744 int i, ofst = idx * 4;
5745 u32 data_reg, mask_reg, cfg;
5746 u32 multitrc = TRCMULTIFILTER_F;
5747
5748 if (!enable) {
5749 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0);
5750 return 0;
5751 }
5752
5753 cfg = t4_read_reg(adap, MPS_TRC_CFG_A);
5754 if (cfg & TRCMULTIFILTER_F) {
5755
5756
5757
5758
5759 if (tp->snap_len > ((10 * 1024 / 4) - (2 * 8)))
5760 return -EINVAL;
5761 } else {
5762
5763
5764
5765
5766 multitrc = 0;
5767 if (tp->snap_len > 9600 || idx)
5768 return -EINVAL;
5769 }
5770
5771 if (tp->port > (is_t4(adap->params.chip) ? 11 : 19) || tp->invert > 1 ||
5772 tp->skip_len > TFLENGTH_M || tp->skip_ofst > TFOFFSET_M ||
5773 tp->min_len > TFMINPKTSIZE_M)
5774 return -EINVAL;
5775
5776
5777 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst, 0);
5778
5779 idx *= (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A);
5780 data_reg = MPS_TRC_FILTER0_MATCH_A + idx;
5781 mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + idx;
5782
5783 for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
5784 t4_write_reg(adap, data_reg, tp->data[i]);
5785 t4_write_reg(adap, mask_reg, ~tp->mask[i]);
5786 }
5787 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst,
5788 TFCAPTUREMAX_V(tp->snap_len) |
5789 TFMINPKTSIZE_V(tp->min_len));
5790 t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst,
5791 TFOFFSET_V(tp->skip_ofst) | TFLENGTH_V(tp->skip_len) |
5792 (is_t4(adap->params.chip) ?
5793 TFPORT_V(tp->port) | TFEN_F | TFINVERTMATCH_V(tp->invert) :
5794 T5_TFPORT_V(tp->port) | T5_TFEN_F |
5795 T5_TFINVERTMATCH_V(tp->invert)));
5796
5797 return 0;
5798}
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx,
5810 int *enabled)
5811{
5812 u32 ctla, ctlb;
5813 int i, ofst = idx * 4;
5814 u32 data_reg, mask_reg;
5815
5816 ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A_A + ofst);
5817 ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B_A + ofst);
5818
5819 if (is_t4(adap->params.chip)) {
5820 *enabled = !!(ctla & TFEN_F);
5821 tp->port = TFPORT_G(ctla);
5822 tp->invert = !!(ctla & TFINVERTMATCH_F);
5823 } else {
5824 *enabled = !!(ctla & T5_TFEN_F);
5825 tp->port = T5_TFPORT_G(ctla);
5826 tp->invert = !!(ctla & T5_TFINVERTMATCH_F);
5827 }
5828 tp->snap_len = TFCAPTUREMAX_G(ctlb);
5829 tp->min_len = TFMINPKTSIZE_G(ctlb);
5830 tp->skip_ofst = TFOFFSET_G(ctla);
5831 tp->skip_len = TFLENGTH_G(ctla);
5832
5833 ofst = (MPS_TRC_FILTER1_MATCH_A - MPS_TRC_FILTER0_MATCH_A) * idx;
5834 data_reg = MPS_TRC_FILTER0_MATCH_A + ofst;
5835 mask_reg = MPS_TRC_FILTER0_DONT_CARE_A + ofst;
5836
5837 for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
5838 tp->mask[i] = ~t4_read_reg(adap, mask_reg);
5839 tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i];
5840 }
5841}
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851void t4_pmtx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
5852{
5853 int i;
5854 u32 data[2];
5855
5856 for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) {
5857 t4_write_reg(adap, PM_TX_STAT_CONFIG_A, i + 1);
5858 cnt[i] = t4_read_reg(adap, PM_TX_STAT_COUNT_A);
5859 if (is_t4(adap->params.chip)) {
5860 cycles[i] = t4_read_reg64(adap, PM_TX_STAT_LSB_A);
5861 } else {
5862 t4_read_indirect(adap, PM_TX_DBG_CTRL_A,
5863 PM_TX_DBG_DATA_A, data, 2,
5864 PM_TX_DBG_STAT_MSB_A);
5865 cycles[i] = (((u64)data[0] << 32) | data[1]);
5866 }
5867 }
5868}
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878void t4_pmrx_get_stats(struct adapter *adap, u32 cnt[], u64 cycles[])
5879{
5880 int i;
5881 u32 data[2];
5882
5883 for (i = 0; i < adap->params.arch.pm_stats_cnt; i++) {
5884 t4_write_reg(adap, PM_RX_STAT_CONFIG_A, i + 1);
5885 cnt[i] = t4_read_reg(adap, PM_RX_STAT_COUNT_A);
5886 if (is_t4(adap->params.chip)) {
5887 cycles[i] = t4_read_reg64(adap, PM_RX_STAT_LSB_A);
5888 } else {
5889 t4_read_indirect(adap, PM_RX_DBG_CTRL_A,
5890 PM_RX_DBG_DATA_A, data, 2,
5891 PM_RX_DBG_STAT_MSB_A);
5892 cycles[i] = (((u64)data[0] << 32) | data[1]);
5893 }
5894 }
5895}
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906static inline unsigned int compute_mps_bg_map(struct adapter *adapter,
5907 int pidx)
5908{
5909 unsigned int chip_version, nports;
5910
5911 chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
5912 nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A));
5913
5914 switch (chip_version) {
5915 case CHELSIO_T4:
5916 case CHELSIO_T5:
5917 switch (nports) {
5918 case 1: return 0xf;
5919 case 2: return 3 << (2 * pidx);
5920 case 4: return 1 << pidx;
5921 }
5922 break;
5923
5924 case CHELSIO_T6:
5925 switch (nports) {
5926 case 2: return 1 << (2 * pidx);
5927 }
5928 break;
5929 }
5930
5931 dev_err(adapter->pdev_dev, "Need MPS Buffer Group Map for Chip %0x, Nports %d\n",
5932 chip_version, nports);
5933
5934 return 0;
5935}
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946unsigned int t4_get_mps_bg_map(struct adapter *adapter, int pidx)
5947{
5948 u8 *mps_bg_map;
5949 unsigned int nports;
5950
5951 nports = 1 << NUMPORTS_G(t4_read_reg(adapter, MPS_CMN_CTL_A));
5952 if (pidx >= nports) {
5953 CH_WARN(adapter, "MPS Port Index %d >= Nports %d\n",
5954 pidx, nports);
5955 return 0;
5956 }
5957
5958
5959
5960 mps_bg_map = adapter->params.mps_bg_map;
5961 if (mps_bg_map[pidx])
5962 return mps_bg_map[pidx];
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974 if (adapter->flags & FW_OK) {
5975 u32 param, val;
5976 int ret;
5977
5978 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) |
5979 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_MPSBGMAP));
5980 ret = t4_query_params_ns(adapter, adapter->mbox, adapter->pf,
5981 0, 1, ¶m, &val);
5982 if (!ret) {
5983 int p;
5984
5985
5986
5987
5988 for (p = 0; p < MAX_NPORTS; p++, val >>= 8)
5989 mps_bg_map[p] = val & 0xff;
5990
5991 return mps_bg_map[pidx];
5992 }
5993 }
5994
5995
5996
5997
5998
5999 mps_bg_map[pidx] = compute_mps_bg_map(adapter, pidx);
6000 return mps_bg_map[pidx];
6001}
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012unsigned int t4_get_tp_ch_map(struct adapter *adap, int pidx)
6013{
6014 unsigned int chip_version = CHELSIO_CHIP_VERSION(adap->params.chip);
6015 unsigned int nports = 1 << NUMPORTS_G(t4_read_reg(adap, MPS_CMN_CTL_A));
6016
6017 if (pidx >= nports) {
6018 dev_warn(adap->pdev_dev, "TP Port Index %d >= Nports %d\n",
6019 pidx, nports);
6020 return 0;
6021 }
6022
6023 switch (chip_version) {
6024 case CHELSIO_T4:
6025 case CHELSIO_T5:
6026
6027
6028
6029
6030 switch (nports) {
6031 case 1: return 0xf;
6032 case 2: return 3 << (2 * pidx);
6033 case 4: return 1 << pidx;
6034 }
6035 break;
6036
6037 case CHELSIO_T6:
6038 switch (nports) {
6039 case 2: return 1 << pidx;
6040 }
6041 break;
6042 }
6043
6044 dev_err(adap->pdev_dev, "Need TP Channel Map for Chip %0x, Nports %d\n",
6045 chip_version, nports);
6046 return 0;
6047}
6048
6049
6050
6051
6052
6053const char *t4_get_port_type_description(enum fw_port_type port_type)
6054{
6055 static const char *const port_type_description[] = {
6056 "Fiber_XFI",
6057 "Fiber_XAUI",
6058 "BT_SGMII",
6059 "BT_XFI",
6060 "BT_XAUI",
6061 "KX4",
6062 "CX4",
6063 "KX",
6064 "KR",
6065 "SFP",
6066 "BP_AP",
6067 "BP4_AP",
6068 "QSFP_10G",
6069 "QSA",
6070 "QSFP",
6071 "BP40_BA",
6072 "KR4_100G",
6073 "CR4_QSFP",
6074 "CR_QSFP",
6075 "CR2_QSFP",
6076 "SFP28",
6077 "KR_SFP28",
6078 "KR_XLAUI"
6079 };
6080
6081 if (port_type < ARRAY_SIZE(port_type_description))
6082 return port_type_description[port_type];
6083 return "UNKNOWN";
6084}
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094void t4_get_port_stats_offset(struct adapter *adap, int idx,
6095 struct port_stats *stats,
6096 struct port_stats *offset)
6097{
6098 u64 *s, *o;
6099 int i;
6100
6101 t4_get_port_stats(adap, idx, stats);
6102 for (i = 0, s = (u64 *)stats, o = (u64 *)offset;
6103 i < (sizeof(struct port_stats) / sizeof(u64));
6104 i++, s++, o++)
6105 *s -= *o;
6106}
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
6117{
6118 u32 bgmap = t4_get_mps_bg_map(adap, idx);
6119 u32 stat_ctl = t4_read_reg(adap, MPS_STAT_CTL_A);
6120
6121#define GET_STAT(name) \
6122 t4_read_reg64(adap, \
6123 (is_t4(adap->params.chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \
6124 T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L)))
6125#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
6126
6127 p->tx_octets = GET_STAT(TX_PORT_BYTES);
6128 p->tx_frames = GET_STAT(TX_PORT_FRAMES);
6129 p->tx_bcast_frames = GET_STAT(TX_PORT_BCAST);
6130 p->tx_mcast_frames = GET_STAT(TX_PORT_MCAST);
6131 p->tx_ucast_frames = GET_STAT(TX_PORT_UCAST);
6132 p->tx_error_frames = GET_STAT(TX_PORT_ERROR);
6133 p->tx_frames_64 = GET_STAT(TX_PORT_64B);
6134 p->tx_frames_65_127 = GET_STAT(TX_PORT_65B_127B);
6135 p->tx_frames_128_255 = GET_STAT(TX_PORT_128B_255B);
6136 p->tx_frames_256_511 = GET_STAT(TX_PORT_256B_511B);
6137 p->tx_frames_512_1023 = GET_STAT(TX_PORT_512B_1023B);
6138 p->tx_frames_1024_1518 = GET_STAT(TX_PORT_1024B_1518B);
6139 p->tx_frames_1519_max = GET_STAT(TX_PORT_1519B_MAX);
6140 p->tx_drop = GET_STAT(TX_PORT_DROP);
6141 p->tx_pause = GET_STAT(TX_PORT_PAUSE);
6142 p->tx_ppp0 = GET_STAT(TX_PORT_PPP0);
6143 p->tx_ppp1 = GET_STAT(TX_PORT_PPP1);
6144 p->tx_ppp2 = GET_STAT(TX_PORT_PPP2);
6145 p->tx_ppp3 = GET_STAT(TX_PORT_PPP3);
6146 p->tx_ppp4 = GET_STAT(TX_PORT_PPP4);
6147 p->tx_ppp5 = GET_STAT(TX_PORT_PPP5);
6148 p->tx_ppp6 = GET_STAT(TX_PORT_PPP6);
6149 p->tx_ppp7 = GET_STAT(TX_PORT_PPP7);
6150
6151 if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
6152 if (stat_ctl & COUNTPAUSESTATTX_F)
6153 p->tx_frames_64 -= p->tx_pause;
6154 if (stat_ctl & COUNTPAUSEMCTX_F)
6155 p->tx_mcast_frames -= p->tx_pause;
6156 }
6157 p->rx_octets = GET_STAT(RX_PORT_BYTES);
6158 p->rx_frames = GET_STAT(RX_PORT_FRAMES);
6159 p->rx_bcast_frames = GET_STAT(RX_PORT_BCAST);
6160 p->rx_mcast_frames = GET_STAT(RX_PORT_MCAST);
6161 p->rx_ucast_frames = GET_STAT(RX_PORT_UCAST);
6162 p->rx_too_long = GET_STAT(RX_PORT_MTU_ERROR);
6163 p->rx_jabber = GET_STAT(RX_PORT_MTU_CRC_ERROR);
6164 p->rx_fcs_err = GET_STAT(RX_PORT_CRC_ERROR);
6165 p->rx_len_err = GET_STAT(RX_PORT_LEN_ERROR);
6166 p->rx_symbol_err = GET_STAT(RX_PORT_SYM_ERROR);
6167 p->rx_runt = GET_STAT(RX_PORT_LESS_64B);
6168 p->rx_frames_64 = GET_STAT(RX_PORT_64B);
6169 p->rx_frames_65_127 = GET_STAT(RX_PORT_65B_127B);
6170 p->rx_frames_128_255 = GET_STAT(RX_PORT_128B_255B);
6171 p->rx_frames_256_511 = GET_STAT(RX_PORT_256B_511B);
6172 p->rx_frames_512_1023 = GET_STAT(RX_PORT_512B_1023B);
6173 p->rx_frames_1024_1518 = GET_STAT(RX_PORT_1024B_1518B);
6174 p->rx_frames_1519_max = GET_STAT(RX_PORT_1519B_MAX);
6175 p->rx_pause = GET_STAT(RX_PORT_PAUSE);
6176 p->rx_ppp0 = GET_STAT(RX_PORT_PPP0);
6177 p->rx_ppp1 = GET_STAT(RX_PORT_PPP1);
6178 p->rx_ppp2 = GET_STAT(RX_PORT_PPP2);
6179 p->rx_ppp3 = GET_STAT(RX_PORT_PPP3);
6180 p->rx_ppp4 = GET_STAT(RX_PORT_PPP4);
6181 p->rx_ppp5 = GET_STAT(RX_PORT_PPP5);
6182 p->rx_ppp6 = GET_STAT(RX_PORT_PPP6);
6183 p->rx_ppp7 = GET_STAT(RX_PORT_PPP7);
6184
6185 if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
6186 if (stat_ctl & COUNTPAUSESTATRX_F)
6187 p->rx_frames_64 -= p->rx_pause;
6188 if (stat_ctl & COUNTPAUSEMCRX_F)
6189 p->rx_mcast_frames -= p->rx_pause;
6190 }
6191
6192 p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0;
6193 p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0;
6194 p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0;
6195 p->rx_ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_DROP_FRAME) : 0;
6196 p->rx_trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_TRUNC_FRAME) : 0;
6197 p->rx_trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_TRUNC_FRAME) : 0;
6198 p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0;
6199 p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0;
6200
6201#undef GET_STAT
6202#undef GET_STAT_COM
6203}
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p)
6214{
6215 u32 bgmap = t4_get_mps_bg_map(adap, idx);
6216
6217#define GET_STAT(name) \
6218 t4_read_reg64(adap, \
6219 (is_t4(adap->params.chip) ? \
6220 PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L) : \
6221 T5_PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L)))
6222#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
6223
6224 p->octets = GET_STAT(BYTES);
6225 p->frames = GET_STAT(FRAMES);
6226 p->bcast_frames = GET_STAT(BCAST);
6227 p->mcast_frames = GET_STAT(MCAST);
6228 p->ucast_frames = GET_STAT(UCAST);
6229 p->error_frames = GET_STAT(ERROR);
6230
6231 p->frames_64 = GET_STAT(64B);
6232 p->frames_65_127 = GET_STAT(65B_127B);
6233 p->frames_128_255 = GET_STAT(128B_255B);
6234 p->frames_256_511 = GET_STAT(256B_511B);
6235 p->frames_512_1023 = GET_STAT(512B_1023B);
6236 p->frames_1024_1518 = GET_STAT(1024B_1518B);
6237 p->frames_1519_max = GET_STAT(1519B_MAX);
6238 p->drop = GET_STAT(DROP_FRAMES);
6239
6240 p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0;
6241 p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0;
6242 p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0;
6243 p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0;
6244 p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0;
6245 p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0;
6246 p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0;
6247 p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0;
6248
6249#undef GET_STAT
6250#undef GET_STAT_COM
6251}
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261void t4_mk_filtdelwr(unsigned int ftid, struct fw_filter_wr *wr, int qid)
6262{
6263 memset(wr, 0, sizeof(*wr));
6264 wr->op_pkd = cpu_to_be32(FW_WR_OP_V(FW_FILTER_WR));
6265 wr->len16_pkd = cpu_to_be32(FW_WR_LEN16_V(sizeof(*wr) / 16));
6266 wr->tid_to_iq = cpu_to_be32(FW_FILTER_WR_TID_V(ftid) |
6267 FW_FILTER_WR_NOREPLY_V(qid < 0));
6268 wr->del_filter_to_l2tix = cpu_to_be32(FW_FILTER_WR_DEL_FILTER_F);
6269 if (qid >= 0)
6270 wr->rx_chan_rx_rpl_iq =
6271 cpu_to_be16(FW_FILTER_WR_RX_RPL_IQ_V(qid));
6272}
6273
6274#define INIT_CMD(var, cmd, rd_wr) do { \
6275 (var).op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_##cmd##_CMD) | \
6276 FW_CMD_REQUEST_F | \
6277 FW_CMD_##rd_wr##_F); \
6278 (var).retval_len16 = cpu_to_be32(FW_LEN16(var)); \
6279} while (0)
6280
6281int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox,
6282 u32 addr, u32 val)
6283{
6284 u32 ldst_addrspace;
6285 struct fw_ldst_cmd c;
6286
6287 memset(&c, 0, sizeof(c));
6288 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_FIRMWARE);
6289 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6290 FW_CMD_REQUEST_F |
6291 FW_CMD_WRITE_F |
6292 ldst_addrspace);
6293 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6294 c.u.addrval.addr = cpu_to_be32(addr);
6295 c.u.addrval.val = cpu_to_be32(val);
6296
6297 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6298}
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
6312 unsigned int mmd, unsigned int reg, u16 *valp)
6313{
6314 int ret;
6315 u32 ldst_addrspace;
6316 struct fw_ldst_cmd c;
6317
6318 memset(&c, 0, sizeof(c));
6319 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO);
6320 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6321 FW_CMD_REQUEST_F | FW_CMD_READ_F |
6322 ldst_addrspace);
6323 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6324 c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) |
6325 FW_LDST_CMD_MMD_V(mmd));
6326 c.u.mdio.raddr = cpu_to_be16(reg);
6327
6328 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6329 if (ret == 0)
6330 *valp = be16_to_cpu(c.u.mdio.rval);
6331 return ret;
6332}
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
6346 unsigned int mmd, unsigned int reg, u16 val)
6347{
6348 u32 ldst_addrspace;
6349 struct fw_ldst_cmd c;
6350
6351 memset(&c, 0, sizeof(c));
6352 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MDIO);
6353 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6354 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
6355 ldst_addrspace);
6356 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6357 c.u.mdio.paddr_mmd = cpu_to_be16(FW_LDST_CMD_PADDR_V(phy_addr) |
6358 FW_LDST_CMD_MMD_V(mmd));
6359 c.u.mdio.raddr = cpu_to_be16(reg);
6360 c.u.mdio.rval = cpu_to_be16(val);
6361
6362 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6363}
6364
6365
6366
6367
6368
6369
6370void t4_sge_decode_idma_state(struct adapter *adapter, int state)
6371{
6372 static const char * const t4_decode[] = {
6373 "IDMA_IDLE",
6374 "IDMA_PUSH_MORE_CPL_FIFO",
6375 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6376 "Not used",
6377 "IDMA_PHYSADDR_SEND_PCIEHDR",
6378 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6379 "IDMA_PHYSADDR_SEND_PAYLOAD",
6380 "IDMA_SEND_FIFO_TO_IMSG",
6381 "IDMA_FL_REQ_DATA_FL_PREP",
6382 "IDMA_FL_REQ_DATA_FL",
6383 "IDMA_FL_DROP",
6384 "IDMA_FL_H_REQ_HEADER_FL",
6385 "IDMA_FL_H_SEND_PCIEHDR",
6386 "IDMA_FL_H_PUSH_CPL_FIFO",
6387 "IDMA_FL_H_SEND_CPL",
6388 "IDMA_FL_H_SEND_IP_HDR_FIRST",
6389 "IDMA_FL_H_SEND_IP_HDR",
6390 "IDMA_FL_H_REQ_NEXT_HEADER_FL",
6391 "IDMA_FL_H_SEND_NEXT_PCIEHDR",
6392 "IDMA_FL_H_SEND_IP_HDR_PADDING",
6393 "IDMA_FL_D_SEND_PCIEHDR",
6394 "IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6395 "IDMA_FL_D_REQ_NEXT_DATA_FL",
6396 "IDMA_FL_SEND_PCIEHDR",
6397 "IDMA_FL_PUSH_CPL_FIFO",
6398 "IDMA_FL_SEND_CPL",
6399 "IDMA_FL_SEND_PAYLOAD_FIRST",
6400 "IDMA_FL_SEND_PAYLOAD",
6401 "IDMA_FL_REQ_NEXT_DATA_FL",
6402 "IDMA_FL_SEND_NEXT_PCIEHDR",
6403 "IDMA_FL_SEND_PADDING",
6404 "IDMA_FL_SEND_COMPLETION_TO_IMSG",
6405 "IDMA_FL_SEND_FIFO_TO_IMSG",
6406 "IDMA_FL_REQ_DATAFL_DONE",
6407 "IDMA_FL_REQ_HEADERFL_DONE",
6408 };
6409 static const char * const t5_decode[] = {
6410 "IDMA_IDLE",
6411 "IDMA_ALMOST_IDLE",
6412 "IDMA_PUSH_MORE_CPL_FIFO",
6413 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6414 "IDMA_SGEFLRFLUSH_SEND_PCIEHDR",
6415 "IDMA_PHYSADDR_SEND_PCIEHDR",
6416 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6417 "IDMA_PHYSADDR_SEND_PAYLOAD",
6418 "IDMA_SEND_FIFO_TO_IMSG",
6419 "IDMA_FL_REQ_DATA_FL",
6420 "IDMA_FL_DROP",
6421 "IDMA_FL_DROP_SEND_INC",
6422 "IDMA_FL_H_REQ_HEADER_FL",
6423 "IDMA_FL_H_SEND_PCIEHDR",
6424 "IDMA_FL_H_PUSH_CPL_FIFO",
6425 "IDMA_FL_H_SEND_CPL",
6426 "IDMA_FL_H_SEND_IP_HDR_FIRST",
6427 "IDMA_FL_H_SEND_IP_HDR",
6428 "IDMA_FL_H_REQ_NEXT_HEADER_FL",
6429 "IDMA_FL_H_SEND_NEXT_PCIEHDR",
6430 "IDMA_FL_H_SEND_IP_HDR_PADDING",
6431 "IDMA_FL_D_SEND_PCIEHDR",
6432 "IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6433 "IDMA_FL_D_REQ_NEXT_DATA_FL",
6434 "IDMA_FL_SEND_PCIEHDR",
6435 "IDMA_FL_PUSH_CPL_FIFO",
6436 "IDMA_FL_SEND_CPL",
6437 "IDMA_FL_SEND_PAYLOAD_FIRST",
6438 "IDMA_FL_SEND_PAYLOAD",
6439 "IDMA_FL_REQ_NEXT_DATA_FL",
6440 "IDMA_FL_SEND_NEXT_PCIEHDR",
6441 "IDMA_FL_SEND_PADDING",
6442 "IDMA_FL_SEND_COMPLETION_TO_IMSG",
6443 };
6444 static const char * const t6_decode[] = {
6445 "IDMA_IDLE",
6446 "IDMA_PUSH_MORE_CPL_FIFO",
6447 "IDMA_PUSH_CPL_MSG_HEADER_TO_FIFO",
6448 "IDMA_SGEFLRFLUSH_SEND_PCIEHDR",
6449 "IDMA_PHYSADDR_SEND_PCIEHDR",
6450 "IDMA_PHYSADDR_SEND_PAYLOAD_FIRST",
6451 "IDMA_PHYSADDR_SEND_PAYLOAD",
6452 "IDMA_FL_REQ_DATA_FL",
6453 "IDMA_FL_DROP",
6454 "IDMA_FL_DROP_SEND_INC",
6455 "IDMA_FL_H_REQ_HEADER_FL",
6456 "IDMA_FL_H_SEND_PCIEHDR",
6457 "IDMA_FL_H_PUSH_CPL_FIFO",
6458 "IDMA_FL_H_SEND_CPL",
6459 "IDMA_FL_H_SEND_IP_HDR_FIRST",
6460 "IDMA_FL_H_SEND_IP_HDR",
6461 "IDMA_FL_H_REQ_NEXT_HEADER_FL",
6462 "IDMA_FL_H_SEND_NEXT_PCIEHDR",
6463 "IDMA_FL_H_SEND_IP_HDR_PADDING",
6464 "IDMA_FL_D_SEND_PCIEHDR",
6465 "IDMA_FL_D_SEND_CPL_AND_IP_HDR",
6466 "IDMA_FL_D_REQ_NEXT_DATA_FL",
6467 "IDMA_FL_SEND_PCIEHDR",
6468 "IDMA_FL_PUSH_CPL_FIFO",
6469 "IDMA_FL_SEND_CPL",
6470 "IDMA_FL_SEND_PAYLOAD_FIRST",
6471 "IDMA_FL_SEND_PAYLOAD",
6472 "IDMA_FL_REQ_NEXT_DATA_FL",
6473 "IDMA_FL_SEND_NEXT_PCIEHDR",
6474 "IDMA_FL_SEND_PADDING",
6475 "IDMA_FL_SEND_COMPLETION_TO_IMSG",
6476 };
6477 static const u32 sge_regs[] = {
6478 SGE_DEBUG_DATA_LOW_INDEX_2_A,
6479 SGE_DEBUG_DATA_LOW_INDEX_3_A,
6480 SGE_DEBUG_DATA_HIGH_INDEX_10_A,
6481 };
6482 const char **sge_idma_decode;
6483 int sge_idma_decode_nstates;
6484 int i;
6485 unsigned int chip_version = CHELSIO_CHIP_VERSION(adapter->params.chip);
6486
6487
6488
6489
6490 switch (chip_version) {
6491 case CHELSIO_T4:
6492 sge_idma_decode = (const char **)t4_decode;
6493 sge_idma_decode_nstates = ARRAY_SIZE(t4_decode);
6494 break;
6495
6496 case CHELSIO_T5:
6497 sge_idma_decode = (const char **)t5_decode;
6498 sge_idma_decode_nstates = ARRAY_SIZE(t5_decode);
6499 break;
6500
6501 case CHELSIO_T6:
6502 sge_idma_decode = (const char **)t6_decode;
6503 sge_idma_decode_nstates = ARRAY_SIZE(t6_decode);
6504 break;
6505
6506 default:
6507 dev_err(adapter->pdev_dev,
6508 "Unsupported chip version %d\n", chip_version);
6509 return;
6510 }
6511
6512 if (is_t4(adapter->params.chip)) {
6513 sge_idma_decode = (const char **)t4_decode;
6514 sge_idma_decode_nstates = ARRAY_SIZE(t4_decode);
6515 } else {
6516 sge_idma_decode = (const char **)t5_decode;
6517 sge_idma_decode_nstates = ARRAY_SIZE(t5_decode);
6518 }
6519
6520 if (state < sge_idma_decode_nstates)
6521 CH_WARN(adapter, "idma state %s\n", sge_idma_decode[state]);
6522 else
6523 CH_WARN(adapter, "idma state %d unknown\n", state);
6524
6525 for (i = 0; i < ARRAY_SIZE(sge_regs); i++)
6526 CH_WARN(adapter, "SGE register %#x value %#x\n",
6527 sge_regs[i], t4_read_reg(adapter, sge_regs[i]));
6528}
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox, int ctxt_type)
6540{
6541 int ret;
6542 u32 ldst_addrspace;
6543 struct fw_ldst_cmd c;
6544
6545 memset(&c, 0, sizeof(c));
6546 ldst_addrspace = FW_LDST_CMD_ADDRSPACE_V(ctxt_type == CTXT_EGRESS ?
6547 FW_LDST_ADDRSPC_SGE_EGRC :
6548 FW_LDST_ADDRSPC_SGE_INGC);
6549 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
6550 FW_CMD_REQUEST_F | FW_CMD_READ_F |
6551 ldst_addrspace);
6552 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
6553 c.u.idctxt.msg_ctxtflush = cpu_to_be32(FW_LDST_CMD_CTXTFLUSH_F);
6554
6555 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6556 return ret;
6557}
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570int t4_fw_hello(struct adapter *adap, unsigned int mbox, unsigned int evt_mbox,
6571 enum dev_master master, enum dev_state *state)
6572{
6573 int ret;
6574 struct fw_hello_cmd c;
6575 u32 v;
6576 unsigned int master_mbox;
6577 int retries = FW_CMD_HELLO_RETRIES;
6578
6579retry:
6580 memset(&c, 0, sizeof(c));
6581 INIT_CMD(c, HELLO, WRITE);
6582 c.err_to_clearinit = cpu_to_be32(
6583 FW_HELLO_CMD_MASTERDIS_V(master == MASTER_CANT) |
6584 FW_HELLO_CMD_MASTERFORCE_V(master == MASTER_MUST) |
6585 FW_HELLO_CMD_MBMASTER_V(master == MASTER_MUST ?
6586 mbox : FW_HELLO_CMD_MBMASTER_M) |
6587 FW_HELLO_CMD_MBASYNCNOT_V(evt_mbox) |
6588 FW_HELLO_CMD_STAGE_V(fw_hello_cmd_stage_os) |
6589 FW_HELLO_CMD_CLEARINIT_F);
6590
6591
6592
6593
6594
6595
6596
6597
6598 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
6599 if (ret < 0) {
6600 if ((ret == -EBUSY || ret == -ETIMEDOUT) && retries-- > 0)
6601 goto retry;
6602 if (t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_ERR_F)
6603 t4_report_fw_error(adap);
6604 return ret;
6605 }
6606
6607 v = be32_to_cpu(c.err_to_clearinit);
6608 master_mbox = FW_HELLO_CMD_MBMASTER_G(v);
6609 if (state) {
6610 if (v & FW_HELLO_CMD_ERR_F)
6611 *state = DEV_STATE_ERR;
6612 else if (v & FW_HELLO_CMD_INIT_F)
6613 *state = DEV_STATE_INIT;
6614 else
6615 *state = DEV_STATE_UNINIT;
6616 }
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629 if ((v & (FW_HELLO_CMD_ERR_F|FW_HELLO_CMD_INIT_F)) == 0 &&
6630 master_mbox != mbox) {
6631 int waiting = FW_CMD_HELLO_TIMEOUT;
6632
6633
6634
6635
6636
6637
6638
6639
6640 for (;;) {
6641 u32 pcie_fw;
6642
6643 msleep(50);
6644 waiting -= 50;
6645
6646
6647
6648
6649
6650
6651
6652 pcie_fw = t4_read_reg(adap, PCIE_FW_A);
6653 if (!(pcie_fw & (PCIE_FW_ERR_F|PCIE_FW_INIT_F))) {
6654 if (waiting <= 0) {
6655 if (retries-- > 0)
6656 goto retry;
6657
6658 return -ETIMEDOUT;
6659 }
6660 continue;
6661 }
6662
6663
6664
6665
6666
6667 if (state) {
6668 if (pcie_fw & PCIE_FW_ERR_F)
6669 *state = DEV_STATE_ERR;
6670 else if (pcie_fw & PCIE_FW_INIT_F)
6671 *state = DEV_STATE_INIT;
6672 }
6673
6674
6675
6676
6677
6678
6679 if (master_mbox == PCIE_FW_MASTER_M &&
6680 (pcie_fw & PCIE_FW_MASTER_VLD_F))
6681 master_mbox = PCIE_FW_MASTER_G(pcie_fw);
6682 break;
6683 }
6684 }
6685
6686 return master_mbox;
6687}
6688
6689
6690
6691
6692
6693
6694
6695
6696int t4_fw_bye(struct adapter *adap, unsigned int mbox)
6697{
6698 struct fw_bye_cmd c;
6699
6700 memset(&c, 0, sizeof(c));
6701 INIT_CMD(c, BYE, WRITE);
6702 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6703}
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713int t4_early_init(struct adapter *adap, unsigned int mbox)
6714{
6715 struct fw_initialize_cmd c;
6716
6717 memset(&c, 0, sizeof(c));
6718 INIT_CMD(c, INITIALIZE, WRITE);
6719 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6720}
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset)
6731{
6732 struct fw_reset_cmd c;
6733
6734 memset(&c, 0, sizeof(c));
6735 INIT_CMD(c, RESET, WRITE);
6736 c.val = cpu_to_be32(reset);
6737 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6738}
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756static int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
6757{
6758 int ret = 0;
6759
6760
6761
6762
6763
6764 if (mbox <= PCIE_FW_MASTER_M) {
6765 struct fw_reset_cmd c;
6766
6767 memset(&c, 0, sizeof(c));
6768 INIT_CMD(c, RESET, WRITE);
6769 c.val = cpu_to_be32(PIORST_F | PIORSTMODE_F);
6770 c.halt_pkd = cpu_to_be32(FW_RESET_CMD_HALT_F);
6771 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
6772 }
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787 if (ret == 0 || force) {
6788 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, UPCRST_F);
6789 t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F,
6790 PCIE_FW_HALT_F);
6791 }
6792
6793
6794
6795
6796
6797 return ret;
6798}
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
6822{
6823 if (reset) {
6824
6825
6826
6827
6828
6829 t4_set_reg_field(adap, PCIE_FW_A, PCIE_FW_HALT_F, 0);
6830
6831
6832
6833
6834
6835
6836
6837
6838 if (mbox <= PCIE_FW_MASTER_M) {
6839 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0);
6840 msleep(100);
6841 if (t4_fw_reset(adap, mbox,
6842 PIORST_F | PIORSTMODE_F) == 0)
6843 return 0;
6844 }
6845
6846 t4_write_reg(adap, PL_RST_A, PIORST_F | PIORSTMODE_F);
6847 msleep(2000);
6848 } else {
6849 int ms;
6850
6851 t4_set_reg_field(adap, CIM_BOOT_CFG_A, UPCRST_F, 0);
6852 for (ms = 0; ms < FW_CMD_MAX_TIMEOUT; ) {
6853 if (!(t4_read_reg(adap, PCIE_FW_A) & PCIE_FW_HALT_F))
6854 return 0;
6855 msleep(100);
6856 ms += 100;
6857 }
6858 return -ETIMEDOUT;
6859 }
6860 return 0;
6861}
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
6885 const u8 *fw_data, unsigned int size, int force)
6886{
6887 const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
6888 int reset, ret;
6889
6890 if (!t4_fw_matches_chip(adap, fw_hdr))
6891 return -EINVAL;
6892
6893
6894
6895
6896 adap->flags &= ~FW_OK;
6897
6898 ret = t4_fw_halt(adap, mbox, force);
6899 if (ret < 0 && !force)
6900 goto out;
6901
6902 ret = t4_load_fw(adap, fw_data, size);
6903 if (ret < 0)
6904 goto out;
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915 (void)t4_load_cfg(adap, NULL, 0);
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925 reset = ((be32_to_cpu(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0);
6926 ret = t4_fw_restart(adap, mbox, reset);
6927
6928
6929
6930
6931
6932
6933 (void)t4_init_devlog_params(adap);
6934out:
6935 adap->flags |= FW_OK;
6936 return ret;
6937}
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948int t4_fl_pkt_align(struct adapter *adap)
6949{
6950 u32 sge_control, sge_control2;
6951 unsigned int ingpadboundary, ingpackboundary, fl_align, ingpad_shift;
6952
6953 sge_control = t4_read_reg(adap, SGE_CONTROL_A);
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967 if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5)
6968 ingpad_shift = INGPADBOUNDARY_SHIFT_X;
6969 else
6970 ingpad_shift = T6_INGPADBOUNDARY_SHIFT_X;
6971
6972 ingpadboundary = 1 << (INGPADBOUNDARY_G(sge_control) + ingpad_shift);
6973
6974 fl_align = ingpadboundary;
6975 if (!is_t4(adap->params.chip)) {
6976
6977
6978
6979 sge_control2 = t4_read_reg(adap, SGE_CONTROL2_A);
6980 ingpackboundary = INGPACKBOUNDARY_G(sge_control2);
6981 if (ingpackboundary == INGPACKBOUNDARY_16B_X)
6982 ingpackboundary = 16;
6983 else
6984 ingpackboundary = 1 << (ingpackboundary +
6985 INGPACKBOUNDARY_SHIFT_X);
6986
6987 fl_align = max(ingpadboundary, ingpackboundary);
6988 }
6989 return fl_align;
6990}
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
7003 unsigned int cache_line_size)
7004{
7005 unsigned int page_shift = fls(page_size) - 1;
7006 unsigned int sge_hps = page_shift - 10;
7007 unsigned int stat_len = cache_line_size > 64 ? 128 : 64;
7008 unsigned int fl_align = cache_line_size < 32 ? 32 : cache_line_size;
7009 unsigned int fl_align_log = fls(fl_align) - 1;
7010
7011 t4_write_reg(adap, SGE_HOST_PAGE_SIZE_A,
7012 HOSTPAGESIZEPF0_V(sge_hps) |
7013 HOSTPAGESIZEPF1_V(sge_hps) |
7014 HOSTPAGESIZEPF2_V(sge_hps) |
7015 HOSTPAGESIZEPF3_V(sge_hps) |
7016 HOSTPAGESIZEPF4_V(sge_hps) |
7017 HOSTPAGESIZEPF5_V(sge_hps) |
7018 HOSTPAGESIZEPF6_V(sge_hps) |
7019 HOSTPAGESIZEPF7_V(sge_hps));
7020
7021 if (is_t4(adap->params.chip)) {
7022 t4_set_reg_field(adap, SGE_CONTROL_A,
7023 INGPADBOUNDARY_V(INGPADBOUNDARY_M) |
7024 EGRSTATUSPAGESIZE_F,
7025 INGPADBOUNDARY_V(fl_align_log -
7026 INGPADBOUNDARY_SHIFT_X) |
7027 EGRSTATUSPAGESIZE_V(stat_len != 64));
7028 } else {
7029 unsigned int pack_align;
7030 unsigned int ingpad, ingpack;
7031 unsigned int pcie_cap;
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055 pack_align = fl_align;
7056 pcie_cap = pci_find_capability(adap->pdev, PCI_CAP_ID_EXP);
7057 if (pcie_cap) {
7058 unsigned int mps, mps_log;
7059 u16 devctl;
7060
7061
7062
7063
7064
7065 pci_read_config_word(adap->pdev,
7066 pcie_cap + PCI_EXP_DEVCTL,
7067 &devctl);
7068 mps_log = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5) + 7;
7069 mps = 1 << mps_log;
7070 if (mps > pack_align)
7071 pack_align = mps;
7072 }
7073
7074
7075
7076
7077
7078
7079 if (pack_align <= 16) {
7080 ingpack = INGPACKBOUNDARY_16B_X;
7081 fl_align = 16;
7082 } else if (pack_align == 32) {
7083 ingpack = INGPACKBOUNDARY_64B_X;
7084 fl_align = 64;
7085 } else {
7086 unsigned int pack_align_log = fls(pack_align) - 1;
7087
7088 ingpack = pack_align_log - INGPACKBOUNDARY_SHIFT_X;
7089 fl_align = pack_align;
7090 }
7091
7092
7093
7094
7095
7096
7097 if (is_t5(adap->params.chip))
7098 ingpad = INGPADBOUNDARY_32B_X;
7099 else
7100 ingpad = T6_INGPADBOUNDARY_8B_X;
7101
7102 t4_set_reg_field(adap, SGE_CONTROL_A,
7103 INGPADBOUNDARY_V(INGPADBOUNDARY_M) |
7104 EGRSTATUSPAGESIZE_F,
7105 INGPADBOUNDARY_V(ingpad) |
7106 EGRSTATUSPAGESIZE_V(stat_len != 64));
7107 t4_set_reg_field(adap, SGE_CONTROL2_A,
7108 INGPACKBOUNDARY_V(INGPACKBOUNDARY_M),
7109 INGPACKBOUNDARY_V(ingpack));
7110 }
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132 t4_write_reg(adap, SGE_FL_BUFFER_SIZE0_A, page_size);
7133 t4_write_reg(adap, SGE_FL_BUFFER_SIZE2_A,
7134 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE2_A) + fl_align-1)
7135 & ~(fl_align-1));
7136 t4_write_reg(adap, SGE_FL_BUFFER_SIZE3_A,
7137 (t4_read_reg(adap, SGE_FL_BUFFER_SIZE3_A) + fl_align-1)
7138 & ~(fl_align-1));
7139
7140 t4_write_reg(adap, ULP_RX_TDDP_PSZ_A, HPZ0_V(page_shift - 12));
7141
7142 return 0;
7143}
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153int t4_fw_initialize(struct adapter *adap, unsigned int mbox)
7154{
7155 struct fw_initialize_cmd c;
7156
7157 memset(&c, 0, sizeof(c));
7158 INIT_CMD(c, INITIALIZE, WRITE);
7159 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7160}
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177int t4_query_params_rw(struct adapter *adap, unsigned int mbox, unsigned int pf,
7178 unsigned int vf, unsigned int nparams, const u32 *params,
7179 u32 *val, int rw, bool sleep_ok)
7180{
7181 int i, ret;
7182 struct fw_params_cmd c;
7183 __be32 *p = &c.param[0].mnem;
7184
7185 if (nparams > 7)
7186 return -EINVAL;
7187
7188 memset(&c, 0, sizeof(c));
7189 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
7190 FW_CMD_REQUEST_F | FW_CMD_READ_F |
7191 FW_PARAMS_CMD_PFN_V(pf) |
7192 FW_PARAMS_CMD_VFN_V(vf));
7193 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7194
7195 for (i = 0; i < nparams; i++) {
7196 *p++ = cpu_to_be32(*params++);
7197 if (rw)
7198 *p = cpu_to_be32(*(val + i));
7199 p++;
7200 }
7201
7202 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7203 if (ret == 0)
7204 for (i = 0, p = &c.param[0].val; i < nparams; i++, p += 2)
7205 *val++ = be32_to_cpu(*p);
7206 return ret;
7207}
7208
7209int t4_query_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
7210 unsigned int vf, unsigned int nparams, const u32 *params,
7211 u32 *val)
7212{
7213 return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0,
7214 true);
7215}
7216
7217int t4_query_params_ns(struct adapter *adap, unsigned int mbox, unsigned int pf,
7218 unsigned int vf, unsigned int nparams, const u32 *params,
7219 u32 *val)
7220{
7221 return t4_query_params_rw(adap, mbox, pf, vf, nparams, params, val, 0,
7222 false);
7223}
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239int t4_set_params_timeout(struct adapter *adap, unsigned int mbox,
7240 unsigned int pf, unsigned int vf,
7241 unsigned int nparams, const u32 *params,
7242 const u32 *val, int timeout)
7243{
7244 struct fw_params_cmd c;
7245 __be32 *p = &c.param[0].mnem;
7246
7247 if (nparams > 7)
7248 return -EINVAL;
7249
7250 memset(&c, 0, sizeof(c));
7251 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PARAMS_CMD) |
7252 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7253 FW_PARAMS_CMD_PFN_V(pf) |
7254 FW_PARAMS_CMD_VFN_V(vf));
7255 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7256
7257 while (nparams--) {
7258 *p++ = cpu_to_be32(*params++);
7259 *p++ = cpu_to_be32(*val++);
7260 }
7261
7262 return t4_wr_mbox_timeout(adap, mbox, &c, sizeof(c), NULL, timeout);
7263}
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
7279 unsigned int vf, unsigned int nparams, const u32 *params,
7280 const u32 *val)
7281{
7282 return t4_set_params_timeout(adap, mbox, pf, vf, nparams, params, val,
7283 FW_CMD_MAX_TIMEOUT);
7284}
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf,
7308 unsigned int vf, unsigned int txq, unsigned int txq_eth_ctrl,
7309 unsigned int rxqi, unsigned int rxq, unsigned int tc,
7310 unsigned int vi, unsigned int cmask, unsigned int pmask,
7311 unsigned int nexact, unsigned int rcaps, unsigned int wxcaps)
7312{
7313 struct fw_pfvf_cmd c;
7314
7315 memset(&c, 0, sizeof(c));
7316 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_PFVF_CMD) | FW_CMD_REQUEST_F |
7317 FW_CMD_WRITE_F | FW_PFVF_CMD_PFN_V(pf) |
7318 FW_PFVF_CMD_VFN_V(vf));
7319 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7320 c.niqflint_niq = cpu_to_be32(FW_PFVF_CMD_NIQFLINT_V(rxqi) |
7321 FW_PFVF_CMD_NIQ_V(rxq));
7322 c.type_to_neq = cpu_to_be32(FW_PFVF_CMD_CMASK_V(cmask) |
7323 FW_PFVF_CMD_PMASK_V(pmask) |
7324 FW_PFVF_CMD_NEQ_V(txq));
7325 c.tc_to_nexactf = cpu_to_be32(FW_PFVF_CMD_TC_V(tc) |
7326 FW_PFVF_CMD_NVI_V(vi) |
7327 FW_PFVF_CMD_NEXACTF_V(nexact));
7328 c.r_caps_to_nethctrl = cpu_to_be32(FW_PFVF_CMD_R_CAPS_V(rcaps) |
7329 FW_PFVF_CMD_WX_CAPS_V(wxcaps) |
7330 FW_PFVF_CMD_NETHCTRL_V(txq_eth_ctrl));
7331 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7332}
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
7352 unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
7353 unsigned int *rss_size)
7354{
7355 int ret;
7356 struct fw_vi_cmd c;
7357
7358 memset(&c, 0, sizeof(c));
7359 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) | FW_CMD_REQUEST_F |
7360 FW_CMD_WRITE_F | FW_CMD_EXEC_F |
7361 FW_VI_CMD_PFN_V(pf) | FW_VI_CMD_VFN_V(vf));
7362 c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_ALLOC_F | FW_LEN16(c));
7363 c.portid_pkd = FW_VI_CMD_PORTID_V(port);
7364 c.nmac = nmac - 1;
7365
7366 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7367 if (ret)
7368 return ret;
7369
7370 if (mac) {
7371 memcpy(mac, c.mac, sizeof(c.mac));
7372 switch (nmac) {
7373 case 5:
7374 memcpy(mac + 24, c.nmac3, sizeof(c.nmac3));
7375 case 4:
7376 memcpy(mac + 18, c.nmac2, sizeof(c.nmac2));
7377 case 3:
7378 memcpy(mac + 12, c.nmac1, sizeof(c.nmac1));
7379 case 2:
7380 memcpy(mac + 6, c.nmac0, sizeof(c.nmac0));
7381 }
7382 }
7383 if (rss_size)
7384 *rss_size = FW_VI_CMD_RSSSIZE_G(be16_to_cpu(c.rsssize_pkd));
7385 return FW_VI_CMD_VIID_G(be16_to_cpu(c.type_viid));
7386}
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
7399 unsigned int vf, unsigned int viid)
7400{
7401 struct fw_vi_cmd c;
7402
7403 memset(&c, 0, sizeof(c));
7404 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_VI_CMD) |
7405 FW_CMD_REQUEST_F |
7406 FW_CMD_EXEC_F |
7407 FW_VI_CMD_PFN_V(pf) |
7408 FW_VI_CMD_VFN_V(vf));
7409 c.alloc_to_len16 = cpu_to_be32(FW_VI_CMD_FREE_F | FW_LEN16(c));
7410 c.type_viid = cpu_to_be16(FW_VI_CMD_VIID_V(viid));
7411
7412 return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7413}
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
7430 int mtu, int promisc, int all_multi, int bcast, int vlanex,
7431 bool sleep_ok)
7432{
7433 struct fw_vi_rxmode_cmd c;
7434
7435
7436 if (mtu < 0)
7437 mtu = FW_RXMODE_MTU_NO_CHG;
7438 if (promisc < 0)
7439 promisc = FW_VI_RXMODE_CMD_PROMISCEN_M;
7440 if (all_multi < 0)
7441 all_multi = FW_VI_RXMODE_CMD_ALLMULTIEN_M;
7442 if (bcast < 0)
7443 bcast = FW_VI_RXMODE_CMD_BROADCASTEN_M;
7444 if (vlanex < 0)
7445 vlanex = FW_VI_RXMODE_CMD_VLANEXEN_M;
7446
7447 memset(&c, 0, sizeof(c));
7448 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_RXMODE_CMD) |
7449 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7450 FW_VI_RXMODE_CMD_VIID_V(viid));
7451 c.retval_len16 = cpu_to_be32(FW_LEN16(c));
7452 c.mtu_to_vlanexen =
7453 cpu_to_be32(FW_VI_RXMODE_CMD_MTU_V(mtu) |
7454 FW_VI_RXMODE_CMD_PROMISCEN_V(promisc) |
7455 FW_VI_RXMODE_CMD_ALLMULTIEN_V(all_multi) |
7456 FW_VI_RXMODE_CMD_BROADCASTEN_V(bcast) |
7457 FW_VI_RXMODE_CMD_VLANEXEN_V(vlanex));
7458 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
7459}
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476int t4_free_raw_mac_filt(struct adapter *adap, unsigned int viid,
7477 const u8 *addr, const u8 *mask, unsigned int idx,
7478 u8 lookup_type, u8 port_id, bool sleep_ok)
7479{
7480 struct fw_vi_mac_cmd c;
7481 struct fw_vi_mac_raw *p = &c.u.raw;
7482 u32 val;
7483
7484 memset(&c, 0, sizeof(c));
7485 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7486 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7487 FW_CMD_EXEC_V(0) |
7488 FW_VI_MAC_CMD_VIID_V(viid));
7489 val = FW_CMD_LEN16_V(1) |
7490 FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW);
7491 c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) |
7492 FW_CMD_LEN16_V(val));
7493
7494 p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx) |
7495 FW_VI_MAC_ID_BASED_FREE);
7496
7497
7498 p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) |
7499 DATAPORTNUM_V(port_id));
7500
7501 p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) |
7502 DATAPORTNUM_V(DATAPORTNUM_M));
7503
7504
7505 memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN);
7506 memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN);
7507
7508 return t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok);
7509}
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526int t4_alloc_raw_mac_filt(struct adapter *adap, unsigned int viid,
7527 const u8 *addr, const u8 *mask, unsigned int idx,
7528 u8 lookup_type, u8 port_id, bool sleep_ok)
7529{
7530 int ret = 0;
7531 struct fw_vi_mac_cmd c;
7532 struct fw_vi_mac_raw *p = &c.u.raw;
7533 u32 val;
7534
7535 memset(&c, 0, sizeof(c));
7536 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7537 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7538 FW_VI_MAC_CMD_VIID_V(viid));
7539 val = FW_CMD_LEN16_V(1) |
7540 FW_VI_MAC_CMD_ENTRY_TYPE_V(FW_VI_MAC_TYPE_RAW);
7541 c.freemacs_to_len16 = cpu_to_be32(val);
7542
7543
7544 p->raw_idx_pkd = cpu_to_be32(FW_VI_MAC_CMD_RAW_IDX_V(idx));
7545
7546
7547 p->data0_pkd = cpu_to_be32(DATALKPTYPE_V(lookup_type) |
7548 DATAPORTNUM_V(port_id));
7549
7550 p->data0m_pkd = cpu_to_be64(DATALKPTYPE_V(DATALKPTYPE_M) |
7551 DATAPORTNUM_V(DATAPORTNUM_M));
7552
7553
7554 memcpy((u8 *)&p->data1[0] + 2, addr, ETH_ALEN);
7555 memcpy((u8 *)&p->data1m[0] + 2, mask, ETH_ALEN);
7556
7557 ret = t4_wr_mbox_meat(adap, adap->mbox, &c, sizeof(c), &c, sleep_ok);
7558 if (ret == 0) {
7559 ret = FW_VI_MAC_CMD_RAW_IDX_G(be32_to_cpu(p->raw_idx_pkd));
7560 if (ret != idx)
7561 ret = -ENOMEM;
7562 }
7563
7564 return ret;
7565}
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
7590 unsigned int viid, bool free, unsigned int naddr,
7591 const u8 **addr, u16 *idx, u64 *hash, bool sleep_ok)
7592{
7593 int offset, ret = 0;
7594 struct fw_vi_mac_cmd c;
7595 unsigned int nfilters = 0;
7596 unsigned int max_naddr = adap->params.arch.mps_tcam_size;
7597 unsigned int rem = naddr;
7598
7599 if (naddr > max_naddr)
7600 return -EINVAL;
7601
7602 for (offset = 0; offset < naddr ; ) {
7603 unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact) ?
7604 rem : ARRAY_SIZE(c.u.exact));
7605 size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
7606 u.exact[fw_naddr]), 16);
7607 struct fw_vi_mac_exact *p;
7608 int i;
7609
7610 memset(&c, 0, sizeof(c));
7611 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7612 FW_CMD_REQUEST_F |
7613 FW_CMD_WRITE_F |
7614 FW_CMD_EXEC_V(free) |
7615 FW_VI_MAC_CMD_VIID_V(viid));
7616 c.freemacs_to_len16 =
7617 cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(free) |
7618 FW_CMD_LEN16_V(len16));
7619
7620 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7621 p->valid_to_idx =
7622 cpu_to_be16(FW_VI_MAC_CMD_VALID_F |
7623 FW_VI_MAC_CMD_IDX_V(
7624 FW_VI_MAC_ADD_MAC));
7625 memcpy(p->macaddr, addr[offset + i],
7626 sizeof(p->macaddr));
7627 }
7628
7629
7630
7631
7632
7633 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7634 if (ret && ret != -FW_ENOMEM)
7635 break;
7636
7637 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7638 u16 index = FW_VI_MAC_CMD_IDX_G(
7639 be16_to_cpu(p->valid_to_idx));
7640
7641 if (idx)
7642 idx[offset + i] = (index >= max_naddr ?
7643 0xffff : index);
7644 if (index < max_naddr)
7645 nfilters++;
7646 else if (hash)
7647 *hash |= (1ULL <<
7648 hash_mac_addr(addr[offset + i]));
7649 }
7650
7651 free = false;
7652 offset += fw_naddr;
7653 rem -= fw_naddr;
7654 }
7655
7656 if (ret == 0 || ret == -FW_ENOMEM)
7657 ret = nfilters;
7658 return ret;
7659}
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674int t4_free_mac_filt(struct adapter *adap, unsigned int mbox,
7675 unsigned int viid, unsigned int naddr,
7676 const u8 **addr, bool sleep_ok)
7677{
7678 int offset, ret = 0;
7679 struct fw_vi_mac_cmd c;
7680 unsigned int nfilters = 0;
7681 unsigned int max_naddr = is_t4(adap->params.chip) ?
7682 NUM_MPS_CLS_SRAM_L_INSTANCES :
7683 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
7684 unsigned int rem = naddr;
7685
7686 if (naddr > max_naddr)
7687 return -EINVAL;
7688
7689 for (offset = 0; offset < (int)naddr ; ) {
7690 unsigned int fw_naddr = (rem < ARRAY_SIZE(c.u.exact)
7691 ? rem
7692 : ARRAY_SIZE(c.u.exact));
7693 size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
7694 u.exact[fw_naddr]), 16);
7695 struct fw_vi_mac_exact *p;
7696 int i;
7697
7698 memset(&c, 0, sizeof(c));
7699 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7700 FW_CMD_REQUEST_F |
7701 FW_CMD_WRITE_F |
7702 FW_CMD_EXEC_V(0) |
7703 FW_VI_MAC_CMD_VIID_V(viid));
7704 c.freemacs_to_len16 =
7705 cpu_to_be32(FW_VI_MAC_CMD_FREEMACS_V(0) |
7706 FW_CMD_LEN16_V(len16));
7707
7708 for (i = 0, p = c.u.exact; i < (int)fw_naddr; i++, p++) {
7709 p->valid_to_idx = cpu_to_be16(
7710 FW_VI_MAC_CMD_VALID_F |
7711 FW_VI_MAC_CMD_IDX_V(FW_VI_MAC_MAC_BASED_FREE));
7712 memcpy(p->macaddr, addr[offset+i], sizeof(p->macaddr));
7713 }
7714
7715 ret = t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), &c, sleep_ok);
7716 if (ret)
7717 break;
7718
7719 for (i = 0, p = c.u.exact; i < fw_naddr; i++, p++) {
7720 u16 index = FW_VI_MAC_CMD_IDX_G(
7721 be16_to_cpu(p->valid_to_idx));
7722
7723 if (index < max_naddr)
7724 nfilters++;
7725 }
7726
7727 offset += fw_naddr;
7728 rem -= fw_naddr;
7729 }
7730
7731 if (ret == 0)
7732 ret = nfilters;
7733 return ret;
7734}
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
7756 int idx, const u8 *addr, bool persist, bool add_smt)
7757{
7758 int ret, mode;
7759 struct fw_vi_mac_cmd c;
7760 struct fw_vi_mac_exact *p = c.u.exact;
7761 unsigned int max_mac_addr = adap->params.arch.mps_tcam_size;
7762
7763 if (idx < 0)
7764 idx = persist ? FW_VI_MAC_ADD_PERSIST_MAC : FW_VI_MAC_ADD_MAC;
7765 mode = add_smt ? FW_VI_MAC_SMT_AND_MPSTCAM : FW_VI_MAC_MPS_TCAM_ENTRY;
7766
7767 memset(&c, 0, sizeof(c));
7768 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7769 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7770 FW_VI_MAC_CMD_VIID_V(viid));
7771 c.freemacs_to_len16 = cpu_to_be32(FW_CMD_LEN16_V(1));
7772 p->valid_to_idx = cpu_to_be16(FW_VI_MAC_CMD_VALID_F |
7773 FW_VI_MAC_CMD_SMAC_RESULT_V(mode) |
7774 FW_VI_MAC_CMD_IDX_V(idx));
7775 memcpy(p->macaddr, addr, sizeof(p->macaddr));
7776
7777 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
7778 if (ret == 0) {
7779 ret = FW_VI_MAC_CMD_IDX_G(be16_to_cpu(p->valid_to_idx));
7780 if (ret >= max_mac_addr)
7781 ret = -ENOMEM;
7782 }
7783 return ret;
7784}
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797int t4_set_addr_hash(struct adapter *adap, unsigned int mbox, unsigned int viid,
7798 bool ucast, u64 vec, bool sleep_ok)
7799{
7800 struct fw_vi_mac_cmd c;
7801
7802 memset(&c, 0, sizeof(c));
7803 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_MAC_CMD) |
7804 FW_CMD_REQUEST_F | FW_CMD_WRITE_F |
7805 FW_VI_ENABLE_CMD_VIID_V(viid));
7806 c.freemacs_to_len16 = cpu_to_be32(FW_VI_MAC_CMD_HASHVECEN_F |
7807 FW_VI_MAC_CMD_HASHUNIEN_V(ucast) |
7808 FW_CMD_LEN16_V(1));
7809 c.u.hash.hashvec = cpu_to_be64(vec);
7810 return t4_wr_mbox_meat(adap, mbox, &c, sizeof(c), NULL, sleep_ok);
7811}
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825int t4_enable_vi_params(struct adapter *adap, unsigned int mbox,
7826 unsigned int viid, bool rx_en, bool tx_en, bool dcb_en)
7827{
7828 struct fw_vi_enable_cmd c;
7829
7830 memset(&c, 0, sizeof(c));
7831 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) |
7832 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7833 FW_VI_ENABLE_CMD_VIID_V(viid));
7834 c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_IEN_V(rx_en) |
7835 FW_VI_ENABLE_CMD_EEN_V(tx_en) |
7836 FW_VI_ENABLE_CMD_DCB_INFO_V(dcb_en) |
7837 FW_LEN16(c));
7838 return t4_wr_mbox_ns(adap, mbox, &c, sizeof(c), NULL);
7839}
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851int t4_enable_vi(struct adapter *adap, unsigned int mbox, unsigned int viid,
7852 bool rx_en, bool tx_en)
7853{
7854 return t4_enable_vi_params(adap, mbox, viid, rx_en, tx_en, 0);
7855}
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid,
7867 unsigned int nblinks)
7868{
7869 struct fw_vi_enable_cmd c;
7870
7871 memset(&c, 0, sizeof(c));
7872 c.op_to_viid = cpu_to_be32(FW_CMD_OP_V(FW_VI_ENABLE_CMD) |
7873 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7874 FW_VI_ENABLE_CMD_VIID_V(viid));
7875 c.ien_to_len16 = cpu_to_be32(FW_VI_ENABLE_CMD_LED_F | FW_LEN16(c));
7876 c.blinkdur = cpu_to_be16(nblinks);
7877 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7878}
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895int t4_iq_stop(struct adapter *adap, unsigned int mbox, unsigned int pf,
7896 unsigned int vf, unsigned int iqtype, unsigned int iqid,
7897 unsigned int fl0id, unsigned int fl1id)
7898{
7899 struct fw_iq_cmd c;
7900
7901 memset(&c, 0, sizeof(c));
7902 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F |
7903 FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) |
7904 FW_IQ_CMD_VFN_V(vf));
7905 c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_IQSTOP_F | FW_LEN16(c));
7906 c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype));
7907 c.iqid = cpu_to_be16(iqid);
7908 c.fl0id = cpu_to_be16(fl0id);
7909 c.fl1id = cpu_to_be16(fl1id);
7910 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7911}
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7927 unsigned int vf, unsigned int iqtype, unsigned int iqid,
7928 unsigned int fl0id, unsigned int fl1id)
7929{
7930 struct fw_iq_cmd c;
7931
7932 memset(&c, 0, sizeof(c));
7933 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F |
7934 FW_CMD_EXEC_F | FW_IQ_CMD_PFN_V(pf) |
7935 FW_IQ_CMD_VFN_V(vf));
7936 c.alloc_to_len16 = cpu_to_be32(FW_IQ_CMD_FREE_F | FW_LEN16(c));
7937 c.type_to_iqandstindex = cpu_to_be32(FW_IQ_CMD_TYPE_V(iqtype));
7938 c.iqid = cpu_to_be16(iqid);
7939 c.fl0id = cpu_to_be16(fl0id);
7940 c.fl1id = cpu_to_be16(fl1id);
7941 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7942}
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954int t4_eth_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7955 unsigned int vf, unsigned int eqid)
7956{
7957 struct fw_eq_eth_cmd c;
7958
7959 memset(&c, 0, sizeof(c));
7960 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_ETH_CMD) |
7961 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7962 FW_EQ_ETH_CMD_PFN_V(pf) |
7963 FW_EQ_ETH_CMD_VFN_V(vf));
7964 c.alloc_to_len16 = cpu_to_be32(FW_EQ_ETH_CMD_FREE_F | FW_LEN16(c));
7965 c.eqid_pkd = cpu_to_be32(FW_EQ_ETH_CMD_EQID_V(eqid));
7966 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7967}
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
7980 unsigned int vf, unsigned int eqid)
7981{
7982 struct fw_eq_ctrl_cmd c;
7983
7984 memset(&c, 0, sizeof(c));
7985 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_CTRL_CMD) |
7986 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
7987 FW_EQ_CTRL_CMD_PFN_V(pf) |
7988 FW_EQ_CTRL_CMD_VFN_V(vf));
7989 c.alloc_to_len16 = cpu_to_be32(FW_EQ_CTRL_CMD_FREE_F | FW_LEN16(c));
7990 c.cmpliqid_eqid = cpu_to_be32(FW_EQ_CTRL_CMD_EQID_V(eqid));
7991 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
7992}
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
8005 unsigned int vf, unsigned int eqid)
8006{
8007 struct fw_eq_ofld_cmd c;
8008
8009 memset(&c, 0, sizeof(c));
8010 c.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_EQ_OFLD_CMD) |
8011 FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
8012 FW_EQ_OFLD_CMD_PFN_V(pf) |
8013 FW_EQ_OFLD_CMD_VFN_V(vf));
8014 c.alloc_to_len16 = cpu_to_be32(FW_EQ_OFLD_CMD_FREE_F | FW_LEN16(c));
8015 c.eqid_pkd = cpu_to_be32(FW_EQ_OFLD_CMD_EQID_V(eqid));
8016 return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
8017}
8018
8019
8020
8021
8022
8023
8024
8025
8026static const char *t4_link_down_rc_str(unsigned char link_down_rc)
8027{
8028 static const char * const reason[] = {
8029 "Link Down",
8030 "Remote Fault",
8031 "Auto-negotiation Failure",
8032 "Reserved",
8033 "Insufficient Airflow",
8034 "Unable To Determine Reason",
8035 "No RX Signal Detected",
8036 "Reserved",
8037 };
8038
8039 if (link_down_rc >= ARRAY_SIZE(reason))
8040 return "Bad Reason Code";
8041
8042 return reason[link_down_rc];
8043}
8044
8045
8046
8047
8048static unsigned int fwcap_to_speed(fw_port_cap32_t caps)
8049{
8050 #define TEST_SPEED_RETURN(__caps_speed, __speed) \
8051 do { \
8052 if (caps & FW_PORT_CAP32_SPEED_##__caps_speed) \
8053 return __speed; \
8054 } while (0)
8055
8056 TEST_SPEED_RETURN(400G, 400000);
8057 TEST_SPEED_RETURN(200G, 200000);
8058 TEST_SPEED_RETURN(100G, 100000);
8059 TEST_SPEED_RETURN(50G, 50000);
8060 TEST_SPEED_RETURN(40G, 40000);
8061 TEST_SPEED_RETURN(25G, 25000);
8062 TEST_SPEED_RETURN(10G, 10000);
8063 TEST_SPEED_RETURN(1G, 1000);
8064 TEST_SPEED_RETURN(100M, 100);
8065
8066 #undef TEST_SPEED_RETURN
8067
8068 return 0;
8069}
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079static fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps)
8080{
8081 #define TEST_SPEED_RETURN(__caps_speed) \
8082 do { \
8083 if (acaps & FW_PORT_CAP32_SPEED_##__caps_speed) \
8084 return FW_PORT_CAP32_SPEED_##__caps_speed; \
8085 } while (0)
8086
8087 TEST_SPEED_RETURN(400G);
8088 TEST_SPEED_RETURN(200G);
8089 TEST_SPEED_RETURN(100G);
8090 TEST_SPEED_RETURN(50G);
8091 TEST_SPEED_RETURN(40G);
8092 TEST_SPEED_RETURN(25G);
8093 TEST_SPEED_RETURN(10G);
8094 TEST_SPEED_RETURN(1G);
8095 TEST_SPEED_RETURN(100M);
8096
8097 #undef TEST_SPEED_RETURN
8098
8099 return 0;
8100}
8101
8102
8103
8104
8105
8106
8107
8108
8109static fw_port_cap32_t lstatus_to_fwcap(u32 lstatus)
8110{
8111 fw_port_cap32_t linkattr = 0;
8112
8113
8114
8115
8116
8117 if (lstatus & FW_PORT_CMD_RXPAUSE_F)
8118 linkattr |= FW_PORT_CAP32_FC_RX;
8119 if (lstatus & FW_PORT_CMD_TXPAUSE_F)
8120 linkattr |= FW_PORT_CAP32_FC_TX;
8121 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100M))
8122 linkattr |= FW_PORT_CAP32_SPEED_100M;
8123 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_1G))
8124 linkattr |= FW_PORT_CAP32_SPEED_1G;
8125 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G))
8126 linkattr |= FW_PORT_CAP32_SPEED_10G;
8127 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_25G))
8128 linkattr |= FW_PORT_CAP32_SPEED_25G;
8129 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G))
8130 linkattr |= FW_PORT_CAP32_SPEED_40G;
8131 if (lstatus & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100G))
8132 linkattr |= FW_PORT_CAP32_SPEED_100G;
8133
8134 return linkattr;
8135}
8136
8137
8138
8139
8140
8141
8142
8143
8144void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl)
8145{
8146 const struct fw_port_cmd *cmd = (const void *)rpl;
8147 int action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
8148 struct adapter *adapter = pi->adapter;
8149 struct link_config *lc = &pi->link_cfg;
8150 int link_ok, linkdnrc;
8151 enum fw_port_type port_type;
8152 enum fw_port_module_type mod_type;
8153 unsigned int speed, fc, fec;
8154 fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
8155
8156
8157
8158 switch (action) {
8159 case FW_PORT_ACTION_GET_PORT_INFO: {
8160 u32 lstatus = be32_to_cpu(cmd->u.info.lstatus_to_modtype);
8161
8162 link_ok = (lstatus & FW_PORT_CMD_LSTATUS_F) != 0;
8163 linkdnrc = FW_PORT_CMD_LINKDNRC_G(lstatus);
8164 port_type = FW_PORT_CMD_PTYPE_G(lstatus);
8165 mod_type = FW_PORT_CMD_MODTYPE_G(lstatus);
8166 pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.pcap));
8167 acaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.acap));
8168 lpacaps = fwcaps16_to_caps32(be16_to_cpu(cmd->u.info.lpacap));
8169 linkattr = lstatus_to_fwcap(lstatus);
8170 break;
8171 }
8172
8173 case FW_PORT_ACTION_GET_PORT_INFO32: {
8174 u32 lstatus32;
8175
8176 lstatus32 = be32_to_cpu(cmd->u.info32.lstatus32_to_cbllen32);
8177 link_ok = (lstatus32 & FW_PORT_CMD_LSTATUS32_F) != 0;
8178 linkdnrc = FW_PORT_CMD_LINKDNRC32_G(lstatus32);
8179 port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32);
8180 mod_type = FW_PORT_CMD_MODTYPE32_G(lstatus32);
8181 pcaps = be32_to_cpu(cmd->u.info32.pcaps32);
8182 acaps = be32_to_cpu(cmd->u.info32.acaps32);
8183 lpacaps = be32_to_cpu(cmd->u.info32.lpacaps32);
8184 linkattr = be32_to_cpu(cmd->u.info32.linkattr32);
8185 break;
8186 }
8187
8188 default:
8189 dev_err(adapter->pdev_dev, "Handle Port Information: Bad Command/Action %#x\n",
8190 be32_to_cpu(cmd->action_to_len16));
8191 return;
8192 }
8193
8194 fec = fwcap_to_cc_fec(acaps);
8195 fc = fwcap_to_cc_pause(linkattr);
8196 speed = fwcap_to_speed(linkattr);
8197
8198 if (mod_type != pi->mod_type) {
8199
8200
8201
8202
8203
8204
8205
8206
8207 lc->pcaps = pcaps;
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217 lc->def_acaps = acaps;
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229 pi->port_type = port_type;
8230
8231 pi->mod_type = mod_type;
8232 t4_os_portmod_changed(adapter, pi->port_id);
8233 }
8234
8235 if (link_ok != lc->link_ok || speed != lc->speed ||
8236 fc != lc->fc || fec != lc->fec) {
8237 if (!link_ok && lc->link_ok) {
8238 lc->link_down_rc = linkdnrc;
8239 dev_warn(adapter->pdev_dev, "Port %d link down, reason: %s\n",
8240 pi->tx_chan, t4_link_down_rc_str(linkdnrc));
8241 }
8242 lc->link_ok = link_ok;
8243 lc->speed = speed;
8244 lc->fc = fc;
8245 lc->fec = fec;
8246
8247 lc->lpacaps = lpacaps;
8248 lc->acaps = acaps & ADVERT_MASK;
8249
8250 if (lc->acaps & FW_PORT_CAP32_ANEG) {
8251 lc->autoneg = AUTONEG_ENABLE;
8252 } else {
8253
8254
8255
8256
8257 lc->acaps = 0;
8258 lc->speed_caps = fwcap_to_fwspeed(acaps);
8259 lc->autoneg = AUTONEG_DISABLE;
8260 }
8261
8262 t4_os_link_changed(adapter, pi->port_id, link_ok);
8263 }
8264}
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274int t4_update_port_info(struct port_info *pi)
8275{
8276 unsigned int fw_caps = pi->adapter->params.fw_caps_support;
8277 struct fw_port_cmd port_cmd;
8278 int ret;
8279
8280 memset(&port_cmd, 0, sizeof(port_cmd));
8281 port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
8282 FW_CMD_REQUEST_F | FW_CMD_READ_F |
8283 FW_PORT_CMD_PORTID_V(pi->tx_chan));
8284 port_cmd.action_to_len16 = cpu_to_be32(
8285 FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
8286 ? FW_PORT_ACTION_GET_PORT_INFO
8287 : FW_PORT_ACTION_GET_PORT_INFO32) |
8288 FW_LEN16(port_cmd));
8289 ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox,
8290 &port_cmd, sizeof(port_cmd), &port_cmd);
8291 if (ret)
8292 return ret;
8293
8294 t4_handle_get_port_info(pi, (__be64 *)&port_cmd);
8295 return 0;
8296}
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309int t4_get_link_params(struct port_info *pi, unsigned int *link_okp,
8310 unsigned int *speedp, unsigned int *mtup)
8311{
8312 unsigned int fw_caps = pi->adapter->params.fw_caps_support;
8313 struct fw_port_cmd port_cmd;
8314 unsigned int action, link_ok, speed, mtu;
8315 fw_port_cap32_t linkattr;
8316 int ret;
8317
8318 memset(&port_cmd, 0, sizeof(port_cmd));
8319 port_cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
8320 FW_CMD_REQUEST_F | FW_CMD_READ_F |
8321 FW_PORT_CMD_PORTID_V(pi->tx_chan));
8322 action = (fw_caps == FW_CAPS16
8323 ? FW_PORT_ACTION_GET_PORT_INFO
8324 : FW_PORT_ACTION_GET_PORT_INFO32);
8325 port_cmd.action_to_len16 = cpu_to_be32(
8326 FW_PORT_CMD_ACTION_V(action) |
8327 FW_LEN16(port_cmd));
8328 ret = t4_wr_mbox(pi->adapter, pi->adapter->mbox,
8329 &port_cmd, sizeof(port_cmd), &port_cmd);
8330 if (ret)
8331 return ret;
8332
8333 if (action == FW_PORT_ACTION_GET_PORT_INFO) {
8334 u32 lstatus = be32_to_cpu(port_cmd.u.info.lstatus_to_modtype);
8335
8336 link_ok = !!(lstatus & FW_PORT_CMD_LSTATUS_F);
8337 linkattr = lstatus_to_fwcap(lstatus);
8338 mtu = be16_to_cpu(port_cmd.u.info.mtu);
8339 } else {
8340 u32 lstatus32 =
8341 be32_to_cpu(port_cmd.u.info32.lstatus32_to_cbllen32);
8342
8343 link_ok = !!(lstatus32 & FW_PORT_CMD_LSTATUS32_F);
8344 linkattr = be32_to_cpu(port_cmd.u.info32.linkattr32);
8345 mtu = FW_PORT_CMD_MTU32_G(
8346 be32_to_cpu(port_cmd.u.info32.auxlinfo32_mtu32));
8347 }
8348 speed = fwcap_to_speed(linkattr);
8349
8350 *link_okp = link_ok;
8351 *speedp = fwcap_to_speed(linkattr);
8352 *mtup = mtu;
8353
8354 return 0;
8355}
8356
8357
8358
8359
8360
8361
8362
8363
8364int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
8365{
8366 u8 opcode = *(const u8 *)rpl;
8367
8368
8369
8370
8371
8372
8373 const struct fw_port_cmd *p = (const void *)rpl;
8374 unsigned int action =
8375 FW_PORT_CMD_ACTION_G(be32_to_cpu(p->action_to_len16));
8376
8377 if (opcode == FW_PORT_CMD &&
8378 (action == FW_PORT_ACTION_GET_PORT_INFO ||
8379 action == FW_PORT_ACTION_GET_PORT_INFO32)) {
8380 int i;
8381 int chan = FW_PORT_CMD_PORTID_G(be32_to_cpu(p->op_to_portid));
8382 struct port_info *pi = NULL;
8383
8384 for_each_port(adap, i) {
8385 pi = adap2pinfo(adap, i);
8386 if (pi->tx_chan == chan)
8387 break;
8388 }
8389
8390 t4_handle_get_port_info(pi, rpl);
8391 } else {
8392 dev_warn(adap->pdev_dev, "Unknown firmware reply %d\n",
8393 opcode);
8394 return -EINVAL;
8395 }
8396 return 0;
8397}
8398
8399static void get_pci_mode(struct adapter *adapter, struct pci_params *p)
8400{
8401 u16 val;
8402
8403 if (pci_is_pcie(adapter->pdev)) {
8404 pcie_capability_read_word(adapter->pdev, PCI_EXP_LNKSTA, &val);
8405 p->speed = val & PCI_EXP_LNKSTA_CLS;
8406 p->width = (val & PCI_EXP_LNKSTA_NLW) >> 4;
8407 }
8408}
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419static void init_link_config(struct link_config *lc, fw_port_cap32_t pcaps,
8420 fw_port_cap32_t acaps)
8421{
8422 lc->pcaps = pcaps;
8423 lc->def_acaps = acaps;
8424 lc->lpacaps = 0;
8425 lc->speed_caps = 0;
8426 lc->speed = 0;
8427 lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
8428
8429
8430
8431
8432 lc->requested_fec = FEC_AUTO;
8433 lc->fec = fwcap_to_cc_fec(lc->def_acaps);
8434
8435 if (lc->pcaps & FW_PORT_CAP32_ANEG) {
8436 lc->acaps = lc->pcaps & ADVERT_MASK;
8437 lc->autoneg = AUTONEG_ENABLE;
8438 lc->requested_fc |= PAUSE_AUTONEG;
8439 } else {
8440 lc->acaps = 0;
8441 lc->autoneg = AUTONEG_DISABLE;
8442 }
8443}
8444
8445#define CIM_PF_NOACCESS 0xeeeeeeee
8446
8447int t4_wait_dev_ready(void __iomem *regs)
8448{
8449 u32 whoami;
8450
8451 whoami = readl(regs + PL_WHOAMI_A);
8452 if (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS)
8453 return 0;
8454
8455 msleep(500);
8456 whoami = readl(regs + PL_WHOAMI_A);
8457 return (whoami != 0xffffffff && whoami != CIM_PF_NOACCESS ? 0 : -EIO);
8458}
8459
8460struct flash_desc {
8461 u32 vendor_and_model_id;
8462 u32 size_mb;
8463};
8464
8465static int t4_get_flash_params(struct adapter *adap)
8466{
8467
8468
8469
8470 static struct flash_desc supported_flash[] = {
8471 { 0x150201, 4 << 20 },
8472 };
8473
8474 unsigned int part, manufacturer;
8475 unsigned int density, size;
8476 u32 flashid = 0;
8477 int ret;
8478
8479
8480
8481
8482
8483
8484
8485 ret = sf1_write(adap, 1, 1, 0, SF_RD_ID);
8486 if (!ret)
8487 ret = sf1_read(adap, 3, 0, 1, &flashid);
8488 t4_write_reg(adap, SF_OP_A, 0);
8489 if (ret)
8490 return ret;
8491
8492
8493
8494 for (part = 0; part < ARRAY_SIZE(supported_flash); part++)
8495 if (supported_flash[part].vendor_and_model_id == flashid) {
8496 adap->params.sf_size = supported_flash[part].size_mb;
8497 adap->params.sf_nsec =
8498 adap->params.sf_size / SF_SEC_SIZE;
8499 goto found;
8500 }
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510 manufacturer = flashid & 0xff;
8511 switch (manufacturer) {
8512 case 0x20: {
8513
8514
8515
8516 density = (flashid >> 16) & 0xff;
8517 switch (density) {
8518 case 0x14:
8519 size = 1 << 20;
8520 break;
8521 case 0x15:
8522 size = 1 << 21;
8523 break;
8524 case 0x16:
8525 size = 1 << 22;
8526 break;
8527 case 0x17:
8528 size = 1 << 23;
8529 break;
8530 case 0x18:
8531 size = 1 << 24;
8532 break;
8533 case 0x19:
8534 size = 1 << 25;
8535 break;
8536 case 0x20:
8537 size = 1 << 26;
8538 break;
8539 case 0x21:
8540 size = 1 << 27;
8541 break;
8542 case 0x22:
8543 size = 1 << 28;
8544 break;
8545
8546 default:
8547 dev_err(adap->pdev_dev, "Micron Flash Part has bad size, ID = %#x, Density code = %#x\n",
8548 flashid, density);
8549 return -EINVAL;
8550 }
8551 break;
8552 }
8553 case 0xc2: {
8554
8555
8556
8557 density = (flashid >> 16) & 0xff;
8558 switch (density) {
8559 case 0x17:
8560 size = 1 << 23;
8561 break;
8562 case 0x18:
8563 size = 1 << 24;
8564 break;
8565 default:
8566 dev_err(adap->pdev_dev, "Macronix Flash Part has bad size, ID = %#x, Density code = %#x\n",
8567 flashid, density);
8568 return -EINVAL;
8569 }
8570 break;
8571 }
8572 case 0xef: {
8573
8574
8575
8576 density = (flashid >> 16) & 0xff;
8577 switch (density) {
8578 case 0x17:
8579 size = 1 << 23;
8580 break;
8581 case 0x18:
8582 size = 1 << 24;
8583 break;
8584 default:
8585 dev_err(adap->pdev_dev, "Winbond Flash Part has bad size, ID = %#x, Density code = %#x\n",
8586 flashid, density);
8587 return -EINVAL;
8588 }
8589 break;
8590 }
8591 default:
8592 dev_err(adap->pdev_dev, "Unsupported Flash Part, ID = %#x\n",
8593 flashid);
8594 return -EINVAL;
8595 }
8596
8597
8598 adap->params.sf_size = size;
8599 adap->params.sf_nsec = size / SF_SEC_SIZE;
8600
8601found:
8602 if (adap->params.sf_size < FLASH_MIN_SIZE)
8603 dev_warn(adap->pdev_dev, "WARNING: Flash Part ID %#x, size %#x < %#x\n",
8604 flashid, adap->params.sf_size, FLASH_MIN_SIZE);
8605 return 0;
8606}
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617int t4_prep_adapter(struct adapter *adapter)
8618{
8619 int ret, ver;
8620 uint16_t device_id;
8621 u32 pl_rev;
8622
8623 get_pci_mode(adapter, &adapter->params.pci);
8624 pl_rev = REV_G(t4_read_reg(adapter, PL_REV_A));
8625
8626 ret = t4_get_flash_params(adapter);
8627 if (ret < 0) {
8628 dev_err(adapter->pdev_dev, "error %d identifying flash\n", ret);
8629 return ret;
8630 }
8631
8632
8633
8634 pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id);
8635 ver = device_id >> 12;
8636 adapter->params.chip = 0;
8637 switch (ver) {
8638 case CHELSIO_T4:
8639 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev);
8640 adapter->params.arch.sge_fl_db = DBPRIO_F;
8641 adapter->params.arch.mps_tcam_size =
8642 NUM_MPS_CLS_SRAM_L_INSTANCES;
8643 adapter->params.arch.mps_rplc_size = 128;
8644 adapter->params.arch.nchan = NCHAN;
8645 adapter->params.arch.pm_stats_cnt = PM_NSTATS;
8646 adapter->params.arch.vfcount = 128;
8647
8648
8649
8650 adapter->params.arch.cng_ch_bits_log = 2;
8651 break;
8652 case CHELSIO_T5:
8653 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev);
8654 adapter->params.arch.sge_fl_db = DBPRIO_F | DBTYPE_F;
8655 adapter->params.arch.mps_tcam_size =
8656 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
8657 adapter->params.arch.mps_rplc_size = 128;
8658 adapter->params.arch.nchan = NCHAN;
8659 adapter->params.arch.pm_stats_cnt = PM_NSTATS;
8660 adapter->params.arch.vfcount = 128;
8661 adapter->params.arch.cng_ch_bits_log = 2;
8662 break;
8663 case CHELSIO_T6:
8664 adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T6, pl_rev);
8665 adapter->params.arch.sge_fl_db = 0;
8666 adapter->params.arch.mps_tcam_size =
8667 NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
8668 adapter->params.arch.mps_rplc_size = 256;
8669 adapter->params.arch.nchan = 2;
8670 adapter->params.arch.pm_stats_cnt = T6_PM_NSTATS;
8671 adapter->params.arch.vfcount = 256;
8672
8673
8674
8675 adapter->params.arch.cng_ch_bits_log = 3;
8676 break;
8677 default:
8678 dev_err(adapter->pdev_dev, "Device %d is not supported\n",
8679 device_id);
8680 return -EINVAL;
8681 }
8682
8683 adapter->params.cim_la_size = CIMLA_SIZE;
8684 init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
8685
8686
8687
8688
8689 adapter->params.nports = 1;
8690 adapter->params.portvec = 1;
8691 adapter->params.vpd.cclk = 50000;
8692
8693
8694 pcie_capability_clear_and_set_word(adapter->pdev, PCI_EXP_DEVCTL2,
8695 PCI_EXP_DEVCTL2_COMP_TIMEOUT, 0xd);
8696 return 0;
8697}
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711int t4_shutdown_adapter(struct adapter *adapter)
8712{
8713 int port;
8714
8715 t4_intr_disable(adapter);
8716 t4_write_reg(adapter, DBG_GPIO_EN_A, 0);
8717 for_each_port(adapter, port) {
8718 u32 a_port_cfg = is_t4(adapter->params.chip) ?
8719 PORT_REG(port, XGMAC_PORT_CFG_A) :
8720 T5_PORT_REG(port, MAC_PORT_CFG_A);
8721
8722 t4_write_reg(adapter, a_port_cfg,
8723 t4_read_reg(adapter, a_port_cfg)
8724 & ~SIGNAL_DET_V(1));
8725 }
8726 t4_set_reg_field(adapter, SGE_CONTROL_A, GLOBALENABLE_F, 0);
8727
8728 return 0;
8729}
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757int t4_bar2_sge_qregs(struct adapter *adapter,
8758 unsigned int qid,
8759 enum t4_bar2_qtype qtype,
8760 int user,
8761 u64 *pbar2_qoffset,
8762 unsigned int *pbar2_qid)
8763{
8764 unsigned int page_shift, page_size, qpp_shift, qpp_mask;
8765 u64 bar2_page_offset, bar2_qoffset;
8766 unsigned int bar2_qid, bar2_qid_offset, bar2_qinferred;
8767
8768
8769 if (!user && is_t4(adapter->params.chip))
8770 return -EINVAL;
8771
8772
8773
8774 page_shift = adapter->params.sge.hps + 10;
8775 page_size = 1 << page_shift;
8776
8777
8778
8779 qpp_shift = (qtype == T4_BAR2_QTYPE_EGRESS
8780 ? adapter->params.sge.eq_qpp
8781 : adapter->params.sge.iq_qpp);
8782 qpp_mask = (1 << qpp_shift) - 1;
8783
8784
8785
8786
8787
8788
8789 bar2_page_offset = ((u64)(qid >> qpp_shift) << page_shift);
8790 bar2_qid = qid & qpp_mask;
8791 bar2_qid_offset = bar2_qid * SGE_UDB_SIZE;
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809 bar2_qoffset = bar2_page_offset;
8810 bar2_qinferred = (bar2_qid_offset < page_size);
8811 if (bar2_qinferred) {
8812 bar2_qoffset += bar2_qid_offset;
8813 bar2_qid = 0;
8814 }
8815
8816 *pbar2_qoffset = bar2_qoffset;
8817 *pbar2_qid = bar2_qid;
8818 return 0;
8819}
8820
8821
8822
8823
8824
8825
8826
8827
8828int t4_init_devlog_params(struct adapter *adap)
8829{
8830 struct devlog_params *dparams = &adap->params.devlog;
8831 u32 pf_dparams;
8832 unsigned int devlog_meminfo;
8833 struct fw_devlog_cmd devlog_cmd;
8834 int ret;
8835
8836
8837
8838
8839
8840 pf_dparams =
8841 t4_read_reg(adap, PCIE_FW_REG(PCIE_FW_PF_A, PCIE_FW_PF_DEVLOG));
8842 if (pf_dparams) {
8843 unsigned int nentries, nentries128;
8844
8845 dparams->memtype = PCIE_FW_PF_DEVLOG_MEMTYPE_G(pf_dparams);
8846 dparams->start = PCIE_FW_PF_DEVLOG_ADDR16_G(pf_dparams) << 4;
8847
8848 nentries128 = PCIE_FW_PF_DEVLOG_NENTRIES128_G(pf_dparams);
8849 nentries = (nentries128 + 1) * 128;
8850 dparams->size = nentries * sizeof(struct fw_devlog_e);
8851
8852 return 0;
8853 }
8854
8855
8856
8857 memset(&devlog_cmd, 0, sizeof(devlog_cmd));
8858 devlog_cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_DEVLOG_CMD) |
8859 FW_CMD_REQUEST_F | FW_CMD_READ_F);
8860 devlog_cmd.retval_len16 = cpu_to_be32(FW_LEN16(devlog_cmd));
8861 ret = t4_wr_mbox(adap, adap->mbox, &devlog_cmd, sizeof(devlog_cmd),
8862 &devlog_cmd);
8863 if (ret)
8864 return ret;
8865
8866 devlog_meminfo =
8867 be32_to_cpu(devlog_cmd.memtype_devlog_memaddr16_devlog);
8868 dparams->memtype = FW_DEVLOG_CMD_MEMTYPE_DEVLOG_G(devlog_meminfo);
8869 dparams->start = FW_DEVLOG_CMD_MEMADDR16_DEVLOG_G(devlog_meminfo) << 4;
8870 dparams->size = be32_to_cpu(devlog_cmd.memsize_devlog);
8871
8872 return 0;
8873}
8874
8875
8876
8877
8878
8879
8880
8881int t4_init_sge_params(struct adapter *adapter)
8882{
8883 struct sge_params *sge_params = &adapter->params.sge;
8884 u32 hps, qpp;
8885 unsigned int s_hps, s_qpp;
8886
8887
8888
8889 hps = t4_read_reg(adapter, SGE_HOST_PAGE_SIZE_A);
8890 s_hps = (HOSTPAGESIZEPF0_S +
8891 (HOSTPAGESIZEPF1_S - HOSTPAGESIZEPF0_S) * adapter->pf);
8892 sge_params->hps = ((hps >> s_hps) & HOSTPAGESIZEPF0_M);
8893
8894
8895
8896 s_qpp = (QUEUESPERPAGEPF0_S +
8897 (QUEUESPERPAGEPF1_S - QUEUESPERPAGEPF0_S) * adapter->pf);
8898 qpp = t4_read_reg(adapter, SGE_EGRESS_QUEUES_PER_PAGE_PF_A);
8899 sge_params->eq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M);
8900 qpp = t4_read_reg(adapter, SGE_INGRESS_QUEUES_PER_PAGE_PF_A);
8901 sge_params->iq_qpp = ((qpp >> s_qpp) & QUEUESPERPAGEPF0_M);
8902
8903 return 0;
8904}
8905
8906
8907
8908
8909
8910
8911
8912
8913int t4_init_tp_params(struct adapter *adap, bool sleep_ok)
8914{
8915 int chan;
8916 u32 v;
8917
8918 v = t4_read_reg(adap, TP_TIMER_RESOLUTION_A);
8919 adap->params.tp.tre = TIMERRESOLUTION_G(v);
8920 adap->params.tp.dack_re = DELAYEDACKRESOLUTION_G(v);
8921
8922
8923 for (chan = 0; chan < NCHAN; chan++)
8924 adap->params.tp.tx_modq[chan] = chan;
8925
8926
8927
8928
8929 t4_tp_pio_read(adap, &adap->params.tp.vlan_pri_map, 1,
8930 TP_VLAN_PRI_MAP_A, sleep_ok);
8931 t4_tp_pio_read(adap, &adap->params.tp.ingress_config, 1,
8932 TP_INGRESS_CONFIG_A, sleep_ok);
8933
8934
8935
8936
8937 if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) {
8938 v = t4_read_reg(adap, TP_OUT_CONFIG_A);
8939 adap->params.tp.rx_pkt_encap = (v & CRXPKTENC_F) ? 1 : 0;
8940 }
8941
8942
8943
8944
8945
8946 adap->params.tp.fcoe_shift = t4_filter_field_shift(adap, FCOE_F);
8947 adap->params.tp.port_shift = t4_filter_field_shift(adap, PORT_F);
8948 adap->params.tp.vnic_shift = t4_filter_field_shift(adap, VNIC_ID_F);
8949 adap->params.tp.vlan_shift = t4_filter_field_shift(adap, VLAN_F);
8950 adap->params.tp.tos_shift = t4_filter_field_shift(adap, TOS_F);
8951 adap->params.tp.protocol_shift = t4_filter_field_shift(adap,
8952 PROTOCOL_F);
8953 adap->params.tp.ethertype_shift = t4_filter_field_shift(adap,
8954 ETHERTYPE_F);
8955 adap->params.tp.macmatch_shift = t4_filter_field_shift(adap,
8956 MACMATCH_F);
8957 adap->params.tp.matchtype_shift = t4_filter_field_shift(adap,
8958 MPSHITTYPE_F);
8959 adap->params.tp.frag_shift = t4_filter_field_shift(adap,
8960 FRAGMENTATION_F);
8961
8962
8963
8964
8965 if ((adap->params.tp.ingress_config & VNIC_F) == 0)
8966 adap->params.tp.vnic_shift = -1;
8967
8968 v = t4_read_reg(adap, LE_3_DB_HASH_MASK_GEN_IPV4_T6_A);
8969 adap->params.tp.hash_filter_mask = v;
8970 v = t4_read_reg(adap, LE_4_DB_HASH_MASK_GEN_IPV4_T6_A);
8971 adap->params.tp.hash_filter_mask |= ((u64)v << 32);
8972 return 0;
8973}
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984int t4_filter_field_shift(const struct adapter *adap, int filter_sel)
8985{
8986 unsigned int filter_mode = adap->params.tp.vlan_pri_map;
8987 unsigned int sel;
8988 int field_shift;
8989
8990 if ((filter_mode & filter_sel) == 0)
8991 return -1;
8992
8993 for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) {
8994 switch (filter_mode & sel) {
8995 case FCOE_F:
8996 field_shift += FT_FCOE_W;
8997 break;
8998 case PORT_F:
8999 field_shift += FT_PORT_W;
9000 break;
9001 case VNIC_ID_F:
9002 field_shift += FT_VNIC_ID_W;
9003 break;
9004 case VLAN_F:
9005 field_shift += FT_VLAN_W;
9006 break;
9007 case TOS_F:
9008 field_shift += FT_TOS_W;
9009 break;
9010 case PROTOCOL_F:
9011 field_shift += FT_PROTOCOL_W;
9012 break;
9013 case ETHERTYPE_F:
9014 field_shift += FT_ETHERTYPE_W;
9015 break;
9016 case MACMATCH_F:
9017 field_shift += FT_MACMATCH_W;
9018 break;
9019 case MPSHITTYPE_F:
9020 field_shift += FT_MPSHITTYPE_W;
9021 break;
9022 case FRAGMENTATION_F:
9023 field_shift += FT_FRAGMENTATION_W;
9024 break;
9025 }
9026 }
9027 return field_shift;
9028}
9029
9030int t4_init_rss_mode(struct adapter *adap, int mbox)
9031{
9032 int i, ret;
9033 struct fw_rss_vi_config_cmd rvc;
9034
9035 memset(&rvc, 0, sizeof(rvc));
9036
9037 for_each_port(adap, i) {
9038 struct port_info *p = adap2pinfo(adap, i);
9039
9040 rvc.op_to_viid =
9041 cpu_to_be32(FW_CMD_OP_V(FW_RSS_VI_CONFIG_CMD) |
9042 FW_CMD_REQUEST_F | FW_CMD_READ_F |
9043 FW_RSS_VI_CONFIG_CMD_VIID_V(p->viid));
9044 rvc.retval_len16 = cpu_to_be32(FW_LEN16(rvc));
9045 ret = t4_wr_mbox(adap, mbox, &rvc, sizeof(rvc), &rvc);
9046 if (ret)
9047 return ret;
9048 p->rss_mode = be32_to_cpu(rvc.u.basicvirtual.defaultq_to_udpen);
9049 }
9050 return 0;
9051}
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067int t4_init_portinfo(struct port_info *pi, int mbox,
9068 int port, int pf, int vf, u8 mac[])
9069{
9070 struct adapter *adapter = pi->adapter;
9071 unsigned int fw_caps = adapter->params.fw_caps_support;
9072 struct fw_port_cmd cmd;
9073 unsigned int rss_size;
9074 enum fw_port_type port_type;
9075 int mdio_addr;
9076 fw_port_cap32_t pcaps, acaps;
9077 int ret;
9078
9079
9080
9081
9082
9083
9084
9085 if (fw_caps == FW_CAPS_UNKNOWN) {
9086 u32 param, val;
9087
9088 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) |
9089 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_PORT_CAPS32));
9090 val = 1;
9091 ret = t4_set_params(adapter, mbox, pf, vf, 1, ¶m, &val);
9092 fw_caps = (ret == 0 ? FW_CAPS32 : FW_CAPS16);
9093 adapter->params.fw_caps_support = fw_caps;
9094 }
9095
9096 memset(&cmd, 0, sizeof(cmd));
9097 cmd.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
9098 FW_CMD_REQUEST_F | FW_CMD_READ_F |
9099 FW_PORT_CMD_PORTID_V(port));
9100 cmd.action_to_len16 = cpu_to_be32(
9101 FW_PORT_CMD_ACTION_V(fw_caps == FW_CAPS16
9102 ? FW_PORT_ACTION_GET_PORT_INFO
9103 : FW_PORT_ACTION_GET_PORT_INFO32) |
9104 FW_LEN16(cmd));
9105 ret = t4_wr_mbox(pi->adapter, mbox, &cmd, sizeof(cmd), &cmd);
9106 if (ret)
9107 return ret;
9108
9109
9110
9111 if (fw_caps == FW_CAPS16) {
9112 u32 lstatus = be32_to_cpu(cmd.u.info.lstatus_to_modtype);
9113
9114 port_type = FW_PORT_CMD_PTYPE_G(lstatus);
9115 mdio_addr = ((lstatus & FW_PORT_CMD_MDIOCAP_F)
9116 ? FW_PORT_CMD_MDIOADDR_G(lstatus)
9117 : -1);
9118 pcaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.pcap));
9119 acaps = fwcaps16_to_caps32(be16_to_cpu(cmd.u.info.acap));
9120 } else {
9121 u32 lstatus32 = be32_to_cpu(cmd.u.info32.lstatus32_to_cbllen32);
9122
9123 port_type = FW_PORT_CMD_PORTTYPE32_G(lstatus32);
9124 mdio_addr = ((lstatus32 & FW_PORT_CMD_MDIOCAP32_F)
9125 ? FW_PORT_CMD_MDIOADDR32_G(lstatus32)
9126 : -1);
9127 pcaps = be32_to_cpu(cmd.u.info32.pcaps32);
9128 acaps = be32_to_cpu(cmd.u.info32.acaps32);
9129 }
9130
9131 ret = t4_alloc_vi(pi->adapter, mbox, port, pf, vf, 1, mac, &rss_size);
9132 if (ret < 0)
9133 return ret;
9134
9135 pi->viid = ret;
9136 pi->tx_chan = port;
9137 pi->lport = port;
9138 pi->rss_size = rss_size;
9139
9140 pi->port_type = port_type;
9141 pi->mdio_addr = mdio_addr;
9142 pi->mod_type = FW_PORT_MOD_TYPE_NA;
9143
9144 init_link_config(&pi->link_cfg, pcaps, acaps);
9145 return 0;
9146}
9147
9148int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
9149{
9150 u8 addr[6];
9151 int ret, i, j = 0;
9152
9153 for_each_port(adap, i) {
9154 struct port_info *pi = adap2pinfo(adap, i);
9155
9156 while ((adap->params.portvec & (1 << j)) == 0)
9157 j++;
9158
9159 ret = t4_init_portinfo(pi, mbox, j, pf, vf, addr);
9160 if (ret)
9161 return ret;
9162
9163 memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
9164 j++;
9165 }
9166 return 0;
9167}
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres)
9180{
9181 unsigned int i, v;
9182 int cim_num_obq = is_t4(adap->params.chip) ?
9183 CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
9184
9185 for (i = 0; i < CIM_NUM_IBQ; i++) {
9186 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, IBQSELECT_F |
9187 QUENUMSELECT_V(i));
9188 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9189
9190 *base++ = CIMQBASE_G(v) * 256;
9191 *size++ = CIMQSIZE_G(v) * 256;
9192 *thres++ = QUEFULLTHRSH_G(v) * 8;
9193 }
9194 for (i = 0; i < cim_num_obq; i++) {
9195 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
9196 QUENUMSELECT_V(i));
9197 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9198
9199 *base++ = CIMQBASE_G(v) * 256;
9200 *size++ = CIMQSIZE_G(v) * 256;
9201 }
9202}
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215int t4_read_cim_ibq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
9216{
9217 int i, err, attempts;
9218 unsigned int addr;
9219 const unsigned int nwords = CIM_IBQ_SIZE * 4;
9220
9221 if (qid > 5 || (n & 3))
9222 return -EINVAL;
9223
9224 addr = qid * nwords;
9225 if (n > nwords)
9226 n = nwords;
9227
9228
9229
9230
9231 attempts = 1000000;
9232
9233 for (i = 0; i < n; i++, addr++) {
9234 t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, IBQDBGADDR_V(addr) |
9235 IBQDBGEN_F);
9236 err = t4_wait_op_done(adap, CIM_IBQ_DBG_CFG_A, IBQDBGBUSY_F, 0,
9237 attempts, 1);
9238 if (err)
9239 return err;
9240 *data++ = t4_read_reg(adap, CIM_IBQ_DBG_DATA_A);
9241 }
9242 t4_write_reg(adap, CIM_IBQ_DBG_CFG_A, 0);
9243 return i;
9244}
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257int t4_read_cim_obq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
9258{
9259 int i, err;
9260 unsigned int addr, v, nwords;
9261 int cim_num_obq = is_t4(adap->params.chip) ?
9262 CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
9263
9264 if ((qid > (cim_num_obq - 1)) || (n & 3))
9265 return -EINVAL;
9266
9267 t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
9268 QUENUMSELECT_V(qid));
9269 v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
9270
9271 addr = CIMQBASE_G(v) * 64;
9272 nwords = CIMQSIZE_G(v) * 64;
9273 if (n > nwords)
9274 n = nwords;
9275
9276 for (i = 0; i < n; i++, addr++) {
9277 t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, OBQDBGADDR_V(addr) |
9278 OBQDBGEN_F);
9279 err = t4_wait_op_done(adap, CIM_OBQ_DBG_CFG_A, OBQDBGBUSY_F, 0,
9280 2, 1);
9281 if (err)
9282 return err;
9283 *data++ = t4_read_reg(adap, CIM_OBQ_DBG_DATA_A);
9284 }
9285 t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, 0);
9286 return i;
9287}
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298int t4_cim_read(struct adapter *adap, unsigned int addr, unsigned int n,
9299 unsigned int *valp)
9300{
9301 int ret = 0;
9302
9303 if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F)
9304 return -EBUSY;
9305
9306 for ( ; !ret && n--; addr += 4) {
9307 t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr);
9308 ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F,
9309 0, 5, 2);
9310 if (!ret)
9311 *valp++ = t4_read_reg(adap, CIM_HOST_ACC_DATA_A);
9312 }
9313 return ret;
9314}
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325int t4_cim_write(struct adapter *adap, unsigned int addr, unsigned int n,
9326 const unsigned int *valp)
9327{
9328 int ret = 0;
9329
9330 if (t4_read_reg(adap, CIM_HOST_ACC_CTRL_A) & HOSTBUSY_F)
9331 return -EBUSY;
9332
9333 for ( ; !ret && n--; addr += 4) {
9334 t4_write_reg(adap, CIM_HOST_ACC_DATA_A, *valp++);
9335 t4_write_reg(adap, CIM_HOST_ACC_CTRL_A, addr | HOSTWRITE_F);
9336 ret = t4_wait_op_done(adap, CIM_HOST_ACC_CTRL_A, HOSTBUSY_F,
9337 0, 5, 2);
9338 }
9339 return ret;
9340}
9341
9342static int t4_cim_write1(struct adapter *adap, unsigned int addr,
9343 unsigned int val)
9344{
9345 return t4_cim_write(adap, addr, 1, &val);
9346}
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr)
9359{
9360 int i, ret;
9361 unsigned int cfg, val, idx;
9362
9363 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &cfg);
9364 if (ret)
9365 return ret;
9366
9367 if (cfg & UPDBGLAEN_F) {
9368 ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A, 0);
9369 if (ret)
9370 return ret;
9371 }
9372
9373 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val);
9374 if (ret)
9375 goto restart;
9376
9377 idx = UPDBGLAWRPTR_G(val);
9378 if (wrptr)
9379 *wrptr = idx;
9380
9381 for (i = 0; i < adap->params.cim_la_size; i++) {
9382 ret = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A,
9383 UPDBGLARDPTR_V(idx) | UPDBGLARDEN_F);
9384 if (ret)
9385 break;
9386 ret = t4_cim_read(adap, UP_UP_DBG_LA_CFG_A, 1, &val);
9387 if (ret)
9388 break;
9389 if (val & UPDBGLARDEN_F) {
9390 ret = -ETIMEDOUT;
9391 break;
9392 }
9393 ret = t4_cim_read(adap, UP_UP_DBG_LA_DATA_A, 1, &la_buf[i]);
9394 if (ret)
9395 break;
9396
9397
9398
9399
9400 if (is_t6(adap->params.chip) && (idx & 0xf) >= 9)
9401 idx = (idx & 0xff0) + 0x10;
9402 else
9403 idx++;
9404
9405 idx &= UPDBGLARDPTR_M;
9406 }
9407restart:
9408 if (cfg & UPDBGLAEN_F) {
9409 int r = t4_cim_write1(adap, UP_UP_DBG_LA_CFG_A,
9410 cfg & ~UPDBGLARDEN_F);
9411 if (!ret)
9412 ret = r;
9413 }
9414 return ret;
9415}
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427void t4_tp_read_la(struct adapter *adap, u64 *la_buf, unsigned int *wrptr)
9428{
9429 bool last_incomplete;
9430 unsigned int i, cfg, val, idx;
9431
9432 cfg = t4_read_reg(adap, TP_DBG_LA_CONFIG_A) & 0xffff;
9433 if (cfg & DBGLAENABLE_F)
9434 t4_write_reg(adap, TP_DBG_LA_CONFIG_A,
9435 adap->params.tp.la_mask | (cfg ^ DBGLAENABLE_F));
9436
9437 val = t4_read_reg(adap, TP_DBG_LA_CONFIG_A);
9438 idx = DBGLAWPTR_G(val);
9439 last_incomplete = DBGLAMODE_G(val) >= 2 && (val & DBGLAWHLF_F) == 0;
9440 if (last_incomplete)
9441 idx = (idx + 1) & DBGLARPTR_M;
9442 if (wrptr)
9443 *wrptr = idx;
9444
9445 val &= 0xffff;
9446 val &= ~DBGLARPTR_V(DBGLARPTR_M);
9447 val |= adap->params.tp.la_mask;
9448
9449 for (i = 0; i < TPLA_SIZE; i++) {
9450 t4_write_reg(adap, TP_DBG_LA_CONFIG_A, DBGLARPTR_V(idx) | val);
9451 la_buf[i] = t4_read_reg64(adap, TP_DBG_LA_DATAL_A);
9452 idx = (idx + 1) & DBGLARPTR_M;
9453 }
9454
9455
9456 if (last_incomplete)
9457 la_buf[TPLA_SIZE - 1] = ~0ULL;
9458
9459 if (cfg & DBGLAENABLE_F)
9460 t4_write_reg(adap, TP_DBG_LA_CONFIG_A,
9461 cfg | adap->params.tp.la_mask);
9462}
9463
9464
9465
9466
9467
9468
9469
9470
9471#define SGE_IDMA_WARN_THRESH 1
9472#define SGE_IDMA_WARN_REPEAT 300
9473
9474
9475
9476
9477
9478
9479
9480
9481void t4_idma_monitor_init(struct adapter *adapter,
9482 struct sge_idma_monitor_state *idma)
9483{
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496 idma->idma_1s_thresh = core_ticks_per_usec(adapter) * 1000000;
9497 idma->idma_stalled[0] = 0;
9498 idma->idma_stalled[1] = 0;
9499}
9500
9501
9502
9503
9504
9505
9506
9507
9508void t4_idma_monitor(struct adapter *adapter,
9509 struct sge_idma_monitor_state *idma,
9510 int hz, int ticks)
9511{
9512 int i, idma_same_state_cnt[2];
9513
9514
9515
9516
9517
9518
9519
9520
9521 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 13);
9522 idma_same_state_cnt[0] = t4_read_reg(adapter, SGE_DEBUG_DATA_HIGH_A);
9523 idma_same_state_cnt[1] = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9524
9525 for (i = 0; i < 2; i++) {
9526 u32 debug0, debug11;
9527
9528
9529
9530
9531
9532
9533
9534 if (idma_same_state_cnt[i] < idma->idma_1s_thresh) {
9535 if (idma->idma_stalled[i] >= SGE_IDMA_WARN_THRESH * hz)
9536 dev_warn(adapter->pdev_dev, "SGE idma%d, queue %u, "
9537 "resumed after %d seconds\n",
9538 i, idma->idma_qid[i],
9539 idma->idma_stalled[i] / hz);
9540 idma->idma_stalled[i] = 0;
9541 continue;
9542 }
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553 if (idma->idma_stalled[i] == 0) {
9554 idma->idma_stalled[i] = hz;
9555 idma->idma_warn[i] = 0;
9556 } else {
9557 idma->idma_stalled[i] += ticks;
9558 idma->idma_warn[i] -= ticks;
9559 }
9560
9561 if (idma->idma_stalled[i] < SGE_IDMA_WARN_THRESH * hz)
9562 continue;
9563
9564
9565
9566 if (idma->idma_warn[i] > 0)
9567 continue;
9568 idma->idma_warn[i] = SGE_IDMA_WARN_REPEAT * hz;
9569
9570
9571
9572
9573
9574 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 0);
9575 debug0 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9576 idma->idma_state[i] = (debug0 >> (i * 9)) & 0x3f;
9577
9578 t4_write_reg(adapter, SGE_DEBUG_INDEX_A, 11);
9579 debug11 = t4_read_reg(adapter, SGE_DEBUG_DATA_LOW_A);
9580 idma->idma_qid[i] = (debug11 >> (i * 16)) & 0xffff;
9581
9582 dev_warn(adapter->pdev_dev, "SGE idma%u, queue %u, potentially stuck in "
9583 "state %u for %d seconds (debug0=%#x, debug11=%#x)\n",
9584 i, idma->idma_qid[i], idma->idma_state[i],
9585 idma->idma_stalled[i] / hz,
9586 debug0, debug11);
9587 t4_sge_decode_idma_state(adapter, idma->idma_state[i]);
9588 }
9589}
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size)
9600{
9601 int ret, i, n, cfg_addr;
9602 unsigned int addr;
9603 unsigned int flash_cfg_start_sec;
9604 unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
9605
9606 cfg_addr = t4_flash_cfg_addr(adap);
9607 if (cfg_addr < 0)
9608 return cfg_addr;
9609
9610 addr = cfg_addr;
9611 flash_cfg_start_sec = addr / SF_SEC_SIZE;
9612
9613 if (size > FLASH_CFG_MAX_SIZE) {
9614 dev_err(adap->pdev_dev, "cfg file too large, max is %u bytes\n",
9615 FLASH_CFG_MAX_SIZE);
9616 return -EFBIG;
9617 }
9618
9619 i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE,
9620 sf_sec_size);
9621 ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec,
9622 flash_cfg_start_sec + i - 1);
9623
9624
9625
9626 if (ret || size == 0)
9627 goto out;
9628
9629
9630 for (i = 0; i < size; i += SF_PAGE_SIZE) {
9631 if ((size - i) < SF_PAGE_SIZE)
9632 n = size - i;
9633 else
9634 n = SF_PAGE_SIZE;
9635 ret = t4_write_flash(adap, addr, n, cfg_data);
9636 if (ret)
9637 goto out;
9638
9639 addr += SF_PAGE_SIZE;
9640 cfg_data += SF_PAGE_SIZE;
9641 }
9642
9643out:
9644 if (ret)
9645 dev_err(adap->pdev_dev, "config file %s failed %d\n",
9646 (size == 0 ? "clear" : "download"), ret);
9647 return ret;
9648}
9649
9650
9651
9652
9653
9654
9655
9656
9657int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf,
9658 unsigned int naddr, u8 *addr)
9659{
9660 struct fw_acl_mac_cmd cmd;
9661
9662 memset(&cmd, 0, sizeof(cmd));
9663 cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_MAC_CMD) |
9664 FW_CMD_REQUEST_F |
9665 FW_CMD_WRITE_F |
9666 FW_ACL_MAC_CMD_PFN_V(adapter->pf) |
9667 FW_ACL_MAC_CMD_VFN_V(vf));
9668
9669
9670 cmd.en_to_len16 = cpu_to_be32((unsigned int)FW_LEN16(cmd));
9671 cmd.nmac = naddr;
9672
9673 switch (adapter->pf) {
9674 case 3:
9675 memcpy(cmd.macaddr3, addr, sizeof(cmd.macaddr3));
9676 break;
9677 case 2:
9678 memcpy(cmd.macaddr2, addr, sizeof(cmd.macaddr2));
9679 break;
9680 case 1:
9681 memcpy(cmd.macaddr1, addr, sizeof(cmd.macaddr1));
9682 break;
9683 case 0:
9684 memcpy(cmd.macaddr0, addr, sizeof(cmd.macaddr0));
9685 break;
9686 }
9687
9688 return t4_wr_mbox(adapter, adapter->mbox, &cmd, sizeof(cmd), &cmd);
9689}
9690
9691
9692
9693
9694
9695
9696
9697
9698void t4_read_pace_tbl(struct adapter *adap, unsigned int pace_vals[NTX_SCHED])
9699{
9700 unsigned int i, v;
9701
9702 for (i = 0; i < NTX_SCHED; i++) {
9703 t4_write_reg(adap, TP_PACE_TABLE_A, 0xffff0000 + i);
9704 v = t4_read_reg(adap, TP_PACE_TABLE_A);
9705 pace_vals[i] = dack_ticks_to_usec(adap, v);
9706 }
9707}
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719void t4_get_tx_sched(struct adapter *adap, unsigned int sched,
9720 unsigned int *kbps, unsigned int *ipg, bool sleep_ok)
9721{
9722 unsigned int v, addr, bpt, cpt;
9723
9724 if (kbps) {
9725 addr = TP_TX_MOD_Q1_Q0_RATE_LIMIT_A - sched / 2;
9726 t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok);
9727 if (sched & 1)
9728 v >>= 16;
9729 bpt = (v >> 8) & 0xff;
9730 cpt = v & 0xff;
9731 if (!cpt) {
9732 *kbps = 0;
9733 } else {
9734 v = (adap->params.vpd.cclk * 1000) / cpt;
9735 *kbps = (v * bpt) / 125;
9736 }
9737 }
9738 if (ipg) {
9739 addr = TP_TX_MOD_Q1_Q0_TIMER_SEPARATOR_A - sched / 2;
9740 t4_tp_tm_pio_read(adap, &v, 1, addr, sleep_ok);
9741 if (sched & 1)
9742 v >>= 16;
9743 v &= 0xffff;
9744 *ipg = (10000 * v) / core_ticks_per_usec(adap);
9745 }
9746}
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid,
9758 enum ctxt_type ctype, u32 *data)
9759{
9760 struct fw_ldst_cmd c;
9761 int ret;
9762
9763 if (ctype == CTXT_FLM)
9764 ret = FW_LDST_ADDRSPC_SGE_FLMC;
9765 else
9766 ret = FW_LDST_ADDRSPC_SGE_CONMC;
9767
9768 memset(&c, 0, sizeof(c));
9769 c.op_to_addrspace = cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
9770 FW_CMD_REQUEST_F | FW_CMD_READ_F |
9771 FW_LDST_CMD_ADDRSPACE_V(ret));
9772 c.cycles_to_len16 = cpu_to_be32(FW_LEN16(c));
9773 c.u.idctxt.physid = cpu_to_be32(cid);
9774
9775 ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
9776 if (ret == 0) {
9777 data[0] = be32_to_cpu(c.u.idctxt.ctxt_data0);
9778 data[1] = be32_to_cpu(c.u.idctxt.ctxt_data1);
9779 data[2] = be32_to_cpu(c.u.idctxt.ctxt_data2);
9780 data[3] = be32_to_cpu(c.u.idctxt.ctxt_data3);
9781 data[4] = be32_to_cpu(c.u.idctxt.ctxt_data4);
9782 data[5] = be32_to_cpu(c.u.idctxt.ctxt_data5);
9783 }
9784 return ret;
9785}
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid,
9798 enum ctxt_type ctype, u32 *data)
9799{
9800 int i, ret;
9801
9802 t4_write_reg(adap, SGE_CTXT_CMD_A, CTXTQID_V(cid) | CTXTTYPE_V(ctype));
9803 ret = t4_wait_op_done(adap, SGE_CTXT_CMD_A, BUSY_F, 0, 3, 1);
9804 if (!ret)
9805 for (i = SGE_CTXT_DATA0_A; i <= SGE_CTXT_DATA5_A; i += 4)
9806 *data++ = t4_read_reg(adap, i);
9807 return ret;
9808}
9809
9810int t4_sched_params(struct adapter *adapter, int type, int level, int mode,
9811 int rateunit, int ratemode, int channel, int class,
9812 int minrate, int maxrate, int weight, int pktsize)
9813{
9814 struct fw_sched_cmd cmd;
9815
9816 memset(&cmd, 0, sizeof(cmd));
9817 cmd.op_to_write = cpu_to_be32(FW_CMD_OP_V(FW_SCHED_CMD) |
9818 FW_CMD_REQUEST_F |
9819 FW_CMD_WRITE_F);
9820 cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd));
9821
9822 cmd.u.params.sc = FW_SCHED_SC_PARAMS;
9823 cmd.u.params.type = type;
9824 cmd.u.params.level = level;
9825 cmd.u.params.mode = mode;
9826 cmd.u.params.ch = channel;
9827 cmd.u.params.cl = class;
9828 cmd.u.params.unit = rateunit;
9829 cmd.u.params.rate = ratemode;
9830 cmd.u.params.min = cpu_to_be32(minrate);
9831 cmd.u.params.max = cpu_to_be32(maxrate);
9832 cmd.u.params.weight = cpu_to_be16(weight);
9833 cmd.u.params.pktsize = cpu_to_be16(pktsize);
9834
9835 return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd),
9836 NULL, 1);
9837}
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850int t4_i2c_rd(struct adapter *adap, unsigned int mbox, int port,
9851 unsigned int devid, unsigned int offset,
9852 unsigned int len, u8 *buf)
9853{
9854 struct fw_ldst_cmd ldst_cmd, ldst_rpl;
9855 unsigned int i2c_max = sizeof(ldst_cmd.u.i2c.data);
9856 int ret = 0;
9857
9858 if (len > I2C_PAGE_SIZE)
9859 return -EINVAL;
9860
9861
9862 if (offset < I2C_PAGE_SIZE && offset + len > I2C_PAGE_SIZE)
9863 return -EINVAL;
9864
9865 memset(&ldst_cmd, 0, sizeof(ldst_cmd));
9866 ldst_cmd.op_to_addrspace =
9867 cpu_to_be32(FW_CMD_OP_V(FW_LDST_CMD) |
9868 FW_CMD_REQUEST_F |
9869 FW_CMD_READ_F |
9870 FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_I2C));
9871 ldst_cmd.cycles_to_len16 = cpu_to_be32(FW_LEN16(ldst_cmd));
9872 ldst_cmd.u.i2c.pid = (port < 0 ? 0xff : port);
9873 ldst_cmd.u.i2c.did = devid;
9874
9875 while (len > 0) {
9876 unsigned int i2c_len = (len < i2c_max) ? len : i2c_max;
9877
9878 ldst_cmd.u.i2c.boffset = offset;
9879 ldst_cmd.u.i2c.blen = i2c_len;
9880
9881 ret = t4_wr_mbox(adap, mbox, &ldst_cmd, sizeof(ldst_cmd),
9882 &ldst_rpl);
9883 if (ret)
9884 break;
9885
9886 memcpy(buf, ldst_rpl.u.i2c.data, i2c_len);
9887 offset += i2c_len;
9888 buf += i2c_len;
9889 len -= i2c_len;
9890 }
9891
9892 return ret;
9893}
9894
9895
9896
9897
9898
9899
9900
9901
9902int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf,
9903 u16 vlan)
9904{
9905 struct fw_acl_vlan_cmd vlan_cmd;
9906 unsigned int enable;
9907
9908 enable = (vlan ? FW_ACL_VLAN_CMD_EN_F : 0);
9909 memset(&vlan_cmd, 0, sizeof(vlan_cmd));
9910 vlan_cmd.op_to_vfn = cpu_to_be32(FW_CMD_OP_V(FW_ACL_VLAN_CMD) |
9911 FW_CMD_REQUEST_F |
9912 FW_CMD_WRITE_F |
9913 FW_CMD_EXEC_F |
9914 FW_ACL_VLAN_CMD_PFN_V(adap->pf) |
9915 FW_ACL_VLAN_CMD_VFN_V(vf));
9916 vlan_cmd.en_to_len16 = cpu_to_be32(enable | FW_LEN16(vlan_cmd));
9917
9918 vlan_cmd.dropnovlan_fm = FW_ACL_VLAN_CMD_FM_F;
9919 if (enable != 0) {
9920 vlan_cmd.nvlan = 1;
9921 vlan_cmd.vlanid[0] = cpu_to_be16(vlan);
9922 }
9923
9924 return t4_wr_mbox(adap, adap->mbox, &vlan_cmd, sizeof(vlan_cmd), NULL);
9925}
9926