162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */ 262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2021 Intel Corporation */ 362306a36Sopenharmony_ci#ifndef IRDMA_MAIN_H 462306a36Sopenharmony_ci#define IRDMA_MAIN_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/ip.h> 762306a36Sopenharmony_ci#include <linux/tcp.h> 862306a36Sopenharmony_ci#include <linux/if_vlan.h> 962306a36Sopenharmony_ci#include <net/addrconf.h> 1062306a36Sopenharmony_ci#include <net/netevent.h> 1162306a36Sopenharmony_ci#include <net/tcp.h> 1262306a36Sopenharmony_ci#include <net/ip6_route.h> 1362306a36Sopenharmony_ci#include <net/flow.h> 1462306a36Sopenharmony_ci#include <net/secure_seq.h> 1562306a36Sopenharmony_ci#include <linux/netdevice.h> 1662306a36Sopenharmony_ci#include <linux/etherdevice.h> 1762306a36Sopenharmony_ci#include <linux/inetdevice.h> 1862306a36Sopenharmony_ci#include <linux/spinlock.h> 1962306a36Sopenharmony_ci#include <linux/kernel.h> 2062306a36Sopenharmony_ci#include <linux/delay.h> 2162306a36Sopenharmony_ci#include <linux/pci.h> 2262306a36Sopenharmony_ci#include <linux/dma-mapping.h> 2362306a36Sopenharmony_ci#include <linux/workqueue.h> 2462306a36Sopenharmony_ci#include <linux/slab.h> 2562306a36Sopenharmony_ci#include <linux/io.h> 2662306a36Sopenharmony_ci#include <linux/crc32c.h> 2762306a36Sopenharmony_ci#include <linux/kthread.h> 2862306a36Sopenharmony_ci#ifndef CONFIG_64BIT 2962306a36Sopenharmony_ci#include <linux/io-64-nonatomic-lo-hi.h> 3062306a36Sopenharmony_ci#endif 3162306a36Sopenharmony_ci#include <linux/auxiliary_bus.h> 3262306a36Sopenharmony_ci#include <linux/net/intel/iidc.h> 3362306a36Sopenharmony_ci#include <crypto/hash.h> 3462306a36Sopenharmony_ci#include <rdma/ib_smi.h> 3562306a36Sopenharmony_ci#include <rdma/ib_verbs.h> 3662306a36Sopenharmony_ci#include <rdma/ib_pack.h> 3762306a36Sopenharmony_ci#include <rdma/rdma_cm.h> 3862306a36Sopenharmony_ci#include <rdma/iw_cm.h> 3962306a36Sopenharmony_ci#include <rdma/ib_user_verbs.h> 4062306a36Sopenharmony_ci#include <rdma/ib_umem.h> 4162306a36Sopenharmony_ci#include <rdma/ib_cache.h> 4262306a36Sopenharmony_ci#include <rdma/uverbs_ioctl.h> 4362306a36Sopenharmony_ci#include "osdep.h" 4462306a36Sopenharmony_ci#include "defs.h" 4562306a36Sopenharmony_ci#include "hmc.h" 4662306a36Sopenharmony_ci#include "type.h" 4762306a36Sopenharmony_ci#include "ws.h" 4862306a36Sopenharmony_ci#include "protos.h" 4962306a36Sopenharmony_ci#include "pble.h" 5062306a36Sopenharmony_ci#include "cm.h" 5162306a36Sopenharmony_ci#include <rdma/irdma-abi.h> 5262306a36Sopenharmony_ci#include "verbs.h" 5362306a36Sopenharmony_ci#include "user.h" 5462306a36Sopenharmony_ci#include "puda.h" 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciextern struct auxiliary_driver i40iw_auxiliary_drv; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define IRDMA_FW_VER_DEFAULT 2 5962306a36Sopenharmony_ci#define IRDMA_HW_VER 2 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define IRDMA_ARP_ADD 1 6262306a36Sopenharmony_ci#define IRDMA_ARP_DELETE 2 6362306a36Sopenharmony_ci#define IRDMA_ARP_RESOLVE 3 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define IRDMA_MACIP_ADD 1 6662306a36Sopenharmony_ci#define IRDMA_MACIP_DELETE 2 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define IW_CCQ_SIZE (IRDMA_CQP_SW_SQSIZE_2048 + 1) 6962306a36Sopenharmony_ci#define IW_CEQ_SIZE 2048 7062306a36Sopenharmony_ci#define IW_AEQ_SIZE 2048 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define RX_BUF_SIZE (1536 + 8) 7362306a36Sopenharmony_ci#define IW_REG0_SIZE (4 * 1024) 7462306a36Sopenharmony_ci#define IW_TX_TIMEOUT (6 * HZ) 7562306a36Sopenharmony_ci#define IW_FIRST_QPN 1 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define IW_SW_CONTEXT_ALIGN 1024 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define MAX_DPC_ITERATIONS 128 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define IRDMA_EVENT_TIMEOUT_MS 5000 8262306a36Sopenharmony_ci#define IRDMA_VCHNL_EVENT_TIMEOUT 100000 8362306a36Sopenharmony_ci#define IRDMA_RST_TIMEOUT_HZ 4 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define IRDMA_NO_QSET 0xffff 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define IW_CFG_FPM_QP_COUNT 32768 8862306a36Sopenharmony_ci#define IRDMA_MAX_PAGES_PER_FMR 262144 8962306a36Sopenharmony_ci#define IRDMA_MIN_PAGES_PER_FMR 1 9062306a36Sopenharmony_ci#define IRDMA_CQP_COMPL_RQ_WQE_FLUSHED 2 9162306a36Sopenharmony_ci#define IRDMA_CQP_COMPL_SQ_WQE_FLUSHED 3 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define IRDMA_Q_TYPE_PE_AEQ 0x80 9462306a36Sopenharmony_ci#define IRDMA_Q_INVALID_IDX 0xffff 9562306a36Sopenharmony_ci#define IRDMA_REM_ENDPOINT_TRK_QPID 3 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define IRDMA_DRV_OPT_ENA_MPA_VER_0 0x00000001 9862306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DISABLE_MPA_CRC 0x00000002 9962306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DISABLE_FIRST_WRITE 0x00000004 10062306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DISABLE_INTF 0x00000008 10162306a36Sopenharmony_ci#define IRDMA_DRV_OPT_ENA_MSI 0x00000010 10262306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DUAL_LOGICAL_PORT 0x00000020 10362306a36Sopenharmony_ci#define IRDMA_DRV_OPT_NO_INLINE_DATA 0x00000080 10462306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DISABLE_INT_MOD 0x00000100 10562306a36Sopenharmony_ci#define IRDMA_DRV_OPT_DISABLE_VIRT_WQ 0x00000200 10662306a36Sopenharmony_ci#define IRDMA_DRV_OPT_ENA_PAU 0x00000400 10762306a36Sopenharmony_ci#define IRDMA_DRV_OPT_MCAST_LOGPORT_MAP 0x00000800 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define IW_HMC_OBJ_TYPE_NUM ARRAY_SIZE(iw_hmc_obj_types) 11062306a36Sopenharmony_ci#define IRDMA_ROCE_CWND_DEFAULT 0x400 11162306a36Sopenharmony_ci#define IRDMA_ROCE_ACKCREDS_DEFAULT 0x1E 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define IRDMA_FLUSH_SQ BIT(0) 11462306a36Sopenharmony_ci#define IRDMA_FLUSH_RQ BIT(1) 11562306a36Sopenharmony_ci#define IRDMA_REFLUSH BIT(2) 11662306a36Sopenharmony_ci#define IRDMA_FLUSH_WAIT BIT(3) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#define IRDMA_IRQ_NAME_STR_LEN (64) 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cienum init_completion_state { 12162306a36Sopenharmony_ci INVALID_STATE = 0, 12262306a36Sopenharmony_ci INITIAL_STATE, 12362306a36Sopenharmony_ci CQP_CREATED, 12462306a36Sopenharmony_ci HMC_OBJS_CREATED, 12562306a36Sopenharmony_ci HW_RSRC_INITIALIZED, 12662306a36Sopenharmony_ci CCQ_CREATED, 12762306a36Sopenharmony_ci CEQ0_CREATED, /* Last state of probe */ 12862306a36Sopenharmony_ci ILQ_CREATED, 12962306a36Sopenharmony_ci IEQ_CREATED, 13062306a36Sopenharmony_ci CEQS_CREATED, 13162306a36Sopenharmony_ci PBLE_CHUNK_MEM, 13262306a36Sopenharmony_ci AEQ_CREATED, 13362306a36Sopenharmony_ci IP_ADDR_REGISTERED, /* Last state of open */ 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct irdma_rsrc_limits { 13762306a36Sopenharmony_ci u32 qplimit; 13862306a36Sopenharmony_ci u32 mrlimit; 13962306a36Sopenharmony_ci u32 cqlimit; 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistruct irdma_cqp_err_info { 14362306a36Sopenharmony_ci u16 maj; 14462306a36Sopenharmony_ci u16 min; 14562306a36Sopenharmony_ci const char *desc; 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct irdma_cqp_compl_info { 14962306a36Sopenharmony_ci u32 op_ret_val; 15062306a36Sopenharmony_ci u16 maj_err_code; 15162306a36Sopenharmony_ci u16 min_err_code; 15262306a36Sopenharmony_ci bool error; 15362306a36Sopenharmony_ci u8 op_code; 15462306a36Sopenharmony_ci}; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct irdma_cqp_request { 15762306a36Sopenharmony_ci struct cqp_cmds_info info; 15862306a36Sopenharmony_ci wait_queue_head_t waitq; 15962306a36Sopenharmony_ci struct list_head list; 16062306a36Sopenharmony_ci refcount_t refcnt; 16162306a36Sopenharmony_ci void (*callback_fcn)(struct irdma_cqp_request *cqp_request); 16262306a36Sopenharmony_ci void *param; 16362306a36Sopenharmony_ci struct irdma_cqp_compl_info compl_info; 16462306a36Sopenharmony_ci bool request_done; /* READ/WRITE_ONCE macros operate on it */ 16562306a36Sopenharmony_ci bool waiting:1; 16662306a36Sopenharmony_ci bool dynamic:1; 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistruct irdma_cqp { 17062306a36Sopenharmony_ci struct irdma_sc_cqp sc_cqp; 17162306a36Sopenharmony_ci spinlock_t req_lock; /* protect CQP request list */ 17262306a36Sopenharmony_ci spinlock_t compl_lock; /* protect CQP completion processing */ 17362306a36Sopenharmony_ci wait_queue_head_t waitq; 17462306a36Sopenharmony_ci wait_queue_head_t remove_wq; 17562306a36Sopenharmony_ci struct irdma_dma_mem sq; 17662306a36Sopenharmony_ci struct irdma_dma_mem host_ctx; 17762306a36Sopenharmony_ci u64 *scratch_array; 17862306a36Sopenharmony_ci struct irdma_cqp_request *cqp_requests; 17962306a36Sopenharmony_ci struct list_head cqp_avail_reqs; 18062306a36Sopenharmony_ci struct list_head cqp_pending_reqs; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistruct irdma_ccq { 18462306a36Sopenharmony_ci struct irdma_sc_cq sc_cq; 18562306a36Sopenharmony_ci struct irdma_dma_mem mem_cq; 18662306a36Sopenharmony_ci struct irdma_dma_mem shadow_area; 18762306a36Sopenharmony_ci}; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct irdma_ceq { 19062306a36Sopenharmony_ci struct irdma_sc_ceq sc_ceq; 19162306a36Sopenharmony_ci struct irdma_dma_mem mem; 19262306a36Sopenharmony_ci u32 irq; 19362306a36Sopenharmony_ci u32 msix_idx; 19462306a36Sopenharmony_ci struct irdma_pci_f *rf; 19562306a36Sopenharmony_ci struct tasklet_struct dpc_tasklet; 19662306a36Sopenharmony_ci spinlock_t ce_lock; /* sync cq destroy with cq completion event notification */ 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistruct irdma_aeq { 20062306a36Sopenharmony_ci struct irdma_sc_aeq sc_aeq; 20162306a36Sopenharmony_ci struct irdma_dma_mem mem; 20262306a36Sopenharmony_ci struct irdma_pble_alloc palloc; 20362306a36Sopenharmony_ci bool virtual_map; 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistruct irdma_arp_entry { 20762306a36Sopenharmony_ci u32 ip_addr[4]; 20862306a36Sopenharmony_ci u8 mac_addr[ETH_ALEN]; 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistruct irdma_msix_vector { 21262306a36Sopenharmony_ci u32 idx; 21362306a36Sopenharmony_ci u32 irq; 21462306a36Sopenharmony_ci u32 cpu_affinity; 21562306a36Sopenharmony_ci u32 ceq_id; 21662306a36Sopenharmony_ci cpumask_t mask; 21762306a36Sopenharmony_ci char name[IRDMA_IRQ_NAME_STR_LEN]; 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistruct irdma_mc_table_info { 22162306a36Sopenharmony_ci u32 mgn; 22262306a36Sopenharmony_ci u32 dest_ip[4]; 22362306a36Sopenharmony_ci bool lan_fwd:1; 22462306a36Sopenharmony_ci bool ipv4_valid:1; 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cistruct mc_table_list { 22862306a36Sopenharmony_ci struct list_head list; 22962306a36Sopenharmony_ci struct irdma_mc_table_info mc_info; 23062306a36Sopenharmony_ci struct irdma_mcast_grp_info mc_grp_ctx; 23162306a36Sopenharmony_ci}; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistruct irdma_qv_info { 23462306a36Sopenharmony_ci u32 v_idx; /* msix_vector */ 23562306a36Sopenharmony_ci u16 ceq_idx; 23662306a36Sopenharmony_ci u16 aeq_idx; 23762306a36Sopenharmony_ci u8 itr_idx; 23862306a36Sopenharmony_ci}; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistruct irdma_qvlist_info { 24162306a36Sopenharmony_ci u32 num_vectors; 24262306a36Sopenharmony_ci struct irdma_qv_info qv_info[]; 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistruct irdma_gen_ops { 24662306a36Sopenharmony_ci void (*request_reset)(struct irdma_pci_f *rf); 24762306a36Sopenharmony_ci int (*register_qset)(struct irdma_sc_vsi *vsi, 24862306a36Sopenharmony_ci struct irdma_ws_node *tc_node); 24962306a36Sopenharmony_ci void (*unregister_qset)(struct irdma_sc_vsi *vsi, 25062306a36Sopenharmony_ci struct irdma_ws_node *tc_node); 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistruct irdma_pci_f { 25462306a36Sopenharmony_ci bool reset:1; 25562306a36Sopenharmony_ci bool rsrc_created:1; 25662306a36Sopenharmony_ci bool msix_shared:1; 25762306a36Sopenharmony_ci u8 rsrc_profile; 25862306a36Sopenharmony_ci u8 *hmc_info_mem; 25962306a36Sopenharmony_ci u8 *mem_rsrc; 26062306a36Sopenharmony_ci u8 rdma_ver; 26162306a36Sopenharmony_ci u8 rst_to; 26262306a36Sopenharmony_ci u8 pf_id; 26362306a36Sopenharmony_ci enum irdma_protocol_used protocol_used; 26462306a36Sopenharmony_ci u32 sd_type; 26562306a36Sopenharmony_ci u32 msix_count; 26662306a36Sopenharmony_ci u32 max_mr; 26762306a36Sopenharmony_ci u32 max_qp; 26862306a36Sopenharmony_ci u32 max_cq; 26962306a36Sopenharmony_ci u32 max_ah; 27062306a36Sopenharmony_ci u32 next_ah; 27162306a36Sopenharmony_ci u32 max_mcg; 27262306a36Sopenharmony_ci u32 next_mcg; 27362306a36Sopenharmony_ci u32 max_pd; 27462306a36Sopenharmony_ci u32 next_qp; 27562306a36Sopenharmony_ci u32 next_cq; 27662306a36Sopenharmony_ci u32 next_pd; 27762306a36Sopenharmony_ci u32 max_mr_size; 27862306a36Sopenharmony_ci u32 max_cqe; 27962306a36Sopenharmony_ci u32 mr_stagmask; 28062306a36Sopenharmony_ci u32 used_pds; 28162306a36Sopenharmony_ci u32 used_cqs; 28262306a36Sopenharmony_ci u32 used_mrs; 28362306a36Sopenharmony_ci u32 used_qps; 28462306a36Sopenharmony_ci u32 arp_table_size; 28562306a36Sopenharmony_ci u32 next_arp_index; 28662306a36Sopenharmony_ci u32 ceqs_count; 28762306a36Sopenharmony_ci u32 next_ws_node_id; 28862306a36Sopenharmony_ci u32 max_ws_node_id; 28962306a36Sopenharmony_ci u32 limits_sel; 29062306a36Sopenharmony_ci unsigned long *allocated_ws_nodes; 29162306a36Sopenharmony_ci unsigned long *allocated_qps; 29262306a36Sopenharmony_ci unsigned long *allocated_cqs; 29362306a36Sopenharmony_ci unsigned long *allocated_mrs; 29462306a36Sopenharmony_ci unsigned long *allocated_pds; 29562306a36Sopenharmony_ci unsigned long *allocated_mcgs; 29662306a36Sopenharmony_ci unsigned long *allocated_ahs; 29762306a36Sopenharmony_ci unsigned long *allocated_arps; 29862306a36Sopenharmony_ci enum init_completion_state init_state; 29962306a36Sopenharmony_ci struct irdma_sc_dev sc_dev; 30062306a36Sopenharmony_ci struct pci_dev *pcidev; 30162306a36Sopenharmony_ci void *cdev; 30262306a36Sopenharmony_ci struct irdma_hw hw; 30362306a36Sopenharmony_ci struct irdma_cqp cqp; 30462306a36Sopenharmony_ci struct irdma_ccq ccq; 30562306a36Sopenharmony_ci struct irdma_aeq aeq; 30662306a36Sopenharmony_ci struct irdma_ceq *ceqlist; 30762306a36Sopenharmony_ci struct irdma_hmc_pble_rsrc *pble_rsrc; 30862306a36Sopenharmony_ci struct irdma_arp_entry *arp_table; 30962306a36Sopenharmony_ci spinlock_t arp_lock; /*protect ARP table access*/ 31062306a36Sopenharmony_ci spinlock_t rsrc_lock; /* protect HW resource array access */ 31162306a36Sopenharmony_ci spinlock_t qptable_lock; /*protect QP table access*/ 31262306a36Sopenharmony_ci spinlock_t cqtable_lock; /*protect CQ table access*/ 31362306a36Sopenharmony_ci struct irdma_qp **qp_table; 31462306a36Sopenharmony_ci struct irdma_cq **cq_table; 31562306a36Sopenharmony_ci spinlock_t qh_list_lock; /* protect mc_qht_list */ 31662306a36Sopenharmony_ci struct mc_table_list mc_qht_list; 31762306a36Sopenharmony_ci struct irdma_msix_vector *iw_msixtbl; 31862306a36Sopenharmony_ci struct irdma_qvlist_info *iw_qvlist; 31962306a36Sopenharmony_ci struct tasklet_struct dpc_tasklet; 32062306a36Sopenharmony_ci struct msix_entry *msix_entries; 32162306a36Sopenharmony_ci struct irdma_dma_mem obj_mem; 32262306a36Sopenharmony_ci struct irdma_dma_mem obj_next; 32362306a36Sopenharmony_ci atomic_t vchnl_msgs; 32462306a36Sopenharmony_ci wait_queue_head_t vchnl_waitq; 32562306a36Sopenharmony_ci struct workqueue_struct *cqp_cmpl_wq; 32662306a36Sopenharmony_ci struct work_struct cqp_cmpl_work; 32762306a36Sopenharmony_ci struct irdma_sc_vsi default_vsi; 32862306a36Sopenharmony_ci void *back_fcn; 32962306a36Sopenharmony_ci struct irdma_gen_ops gen_ops; 33062306a36Sopenharmony_ci struct irdma_device *iwdev; 33162306a36Sopenharmony_ci}; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistruct irdma_device { 33462306a36Sopenharmony_ci struct ib_device ibdev; 33562306a36Sopenharmony_ci struct irdma_pci_f *rf; 33662306a36Sopenharmony_ci struct net_device *netdev; 33762306a36Sopenharmony_ci struct workqueue_struct *cleanup_wq; 33862306a36Sopenharmony_ci struct irdma_sc_vsi vsi; 33962306a36Sopenharmony_ci struct irdma_cm_core cm_core; 34062306a36Sopenharmony_ci DECLARE_HASHTABLE(ah_hash_tbl, 8); 34162306a36Sopenharmony_ci struct mutex ah_tbl_lock; /* protect AH hash table access */ 34262306a36Sopenharmony_ci u32 roce_cwnd; 34362306a36Sopenharmony_ci u32 roce_ackcreds; 34462306a36Sopenharmony_ci u32 vendor_id; 34562306a36Sopenharmony_ci u32 vendor_part_id; 34662306a36Sopenharmony_ci u32 push_mode; 34762306a36Sopenharmony_ci u32 rcv_wnd; 34862306a36Sopenharmony_ci u16 mac_ip_table_idx; 34962306a36Sopenharmony_ci u16 vsi_num; 35062306a36Sopenharmony_ci u8 rcv_wscale; 35162306a36Sopenharmony_ci u8 iw_status; 35262306a36Sopenharmony_ci bool roce_mode:1; 35362306a36Sopenharmony_ci bool roce_dcqcn_en:1; 35462306a36Sopenharmony_ci bool dcb_vlan_mode:1; 35562306a36Sopenharmony_ci bool iw_ooo:1; 35662306a36Sopenharmony_ci enum init_completion_state init_state; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci wait_queue_head_t suspend_wq; 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic inline struct irdma_device *to_iwdev(struct ib_device *ibdev) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci return container_of(ibdev, struct irdma_device, ibdev); 36462306a36Sopenharmony_ci} 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic inline struct irdma_ucontext *to_ucontext(struct ib_ucontext *ibucontext) 36762306a36Sopenharmony_ci{ 36862306a36Sopenharmony_ci return container_of(ibucontext, struct irdma_ucontext, ibucontext); 36962306a36Sopenharmony_ci} 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic inline struct irdma_user_mmap_entry * 37262306a36Sopenharmony_cito_irdma_mmap_entry(struct rdma_user_mmap_entry *rdma_entry) 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci return container_of(rdma_entry, struct irdma_user_mmap_entry, 37562306a36Sopenharmony_ci rdma_entry); 37662306a36Sopenharmony_ci} 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_cistatic inline struct irdma_pd *to_iwpd(struct ib_pd *ibpd) 37962306a36Sopenharmony_ci{ 38062306a36Sopenharmony_ci return container_of(ibpd, struct irdma_pd, ibpd); 38162306a36Sopenharmony_ci} 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic inline struct irdma_ah *to_iwah(struct ib_ah *ibah) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci return container_of(ibah, struct irdma_ah, ibah); 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic inline struct irdma_mr *to_iwmr(struct ib_mr *ibmr) 38962306a36Sopenharmony_ci{ 39062306a36Sopenharmony_ci return container_of(ibmr, struct irdma_mr, ibmr); 39162306a36Sopenharmony_ci} 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic inline struct irdma_mr *to_iwmw(struct ib_mw *ibmw) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci return container_of(ibmw, struct irdma_mr, ibmw); 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistatic inline struct irdma_cq *to_iwcq(struct ib_cq *ibcq) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci return container_of(ibcq, struct irdma_cq, ibcq); 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic inline struct irdma_qp *to_iwqp(struct ib_qp *ibqp) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci return container_of(ibqp, struct irdma_qp, ibqp); 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic inline struct irdma_pci_f *dev_to_rf(struct irdma_sc_dev *dev) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci return container_of(dev, struct irdma_pci_f, sc_dev); 41162306a36Sopenharmony_ci} 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci/** 41462306a36Sopenharmony_ci * irdma_alloc_resource - allocate a resource 41562306a36Sopenharmony_ci * @iwdev: device pointer 41662306a36Sopenharmony_ci * @resource_array: resource bit array: 41762306a36Sopenharmony_ci * @max_resources: maximum resource number 41862306a36Sopenharmony_ci * @req_resources_num: Allocated resource number 41962306a36Sopenharmony_ci * @next: next free id 42062306a36Sopenharmony_ci **/ 42162306a36Sopenharmony_cistatic inline int irdma_alloc_rsrc(struct irdma_pci_f *rf, 42262306a36Sopenharmony_ci unsigned long *rsrc_array, u32 max_rsrc, 42362306a36Sopenharmony_ci u32 *req_rsrc_num, u32 *next) 42462306a36Sopenharmony_ci{ 42562306a36Sopenharmony_ci u32 rsrc_num; 42662306a36Sopenharmony_ci unsigned long flags; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci spin_lock_irqsave(&rf->rsrc_lock, flags); 42962306a36Sopenharmony_ci rsrc_num = find_next_zero_bit(rsrc_array, max_rsrc, *next); 43062306a36Sopenharmony_ci if (rsrc_num >= max_rsrc) { 43162306a36Sopenharmony_ci rsrc_num = find_first_zero_bit(rsrc_array, max_rsrc); 43262306a36Sopenharmony_ci if (rsrc_num >= max_rsrc) { 43362306a36Sopenharmony_ci spin_unlock_irqrestore(&rf->rsrc_lock, flags); 43462306a36Sopenharmony_ci ibdev_dbg(&rf->iwdev->ibdev, 43562306a36Sopenharmony_ci "ERR: resource [%d] allocation failed\n", 43662306a36Sopenharmony_ci rsrc_num); 43762306a36Sopenharmony_ci return -EOVERFLOW; 43862306a36Sopenharmony_ci } 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci __set_bit(rsrc_num, rsrc_array); 44162306a36Sopenharmony_ci *next = rsrc_num + 1; 44262306a36Sopenharmony_ci if (*next == max_rsrc) 44362306a36Sopenharmony_ci *next = 0; 44462306a36Sopenharmony_ci *req_rsrc_num = rsrc_num; 44562306a36Sopenharmony_ci spin_unlock_irqrestore(&rf->rsrc_lock, flags); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci return 0; 44862306a36Sopenharmony_ci} 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci/** 45162306a36Sopenharmony_ci * irdma_free_resource - free a resource 45262306a36Sopenharmony_ci * @iwdev: device pointer 45362306a36Sopenharmony_ci * @resource_array: resource array for the resource_num 45462306a36Sopenharmony_ci * @resource_num: resource number to free 45562306a36Sopenharmony_ci **/ 45662306a36Sopenharmony_cistatic inline void irdma_free_rsrc(struct irdma_pci_f *rf, 45762306a36Sopenharmony_ci unsigned long *rsrc_array, u32 rsrc_num) 45862306a36Sopenharmony_ci{ 45962306a36Sopenharmony_ci unsigned long flags; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci spin_lock_irqsave(&rf->rsrc_lock, flags); 46262306a36Sopenharmony_ci __clear_bit(rsrc_num, rsrc_array); 46362306a36Sopenharmony_ci spin_unlock_irqrestore(&rf->rsrc_lock, flags); 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ciint irdma_ctrl_init_hw(struct irdma_pci_f *rf); 46762306a36Sopenharmony_civoid irdma_ctrl_deinit_hw(struct irdma_pci_f *rf); 46862306a36Sopenharmony_ciint irdma_rt_init_hw(struct irdma_device *iwdev, 46962306a36Sopenharmony_ci struct irdma_l2params *l2params); 47062306a36Sopenharmony_civoid irdma_rt_deinit_hw(struct irdma_device *iwdev); 47162306a36Sopenharmony_civoid irdma_qp_add_ref(struct ib_qp *ibqp); 47262306a36Sopenharmony_civoid irdma_qp_rem_ref(struct ib_qp *ibqp); 47362306a36Sopenharmony_civoid irdma_free_lsmm_rsrc(struct irdma_qp *iwqp); 47462306a36Sopenharmony_cistruct ib_qp *irdma_get_qp(struct ib_device *ibdev, int qpn); 47562306a36Sopenharmony_civoid irdma_flush_wqes(struct irdma_qp *iwqp, u32 flush_mask); 47662306a36Sopenharmony_civoid irdma_manage_arp_cache(struct irdma_pci_f *rf, 47762306a36Sopenharmony_ci const unsigned char *mac_addr, 47862306a36Sopenharmony_ci u32 *ip_addr, bool ipv4, u32 action); 47962306a36Sopenharmony_cistruct irdma_apbvt_entry *irdma_add_apbvt(struct irdma_device *iwdev, u16 port); 48062306a36Sopenharmony_civoid irdma_del_apbvt(struct irdma_device *iwdev, 48162306a36Sopenharmony_ci struct irdma_apbvt_entry *entry); 48262306a36Sopenharmony_cistruct irdma_cqp_request *irdma_alloc_and_get_cqp_request(struct irdma_cqp *cqp, 48362306a36Sopenharmony_ci bool wait); 48462306a36Sopenharmony_civoid irdma_free_cqp_request(struct irdma_cqp *cqp, 48562306a36Sopenharmony_ci struct irdma_cqp_request *cqp_request); 48662306a36Sopenharmony_civoid irdma_put_cqp_request(struct irdma_cqp *cqp, 48762306a36Sopenharmony_ci struct irdma_cqp_request *cqp_request); 48862306a36Sopenharmony_ciint irdma_alloc_local_mac_entry(struct irdma_pci_f *rf, u16 *mac_tbl_idx); 48962306a36Sopenharmony_ciint irdma_add_local_mac_entry(struct irdma_pci_f *rf, const u8 *mac_addr, u16 idx); 49062306a36Sopenharmony_civoid irdma_del_local_mac_entry(struct irdma_pci_f *rf, u16 idx); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ciu32 irdma_initialize_hw_rsrc(struct irdma_pci_f *rf); 49362306a36Sopenharmony_civoid irdma_port_ibevent(struct irdma_device *iwdev); 49462306a36Sopenharmony_civoid irdma_cm_disconn(struct irdma_qp *qp); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cibool irdma_cqp_crit_err(struct irdma_sc_dev *dev, u8 cqp_cmd, 49762306a36Sopenharmony_ci u16 maj_err_code, u16 min_err_code); 49862306a36Sopenharmony_ciint irdma_handle_cqp_op(struct irdma_pci_f *rf, 49962306a36Sopenharmony_ci struct irdma_cqp_request *cqp_request); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ciint irdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, 50262306a36Sopenharmony_ci struct ib_udata *udata); 50362306a36Sopenharmony_ciint irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr, 50462306a36Sopenharmony_ci int attr_mask, struct ib_udata *udata); 50562306a36Sopenharmony_civoid irdma_cq_add_ref(struct ib_cq *ibcq); 50662306a36Sopenharmony_civoid irdma_cq_rem_ref(struct ib_cq *ibcq); 50762306a36Sopenharmony_civoid irdma_cq_wq_destroy(struct irdma_pci_f *rf, struct irdma_sc_cq *cq); 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_civoid irdma_cleanup_pending_cqp_op(struct irdma_pci_f *rf); 51062306a36Sopenharmony_ciint irdma_hw_modify_qp(struct irdma_device *iwdev, struct irdma_qp *iwqp, 51162306a36Sopenharmony_ci struct irdma_modify_qp_info *info, bool wait); 51262306a36Sopenharmony_ciint irdma_qp_suspend_resume(struct irdma_sc_qp *qp, bool suspend); 51362306a36Sopenharmony_ciint irdma_manage_qhash(struct irdma_device *iwdev, struct irdma_cm_info *cminfo, 51462306a36Sopenharmony_ci enum irdma_quad_entry_type etype, 51562306a36Sopenharmony_ci enum irdma_quad_hash_manage_type mtype, void *cmnode, 51662306a36Sopenharmony_ci bool wait); 51762306a36Sopenharmony_civoid irdma_receive_ilq(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *rbuf); 51862306a36Sopenharmony_civoid irdma_free_sqbuf(struct irdma_sc_vsi *vsi, void *bufp); 51962306a36Sopenharmony_civoid irdma_free_qp_rsrc(struct irdma_qp *iwqp); 52062306a36Sopenharmony_ciint irdma_setup_cm_core(struct irdma_device *iwdev, u8 ver); 52162306a36Sopenharmony_civoid irdma_cleanup_cm_core(struct irdma_cm_core *cm_core); 52262306a36Sopenharmony_civoid irdma_next_iw_state(struct irdma_qp *iwqp, u8 state, u8 del_hash, u8 term, 52362306a36Sopenharmony_ci u8 term_len); 52462306a36Sopenharmony_ciint irdma_send_syn(struct irdma_cm_node *cm_node, u32 sendack); 52562306a36Sopenharmony_ciint irdma_send_reset(struct irdma_cm_node *cm_node); 52662306a36Sopenharmony_cistruct irdma_cm_node *irdma_find_node(struct irdma_cm_core *cm_core, 52762306a36Sopenharmony_ci u16 rem_port, u32 *rem_addr, u16 loc_port, 52862306a36Sopenharmony_ci u32 *loc_addr, u16 vlan_id); 52962306a36Sopenharmony_ciint irdma_hw_flush_wqes(struct irdma_pci_f *rf, struct irdma_sc_qp *qp, 53062306a36Sopenharmony_ci struct irdma_qp_flush_info *info, bool wait); 53162306a36Sopenharmony_civoid irdma_gen_ae(struct irdma_pci_f *rf, struct irdma_sc_qp *qp, 53262306a36Sopenharmony_ci struct irdma_gen_ae_info *info, bool wait); 53362306a36Sopenharmony_civoid irdma_copy_ip_ntohl(u32 *dst, __be32 *src); 53462306a36Sopenharmony_civoid irdma_copy_ip_htonl(__be32 *dst, u32 *src); 53562306a36Sopenharmony_ciu16 irdma_get_vlan_ipv4(u32 *addr); 53662306a36Sopenharmony_civoid irdma_get_vlan_mac_ipv6(u32 *addr, u16 *vlan_id, u8 *mac); 53762306a36Sopenharmony_cistruct ib_mr *irdma_reg_phys_mr(struct ib_pd *ib_pd, u64 addr, u64 size, 53862306a36Sopenharmony_ci int acc, u64 *iova_start); 53962306a36Sopenharmony_ciint irdma_upload_qp_context(struct irdma_qp *iwqp, bool freeze, bool raw); 54062306a36Sopenharmony_civoid irdma_cqp_ce_handler(struct irdma_pci_f *rf, struct irdma_sc_cq *cq); 54162306a36Sopenharmony_ciint irdma_ah_cqp_op(struct irdma_pci_f *rf, struct irdma_sc_ah *sc_ah, u8 cmd, 54262306a36Sopenharmony_ci bool wait, 54362306a36Sopenharmony_ci void (*callback_fcn)(struct irdma_cqp_request *cqp_request), 54462306a36Sopenharmony_ci void *cb_param); 54562306a36Sopenharmony_civoid irdma_gsi_ud_qp_ah_cb(struct irdma_cqp_request *cqp_request); 54662306a36Sopenharmony_cibool irdma_cq_empty(struct irdma_cq *iwcq); 54762306a36Sopenharmony_ciint irdma_inetaddr_event(struct notifier_block *notifier, unsigned long event, 54862306a36Sopenharmony_ci void *ptr); 54962306a36Sopenharmony_ciint irdma_inet6addr_event(struct notifier_block *notifier, unsigned long event, 55062306a36Sopenharmony_ci void *ptr); 55162306a36Sopenharmony_ciint irdma_net_event(struct notifier_block *notifier, unsigned long event, 55262306a36Sopenharmony_ci void *ptr); 55362306a36Sopenharmony_ciint irdma_netdevice_event(struct notifier_block *notifier, unsigned long event, 55462306a36Sopenharmony_ci void *ptr); 55562306a36Sopenharmony_civoid irdma_add_ip(struct irdma_device *iwdev); 55662306a36Sopenharmony_civoid cqp_compl_worker(struct work_struct *work); 55762306a36Sopenharmony_ci#endif /* IRDMA_MAIN_H */ 558