xref: /linux/drivers/net/ethernet/qlogic/qed/qed_hw.h (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
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_HW_H
8 #define _QED_HW_H
9 
10 #include <linux/types.h>
11 #include <linux/bitops.h>
12 #include <linux/slab.h>
13 #include <linux/string.h>
14 #include "qed.h"
15 #include "qed_dev_api.h"
16 
17 /* Forward decleration */
18 struct qed_ptt;
19 
20 enum reserved_ptts {
21 	RESERVED_PTT_EDIAG,
22 	RESERVED_PTT_USER_SPACE,
23 	RESERVED_PTT_MAIN,
24 	RESERVED_PTT_DPC,
25 	RESERVED_PTT_MAX
26 };
27 
28 enum _dmae_cmd_dst_mask {
29 	DMAE_CMD_DST_MASK_NONE	= 0,
30 	DMAE_CMD_DST_MASK_PCIE	= 1,
31 	DMAE_CMD_DST_MASK_GRC	= 2
32 };
33 
34 enum _dmae_cmd_src_mask {
35 	DMAE_CMD_SRC_MASK_PCIE	= 0,
36 	DMAE_CMD_SRC_MASK_GRC	= 1
37 };
38 
39 enum _dmae_cmd_crc_mask {
40 	DMAE_CMD_COMP_CRC_EN_MASK_NONE	= 0,
41 	DMAE_CMD_COMP_CRC_EN_MASK_SET	= 1
42 };
43 
44 /* definitions for DMA constants */
45 #define DMAE_GO_VALUE   0x1
46 
47 #define DMAE_COMPLETION_VAL     0xD1AE
48 #define DMAE_CMD_ENDIANITY      0x2
49 
50 #define DMAE_CMD_SIZE   14
51 #define DMAE_CMD_SIZE_TO_FILL   (DMAE_CMD_SIZE - 5)
52 #define DMAE_MIN_WAIT_TIME      0x2
53 #define DMAE_MAX_CLIENTS        32
54 
55 /**
56  * qed_gtt_init(): Initialize GTT windows.
57  *
58  * @p_hwfn: HW device data.
59  *
60  * Return: Void.
61  */
62 void qed_gtt_init(struct qed_hwfn *p_hwfn);
63 
64 /**
65  * qed_ptt_pool_alloc(): Allocate and initialize PTT pool.
66  *
67  * @p_hwfn: HW device data.
68  *
69  * Return: struct _qed_status - success (0), negative - error.
70  */
71 int qed_ptt_pool_alloc(struct qed_hwfn *p_hwfn);
72 
73 /**
74  * qed_ptt_pool_free(): Free PTT pool.
75  *
76  * @p_hwfn: HW device data.
77  *
78  * Return: Void.
79  */
80 void qed_ptt_pool_free(struct qed_hwfn *p_hwfn);
81 
82 /**
83  * qed_ptt_get_hw_addr(): Get PTT's GRC/HW address.
84  *
85  * @p_hwfn: HW device data.
86  * @p_ptt: P_ptt
87  *
88  * Return: u32.
89  */
90 u32 qed_ptt_get_hw_addr(struct qed_hwfn *p_hwfn,
91 			struct qed_ptt *p_ptt);
92 
93 /**
94  * qed_ptt_get_bar_addr(): Get PPT's external BAR address.
95  *
96  * @p_ptt: P_ptt
97  *
98  * Return: u32.
99  */
100 u32 qed_ptt_get_bar_addr(struct qed_ptt *p_ptt);
101 
102 /**
103  * qed_ptt_set_win(): Set PTT Window's GRC BAR address
104  *
105  * @p_hwfn: HW device data.
106  * @new_hw_addr: New HW address.
107  * @p_ptt: P_Ptt
108  *
109  * Return: Void.
110  */
111 void qed_ptt_set_win(struct qed_hwfn *p_hwfn,
112 		     struct qed_ptt *p_ptt,
113 		     u32 new_hw_addr);
114 
115 /**
116  * qed_get_reserved_ptt(): Get a specific reserved PTT.
117  *
118  * @p_hwfn: HW device data.
119  * @ptt_idx: Ptt Index.
120  *
121  * Return: struct qed_ptt *.
122  */
123 struct qed_ptt *qed_get_reserved_ptt(struct qed_hwfn *p_hwfn,
124 				     enum reserved_ptts ptt_idx);
125 
126 /**
127  * qed_wr(): Write value to BAR using the given ptt.
128  *
129  * @p_hwfn: HW device data.
130  * @p_ptt: P_ptt.
131  * @val: Val.
132  * @hw_addr: HW address
133  *
134  * Return: Void.
135  */
136 void qed_wr(struct qed_hwfn *p_hwfn,
137 	    struct qed_ptt *p_ptt,
138 	    u32 hw_addr,
139 	    u32 val);
140 
141 /**
142  * qed_rd(): Read value from BAR using the given ptt.
143  *
144  * @p_hwfn: HW device data.
145  * @p_ptt: P_ptt.
146  * @hw_addr: HW address
147  *
148  * Return: Void.
149  */
150 u32 qed_rd(struct qed_hwfn *p_hwfn,
151 	   struct qed_ptt *p_ptt,
152 	   u32 hw_addr);
153 
154 /**
155  * qed_memcpy_from(): Copy n bytes from BAR using the given ptt.
156  *
157  * @p_hwfn: HW device data.
158  * @p_ptt: P_ptt.
159  * @dest: Destination.
160  * @hw_addr: HW address.
161  * @n: N
162  *
163  * Return: Void.
164  */
165 void qed_memcpy_from(struct qed_hwfn *p_hwfn,
166 		     struct qed_ptt *p_ptt,
167 		     void *dest,
168 		     u32 hw_addr,
169 		     size_t n);
170 
171 /**
172  * qed_memcpy_to(): Copy n bytes to BAR using the given  ptt
173  *
174  * @p_hwfn: HW device data.
175  * @p_ptt: P_ptt.
176  * @hw_addr: HW address.
177  * @src: Source.
178  * @n: N
179  *
180  * Return: Void.
181  */
182 void qed_memcpy_to(struct qed_hwfn *p_hwfn,
183 		   struct qed_ptt *p_ptt,
184 		   u32 hw_addr,
185 		   void *src,
186 		   size_t n);
187 /**
188  * qed_fid_pretend(): pretend to another function when
189  *                    accessing the ptt window. There is no way to unpretend
190  *                    a function. The only way to cancel a pretend is to
191  *                    pretend back to the original function.
192  *
193  * @p_hwfn: HW device data.
194  * @p_ptt: P_ptt.
195  * @fid: fid field of pxp_pretend structure. Can contain
196  *        either pf / vf, port/path fields are don't care.
197  *
198  * Return: Void.
199  */
200 void qed_fid_pretend(struct qed_hwfn *p_hwfn,
201 		     struct qed_ptt *p_ptt,
202 		     u16 fid);
203 
204 /**
205  * qed_port_pretend(): Pretend to another port when accessing the ptt window
206  *
207  * @p_hwfn: HW device data.
208  * @p_ptt: P_ptt.
209  * @port_id: The port to pretend to
210  *
211  * Return: Void.
212  */
213 void qed_port_pretend(struct qed_hwfn *p_hwfn,
214 		      struct qed_ptt *p_ptt,
215 		      u8 port_id);
216 
217 /**
218  * qed_port_unpretend(): Cancel any previously set port pretend
219  *
220  * @p_hwfn: HW device data.
221  * @p_ptt: P_ptt.
222  *
223  * Return: Void.
224  */
225 void qed_port_unpretend(struct qed_hwfn *p_hwfn,
226 			struct qed_ptt *p_ptt);
227 
228 /**
229  * qed_port_fid_pretend(): Pretend to another port and another function
230  *                         when accessing the ptt window
231  *
232  * @p_hwfn: HW device data.
233  * @p_ptt: P_ptt.
234  * @port_id: The port to pretend to
235  * @fid: fid field of pxp_pretend structure. Can contain either pf / vf.
236  *
237  * Return: Void.
238  */
239 void qed_port_fid_pretend(struct qed_hwfn *p_hwfn,
240 			  struct qed_ptt *p_ptt, u8 port_id, u16 fid);
241 
242 /**
243  * qed_vfid_to_concrete(): Build a concrete FID for a given VF ID
244  *
245  * @p_hwfn: HW device data.
246  * @vfid: VFID.
247  *
248  * Return: Void.
249  */
250 u32 qed_vfid_to_concrete(struct qed_hwfn *p_hwfn, u8 vfid);
251 
252 /**
253  * qed_dmae_idx_to_go_cmd(): Map the idx to dmae cmd
254  *    this is declared here since other files will require it.
255  *
256  * @idx: Index
257  *
258  * Return: Void.
259  */
260 u32 qed_dmae_idx_to_go_cmd(u8 idx);
261 
262 /**
263  * qed_dmae_info_alloc(): Init the dmae_info structure
264  *                        which is part of p_hwfn.
265  *
266  * @p_hwfn: HW device data.
267  *
268  * Return: Int.
269  */
270 int qed_dmae_info_alloc(struct qed_hwfn *p_hwfn);
271 
272 /**
273  * qed_dmae_info_free(): Free the dmae_info structure
274  *                       which is part of p_hwfn.
275  *
276  * @p_hwfn: HW device data.
277  *
278  * Return: Void.
279  */
280 void qed_dmae_info_free(struct qed_hwfn *p_hwfn);
281 
282 union qed_qm_pq_params {
283 	struct {
284 		u8 q_idx;
285 	} iscsi;
286 
287 	struct {
288 		u8 tc;
289 	}	core;
290 
291 	struct {
292 		u8	is_vf;
293 		u8	vf_id;
294 		u8	tc;
295 	}	eth;
296 
297 	struct {
298 		u8 dcqcn;
299 		u8 qpid;	/* roce relative */
300 	} roce;
301 };
302 
303 int qed_init_fw_data(struct qed_dev *cdev,
304 		     const u8 *fw_data);
305 
306 int qed_dmae_sanity(struct qed_hwfn *p_hwfn,
307 		    struct qed_ptt *p_ptt, const char *phase);
308 
309 #define QED_HW_ERR_MAX_STR_SIZE 256
310 
311 /**
312  * qed_hw_err_notify(): Notify upper layer driver and management FW
313  *                      about a HW error.
314  *
315  * @p_hwfn: HW device data.
316  * @p_ptt: P_ptt.
317  * @err_type: Err Type.
318  * @fmt: Debug data buffer to send to the MFW
319  * @...: buffer format args
320  *
321  * Return void.
322  */
323 void __printf(4, 5) __cold qed_hw_err_notify(struct qed_hwfn *p_hwfn,
324 					     struct qed_ptt *p_ptt,
325 					     enum qed_hw_err_type err_type,
326 					     const char *fmt, ...);
327 #endif
328