173c9b8c3SBeilei Xing /* SPDX-License-Identifier: BSD-3-Clause 273c9b8c3SBeilei Xing * Copyright(c) 2023 Intel Corporation 373c9b8c3SBeilei Xing */ 473c9b8c3SBeilei Xing 573c9b8c3SBeilei Xing #include <rte_log.h> 6ec4b04a7SQi Zhang #include "idpf_common_device.h" 7ec4b04a7SQi Zhang #include "idpf_common_virtchnl.h" 8b2f9d478SBeilei Xing 9b2f9d478SBeilei Xing static void 10b2f9d478SBeilei Xing idpf_reset_pf(struct idpf_hw *hw) 11b2f9d478SBeilei Xing { 12b2f9d478SBeilei Xing uint32_t reg; 13b2f9d478SBeilei Xing 14b2f9d478SBeilei Xing reg = IDPF_READ_REG(hw, PFGEN_CTRL); 15b2f9d478SBeilei Xing IDPF_WRITE_REG(hw, PFGEN_CTRL, (reg | PFGEN_CTRL_PFSWR)); 16b2f9d478SBeilei Xing } 17b2f9d478SBeilei Xing 18b2f9d478SBeilei Xing #define IDPF_RESET_WAIT_CNT 100 1932bcd47eSBeilei Xing 20b2f9d478SBeilei Xing static int 21b2f9d478SBeilei Xing idpf_check_pf_reset_done(struct idpf_hw *hw) 22b2f9d478SBeilei Xing { 23b2f9d478SBeilei Xing uint32_t reg; 24b2f9d478SBeilei Xing int i; 25b2f9d478SBeilei Xing 26b2f9d478SBeilei Xing for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) { 27b2f9d478SBeilei Xing reg = IDPF_READ_REG(hw, PFGEN_RSTAT); 28b2f9d478SBeilei Xing if (reg != 0xFFFFFFFF && (reg & PFGEN_RSTAT_PFR_STATE_M)) 29b2f9d478SBeilei Xing return 0; 30b2f9d478SBeilei Xing rte_delay_ms(1000); 31b2f9d478SBeilei Xing } 32b2f9d478SBeilei Xing 33b2f9d478SBeilei Xing DRV_LOG(ERR, "IDPF reset timeout"); 34b2f9d478SBeilei Xing return -EBUSY; 35b2f9d478SBeilei Xing } 36b2f9d478SBeilei Xing 37b2f9d478SBeilei Xing static int 3832bcd47eSBeilei Xing idpf_check_vf_reset_done(struct idpf_hw *hw) 39b2f9d478SBeilei Xing { 4032bcd47eSBeilei Xing uint32_t reg; 4132bcd47eSBeilei Xing int i; 4232bcd47eSBeilei Xing 4332bcd47eSBeilei Xing for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) { 4432bcd47eSBeilei Xing reg = IDPF_READ_REG(hw, VFGEN_RSTAT); 4532bcd47eSBeilei Xing if (reg != 0xFFFFFFFF && (reg & VFGEN_RSTAT_VFR_STATE_M)) 4632bcd47eSBeilei Xing return 0; 4732bcd47eSBeilei Xing rte_delay_ms(1000); 4832bcd47eSBeilei Xing } 4932bcd47eSBeilei Xing 5032bcd47eSBeilei Xing DRV_LOG(ERR, "VF reset timeout"); 5132bcd47eSBeilei Xing return -EBUSY; 5232bcd47eSBeilei Xing } 5332bcd47eSBeilei Xing 5432bcd47eSBeilei Xing #define IDPF_CTLQ_NUM 2 5532bcd47eSBeilei Xing 5632bcd47eSBeilei Xing struct idpf_ctlq_create_info pf_ctlq_info[IDPF_CTLQ_NUM] = { 57b2f9d478SBeilei Xing { 58b2f9d478SBeilei Xing .type = IDPF_CTLQ_TYPE_MAILBOX_TX, 59b2f9d478SBeilei Xing .id = IDPF_CTLQ_ID, 60b2f9d478SBeilei Xing .len = IDPF_CTLQ_LEN, 61b2f9d478SBeilei Xing .buf_size = IDPF_DFLT_MBX_BUF_SIZE, 62b2f9d478SBeilei Xing .reg = { 63b2f9d478SBeilei Xing .head = PF_FW_ATQH, 64b2f9d478SBeilei Xing .tail = PF_FW_ATQT, 65b2f9d478SBeilei Xing .len = PF_FW_ATQLEN, 66b2f9d478SBeilei Xing .bah = PF_FW_ATQBAH, 67b2f9d478SBeilei Xing .bal = PF_FW_ATQBAL, 68b2f9d478SBeilei Xing .len_mask = PF_FW_ATQLEN_ATQLEN_M, 69b2f9d478SBeilei Xing .len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M, 70b2f9d478SBeilei Xing .head_mask = PF_FW_ATQH_ATQH_M, 71b2f9d478SBeilei Xing } 72b2f9d478SBeilei Xing }, 73b2f9d478SBeilei Xing { 74b2f9d478SBeilei Xing .type = IDPF_CTLQ_TYPE_MAILBOX_RX, 75b2f9d478SBeilei Xing .id = IDPF_CTLQ_ID, 76b2f9d478SBeilei Xing .len = IDPF_CTLQ_LEN, 77b2f9d478SBeilei Xing .buf_size = IDPF_DFLT_MBX_BUF_SIZE, 78b2f9d478SBeilei Xing .reg = { 79b2f9d478SBeilei Xing .head = PF_FW_ARQH, 80b2f9d478SBeilei Xing .tail = PF_FW_ARQT, 81b2f9d478SBeilei Xing .len = PF_FW_ARQLEN, 82b2f9d478SBeilei Xing .bah = PF_FW_ARQBAH, 83b2f9d478SBeilei Xing .bal = PF_FW_ARQBAL, 84b2f9d478SBeilei Xing .len_mask = PF_FW_ARQLEN_ARQLEN_M, 85b2f9d478SBeilei Xing .len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M, 86b2f9d478SBeilei Xing .head_mask = PF_FW_ARQH_ARQH_M, 87b2f9d478SBeilei Xing } 88b2f9d478SBeilei Xing } 89b2f9d478SBeilei Xing }; 90b2f9d478SBeilei Xing 9132bcd47eSBeilei Xing struct idpf_ctlq_create_info vf_ctlq_info[IDPF_CTLQ_NUM] = { 9232bcd47eSBeilei Xing { 9332bcd47eSBeilei Xing .type = IDPF_CTLQ_TYPE_MAILBOX_TX, 9432bcd47eSBeilei Xing .id = IDPF_CTLQ_ID, 9532bcd47eSBeilei Xing .len = IDPF_CTLQ_LEN, 9632bcd47eSBeilei Xing .buf_size = IDPF_DFLT_MBX_BUF_SIZE, 9732bcd47eSBeilei Xing .reg = { 9832bcd47eSBeilei Xing .head = VF_ATQH, 9932bcd47eSBeilei Xing .tail = VF_ATQT, 10032bcd47eSBeilei Xing .len = VF_ATQLEN, 10132bcd47eSBeilei Xing .bah = VF_ATQBAH, 10232bcd47eSBeilei Xing .bal = VF_ATQBAL, 10332bcd47eSBeilei Xing .len_mask = VF_ATQLEN_ATQLEN_M, 10432bcd47eSBeilei Xing .len_ena_mask = VF_ATQLEN_ATQENABLE_M, 10532bcd47eSBeilei Xing .head_mask = VF_ATQH_ATQH_M, 10632bcd47eSBeilei Xing } 10732bcd47eSBeilei Xing }, 10832bcd47eSBeilei Xing { 10932bcd47eSBeilei Xing .type = IDPF_CTLQ_TYPE_MAILBOX_RX, 11032bcd47eSBeilei Xing .id = IDPF_CTLQ_ID, 11132bcd47eSBeilei Xing .len = IDPF_CTLQ_LEN, 11232bcd47eSBeilei Xing .buf_size = IDPF_DFLT_MBX_BUF_SIZE, 11332bcd47eSBeilei Xing .reg = { 11432bcd47eSBeilei Xing .head = VF_ARQH, 11532bcd47eSBeilei Xing .tail = VF_ARQT, 11632bcd47eSBeilei Xing .len = VF_ARQLEN, 11732bcd47eSBeilei Xing .bah = VF_ARQBAH, 11832bcd47eSBeilei Xing .bal = VF_ARQBAL, 11932bcd47eSBeilei Xing .len_mask = VF_ARQLEN_ARQLEN_M, 12032bcd47eSBeilei Xing .len_ena_mask = VF_ARQLEN_ARQENABLE_M, 12132bcd47eSBeilei Xing .head_mask = VF_ARQH_ARQH_M, 12232bcd47eSBeilei Xing } 12332bcd47eSBeilei Xing } 12432bcd47eSBeilei Xing }; 12532bcd47eSBeilei Xing 12632bcd47eSBeilei Xing static int 12732bcd47eSBeilei Xing idpf_init_mbx(struct idpf_hw *hw) 12832bcd47eSBeilei Xing { 12932bcd47eSBeilei Xing struct idpf_ctlq_info *ctlq; 13032bcd47eSBeilei Xing int ret = 0; 13132bcd47eSBeilei Xing 13232bcd47eSBeilei Xing if (hw->device_id == IDPF_DEV_ID_SRIOV) 13332bcd47eSBeilei Xing ret = idpf_ctlq_init(hw, IDPF_CTLQ_NUM, vf_ctlq_info); 13432bcd47eSBeilei Xing else 13532bcd47eSBeilei Xing ret = idpf_ctlq_init(hw, IDPF_CTLQ_NUM, pf_ctlq_info); 136b2f9d478SBeilei Xing if (ret != 0) 137b2f9d478SBeilei Xing return ret; 138b2f9d478SBeilei Xing 139*4baf54edSStephen Hemminger LIST_FOR_EACH_ENTRY(ctlq, &hw->cq_list_head, struct idpf_ctlq_info, cq_list) { 140b2f9d478SBeilei Xing if (ctlq->q_id == IDPF_CTLQ_ID && 141b2f9d478SBeilei Xing ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_TX) 142b2f9d478SBeilei Xing hw->asq = ctlq; 143b2f9d478SBeilei Xing if (ctlq->q_id == IDPF_CTLQ_ID && 144b2f9d478SBeilei Xing ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_RX) 145b2f9d478SBeilei Xing hw->arq = ctlq; 146b2f9d478SBeilei Xing } 147b2f9d478SBeilei Xing 148b2f9d478SBeilei Xing if (hw->asq == NULL || hw->arq == NULL) { 149b2f9d478SBeilei Xing idpf_ctlq_deinit(hw); 150b2f9d478SBeilei Xing ret = -ENOENT; 151b2f9d478SBeilei Xing } 152b2f9d478SBeilei Xing 153b2f9d478SBeilei Xing return ret; 154b2f9d478SBeilei Xing } 155b2f9d478SBeilei Xing 1561b828adfSBeilei Xing static int 1571b828adfSBeilei Xing idpf_get_pkt_type(struct idpf_adapter *adapter) 1581b828adfSBeilei Xing { 159811bbeabSBeilei Xing struct virtchnl2_get_ptype_info *req_ptype_info; 160811bbeabSBeilei Xing struct virtchnl2_get_ptype_info *recv_ptype_info; 161811bbeabSBeilei Xing uint16_t recv_num_ptypes = 0; 1621b828adfSBeilei Xing uint16_t ptype_offset, i, j; 163811bbeabSBeilei Xing uint16_t start_ptype_id = 0; 1641b828adfSBeilei Xing int ret; 1651b828adfSBeilei Xing 166811bbeabSBeilei Xing req_ptype_info = rte_zmalloc("req_ptype_info", IDPF_DFLT_MBX_BUF_SIZE, 0); 167811bbeabSBeilei Xing if (req_ptype_info == NULL) 1681b828adfSBeilei Xing return -ENOMEM; 1691b828adfSBeilei Xing 170811bbeabSBeilei Xing recv_ptype_info = rte_zmalloc("recv_ptype_info", IDPF_DFLT_MBX_BUF_SIZE, 0); 171811bbeabSBeilei Xing if (recv_ptype_info == NULL) { 172811bbeabSBeilei Xing ret = -ENOMEM; 173811bbeabSBeilei Xing goto free_req_ptype_info; 1741b828adfSBeilei Xing } 1751b828adfSBeilei Xing 176811bbeabSBeilei Xing while (start_ptype_id < IDPF_MAX_PKT_TYPE) { 177811bbeabSBeilei Xing memset(req_ptype_info, 0, sizeof(*req_ptype_info)); 178811bbeabSBeilei Xing memset(recv_ptype_info, 0, sizeof(*recv_ptype_info)); 179811bbeabSBeilei Xing 180811bbeabSBeilei Xing if ((start_ptype_id + IDPF_RX_MAX_PTYPES_PER_BUF) > IDPF_MAX_PKT_TYPE) 181811bbeabSBeilei Xing req_ptype_info->num_ptypes = 182811bbeabSBeilei Xing rte_cpu_to_le_16(IDPF_MAX_PKT_TYPE - start_ptype_id); 183811bbeabSBeilei Xing else 184811bbeabSBeilei Xing req_ptype_info->num_ptypes = rte_cpu_to_le_16(IDPF_RX_MAX_PTYPES_PER_BUF); 185811bbeabSBeilei Xing req_ptype_info->start_ptype_id = start_ptype_id; 186811bbeabSBeilei Xing 187811bbeabSBeilei Xing ret = idpf_vc_ptype_info_query(adapter, req_ptype_info, recv_ptype_info); 188811bbeabSBeilei Xing if (ret != 0) { 189811bbeabSBeilei Xing DRV_LOG(ERR, "Fail to query packet type information"); 190811bbeabSBeilei Xing goto free_recv_ptype_info; 191811bbeabSBeilei Xing } 192811bbeabSBeilei Xing 193811bbeabSBeilei Xing recv_num_ptypes += rte_le_to_cpu_16(recv_ptype_info->num_ptypes); 194811bbeabSBeilei Xing if (recv_num_ptypes > IDPF_MAX_PKT_TYPE) { 195811bbeabSBeilei Xing ret = -EINVAL; 196811bbeabSBeilei Xing goto free_recv_ptype_info; 197811bbeabSBeilei Xing } 198811bbeabSBeilei Xing 199811bbeabSBeilei Xing start_ptype_id = rte_le_to_cpu_16(req_ptype_info->start_ptype_id) + 200811bbeabSBeilei Xing rte_le_to_cpu_16(req_ptype_info->num_ptypes); 201811bbeabSBeilei Xing 2021b828adfSBeilei Xing ptype_offset = sizeof(struct virtchnl2_get_ptype_info) - 2031b828adfSBeilei Xing sizeof(struct virtchnl2_ptype); 2041b828adfSBeilei Xing 205811bbeabSBeilei Xing for (i = 0; i < rte_le_to_cpu_16(recv_ptype_info->num_ptypes); i++) { 2061b828adfSBeilei Xing bool is_inner = false, is_ip = false; 2071b828adfSBeilei Xing struct virtchnl2_ptype *ptype; 2081b828adfSBeilei Xing uint32_t proto_hdr = 0; 2091b828adfSBeilei Xing 2101b828adfSBeilei Xing ptype = (struct virtchnl2_ptype *) 211811bbeabSBeilei Xing ((uint8_t *)recv_ptype_info + ptype_offset); 2121b828adfSBeilei Xing ptype_offset += IDPF_GET_PTYPE_SIZE(ptype); 2131b828adfSBeilei Xing if (ptype_offset > IDPF_DFLT_MBX_BUF_SIZE) { 2141b828adfSBeilei Xing ret = -EINVAL; 215811bbeabSBeilei Xing goto free_recv_ptype_info; 2161b828adfSBeilei Xing } 2171b828adfSBeilei Xing 2181b828adfSBeilei Xing for (j = 0; j < ptype->proto_id_count; j++) { 219811bbeabSBeilei Xing switch (rte_le_to_cpu_16(ptype->proto_id[j])) { 2201b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GRE: 2211b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_VXLAN: 2221b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L4_MASK; 2231b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_TUNNEL_GRENAT; 2241b828adfSBeilei Xing is_inner = true; 2251b828adfSBeilei Xing break; 2261b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_MAC: 2271b828adfSBeilei Xing if (is_inner) { 2281b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_INNER_L2_MASK; 2291b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L2_ETHER; 2301b828adfSBeilei Xing } else { 2311b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L2_MASK; 2321b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L2_ETHER; 2331b828adfSBeilei Xing } 2341b828adfSBeilei Xing break; 2351b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_VLAN: 2361b828adfSBeilei Xing if (is_inner) { 2371b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_INNER_L2_MASK; 2381b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L2_ETHER_VLAN; 2391b828adfSBeilei Xing } 2401b828adfSBeilei Xing break; 2411b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PTP: 2421b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L2_MASK; 2431b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L2_ETHER_TIMESYNC; 2441b828adfSBeilei Xing break; 2451b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_LLDP: 2461b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L2_MASK; 2471b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L2_ETHER_LLDP; 2481b828adfSBeilei Xing break; 2491b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ARP: 2501b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L2_MASK; 2511b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L2_ETHER_ARP; 2521b828adfSBeilei Xing break; 2531b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PPPOE: 2541b828adfSBeilei Xing proto_hdr &= ~RTE_PTYPE_L2_MASK; 2551b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L2_ETHER_PPPOE; 2561b828adfSBeilei Xing break; 2571b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IPV4: 2581b828adfSBeilei Xing if (!is_ip) { 2591b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L3_IPV4_EXT_UNKNOWN; 2601b828adfSBeilei Xing is_ip = true; 2611b828adfSBeilei Xing } else { 2621b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | 2631b828adfSBeilei Xing RTE_PTYPE_TUNNEL_IP; 2641b828adfSBeilei Xing is_inner = true; 2651b828adfSBeilei Xing } 2661b828adfSBeilei Xing break; 2671b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IPV6: 2681b828adfSBeilei Xing if (!is_ip) { 2691b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L3_IPV6_EXT_UNKNOWN; 2701b828adfSBeilei Xing is_ip = true; 2711b828adfSBeilei Xing } else { 2721b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | 2731b828adfSBeilei Xing RTE_PTYPE_TUNNEL_IP; 2741b828adfSBeilei Xing is_inner = true; 2751b828adfSBeilei Xing } 2761b828adfSBeilei Xing break; 2771b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IPV4_FRAG: 2781b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IPV6_FRAG: 2791b828adfSBeilei Xing if (is_inner) 2801b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_FRAG; 2811b828adfSBeilei Xing else 2821b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_FRAG; 2831b828adfSBeilei Xing break; 2841b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_UDP: 2851b828adfSBeilei Xing if (is_inner) 2861b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_UDP; 2871b828adfSBeilei Xing else 2881b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_UDP; 2891b828adfSBeilei Xing break; 2901b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_TCP: 2911b828adfSBeilei Xing if (is_inner) 2921b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_TCP; 2931b828adfSBeilei Xing else 2941b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_TCP; 2951b828adfSBeilei Xing break; 2961b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_SCTP: 2971b828adfSBeilei Xing if (is_inner) 2981b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_SCTP; 2991b828adfSBeilei Xing else 3001b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_SCTP; 3011b828adfSBeilei Xing break; 3021b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ICMP: 3031b828adfSBeilei Xing if (is_inner) 3041b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_ICMP; 3051b828adfSBeilei Xing else 3061b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_ICMP; 3071b828adfSBeilei Xing break; 3081b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ICMPV6: 3091b828adfSBeilei Xing if (is_inner) 3101b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_INNER_L4_ICMP; 3111b828adfSBeilei Xing else 3121b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_L4_ICMP; 3131b828adfSBeilei Xing break; 3141b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_L2TPV2: 3151b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_L2TPV2_CONTROL: 3161b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_L2TPV3: 3171b828adfSBeilei Xing is_inner = true; 3181b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_TUNNEL_L2TP; 3191b828adfSBeilei Xing break; 3201b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_NVGRE: 3211b828adfSBeilei Xing is_inner = true; 3221b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_TUNNEL_NVGRE; 3231b828adfSBeilei Xing break; 3241b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTPC_TEID: 3251b828adfSBeilei Xing is_inner = true; 3261b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_TUNNEL_GTPC; 3271b828adfSBeilei Xing break; 3281b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTPU: 3291b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTPU_UL: 3301b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTPU_DL: 3311b828adfSBeilei Xing is_inner = true; 3321b828adfSBeilei Xing proto_hdr |= RTE_PTYPE_TUNNEL_GTPU; 3331b828adfSBeilei Xing break; 3341b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PAY: 3351b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IPV6_EH: 3361b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PRE_MAC: 3371b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_POST_MAC: 3381b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ETHERTYPE: 3391b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_SVLAN: 3401b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_CVLAN: 3411b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_MPLS: 3421b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_MMPLS: 3431b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_CTRL: 3441b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ECP: 3451b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_EAPOL: 3461b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PPPOD: 3471b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IGMP: 3481b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_AH: 3491b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ESP: 3501b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_IKE: 3511b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_NATT_KEEP: 3521b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTP: 3531b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTP_EH: 3541b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GTPCV2: 3551b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_ECPRI: 3561b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_VRRP: 3571b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_OSPF: 3581b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_TUN: 3591b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_VXLAN_GPE: 3601b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_GENEVE: 3611b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_NSH: 3621b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_QUIC: 3631b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PFCP: 3641b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PFCP_NODE: 3651b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_PFCP_SESSION: 3661b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_RTP: 3671b828adfSBeilei Xing case VIRTCHNL2_PROTO_HDR_NO_PROTO: 3681b828adfSBeilei Xing default: 3691b828adfSBeilei Xing continue; 3701b828adfSBeilei Xing } 3711b828adfSBeilei Xing adapter->ptype_tbl[ptype->ptype_id_10] = proto_hdr; 3721b828adfSBeilei Xing } 3731b828adfSBeilei Xing } 3741b828adfSBeilei Xing } 3751b828adfSBeilei Xing 376811bbeabSBeilei Xing free_recv_ptype_info: 377811bbeabSBeilei Xing rte_free(recv_ptype_info); 378811bbeabSBeilei Xing free_req_ptype_info: 379811bbeabSBeilei Xing rte_free(req_ptype_info); 3801b828adfSBeilei Xing clear_cmd(adapter); 3811b828adfSBeilei Xing return ret; 3821b828adfSBeilei Xing } 3831b828adfSBeilei Xing 384b2f9d478SBeilei Xing int 385b2f9d478SBeilei Xing idpf_adapter_init(struct idpf_adapter *adapter) 386b2f9d478SBeilei Xing { 387b2f9d478SBeilei Xing struct idpf_hw *hw = &adapter->hw; 388b2f9d478SBeilei Xing int ret; 389b2f9d478SBeilei Xing 39032bcd47eSBeilei Xing if (hw->device_id == IDPF_DEV_ID_SRIOV) { 39132bcd47eSBeilei Xing ret = idpf_check_vf_reset_done(hw); 39232bcd47eSBeilei Xing } else { 393b2f9d478SBeilei Xing idpf_reset_pf(hw); 394b2f9d478SBeilei Xing ret = idpf_check_pf_reset_done(hw); 39532bcd47eSBeilei Xing } 396b2f9d478SBeilei Xing if (ret != 0) { 397b2f9d478SBeilei Xing DRV_LOG(ERR, "IDPF is still resetting"); 398b2f9d478SBeilei Xing goto err_check_reset; 399b2f9d478SBeilei Xing } 400b2f9d478SBeilei Xing 401b2f9d478SBeilei Xing ret = idpf_init_mbx(hw); 402b2f9d478SBeilei Xing if (ret != 0) { 403b2f9d478SBeilei Xing DRV_LOG(ERR, "Failed to init mailbox"); 404b2f9d478SBeilei Xing goto err_check_reset; 405b2f9d478SBeilei Xing } 406b2f9d478SBeilei Xing 407b2f9d478SBeilei Xing adapter->mbx_resp = rte_zmalloc("idpf_adapter_mbx_resp", 408b2f9d478SBeilei Xing IDPF_DFLT_MBX_BUF_SIZE, 0); 409b2f9d478SBeilei Xing if (adapter->mbx_resp == NULL) { 410b2f9d478SBeilei Xing DRV_LOG(ERR, "Failed to allocate idpf_adapter_mbx_resp memory"); 411b2f9d478SBeilei Xing ret = -ENOMEM; 412b2f9d478SBeilei Xing goto err_mbx_resp; 413b2f9d478SBeilei Xing } 414b2f9d478SBeilei Xing 415ba6b8cd4SBeilei Xing ret = idpf_vc_api_version_check(adapter); 416b2f9d478SBeilei Xing if (ret != 0) { 417b2f9d478SBeilei Xing DRV_LOG(ERR, "Failed to check api version"); 418b2f9d478SBeilei Xing goto err_check_api; 419b2f9d478SBeilei Xing } 420b2f9d478SBeilei Xing 421ba6b8cd4SBeilei Xing ret = idpf_vc_caps_get(adapter); 422b2f9d478SBeilei Xing if (ret != 0) { 423b2f9d478SBeilei Xing DRV_LOG(ERR, "Failed to get capabilities"); 424b2f9d478SBeilei Xing goto err_check_api; 425b2f9d478SBeilei Xing } 426b2f9d478SBeilei Xing 4271b828adfSBeilei Xing ret = idpf_get_pkt_type(adapter); 4281b828adfSBeilei Xing if (ret != 0) { 4291b828adfSBeilei Xing DRV_LOG(ERR, "Failed to set ptype table"); 4301b828adfSBeilei Xing goto err_check_api; 4311b828adfSBeilei Xing } 4321b828adfSBeilei Xing 433b2f9d478SBeilei Xing return 0; 434b2f9d478SBeilei Xing 435b2f9d478SBeilei Xing err_check_api: 436b2f9d478SBeilei Xing rte_free(adapter->mbx_resp); 437b2f9d478SBeilei Xing adapter->mbx_resp = NULL; 438b2f9d478SBeilei Xing err_mbx_resp: 439b2f9d478SBeilei Xing idpf_ctlq_deinit(hw); 440b2f9d478SBeilei Xing err_check_reset: 441b2f9d478SBeilei Xing return ret; 442b2f9d478SBeilei Xing } 443b2f9d478SBeilei Xing 444b2f9d478SBeilei Xing int 445b2f9d478SBeilei Xing idpf_adapter_deinit(struct idpf_adapter *adapter) 446b2f9d478SBeilei Xing { 447b2f9d478SBeilei Xing struct idpf_hw *hw = &adapter->hw; 448b2f9d478SBeilei Xing 449b2f9d478SBeilei Xing idpf_ctlq_deinit(hw); 450b2f9d478SBeilei Xing rte_free(adapter->mbx_resp); 451b2f9d478SBeilei Xing adapter->mbx_resp = NULL; 452b2f9d478SBeilei Xing 453b2f9d478SBeilei Xing return 0; 454b2f9d478SBeilei Xing } 45573c9b8c3SBeilei Xing 456c2769cadSBeilei Xing int 457c2769cadSBeilei Xing idpf_vport_init(struct idpf_vport *vport, 458c2769cadSBeilei Xing struct virtchnl2_create_vport *create_vport_info, 459c2769cadSBeilei Xing void *dev_data) 460c2769cadSBeilei Xing { 461c2769cadSBeilei Xing struct virtchnl2_create_vport *vport_info; 462c2769cadSBeilei Xing int i, type, ret; 463c2769cadSBeilei Xing 464ba6b8cd4SBeilei Xing ret = idpf_vc_vport_create(vport, create_vport_info); 465c2769cadSBeilei Xing if (ret != 0) { 466c2769cadSBeilei Xing DRV_LOG(ERR, "Failed to create vport."); 467c2769cadSBeilei Xing goto err_create_vport; 468c2769cadSBeilei Xing } 469c2769cadSBeilei Xing 470c2769cadSBeilei Xing vport_info = &(vport->vport_info.info); 471c2769cadSBeilei Xing vport->vport_id = vport_info->vport_id; 472c2769cadSBeilei Xing vport->txq_model = vport_info->txq_model; 473c2769cadSBeilei Xing vport->rxq_model = vport_info->rxq_model; 474c2769cadSBeilei Xing vport->num_tx_q = vport_info->num_tx_q; 475c2769cadSBeilei Xing vport->num_tx_complq = vport_info->num_tx_complq; 476c2769cadSBeilei Xing vport->num_rx_q = vport_info->num_rx_q; 477c2769cadSBeilei Xing vport->num_rx_bufq = vport_info->num_rx_bufq; 478c2769cadSBeilei Xing vport->max_mtu = vport_info->max_mtu; 479c2769cadSBeilei Xing rte_memcpy(vport->default_mac_addr, 480c2769cadSBeilei Xing vport_info->default_mac_addr, ETH_ALEN); 481c2769cadSBeilei Xing vport->rss_algorithm = vport_info->rss_algorithm; 482c2769cadSBeilei Xing vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN, 483c2769cadSBeilei Xing vport_info->rss_key_size); 484c2769cadSBeilei Xing vport->rss_lut_size = vport_info->rss_lut_size; 485c2769cadSBeilei Xing 486c2769cadSBeilei Xing for (i = 0; i < vport_info->chunks.num_chunks; i++) { 487c2769cadSBeilei Xing type = vport_info->chunks.chunks[i].type; 488c2769cadSBeilei Xing switch (type) { 489c2769cadSBeilei Xing case VIRTCHNL2_QUEUE_TYPE_TX: 490c2769cadSBeilei Xing vport->chunks_info.tx_start_qid = 491c2769cadSBeilei Xing vport_info->chunks.chunks[i].start_queue_id; 492c2769cadSBeilei Xing vport->chunks_info.tx_qtail_start = 493c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_start; 494c2769cadSBeilei Xing vport->chunks_info.tx_qtail_spacing = 495c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_spacing; 496c2769cadSBeilei Xing break; 497c2769cadSBeilei Xing case VIRTCHNL2_QUEUE_TYPE_RX: 498c2769cadSBeilei Xing vport->chunks_info.rx_start_qid = 499c2769cadSBeilei Xing vport_info->chunks.chunks[i].start_queue_id; 500c2769cadSBeilei Xing vport->chunks_info.rx_qtail_start = 501c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_start; 502c2769cadSBeilei Xing vport->chunks_info.rx_qtail_spacing = 503c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_spacing; 504c2769cadSBeilei Xing break; 505c2769cadSBeilei Xing case VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION: 506c2769cadSBeilei Xing vport->chunks_info.tx_compl_start_qid = 507c2769cadSBeilei Xing vport_info->chunks.chunks[i].start_queue_id; 508c2769cadSBeilei Xing vport->chunks_info.tx_compl_qtail_start = 509c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_start; 510c2769cadSBeilei Xing vport->chunks_info.tx_compl_qtail_spacing = 511c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_spacing; 512c2769cadSBeilei Xing break; 513c2769cadSBeilei Xing case VIRTCHNL2_QUEUE_TYPE_RX_BUFFER: 514c2769cadSBeilei Xing vport->chunks_info.rx_buf_start_qid = 515c2769cadSBeilei Xing vport_info->chunks.chunks[i].start_queue_id; 516c2769cadSBeilei Xing vport->chunks_info.rx_buf_qtail_start = 517c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_start; 518c2769cadSBeilei Xing vport->chunks_info.rx_buf_qtail_spacing = 519c2769cadSBeilei Xing vport_info->chunks.chunks[i].qtail_reg_spacing; 520c2769cadSBeilei Xing break; 521c2769cadSBeilei Xing default: 522c2769cadSBeilei Xing DRV_LOG(ERR, "Unsupported queue type"); 523c2769cadSBeilei Xing break; 524c2769cadSBeilei Xing } 525c2769cadSBeilei Xing } 526c2769cadSBeilei Xing 527c2769cadSBeilei Xing vport->dev_data = dev_data; 528c2769cadSBeilei Xing 529c2769cadSBeilei Xing vport->rss_key = rte_zmalloc("rss_key", 530c2769cadSBeilei Xing vport->rss_key_size, 0); 531c2769cadSBeilei Xing if (vport->rss_key == NULL) { 532c2769cadSBeilei Xing DRV_LOG(ERR, "Failed to allocate RSS key"); 533c2769cadSBeilei Xing ret = -ENOMEM; 534c2769cadSBeilei Xing goto err_rss_key; 535c2769cadSBeilei Xing } 536c2769cadSBeilei Xing 537c2769cadSBeilei Xing vport->rss_lut = rte_zmalloc("rss_lut", 538c2769cadSBeilei Xing sizeof(uint32_t) * vport->rss_lut_size, 0); 539c2769cadSBeilei Xing if (vport->rss_lut == NULL) { 540c2769cadSBeilei Xing DRV_LOG(ERR, "Failed to allocate RSS lut"); 541c2769cadSBeilei Xing ret = -ENOMEM; 542c2769cadSBeilei Xing goto err_rss_lut; 543c2769cadSBeilei Xing } 544c2769cadSBeilei Xing 545ddb59a7dSBeilei Xing /* recv_vectors is used for VIRTCHNL2_OP_ALLOC_VECTORS response, 546ddb59a7dSBeilei Xing * reserve maximum size for it now, may need optimization in future. 547ddb59a7dSBeilei Xing */ 548ddb59a7dSBeilei Xing vport->recv_vectors = rte_zmalloc("recv_vectors", IDPF_DFLT_MBX_BUF_SIZE, 0); 549ddb59a7dSBeilei Xing if (vport->recv_vectors == NULL) { 550ddb59a7dSBeilei Xing DRV_LOG(ERR, "Failed to allocate recv_vectors"); 551ddb59a7dSBeilei Xing ret = -ENOMEM; 552ddb59a7dSBeilei Xing goto err_recv_vec; 553ddb59a7dSBeilei Xing } 554ddb59a7dSBeilei Xing 555c2769cadSBeilei Xing return 0; 556c2769cadSBeilei Xing 557ddb59a7dSBeilei Xing err_recv_vec: 558ddb59a7dSBeilei Xing rte_free(vport->rss_lut); 559ddb59a7dSBeilei Xing vport->rss_lut = NULL; 560c2769cadSBeilei Xing err_rss_lut: 561c2769cadSBeilei Xing vport->dev_data = NULL; 562c2769cadSBeilei Xing rte_free(vport->rss_key); 563c2769cadSBeilei Xing vport->rss_key = NULL; 564c2769cadSBeilei Xing err_rss_key: 565ba6b8cd4SBeilei Xing idpf_vc_vport_destroy(vport); 566c2769cadSBeilei Xing err_create_vport: 567c2769cadSBeilei Xing return ret; 568c2769cadSBeilei Xing } 569c2769cadSBeilei Xing int 570c2769cadSBeilei Xing idpf_vport_deinit(struct idpf_vport *vport) 571c2769cadSBeilei Xing { 572ddb59a7dSBeilei Xing rte_free(vport->recv_vectors); 573ddb59a7dSBeilei Xing vport->recv_vectors = NULL; 574c2769cadSBeilei Xing rte_free(vport->rss_lut); 575c2769cadSBeilei Xing vport->rss_lut = NULL; 576c2769cadSBeilei Xing 577c2769cadSBeilei Xing rte_free(vport->rss_key); 578c2769cadSBeilei Xing vport->rss_key = NULL; 579c2769cadSBeilei Xing 580c2769cadSBeilei Xing vport->dev_data = NULL; 581c2769cadSBeilei Xing 582ba6b8cd4SBeilei Xing idpf_vc_vport_destroy(vport); 583c2769cadSBeilei Xing 584c2769cadSBeilei Xing return 0; 585c2769cadSBeilei Xing } 5861d33ffdfSBeilei Xing int 587513a7eceSBeilei Xing idpf_vport_rss_config(struct idpf_vport *vport) 5881d33ffdfSBeilei Xing { 5891d33ffdfSBeilei Xing int ret; 5901d33ffdfSBeilei Xing 591ba6b8cd4SBeilei Xing ret = idpf_vc_rss_key_set(vport); 5921d33ffdfSBeilei Xing if (ret != 0) { 5931d33ffdfSBeilei Xing DRV_LOG(ERR, "Failed to configure RSS key"); 5941d33ffdfSBeilei Xing return ret; 5951d33ffdfSBeilei Xing } 5961d33ffdfSBeilei Xing 597ba6b8cd4SBeilei Xing ret = idpf_vc_rss_lut_set(vport); 5981d33ffdfSBeilei Xing if (ret != 0) { 5991d33ffdfSBeilei Xing DRV_LOG(ERR, "Failed to configure RSS lut"); 6001d33ffdfSBeilei Xing return ret; 6011d33ffdfSBeilei Xing } 6021d33ffdfSBeilei Xing 603ba6b8cd4SBeilei Xing ret = idpf_vc_rss_hash_set(vport); 6041d33ffdfSBeilei Xing if (ret != 0) { 6051d33ffdfSBeilei Xing DRV_LOG(ERR, "Failed to configure RSS hash"); 6061d33ffdfSBeilei Xing return ret; 6071d33ffdfSBeilei Xing } 6081d33ffdfSBeilei Xing 6091d33ffdfSBeilei Xing return ret; 6101d33ffdfSBeilei Xing } 611ddb59a7dSBeilei Xing 612ddb59a7dSBeilei Xing int 613513a7eceSBeilei Xing idpf_vport_irq_map_config(struct idpf_vport *vport, uint16_t nb_rx_queues) 614ddb59a7dSBeilei Xing { 615ddb59a7dSBeilei Xing struct idpf_adapter *adapter = vport->adapter; 616ddb59a7dSBeilei Xing struct virtchnl2_queue_vector *qv_map; 617ddb59a7dSBeilei Xing struct idpf_hw *hw = &adapter->hw; 618ddb59a7dSBeilei Xing uint32_t dynctl_val, itrn_val; 619ddb59a7dSBeilei Xing uint32_t dynctl_reg_start; 620ddb59a7dSBeilei Xing uint32_t itrn_reg_start; 621ddb59a7dSBeilei Xing uint16_t i; 622ddb59a7dSBeilei Xing int ret; 623ddb59a7dSBeilei Xing 624ddb59a7dSBeilei Xing qv_map = rte_zmalloc("qv_map", 625ddb59a7dSBeilei Xing nb_rx_queues * 626ddb59a7dSBeilei Xing sizeof(struct virtchnl2_queue_vector), 0); 627ddb59a7dSBeilei Xing if (qv_map == NULL) { 628ddb59a7dSBeilei Xing DRV_LOG(ERR, "Failed to allocate %d queue-vector map", 629ddb59a7dSBeilei Xing nb_rx_queues); 630ddb59a7dSBeilei Xing ret = -ENOMEM; 631ddb59a7dSBeilei Xing goto qv_map_alloc_err; 632ddb59a7dSBeilei Xing } 633ddb59a7dSBeilei Xing 634ddb59a7dSBeilei Xing /* Rx interrupt disabled, Map interrupt only for writeback */ 635ddb59a7dSBeilei Xing 636ddb59a7dSBeilei Xing /* The capability flags adapter->caps.other_caps should be 637ddb59a7dSBeilei Xing * compared with bit VIRTCHNL2_CAP_WB_ON_ITR here. The if 638ddb59a7dSBeilei Xing * condition should be updated when the FW can return the 639ddb59a7dSBeilei Xing * correct flag bits. 640ddb59a7dSBeilei Xing */ 641ddb59a7dSBeilei Xing dynctl_reg_start = 642ddb59a7dSBeilei Xing vport->recv_vectors->vchunks.vchunks->dynctl_reg_start; 643ddb59a7dSBeilei Xing itrn_reg_start = 644ddb59a7dSBeilei Xing vport->recv_vectors->vchunks.vchunks->itrn_reg_start; 645ddb59a7dSBeilei Xing dynctl_val = IDPF_READ_REG(hw, dynctl_reg_start); 646ddb59a7dSBeilei Xing DRV_LOG(DEBUG, "Value of dynctl_reg_start is 0x%x", dynctl_val); 647ddb59a7dSBeilei Xing itrn_val = IDPF_READ_REG(hw, itrn_reg_start); 648ddb59a7dSBeilei Xing DRV_LOG(DEBUG, "Value of itrn_reg_start is 0x%x", itrn_val); 649ddb59a7dSBeilei Xing /* Force write-backs by setting WB_ON_ITR bit in DYN_CTL 650ddb59a7dSBeilei Xing * register. WB_ON_ITR and INTENA are mutually exclusive 651ddb59a7dSBeilei Xing * bits. Setting WB_ON_ITR bits means TX and RX Descs 652ddb59a7dSBeilei Xing * are written back based on ITR expiration irrespective 653ddb59a7dSBeilei Xing * of INTENA setting. 654ddb59a7dSBeilei Xing */ 655ddb59a7dSBeilei Xing /* TBD: need to tune INTERVAL value for better performance. */ 656ddb59a7dSBeilei Xing itrn_val = (itrn_val == 0) ? IDPF_DFLT_INTERVAL : itrn_val; 657ddb59a7dSBeilei Xing dynctl_val = VIRTCHNL2_ITR_IDX_0 << 658ddb59a7dSBeilei Xing PF_GLINT_DYN_CTL_ITR_INDX_S | 659ddb59a7dSBeilei Xing PF_GLINT_DYN_CTL_WB_ON_ITR_M | 660ddb59a7dSBeilei Xing itrn_val << PF_GLINT_DYN_CTL_INTERVAL_S; 661ddb59a7dSBeilei Xing IDPF_WRITE_REG(hw, dynctl_reg_start, dynctl_val); 662ddb59a7dSBeilei Xing 663ddb59a7dSBeilei Xing for (i = 0; i < nb_rx_queues; i++) { 664ddb59a7dSBeilei Xing /* map all queues to the same vector */ 665ddb59a7dSBeilei Xing qv_map[i].queue_id = vport->chunks_info.rx_start_qid + i; 666ddb59a7dSBeilei Xing qv_map[i].vector_id = 667ddb59a7dSBeilei Xing vport->recv_vectors->vchunks.vchunks->start_vector_id; 668ddb59a7dSBeilei Xing } 669ddb59a7dSBeilei Xing vport->qv_map = qv_map; 670ddb59a7dSBeilei Xing 671ba6b8cd4SBeilei Xing ret = idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, true); 672ddb59a7dSBeilei Xing if (ret != 0) { 673ddb59a7dSBeilei Xing DRV_LOG(ERR, "config interrupt mapping failed"); 674ddb59a7dSBeilei Xing goto config_irq_map_err; 675ddb59a7dSBeilei Xing } 676ddb59a7dSBeilei Xing 677ddb59a7dSBeilei Xing return 0; 678ddb59a7dSBeilei Xing 679ddb59a7dSBeilei Xing config_irq_map_err: 680ddb59a7dSBeilei Xing rte_free(vport->qv_map); 681ddb59a7dSBeilei Xing vport->qv_map = NULL; 682ddb59a7dSBeilei Xing 683ddb59a7dSBeilei Xing qv_map_alloc_err: 684ddb59a7dSBeilei Xing return ret; 685ddb59a7dSBeilei Xing } 686ddb59a7dSBeilei Xing 687ddb59a7dSBeilei Xing int 6881e8c00f5SBeilei Xing idpf_vport_irq_map_config_by_qids(struct idpf_vport *vport, uint32_t *qids, uint16_t nb_rx_queues) 6891e8c00f5SBeilei Xing { 6901e8c00f5SBeilei Xing struct idpf_adapter *adapter = vport->adapter; 6911e8c00f5SBeilei Xing struct virtchnl2_queue_vector *qv_map; 6921e8c00f5SBeilei Xing struct idpf_hw *hw = &adapter->hw; 6931e8c00f5SBeilei Xing uint32_t dynctl_val, itrn_val; 6941e8c00f5SBeilei Xing uint32_t dynctl_reg_start; 6951e8c00f5SBeilei Xing uint32_t itrn_reg_start; 6961e8c00f5SBeilei Xing uint16_t i; 6971e8c00f5SBeilei Xing int ret; 6981e8c00f5SBeilei Xing 6991e8c00f5SBeilei Xing qv_map = rte_zmalloc("qv_map", 7001e8c00f5SBeilei Xing nb_rx_queues * 7011e8c00f5SBeilei Xing sizeof(struct virtchnl2_queue_vector), 0); 7021e8c00f5SBeilei Xing if (qv_map == NULL) { 7031e8c00f5SBeilei Xing DRV_LOG(ERR, "Failed to allocate %d queue-vector map", 7041e8c00f5SBeilei Xing nb_rx_queues); 7051e8c00f5SBeilei Xing ret = -ENOMEM; 7061e8c00f5SBeilei Xing goto qv_map_alloc_err; 7071e8c00f5SBeilei Xing } 7081e8c00f5SBeilei Xing 7091e8c00f5SBeilei Xing /* Rx interrupt disabled, Map interrupt only for writeback */ 7101e8c00f5SBeilei Xing 7111e8c00f5SBeilei Xing /* The capability flags adapter->caps.other_caps should be 7121e8c00f5SBeilei Xing * compared with bit VIRTCHNL2_CAP_WB_ON_ITR here. The if 7131e8c00f5SBeilei Xing * condition should be updated when the FW can return the 7141e8c00f5SBeilei Xing * correct flag bits. 7151e8c00f5SBeilei Xing */ 7161e8c00f5SBeilei Xing dynctl_reg_start = 7171e8c00f5SBeilei Xing vport->recv_vectors->vchunks.vchunks->dynctl_reg_start; 7181e8c00f5SBeilei Xing itrn_reg_start = 7191e8c00f5SBeilei Xing vport->recv_vectors->vchunks.vchunks->itrn_reg_start; 7201e8c00f5SBeilei Xing dynctl_val = IDPF_READ_REG(hw, dynctl_reg_start); 7211e8c00f5SBeilei Xing DRV_LOG(DEBUG, "Value of dynctl_reg_start is 0x%x", dynctl_val); 7221e8c00f5SBeilei Xing itrn_val = IDPF_READ_REG(hw, itrn_reg_start); 7231e8c00f5SBeilei Xing DRV_LOG(DEBUG, "Value of itrn_reg_start is 0x%x", itrn_val); 7241e8c00f5SBeilei Xing /* Force write-backs by setting WB_ON_ITR bit in DYN_CTL 7251e8c00f5SBeilei Xing * register. WB_ON_ITR and INTENA are mutually exclusive 7261e8c00f5SBeilei Xing * bits. Setting WB_ON_ITR bits means TX and RX Descs 7271e8c00f5SBeilei Xing * are written back based on ITR expiration irrespective 7281e8c00f5SBeilei Xing * of INTENA setting. 7291e8c00f5SBeilei Xing */ 7301e8c00f5SBeilei Xing /* TBD: need to tune INTERVAL value for better performance. */ 7311e8c00f5SBeilei Xing itrn_val = (itrn_val == 0) ? IDPF_DFLT_INTERVAL : itrn_val; 7321e8c00f5SBeilei Xing dynctl_val = VIRTCHNL2_ITR_IDX_0 << 7331e8c00f5SBeilei Xing PF_GLINT_DYN_CTL_ITR_INDX_S | 7341e8c00f5SBeilei Xing PF_GLINT_DYN_CTL_WB_ON_ITR_M | 7351e8c00f5SBeilei Xing itrn_val << PF_GLINT_DYN_CTL_INTERVAL_S; 7361e8c00f5SBeilei Xing IDPF_WRITE_REG(hw, dynctl_reg_start, dynctl_val); 7371e8c00f5SBeilei Xing 7381e8c00f5SBeilei Xing for (i = 0; i < nb_rx_queues; i++) { 7391e8c00f5SBeilei Xing /* map all queues to the same vector */ 7401e8c00f5SBeilei Xing qv_map[i].queue_id = qids[i]; 7411e8c00f5SBeilei Xing qv_map[i].vector_id = 7421e8c00f5SBeilei Xing vport->recv_vectors->vchunks.vchunks->start_vector_id; 7431e8c00f5SBeilei Xing } 7441e8c00f5SBeilei Xing vport->qv_map = qv_map; 7451e8c00f5SBeilei Xing 7461e8c00f5SBeilei Xing ret = idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, true); 7471e8c00f5SBeilei Xing if (ret != 0) { 7481e8c00f5SBeilei Xing DRV_LOG(ERR, "config interrupt mapping failed"); 7491e8c00f5SBeilei Xing goto config_irq_map_err; 7501e8c00f5SBeilei Xing } 7511e8c00f5SBeilei Xing 7521e8c00f5SBeilei Xing return 0; 7531e8c00f5SBeilei Xing 7541e8c00f5SBeilei Xing config_irq_map_err: 7551e8c00f5SBeilei Xing rte_free(vport->qv_map); 7561e8c00f5SBeilei Xing vport->qv_map = NULL; 7571e8c00f5SBeilei Xing 7581e8c00f5SBeilei Xing qv_map_alloc_err: 7591e8c00f5SBeilei Xing return ret; 7601e8c00f5SBeilei Xing } 7611e8c00f5SBeilei Xing 7621e8c00f5SBeilei Xing int 763513a7eceSBeilei Xing idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t nb_rx_queues) 764ddb59a7dSBeilei Xing { 765ba6b8cd4SBeilei Xing idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, false); 766ddb59a7dSBeilei Xing 767ddb59a7dSBeilei Xing rte_free(vport->qv_map); 768ddb59a7dSBeilei Xing vport->qv_map = NULL; 769ddb59a7dSBeilei Xing 770ddb59a7dSBeilei Xing return 0; 771ddb59a7dSBeilei Xing } 772ddb59a7dSBeilei Xing 7737f47b20bSBeilei Xing int 774513a7eceSBeilei Xing idpf_vport_info_init(struct idpf_vport *vport, 7757f47b20bSBeilei Xing struct virtchnl2_create_vport *vport_info) 7767f47b20bSBeilei Xing { 7777f47b20bSBeilei Xing struct idpf_adapter *adapter = vport->adapter; 7787f47b20bSBeilei Xing 7797f47b20bSBeilei Xing vport_info->vport_type = rte_cpu_to_le_16(VIRTCHNL2_VPORT_TYPE_DEFAULT); 780181348d3SMingxia Liu if (!adapter->is_tx_singleq) { 7817f47b20bSBeilei Xing vport_info->txq_model = 7827f47b20bSBeilei Xing rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SPLIT); 7837f47b20bSBeilei Xing vport_info->num_tx_q = 7847f47b20bSBeilei Xing rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM); 7857f47b20bSBeilei Xing vport_info->num_tx_complq = 7867f47b20bSBeilei Xing rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM * IDPF_TX_COMPLQ_PER_GRP); 7877f47b20bSBeilei Xing } else { 7887f47b20bSBeilei Xing vport_info->txq_model = 7897f47b20bSBeilei Xing rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE); 7907f47b20bSBeilei Xing vport_info->num_tx_q = rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM); 7917f47b20bSBeilei Xing vport_info->num_tx_complq = 0; 7927f47b20bSBeilei Xing } 793181348d3SMingxia Liu if (!adapter->is_rx_singleq) { 7947f47b20bSBeilei Xing vport_info->rxq_model = 7957f47b20bSBeilei Xing rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SPLIT); 7967f47b20bSBeilei Xing vport_info->num_rx_q = rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM); 7977f47b20bSBeilei Xing vport_info->num_rx_bufq = 7987f47b20bSBeilei Xing rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM * IDPF_RX_BUFQ_PER_GRP); 7997f47b20bSBeilei Xing } else { 8007f47b20bSBeilei Xing vport_info->rxq_model = 8017f47b20bSBeilei Xing rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE); 8027f47b20bSBeilei Xing vport_info->num_rx_q = rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM); 8037f47b20bSBeilei Xing vport_info->num_rx_bufq = 0; 8047f47b20bSBeilei Xing } 8057f47b20bSBeilei Xing 8067f47b20bSBeilei Xing return 0; 8077f47b20bSBeilei Xing } 8087f47b20bSBeilei Xing 8097514d76dSMingxia Liu void 8107514d76dSMingxia Liu idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct virtchnl2_vport_stats *nes) 8117514d76dSMingxia Liu { 8127514d76dSMingxia Liu nes->rx_bytes = nes->rx_bytes - oes->rx_bytes; 8137514d76dSMingxia Liu nes->rx_unicast = nes->rx_unicast - oes->rx_unicast; 8147514d76dSMingxia Liu nes->rx_multicast = nes->rx_multicast - oes->rx_multicast; 8157514d76dSMingxia Liu nes->rx_broadcast = nes->rx_broadcast - oes->rx_broadcast; 8167514d76dSMingxia Liu nes->rx_errors = nes->rx_errors - oes->rx_errors; 8177514d76dSMingxia Liu nes->rx_discards = nes->rx_discards - oes->rx_discards; 8187514d76dSMingxia Liu nes->tx_bytes = nes->tx_bytes - oes->tx_bytes; 8197514d76dSMingxia Liu nes->tx_unicast = nes->tx_unicast - oes->tx_unicast; 8207514d76dSMingxia Liu nes->tx_multicast = nes->tx_multicast - oes->tx_multicast; 8217514d76dSMingxia Liu nes->tx_broadcast = nes->tx_broadcast - oes->tx_broadcast; 8227514d76dSMingxia Liu nes->tx_errors = nes->tx_errors - oes->tx_errors; 8237514d76dSMingxia Liu nes->tx_discards = nes->tx_discards - oes->tx_discards; 8247514d76dSMingxia Liu } 8257514d76dSMingxia Liu 82673c9b8c3SBeilei Xing RTE_LOG_REGISTER_SUFFIX(idpf_common_logtype, common, NOTICE); 827