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