12095717fSBeilei Xing /* SPDX-License-Identifier: BSD-3-Clause 22095717fSBeilei Xing * Copyright(c) 2023 Intel Corporation 32095717fSBeilei Xing */ 42095717fSBeilei Xing 52095717fSBeilei Xing #ifndef _IDPF_COMMON_DEVICE_H_ 62095717fSBeilei Xing #define _IDPF_COMMON_DEVICE_H_ 72095717fSBeilei Xing 81b828adfSBeilei Xing #include <rte_mbuf_ptype.h> 9ec4b04a7SQi Zhang #include "base/idpf_prototype.h" 10ec4b04a7SQi Zhang #include "base/virtchnl2.h" 11ec4b04a7SQi Zhang #include "idpf_common_logs.h" 1273c9b8c3SBeilei Xing 1332bcd47eSBeilei Xing #define IDPF_DEV_ID_SRIOV 0x145C 1432bcd47eSBeilei Xing 15c2769cadSBeilei Xing #define IDPF_RSS_KEY_LEN 52 16c2769cadSBeilei Xing 17b2f9d478SBeilei Xing #define IDPF_CTLQ_ID -1 1873c9b8c3SBeilei Xing #define IDPF_CTLQ_LEN 64 1973c9b8c3SBeilei Xing #define IDPF_DFLT_MBX_BUF_SIZE 4096 2073c9b8c3SBeilei Xing 217f47b20bSBeilei Xing #define IDPF_DEFAULT_RXQ_NUM 16 227f47b20bSBeilei Xing #define IDPF_RX_BUFQ_PER_GRP 2 238b95ced4SBeilei Xing #define IDPF_RXQ_PER_GRP 1 247f47b20bSBeilei Xing #define IDPF_DEFAULT_TXQ_NUM 16 257f47b20bSBeilei Xing #define IDPF_TX_COMPLQ_PER_GRP 1 268b95ced4SBeilei Xing #define IDPF_TXQ_PER_GRP 1 277f47b20bSBeilei Xing 288c6098afSBeilei Xing #define IDPF_MIN_FRAME_SIZE 14 298c6098afSBeilei Xing 3073c9b8c3SBeilei Xing #define IDPF_MAX_PKT_TYPE 1024 312095717fSBeilei Xing 32ddb59a7dSBeilei Xing #define IDPF_DFLT_INTERVAL 16 33ddb59a7dSBeilei Xing 341b828adfSBeilei Xing #define IDPF_GET_PTYPE_SIZE(p) \ 351b828adfSBeilei Xing (sizeof(struct virtchnl2_ptype) + \ 361b828adfSBeilei Xing (((p)->proto_id_count ? ((p)->proto_id_count - 1) : 0) * sizeof((p)->proto_id[0]))) 371b828adfSBeilei Xing 382095717fSBeilei Xing struct idpf_adapter { 392095717fSBeilei Xing struct idpf_hw hw; 402095717fSBeilei Xing struct virtchnl2_version_info virtchnl_version; 412095717fSBeilei Xing struct virtchnl2_get_capabilities caps; 422095717fSBeilei Xing volatile uint32_t pend_cmd; /* pending command not finished */ 432095717fSBeilei Xing uint32_t cmd_retval; /* return value of the cmd response from cp */ 442095717fSBeilei Xing uint8_t *mbx_resp; /* buffer to store the mailbox response from cp */ 451b828adfSBeilei Xing 461b828adfSBeilei Xing uint32_t ptype_tbl[IDPF_MAX_PKT_TYPE] __rte_cache_min_aligned; 477f47b20bSBeilei Xing 48181348d3SMingxia Liu bool is_tx_singleq; /* true - single queue model, false - split queue model */ 49181348d3SMingxia Liu bool is_rx_singleq; /* true - single queue model, false - split queue model */ 508c6098afSBeilei Xing 518c6098afSBeilei Xing /* For timestamp */ 528c6098afSBeilei Xing uint64_t time_hw; 532095717fSBeilei Xing }; 542095717fSBeilei Xing 551082a773SBeilei Xing struct idpf_chunks_info { 561082a773SBeilei Xing uint32_t tx_start_qid; 571082a773SBeilei Xing uint32_t rx_start_qid; 581082a773SBeilei Xing /* Valid only if split queue model */ 591082a773SBeilei Xing uint32_t tx_compl_start_qid; 601082a773SBeilei Xing uint32_t rx_buf_start_qid; 611082a773SBeilei Xing 621082a773SBeilei Xing uint64_t tx_qtail_start; 631082a773SBeilei Xing uint32_t tx_qtail_spacing; 641082a773SBeilei Xing uint64_t rx_qtail_start; 651082a773SBeilei Xing uint32_t rx_qtail_spacing; 661082a773SBeilei Xing uint64_t tx_compl_qtail_start; 671082a773SBeilei Xing uint32_t tx_compl_qtail_spacing; 681082a773SBeilei Xing uint64_t rx_buf_qtail_start; 691082a773SBeilei Xing uint32_t rx_buf_qtail_spacing; 701082a773SBeilei Xing }; 711082a773SBeilei Xing 721082a773SBeilei Xing struct idpf_vport { 731082a773SBeilei Xing struct idpf_adapter *adapter; /* Backreference to associated adapter */ 74c2769cadSBeilei Xing union { 75c2769cadSBeilei Xing struct virtchnl2_create_vport info; /* virtchnl response info handling */ 76c2769cadSBeilei Xing uint8_t data[IDPF_DFLT_MBX_BUF_SIZE]; 77c2769cadSBeilei Xing } vport_info; 781082a773SBeilei Xing uint16_t sw_idx; /* SW index in adapter->vports[]*/ 791082a773SBeilei Xing uint16_t vport_id; 801082a773SBeilei Xing uint32_t txq_model; 811082a773SBeilei Xing uint32_t rxq_model; 821082a773SBeilei Xing uint16_t num_tx_q; 831082a773SBeilei Xing /* valid only if txq_model is split Q */ 841082a773SBeilei Xing uint16_t num_tx_complq; 851082a773SBeilei Xing uint16_t num_rx_q; 861082a773SBeilei Xing /* valid only if rxq_model is split Q */ 871082a773SBeilei Xing uint16_t num_rx_bufq; 881082a773SBeilei Xing 891082a773SBeilei Xing uint16_t max_mtu; 901082a773SBeilei Xing uint8_t default_mac_addr[VIRTCHNL_ETH_LENGTH_OF_ADDRESS]; 911082a773SBeilei Xing 921082a773SBeilei Xing enum virtchnl_rss_algorithm rss_algorithm; 931082a773SBeilei Xing uint16_t rss_key_size; 941082a773SBeilei Xing uint16_t rss_lut_size; 951082a773SBeilei Xing 961082a773SBeilei Xing void *dev_data; /* Pointer to the device data */ 971082a773SBeilei Xing uint16_t max_pkt_len; /* Maximum packet length */ 981082a773SBeilei Xing 991082a773SBeilei Xing /* RSS info */ 1001082a773SBeilei Xing uint32_t *rss_lut; 1011082a773SBeilei Xing uint8_t *rss_key; 1021082a773SBeilei Xing uint64_t rss_hf; 103e4f3de91SMingxia Liu uint64_t last_general_rss_hf; 1041082a773SBeilei Xing 1051082a773SBeilei Xing /* MSIX info*/ 1061082a773SBeilei Xing struct virtchnl2_queue_vector *qv_map; /* queue vector mapping */ 1071082a773SBeilei Xing uint16_t max_vectors; 1081082a773SBeilei Xing struct virtchnl2_alloc_vectors *recv_vectors; 1091082a773SBeilei Xing 1101082a773SBeilei Xing /* Chunk info */ 1111082a773SBeilei Xing struct idpf_chunks_info chunks_info; 1121082a773SBeilei Xing 1131082a773SBeilei Xing uint16_t devarg_id; 1141082a773SBeilei Xing 115da8906c2SBeilei Xing bool rx_vec_allowed; 116da8906c2SBeilei Xing bool tx_vec_allowed; 117da8906c2SBeilei Xing bool rx_use_avx512; 118da8906c2SBeilei Xing bool tx_use_avx512; 1197514d76dSMingxia Liu 1207514d76dSMingxia Liu struct virtchnl2_vport_stats eth_stats_offset; 121d633a485SMingxia Liu 122d633a485SMingxia Liu /* Event from ipf */ 123d633a485SMingxia Liu bool link_up; 124d633a485SMingxia Liu uint32_t link_speed; 1251082a773SBeilei Xing }; 1261082a773SBeilei Xing 12773c9b8c3SBeilei Xing /* Message type read in virtual channel from PF */ 12873c9b8c3SBeilei Xing enum idpf_vc_result { 12973c9b8c3SBeilei Xing IDPF_MSG_ERR = -1, /* Meet error when accessing admin queue */ 13073c9b8c3SBeilei Xing IDPF_MSG_NON, /* Read nothing from admin queue */ 13173c9b8c3SBeilei Xing IDPF_MSG_SYS, /* Read system msg from admin queue */ 13273c9b8c3SBeilei Xing IDPF_MSG_CMD, /* Read async command result */ 13373c9b8c3SBeilei Xing }; 13473c9b8c3SBeilei Xing 13573c9b8c3SBeilei Xing /* structure used for sending and checking response of virtchnl ops */ 13673c9b8c3SBeilei Xing struct idpf_cmd_info { 13773c9b8c3SBeilei Xing uint32_t ops; 13873c9b8c3SBeilei Xing uint8_t *in_args; /* buffer for sending */ 13973c9b8c3SBeilei Xing uint32_t in_args_size; /* buffer size for sending */ 14073c9b8c3SBeilei Xing uint8_t *out_buffer; /* buffer for response */ 14173c9b8c3SBeilei Xing uint32_t out_size; /* buffer size for response */ 14273c9b8c3SBeilei Xing }; 14373c9b8c3SBeilei Xing 14473c9b8c3SBeilei Xing /* notify current command done. Only call in case execute 14573c9b8c3SBeilei Xing * _atomic_set_cmd successfully. 14673c9b8c3SBeilei Xing */ 14773c9b8c3SBeilei Xing static inline void 14873c9b8c3SBeilei Xing notify_cmd(struct idpf_adapter *adapter, int msg_ret) 14973c9b8c3SBeilei Xing { 15073c9b8c3SBeilei Xing adapter->cmd_retval = msg_ret; 15173c9b8c3SBeilei Xing /* Return value may be checked in anither thread, need to ensure the coherence. */ 15273c9b8c3SBeilei Xing rte_wmb(); 15373c9b8c3SBeilei Xing adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN; 15473c9b8c3SBeilei Xing } 15573c9b8c3SBeilei Xing 15673c9b8c3SBeilei Xing /* clear current command. Only call in case execute 15773c9b8c3SBeilei Xing * _atomic_set_cmd successfully. 15873c9b8c3SBeilei Xing */ 15973c9b8c3SBeilei Xing static inline void 16073c9b8c3SBeilei Xing clear_cmd(struct idpf_adapter *adapter) 16173c9b8c3SBeilei Xing { 16273c9b8c3SBeilei Xing /* Return value may be checked in anither thread, need to ensure the coherence. */ 16373c9b8c3SBeilei Xing rte_wmb(); 16473c9b8c3SBeilei Xing adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN; 16573c9b8c3SBeilei Xing adapter->cmd_retval = VIRTCHNL_STATUS_SUCCESS; 16673c9b8c3SBeilei Xing } 16773c9b8c3SBeilei Xing 16873c9b8c3SBeilei Xing /* Check there is pending cmd in execution. If none, set new command. */ 16973c9b8c3SBeilei Xing static inline bool 17073c9b8c3SBeilei Xing atomic_set_cmd(struct idpf_adapter *adapter, uint32_t ops) 17173c9b8c3SBeilei Xing { 17273c9b8c3SBeilei Xing uint32_t op_unk = VIRTCHNL2_OP_UNKNOWN; 17373c9b8c3SBeilei Xing bool ret = __atomic_compare_exchange(&adapter->pend_cmd, &op_unk, &ops, 17473c9b8c3SBeilei Xing 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); 17573c9b8c3SBeilei Xing 17673c9b8c3SBeilei Xing if (!ret) 17773c9b8c3SBeilei Xing DRV_LOG(ERR, "There is incomplete cmd %d", adapter->pend_cmd); 17873c9b8c3SBeilei Xing 17973c9b8c3SBeilei Xing return !ret; 18073c9b8c3SBeilei Xing } 18173c9b8c3SBeilei Xing 182b2f9d478SBeilei Xing __rte_internal 183b2f9d478SBeilei Xing int idpf_adapter_init(struct idpf_adapter *adapter); 184b2f9d478SBeilei Xing __rte_internal 185b2f9d478SBeilei Xing int idpf_adapter_deinit(struct idpf_adapter *adapter); 186c2769cadSBeilei Xing __rte_internal 187c2769cadSBeilei Xing int idpf_vport_init(struct idpf_vport *vport, 188c2769cadSBeilei Xing struct virtchnl2_create_vport *vport_req_info, 189c2769cadSBeilei Xing void *dev_data); 190c2769cadSBeilei Xing __rte_internal 191c2769cadSBeilei Xing int idpf_vport_deinit(struct idpf_vport *vport); 1921d33ffdfSBeilei Xing __rte_internal 193513a7eceSBeilei Xing int idpf_vport_rss_config(struct idpf_vport *vport); 194ddb59a7dSBeilei Xing __rte_internal 195513a7eceSBeilei Xing int idpf_vport_irq_map_config(struct idpf_vport *vport, uint16_t nb_rx_queues); 196ddb59a7dSBeilei Xing __rte_internal 197513a7eceSBeilei Xing int idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t nb_rx_queues); 1987f47b20bSBeilei Xing __rte_internal 199513a7eceSBeilei Xing int idpf_vport_info_init(struct idpf_vport *vport, 2007f47b20bSBeilei Xing struct virtchnl2_create_vport *vport_info); 2017514d76dSMingxia Liu __rte_internal 2027514d76dSMingxia Liu void idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct virtchnl2_vport_stats *nes); 203*1e8c00f5SBeilei Xing __rte_internal 204*1e8c00f5SBeilei Xing int idpf_vport_irq_map_config_by_qids(struct idpf_vport *vport, 205*1e8c00f5SBeilei Xing uint32_t *qids, 206*1e8c00f5SBeilei Xing uint16_t nb_rx_queues); 207b2f9d478SBeilei Xing 2082095717fSBeilei Xing #endif /* _IDPF_COMMON_DEVICE_H_ */ 209