1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2 /* QLogic qed NIC Driver
3  * Copyright (c) 2015-2017  QLogic Corporation
4  * Copyright (c) 2019-2020 Marvell International Ltd.
5  */
6 
7 #ifndef _QED_LL2_H
8 #define _QED_LL2_H
9 
10 #include <linux/types.h>
11 #include <linux/kernel.h>
12 #include <linux/list.h>
13 #include <linux/mutex.h>
14 #include <linux/slab.h>
15 #include <linux/spinlock.h>
16 #include <linux/qed/qed_chain.h>
17 #include <linux/qed/qed_ll2_if.h>
18 #include "qed.h"
19 #include "qed_hsi.h"
20 #include "qed_sp.h"
21 
22 #define QED_MAX_NUM_OF_LL2_CONNECTIONS                    (4)
23 /* LL2 queues handles will be split as follows:
24  * first will be legacy queues, and then the ctx based queues.
25  */
26 #define QED_MAX_NUM_OF_LL2_CONNS_PF            (4)
27 #define QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF   (3)
28 
29 #define QED_MAX_NUM_OF_CTX_LL2_CONNS_PF	\
30 	(QED_MAX_NUM_OF_LL2_CONNS_PF - QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF)
31 
32 #define QED_LL2_LEGACY_CONN_BASE_PF     0
33 #define QED_LL2_CTX_CONN_BASE_PF        QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF
34 
35 
36 struct qed_ll2_rx_packet {
37 	struct list_head list_entry;
38 	struct core_rx_bd_with_buff_len *rxq_bd;
39 	dma_addr_t rx_buf_addr;
40 	u16 buf_length;
41 	void *cookie;
42 	u8 placement_offset;
43 	u16 parse_flags;
44 	u16 packet_length;
45 	u16 vlan;
46 	u32 opaque_data[2];
47 };
48 
49 struct qed_ll2_tx_packet {
50 	struct list_head list_entry;
51 	u16 bd_used;
52 	bool notify_fw;
53 	void *cookie;
54 	/* Flexible Array of bds_set determined by max_bds_per_packet */
55 	struct {
56 		struct core_tx_bd *txq_bd;
57 		dma_addr_t tx_frag;
58 		u16 frag_len;
59 	} bds_set[];
60 };
61 
62 struct qed_ll2_rx_queue {
63 	/* Lock protecting the Rx queue manipulation */
64 	spinlock_t lock;
65 	struct qed_chain rxq_chain;
66 	struct qed_chain rcq_chain;
67 	u8 rx_sb_index;
68 	u8 ctx_based;
69 	bool b_cb_registered;
70 	__le16 *p_fw_cons;
71 	struct list_head active_descq;
72 	struct list_head free_descq;
73 	struct list_head posting_descq;
74 	struct qed_ll2_rx_packet *descq_array;
75 	void __iomem *set_prod_addr;
76 	struct core_pwm_prod_update_data db_data;
77 };
78 
79 struct qed_ll2_tx_queue {
80 	/* Lock protecting the Tx queue manipulation */
81 	spinlock_t lock;
82 	struct qed_chain txq_chain;
83 	u8 tx_sb_index;
84 	bool b_cb_registered;
85 	__le16 *p_fw_cons;
86 	struct list_head active_descq;
87 	struct list_head free_descq;
88 	struct list_head sending_descq;
89 	u16 cur_completing_bd_idx;
90 	void __iomem *doorbell_addr;
91 	struct core_db_data db_msg;
92 	u16 bds_idx;
93 	u16 cur_send_frag_num;
94 	u16 cur_completing_frag_num;
95 	bool b_completing_packet;
96 	void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/
97 	struct qed_ll2_tx_packet *cur_send_packet;
98 	struct qed_ll2_tx_packet cur_completing_packet;
99 };
100 
101 struct qed_ll2_info {
102 	/* Lock protecting the state of LL2 */
103 	struct mutex mutex;
104 
105 	struct qed_ll2_acquire_data_inputs input;
106 	u32 cid;
107 	u8 my_id;
108 	u8 queue_id;
109 	u8 tx_stats_id;
110 	bool b_active;
111 	enum core_tx_dest tx_dest;
112 	u8 tx_stats_en;
113 	bool main_func_queue;
114 	struct qed_ll2_rx_queue rx_queue;
115 	struct qed_ll2_tx_queue tx_queue;
116 	struct qed_ll2_cbs cbs;
117 };
118 
119 extern const struct qed_ll2_ops qed_ll2_ops_pass;
120 
121 /**
122  * @brief qed_ll2_acquire_connection - allocate resources,
123  *        starts rx & tx (if relevant) queues pair. Provides
124  *        connecion handler as output parameter.
125  *
126  *
127  * @param cxt - pointer to the hw-function [opaque to some]
128  * @param data - describes connection parameters
129  * @return int
130  */
131 int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data);
132 
133 /**
134  * @brief qed_ll2_establish_connection - start previously
135  *        allocated LL2 queues pair
136  *
137  * @param cxt - pointer to the hw-function [opaque to some]
138  * @param p_ptt
139  * @param connection_handle	LL2 connection's handle obtained from
140  *                              qed_ll2_require_connection
141  *
142  * @return 0 on success, failure otherwise
143  */
144 int qed_ll2_establish_connection(void *cxt, u8 connection_handle);
145 
146 /**
147  * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue.
148  *
149  * @param cxt - pointer to the hw-function [opaque to some]
150  * @param connection_handle	LL2 connection's handle obtained from
151  *				qed_ll2_require_connection
152  * @param addr			rx (physical address) buffers to submit
153  * @param cookie
154  * @param notify_fw		produce corresponding Rx BD immediately
155  *
156  * @return 0 on success, failure otherwise
157  */
158 int qed_ll2_post_rx_buffer(void *cxt,
159 			   u8 connection_handle,
160 			   dma_addr_t addr,
161 			   u16 buf_len, void *cookie, u8 notify_fw);
162 
163 /**
164  * @brief qed_ll2_prepare_tx_packet - request for start Tx BD
165  *				      to prepare Tx packet submission to FW.
166  *
167  * @param cxt - pointer to the hw-function [opaque to some]
168  * @param connection_handle
169  * @param pkt - info regarding the tx packet
170  * @param notify_fw - issue doorbell to fw for this packet
171  *
172  * @return 0 on success, failure otherwise
173  */
174 int qed_ll2_prepare_tx_packet(void *cxt,
175 			      u8 connection_handle,
176 			      struct qed_ll2_tx_pkt_info *pkt,
177 			      bool notify_fw);
178 
179 /**
180  * @brief qed_ll2_release_connection -	releases resources
181  *					allocated for LL2 connection
182  *
183  * @param cxt - pointer to the hw-function [opaque to some]
184  * @param connection_handle		LL2 connection's handle obtained from
185  *					qed_ll2_require_connection
186  */
187 void qed_ll2_release_connection(void *cxt, u8 connection_handle);
188 
189 /**
190  * @brief qed_ll2_set_fragment_of_tx_packet -	provides fragments to fill
191  *						Tx BD of BDs requested by
192  *						qed_ll2_prepare_tx_packet
193  *
194  * @param cxt - pointer to the hw-function [opaque to some]
195  * @param connection_handle			LL2 connection's handle
196  *						obtained from
197  *						qed_ll2_require_connection
198  * @param addr
199  * @param nbytes
200  *
201  * @return 0 on success, failure otherwise
202  */
203 int qed_ll2_set_fragment_of_tx_packet(void *cxt,
204 				      u8 connection_handle,
205 				      dma_addr_t addr, u16 nbytes);
206 
207 /**
208  * @brief qed_ll2_terminate_connection -	stops Tx/Rx queues
209  *
210  *
211  * @param cxt - pointer to the hw-function [opaque to some]
212  * @param connection_handle			LL2 connection's handle
213  *						obtained from
214  *						qed_ll2_require_connection
215  *
216  * @return 0 on success, failure otherwise
217  */
218 int qed_ll2_terminate_connection(void *cxt, u8 connection_handle);
219 
220 /**
221  * @brief qed_ll2_get_stats -	get LL2 queue's statistics
222  *
223  *
224  * @param cxt - pointer to the hw-function [opaque to some]
225  * @param connection_handle	LL2 connection's handle obtained from
226  *				qed_ll2_require_connection
227  * @param p_stats
228  *
229  * @return 0 on success, failure otherwise
230  */
231 int qed_ll2_get_stats(void *cxt,
232 		      u8 connection_handle, struct qed_ll2_stats *p_stats);
233 
234 /**
235  * @brief qed_ll2_alloc - Allocates LL2 connections set
236  *
237  * @param p_hwfn
238  *
239  * @return int
240  */
241 int qed_ll2_alloc(struct qed_hwfn *p_hwfn);
242 
243 /**
244  * @brief qed_ll2_setup - Inits LL2 connections set
245  *
246  * @param p_hwfn
247  *
248  */
249 void qed_ll2_setup(struct qed_hwfn *p_hwfn);
250 
251 /**
252  * @brief qed_ll2_free - Releases LL2 connections set
253  *
254  * @param p_hwfn
255  *
256  */
257 void qed_ll2_free(struct qed_hwfn *p_hwfn);
258 
259 #endif
260