xref: /linux/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (C) 2024 Intel Corporation */
3 
4 #ifndef _IDPF_VIRTCHNL_H_
5 #define _IDPF_VIRTCHNL_H_
6 
7 #include <linux/net/intel/virtchnl2.h>
8 
9 #define IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC	(60 * 1000)
10 
11 struct idpf_adapter;
12 struct idpf_netdev_priv;
13 struct idpf_vec_regs;
14 struct idpf_vport;
15 struct idpf_vport_max_q;
16 struct idpf_vport_config;
17 struct idpf_vport_user_config_data;
18 
19 int idpf_init_dflt_mbx(struct idpf_adapter *adapter);
20 void idpf_deinit_dflt_mbx(struct idpf_adapter *adapter);
21 int idpf_vc_core_init(struct idpf_adapter *adapter);
22 void idpf_vc_core_deinit(struct idpf_adapter *adapter);
23 
24 int idpf_get_reg_intr_vecs(struct idpf_adapter *adapter,
25 			   struct idpf_vec_regs *reg_vals, int num_vecs);
26 int idpf_queue_reg_init(struct idpf_vport *vport,
27 			struct idpf_q_vec_rsrc *rsrc,
28 			struct idpf_queue_id_reg_info *chunks);
29 int idpf_vport_queue_ids_init(struct idpf_vport *vport,
30 			      struct idpf_q_vec_rsrc *rsrc,
31 			      struct idpf_queue_id_reg_info *chunks);
32 static inline void
idpf_vport_deinit_queue_reg_chunks(struct idpf_vport_config * vport_cfg)33 idpf_vport_deinit_queue_reg_chunks(struct idpf_vport_config *vport_cfg)
34 {
35 	kfree(vport_cfg->qid_reg_info.queue_chunks);
36 	vport_cfg->qid_reg_info.queue_chunks = NULL;
37 }
38 
39 bool idpf_vport_is_cap_ena(struct idpf_vport *vport, u16 flag);
40 bool idpf_sideband_flow_type_ena(struct idpf_vport *vport, u32 flow_type);
41 bool idpf_sideband_action_ena(struct idpf_vport *vport,
42 			      struct ethtool_rx_flow_spec *fsp);
43 unsigned int idpf_fsteer_max_rules(struct idpf_vport *vport);
44 
45 void idpf_recv_event_msg(struct libie_ctlq_ctx *ctx,
46 			 struct libie_ctlq_msg *ctlq_msg);
47 int idpf_send_mb_msg(struct idpf_adapter *adapter,
48 		     struct libie_ctlq_xn_send_params *xn_params,
49 		     void *send_buf, size_t send_buf_size);
50 int idpf_send_mb_msg_kfree(struct idpf_adapter *adapter,
51 			   struct libie_ctlq_xn_send_params *xn_params,
52 			   void *send_buf, size_t send_buf_size);
53 void idpf_send_vf_reset_msg(struct idpf_adapter *adapter);
54 bool idpf_mmio_region_non_static(struct libie_mmio_info *mmio_info,
55 				 struct libie_pci_mmio_region *reg);
56 
57 /**
58  * idpf_send_mb_msg_stack - send a mailbox message from an on-stack buffer
59  * @adapter: driver specific private structure
60  * @xn_params: Xn send parameters to fill
61  * @ptr: pointer to the on-stack message object to send
62  *
63  * Send size is deduced based on the pointer type.
64  *
65  * Return: %0 on success, -%errno on failure.
66  */
67 #define idpf_send_mb_msg_stack(adapter, xn_params, ptr)			\
68 ({									\
69 	typeof(ptr) __ptr = (ptr);					\
70 									\
71 	static_assert(sizeof(*__ptr) <= LIBIE_CP_TX_COPYBREAK);		\
72 	idpf_send_mb_msg(adapter, xn_params, __ptr, sizeof(*__ptr));	\
73 })
74 
75 struct idpf_queue_ptr {
76 	enum virtchnl2_queue_type	type;
77 	union {
78 		struct idpf_rx_queue		*rxq;
79 		struct idpf_tx_queue		*txq;
80 		struct idpf_buf_queue		*bufq;
81 		struct idpf_compl_queue		*complq;
82 	};
83 };
84 
85 struct idpf_queue_set {
86 	struct idpf_adapter		*adapter;
87 	struct idpf_q_vec_rsrc		*qv_rsrc;
88 	u32				vport_id;
89 
90 	u32				num;
91 	struct idpf_queue_ptr		qs[] __counted_by(num);
92 };
93 
94 struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_adapter *adapter,
95 					    struct idpf_q_vec_rsrc *rsrc,
96 					    u32 vport_id, u32 num);
97 
98 int idpf_send_enable_queue_set_msg(const struct idpf_queue_set *qs);
99 int idpf_send_disable_queue_set_msg(const struct idpf_queue_set *qs);
100 int idpf_send_config_queue_set_msg(const struct idpf_queue_set *qs);
101 
102 int idpf_send_disable_queues_msg(struct idpf_vport *vport);
103 int idpf_send_enable_queues_msg(struct idpf_vport *vport);
104 int idpf_send_config_queues_msg(struct idpf_adapter *adapter,
105 				struct idpf_q_vec_rsrc *rsrc,
106 				u32 vport_id);
107 
108 int idpf_vport_init(struct idpf_vport *vport, struct idpf_vport_max_q *max_q);
109 u32 idpf_get_vport_id(struct idpf_vport *vport);
110 int idpf_send_create_vport_msg(struct idpf_adapter *adapter,
111 			       struct idpf_vport_max_q *max_q);
112 int idpf_send_destroy_vport_msg(struct idpf_adapter *adapter, u32 vport_id);
113 int idpf_send_enable_vport_msg(struct idpf_adapter *adapter, u32 vport_id);
114 int idpf_send_disable_vport_msg(struct idpf_adapter *adapter, u32 vport_id);
115 
116 int idpf_vport_adjust_qs(struct idpf_vport *vport,
117 			 struct idpf_q_vec_rsrc *rsrc);
118 int idpf_vport_alloc_max_qs(struct idpf_adapter *adapter,
119 			    struct idpf_vport_max_q *max_q);
120 void idpf_vport_dealloc_max_qs(struct idpf_adapter *adapter,
121 			       struct idpf_vport_max_q *max_q);
122 int idpf_send_add_queues_msg(struct idpf_adapter *adapter,
123 			     struct idpf_vport_config *vport_config,
124 			     struct idpf_q_vec_rsrc *rsrc,
125 			     u32 vport_id);
126 int idpf_send_delete_queues_msg(struct idpf_adapter *adapter,
127 				struct idpf_queue_id_reg_info *chunks,
128 				u32 vport_id);
129 
130 int idpf_vport_alloc_vec_indexes(struct idpf_vport *vport,
131 				 struct idpf_q_vec_rsrc *rsrc);
132 int idpf_get_vec_ids(struct idpf_adapter *adapter,
133 		     u16 *vecids, int num_vecids,
134 		     struct virtchnl2_vector_chunks *chunks);
135 int idpf_send_alloc_vectors_msg(struct idpf_adapter *adapter, u16 num_vectors);
136 int idpf_send_dealloc_vectors_msg(struct idpf_adapter *adapter);
137 int idpf_send_map_unmap_queue_vector_msg(struct idpf_adapter *adapter,
138 					 struct idpf_q_vec_rsrc *rsrc,
139 					 u32 vport_id,
140 					 bool map);
141 
142 int idpf_add_del_mac_filters(struct idpf_adapter *adapter,
143 			     struct idpf_vport_config *vport_config,
144 			     const u8 *default_mac_addr, u32 vport_id,
145 			     bool add, bool async);
146 int idpf_set_promiscuous(struct idpf_adapter *adapter,
147 			 struct idpf_vport_user_config_data *config_data,
148 			 u32 vport_id);
149 int idpf_check_supported_desc_ids(struct idpf_vport *vport);
150 int idpf_send_ena_dis_loopback_msg(struct idpf_adapter *adapter, u32 vport_id,
151 				   bool loopback_ena);
152 int idpf_send_get_stats_msg(struct idpf_netdev_priv *np,
153 			    struct idpf_port_stats *port_stats);
154 int idpf_send_set_sriov_vfs_msg(struct idpf_adapter *adapter, u16 num_vfs);
155 int idpf_send_set_rss_key_msg(struct idpf_adapter *adapter,
156 			      struct idpf_rss_data *rss_data, u32 vport_id);
157 int idpf_send_set_rss_lut_msg(struct idpf_adapter *adapter,
158 			      struct idpf_rss_data *rss_data, u32 vport_id);
159 int idpf_idc_rdma_vc_send_sync(struct iidc_rdma_core_dev_info *cdev_info,
160 			       u8 *send_msg, u16 msg_size,
161 			       u8 *recv_msg, u16 *recv_len);
162 
163 #endif /* _IDPF_VIRTCHNL_H_ */
164