| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
|---|
| 1 | 2 | /* QLogic qed NIC Driver |
|---|
| 2 | 3 | * Copyright (c) 2015-2017 QLogic Corporation |
|---|
| 3 | | - * |
|---|
| 4 | | - * This software is available to you under a choice of one of two |
|---|
| 5 | | - * licenses. You may choose to be licensed under the terms of the GNU |
|---|
| 6 | | - * General Public License (GPL) Version 2, available from the file |
|---|
| 7 | | - * COPYING in the main directory of this source tree, or the |
|---|
| 8 | | - * OpenIB.org BSD license below: |
|---|
| 9 | | - * |
|---|
| 10 | | - * Redistribution and use in source and binary forms, with or |
|---|
| 11 | | - * without modification, are permitted provided that the following |
|---|
| 12 | | - * conditions are met: |
|---|
| 13 | | - * |
|---|
| 14 | | - * - Redistributions of source code must retain the above |
|---|
| 15 | | - * copyright notice, this list of conditions and the following |
|---|
| 16 | | - * disclaimer. |
|---|
| 17 | | - * |
|---|
| 18 | | - * - Redistributions in binary form must reproduce the above |
|---|
| 19 | | - * copyright notice, this list of conditions and the following |
|---|
| 20 | | - * disclaimer in the documentation and /or other materials |
|---|
| 21 | | - * provided with the distribution. |
|---|
| 22 | | - * |
|---|
| 23 | | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|---|
| 24 | | - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|---|
| 25 | | - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|---|
| 26 | | - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|---|
| 27 | | - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|---|
| 28 | | - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|---|
| 29 | | - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|---|
| 30 | | - * SOFTWARE. |
|---|
| 4 | + * Copyright (c) 2019-2020 Marvell International Ltd. |
|---|
| 31 | 5 | */ |
|---|
| 32 | 6 | |
|---|
| 33 | 7 | #ifndef _QED_H |
|---|
| .. | .. |
|---|
| 53 | 27 | extern const struct qed_common_ops qed_common_ops_pass; |
|---|
| 54 | 28 | |
|---|
| 55 | 29 | #define QED_MAJOR_VERSION 8 |
|---|
| 56 | | -#define QED_MINOR_VERSION 33 |
|---|
| 30 | +#define QED_MINOR_VERSION 37 |
|---|
| 57 | 31 | #define QED_REVISION_VERSION 0 |
|---|
| 58 | 32 | #define QED_ENGINEERING_VERSION 20 |
|---|
| 59 | 33 | |
|---|
| .. | .. |
|---|
| 140 | 114 | struct qed_sb_sp_info; |
|---|
| 141 | 115 | struct qed_ll2_info; |
|---|
| 142 | 116 | struct qed_mcp_info; |
|---|
| 117 | +struct qed_llh_info; |
|---|
| 143 | 118 | |
|---|
| 144 | 119 | struct qed_rt_data { |
|---|
| 145 | 120 | u32 *init_val; |
|---|
| .. | .. |
|---|
| 252 | 227 | QED_VLAN, |
|---|
| 253 | 228 | QED_RDMA_CNQ_RAM, |
|---|
| 254 | 229 | QED_ILT, |
|---|
| 255 | | - QED_LL2_QUEUE, |
|---|
| 230 | + QED_LL2_RAM_QUEUE, |
|---|
| 231 | + QED_LL2_CTX_QUEUE, |
|---|
| 256 | 232 | QED_CMDQS_CQS, |
|---|
| 257 | 233 | QED_RDMA_STATS_QUEUE, |
|---|
| 258 | 234 | QED_BDQ, |
|---|
| .. | .. |
|---|
| 269 | 245 | QED_MAX_FEATURES, |
|---|
| 270 | 246 | }; |
|---|
| 271 | 247 | |
|---|
| 272 | | -enum QED_PORT_MODE { |
|---|
| 273 | | - QED_PORT_MODE_DE_2X40G, |
|---|
| 274 | | - QED_PORT_MODE_DE_2X50G, |
|---|
| 275 | | - QED_PORT_MODE_DE_1X100G, |
|---|
| 276 | | - QED_PORT_MODE_DE_4X10G_F, |
|---|
| 277 | | - QED_PORT_MODE_DE_4X10G_E, |
|---|
| 278 | | - QED_PORT_MODE_DE_4X20G, |
|---|
| 279 | | - QED_PORT_MODE_DE_1X40G, |
|---|
| 280 | | - QED_PORT_MODE_DE_2X25G, |
|---|
| 281 | | - QED_PORT_MODE_DE_1X25G, |
|---|
| 282 | | - QED_PORT_MODE_DE_4X25G, |
|---|
| 283 | | - QED_PORT_MODE_DE_2X10G, |
|---|
| 284 | | -}; |
|---|
| 285 | | - |
|---|
| 286 | 248 | enum qed_dev_cap { |
|---|
| 287 | 249 | QED_DEV_CAP_ETH, |
|---|
| 288 | 250 | QED_DEV_CAP_FCOE, |
|---|
| .. | .. |
|---|
| 296 | 258 | QED_WOL_SUPPORT_PME, |
|---|
| 297 | 259 | }; |
|---|
| 298 | 260 | |
|---|
| 261 | +enum qed_db_rec_exec { |
|---|
| 262 | + DB_REC_DRY_RUN, |
|---|
| 263 | + DB_REC_REAL_DEAL, |
|---|
| 264 | + DB_REC_ONCE, |
|---|
| 265 | +}; |
|---|
| 266 | + |
|---|
| 299 | 267 | struct qed_hw_info { |
|---|
| 300 | 268 | /* PCI personality */ |
|---|
| 301 | | - enum qed_pci_personality personality; |
|---|
| 302 | | -#define QED_IS_RDMA_PERSONALITY(dev) \ |
|---|
| 303 | | - ((dev)->hw_info.personality == QED_PCI_ETH_ROCE || \ |
|---|
| 304 | | - (dev)->hw_info.personality == QED_PCI_ETH_IWARP || \ |
|---|
| 269 | + enum qed_pci_personality personality; |
|---|
| 270 | +#define QED_IS_RDMA_PERSONALITY(dev) \ |
|---|
| 271 | + ((dev)->hw_info.personality == QED_PCI_ETH_ROCE || \ |
|---|
| 272 | + (dev)->hw_info.personality == QED_PCI_ETH_IWARP || \ |
|---|
| 305 | 273 | (dev)->hw_info.personality == QED_PCI_ETH_RDMA) |
|---|
| 306 | | -#define QED_IS_ROCE_PERSONALITY(dev) \ |
|---|
| 307 | | - ((dev)->hw_info.personality == QED_PCI_ETH_ROCE || \ |
|---|
| 274 | +#define QED_IS_ROCE_PERSONALITY(dev) \ |
|---|
| 275 | + ((dev)->hw_info.personality == QED_PCI_ETH_ROCE || \ |
|---|
| 308 | 276 | (dev)->hw_info.personality == QED_PCI_ETH_RDMA) |
|---|
| 309 | | -#define QED_IS_IWARP_PERSONALITY(dev) \ |
|---|
| 310 | | - ((dev)->hw_info.personality == QED_PCI_ETH_IWARP || \ |
|---|
| 277 | +#define QED_IS_IWARP_PERSONALITY(dev) \ |
|---|
| 278 | + ((dev)->hw_info.personality == QED_PCI_ETH_IWARP || \ |
|---|
| 311 | 279 | (dev)->hw_info.personality == QED_PCI_ETH_RDMA) |
|---|
| 312 | | -#define QED_IS_L2_PERSONALITY(dev) \ |
|---|
| 313 | | - ((dev)->hw_info.personality == QED_PCI_ETH || \ |
|---|
| 280 | +#define QED_IS_L2_PERSONALITY(dev) \ |
|---|
| 281 | + ((dev)->hw_info.personality == QED_PCI_ETH || \ |
|---|
| 314 | 282 | QED_IS_RDMA_PERSONALITY(dev)) |
|---|
| 315 | | -#define QED_IS_FCOE_PERSONALITY(dev) \ |
|---|
| 283 | +#define QED_IS_FCOE_PERSONALITY(dev) \ |
|---|
| 316 | 284 | ((dev)->hw_info.personality == QED_PCI_FCOE) |
|---|
| 317 | | -#define QED_IS_ISCSI_PERSONALITY(dev) \ |
|---|
| 285 | +#define QED_IS_ISCSI_PERSONALITY(dev) \ |
|---|
| 318 | 286 | ((dev)->hw_info.personality == QED_PCI_ISCSI) |
|---|
| 319 | 287 | |
|---|
| 320 | 288 | /* Resource Allocation scheme results */ |
|---|
| 321 | 289 | u32 resc_start[QED_MAX_RESC]; |
|---|
| 322 | 290 | u32 resc_num[QED_MAX_RESC]; |
|---|
| 323 | | - u32 feat_num[QED_MAX_FEATURES]; |
|---|
| 291 | +#define RESC_START(_p_hwfn, resc) ((_p_hwfn)->hw_info.resc_start[resc]) |
|---|
| 292 | +#define RESC_NUM(_p_hwfn, resc) ((_p_hwfn)->hw_info.resc_num[resc]) |
|---|
| 293 | +#define RESC_END(_p_hwfn, resc) (RESC_START(_p_hwfn, resc) + \ |
|---|
| 294 | + RESC_NUM(_p_hwfn, resc)) |
|---|
| 324 | 295 | |
|---|
| 325 | | -#define RESC_START(_p_hwfn, resc) ((_p_hwfn)->hw_info.resc_start[resc]) |
|---|
| 326 | | -#define RESC_NUM(_p_hwfn, resc) ((_p_hwfn)->hw_info.resc_num[resc]) |
|---|
| 327 | | -#define RESC_END(_p_hwfn, resc) (RESC_START(_p_hwfn, resc) + \ |
|---|
| 328 | | - RESC_NUM(_p_hwfn, resc)) |
|---|
| 329 | | -#define FEAT_NUM(_p_hwfn, resc) ((_p_hwfn)->hw_info.feat_num[resc]) |
|---|
| 296 | + u32 feat_num[QED_MAX_FEATURES]; |
|---|
| 297 | +#define FEAT_NUM(_p_hwfn, resc) ((_p_hwfn)->hw_info.feat_num[resc]) |
|---|
| 330 | 298 | |
|---|
| 331 | 299 | /* Amount of traffic classes HW supports */ |
|---|
| 332 | | - u8 num_hw_tc; |
|---|
| 300 | + u8 num_hw_tc; |
|---|
| 333 | 301 | |
|---|
| 334 | 302 | /* Amount of TCs which should be active according to DCBx or upper |
|---|
| 335 | 303 | * layer driver configuration. |
|---|
| 336 | 304 | */ |
|---|
| 337 | | - u8 num_active_tc; |
|---|
| 305 | + u8 num_active_tc; |
|---|
| 306 | + |
|---|
| 338 | 307 | u8 offload_tc; |
|---|
| 339 | 308 | bool offload_tc_set; |
|---|
| 340 | 309 | |
|---|
| 341 | 310 | bool multi_tc_roce_en; |
|---|
| 342 | | -#define IS_QED_MULTI_TC_ROCE(p_hwfn) (((p_hwfn)->hw_info.multi_tc_roce_en)) |
|---|
| 311 | +#define IS_QED_MULTI_TC_ROCE(p_hwfn) ((p_hwfn)->hw_info.multi_tc_roce_en) |
|---|
| 343 | 312 | |
|---|
| 344 | 313 | u32 concrete_fid; |
|---|
| 345 | 314 | u16 opaque_fid; |
|---|
| .. | .. |
|---|
| 354 | 323 | |
|---|
| 355 | 324 | struct qed_igu_info *p_igu_info; |
|---|
| 356 | 325 | |
|---|
| 357 | | - u32 port_mode; |
|---|
| 358 | 326 | u32 hw_mode; |
|---|
| 359 | | - unsigned long device_capabilities; |
|---|
| 327 | + unsigned long device_capabilities; |
|---|
| 360 | 328 | u16 mtu; |
|---|
| 361 | 329 | |
|---|
| 362 | | - enum qed_wol_support b_wol_support; |
|---|
| 330 | + enum qed_wol_support b_wol_support; |
|---|
| 363 | 331 | }; |
|---|
| 364 | 332 | |
|---|
| 365 | 333 | /* maximun size of read/write commands (HW limit) */ |
|---|
| .. | .. |
|---|
| 425 | 393 | u8 num_pf_rls; |
|---|
| 426 | 394 | }; |
|---|
| 427 | 395 | |
|---|
| 396 | +#define QED_OVERFLOW_BIT 1 |
|---|
| 397 | + |
|---|
| 398 | +struct qed_db_recovery_info { |
|---|
| 399 | + struct list_head list; |
|---|
| 400 | + |
|---|
| 401 | + /* Lock to protect the doorbell recovery mechanism list */ |
|---|
| 402 | + spinlock_t lock; |
|---|
| 403 | + bool dorq_attn; |
|---|
| 404 | + u32 db_recovery_counter; |
|---|
| 405 | + unsigned long overflow; |
|---|
| 406 | +}; |
|---|
| 407 | + |
|---|
| 428 | 408 | struct storm_stats { |
|---|
| 429 | 409 | u32 address; |
|---|
| 430 | 410 | u32 len; |
|---|
| .. | .. |
|---|
| 442 | 422 | const u8 *modes_tree_buf; |
|---|
| 443 | 423 | union init_op *init_ops; |
|---|
| 444 | 424 | const u32 *arr_data; |
|---|
| 425 | + const u32 *fw_overlays; |
|---|
| 426 | + u32 fw_overlays_len; |
|---|
| 445 | 427 | u32 init_ops_size; |
|---|
| 446 | 428 | }; |
|---|
| 447 | 429 | |
|---|
| .. | .. |
|---|
| 478 | 460 | |
|---|
| 479 | 461 | /* Allow DSCP to TC mapping */ |
|---|
| 480 | 462 | QED_MF_DSCP_TO_TC_MAP, |
|---|
| 463 | + |
|---|
| 464 | + /* Do not insert a vlan tag with id 0 */ |
|---|
| 465 | + QED_MF_DONT_ADD_VLAN0_TAG, |
|---|
| 481 | 466 | }; |
|---|
| 482 | 467 | |
|---|
| 483 | 468 | enum qed_ufp_mode { |
|---|
| .. | .. |
|---|
| 509 | 494 | bool valid; |
|---|
| 510 | 495 | }; |
|---|
| 511 | 496 | |
|---|
| 497 | +enum qed_hsi_def_type { |
|---|
| 498 | + QED_HSI_DEF_MAX_NUM_VFS, |
|---|
| 499 | + QED_HSI_DEF_MAX_NUM_L2_QUEUES, |
|---|
| 500 | + QED_HSI_DEF_MAX_NUM_PORTS, |
|---|
| 501 | + QED_HSI_DEF_MAX_SB_PER_PATH, |
|---|
| 502 | + QED_HSI_DEF_MAX_NUM_PFS, |
|---|
| 503 | + QED_HSI_DEF_MAX_NUM_VPORTS, |
|---|
| 504 | + QED_HSI_DEF_NUM_ETH_RSS_ENGINE, |
|---|
| 505 | + QED_HSI_DEF_MAX_QM_TX_QUEUES, |
|---|
| 506 | + QED_HSI_DEF_NUM_PXP_ILT_RECORDS, |
|---|
| 507 | + QED_HSI_DEF_NUM_RDMA_STATISTIC_COUNTERS, |
|---|
| 508 | + QED_HSI_DEF_MAX_QM_GLOBAL_RLS, |
|---|
| 509 | + QED_HSI_DEF_MAX_PBF_CMD_LINES, |
|---|
| 510 | + QED_HSI_DEF_MAX_BTB_BLOCKS, |
|---|
| 511 | + QED_NUM_HSI_DEFS |
|---|
| 512 | +}; |
|---|
| 513 | + |
|---|
| 512 | 514 | #define DRV_MODULE_VERSION \ |
|---|
| 513 | 515 | __stringify(QED_MAJOR_VERSION) "." \ |
|---|
| 514 | 516 | __stringify(QED_MINOR_VERSION) "." \ |
|---|
| .. | .. |
|---|
| 522 | 524 | |
|---|
| 523 | 525 | enum qed_slowpath_wq_flag { |
|---|
| 524 | 526 | QED_SLOWPATH_MFW_TLV_REQ, |
|---|
| 527 | + QED_SLOWPATH_PERIODIC_DB_REC, |
|---|
| 525 | 528 | }; |
|---|
| 526 | 529 | |
|---|
| 527 | 530 | struct qed_hwfn { |
|---|
| .. | .. |
|---|
| 539 | 542 | u8 dp_level; |
|---|
| 540 | 543 | char name[NAME_SIZE]; |
|---|
| 541 | 544 | |
|---|
| 542 | | - bool first_on_engine; |
|---|
| 543 | 545 | bool hw_init_done; |
|---|
| 544 | 546 | |
|---|
| 545 | 547 | u8 num_funcs_on_engine; |
|---|
| .. | .. |
|---|
| 570 | 572 | struct qed_consq *p_consq; |
|---|
| 571 | 573 | |
|---|
| 572 | 574 | /* Slow-Path definitions */ |
|---|
| 573 | | - struct tasklet_struct *sp_dpc; |
|---|
| 575 | + struct tasklet_struct sp_dpc; |
|---|
| 574 | 576 | bool b_sp_dpc_enabled; |
|---|
| 575 | 577 | |
|---|
| 576 | 578 | struct qed_ptt *p_main_ptt; |
|---|
| .. | .. |
|---|
| 623 | 625 | void *unzip_buf; |
|---|
| 624 | 626 | |
|---|
| 625 | 627 | struct dbg_tools_data dbg_info; |
|---|
| 628 | + void *dbg_user_info; |
|---|
| 629 | + struct virt_mem_desc dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE]; |
|---|
| 626 | 630 | |
|---|
| 627 | 631 | /* PWM region specific data */ |
|---|
| 628 | 632 | u16 wid_count; |
|---|
| .. | .. |
|---|
| 639 | 643 | /* L2-related */ |
|---|
| 640 | 644 | struct qed_l2_info *p_l2_info; |
|---|
| 641 | 645 | |
|---|
| 646 | + /* Mechanism for recovering from doorbell drop */ |
|---|
| 647 | + struct qed_db_recovery_info db_recovery_info; |
|---|
| 648 | + |
|---|
| 642 | 649 | /* Nvm images number and attributes */ |
|---|
| 643 | 650 | struct qed_nvm_image_info nvm_info; |
|---|
| 644 | 651 | |
|---|
| 652 | + struct phys_mem_desc *fw_overlay_mem; |
|---|
| 645 | 653 | struct qed_ptt *p_arfs_ptt; |
|---|
| 646 | 654 | |
|---|
| 647 | 655 | struct qed_simd_fp_handler simd_proto_handler[64]; |
|---|
| .. | .. |
|---|
| 651 | 659 | struct delayed_work iov_task; |
|---|
| 652 | 660 | unsigned long iov_task_flags; |
|---|
| 653 | 661 | #endif |
|---|
| 654 | | - |
|---|
| 655 | | - struct z_stream_s *stream; |
|---|
| 662 | + struct z_stream_s *stream; |
|---|
| 663 | + bool slowpath_wq_active; |
|---|
| 656 | 664 | struct workqueue_struct *slowpath_wq; |
|---|
| 657 | 665 | struct delayed_work slowpath_task; |
|---|
| 658 | 666 | unsigned long slowpath_task_flags; |
|---|
| 667 | + u32 periodic_db_rec_count; |
|---|
| 659 | 668 | }; |
|---|
| 660 | 669 | |
|---|
| 661 | 670 | struct pci_params { |
|---|
| .. | .. |
|---|
| 691 | 700 | u32 dumped_dwords; |
|---|
| 692 | 701 | }; |
|---|
| 693 | 702 | |
|---|
| 694 | | -struct qed_dbg_params { |
|---|
| 695 | | - struct qed_dbg_feature features[DBG_FEATURE_NUM]; |
|---|
| 696 | | - u8 engine_for_debug; |
|---|
| 697 | | - bool print_data; |
|---|
| 698 | | -}; |
|---|
| 699 | | - |
|---|
| 700 | 703 | struct qed_dev { |
|---|
| 701 | | - u32 dp_module; |
|---|
| 702 | | - u8 dp_level; |
|---|
| 703 | | - char name[NAME_SIZE]; |
|---|
| 704 | + u32 dp_module; |
|---|
| 705 | + u8 dp_level; |
|---|
| 706 | + char name[NAME_SIZE]; |
|---|
| 704 | 707 | |
|---|
| 705 | | - enum qed_dev_type type; |
|---|
| 706 | | -/* Translate type/revision combo into the proper conditions */ |
|---|
| 707 | | -#define QED_IS_BB(dev) ((dev)->type == QED_DEV_TYPE_BB) |
|---|
| 708 | | -#define QED_IS_BB_B0(dev) (QED_IS_BB(dev) && \ |
|---|
| 709 | | - CHIP_REV_IS_B0(dev)) |
|---|
| 710 | | -#define QED_IS_AH(dev) ((dev)->type == QED_DEV_TYPE_AH) |
|---|
| 711 | | -#define QED_IS_K2(dev) QED_IS_AH(dev) |
|---|
| 708 | + enum qed_dev_type type; |
|---|
| 709 | + /* Translate type/revision combo into the proper conditions */ |
|---|
| 710 | +#define QED_IS_BB(dev) ((dev)->type == QED_DEV_TYPE_BB) |
|---|
| 711 | +#define QED_IS_BB_B0(dev) (QED_IS_BB(dev) && CHIP_REV_IS_B0(dev)) |
|---|
| 712 | +#define QED_IS_AH(dev) ((dev)->type == QED_DEV_TYPE_AH) |
|---|
| 713 | +#define QED_IS_K2(dev) QED_IS_AH(dev) |
|---|
| 714 | +#define QED_IS_E4(dev) (QED_IS_BB(dev) || QED_IS_AH(dev)) |
|---|
| 715 | +#define QED_IS_E5(dev) ((dev)->type == QED_DEV_TYPE_E5) |
|---|
| 712 | 716 | |
|---|
| 713 | | - u16 vendor_id; |
|---|
| 714 | | - u16 device_id; |
|---|
| 715 | | -#define QED_DEV_ID_MASK 0xff00 |
|---|
| 716 | | -#define QED_DEV_ID_MASK_BB 0x1600 |
|---|
| 717 | | -#define QED_DEV_ID_MASK_AH 0x8000 |
|---|
| 717 | + u16 vendor_id; |
|---|
| 718 | 718 | |
|---|
| 719 | | - u16 chip_num; |
|---|
| 720 | | -#define CHIP_NUM_MASK 0xffff |
|---|
| 721 | | -#define CHIP_NUM_SHIFT 16 |
|---|
| 719 | + u16 device_id; |
|---|
| 720 | +#define QED_DEV_ID_MASK 0xff00 |
|---|
| 721 | +#define QED_DEV_ID_MASK_BB 0x1600 |
|---|
| 722 | +#define QED_DEV_ID_MASK_AH 0x8000 |
|---|
| 722 | 723 | |
|---|
| 723 | | - u16 chip_rev; |
|---|
| 724 | | -#define CHIP_REV_MASK 0xf |
|---|
| 725 | | -#define CHIP_REV_SHIFT 12 |
|---|
| 726 | | -#define CHIP_REV_IS_B0(_cdev) ((_cdev)->chip_rev == 1) |
|---|
| 724 | + u16 chip_num; |
|---|
| 725 | +#define CHIP_NUM_MASK 0xffff |
|---|
| 726 | +#define CHIP_NUM_SHIFT 16 |
|---|
| 727 | + |
|---|
| 728 | + u16 chip_rev; |
|---|
| 729 | +#define CHIP_REV_MASK 0xf |
|---|
| 730 | +#define CHIP_REV_SHIFT 12 |
|---|
| 731 | +#define CHIP_REV_IS_B0(_cdev) ((_cdev)->chip_rev == 1) |
|---|
| 727 | 732 | |
|---|
| 728 | 733 | u16 chip_metal; |
|---|
| 729 | | -#define CHIP_METAL_MASK 0xff |
|---|
| 730 | | -#define CHIP_METAL_SHIFT 4 |
|---|
| 734 | +#define CHIP_METAL_MASK 0xff |
|---|
| 735 | +#define CHIP_METAL_SHIFT 4 |
|---|
| 731 | 736 | |
|---|
| 732 | 737 | u16 chip_bond_id; |
|---|
| 733 | | -#define CHIP_BOND_ID_MASK 0xf |
|---|
| 734 | | -#define CHIP_BOND_ID_SHIFT 0 |
|---|
| 738 | +#define CHIP_BOND_ID_MASK 0xf |
|---|
| 739 | +#define CHIP_BOND_ID_SHIFT 0 |
|---|
| 735 | 740 | |
|---|
| 736 | 741 | u8 num_engines; |
|---|
| 742 | + u8 num_ports; |
|---|
| 737 | 743 | u8 num_ports_in_engine; |
|---|
| 738 | 744 | u8 num_funcs_in_port; |
|---|
| 739 | 745 | |
|---|
| .. | .. |
|---|
| 767 | 773 | u8 cache_shift; |
|---|
| 768 | 774 | |
|---|
| 769 | 775 | /* Init */ |
|---|
| 770 | | - const struct iro *iro_arr; |
|---|
| 771 | | -#define IRO (p_hwfn->cdev->iro_arr) |
|---|
| 776 | + const u32 *iro_arr; |
|---|
| 777 | +#define IRO ((const struct iro *)p_hwfn->cdev->iro_arr) |
|---|
| 772 | 778 | |
|---|
| 773 | 779 | /* HW functions */ |
|---|
| 774 | 780 | u8 num_hwfns; |
|---|
| 775 | 781 | struct qed_hwfn hwfns[MAX_HWFNS_PER_DEVICE]; |
|---|
| 782 | + |
|---|
| 783 | + /* Engine affinity */ |
|---|
| 784 | + u8 l2_affin_hint; |
|---|
| 785 | + u8 fir_affin; |
|---|
| 786 | + u8 iwarp_affin; |
|---|
| 776 | 787 | |
|---|
| 777 | 788 | /* SRIOV */ |
|---|
| 778 | 789 | struct qed_hw_sriov_info *p_iov_info; |
|---|
| .. | .. |
|---|
| 785 | 796 | |
|---|
| 786 | 797 | u32 mcp_nvm_resp; |
|---|
| 787 | 798 | |
|---|
| 799 | + /* Recovery */ |
|---|
| 800 | + bool recov_in_prog; |
|---|
| 801 | + |
|---|
| 802 | + /* Indicates whether should prevent attentions from being reasserted */ |
|---|
| 803 | + bool attn_clr_en; |
|---|
| 804 | + |
|---|
| 805 | + /* LLH info */ |
|---|
| 806 | + u8 ppfid_bitmap; |
|---|
| 807 | + struct qed_llh_info *p_llh_info; |
|---|
| 808 | + |
|---|
| 788 | 809 | /* Linux specific here */ |
|---|
| 810 | + struct qed_dev_info common_dev_info; |
|---|
| 789 | 811 | struct qede_dev *edev; |
|---|
| 790 | 812 | struct pci_dev *pdev; |
|---|
| 791 | 813 | u32 flags; |
|---|
| .. | .. |
|---|
| 809 | 831 | } protocol_ops; |
|---|
| 810 | 832 | void *ops_cookie; |
|---|
| 811 | 833 | |
|---|
| 812 | | - struct qed_dbg_params dbg_params; |
|---|
| 813 | | - |
|---|
| 814 | 834 | #ifdef CONFIG_QED_LL2 |
|---|
| 815 | 835 | struct qed_cb_ll2_info *ll2; |
|---|
| 816 | 836 | u8 ll2_mac_address[ETH_ALEN]; |
|---|
| 817 | 837 | #endif |
|---|
| 838 | + struct qed_dbg_feature dbg_features[DBG_FEATURE_NUM]; |
|---|
| 839 | + u8 engine_for_debug; |
|---|
| 840 | + bool disable_ilt_dump; |
|---|
| 841 | + bool dbg_bin_dump; |
|---|
| 842 | + |
|---|
| 818 | 843 | DECLARE_HASHTABLE(connections, 10); |
|---|
| 819 | 844 | const struct firmware *firmware; |
|---|
| 845 | + |
|---|
| 846 | + bool print_dbg_data; |
|---|
| 820 | 847 | |
|---|
| 821 | 848 | u32 rdma_max_sge; |
|---|
| 822 | 849 | u32 rdma_max_inline; |
|---|
| 823 | 850 | u32 rdma_max_srq_sge; |
|---|
| 824 | 851 | u16 tunn_feature_mask; |
|---|
| 852 | + |
|---|
| 853 | + bool iwarp_cmt; |
|---|
| 825 | 854 | }; |
|---|
| 826 | 855 | |
|---|
| 827 | | -#define NUM_OF_VFS(dev) (QED_IS_BB(dev) ? MAX_NUM_VFS_BB \ |
|---|
| 828 | | - : MAX_NUM_VFS_K2) |
|---|
| 829 | | -#define NUM_OF_L2_QUEUES(dev) (QED_IS_BB(dev) ? MAX_NUM_L2_QUEUES_BB \ |
|---|
| 830 | | - : MAX_NUM_L2_QUEUES_K2) |
|---|
| 831 | | -#define NUM_OF_PORTS(dev) (QED_IS_BB(dev) ? MAX_NUM_PORTS_BB \ |
|---|
| 832 | | - : MAX_NUM_PORTS_K2) |
|---|
| 833 | | -#define NUM_OF_SBS(dev) (QED_IS_BB(dev) ? MAX_SB_PER_PATH_BB \ |
|---|
| 834 | | - : MAX_SB_PER_PATH_K2) |
|---|
| 835 | | -#define NUM_OF_ENG_PFS(dev) (QED_IS_BB(dev) ? MAX_NUM_PFS_BB \ |
|---|
| 836 | | - : MAX_NUM_PFS_K2) |
|---|
| 856 | +u32 qed_get_hsi_def_val(struct qed_dev *cdev, enum qed_hsi_def_type type); |
|---|
| 857 | + |
|---|
| 858 | +#define NUM_OF_VFS(dev) \ |
|---|
| 859 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_NUM_VFS) |
|---|
| 860 | +#define NUM_OF_L2_QUEUES(dev) \ |
|---|
| 861 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_NUM_L2_QUEUES) |
|---|
| 862 | +#define NUM_OF_PORTS(dev) \ |
|---|
| 863 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_NUM_PORTS) |
|---|
| 864 | +#define NUM_OF_SBS(dev) \ |
|---|
| 865 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_SB_PER_PATH) |
|---|
| 866 | +#define NUM_OF_ENG_PFS(dev) \ |
|---|
| 867 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_NUM_PFS) |
|---|
| 868 | +#define NUM_OF_VPORTS(dev) \ |
|---|
| 869 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_NUM_VPORTS) |
|---|
| 870 | +#define NUM_OF_RSS_ENGINES(dev) \ |
|---|
| 871 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_NUM_ETH_RSS_ENGINE) |
|---|
| 872 | +#define NUM_OF_QM_TX_QUEUES(dev) \ |
|---|
| 873 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_QM_TX_QUEUES) |
|---|
| 874 | +#define NUM_OF_PXP_ILT_RECORDS(dev) \ |
|---|
| 875 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_NUM_PXP_ILT_RECORDS) |
|---|
| 876 | +#define NUM_OF_RDMA_STATISTIC_COUNTERS(dev) \ |
|---|
| 877 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_NUM_RDMA_STATISTIC_COUNTERS) |
|---|
| 878 | +#define NUM_OF_QM_GLOBAL_RLS(dev) \ |
|---|
| 879 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_QM_GLOBAL_RLS) |
|---|
| 880 | +#define NUM_OF_PBF_CMD_LINES(dev) \ |
|---|
| 881 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_PBF_CMD_LINES) |
|---|
| 882 | +#define NUM_OF_BTB_BLOCKS(dev) \ |
|---|
| 883 | + qed_get_hsi_def_val(dev, QED_HSI_DEF_MAX_BTB_BLOCKS) |
|---|
| 884 | + |
|---|
| 837 | 885 | |
|---|
| 838 | 886 | /** |
|---|
| 839 | 887 | * @brief qed_concrete_to_sw_fid - get the sw function id from |
|---|
| .. | .. |
|---|
| 870 | 918 | |
|---|
| 871 | 919 | void qed_clean_wfq_db(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
|---|
| 872 | 920 | int qed_device_num_engines(struct qed_dev *cdev); |
|---|
| 873 | | -int qed_device_get_port_id(struct qed_dev *cdev); |
|---|
| 874 | 921 | void qed_set_fw_mac_addr(__le16 *fw_msb, |
|---|
| 875 | 922 | __le16 *fw_mid, __le16 *fw_lsb, u8 *mac); |
|---|
| 876 | 923 | |
|---|
| 877 | 924 | #define QED_LEADING_HWFN(dev) (&dev->hwfns[0]) |
|---|
| 925 | +#define QED_IS_CMT(dev) ((dev)->num_hwfns > 1) |
|---|
| 926 | +/* Macros for getting the engine-affinitized hwfn (FIR: fcoe,iscsi,roce) */ |
|---|
| 927 | +#define QED_FIR_AFFIN_HWFN(dev) (&(dev)->hwfns[dev->fir_affin]) |
|---|
| 928 | +#define QED_IWARP_AFFIN_HWFN(dev) (&(dev)->hwfns[dev->iwarp_affin]) |
|---|
| 929 | +#define QED_AFFIN_HWFN(dev) \ |
|---|
| 930 | + (QED_IS_IWARP_PERSONALITY(QED_LEADING_HWFN(dev)) ? \ |
|---|
| 931 | + QED_IWARP_AFFIN_HWFN(dev) : QED_FIR_AFFIN_HWFN(dev)) |
|---|
| 932 | +#define QED_AFFIN_HWFN_IDX(dev) (IS_LEAD_HWFN(QED_AFFIN_HWFN(dev)) ? 0 : 1) |
|---|
| 878 | 933 | |
|---|
| 879 | 934 | /* Flags for indication of required queues */ |
|---|
| 880 | 935 | #define PQ_FLAGS_RLS (BIT(0)) |
|---|
| .. | .. |
|---|
| 894 | 949 | u16 qed_get_cm_pq_idx_ofld_mtc(struct qed_hwfn *p_hwfn, u8 tc); |
|---|
| 895 | 950 | u16 qed_get_cm_pq_idx_llt_mtc(struct qed_hwfn *p_hwfn, u8 tc); |
|---|
| 896 | 951 | |
|---|
| 897 | | -#define QED_LEADING_HWFN(dev) (&dev->hwfns[0]) |
|---|
| 952 | +/* doorbell recovery mechanism */ |
|---|
| 953 | +void qed_db_recovery_dp(struct qed_hwfn *p_hwfn); |
|---|
| 954 | +void qed_db_recovery_execute(struct qed_hwfn *p_hwfn); |
|---|
| 955 | +bool qed_edpm_enabled(struct qed_hwfn *p_hwfn); |
|---|
| 898 | 956 | |
|---|
| 899 | 957 | /* Other Linux specific common definitions */ |
|---|
| 900 | 958 | #define DP_NAME(cdev) ((cdev)->name) |
|---|
| .. | .. |
|---|
| 911 | 969 | writel((u32)val, (void __iomem *)((u8 __iomem *)\ |
|---|
| 912 | 970 | (cdev->doorbells) + (db_addr))) |
|---|
| 913 | 971 | |
|---|
| 972 | +#define MFW_PORT(_p_hwfn) ((_p_hwfn)->abs_pf_id % \ |
|---|
| 973 | + qed_device_num_ports((_p_hwfn)->cdev)) |
|---|
| 974 | +int qed_device_num_ports(struct qed_dev *cdev); |
|---|
| 975 | + |
|---|
| 914 | 976 | /* Prototypes */ |
|---|
| 915 | 977 | int qed_fill_dev_info(struct qed_dev *cdev, |
|---|
| 916 | 978 | struct qed_dev_info *dev_info); |
|---|
| 917 | 979 | void qed_link_update(struct qed_hwfn *hwfn, struct qed_ptt *ptt); |
|---|
| 980 | +void qed_bw_update(struct qed_hwfn *hwfn, struct qed_ptt *ptt); |
|---|
| 918 | 981 | u32 qed_unzip_data(struct qed_hwfn *p_hwfn, |
|---|
| 919 | 982 | u32 input_len, u8 *input_buf, |
|---|
| 920 | 983 | u32 max_size, u8 *unzip_buf); |
|---|
| 984 | +int qed_recovery_process(struct qed_dev *cdev); |
|---|
| 985 | +void qed_schedule_recovery_handler(struct qed_hwfn *p_hwfn); |
|---|
| 986 | +void qed_hw_error_occurred(struct qed_hwfn *p_hwfn, |
|---|
| 987 | + enum qed_hw_err_type err_type); |
|---|
| 921 | 988 | void qed_get_protocol_stats(struct qed_dev *cdev, |
|---|
| 922 | 989 | enum qed_mcp_protocol_type type, |
|---|
| 923 | 990 | union qed_mcp_protocol_stats *stats); |
|---|
| .. | .. |
|---|
| 930 | 997 | union qed_mfw_tlv_data *tlv_data); |
|---|
| 931 | 998 | |
|---|
| 932 | 999 | void qed_hw_info_set_offload_tc(struct qed_hw_info *p_info, u8 tc); |
|---|
| 1000 | + |
|---|
| 1001 | +void qed_periodic_db_rec_start(struct qed_hwfn *p_hwfn); |
|---|
| 933 | 1002 | #endif /* _QED_H */ |
|---|