xref: /dpdk/drivers/common/idpf/idpf_common_device.h (revision e12a0166c80f65e35408f4715b2f3a60763c3741)
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