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