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
34811bbeabSBeilei Xing #define IDPF_RX_MAX_PTYPE_PROTO_IDS 32
35811bbeabSBeilei Xing #define IDPF_RX_MAX_PTYPE_SZ (sizeof(struct virtchnl2_ptype) + \
36811bbeabSBeilei Xing (sizeof(uint16_t) * \
37811bbeabSBeilei Xing (IDPF_RX_MAX_PTYPE_PROTO_IDS - 1)))
38811bbeabSBeilei Xing #define IDPF_RX_PTYPE_HDR_SZ (sizeof(struct virtchnl2_get_ptype_info) - \
39811bbeabSBeilei Xing sizeof(struct virtchnl2_ptype))
40811bbeabSBeilei Xing #define IDPF_RX_MAX_PTYPES_PER_BUF \
41811bbeabSBeilei Xing ((IDPF_DFLT_MBX_BUF_SIZE - IDPF_RX_PTYPE_HDR_SZ)/ \
42811bbeabSBeilei Xing IDPF_RX_MAX_PTYPE_SZ)
431b828adfSBeilei Xing #define IDPF_GET_PTYPE_SIZE(p) \
441b828adfSBeilei Xing (sizeof(struct virtchnl2_ptype) + \
451b828adfSBeilei Xing (((p)->proto_id_count ? ((p)->proto_id_count - 1) : 0) * sizeof((p)->proto_id[0])))
461b828adfSBeilei Xing
472095717fSBeilei Xing struct idpf_adapter {
482095717fSBeilei Xing struct idpf_hw hw;
492095717fSBeilei Xing struct virtchnl2_version_info virtchnl_version;
502095717fSBeilei Xing struct virtchnl2_get_capabilities caps;
51*e12a0166STyler Retzlaff volatile RTE_ATOMIC(uint32_t) pend_cmd; /* pending command not finished */
522095717fSBeilei Xing uint32_t cmd_retval; /* return value of the cmd response from cp */
532095717fSBeilei Xing uint8_t *mbx_resp; /* buffer to store the mailbox response from cp */
541b828adfSBeilei Xing
5527595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_MIN_SIZE) uint32_t ptype_tbl[IDPF_MAX_PKT_TYPE];
567f47b20bSBeilei Xing
57181348d3SMingxia Liu bool is_tx_singleq; /* true - single queue model, false - split queue model */
58181348d3SMingxia Liu bool is_rx_singleq; /* true - single queue model, false - split queue model */
598c6098afSBeilei Xing
608c6098afSBeilei Xing /* For timestamp */
618c6098afSBeilei Xing uint64_t time_hw;
622095717fSBeilei Xing };
632095717fSBeilei Xing
641082a773SBeilei Xing struct idpf_chunks_info {
651082a773SBeilei Xing uint32_t tx_start_qid;
661082a773SBeilei Xing uint32_t rx_start_qid;
671082a773SBeilei Xing /* Valid only if split queue model */
681082a773SBeilei Xing uint32_t tx_compl_start_qid;
691082a773SBeilei Xing uint32_t rx_buf_start_qid;
701082a773SBeilei Xing
711082a773SBeilei Xing uint64_t tx_qtail_start;
721082a773SBeilei Xing uint32_t tx_qtail_spacing;
731082a773SBeilei Xing uint64_t rx_qtail_start;
741082a773SBeilei Xing uint32_t rx_qtail_spacing;
751082a773SBeilei Xing uint64_t tx_compl_qtail_start;
761082a773SBeilei Xing uint32_t tx_compl_qtail_spacing;
771082a773SBeilei Xing uint64_t rx_buf_qtail_start;
781082a773SBeilei Xing uint32_t rx_buf_qtail_spacing;
791082a773SBeilei Xing };
801082a773SBeilei Xing
811082a773SBeilei Xing struct idpf_vport {
821082a773SBeilei Xing struct idpf_adapter *adapter; /* Backreference to associated adapter */
83c2769cadSBeilei Xing union {
84c2769cadSBeilei Xing struct virtchnl2_create_vport info; /* virtchnl response info handling */
85c2769cadSBeilei Xing uint8_t data[IDPF_DFLT_MBX_BUF_SIZE];
86c2769cadSBeilei Xing } vport_info;
871082a773SBeilei Xing uint16_t sw_idx; /* SW index in adapter->vports[]*/
881082a773SBeilei Xing uint16_t vport_id;
891082a773SBeilei Xing uint32_t txq_model;
901082a773SBeilei Xing uint32_t rxq_model;
911082a773SBeilei Xing uint16_t num_tx_q;
921082a773SBeilei Xing /* valid only if txq_model is split Q */
931082a773SBeilei Xing uint16_t num_tx_complq;
941082a773SBeilei Xing uint16_t num_rx_q;
951082a773SBeilei Xing /* valid only if rxq_model is split Q */
961082a773SBeilei Xing uint16_t num_rx_bufq;
971082a773SBeilei Xing
981082a773SBeilei Xing uint16_t max_mtu;
991082a773SBeilei Xing uint8_t default_mac_addr[VIRTCHNL_ETH_LENGTH_OF_ADDRESS];
1001082a773SBeilei Xing
1011082a773SBeilei Xing enum virtchnl_rss_algorithm rss_algorithm;
1021082a773SBeilei Xing uint16_t rss_key_size;
1031082a773SBeilei Xing uint16_t rss_lut_size;
1041082a773SBeilei Xing
1051082a773SBeilei Xing void *dev_data; /* Pointer to the device data */
1061082a773SBeilei Xing uint16_t max_pkt_len; /* Maximum packet length */
1071082a773SBeilei Xing
1081082a773SBeilei Xing /* RSS info */
1091082a773SBeilei Xing uint32_t *rss_lut;
1101082a773SBeilei Xing uint8_t *rss_key;
1111082a773SBeilei Xing uint64_t rss_hf;
112e4f3de91SMingxia Liu uint64_t last_general_rss_hf;
1131082a773SBeilei Xing
1141082a773SBeilei Xing /* MSIX info*/
1151082a773SBeilei Xing struct virtchnl2_queue_vector *qv_map; /* queue vector mapping */
1161082a773SBeilei Xing uint16_t max_vectors;
1171082a773SBeilei Xing struct virtchnl2_alloc_vectors *recv_vectors;
1181082a773SBeilei Xing
1191082a773SBeilei Xing /* Chunk info */
1201082a773SBeilei Xing struct idpf_chunks_info chunks_info;
1211082a773SBeilei Xing
1221082a773SBeilei Xing uint16_t devarg_id;
1231082a773SBeilei Xing
124da8906c2SBeilei Xing bool rx_vec_allowed;
125da8906c2SBeilei Xing bool tx_vec_allowed;
126da8906c2SBeilei Xing bool rx_use_avx512;
127da8906c2SBeilei Xing bool tx_use_avx512;
1287514d76dSMingxia Liu
1297514d76dSMingxia Liu struct virtchnl2_vport_stats eth_stats_offset;
130d633a485SMingxia Liu
131d633a485SMingxia Liu /* Event from ipf */
132d633a485SMingxia Liu bool link_up;
133d633a485SMingxia Liu uint32_t link_speed;
1341082a773SBeilei Xing };
1351082a773SBeilei Xing
13673c9b8c3SBeilei Xing /* Message type read in virtual channel from PF */
13773c9b8c3SBeilei Xing enum idpf_vc_result {
13873c9b8c3SBeilei Xing IDPF_MSG_ERR = -1, /* Meet error when accessing admin queue */
13973c9b8c3SBeilei Xing IDPF_MSG_NON, /* Read nothing from admin queue */
14073c9b8c3SBeilei Xing IDPF_MSG_SYS, /* Read system msg from admin queue */
14173c9b8c3SBeilei Xing IDPF_MSG_CMD, /* Read async command result */
14273c9b8c3SBeilei Xing };
14373c9b8c3SBeilei Xing
14473c9b8c3SBeilei Xing /* structure used for sending and checking response of virtchnl ops */
14573c9b8c3SBeilei Xing struct idpf_cmd_info {
14673c9b8c3SBeilei Xing uint32_t ops;
14773c9b8c3SBeilei Xing uint8_t *in_args; /* buffer for sending */
14873c9b8c3SBeilei Xing uint32_t in_args_size; /* buffer size for sending */
14973c9b8c3SBeilei Xing uint8_t *out_buffer; /* buffer for response */
15073c9b8c3SBeilei Xing uint32_t out_size; /* buffer size for response */
15173c9b8c3SBeilei Xing };
15273c9b8c3SBeilei Xing
15373c9b8c3SBeilei Xing /* notify current command done. Only call in case execute
15473c9b8c3SBeilei Xing * _atomic_set_cmd successfully.
15573c9b8c3SBeilei Xing */
15673c9b8c3SBeilei Xing static inline void
notify_cmd(struct idpf_adapter * adapter,int msg_ret)15773c9b8c3SBeilei Xing notify_cmd(struct idpf_adapter *adapter, int msg_ret)
15873c9b8c3SBeilei Xing {
15973c9b8c3SBeilei Xing adapter->cmd_retval = msg_ret;
16073c9b8c3SBeilei Xing /* Return value may be checked in anither thread, need to ensure the coherence. */
16173c9b8c3SBeilei Xing rte_wmb();
16273c9b8c3SBeilei Xing adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN;
16373c9b8c3SBeilei Xing }
16473c9b8c3SBeilei Xing
16573c9b8c3SBeilei Xing /* clear current command. Only call in case execute
16673c9b8c3SBeilei Xing * _atomic_set_cmd successfully.
16773c9b8c3SBeilei Xing */
16873c9b8c3SBeilei Xing static inline void
clear_cmd(struct idpf_adapter * adapter)16973c9b8c3SBeilei Xing clear_cmd(struct idpf_adapter *adapter)
17073c9b8c3SBeilei Xing {
17173c9b8c3SBeilei Xing /* Return value may be checked in anither thread, need to ensure the coherence. */
17273c9b8c3SBeilei Xing rte_wmb();
17373c9b8c3SBeilei Xing adapter->pend_cmd = VIRTCHNL2_OP_UNKNOWN;
17473c9b8c3SBeilei Xing adapter->cmd_retval = VIRTCHNL_STATUS_SUCCESS;
17573c9b8c3SBeilei Xing }
17673c9b8c3SBeilei Xing
17773c9b8c3SBeilei Xing /* Check there is pending cmd in execution. If none, set new command. */
17873c9b8c3SBeilei Xing static inline bool
atomic_set_cmd(struct idpf_adapter * adapter,uint32_t ops)17973c9b8c3SBeilei Xing atomic_set_cmd(struct idpf_adapter *adapter, uint32_t ops)
18073c9b8c3SBeilei Xing {
18173c9b8c3SBeilei Xing uint32_t op_unk = VIRTCHNL2_OP_UNKNOWN;
182*e12a0166STyler Retzlaff bool ret = rte_atomic_compare_exchange_strong_explicit(&adapter->pend_cmd, &op_unk, ops,
183*e12a0166STyler Retzlaff rte_memory_order_acquire, rte_memory_order_acquire);
18473c9b8c3SBeilei Xing
18573c9b8c3SBeilei Xing if (!ret)
18673c9b8c3SBeilei Xing DRV_LOG(ERR, "There is incomplete cmd %d", adapter->pend_cmd);
18773c9b8c3SBeilei Xing
18873c9b8c3SBeilei Xing return !ret;
18973c9b8c3SBeilei Xing }
19073c9b8c3SBeilei Xing
191b2f9d478SBeilei Xing __rte_internal
192b2f9d478SBeilei Xing int idpf_adapter_init(struct idpf_adapter *adapter);
193b2f9d478SBeilei Xing __rte_internal
194b2f9d478SBeilei Xing int idpf_adapter_deinit(struct idpf_adapter *adapter);
195c2769cadSBeilei Xing __rte_internal
196c2769cadSBeilei Xing int idpf_vport_init(struct idpf_vport *vport,
197c2769cadSBeilei Xing struct virtchnl2_create_vport *vport_req_info,
198c2769cadSBeilei Xing void *dev_data);
199c2769cadSBeilei Xing __rte_internal
200c2769cadSBeilei Xing int idpf_vport_deinit(struct idpf_vport *vport);
2011d33ffdfSBeilei Xing __rte_internal
202513a7eceSBeilei Xing int idpf_vport_rss_config(struct idpf_vport *vport);
203ddb59a7dSBeilei Xing __rte_internal
204513a7eceSBeilei Xing int idpf_vport_irq_map_config(struct idpf_vport *vport, uint16_t nb_rx_queues);
205ddb59a7dSBeilei Xing __rte_internal
206513a7eceSBeilei Xing int idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t nb_rx_queues);
2077f47b20bSBeilei Xing __rte_internal
208513a7eceSBeilei Xing int idpf_vport_info_init(struct idpf_vport *vport,
2097f47b20bSBeilei Xing struct virtchnl2_create_vport *vport_info);
2107514d76dSMingxia Liu __rte_internal
2117514d76dSMingxia Liu void idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct virtchnl2_vport_stats *nes);
2121e8c00f5SBeilei Xing __rte_internal
2131e8c00f5SBeilei Xing int idpf_vport_irq_map_config_by_qids(struct idpf_vport *vport,
2141e8c00f5SBeilei Xing uint32_t *qids,
2151e8c00f5SBeilei Xing uint16_t nb_rx_queues);
216b2f9d478SBeilei Xing
2172095717fSBeilei Xing #endif /* _IDPF_COMMON_DEVICE_H_ */
218