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