xref: /dpdk/drivers/net/qede/base/ecore_hw.h (revision 7ed1cd53dbb515328f8780aa95aabce85e1ffb2f)
13126df22SRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause
29adde217SRasesh Mody  * Copyright (c) 2016 - 2018 Cavium Inc.
3ec94dbc5SRasesh Mody  * All rights reserved.
49adde217SRasesh Mody  * www.cavium.com
5ec94dbc5SRasesh Mody  */
6ec94dbc5SRasesh Mody 
7ec94dbc5SRasesh Mody #ifndef __ECORE_HW_H__
8ec94dbc5SRasesh Mody #define __ECORE_HW_H__
9ec94dbc5SRasesh Mody 
10ec94dbc5SRasesh Mody #include "ecore.h"
11ec94dbc5SRasesh Mody 
12*7ed1cd53SRasesh Mody /* Forward declaration */
13ec94dbc5SRasesh Mody struct ecore_ptt;
14ec94dbc5SRasesh Mody 
15ec94dbc5SRasesh Mody enum reserved_ptts {
16ec94dbc5SRasesh Mody 	RESERVED_PTT_EDIAG,
17ec94dbc5SRasesh Mody 	RESERVED_PTT_USER_SPACE,
18ec94dbc5SRasesh Mody 	RESERVED_PTT_MAIN,
19ec94dbc5SRasesh Mody 	RESERVED_PTT_DPC,
20ec94dbc5SRasesh Mody 	RESERVED_PTT_MAX
21ec94dbc5SRasesh Mody };
22ec94dbc5SRasesh Mody 
23ec94dbc5SRasesh Mody /* @@@TMP - in earlier versions of the emulation, the HW lock started from 1
24ec94dbc5SRasesh Mody  * instead of 0, this should be fixed in later HW versions.
25ec94dbc5SRasesh Mody  */
26ec94dbc5SRasesh Mody #ifndef MISC_REG_DRIVER_CONTROL_0
27ec94dbc5SRasesh Mody #define MISC_REG_DRIVER_CONTROL_0	MISC_REG_DRIVER_CONTROL_1
28ec94dbc5SRasesh Mody #endif
29ec94dbc5SRasesh Mody #ifndef MISC_REG_DRIVER_CONTROL_0_SIZE
30ec94dbc5SRasesh Mody #define MISC_REG_DRIVER_CONTROL_0_SIZE	MISC_REG_DRIVER_CONTROL_1_SIZE
31ec94dbc5SRasesh Mody #endif
32ec94dbc5SRasesh Mody 
33ea85629fSRasesh Mody /* Definitions for DMA constants */
34ec94dbc5SRasesh Mody #define DMAE_GO_VALUE	0x1
35ec94dbc5SRasesh Mody 
36ec94dbc5SRasesh Mody #ifdef __BIG_ENDIAN
37ec94dbc5SRasesh Mody #define DMAE_COMPLETION_VAL	0xAED10000
38ec94dbc5SRasesh Mody #define DMAE_CMD_ENDIANITY	0x3
39ec94dbc5SRasesh Mody #else
40ec94dbc5SRasesh Mody #define DMAE_COMPLETION_VAL	0xD1AE
41ec94dbc5SRasesh Mody #define DMAE_CMD_ENDIANITY	0x2
42ec94dbc5SRasesh Mody #endif
43ec94dbc5SRasesh Mody 
44ec94dbc5SRasesh Mody #define DMAE_CMD_SIZE	14
45ec94dbc5SRasesh Mody /* size of DMAE command structure to fill.. DMAE_CMD_SIZE-5 */
46ec94dbc5SRasesh Mody #define DMAE_CMD_SIZE_TO_FILL	(DMAE_CMD_SIZE - 5)
47ec94dbc5SRasesh Mody /* Minimum wait for dmae opertaion to complete 2 milliseconds */
48ec94dbc5SRasesh Mody #define DMAE_MIN_WAIT_TIME	0x2
49ec94dbc5SRasesh Mody #define DMAE_MAX_CLIENTS	32
50ec94dbc5SRasesh Mody 
51ec94dbc5SRasesh Mody /**
52ec94dbc5SRasesh Mody * @brief ecore_gtt_init - Initialize GTT windows
53ec94dbc5SRasesh Mody *
54ec94dbc5SRasesh Mody * @param p_hwfn
55ec94dbc5SRasesh Mody */
56*7ed1cd53SRasesh Mody void ecore_gtt_init(struct ecore_hwfn *p_hwfn);
57ec94dbc5SRasesh Mody 
58ec94dbc5SRasesh Mody /**
59ec94dbc5SRasesh Mody  * @brief ecore_ptt_invalidate - Forces all ptt entries to be re-configured
60ec94dbc5SRasesh Mody  *
61ec94dbc5SRasesh Mody  * @param p_hwfn
62ec94dbc5SRasesh Mody  */
63ec94dbc5SRasesh Mody void ecore_ptt_invalidate(struct ecore_hwfn *p_hwfn);
64ec94dbc5SRasesh Mody 
65ec94dbc5SRasesh Mody /**
66ec94dbc5SRasesh Mody  * @brief ecore_ptt_pool_alloc - Allocate and initialize PTT pool
67ec94dbc5SRasesh Mody  *
68ec94dbc5SRasesh Mody  * @param p_hwfn
69ec94dbc5SRasesh Mody  *
70ec94dbc5SRasesh Mody  * @return _ecore_status_t - success (0), negative - error.
71ec94dbc5SRasesh Mody  */
72ec94dbc5SRasesh Mody enum _ecore_status_t ecore_ptt_pool_alloc(struct ecore_hwfn *p_hwfn);
73ec94dbc5SRasesh Mody 
74ec94dbc5SRasesh Mody /**
75ec94dbc5SRasesh Mody  * @brief ecore_ptt_pool_free -
76ec94dbc5SRasesh Mody  *
77ec94dbc5SRasesh Mody  * @param p_hwfn
78ec94dbc5SRasesh Mody  */
79ec94dbc5SRasesh Mody void ecore_ptt_pool_free(struct ecore_hwfn *p_hwfn);
80ec94dbc5SRasesh Mody 
81ec94dbc5SRasesh Mody /**
82ec94dbc5SRasesh Mody  * @brief ecore_ptt_get_bar_addr - Get PPT's external BAR address
83ec94dbc5SRasesh Mody  *
84ec94dbc5SRasesh Mody  * @param p_ptt
85ec94dbc5SRasesh Mody  *
86ec94dbc5SRasesh Mody  * @return u32
87ec94dbc5SRasesh Mody  */
88ec94dbc5SRasesh Mody u32 ecore_ptt_get_bar_addr(struct ecore_ptt	*p_ptt);
89ec94dbc5SRasesh Mody 
90ec94dbc5SRasesh Mody /**
91ec94dbc5SRasesh Mody  * @brief ecore_ptt_set_win - Set PTT Window's GRC BAR address
92ec94dbc5SRasesh Mody  *
93ec94dbc5SRasesh Mody  * @param p_hwfn
94ec94dbc5SRasesh Mody  * @param p_ptt
95*7ed1cd53SRasesh Mody  * @param new_hw_addr
96ec94dbc5SRasesh Mody  */
97ec94dbc5SRasesh Mody void ecore_ptt_set_win(struct ecore_hwfn	*p_hwfn,
989455b556SRasesh Mody 		       struct ecore_ptt		*p_ptt,
999455b556SRasesh Mody 		       u32			new_hw_addr);
100ec94dbc5SRasesh Mody 
101ec94dbc5SRasesh Mody /**
102ec94dbc5SRasesh Mody  * @brief ecore_get_reserved_ptt - Get a specific reserved PTT
103ec94dbc5SRasesh Mody  *
104ec94dbc5SRasesh Mody  * @param p_hwfn
105ec94dbc5SRasesh Mody  * @param ptt_idx
106ec94dbc5SRasesh Mody  *
107ec94dbc5SRasesh Mody  * @return struct ecore_ptt *
108ec94dbc5SRasesh Mody  */
109ec94dbc5SRasesh Mody struct ecore_ptt *ecore_get_reserved_ptt(struct ecore_hwfn	*p_hwfn,
110ec94dbc5SRasesh Mody 					 enum reserved_ptts	ptt_idx);
111ec94dbc5SRasesh Mody 
112ec94dbc5SRasesh Mody /**
113ec94dbc5SRasesh Mody  * @brief ecore_wr - Write value to BAR using the given ptt
114ec94dbc5SRasesh Mody  *
115ec94dbc5SRasesh Mody  * @param p_hwfn
116ec94dbc5SRasesh Mody  * @param p_ptt
117ec94dbc5SRasesh Mody  * @param hw_addr
1183eed444aSRasesh Mody  * @param val
119ec94dbc5SRasesh Mody  */
120ec94dbc5SRasesh Mody void ecore_wr(struct ecore_hwfn	*p_hwfn,
1219455b556SRasesh Mody 	      struct ecore_ptt	*p_ptt,
1229455b556SRasesh Mody 	      u32		hw_addr,
1239455b556SRasesh Mody 	      u32		val);
124ec94dbc5SRasesh Mody 
125ec94dbc5SRasesh Mody /**
126ec94dbc5SRasesh Mody  * @brief ecore_rd - Read value from BAR using the given ptt
127ec94dbc5SRasesh Mody  *
128ec94dbc5SRasesh Mody  * @param p_hwfn
129ec94dbc5SRasesh Mody  * @param p_ptt
130ec94dbc5SRasesh Mody  * @param hw_addr
131ec94dbc5SRasesh Mody  */
1329455b556SRasesh Mody u32 ecore_rd(struct ecore_hwfn	*p_hwfn,
1339455b556SRasesh Mody 	     struct ecore_ptt	*p_ptt,
1349455b556SRasesh Mody 	     u32		hw_addr);
135ec94dbc5SRasesh Mody 
136ec94dbc5SRasesh Mody /**
137ec94dbc5SRasesh Mody  * @brief ecore_memcpy_from - copy n bytes from BAR using the given
138ec94dbc5SRasesh Mody  *        ptt
139ec94dbc5SRasesh Mody  *
140ec94dbc5SRasesh Mody  * @param p_hwfn
141ec94dbc5SRasesh Mody  * @param p_ptt
142ec94dbc5SRasesh Mody  * @param dest
143ec94dbc5SRasesh Mody  * @param hw_addr
144ec94dbc5SRasesh Mody  * @param n
145ec94dbc5SRasesh Mody  */
146ec94dbc5SRasesh Mody void ecore_memcpy_from(struct ecore_hwfn	*p_hwfn,
147ec94dbc5SRasesh Mody 		       struct ecore_ptt		*p_ptt,
1489455b556SRasesh Mody 		       void			*dest,
1499455b556SRasesh Mody 		       u32			hw_addr,
1509455b556SRasesh Mody 		       osal_size_t		n);
151ec94dbc5SRasesh Mody 
152ec94dbc5SRasesh Mody /**
153ec94dbc5SRasesh Mody  * @brief ecore_memcpy_to - copy n bytes to BAR using the given
154ec94dbc5SRasesh Mody  *        ptt
155ec94dbc5SRasesh Mody  *
156ec94dbc5SRasesh Mody  * @param p_hwfn
157ec94dbc5SRasesh Mody  * @param p_ptt
158ec94dbc5SRasesh Mody  * @param hw_addr
159ec94dbc5SRasesh Mody  * @param src
160ec94dbc5SRasesh Mody  * @param n
161ec94dbc5SRasesh Mody  */
162ec94dbc5SRasesh Mody void ecore_memcpy_to(struct ecore_hwfn	*p_hwfn,
163ec94dbc5SRasesh Mody 		     struct ecore_ptt	*p_ptt,
1649455b556SRasesh Mody 		     u32		hw_addr,
1659455b556SRasesh Mody 		     void		*src,
1669455b556SRasesh Mody 		     osal_size_t	n);
167ec94dbc5SRasesh Mody /**
168ec94dbc5SRasesh Mody  * @brief ecore_fid_pretend - pretend to another function when
169ec94dbc5SRasesh Mody  *        accessing the ptt window. There is no way to unpretend
170ec94dbc5SRasesh Mody  *        a function. The only way to cancel a pretend is to
171ec94dbc5SRasesh Mody  *        pretend back to the original function.
172ec94dbc5SRasesh Mody  *
173ec94dbc5SRasesh Mody  * @param p_hwfn
174ec94dbc5SRasesh Mody  * @param p_ptt
175ec94dbc5SRasesh Mody  * @param fid - fid field of pxp_pretend structure. Can contain
176ec94dbc5SRasesh Mody  *            either pf / vf, port/path fields are don't care.
177ec94dbc5SRasesh Mody  */
178ec94dbc5SRasesh Mody void ecore_fid_pretend(struct ecore_hwfn	*p_hwfn,
1799455b556SRasesh Mody 		       struct ecore_ptt		*p_ptt,
1809455b556SRasesh Mody 		       u16			fid);
181ec94dbc5SRasesh Mody 
182ec94dbc5SRasesh Mody /**
183ec94dbc5SRasesh Mody  * @brief ecore_port_pretend - pretend to another port when
184ec94dbc5SRasesh Mody  *        accessing the ptt window
185ec94dbc5SRasesh Mody  *
186ec94dbc5SRasesh Mody  * @param p_hwfn
187ec94dbc5SRasesh Mody  * @param p_ptt
188ec94dbc5SRasesh Mody  * @param port_id - the port to pretend to
189ec94dbc5SRasesh Mody  */
190ec94dbc5SRasesh Mody void ecore_port_pretend(struct ecore_hwfn	*p_hwfn,
1919455b556SRasesh Mody 			struct ecore_ptt	*p_ptt,
1929455b556SRasesh Mody 			u8			port_id);
193ec94dbc5SRasesh Mody 
194ec94dbc5SRasesh Mody /**
195ec94dbc5SRasesh Mody  * @brief ecore_port_unpretend - cancel any previously set port
196ec94dbc5SRasesh Mody  *        pretend
197ec94dbc5SRasesh Mody  *
198ec94dbc5SRasesh Mody  * @param p_hwfn
199ec94dbc5SRasesh Mody  * @param p_ptt
200ec94dbc5SRasesh Mody  */
2019455b556SRasesh Mody void ecore_port_unpretend(struct ecore_hwfn	*p_hwfn,
2029455b556SRasesh Mody 			  struct ecore_ptt	*p_ptt);
203ec94dbc5SRasesh Mody 
204ec94dbc5SRasesh Mody /**
2059585053bSRasesh Mody  * @brief ecore_port_fid_pretend - pretend to another port and another function
2069585053bSRasesh Mody  *        when accessing the ptt window
2079585053bSRasesh Mody  *
2089585053bSRasesh Mody  * @param p_hwfn
2099585053bSRasesh Mody  * @param p_ptt
2109585053bSRasesh Mody  * @param port_id - the port to pretend to
2119585053bSRasesh Mody  * @param fid - fid field of pxp_pretend structure. Can contain either pf / vf.
2129585053bSRasesh Mody  */
2139585053bSRasesh Mody void ecore_port_fid_pretend(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
2149585053bSRasesh Mody 			    u8 port_id, u16 fid);
2159585053bSRasesh Mody 
2169585053bSRasesh Mody /**
217ec94dbc5SRasesh Mody  * @brief ecore_vfid_to_concrete - build a concrete FID for a
218ec94dbc5SRasesh Mody  *        given VF ID
219ec94dbc5SRasesh Mody  *
220ec94dbc5SRasesh Mody  * @param p_hwfn
221ec94dbc5SRasesh Mody  * @param p_ptt
222ec94dbc5SRasesh Mody  * @param vfid
223ec94dbc5SRasesh Mody  */
224ec94dbc5SRasesh Mody u32 ecore_vfid_to_concrete(struct ecore_hwfn *p_hwfn, u8 vfid);
225ec94dbc5SRasesh Mody 
226ec94dbc5SRasesh Mody /**
227ec94dbc5SRasesh Mody * @brief ecore_dmae_info_alloc - Init the dmae_info structure
228ec94dbc5SRasesh Mody * which is part of p_hwfn.
229ec94dbc5SRasesh Mody * @param p_hwfn
230ec94dbc5SRasesh Mody */
231ec94dbc5SRasesh Mody enum _ecore_status_t ecore_dmae_info_alloc(struct ecore_hwfn	*p_hwfn);
232ec94dbc5SRasesh Mody 
233ec94dbc5SRasesh Mody /**
234ec94dbc5SRasesh Mody * @brief ecore_dmae_info_free - Free the dmae_info structure
235ec94dbc5SRasesh Mody * which is part of p_hwfn
236ec94dbc5SRasesh Mody *
237ec94dbc5SRasesh Mody * @param p_hwfn
238ec94dbc5SRasesh Mody */
239ec94dbc5SRasesh Mody void ecore_dmae_info_free(struct ecore_hwfn	*p_hwfn);
240ec94dbc5SRasesh Mody 
241ea85629fSRasesh Mody /**
242ea85629fSRasesh Mody  * @brief ecore_dmae_host2grc - copy data from source address to
243ea85629fSRasesh Mody  * dmae registers using the given ptt
244ea85629fSRasesh Mody  *
245ea85629fSRasesh Mody  * @param p_hwfn
246ea85629fSRasesh Mody  * @param p_ptt
247ea85629fSRasesh Mody  * @param source_addr
248ea85629fSRasesh Mody  * @param grc_addr (dmae_data_offset)
249ea85629fSRasesh Mody  * @param size_in_dwords
250ea85629fSRasesh Mody  * @param p_params (default parameters will be used in case of OSAL_NULL)
251ea85629fSRasesh Mody  *
252ea85629fSRasesh Mody  * @return enum _ecore_status_t
253ea85629fSRasesh Mody  */
254ea85629fSRasesh Mody enum _ecore_status_t
255ea85629fSRasesh Mody ecore_dmae_host2grc(struct ecore_hwfn *p_hwfn,
256ea85629fSRasesh Mody 		    struct ecore_ptt *p_ptt,
257ea85629fSRasesh Mody 		    u64 source_addr,
258ea85629fSRasesh Mody 		    u32 grc_addr,
259ea85629fSRasesh Mody 		    u32 size_in_dwords,
260ea85629fSRasesh Mody 		    struct dmae_params *p_params);
261ea85629fSRasesh Mody 
262ea85629fSRasesh Mody /**
263ea85629fSRasesh Mody  * @brief ecore_dmae_grc2host - Read data from dmae data offset
264ea85629fSRasesh Mody  * to source address using the given ptt
265ea85629fSRasesh Mody  *
266ea85629fSRasesh Mody  * @param p_ptt
267ea85629fSRasesh Mody  * @param grc_addr (dmae_data_offset)
268ea85629fSRasesh Mody  * @param dest_addr
269ea85629fSRasesh Mody  * @param size_in_dwords
270ea85629fSRasesh Mody  * @param p_params (default parameters will be used in case of OSAL_NULL)
271ea85629fSRasesh Mody  *
272ea85629fSRasesh Mody  * @return enum _ecore_status_t
273ea85629fSRasesh Mody  */
274ea85629fSRasesh Mody enum _ecore_status_t
275ea85629fSRasesh Mody ecore_dmae_grc2host(struct ecore_hwfn *p_hwfn,
276ea85629fSRasesh Mody 		    struct ecore_ptt *p_ptt,
277ea85629fSRasesh Mody 		    u32 grc_addr,
278ea85629fSRasesh Mody 		    dma_addr_t dest_addr,
279ea85629fSRasesh Mody 		    u32 size_in_dwords,
280ea85629fSRasesh Mody 		    struct dmae_params *p_params);
281ea85629fSRasesh Mody 
282ea85629fSRasesh Mody /**
283ea85629fSRasesh Mody  * @brief ecore_dmae_host2host - copy data from to source address
284ea85629fSRasesh Mody  * to a destination address (for SRIOV) using the given ptt
285ea85629fSRasesh Mody  *
286ea85629fSRasesh Mody  * @param p_hwfn
287ea85629fSRasesh Mody  * @param p_ptt
288ea85629fSRasesh Mody  * @param source_addr
289ea85629fSRasesh Mody  * @param dest_addr
290ea85629fSRasesh Mody  * @param size_in_dwords
291ea85629fSRasesh Mody  * @param p_params (default parameters will be used in case of OSAL_NULL)
292ea85629fSRasesh Mody  *
293ea85629fSRasesh Mody  * @return enum _ecore_status_t
294ea85629fSRasesh Mody  */
295ea85629fSRasesh Mody enum _ecore_status_t
296ea85629fSRasesh Mody ecore_dmae_host2host(struct ecore_hwfn *p_hwfn,
297ea85629fSRasesh Mody 		     struct ecore_ptt *p_ptt,
298ea85629fSRasesh Mody 		     dma_addr_t source_addr,
299ea85629fSRasesh Mody 		     dma_addr_t dest_addr,
300ea85629fSRasesh Mody 		     u32 size_in_dwords,
301ea85629fSRasesh Mody 		     struct dmae_params *p_params);
302ea85629fSRasesh Mody 
303ea85629fSRasesh Mody enum _ecore_status_t ecore_dmae_sanity(struct ecore_hwfn *p_hwfn,
304ea85629fSRasesh Mody 				       struct ecore_ptt *p_ptt,
305ea85629fSRasesh Mody 				       const char *phase);
306ea85629fSRasesh Mody 
307ec94dbc5SRasesh Mody enum _ecore_status_t ecore_init_fw_data(struct ecore_dev *p_dev,
308ec94dbc5SRasesh Mody 					const u8 *fw_data);
309ec94dbc5SRasesh Mody 
310ec94dbc5SRasesh Mody void ecore_hw_err_notify(struct ecore_hwfn *p_hwfn,
311ec94dbc5SRasesh Mody 			 enum ecore_hw_err_type err_type);
312ec94dbc5SRasesh Mody 
3133eed444aSRasesh Mody /**
3143eed444aSRasesh Mody  * @brief ecore_ppfid_wr - Write value to BAR using the given ptt while
3153eed444aSRasesh Mody  *	pretending to a PF to which the given PPFID pertains.
3163eed444aSRasesh Mody  *
3173eed444aSRasesh Mody  * @param p_hwfn
3183eed444aSRasesh Mody  * @param p_ptt
3193eed444aSRasesh Mody  * @param abs_ppfid
3203eed444aSRasesh Mody  * @param hw_addr
3213eed444aSRasesh Mody  * @param val
3223eed444aSRasesh Mody  */
3233eed444aSRasesh Mody void ecore_ppfid_wr(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
3243eed444aSRasesh Mody 		    u8 abs_ppfid, u32 hw_addr, u32 val);
3253eed444aSRasesh Mody 
3263eed444aSRasesh Mody /**
3273eed444aSRasesh Mody  * @brief ecore_ppfid_rd - Read value from BAR using the given ptt while
3283eed444aSRasesh Mody  *	 pretending to a PF to which the given PPFID pertains.
3293eed444aSRasesh Mody  *
3303eed444aSRasesh Mody  * @param p_hwfn
3313eed444aSRasesh Mody  * @param p_ptt
3323eed444aSRasesh Mody  * @param abs_ppfid
3333eed444aSRasesh Mody  * @param hw_addr
3343eed444aSRasesh Mody  */
3353eed444aSRasesh Mody u32 ecore_ppfid_rd(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
3363eed444aSRasesh Mody 		   u8 abs_ppfid, u32 hw_addr);
3373eed444aSRasesh Mody 
338ec94dbc5SRasesh Mody #endif /* __ECORE_HW_H__ */
339