]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/drivers/raw/ifpga_rawdev/base/ifpga_defines.h
bump version to 15.2.11-pve1
[ceph.git] / ceph / src / spdk / dpdk / drivers / raw / ifpga_rawdev / base / ifpga_defines.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2018 Intel Corporation
3 */
4
5 #ifndef _IFPGA_DEFINES_H_
6 #define _IFPGA_DEFINES_H_
7
8 #include "ifpga_compat.h"
9
10 #define MAX_FPGA_PORT_NUM 4
11
12 #define FME_FEATURE_HEADER "fme_hdr"
13 #define FME_FEATURE_THERMAL_MGMT "fme_thermal"
14 #define FME_FEATURE_POWER_MGMT "fme_power"
15 #define FME_FEATURE_GLOBAL_IPERF "fme_iperf"
16 #define FME_FEATURE_GLOBAL_ERR "fme_error"
17 #define FME_FEATURE_PR_MGMT "fme_pr"
18 #define FME_FEATURE_EMIF_MGMT "fme_emif"
19 #define FME_FEATURE_HSSI_ETH "fme_hssi"
20 #define FME_FEATURE_GLOBAL_DPERF "fme_dperf"
21 #define FME_FEATURE_QSPI_FLASH "fme_qspi_flash"
22 #define FME_FEATURE_MAX10_SPI "fme_max10_spi"
23 #define FME_FEATURE_NIOS_SPI "fme_nios_spi"
24 #define FME_FEATURE_I2C_MASTER "fme_i2c_master"
25 #define FME_FEATURE_ETH_GROUP "fme_eth_group"
26
27 #define PORT_FEATURE_HEADER "port_hdr"
28 #define PORT_FEATURE_UAFU "port_uafu"
29 #define PORT_FEATURE_ERR "port_err"
30 #define PORT_FEATURE_UMSG "port_umsg"
31 #define PORT_FEATURE_PR "port_pr"
32 #define PORT_FEATURE_UINT "port_uint"
33 #define PORT_FEATURE_STP "port_stp"
34
35 /*
36 * do not check the revision id as id may be dynamic under
37 * some cases, e.g, UAFU.
38 */
39 #define SKIP_REVISION_CHECK 0xff
40
41 #define FME_HEADER_REVISION 1
42 #define FME_THERMAL_MGMT_REVISION 0
43 #define FME_POWER_MGMT_REVISION 1
44 #define FME_GLOBAL_IPERF_REVISION 1
45 #define FME_GLOBAL_ERR_REVISION 1
46 #define FME_PR_MGMT_REVISION 2
47 #define FME_HSSI_ETH_REVISION 0
48 #define FME_GLOBAL_DPERF_REVISION 0
49 #define FME_QSPI_REVISION 0
50 #define FME_MAX10_SPI 0
51 #define FME_I2C_MASTER 0
52
53 #define PORT_HEADER_REVISION 0
54 /* UAFU's header info depends on the downloaded GBS */
55 #define PORT_UAFU_REVISION SKIP_REVISION_CHECK
56 #define PORT_ERR_REVISION 1
57 #define PORT_UMSG_REVISION 0
58 #define PORT_UINT_REVISION 0
59 #define PORT_STP_REVISION 1
60
61 #define FEATURE_TYPE_AFU 0x1
62 #define FEATURE_TYPE_BBB 0x2
63 #define FEATURE_TYPE_PRIVATE 0x3
64 #define FEATURE_TYPE_FIU 0x4
65
66 #define FEATURE_FIU_ID_FME 0x0
67 #define FEATURE_FIU_ID_PORT 0x1
68
69 /* Reserved 0xfe for Header, 0xff for AFU*/
70 #define FEATURE_ID_FIU_HEADER 0xfe
71 #define FEATURE_ID_AFU 0xff
72
73 enum fpga_id_type {
74 FME_ID,
75 PORT_ID,
76 FPGA_ID_MAX,
77 };
78
79 #define FME_FEATURE_ID_HEADER FEATURE_ID_FIU_HEADER
80 #define FME_FEATURE_ID_THERMAL_MGMT 0x1
81 #define FME_FEATURE_ID_POWER_MGMT 0x2
82 #define FME_FEATURE_ID_GLOBAL_IPERF 0x3
83 #define FME_FEATURE_ID_GLOBAL_ERR 0x4
84 #define FME_FEATURE_ID_PR_MGMT 0x5
85 #define FME_FEATURE_ID_HSSI_ETH 0x6
86 #define FME_FEATURE_ID_GLOBAL_DPERF 0x7
87 #define FME_FEATURE_ID_QSPI_FLASH 0x8
88 #define FME_FEATURE_ID_EMIF_MGMT 0x9
89 #define FME_FEATURE_ID_MAX10_SPI 0xe
90 #define FME_FEATURE_ID_NIOS_SPI 0xd
91 #define FME_FEATURE_ID_I2C_MASTER 0xf
92 #define FME_FEATURE_ID_ETH_GROUP 0x10
93
94 #define PORT_FEATURE_ID_HEADER FEATURE_ID_FIU_HEADER
95 #define PORT_FEATURE_ID_ERROR 0x10
96 #define PORT_FEATURE_ID_UMSG 0x12
97 #define PORT_FEATURE_ID_UINT 0x13
98 #define PORT_FEATURE_ID_STP 0x14
99 #define PORT_FEATURE_ID_UAFU FEATURE_ID_AFU
100
101 /*
102 * All headers and structures must be byte-packed to match the spec.
103 */
104 #pragma pack(push, 1)
105
106 struct feature_header {
107 union {
108 u64 csr;
109 struct {
110 u16 id:12;
111 u8 revision:4;
112 u32 next_header_offset:24;
113 u8 end_of_list:1;
114 u32 reserved:19;
115 u8 type:4;
116 };
117 };
118 };
119
120 struct feature_bbb_header {
121 struct uuid guid;
122 };
123
124 struct feature_afu_header {
125 struct uuid guid;
126 union {
127 u64 csr;
128 struct {
129 u64 next_afu:24;
130 u64 reserved:40;
131 };
132 };
133 };
134
135 struct feature_fiu_header {
136 struct uuid guid;
137 union {
138 u64 csr;
139 struct {
140 u64 next_afu:24;
141 u64 reserved:40;
142 };
143 };
144 };
145
146 struct feature_fme_capability {
147 union {
148 u64 csr;
149 struct {
150 u8 fabric_verid; /* Fabric version ID */
151 u8 socket_id:1; /* Socket id */
152 u8 rsvd1:3; /* Reserved */
153 /* pci0 link available yes /no */
154 u8 pci0_link_avile:1;
155 /* pci1 link available yes /no */
156 u8 pci1_link_avile:1;
157 /* Coherent (QPI/UPI) link available yes /no */
158 u8 qpi_link_avile:1;
159 u8 rsvd2:1; /* Reserved */
160 /* IOMMU or VT-d supported yes/no */
161 u8 iommu_support:1;
162 u8 num_ports:3; /* Number of ports */
163 u8 sf_fab_ctl:1; /* Internal validation bit */
164 u8 rsvd3:3; /* Reserved */
165 /*
166 * Address width supported in bits
167 * BXT -0x26 , SKX -0x30
168 */
169 u8 address_width_bits:6;
170 u8 rsvd4:2; /* Reserved */
171 /* Size of cache supported in kb */
172 u16 cache_size:12;
173 u8 cache_assoc:4; /* Cache Associativity */
174 u16 rsvd5:15; /* Reserved */
175 u8 lock_bit:1; /* Lock bit */
176 };
177 };
178 };
179
180 #define FME_AFU_ACCESS_PF 0
181 #define FME_AFU_ACCESS_VF 1
182
183 struct feature_fme_port {
184 union {
185 u64 csr;
186 struct {
187 u32 port_offset:24;
188 u8 reserved1;
189 u8 port_bar:3;
190 u32 reserved2:20;
191 u8 afu_access_control:1;
192 u8 reserved3:4;
193 u8 port_implemented:1;
194 u8 reserved4:3;
195 };
196 };
197 };
198
199 struct feature_fme_fab_status {
200 union {
201 u64 csr;
202 struct {
203 u8 upilink_status:4; /* UPI Link Status */
204 u8 rsvd1:4; /* Reserved */
205 u8 pci0link_status:1; /* pci0 link status */
206 u8 rsvd2:3; /* Reserved */
207 u8 pci1link_status:1; /* pci1 link status */
208 u64 rsvd3:51; /* Reserved */
209 };
210 };
211 };
212
213 struct feature_fme_genprotrange2_base {
214 union {
215 u64 csr;
216 struct {
217 u16 rsvd1; /* Reserved */
218 /* Base Address of memory range */
219 u8 protected_base_addrss:4;
220 u64 rsvd2:44; /* Reserved */
221 };
222 };
223 };
224
225 struct feature_fme_genprotrange2_limit {
226 union {
227 u64 csr;
228 struct {
229 u16 rsvd1; /* Reserved */
230 /* Limit Address of memory range */
231 u8 protected_limit_addrss:4;
232 u16 rsvd2:11; /* Reserved */
233 u8 enable:1; /* Enable GENPROTRANGE check */
234 u32 rsvd3; /* Reserved */
235 };
236 };
237 };
238
239 struct feature_fme_dxe_lock {
240 union {
241 u64 csr;
242 struct {
243 /*
244 * Determines write access to the DXE region CSRs
245 * 1 - CSR region is locked;
246 * 0 - it is open for write access.
247 */
248 u8 dxe_early_lock:1;
249 /*
250 * Determines write access to the HSSI CSR
251 * 1 - CSR region is locked;
252 * 0 - it is open for write access.
253 */
254 u8 dxe_late_lock:1;
255 u64 rsvd:62;
256 };
257 };
258 };
259
260 #define HSSI_ID_NO_HASSI 0
261 #define HSSI_ID_PCIE_RP 1
262 #define HSSI_ID_ETHERNET 2
263
264 struct feature_fme_bitstream_id {
265 union {
266 u64 csr;
267 struct {
268 u32 gitrepo_hash:32; /* GIT repository hash */
269 /*
270 * HSSI configuration identifier:
271 * 0 - No HSSI
272 * 1 - PCIe-RP
273 * 2 - Ethernet
274 */
275 u8 hssi_id:4;
276 u16 rsvd1:12; /* Reserved */
277 /* Bitstream version patch number */
278 u8 bs_verpatch:4;
279 /* Bitstream version minor number */
280 u8 bs_verminor:4;
281 /* Bitstream version major number */
282 u8 bs_vermajor:4;
283 /* Bitstream version debug number */
284 u8 bs_verdebug:4;
285 };
286 };
287 };
288
289 struct feature_fme_bitstream_md {
290 union {
291 u64 csr;
292 struct {
293 /* Seed number userd for synthesis flow */
294 u8 synth_seed:4;
295 /* Synthesis date(day number - 2 digits) */
296 u8 synth_day:8;
297 /* Synthesis date(month number - 2 digits) */
298 u8 synth_month:8;
299 /* Synthesis date(year number - 2 digits) */
300 u8 synth_year:8;
301 u64 rsvd:36; /* Reserved */
302 };
303 };
304 };
305
306 struct feature_fme_iommu_ctrl {
307 union {
308 u64 csr;
309 struct {
310 /* Disables IOMMU prefetcher for C0 channel */
311 u8 prefetch_disableC0:1;
312 /* Disables IOMMU prefetcher for C1 channel */
313 u8 prefetch_disableC1:1;
314 /* Disables IOMMU partial cache line writes */
315 u8 prefetch_wrdisable:1;
316 u8 rsvd1:1; /* Reserved */
317 /*
318 * Select counter and read value from register
319 * iommu_stat.dbg_counters
320 * 0 - Number of 4K page translation response
321 * 1 - Number of 2M page translation response
322 * 2 - Number of 1G page translation response
323 */
324 u8 counter_sel:2;
325 u32 rsvd2:26; /* Reserved */
326 /* Connected to IOMMU SIP Capabilities */
327 u32 capecap_defeature;
328 };
329 };
330 };
331
332 struct feature_fme_iommu_stat {
333 union {
334 u64 csr;
335 struct {
336 /* Translation Enable bit from IOMMU SIP */
337 u8 translation_enable:1;
338 /* Drain request in progress */
339 u8 drain_req_inprog:1;
340 /* Invalidation current state */
341 u8 inv_state:3;
342 /* C0 Response Buffer current state */
343 u8 respbuffer_stateC0:3;
344 /* C1 Response Buffer current state */
345 u8 respbuffer_stateC1:3;
346 /* Last request ID to IOMMU SIP */
347 u8 last_reqID:4;
348 /* Last IOMMU SIP response ID value */
349 u8 last_respID:4;
350 /* Last IOMMU SIP response status value */
351 u8 last_respstatus:3;
352 /* C0 Transaction Buffer is not empty */
353 u8 transbuf_notEmptyC0:1;
354 /* C1 Transaction Buffer is not empty */
355 u8 transbuf_notEmptyC1:1;
356 /* C0 Request FIFO is not empty */
357 u8 reqFIFO_notemptyC0:1;
358 /* C1 Request FIFO is not empty */
359 u8 reqFIFO_notemptyC1:1;
360 /* C0 Response FIFO is not empty */
361 u8 respFIFO_notemptyC0:1;
362 /* C1 Response FIFO is not empty */
363 u8 respFIFO_notemptyC1:1;
364 /* C0 Response FIFO overflow detected */
365 u8 respFIFO_overflowC0:1;
366 /* C1 Response FIFO overflow detected */
367 u8 respFIFO_overflowC1:1;
368 /* C0 Transaction Buffer overflow detected */
369 u8 tranbuf_overflowC0:1;
370 /* C1 Transaction Buffer overflow detected */
371 u8 tranbuf_overflowC1:1;
372 /* Request FIFO overflow detected */
373 u8 reqFIFO_overflow:1;
374 /* IOMMU memory read in progress */
375 u8 memrd_inprog:1;
376 /* IOMMU memory write in progress */
377 u8 memwr_inprog:1;
378 u8 rsvd1:1; /* Reserved */
379 /* Value of counter selected by iommu_ctl.counter_sel */
380 u16 dbg_counters:16;
381 u16 rsvd2:12; /* Reserved */
382 };
383 };
384 };
385
386 struct feature_fme_pcie0_ctrl {
387 union {
388 u64 csr;
389 struct {
390 u64 vtd_bar_lock:1; /* Lock VT-D BAR register */
391 u64 rsvd1:3;
392 u64 rciep:1; /* Configure PCIE0 as RCiEP */
393 u64 rsvd2:59;
394 };
395 };
396 };
397
398 struct feature_fme_llpr_smrr_base {
399 union {
400 u64 csr;
401 struct {
402 u64 rsvd1:12;
403 u64 base:20; /* SMRR2 memory range base address */
404 u64 rsvd2:32;
405 };
406 };
407 };
408
409 struct feature_fme_llpr_smrr_mask {
410 union {
411 u64 csr;
412 struct {
413 u64 rsvd1:11;
414 u64 valid:1; /* LLPR_SMRR rule is valid or not */
415 /*
416 * SMRR memory range mask which determines the range
417 * of region being mapped
418 */
419 u64 phys_mask:20;
420 u64 rsvd2:32;
421 };
422 };
423 };
424
425 struct feature_fme_llpr_smrr2_base {
426 union {
427 u64 csr;
428 struct {
429 u64 rsvd1:12;
430 u64 base:20; /* SMRR2 memory range base address */
431 u64 rsvd2:32;
432 };
433 };
434 };
435
436 struct feature_fme_llpr_smrr2_mask {
437 union {
438 u64 csr;
439 struct {
440 u64 rsvd1:11;
441 u64 valid:1; /* LLPR_SMRR2 rule is valid or not */
442 /*
443 * SMRR2 memory range mask which determines the range
444 * of region being mapped
445 */
446 u64 phys_mask:20;
447 u64 rsvd2:32;
448 };
449 };
450 };
451
452 struct feature_fme_llpr_meseg_base {
453 union {
454 u64 csr;
455 struct {
456 /* A[45:19] of base address memory range */
457 u64 me_base:27;
458 u64 rsvd:37;
459 };
460 };
461 };
462
463 struct feature_fme_llpr_meseg_limit {
464 union {
465 u64 csr;
466 struct {
467 /* A[45:19] of limit address memory range */
468 u64 me_limit:27;
469 u64 rsvd1:4;
470 u64 enable:1; /* Enable LLPR MESEG rule */
471 u64 rsvd2:32;
472 };
473 };
474 };
475
476 struct feature_fme_header {
477 struct feature_header header;
478 struct feature_afu_header afu_header;
479 u64 reserved;
480 u64 scratchpad;
481 struct feature_fme_capability capability;
482 struct feature_fme_port port[MAX_FPGA_PORT_NUM];
483 struct feature_fme_fab_status fab_status;
484 struct feature_fme_bitstream_id bitstream_id;
485 struct feature_fme_bitstream_md bitstream_md;
486 struct feature_fme_genprotrange2_base genprotrange2_base;
487 struct feature_fme_genprotrange2_limit genprotrange2_limit;
488 struct feature_fme_dxe_lock dxe_lock;
489 struct feature_fme_iommu_ctrl iommu_ctrl;
490 struct feature_fme_iommu_stat iommu_stat;
491 struct feature_fme_pcie0_ctrl pcie0_control;
492 struct feature_fme_llpr_smrr_base smrr_base;
493 struct feature_fme_llpr_smrr_mask smrr_mask;
494 struct feature_fme_llpr_smrr2_base smrr2_base;
495 struct feature_fme_llpr_smrr2_mask smrr2_mask;
496 struct feature_fme_llpr_meseg_base meseg_base;
497 struct feature_fme_llpr_meseg_limit meseg_limit;
498 };
499
500 struct feature_port_capability {
501 union {
502 u64 csr;
503 struct {
504 u8 port_number:2; /* Port Number 0-3 */
505 u8 rsvd1:6; /* Reserved */
506 u16 mmio_size; /* User MMIO size in KB */
507 u8 rsvd2; /* Reserved */
508 u8 sp_intr_num:4; /* Supported interrupts num */
509 u32 rsvd3:28; /* Reserved */
510 };
511 };
512 };
513
514 struct feature_port_control {
515 union {
516 u64 csr;
517 struct {
518 u8 port_sftrst:1; /* Port Soft Reset */
519 u8 rsvd1:1; /* Reserved */
520 u8 latency_tolerance:1;/* '1' >= 40us, '0' < 40us */
521 u8 rsvd2:1; /* Reserved */
522 u8 port_sftrst_ack:1; /* HW ACK for Soft Reset */
523 u64 rsvd3:59; /* Reserved */
524 };
525 };
526 };
527
528 #define PORT_POWER_STATE_NORMAL 0
529 #define PORT_POWER_STATE_AP1 1
530 #define PORT_POWER_STATE_AP2 2
531 #define PORT_POWER_STATE_AP6 6
532
533 struct feature_port_status {
534 union {
535 u64 csr;
536 struct {
537 u8 port_freeze:1; /* '1' - freezed '0' - normal */
538 u8 rsvd1:7; /* Reserved */
539 u8 power_state:4; /* Power State */
540 u8 ap1_event:1; /* AP1 event was detected */
541 u8 ap2_event:1; /* AP2 event was detected */
542 u64 rsvd2:50; /* Reserved */
543 };
544 };
545 };
546
547 /* Port Header Register Set */
548 struct feature_port_header {
549 struct feature_header header;
550 struct feature_afu_header afu_header;
551 u64 port_mailbox;
552 u64 scratchpad;
553 struct feature_port_capability capability;
554 struct feature_port_control control;
555 struct feature_port_status status;
556 u64 rsvd2;
557 u64 user_clk_freq_cmd0;
558 u64 user_clk_freq_cmd1;
559 u64 user_clk_freq_sts0;
560 u64 user_clk_freq_sts1;
561 };
562
563 struct feature_fme_tmp_threshold {
564 union {
565 u64 csr;
566 struct {
567 u8 tmp_thshold1:7; /* temperature Threshold 1 */
568 /* temperature Threshold 1 enable/disable */
569 u8 tmp_thshold1_enable:1;
570 u8 tmp_thshold2:7; /* temperature Threshold 2 */
571 /* temperature Threshold 2 enable /disable */
572 u8 tmp_thshold2_enable:1;
573 u8 pro_hot_setpoint:7; /* Proc Hot set point */
574 u8 rsvd4:1; /* Reserved */
575 u8 therm_trip_thshold:7; /* Thermeal Trip Threshold */
576 u8 rsvd3:1; /* Reserved */
577 u8 thshold1_status:1; /* Threshold 1 Status */
578 u8 thshold2_status:1; /* Threshold 2 Status */
579 u8 rsvd5:1; /* Reserved */
580 /* Thermeal Trip Threshold status */
581 u8 therm_trip_thshold_status:1;
582 u8 rsvd6:4; /* Reserved */
583 /* Validation mode- Force Proc Hot */
584 u8 valmodeforce:1;
585 /* Validation mode - Therm trip Hot */
586 u8 valmodetherm:1;
587 u8 rsvd2:2; /* Reserved */
588 u8 thshold_policy:1; /* threshold policy */
589 u32 rsvd:19; /* Reserved */
590 };
591 };
592 };
593
594 /* Temperature Sensor Read values format 1 */
595 struct feature_fme_temp_rdsensor_fmt1 {
596 union {
597 u64 csr;
598 struct {
599 /* Reads out FPGA temperature in celsius */
600 u8 fpga_temp:7;
601 u8 rsvd0:1; /* Reserved */
602 /* Temperature reading sequence number */
603 u16 tmp_reading_seq_num;
604 /* Temperature reading is valid */
605 u8 tmp_reading_valid:1;
606 u8 rsvd1:7; /* Reserved */
607 u16 dbg_mode:10; /* Debug mode */
608 u32 rsvd2:22; /* Reserved */
609 };
610 };
611 };
612
613 /* Temperature sensor read values format 2 */
614 struct feature_fme_temp_rdsensor_fmt2 {
615 u64 rsvd; /* Reserved */
616 };
617
618 /* Temperature Threshold Capability Register */
619 struct feature_fme_tmp_threshold_cap {
620 union {
621 u64 csr;
622 struct {
623 /* Temperature Threshold Unsupported */
624 u8 tmp_thshold_disabled:1;
625 u64 rsvd:63; /* Reserved */
626 };
627 };
628 };
629
630 /* FME THERNAL FEATURE */
631 struct feature_fme_thermal {
632 struct feature_header header;
633 struct feature_fme_tmp_threshold threshold;
634 struct feature_fme_temp_rdsensor_fmt1 rdsensor_fm1;
635 struct feature_fme_temp_rdsensor_fmt2 rdsensor_fm2;
636 struct feature_fme_tmp_threshold_cap threshold_cap;
637 };
638
639 /* Power Status register */
640 struct feature_fme_pm_status {
641 union {
642 u64 csr;
643 struct {
644 /* FPGA Power consumed, The format is to be defined */
645 u32 pwr_consumed:18;
646 /* FPGA Latency Tolerance Reporting */
647 u8 fpga_latency_report:1;
648 u64 rsvd:45; /* Reserved */
649 };
650 };
651 };
652
653 /* AP Thresholds */
654 struct feature_fme_pm_ap_threshold {
655 union {
656 u64 csr;
657 struct {
658 /*
659 * Number of clocks (5ns period) for assertion
660 * of FME_data
661 */
662 u8 threshold1:7;
663 u8 rsvd1:1;
664 u8 threshold2:7;
665 u8 rsvd2:1;
666 u8 threshold1_status:1;
667 u8 threshold2_status:1;
668 u64 rsvd3:46; /* Reserved */
669 };
670 };
671 };
672
673 /* Xeon Power Limit */
674 struct feature_fme_pm_xeon_limit {
675 union {
676 u64 csr;
677 struct {
678 /* Power limit in Watts in 12.3 format */
679 u16 pwr_limit:15;
680 /* Indicates that power limit has been written */
681 u8 enable:1;
682 /* 0 - Turbe range, 1 - Entire range */
683 u8 clamping:1;
684 /* Time constant in XXYYY format */
685 u8 time:7;
686 u64 rsvd:40; /* Reserved */
687 };
688 };
689 };
690
691 /* FPGA Power Limit */
692 struct feature_fme_pm_fpga_limit {
693 union {
694 u64 csr;
695 struct {
696 /* Power limit in Watts in 12.3 format */
697 u16 pwr_limit:15;
698 /* Indicates that power limit has been written */
699 u8 enable:1;
700 /* 0 - Turbe range, 1 - Entire range */
701 u8 clamping:1;
702 /* Time constant in XXYYY format */
703 u8 time:7;
704 u64 rsvd:40; /* Reserved */
705 };
706 };
707 };
708
709 /* FME POWER FEATURE */
710 struct feature_fme_power {
711 struct feature_header header;
712 struct feature_fme_pm_status status;
713 struct feature_fme_pm_ap_threshold threshold;
714 struct feature_fme_pm_xeon_limit xeon_limit;
715 struct feature_fme_pm_fpga_limit fpga_limit;
716 };
717
718 #define CACHE_CHANNEL_RD 0
719 #define CACHE_CHANNEL_WR 1
720
721 enum iperf_cache_events {
722 IPERF_CACHE_RD_HIT,
723 IPERF_CACHE_WR_HIT,
724 IPERF_CACHE_RD_MISS,
725 IPERF_CACHE_WR_MISS,
726 IPERF_CACHE_RSVD, /* reserved */
727 IPERF_CACHE_HOLD_REQ,
728 IPERF_CACHE_DATA_WR_PORT_CONTEN,
729 IPERF_CACHE_TAG_WR_PORT_CONTEN,
730 IPERF_CACHE_TX_REQ_STALL,
731 IPERF_CACHE_RX_REQ_STALL,
732 IPERF_CACHE_EVICTIONS,
733 };
734
735 /* FPMON Cache Control */
736 struct feature_fme_ifpmon_ch_ctl {
737 union {
738 u64 csr;
739 struct {
740 u8 reset_counters:1; /* Reset Counters */
741 u8 rsvd1:7; /* Reserved */
742 u8 freeze:1; /* Freeze if set to 1 */
743 u8 rsvd2:7; /* Reserved */
744 u8 cache_event:4; /* Select the cache event */
745 u8 cci_chsel:1; /* Select the channel */
746 u64 rsvd3:43; /* Reserved */
747 };
748 };
749 };
750
751 /* FPMON Cache Counter */
752 struct feature_fme_ifpmon_ch_ctr {
753 union {
754 u64 csr;
755 struct {
756 /* Cache Counter for even addresse */
757 u64 cache_counter:48;
758 u16 rsvd:12; /* Reserved */
759 /* Cache Event being reported */
760 u8 event_code:4;
761 };
762 };
763 };
764
765 enum iperf_fab_events {
766 IPERF_FAB_PCIE0_RD,
767 IPERF_FAB_PCIE0_WR,
768 IPERF_FAB_PCIE1_RD,
769 IPERF_FAB_PCIE1_WR,
770 IPERF_FAB_UPI_RD,
771 IPERF_FAB_UPI_WR,
772 IPERF_FAB_MMIO_RD,
773 IPERF_FAB_MMIO_WR,
774 };
775
776 #define FAB_DISABLE_FILTER 0
777 #define FAB_ENABLE_FILTER 1
778
779 /* FPMON FAB Control */
780 struct feature_fme_ifpmon_fab_ctl {
781 union {
782 u64 csr;
783 struct {
784 u8 reset_counters:1; /* Reset Counters */
785 u8 rsvd:7; /* Reserved */
786 u8 freeze:1; /* Set to 1 frozen counter */
787 u8 rsvd1:7; /* Reserved */
788 u8 fab_evtcode:4; /* Fabric Event Code */
789 u8 port_id:2; /* Port ID */
790 u8 rsvd2:1; /* Reserved */
791 u8 port_filter:1; /* Port Filter */
792 u64 rsvd3:40; /* Reserved */
793 };
794 };
795 };
796
797 /* FPMON Event Counter */
798 struct feature_fme_ifpmon_fab_ctr {
799 union {
800 u64 csr;
801 struct {
802 u64 fab_cnt:60; /* Fabric event counter */
803 /* Fabric event code being reported */
804 u8 event_code:4;
805 };
806 };
807 };
808
809 /* FPMON Clock Counter */
810 struct feature_fme_ifpmon_clk_ctr {
811 u64 afu_interf_clock; /* Clk_16UI (AFU clock) counter. */
812 };
813
814 enum iperf_vtd_events {
815 IPERF_VTD_AFU_MEM_RD_TRANS,
816 IPERF_VTD_AFU_MEM_WR_TRANS,
817 IPERF_VTD_AFU_DEVTLB_RD_HIT,
818 IPERF_VTD_AFU_DEVTLB_WR_HIT,
819 IPERF_VTD_DEVTLB_4K_FILL,
820 IPERF_VTD_DEVTLB_2M_FILL,
821 IPERF_VTD_DEVTLB_1G_FILL,
822 };
823
824 /* VT-d control register */
825 struct feature_fme_ifpmon_vtd_ctl {
826 union {
827 u64 csr;
828 struct {
829 u8 reset_counters:1; /* Reset Counters */
830 u8 rsvd:7; /* Reserved */
831 u8 freeze:1; /* Set to 1 frozen counter */
832 u8 rsvd1:7; /* Reserved */
833 u8 vtd_evtcode:4; /* VTd and TLB event code */
834 u64 rsvd2:44; /* Reserved */
835 };
836 };
837 };
838
839 /* VT-d event counter */
840 struct feature_fme_ifpmon_vtd_ctr {
841 union {
842 u64 csr;
843 struct {
844 u64 vtd_counter:48; /* VTd event counter */
845 u16 rsvd:12; /* Reserved */
846 u8 event_code:4; /* VTd event code */
847 };
848 };
849 };
850
851 enum iperf_vtd_sip_events {
852 IPERF_VTD_SIP_IOTLB_4K_HIT,
853 IPERF_VTD_SIP_IOTLB_2M_HIT,
854 IPERF_VTD_SIP_IOTLB_1G_HIT,
855 IPERF_VTD_SIP_SLPWC_L3_HIT,
856 IPERF_VTD_SIP_SLPWC_L4_HIT,
857 IPERF_VTD_SIP_RCC_HIT,
858 IPERF_VTD_SIP_IOTLB_4K_MISS,
859 IPERF_VTD_SIP_IOTLB_2M_MISS,
860 IPERF_VTD_SIP_IOTLB_1G_MISS,
861 IPERF_VTD_SIP_SLPWC_L3_MISS,
862 IPERF_VTD_SIP_SLPWC_L4_MISS,
863 IPERF_VTD_SIP_RCC_MISS,
864 };
865
866 /* VT-d SIP control register */
867 struct feature_fme_ifpmon_vtd_sip_ctl {
868 union {
869 u64 csr;
870 struct {
871 u8 reset_counters:1; /* Reset Counters */
872 u8 rsvd:7; /* Reserved */
873 u8 freeze:1; /* Set to 1 frozen counter */
874 u8 rsvd1:7; /* Reserved */
875 u8 vtd_evtcode:4; /* VTd and TLB event code */
876 u64 rsvd2:44; /* Reserved */
877 };
878 };
879 };
880
881 /* VT-d SIP event counter */
882 struct feature_fme_ifpmon_vtd_sip_ctr {
883 union {
884 u64 csr;
885 struct {
886 u64 vtd_counter:48; /* VTd event counter */
887 u16 rsvd:12; /* Reserved */
888 u8 event_code:4; /* VTd event code */
889 };
890 };
891 };
892
893 /* FME IPERF FEATURE */
894 struct feature_fme_iperf {
895 struct feature_header header;
896 struct feature_fme_ifpmon_ch_ctl ch_ctl;
897 struct feature_fme_ifpmon_ch_ctr ch_ctr0;
898 struct feature_fme_ifpmon_ch_ctr ch_ctr1;
899 struct feature_fme_ifpmon_fab_ctl fab_ctl;
900 struct feature_fme_ifpmon_fab_ctr fab_ctr;
901 struct feature_fme_ifpmon_clk_ctr clk;
902 struct feature_fme_ifpmon_vtd_ctl vtd_ctl;
903 struct feature_fme_ifpmon_vtd_ctr vtd_ctr;
904 struct feature_fme_ifpmon_vtd_sip_ctl vtd_sip_ctl;
905 struct feature_fme_ifpmon_vtd_sip_ctr vtd_sip_ctr;
906 };
907
908 enum dperf_fab_events {
909 DPERF_FAB_PCIE0_RD,
910 DPERF_FAB_PCIE0_WR,
911 DPERF_FAB_MMIO_RD = 6,
912 DPERF_FAB_MMIO_WR,
913 };
914
915 /* FPMON FAB Control */
916 struct feature_fme_dfpmon_fab_ctl {
917 union {
918 u64 csr;
919 struct {
920 u8 reset_counters:1; /* Reset Counters */
921 u8 rsvd:7; /* Reserved */
922 u8 freeze:1; /* Set to 1 frozen counter */
923 u8 rsvd1:7; /* Reserved */
924 u8 fab_evtcode:4; /* Fabric Event Code */
925 u8 port_id:2; /* Port ID */
926 u8 rsvd2:1; /* Reserved */
927 u8 port_filter:1; /* Port Filter */
928 u64 rsvd3:40; /* Reserved */
929 };
930 };
931 };
932
933 /* FPMON Event Counter */
934 struct feature_fme_dfpmon_fab_ctr {
935 union {
936 u64 csr;
937 struct {
938 u64 fab_cnt:60; /* Fabric event counter */
939 /* Fabric event code being reported */
940 u8 event_code:4;
941 };
942 };
943 };
944
945 /* FPMON Clock Counter */
946 struct feature_fme_dfpmon_clk_ctr {
947 u64 afu_interf_clock; /* Clk_16UI (AFU clock) counter. */
948 };
949
950 /* FME DPERF FEATURE */
951 struct feature_fme_dperf {
952 struct feature_header header;
953 u64 rsvd[3];
954 struct feature_fme_dfpmon_fab_ctl fab_ctl;
955 struct feature_fme_dfpmon_fab_ctr fab_ctr;
956 struct feature_fme_dfpmon_clk_ctr clk;
957 };
958
959 struct feature_fme_error0 {
960 #define FME_ERROR0_MASK 0xFFUL
961 #define FME_ERROR0_MASK_DEFAULT 0x40UL /* pcode workaround */
962 union {
963 u64 csr;
964 struct {
965 u8 fabric_err:1; /* Fabric error */
966 u8 fabfifo_overflow:1; /* Fabric fifo overflow */
967 u8 kticdc_parity_err:2;/* KTI CDC Parity Error */
968 u8 iommu_parity_err:1; /* IOMMU Parity error */
969 /* AFU PF/VF access mismatch detected */
970 u8 afu_acc_mode_err:1;
971 u8 mbp_err:1; /* Indicates an MBP event */
972 /* PCIE0 CDC Parity Error */
973 u8 pcie0cdc_parity_err:5;
974 /* PCIE1 CDC Parity Error */
975 u8 pcie1cdc_parity_err:5;
976 /* CVL CDC Parity Error */
977 u8 cvlcdc_parity_err:3;
978 u64 rsvd:44; /* Reserved */
979 };
980 };
981 };
982
983 /* PCIe0 Error Status register */
984 struct feature_fme_pcie0_error {
985 #define FME_PCIE0_ERROR_MASK 0xFFUL
986 union {
987 u64 csr;
988 struct {
989 u8 formattype_err:1; /* TLP format/type error */
990 u8 MWAddr_err:1; /* TLP MW address error */
991 u8 MWAddrLength_err:1; /* TLP MW length error */
992 u8 MRAddr_err:1; /* TLP MR address error */
993 u8 MRAddrLength_err:1; /* TLP MR length error */
994 u8 cpl_tag_err:1; /* TLP CPL tag error */
995 u8 cpl_status_err:1; /* TLP CPL status error */
996 u8 cpl_timeout_err:1; /* TLP CPL timeout */
997 u8 cci_parity_err:1; /* CCI bridge parity error */
998 u8 rxpoison_tlp_err:1; /* Received a TLP with EP set */
999 u64 rsvd:52; /* Reserved */
1000 u8 vfnumb_err:1; /* Number of error VF */
1001 u8 funct_type_err:1; /* Virtual (1) or Physical */
1002 };
1003 };
1004 };
1005
1006 /* PCIe1 Error Status register */
1007 struct feature_fme_pcie1_error {
1008 #define FME_PCIE1_ERROR_MASK 0xFFUL
1009 union {
1010 u64 csr;
1011 struct {
1012 u8 formattype_err:1; /* TLP format/type error */
1013 u8 MWAddr_err:1; /* TLP MW address error */
1014 u8 MWAddrLength_err:1; /* TLP MW length error */
1015 u8 MRAddr_err:1; /* TLP MR address error */
1016 u8 MRAddrLength_err:1; /* TLP MR length error */
1017 u8 cpl_tag_err:1; /* TLP CPL tag error */
1018 u8 cpl_status_err:1; /* TLP CPL status error */
1019 u8 cpl_timeout_err:1; /* TLP CPL timeout */
1020 u8 cci_parity_err:1; /* CCI bridge parity error */
1021 u8 rxpoison_tlp_err:1; /* Received a TLP with EP set */
1022 u64 rsvd:54; /* Reserved */
1023 };
1024 };
1025 };
1026
1027 /* FME First Error register */
1028 struct feature_fme_first_error {
1029 #define FME_FIRST_ERROR_MASK ((1ULL << 60) - 1)
1030 union {
1031 u64 csr;
1032 struct {
1033 /*
1034 * Indicates the Error Register that was
1035 * triggered first
1036 */
1037 u64 err_reg_status:60;
1038 /*
1039 * Holds 60 LSBs from the Error register that was
1040 * triggered first
1041 */
1042 u8 errReg_id:4;
1043 };
1044 };
1045 };
1046
1047 /* FME Next Error register */
1048 struct feature_fme_next_error {
1049 #define FME_NEXT_ERROR_MASK ((1ULL << 60) - 1)
1050 union {
1051 u64 csr;
1052 struct {
1053 /*
1054 * Indicates the Error Register that was
1055 * triggered second
1056 */
1057 u64 err_reg_status:60;
1058 /*
1059 * Holds 60 LSBs from the Error register that was
1060 * triggered second
1061 */
1062 u8 errReg_id:4;
1063 };
1064 };
1065 };
1066
1067 /* RAS Non Fatal Error Status register */
1068 struct feature_fme_ras_nonfaterror {
1069 union {
1070 u64 csr;
1071 struct {
1072 /* thremal threshold AP1 */
1073 u8 temp_thresh_ap1:1;
1074 /* thremal threshold AP2 */
1075 u8 temp_thresh_ap2:1;
1076 u8 pcie_error:1; /* pcie Error */
1077 u8 portfatal_error:1; /* port fatal error */
1078 u8 proc_hot:1; /* Indicates a ProcHot event */
1079 /* Indicates an AFU PF/VF access mismatch */
1080 u8 afu_acc_mode_err:1;
1081 /* Injected nonfata Error */
1082 u8 injected_nonfata_err:1;
1083 u8 rsvd1:2;
1084 /* Temperature threshold triggered AP6*/
1085 u8 temp_thresh_AP6:1;
1086 /* Power threshold triggered AP1 */
1087 u8 power_thresh_AP1:1;
1088 /* Power threshold triggered AP2 */
1089 u8 power_thresh_AP2:1;
1090 /* Indicates a MBP event */
1091 u8 mbp_err:1;
1092 u64 rsvd2:51; /* Reserved */
1093 };
1094 };
1095 };
1096
1097 /* RAS Catastrophic Fatal Error Status register */
1098 struct feature_fme_ras_catfaterror {
1099 union {
1100 u64 csr;
1101 struct {
1102 /* KTI Link layer error detected */
1103 u8 ktilink_fatal_err:1;
1104 /* tag-n-cache error detected */
1105 u8 tagcch_fatal_err:1;
1106 /* CCI error detected */
1107 u8 cci_fatal_err:1;
1108 /* KTI Protocol error detected */
1109 u8 ktiprpto_fatal_err:1;
1110 /* Fatal DRAM error detected */
1111 u8 dram_fatal_err:1;
1112 /* IOMMU detected */
1113 u8 iommu_fatal_err:1;
1114 /* Fabric Fatal Error */
1115 u8 fabric_fatal_err:1;
1116 /* PCIe possion Error */
1117 u8 pcie_poison_err:1;
1118 /* Injected fatal Error */
1119 u8 inject_fata_err:1;
1120 /* Catastrophic CRC Error */
1121 u8 crc_catast_err:1;
1122 /* Catastrophic Thermal Error */
1123 u8 therm_catast_err:1;
1124 /* Injected Catastrophic Error */
1125 u8 injected_catast_err:1;
1126 u64 rsvd:52;
1127 };
1128 };
1129 };
1130
1131 /* RAS Error injection register */
1132 struct feature_fme_ras_error_inj {
1133 #define FME_RAS_ERROR_INJ_MASK 0x7UL
1134 union {
1135 u64 csr;
1136 struct {
1137 u8 catast_error:1; /* Catastrophic error flag */
1138 u8 fatal_error:1; /* Fatal error flag */
1139 u8 nonfatal_error:1; /* NonFatal error flag */
1140 u64 rsvd:61; /* Reserved */
1141 };
1142 };
1143 };
1144
1145 /* FME error capabilities */
1146 struct feature_fme_error_capability {
1147 union {
1148 u64 csr;
1149 struct {
1150 u8 support_intr:1;
1151 /* MSI-X vector table entry number */
1152 u16 intr_vector_num:12;
1153 u64 rsvd:51; /* Reserved */
1154 };
1155 };
1156 };
1157
1158 /* FME ERR FEATURE */
1159 struct feature_fme_err {
1160 struct feature_header header;
1161 struct feature_fme_error0 fme_err_mask;
1162 struct feature_fme_error0 fme_err;
1163 struct feature_fme_pcie0_error pcie0_err_mask;
1164 struct feature_fme_pcie0_error pcie0_err;
1165 struct feature_fme_pcie1_error pcie1_err_mask;
1166 struct feature_fme_pcie1_error pcie1_err;
1167 struct feature_fme_first_error fme_first_err;
1168 struct feature_fme_next_error fme_next_err;
1169 struct feature_fme_ras_nonfaterror ras_nonfat_mask;
1170 struct feature_fme_ras_nonfaterror ras_nonfaterr;
1171 struct feature_fme_ras_catfaterror ras_catfat_mask;
1172 struct feature_fme_ras_catfaterror ras_catfaterr;
1173 struct feature_fme_ras_error_inj ras_error_inj;
1174 struct feature_fme_error_capability fme_err_capability;
1175 };
1176
1177 /* FME Partial Reconfiguration Control */
1178 struct feature_fme_pr_ctl {
1179 union {
1180 u64 csr;
1181 struct {
1182 u8 pr_reset:1; /* Reset PR Engine */
1183 u8 rsvd3:3; /* Reserved */
1184 u8 pr_reset_ack:1; /* Reset PR Engine Ack */
1185 u8 rsvd4:3; /* Reserved */
1186 u8 pr_regionid:2; /* PR Region ID */
1187 u8 rsvd1:2; /* Reserved */
1188 u8 pr_start_req:1; /* PR Start Request */
1189 u8 pr_push_complete:1; /* PR Data push complete */
1190 u8 pr_kind:1; /* PR Data push complete */
1191 u32 rsvd:17; /* Reserved */
1192 u32 config_data; /* Config data TBD */
1193 };
1194 };
1195 };
1196
1197 /* FME Partial Reconfiguration Status */
1198 struct feature_fme_pr_status {
1199 union {
1200 u64 csr;
1201 struct {
1202 u16 pr_credit:9; /* PR Credits */
1203 u8 rsvd2:7; /* Reserved */
1204 u8 pr_status:1; /* PR status */
1205 u8 rsvd:3; /* Reserved */
1206 /* Altra PR Controller Block status */
1207 u8 pr_controller_status:3;
1208 u8 rsvd1:1; /* Reserved */
1209 u8 pr_host_status:4; /* PR Host status */
1210 u8 rsvd3:4; /* Reserved */
1211 /* Security Block Status fields (TBD) */
1212 u32 security_bstatus;
1213 };
1214 };
1215 };
1216
1217 /* FME Partial Reconfiguration Data */
1218 struct feature_fme_pr_data {
1219 union {
1220 u64 csr; /* PR data from the raw-binary file */
1221 struct {
1222 /* PR data from the raw-binary file */
1223 u32 pr_data_raw;
1224 u32 rsvd;
1225 };
1226 };
1227 };
1228
1229 /* FME PR Public Key */
1230 struct feature_fme_pr_key {
1231 u64 key; /* FME PR Public Hash */
1232 };
1233
1234 /* FME PR FEATURE */
1235 struct feature_fme_pr {
1236 struct feature_header header;
1237 /*Partial Reconfiguration control */
1238 struct feature_fme_pr_ctl ccip_fme_pr_control;
1239
1240 /* Partial Reconfiguration Status */
1241 struct feature_fme_pr_status ccip_fme_pr_status;
1242
1243 /* Partial Reconfiguration data */
1244 struct feature_fme_pr_data ccip_fme_pr_data;
1245
1246 /* Partial Reconfiguration data */
1247 u64 ccip_fme_pr_err;
1248
1249 u64 rsvd1[3];
1250
1251 /* Partial Reconfiguration data registers */
1252 u64 fme_pr_data1;
1253 u64 fme_pr_data2;
1254 u64 fme_pr_data3;
1255 u64 fme_pr_data4;
1256 u64 fme_pr_data5;
1257 u64 fme_pr_data6;
1258 u64 fme_pr_data7;
1259 u64 fme_pr_data8;
1260
1261 u64 rsvd2[5];
1262
1263 /* PR Interface ID */
1264 u64 fme_pr_intfc_id_l;
1265 u64 fme_pr_intfc_id_h;
1266
1267 /* MSIX filed to be Added */
1268 };
1269
1270 /* FME HSSI Control */
1271 struct feature_fme_hssi_eth_ctrl {
1272 union {
1273 u64 csr;
1274 struct {
1275 u32 data:32; /* HSSI data */
1276 u16 address:16; /* HSSI address */
1277 /*
1278 * HSSI comamnd
1279 * 0x0 - No request
1280 * 0x08 - SW register RD request
1281 * 0x10 - SW register WR request
1282 * 0x40 - Auxiliar bus RD request
1283 * 0x80 - Auxiliar bus WR request
1284 */
1285 u16 cmd:16;
1286 };
1287 };
1288 };
1289
1290 /* FME HSSI Status */
1291 struct feature_fme_hssi_eth_stat {
1292 union {
1293 u64 csr;
1294 struct {
1295 u32 data:32; /* HSSI data */
1296 u8 acknowledge:1; /* HSSI acknowledge */
1297 u8 spare:1; /* HSSI spare */
1298 u32 rsvd:30; /* Reserved */
1299 };
1300 };
1301 };
1302
1303 /* FME HSSI FEATURE */
1304 struct feature_fme_hssi {
1305 struct feature_header header;
1306 struct feature_fme_hssi_eth_ctrl hssi_control;
1307 struct feature_fme_hssi_eth_stat hssi_status;
1308 };
1309
1310 #define PORT_ERR_MASK 0xfff0703ff001f
1311 struct feature_port_err_key {
1312 union {
1313 u64 csr;
1314 struct {
1315 /* Tx Channel0: Overflow */
1316 u8 tx_ch0_overflow:1;
1317 /* Tx Channel0: Invalid request encoding */
1318 u8 tx_ch0_invaldreq :1;
1319 /* Tx Channel0: Request with cl_len=3 not supported */
1320 u8 tx_ch0_cl_len3:1;
1321 /* Tx Channel0: Request with cl_len=2 not aligned 2CL */
1322 u8 tx_ch0_cl_len2:1;
1323 /* Tx Channel0: Request with cl_len=4 not aligned 4CL */
1324 u8 tx_ch0_cl_len4:1;
1325
1326 u16 rsvd1:4; /* Reserved */
1327
1328 /* AFU MMIO RD received while PORT is in reset */
1329 u8 mmio_rd_whilerst:1;
1330 /* AFU MMIO WR received while PORT is in reset */
1331 u8 mmio_wr_whilerst:1;
1332
1333 u16 rsvd2:5; /* Reserved */
1334
1335 /* Tx Channel1: Overflow */
1336 u8 tx_ch1_overflow:1;
1337 /* Tx Channel1: Invalid request encoding */
1338 u8 tx_ch1_invaldreq:1;
1339 /* Tx Channel1: Request with cl_len=3 not supported */
1340 u8 tx_ch1_cl_len3:1;
1341 /* Tx Channel1: Request with cl_len=2 not aligned 2CL */
1342 u8 tx_ch1_cl_len2:1;
1343 /* Tx Channel1: Request with cl_len=4 not aligned 4CL */
1344 u8 tx_ch1_cl_len4:1;
1345
1346 /* Tx Channel1: Insufficient data payload */
1347 u8 tx_ch1_insuff_data:1;
1348 /* Tx Channel1: Data payload overrun */
1349 u8 tx_ch1_data_overrun:1;
1350 /* Tx Channel1 : Incorrect address */
1351 u8 tx_ch1_incorr_addr:1;
1352 /* Tx Channel1 : NON-Zero SOP Detected */
1353 u8 tx_ch1_nzsop:1;
1354 /* Tx Channel1 : Illegal VC_SEL, atomic request VLO */
1355 u8 tx_ch1_illegal_vcsel:1;
1356
1357 u8 rsvd3:6; /* Reserved */
1358
1359 /* MMIO Read Timeout in AFU */
1360 u8 mmioread_timeout:1;
1361
1362 /* Tx Channel2: FIFO Overflow */
1363 u8 tx_ch2_fifo_overflow:1;
1364
1365 /* MMIO read is not matching pending request */
1366 u8 unexp_mmio_resp:1;
1367
1368 u8 rsvd4:5; /* Reserved */
1369
1370 /* Number of pending Requests: counter overflow */
1371 u8 tx_req_counter_overflow:1;
1372 /* Req with Address violating SMM Range */
1373 u8 llpr_smrr_err:1;
1374 /* Req with Address violating second SMM Range */
1375 u8 llpr_smrr2_err:1;
1376 /* Req with Address violating ME Stolen message */
1377 u8 llpr_mesg_err:1;
1378 /* Req with Address violating Generic Protected Range */
1379 u8 genprot_range_err:1;
1380 /* Req with Address violating Legacy Range low */
1381 u8 legrange_low_err:1;
1382 /* Req with Address violating Legacy Range High */
1383 u8 legrange_high_err:1;
1384 /* Req with Address violating VGA memory range */
1385 u8 vgmem_range_err:1;
1386 u8 page_fault_err:1; /* Page fault */
1387 u8 pmr_err:1; /* PMR Error */
1388 u8 ap6_event:1; /* AP6 event */
1389 /* VF FLR detected on Port with PF access control */
1390 u8 vfflr_access_err:1;
1391 u16 rsvd5:12; /* Reserved */
1392 };
1393 };
1394 };
1395
1396 /* Port first error register, not contain all error bits in error register. */
1397 struct feature_port_first_err_key {
1398 union {
1399 u64 csr;
1400 struct {
1401 u8 tx_ch0_overflow:1;
1402 u8 tx_ch0_invaldreq :1;
1403 u8 tx_ch0_cl_len3:1;
1404 u8 tx_ch0_cl_len2:1;
1405 u8 tx_ch0_cl_len4:1;
1406 u8 rsvd1:4; /* Reserved */
1407 u8 mmio_rd_whilerst:1;
1408 u8 mmio_wr_whilerst:1;
1409 u8 rsvd2:5; /* Reserved */
1410 u8 tx_ch1_overflow:1;
1411 u8 tx_ch1_invaldreq:1;
1412 u8 tx_ch1_cl_len3:1;
1413 u8 tx_ch1_cl_len2:1;
1414 u8 tx_ch1_cl_len4:1;
1415 u8 tx_ch1_insuff_data:1;
1416 u8 tx_ch1_data_overrun:1;
1417 u8 tx_ch1_incorr_addr:1;
1418 u8 tx_ch1_nzsop:1;
1419 u8 tx_ch1_illegal_vcsel:1;
1420 u8 rsvd3:6; /* Reserved */
1421 u8 mmioread_timeout:1;
1422 u8 tx_ch2_fifo_overflow:1;
1423 u8 rsvd4:6; /* Reserved */
1424 u8 tx_req_counter_overflow:1;
1425 u32 rsvd5:23; /* Reserved */
1426 };
1427 };
1428 };
1429
1430 /* Port malformed Req0 */
1431 struct feature_port_malformed_req0 {
1432 u64 header_lsb;
1433 };
1434
1435 /* Port malformed Req1 */
1436 struct feature_port_malformed_req1 {
1437 u64 header_msb;
1438 };
1439
1440 /* Port debug register */
1441 struct feature_port_debug {
1442 u64 port_debug;
1443 };
1444
1445 /* Port error capabilities */
1446 struct feature_port_err_capability {
1447 union {
1448 u64 csr;
1449 struct {
1450 u8 support_intr:1;
1451 /* MSI-X vector table entry number */
1452 u16 intr_vector_num:12;
1453 u64 rsvd:51; /* Reserved */
1454 };
1455 };
1456 };
1457
1458 /* PORT FEATURE ERROR */
1459 struct feature_port_error {
1460 struct feature_header header;
1461 struct feature_port_err_key error_mask;
1462 struct feature_port_err_key port_error;
1463 struct feature_port_first_err_key port_first_error;
1464 struct feature_port_malformed_req0 malreq0;
1465 struct feature_port_malformed_req1 malreq1;
1466 struct feature_port_debug port_debug;
1467 struct feature_port_err_capability error_capability;
1468 };
1469
1470 /* Port UMSG Capability */
1471 struct feature_port_umsg_cap {
1472 union {
1473 u64 csr;
1474 struct {
1475 /* Number of umsg allocated to this port */
1476 u8 umsg_allocated;
1477 /* Enable / Disable UMsg engine for this port */
1478 u8 umsg_enable:1;
1479 /* Usmg initialization status */
1480 u8 umsg_init_complete:1;
1481 /* IOMMU can not translate the umsg base address */
1482 u8 umsg_trans_error:1;
1483 u64 rsvd:53; /* Reserved */
1484 };
1485 };
1486 };
1487
1488 /* Port UMSG base address */
1489 struct feature_port_umsg_baseaddr {
1490 union {
1491 u64 csr;
1492 struct {
1493 u64 base_addr:48; /* 48 bit physical address */
1494 u16 rsvd; /* Reserved */
1495 };
1496 };
1497 };
1498
1499 struct feature_port_umsg_mode {
1500 union {
1501 u64 csr;
1502 struct {
1503 u32 umsg_hint_enable; /* UMSG hint enable/disable */
1504 u32 rsvd; /* Reserved */
1505 };
1506 };
1507 };
1508
1509 /* PORT FEATURE UMSG */
1510 struct feature_port_umsg {
1511 struct feature_header header;
1512 struct feature_port_umsg_cap capability;
1513 struct feature_port_umsg_baseaddr baseaddr;
1514 struct feature_port_umsg_mode mode;
1515 };
1516
1517 #define UMSG_EN_POLL_INVL 10 /* us */
1518 #define UMSG_EN_POLL_TIMEOUT 1000 /* us */
1519
1520 /* Port UINT Capability */
1521 struct feature_port_uint_cap {
1522 union {
1523 u64 csr;
1524 struct {
1525 u16 intr_num:12; /* Supported interrupts num */
1526 /* First MSI-X vector table entry number */
1527 u16 first_vec_num:12;
1528 u64 rsvd:40;
1529 };
1530 };
1531 };
1532
1533 /* PORT FEATURE UINT */
1534 struct feature_port_uint {
1535 struct feature_header header;
1536 struct feature_port_uint_cap capability;
1537 };
1538
1539 /* STP region supports mmap operation, so use page aligned size. */
1540 #define PORT_FEATURE_STP_REGION_SIZE \
1541 IFPGA_PAGE_ALIGN(sizeof(struct feature_port_stp))
1542
1543 /* Port STP status register (for debug only)*/
1544 struct feature_port_stp_status {
1545 union {
1546 u64 csr;
1547 struct {
1548 /* SLD Hub end-point read/write timeout */
1549 u8 sld_ep_timeout:1;
1550 /* Remote STP in reset/disable */
1551 u8 rstp_disabled:1;
1552 u8 unsupported_read:1;
1553 /* MMIO timeout detected and faked with a response */
1554 u8 mmio_timeout:1;
1555 u8 txfifo_count:4;
1556 u8 rxfifo_count:4;
1557 u8 txfifo_overflow:1;
1558 u8 txfifo_underflow:1;
1559 u8 rxfifo_overflow:1;
1560 u8 rxfifo_underflow:1;
1561 /* Number of MMIO write requests */
1562 u16 write_requests;
1563 /* Number of MMIO read requests */
1564 u16 read_requests;
1565 /* Number of MMIO read responses */
1566 u16 read_responses;
1567 };
1568 };
1569 };
1570
1571 /*
1572 * PORT FEATURE STP
1573 * Most registers in STP region are not touched by driver, but mmapped to user
1574 * space. So they are not defined in below data structure, as its actual size
1575 * is 0x18c per spec.
1576 */
1577 struct feature_port_stp {
1578 struct feature_header header;
1579 struct feature_port_stp_status stp_status;
1580 };
1581
1582 /**
1583 * enum fpga_pr_states - fpga PR states
1584 * @FPGA_PR_STATE_UNKNOWN: can't determine state
1585 * @FPGA_PR_STATE_WRITE_INIT: preparing FPGA for programming
1586 * @FPGA_PR_STATE_WRITE_INIT_ERR: Error during WRITE_INIT stage
1587 * @FPGA_PR_STATE_WRITE: writing image to FPGA
1588 * @FPGA_PR_STATE_WRITE_ERR: Error while writing FPGA
1589 * @FPGA_PR_STATE_WRITE_COMPLETE: Doing post programming steps
1590 * @FPGA_PR_STATE_WRITE_COMPLETE_ERR: Error during WRITE_COMPLETE
1591 * @FPGA_PR_STATE_OPERATING: FPGA PR done
1592 */
1593 enum fpga_pr_states {
1594 /* canot determine state states */
1595 FPGA_PR_STATE_UNKNOWN,
1596
1597 /* write sequence: init, write, complete */
1598 FPGA_PR_STATE_WRITE_INIT,
1599 FPGA_PR_STATE_WRITE_INIT_ERR,
1600 FPGA_PR_STATE_WRITE,
1601 FPGA_PR_STATE_WRITE_ERR,
1602 FPGA_PR_STATE_WRITE_COMPLETE,
1603 FPGA_PR_STATE_WRITE_COMPLETE_ERR,
1604
1605 /* FPGA PR done */
1606 FPGA_PR_STATE_DONE,
1607 };
1608
1609 /*
1610 * FPGA Manager flags
1611 * FPGA_MGR_PARTIAL_RECONFIG: do partial reconfiguration if supported
1612 */
1613 #define FPGA_MGR_PARTIAL_RECONFIG BIT(0)
1614
1615 /**
1616 * struct fpga_pr_info - specific information to a FPGA PR
1617 * @flags: boolean flags as defined above
1618 * @pr_err: PR error code
1619 * @state: fpga manager state
1620 * @port_id: port id
1621 */
1622 struct fpga_pr_info {
1623 u32 flags;
1624 u64 pr_err;
1625 enum fpga_pr_states state;
1626 int port_id;
1627 };
1628
1629 #define DEFINE_FPGA_PR_ERR_MSG(_name_) \
1630 static const char * const _name_[] = { \
1631 "PR operation error detected", \
1632 "PR CRC error detected", \
1633 "PR incompatiable bitstream error detected", \
1634 "PR IP protocol error detected", \
1635 "PR FIFO overflow error detected", \
1636 "PR timeout error detected", \
1637 "PR secure load error detected", \
1638 }
1639
1640 #define RST_POLL_INVL 10 /* us */
1641 #define RST_POLL_TIMEOUT 1000 /* us */
1642
1643 #define PR_WAIT_TIMEOUT 15000000
1644
1645 #define PR_HOST_STATUS_IDLE 0
1646 #define PR_MAX_ERR_NUM 7
1647
1648 DEFINE_FPGA_PR_ERR_MSG(pr_err_msg);
1649
1650 /*
1651 * green bitstream header must be byte-packed to match the
1652 * real file format.
1653 */
1654 struct bts_header {
1655 u64 guid_h;
1656 u64 guid_l;
1657 u32 metadata_len;
1658 };
1659
1660 #define GBS_GUID_H 0x414750466e6f6558
1661 #define GBS_GUID_L 0x31303076534247b7
1662 #define is_valid_bts(bts_hdr) \
1663 (((bts_hdr)->guid_h == GBS_GUID_H) && \
1664 ((bts_hdr)->guid_l == GBS_GUID_L))
1665
1666 /* bitstream id definition */
1667 struct fme_bitstream_id {
1668 union {
1669 u64 id;
1670 struct {
1671 u64 hash:32;
1672 u64 interface:4;
1673 u64 reserved:12;
1674 u64 debug:4;
1675 u64 patch:4;
1676 u64 minor:4;
1677 u64 major:4;
1678 };
1679 };
1680 };
1681
1682 enum board_interface {
1683 VC_8_10G = 0,
1684 VC_4_25G = 1,
1685 VC_2_1_25 = 2,
1686 VC_4_25G_2_25G = 3,
1687 VC_2_2_25G = 4,
1688 };
1689
1690 struct ifpga_fme_board_info {
1691 enum board_interface type;
1692 u32 build_hash;
1693 u32 debug_version;
1694 u32 patch_version;
1695 u32 minor_version;
1696 u32 major_version;
1697 u32 nums_of_retimer;
1698 u32 ports_per_retimer;
1699 u32 nums_of_fvl;
1700 u32 ports_per_fvl;
1701 };
1702
1703 #pragma pack(pop)
1704 #endif /* _BASE_IFPGA_DEFINES_H_ */