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 | struct qed_ll2_rx_packet { |
36 | struct list_head list_entry; |
37 | struct core_rx_bd_with_buff_len *rxq_bd; |
38 | dma_addr_t rx_buf_addr; |
39 | u16 buf_length; |
40 | void *cookie; |
41 | u8 placement_offset; |
42 | u16 parse_flags; |
43 | u16 packet_length; |
44 | u16 vlan; |
45 | u32 opaque_data[2]; |
46 | }; |
47 | |
48 | struct qed_ll2_tx_packet { |
49 | struct list_head list_entry; |
50 | u16 bd_used; |
51 | bool notify_fw; |
52 | void *cookie; |
53 | /* Flexible Array of bds_set determined by max_bds_per_packet */ |
54 | struct { |
55 | struct core_tx_bd *txq_bd; |
56 | dma_addr_t tx_frag; |
57 | u16 frag_len; |
58 | } bds_set[]; |
59 | }; |
60 | |
61 | struct qed_ll2_rx_queue { |
62 | /* Lock protecting the Rx queue manipulation */ |
63 | spinlock_t lock; |
64 | struct qed_chain rxq_chain; |
65 | struct qed_chain rcq_chain; |
66 | u8 rx_sb_index; |
67 | u8 ctx_based; |
68 | bool b_cb_registered; |
69 | __le16 *p_fw_cons; |
70 | struct list_head active_descq; |
71 | struct list_head free_descq; |
72 | struct list_head posting_descq; |
73 | struct qed_ll2_rx_packet *descq_array; |
74 | void __iomem *set_prod_addr; |
75 | struct core_pwm_prod_update_data db_data; |
76 | }; |
77 | |
78 | struct qed_ll2_tx_queue { |
79 | /* Lock protecting the Tx queue manipulation */ |
80 | spinlock_t lock; |
81 | struct qed_chain txq_chain; |
82 | u8 tx_sb_index; |
83 | bool b_cb_registered; |
84 | __le16 *p_fw_cons; |
85 | struct list_head active_descq; |
86 | struct list_head free_descq; |
87 | struct list_head sending_descq; |
88 | u16 cur_completing_bd_idx; |
89 | void __iomem *doorbell_addr; |
90 | struct core_db_data db_msg; |
91 | u16 bds_idx; |
92 | u16 cur_send_frag_num; |
93 | u16 cur_completing_frag_num; |
94 | bool b_completing_packet; |
95 | void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/ |
96 | struct qed_ll2_tx_packet *cur_send_packet; |
97 | struct qed_ll2_tx_packet cur_completing_packet; |
98 | }; |
99 | |
100 | struct qed_ll2_info { |
101 | /* Lock protecting the state of LL2 */ |
102 | struct mutex mutex; |
103 | |
104 | struct qed_ll2_acquire_data_inputs input; |
105 | u32 cid; |
106 | u8 my_id; |
107 | u8 queue_id; |
108 | u8 tx_stats_id; |
109 | bool b_active; |
110 | enum core_tx_dest tx_dest; |
111 | u8 tx_stats_en; |
112 | bool main_func_queue; |
113 | struct qed_ll2_cbs cbs; |
114 | struct qed_ll2_rx_queue rx_queue; |
115 | struct qed_ll2_tx_queue tx_queue; |
116 | }; |
117 | |
118 | extern const struct qed_ll2_ops qed_ll2_ops_pass; |
119 | |
120 | /** |
121 | * qed_ll2_acquire_connection(): Allocate resources, |
122 | * starts rx & tx (if relevant) queues pair. |
123 | * Provides connecion handler as output |
124 | * parameter. |
125 | * |
126 | * @cxt: Pointer to the hw-function [opaque to some]. |
127 | * @data: Describes connection parameters. |
128 | * |
129 | * Return: Int. |
130 | */ |
131 | int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data); |
132 | |
133 | /** |
134 | * qed_ll2_establish_connection(): start previously allocated LL2 queues pair |
135 | * |
136 | * @cxt: Pointer to the hw-function [opaque to some]. |
137 | * @connection_handle: LL2 connection's handle obtained from |
138 | * qed_ll2_require_connection. |
139 | * |
140 | * Return: 0 on success, failure otherwise. |
141 | */ |
142 | int qed_ll2_establish_connection(void *cxt, u8 connection_handle); |
143 | |
144 | /** |
145 | * qed_ll2_post_rx_buffer(): Submit buffers to LL2 Rx queue. |
146 | * |
147 | * @cxt: Pointer to the hw-function [opaque to some]. |
148 | * @connection_handle: LL2 connection's handle obtained from |
149 | * qed_ll2_require_connection. |
150 | * @addr: RX (physical address) buffers to submit. |
151 | * @buf_len: Buffer Len. |
152 | * @cookie: Cookie. |
153 | * @notify_fw: Produce corresponding Rx BD immediately. |
154 | * |
155 | * Return: 0 on success, failure otherwise. |
156 | */ |
157 | int qed_ll2_post_rx_buffer(void *cxt, |
158 | u8 connection_handle, |
159 | dma_addr_t addr, |
160 | u16 buf_len, void *cookie, u8 notify_fw); |
161 | |
162 | /** |
163 | * qed_ll2_prepare_tx_packet(): Request for start Tx BD |
164 | * to prepare Tx packet submission to FW. |
165 | * |
166 | * @cxt: Pointer to the hw-function [opaque to some]. |
167 | * @connection_handle: Connection handle. |
168 | * @pkt: Info regarding the tx packet. |
169 | * @notify_fw: Issue doorbell to fw for this packet. |
170 | * |
171 | * Return: 0 on success, failure otherwise. |
172 | */ |
173 | int qed_ll2_prepare_tx_packet(void *cxt, |
174 | u8 connection_handle, |
175 | struct qed_ll2_tx_pkt_info *pkt, |
176 | bool notify_fw); |
177 | |
178 | /** |
179 | * qed_ll2_release_connection(): Releases resources allocated for LL2 |
180 | * connection. |
181 | * |
182 | * @cxt: Pointer to the hw-function [opaque to some]. |
183 | * @connection_handle: LL2 connection's handle obtained from |
184 | * qed_ll2_require_connection. |
185 | * |
186 | * Return: Void. |
187 | */ |
188 | void qed_ll2_release_connection(void *cxt, u8 connection_handle); |
189 | |
190 | /** |
191 | * qed_ll2_set_fragment_of_tx_packet(): Provides fragments to fill |
192 | * Tx BD of BDs requested by |
193 | * qed_ll2_prepare_tx_packet |
194 | * |
195 | * @cxt: Pointer to the hw-function [opaque to some]. |
196 | * @connection_handle: LL2 connection's handle obtained from |
197 | * qed_ll2_require_connection. |
198 | * @addr: Address. |
199 | * @nbytes: Number of bytes. |
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 | * qed_ll2_terminate_connection(): Stops Tx/Rx queues |
209 | * |
210 | * @cxt: Pointer to the hw-function [opaque to some]. |
211 | * @connection_handle: LL2 connection's handle obtained from |
212 | * qed_ll2_require_connection. |
213 | * |
214 | * Return: 0 on success, failure otherwise. |
215 | */ |
216 | int qed_ll2_terminate_connection(void *cxt, u8 connection_handle); |
217 | |
218 | /** |
219 | * qed_ll2_get_stats(): Get LL2 queue's statistics |
220 | * |
221 | * @cxt: Pointer to the hw-function [opaque to some]. |
222 | * @connection_handle: LL2 connection's handle obtained from |
223 | * qed_ll2_require_connection. |
224 | * @p_stats: Pointer Status. |
225 | * |
226 | * Return: 0 on success, failure otherwise. |
227 | */ |
228 | int qed_ll2_get_stats(void *cxt, |
229 | u8 connection_handle, struct qed_ll2_stats *p_stats); |
230 | |
231 | /** |
232 | * qed_ll2_alloc(): Allocates LL2 connections set. |
233 | * |
234 | * @p_hwfn: HW device data. |
235 | * |
236 | * Return: Int. |
237 | */ |
238 | int qed_ll2_alloc(struct qed_hwfn *p_hwfn); |
239 | |
240 | /** |
241 | * qed_ll2_setup(): Inits LL2 connections set. |
242 | * |
243 | * @p_hwfn: HW device data. |
244 | * |
245 | * Return: Void. |
246 | * |
247 | */ |
248 | void qed_ll2_setup(struct qed_hwfn *p_hwfn); |
249 | |
250 | /** |
251 | * qed_ll2_free(): Releases LL2 connections set |
252 | * |
253 | * @p_hwfn: HW device data. |
254 | * |
255 | * Return: Void. |
256 | * |
257 | */ |
258 | void qed_ll2_free(struct qed_hwfn *p_hwfn); |
259 | |
260 | #endif |
261 | |