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#define IDPF_VC_XN_MIN_TIMEOUT_MSEC 2000
8#define IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC (60 * 1000)
9#define IDPF_VC_XN_IDX_M GENMASK(7, 0)
10#define IDPF_VC_XN_SALT_M GENMASK(15, 8)
11#define IDPF_VC_XN_RING_LEN U8_MAX
12
13/**
14 * enum idpf_vc_xn_state - Virtchnl transaction status
15 * @IDPF_VC_XN_IDLE: not expecting a reply, ready to be used
16 * @IDPF_VC_XN_WAITING: expecting a reply, not yet received
17 * @IDPF_VC_XN_COMPLETED_SUCCESS: a reply was expected and received, buffer
18 * updated
19 * @IDPF_VC_XN_COMPLETED_FAILED: a reply was expected and received, but there
20 * was an error, buffer not updated
21 * @IDPF_VC_XN_SHUTDOWN: transaction object cannot be used, VC torn down
22 * @IDPF_VC_XN_ASYNC: transaction sent asynchronously and doesn't have the
23 * return context; a callback may be provided to handle
24 * return
25 */
26enum idpf_vc_xn_state {
27 IDPF_VC_XN_IDLE = 1,
28 IDPF_VC_XN_WAITING,
29 IDPF_VC_XN_COMPLETED_SUCCESS,
30 IDPF_VC_XN_COMPLETED_FAILED,
31 IDPF_VC_XN_SHUTDOWN,
32 IDPF_VC_XN_ASYNC,
33};
34
35struct idpf_vc_xn;
36/* Callback for asynchronous messages */
37typedef int (*async_vc_cb) (struct idpf_adapter *, struct idpf_vc_xn *,
38 const struct idpf_ctlq_msg *);
39
40/**
41 * struct idpf_vc_xn - Data structure representing virtchnl transactions
42 * @completed: virtchnl event loop uses that to signal when a reply is
43 * available, uses kernel completion API
44 * @state: virtchnl event loop stores the data below, protected by the
45 * completion's lock.
46 * @reply_sz: Original size of reply, may be > reply_buf.iov_len; it will be
47 * truncated on its way to the receiver thread according to
48 * reply_buf.iov_len.
49 * @reply: Reference to the buffer(s) where the reply data should be written
50 * to. May be 0-length (then NULL address permitted) if the reply data
51 * should be ignored.
52 * @async_handler: if sent asynchronously, a callback can be provided to handle
53 * the reply when it's received
54 * @vc_op: corresponding opcode sent with this transaction
55 * @idx: index used as retrieval on reply receive, used for cookie
56 * @salt: changed every message to make unique, used for cookie
57 */
58struct idpf_vc_xn {
59 struct completion completed;
60 enum idpf_vc_xn_state state;
61 size_t reply_sz;
62 struct kvec reply;
63 async_vc_cb async_handler;
64 u32 vc_op;
65 u8 idx;
66 u8 salt;
67};
68
69/**
70 * struct idpf_vc_xn_params - Parameters for executing transaction
71 * @send_buf: kvec for send buffer
72 * @recv_buf: kvec for recv buffer, may be NULL, must then have zero length
73 * @timeout_ms: timeout to wait for reply
74 * @async: send message asynchronously, will not wait on completion
75 * @async_handler: If sent asynchronously, optional callback handler. The user
76 * must be careful when using async handlers as the memory for
77 * the recv_buf _cannot_ be on stack if this is async.
78 * @vc_op: virtchnl op to send
79 */
80struct idpf_vc_xn_params {
81 struct kvec send_buf;
82 struct kvec recv_buf;
83 int timeout_ms;
84 bool async;
85 async_vc_cb async_handler;
86 u32 vc_op;
87};
88
89struct idpf_adapter;
90struct idpf_netdev_priv;
91struct idpf_vec_regs;
92struct idpf_vport;
93struct idpf_vport_max_q;
94struct idpf_vport_user_config_data;
95
96ssize_t idpf_vc_xn_exec(struct idpf_adapter *adapter,
97 const struct idpf_vc_xn_params *params);
98int idpf_init_dflt_mbx(struct idpf_adapter *adapter);
99void idpf_deinit_dflt_mbx(struct idpf_adapter *adapter);
100int idpf_vc_core_init(struct idpf_adapter *adapter);
101void idpf_vc_core_deinit(struct idpf_adapter *adapter);
102
103int idpf_get_reg_intr_vecs(struct idpf_vport *vport,
104 struct idpf_vec_regs *reg_vals);
105int idpf_queue_reg_init(struct idpf_vport *vport);
106int idpf_vport_queue_ids_init(struct idpf_vport *vport);
107
108int idpf_recv_mb_msg(struct idpf_adapter *adapter);
109int idpf_send_mb_msg(struct idpf_adapter *adapter, u32 op,
110 u16 msg_size, u8 *msg, u16 cookie);
111
112void idpf_vport_init(struct idpf_vport *vport, struct idpf_vport_max_q *max_q);
113u32 idpf_get_vport_id(struct idpf_vport *vport);
114int idpf_send_create_vport_msg(struct idpf_adapter *adapter,
115 struct idpf_vport_max_q *max_q);
116int idpf_send_destroy_vport_msg(struct idpf_vport *vport);
117int idpf_send_enable_vport_msg(struct idpf_vport *vport);
118int idpf_send_disable_vport_msg(struct idpf_vport *vport);
119
120int idpf_vport_adjust_qs(struct idpf_vport *vport);
121int idpf_vport_alloc_max_qs(struct idpf_adapter *adapter,
122 struct idpf_vport_max_q *max_q);
123void idpf_vport_dealloc_max_qs(struct idpf_adapter *adapter,
124 struct idpf_vport_max_q *max_q);
125int idpf_send_add_queues_msg(const struct idpf_vport *vport, u16 num_tx_q,
126 u16 num_complq, u16 num_rx_q, u16 num_rx_bufq);
127int idpf_send_delete_queues_msg(struct idpf_vport *vport);
128int idpf_send_enable_queues_msg(struct idpf_vport *vport);
129int idpf_send_disable_queues_msg(struct idpf_vport *vport);
130int idpf_send_config_queues_msg(struct idpf_vport *vport);
131
132int idpf_vport_alloc_vec_indexes(struct idpf_vport *vport);
133int idpf_get_vec_ids(struct idpf_adapter *adapter,
134 u16 *vecids, int num_vecids,
135 struct virtchnl2_vector_chunks *chunks);
136int idpf_send_alloc_vectors_msg(struct idpf_adapter *adapter, u16 num_vectors);
137int idpf_send_dealloc_vectors_msg(struct idpf_adapter *adapter);
138int idpf_send_map_unmap_queue_vector_msg(struct idpf_vport *vport, bool map);
139
140int idpf_add_del_mac_filters(struct idpf_vport *vport,
141 struct idpf_netdev_priv *np,
142 bool add, bool async);
143int idpf_set_promiscuous(struct idpf_adapter *adapter,
144 struct idpf_vport_user_config_data *config_data,
145 u32 vport_id);
146int idpf_check_supported_desc_ids(struct idpf_vport *vport);
147int idpf_send_get_rx_ptype_msg(struct idpf_vport *vport);
148int idpf_send_ena_dis_loopback_msg(struct idpf_vport *vport);
149int idpf_send_get_stats_msg(struct idpf_vport *vport);
150int idpf_send_set_sriov_vfs_msg(struct idpf_adapter *adapter, u16 num_vfs);
151int idpf_send_get_set_rss_key_msg(struct idpf_vport *vport, bool get);
152int idpf_send_get_set_rss_lut_msg(struct idpf_vport *vport, bool get);
153void idpf_vc_xn_shutdown(struct idpf_vc_xn_manager *vcxn_mngr);
154
155#endif /* _IDPF_VIRTCHNL_H_ */
156

source code of linux/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h