xref: /dpdk/drivers/net/qede/base/ecore_mcp.h (revision 3b307c55f2ac7f3f4146bd0dc9b474e1f3076f97)
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_MCP_H__
8ec94dbc5SRasesh Mody #define __ECORE_MCP_H__
9ec94dbc5SRasesh Mody 
10ec94dbc5SRasesh Mody #include "bcm_osal.h"
11ec94dbc5SRasesh Mody #include "mcp_public.h"
1249ca6a7bSRasesh Mody #include "ecore.h"
13ec94dbc5SRasesh Mody #include "ecore_mcp_api.h"
14c5e11089SRasesh Mody #include "ecore_dev_api.h"
15ec94dbc5SRasesh Mody 
16ec94dbc5SRasesh Mody /* Using hwfn number (and not pf_num) is required since in CMT mode,
17ec94dbc5SRasesh Mody  * same pf_num may be used by two different hwfn
18ec94dbc5SRasesh Mody  * TODO - this shouldn't really be in .h file, but until all fields
19ec94dbc5SRasesh Mody  * required during hw-init will be placed in their correct place in shmem
20ec94dbc5SRasesh Mody  * we need it in ecore_dev.c [for readin the nvram reflection in shmem].
21ec94dbc5SRasesh Mody  */
22ec94dbc5SRasesh Mody #define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (ECORE_IS_BB((p_hwfn)->p_dev) ? \
23ec94dbc5SRasesh Mody 					    ((rel_pfid) | \
24ec94dbc5SRasesh Mody 					     ((p_hwfn)->abs_pf_id & 1) << 3) : \
25ec94dbc5SRasesh Mody 					     rel_pfid)
26ec94dbc5SRasesh Mody #define MCP_PF_ID(p_hwfn)	MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id)
27ec94dbc5SRasesh Mody 
28ec94dbc5SRasesh Mody struct ecore_mcp_info {
2922c99696SRasesh Mody 	/* List for mailbox commands which were sent and wait for a response */
3022c99696SRasesh Mody 	osal_list_t cmd_list;
3122c99696SRasesh Mody 
3222c99696SRasesh Mody 	/* Spinlock used for protecting the access to the mailbox commands list
3322c99696SRasesh Mody 	 * and the sending of the commands.
3422c99696SRasesh Mody 	 */
3522c99696SRasesh Mody 	osal_spinlock_t cmd_lock;
3622c99696SRasesh Mody 
37a474d1c1SRasesh Mody 	/* Flag to indicate whether sending a MFW mailbox command is blocked */
38a474d1c1SRasesh Mody 	bool b_block_cmd;
39a474d1c1SRasesh Mody 
4022c99696SRasesh Mody 	/* Spinlock used for syncing SW link-changes and link-changes
4122c99696SRasesh Mody 	 * originating from attention context.
4222c99696SRasesh Mody 	 */
4322c99696SRasesh Mody 	osal_spinlock_t link_lock;
44610ccd98SRasesh Mody 
45610ccd98SRasesh Mody 	/* Address of the MCP public area */
46610ccd98SRasesh Mody 	u32 public_base;
47610ccd98SRasesh Mody 	/* Address of the driver mailbox */
48610ccd98SRasesh Mody 	u32 drv_mb_addr;
49610ccd98SRasesh Mody 	/* Address of the MFW mailbox */
50610ccd98SRasesh Mody 	u32 mfw_mb_addr;
51610ccd98SRasesh Mody 	/* Address of the port configuration (link) */
52610ccd98SRasesh Mody 	u32 port_addr;
53610ccd98SRasesh Mody 
54610ccd98SRasesh Mody 	/* Current driver mailbox sequence */
55610ccd98SRasesh Mody 	u16 drv_mb_seq;
56610ccd98SRasesh Mody 	/* Current driver pulse sequence */
57610ccd98SRasesh Mody 	u16 drv_pulse_seq;
58610ccd98SRasesh Mody 
59ec94dbc5SRasesh Mody 	struct ecore_mcp_link_params       link_input;
60ec94dbc5SRasesh Mody 	struct ecore_mcp_link_state	   link_output;
61ec94dbc5SRasesh Mody 	struct ecore_mcp_link_capabilities link_capabilities;
62610ccd98SRasesh Mody 
63ec94dbc5SRasesh Mody 	struct ecore_mcp_function_info	   func_info;
64ec94dbc5SRasesh Mody 
65ec94dbc5SRasesh Mody 	u8 *mfw_mb_cur;
66ec94dbc5SRasesh Mody 	u8 *mfw_mb_shadow;
67ec94dbc5SRasesh Mody 	u16 mfw_mb_length;
6822c99696SRasesh Mody 	u32 mcp_hist;
69652ee28aSRasesh Mody 
70652ee28aSRasesh Mody 	/* Capabilties negotiated with the MFW */
71652ee28aSRasesh Mody 	u32 capabilities;
72ec94dbc5SRasesh Mody };
73ec94dbc5SRasesh Mody 
74ffdd0599SHarish Patil struct ecore_mcp_mb_params {
75ffdd0599SHarish Patil 	u32 cmd;
76ffdd0599SHarish Patil 	u32 param;
77e32dc0f7SRasesh Mody 	void *p_data_src;
78e32dc0f7SRasesh Mody 	void *p_data_dst;
79ffdd0599SHarish Patil 	u32 mcp_resp;
80ffdd0599SHarish Patil 	u32 mcp_param;
81*3b307c55SRasesh Mody 	u8 data_src_size;
82*3b307c55SRasesh Mody 	u8 data_dst_size;
83*3b307c55SRasesh Mody 	u32 flags;
84*3b307c55SRasesh Mody #define ECORE_MB_FLAG_CAN_SLEEP         (0x1 << 0)
85*3b307c55SRasesh Mody #define ECORE_MB_FLAG_AVOID_BLOCK       (0x1 << 1)
86*3b307c55SRasesh Mody #define ECORE_MB_FLAGS_IS_SET(params, flag) \
87*3b307c55SRasesh Mody 	((params) != OSAL_NULL && ((params)->flags & ECORE_MB_FLAG_##flag))
88ffdd0599SHarish Patil };
89ffdd0599SHarish Patil 
9043ef668cSRasesh Mody struct ecore_drv_tlv_hdr {
9143ef668cSRasesh Mody 	u8 tlv_type;	/* According to the enum below */
9243ef668cSRasesh Mody 	u8 tlv_length;	/* In dwords - not including this header */
9343ef668cSRasesh Mody 	u8 tlv_reserved;
9443ef668cSRasesh Mody #define ECORE_DRV_TLV_FLAGS_CHANGED 0x01
9543ef668cSRasesh Mody 	u8 tlv_flags;
9643ef668cSRasesh Mody };
9743ef668cSRasesh Mody 
98ec94dbc5SRasesh Mody /**
99ec94dbc5SRasesh Mody  * @brief Initialize the interface with the MCP
100ec94dbc5SRasesh Mody  *
101ec94dbc5SRasesh Mody  * @param p_hwfn - HW func
102ec94dbc5SRasesh Mody  * @param p_ptt - PTT required for register access
103ec94dbc5SRasesh Mody  *
104ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
105ec94dbc5SRasesh Mody  */
106ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_cmd_init(struct ecore_hwfn *p_hwfn,
107ec94dbc5SRasesh Mody 					struct ecore_ptt *p_ptt);
108ec94dbc5SRasesh Mody 
109ec94dbc5SRasesh Mody /**
110ec94dbc5SRasesh Mody  * @brief Initialize the port interface with the MCP
111ec94dbc5SRasesh Mody  *
112ec94dbc5SRasesh Mody  * @param p_hwfn
113ec94dbc5SRasesh Mody  * @param p_ptt
114dd7b6aadSRasesh Mody  * Can only be called after `num_ports_in_engine' is set
115ec94dbc5SRasesh Mody  */
116ec94dbc5SRasesh Mody void ecore_mcp_cmd_port_init(struct ecore_hwfn *p_hwfn,
117ec94dbc5SRasesh Mody 			     struct ecore_ptt *p_ptt);
118ec94dbc5SRasesh Mody /**
119ec94dbc5SRasesh Mody  * @brief Releases resources allocated during the init process.
120ec94dbc5SRasesh Mody  *
121ec94dbc5SRasesh Mody  * @param p_hwfn - HW func
122ec94dbc5SRasesh Mody  * @param p_ptt - PTT required for register access
123ec94dbc5SRasesh Mody  *
124ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
125ec94dbc5SRasesh Mody  */
126ec94dbc5SRasesh Mody 
127ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_free(struct ecore_hwfn *p_hwfn);
128ec94dbc5SRasesh Mody 
129ec94dbc5SRasesh Mody /**
130ec94dbc5SRasesh Mody  * @brief This function is called from the DPC context. After
131ec94dbc5SRasesh Mody  * pointing PTT to the mfw mb, check for events sent by the MCP
132ec94dbc5SRasesh Mody  * to the driver and ack them. In case a critical event
133ec94dbc5SRasesh Mody  * detected, it will be handled here, otherwise the work will be
134ec94dbc5SRasesh Mody  * queued to a sleepable work-queue.
135ec94dbc5SRasesh Mody  *
136ec94dbc5SRasesh Mody  * @param p_hwfn - HW function
137ec94dbc5SRasesh Mody  * @param p_ptt - PTT required for register access
138ec94dbc5SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation
139ec94dbc5SRasesh Mody  * was successul.
140ec94dbc5SRasesh Mody  */
141ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_handle_events(struct ecore_hwfn *p_hwfn,
142ec94dbc5SRasesh Mody 					     struct ecore_ptt *p_ptt);
143ec94dbc5SRasesh Mody 
144ec94dbc5SRasesh Mody /**
145ec94dbc5SRasesh Mody  * @brief When MFW doesn't get driver pulse for couple of seconds, at some
146ec94dbc5SRasesh Mody  * threshold before timeout expires, it will generate interrupt
147ec94dbc5SRasesh Mody  * through a dedicated status block (DPSB - Driver Pulse Status
148ec94dbc5SRasesh Mody  * Block), which the driver should respond immediately, by
149ec94dbc5SRasesh Mody  * providing keepalive indication after setting the PTT to the
150ec94dbc5SRasesh Mody  * driver-MFW mailbox. This function is called directly from the
151ec94dbc5SRasesh Mody  * DPC upon receiving the DPSB attention.
152ec94dbc5SRasesh Mody  *
153ec94dbc5SRasesh Mody  * @param p_hwfn - hw function
154ec94dbc5SRasesh Mody  * @param p_ptt - PTT required for register access
155ec94dbc5SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation
1560b6bf70dSRasesh Mody  * was successful.
157ec94dbc5SRasesh Mody  */
158ec94dbc5SRasesh Mody enum _ecore_status_t ecore_issue_pulse(struct ecore_hwfn *p_hwfn,
159ec94dbc5SRasesh Mody 				       struct ecore_ptt *p_ptt);
160ec94dbc5SRasesh Mody 
1610b6bf70dSRasesh Mody enum ecore_drv_role {
1620b6bf70dSRasesh Mody 	ECORE_DRV_ROLE_OS,
1630b6bf70dSRasesh Mody 	ECORE_DRV_ROLE_KDUMP,
1640b6bf70dSRasesh Mody };
1650b6bf70dSRasesh Mody 
1660b6bf70dSRasesh Mody struct ecore_load_req_params {
167c5e11089SRasesh Mody 	/* Input params */
1680b6bf70dSRasesh Mody 	enum ecore_drv_role drv_role;
1690b6bf70dSRasesh Mody 	u8 timeout_val; /* 1..254, '0' - default value, '255' - no timeout */
1700b6bf70dSRasesh Mody 	bool avoid_eng_reset;
171c5e11089SRasesh Mody 	enum ecore_override_force_load override_force_load;
172c5e11089SRasesh Mody 
173c5e11089SRasesh Mody 	/* Output params */
1740b6bf70dSRasesh Mody 	u32 load_code;
1750b6bf70dSRasesh Mody };
1760b6bf70dSRasesh Mody 
177ec94dbc5SRasesh Mody /**
1780b6bf70dSRasesh Mody  * @brief Sends a LOAD_REQ to the MFW, and in case the operation succeeds,
1790b6bf70dSRasesh Mody  *        returns whether this PF is the first on the engine/port or function.
180ec94dbc5SRasesh Mody  *
1810b6bf70dSRasesh Mody  * @param p_hwfn
182e32dc0f7SRasesh Mody  * @param p_ptt
1830b6bf70dSRasesh Mody  * @param p_params
1840b6bf70dSRasesh Mody  *
1850b6bf70dSRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful.
186ec94dbc5SRasesh Mody  */
187ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_load_req(struct ecore_hwfn *p_hwfn,
188ec94dbc5SRasesh Mody 					struct ecore_ptt *p_ptt,
1890b6bf70dSRasesh Mody 					struct ecore_load_req_params *p_params);
190ec94dbc5SRasesh Mody 
191ec94dbc5SRasesh Mody /**
19260c78a5eSRasesh Mody  * @brief Sends a LOAD_DONE message to the MFW
19360c78a5eSRasesh Mody  *
19460c78a5eSRasesh Mody  * @param p_hwfn
19560c78a5eSRasesh Mody  * @param p_ptt
19660c78a5eSRasesh Mody  *
19760c78a5eSRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful.
19860c78a5eSRasesh Mody  */
19960c78a5eSRasesh Mody enum _ecore_status_t ecore_mcp_load_done(struct ecore_hwfn *p_hwfn,
20060c78a5eSRasesh Mody 					 struct ecore_ptt *p_ptt);
20160c78a5eSRasesh Mody 
20260c78a5eSRasesh Mody /**
20339f0eb3bSRasesh Mody  * @brief Sends a UNLOAD_REQ message to the MFW
20439f0eb3bSRasesh Mody  *
20539f0eb3bSRasesh Mody  * @param p_hwfn
20639f0eb3bSRasesh Mody  * @param p_ptt
20739f0eb3bSRasesh Mody  *
20839f0eb3bSRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful.
20939f0eb3bSRasesh Mody  */
21039f0eb3bSRasesh Mody enum _ecore_status_t ecore_mcp_unload_req(struct ecore_hwfn *p_hwfn,
21139f0eb3bSRasesh Mody 					  struct ecore_ptt *p_ptt);
21239f0eb3bSRasesh Mody 
21339f0eb3bSRasesh Mody /**
214e32dc0f7SRasesh Mody  * @brief Sends a UNLOAD_DONE message to the MFW
215e32dc0f7SRasesh Mody  *
216e32dc0f7SRasesh Mody  * @param p_hwfn
217e32dc0f7SRasesh Mody  * @param p_ptt
218e32dc0f7SRasesh Mody  *
219e32dc0f7SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful.
220e32dc0f7SRasesh Mody  */
221e32dc0f7SRasesh Mody enum _ecore_status_t ecore_mcp_unload_done(struct ecore_hwfn *p_hwfn,
222e32dc0f7SRasesh Mody 					   struct ecore_ptt *p_ptt);
223e32dc0f7SRasesh Mody 
224e32dc0f7SRasesh Mody /**
225ec94dbc5SRasesh Mody  * @brief Read the MFW mailbox into Current buffer.
226ec94dbc5SRasesh Mody  *
227ec94dbc5SRasesh Mody  * @param p_hwfn
228ec94dbc5SRasesh Mody  * @param p_ptt
229ec94dbc5SRasesh Mody  */
23022d07d93SRasesh Mody void ecore_mcp_read_mb(struct ecore_hwfn *p_hwfn,
23122d07d93SRasesh Mody 		       struct ecore_ptt *p_ptt);
232ec94dbc5SRasesh Mody 
233ec94dbc5SRasesh Mody /**
234ec94dbc5SRasesh Mody  * @brief Ack to mfw that driver finished FLR process for VFs
235ec94dbc5SRasesh Mody  *
236ec94dbc5SRasesh Mody  * @param p_hwfn
237ec94dbc5SRasesh Mody  * @param p_ptt
238ec94dbc5SRasesh Mody  * @param vfs_to_ack - bit mask of all engine VFs for which the PF acks.
239ec94dbc5SRasesh Mody  *
240ec94dbc5SRasesh Mody  * @param return enum _ecore_status_t - ECORE_SUCCESS upon success.
241ec94dbc5SRasesh Mody  */
242ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_ack_vf_flr(struct ecore_hwfn *p_hwfn,
243ec94dbc5SRasesh Mody 					  struct ecore_ptt *p_ptt,
244ec94dbc5SRasesh Mody 					  u32 *vfs_to_ack);
245ec94dbc5SRasesh Mody 
246ec94dbc5SRasesh Mody /**
247ec94dbc5SRasesh Mody  * @brief - calls during init to read shmem of all function-related info.
248ec94dbc5SRasesh Mody  *
249ec94dbc5SRasesh Mody  * @param p_hwfn
250ec94dbc5SRasesh Mody  *
251ec94dbc5SRasesh Mody  * @param return ECORE_SUCCESS upon success.
252ec94dbc5SRasesh Mody  */
253ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_fill_shmem_func_info(struct ecore_hwfn *p_hwfn,
254ec94dbc5SRasesh Mody 						    struct ecore_ptt *p_ptt);
255ec94dbc5SRasesh Mody 
256ec94dbc5SRasesh Mody /**
257ec94dbc5SRasesh Mody  * @brief - Reset the MCP using mailbox command.
258ec94dbc5SRasesh Mody  *
259ec94dbc5SRasesh Mody  * @param p_hwfn
260ec94dbc5SRasesh Mody  * @param p_ptt
261ec94dbc5SRasesh Mody  *
262ec94dbc5SRasesh Mody  * @param return ECORE_SUCCESS upon success.
263ec94dbc5SRasesh Mody  */
264ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_reset(struct ecore_hwfn *p_hwfn,
265ec94dbc5SRasesh Mody 				     struct ecore_ptt *p_ptt);
266ec94dbc5SRasesh Mody 
267ec94dbc5SRasesh Mody /**
268ec94dbc5SRasesh Mody  * @brief indicates whether the MFW objects [under mcp_info] are accessible
269ec94dbc5SRasesh Mody  *
270ec94dbc5SRasesh Mody  * @param p_hwfn
271ec94dbc5SRasesh Mody  *
272ec94dbc5SRasesh Mody  * @return true iff MFW is running and mcp_info is initialized
273ec94dbc5SRasesh Mody  */
274ec94dbc5SRasesh Mody bool ecore_mcp_is_init(struct ecore_hwfn *p_hwfn);
275ec94dbc5SRasesh Mody 
276ec94dbc5SRasesh Mody /**
277ec94dbc5SRasesh Mody  * @brief request MFW to configure MSI-X for a VF
278ec94dbc5SRasesh Mody  *
279ec94dbc5SRasesh Mody  * @param p_hwfn
280ec94dbc5SRasesh Mody  * @param p_ptt
281ec94dbc5SRasesh Mody  * @param vf_id - absolute inside engine
282ec94dbc5SRasesh Mody  * @param num_sbs - number of entries to request
283ec94dbc5SRasesh Mody  *
284ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
285ec94dbc5SRasesh Mody  */
286ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_config_vf_msix(struct ecore_hwfn *p_hwfn,
287ec94dbc5SRasesh Mody 					      struct ecore_ptt *p_ptt,
288ec94dbc5SRasesh Mody 					      u8 vf_id, u8 num);
289ec94dbc5SRasesh Mody 
290ec94dbc5SRasesh Mody /**
291ec94dbc5SRasesh Mody  * @brief - Halt the MCP.
292ec94dbc5SRasesh Mody  *
293ec94dbc5SRasesh Mody  * @param p_hwfn
294ec94dbc5SRasesh Mody  * @param p_ptt
295ec94dbc5SRasesh Mody  *
296ec94dbc5SRasesh Mody  * @param return ECORE_SUCCESS upon success.
297ec94dbc5SRasesh Mody  */
298ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_halt(struct ecore_hwfn *p_hwfn,
299ec94dbc5SRasesh Mody 				    struct ecore_ptt *p_ptt);
300ec94dbc5SRasesh Mody 
301ec94dbc5SRasesh Mody /**
302ec94dbc5SRasesh Mody  * @brief - Wake up the MCP.
303ec94dbc5SRasesh Mody  *
304ec94dbc5SRasesh Mody  * @param p_hwfn
305ec94dbc5SRasesh Mody  * @param p_ptt
306ec94dbc5SRasesh Mody  *
307ec94dbc5SRasesh Mody  * @param return ECORE_SUCCESS upon success.
308ec94dbc5SRasesh Mody  */
309ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_resume(struct ecore_hwfn *p_hwfn,
310ec94dbc5SRasesh Mody 				      struct ecore_ptt *p_ptt);
311ec94dbc5SRasesh Mody int __ecore_configure_pf_max_bandwidth(struct ecore_hwfn *p_hwfn,
312ec94dbc5SRasesh Mody 				       struct ecore_ptt *p_ptt,
313ec94dbc5SRasesh Mody 				       struct ecore_mcp_link_state *p_link,
314ec94dbc5SRasesh Mody 				       u8 max_bw);
315ec94dbc5SRasesh Mody int __ecore_configure_pf_min_bandwidth(struct ecore_hwfn *p_hwfn,
316ec94dbc5SRasesh Mody 				       struct ecore_ptt *p_ptt,
317ec94dbc5SRasesh Mody 				       struct ecore_mcp_link_state *p_link,
318ec94dbc5SRasesh Mody 				       u8 min_bw);
319ec94dbc5SRasesh Mody enum _ecore_status_t ecore_mcp_mask_parities(struct ecore_hwfn *p_hwfn,
320ec94dbc5SRasesh Mody 					     struct ecore_ptt *p_ptt,
321ec94dbc5SRasesh Mody 					     u32 mask_parities);
322301ea2d7SRasesh Mody /**
323301ea2d7SRasesh Mody  * @brief - Sends crash mdump related info to the MFW.
324301ea2d7SRasesh Mody  *
325301ea2d7SRasesh Mody  * @param p_hwfn
326301ea2d7SRasesh Mody  * @param p_ptt
327301ea2d7SRasesh Mody  *
328301ea2d7SRasesh Mody  * @param return ECORE_SUCCESS upon success.
329301ea2d7SRasesh Mody  */
330301ea2d7SRasesh Mody enum _ecore_status_t ecore_mcp_mdump_set_values(struct ecore_hwfn *p_hwfn,
331301ea2d7SRasesh Mody 						struct ecore_ptt *p_ptt,
332301ea2d7SRasesh Mody 						u32 epoch);
333301ea2d7SRasesh Mody 
334301ea2d7SRasesh Mody /**
335301ea2d7SRasesh Mody  * @brief - Triggers a MFW crash dump procedure.
336301ea2d7SRasesh Mody  *
337301ea2d7SRasesh Mody  * @param p_hwfn
338301ea2d7SRasesh Mody  * @param p_ptt
339a064d7d2SRasesh Mody  * @param epoch
340301ea2d7SRasesh Mody  *
341301ea2d7SRasesh Mody  * @param return ECORE_SUCCESS upon success.
342301ea2d7SRasesh Mody  */
343301ea2d7SRasesh Mody enum _ecore_status_t ecore_mcp_mdump_trigger(struct ecore_hwfn *p_hwfn,
344301ea2d7SRasesh Mody 					     struct ecore_ptt *p_ptt);
345301ea2d7SRasesh Mody 
346a064d7d2SRasesh Mody struct ecore_mdump_retain_data {
347a064d7d2SRasesh Mody 	u32 valid;
348a064d7d2SRasesh Mody 	u32 epoch;
349a064d7d2SRasesh Mody 	u32 pf;
350a064d7d2SRasesh Mody 	u32 status;
351a064d7d2SRasesh Mody };
352a064d7d2SRasesh Mody 
353a064d7d2SRasesh Mody /**
354a064d7d2SRasesh Mody  * @brief - Gets the mdump retained data from the MFW.
355a064d7d2SRasesh Mody  *
356a064d7d2SRasesh Mody  * @param p_hwfn
357a064d7d2SRasesh Mody  * @param p_ptt
358a064d7d2SRasesh Mody  * @param p_mdump_retain
359a064d7d2SRasesh Mody  *
360a064d7d2SRasesh Mody  * @param return ECORE_SUCCESS upon success.
361a064d7d2SRasesh Mody  */
362a064d7d2SRasesh Mody enum _ecore_status_t
363a064d7d2SRasesh Mody ecore_mcp_mdump_get_retain(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
364a064d7d2SRasesh Mody 			   struct ecore_mdump_retain_data *p_mdump_retain);
365a064d7d2SRasesh Mody 
366301ea2d7SRasesh Mody /**
36749ca6a7bSRasesh Mody  * @brief - Sets the MFW's max value for the given resource
36849ca6a7bSRasesh Mody  *
36949ca6a7bSRasesh Mody  *  @param p_hwfn
37049ca6a7bSRasesh Mody  *  @param p_ptt
37149ca6a7bSRasesh Mody  *  @param res_id
37249ca6a7bSRasesh Mody  *  @param resc_max_val
37349ca6a7bSRasesh Mody  *  @param p_mcp_resp
37449ca6a7bSRasesh Mody  *
37549ca6a7bSRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful.
37649ca6a7bSRasesh Mody  */
37749ca6a7bSRasesh Mody enum _ecore_status_t
37849ca6a7bSRasesh Mody ecore_mcp_set_resc_max_val(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
37949ca6a7bSRasesh Mody 			   enum ecore_resources res_id, u32 resc_max_val,
38049ca6a7bSRasesh Mody 			   u32 *p_mcp_resp);
38149ca6a7bSRasesh Mody 
38249ca6a7bSRasesh Mody /**
3839e2f08a4SRasesh Mody  * @brief - Gets the MFW allocation info for the given resource
3849e2f08a4SRasesh Mody  *
3859e2f08a4SRasesh Mody  *  @param p_hwfn
3869e2f08a4SRasesh Mody  *  @param p_ptt
38749ca6a7bSRasesh Mody  *  @param res_id
3889e2f08a4SRasesh Mody  *  @param p_mcp_resp
38949ca6a7bSRasesh Mody  *  @param p_resc_num
39049ca6a7bSRasesh Mody  *  @param p_resc_start
3919e2f08a4SRasesh Mody  *
3929e2f08a4SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful.
3939e2f08a4SRasesh Mody  */
39449ca6a7bSRasesh Mody enum _ecore_status_t
39549ca6a7bSRasesh Mody ecore_mcp_get_resc_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
39649ca6a7bSRasesh Mody 			enum ecore_resources res_id, u32 *p_mcp_resp,
39749ca6a7bSRasesh Mody 			u32 *p_resc_num, u32 *p_resc_start);
39822d07d93SRasesh Mody 
39940c926baSHarish Patil /**
40040c926baSHarish Patil  * @brief - Initiates PF FLR
40140c926baSHarish Patil  *
40240c926baSHarish Patil  * @param p_hwfn
40340c926baSHarish Patil  * @param p_ptt
40440c926baSHarish Patil  *
40540c926baSHarish Patil  * @param return ECORE_SUCCESS upon success.
40640c926baSHarish Patil  */
40740c926baSHarish Patil enum _ecore_status_t ecore_mcp_initiate_pf_flr(struct ecore_hwfn *p_hwfn,
40840c926baSHarish Patil 					       struct ecore_ptt *p_ptt);
40940c926baSHarish Patil 
41049ca6a7bSRasesh Mody #define ECORE_MCP_RESC_LOCK_MIN_VAL	RESOURCE_DUMP /* 0 */
41149ca6a7bSRasesh Mody #define ECORE_MCP_RESC_LOCK_MAX_VAL	31
41249ca6a7bSRasesh Mody 
41349ca6a7bSRasesh Mody enum ecore_resc_lock {
41449ca6a7bSRasesh Mody 	ECORE_RESC_LOCK_DBG_DUMP = ECORE_MCP_RESC_LOCK_MIN_VAL,
41549ca6a7bSRasesh Mody 	/* Locks that the MFW is aware of should be added here downwards */
41649ca6a7bSRasesh Mody 
41749ca6a7bSRasesh Mody 	/* Ecore only locks should be added here upwards */
41840a373fcSRasesh Mody 	ECORE_RESC_LOCK_RESC_ALLOC = ECORE_MCP_RESC_LOCK_MAX_VAL,
41940a373fcSRasesh Mody 
42040a373fcSRasesh Mody 	/* A dummy value to be used for auxiliary functions in need of
42140a373fcSRasesh Mody 	 * returning an 'error' value.
42240a373fcSRasesh Mody 	 */
42340a373fcSRasesh Mody 	ECORE_RESC_LOCK_RESC_INVALID,
42449ca6a7bSRasesh Mody };
42549ca6a7bSRasesh Mody 
42649ca6a7bSRasesh Mody struct ecore_resc_lock_params {
42749ca6a7bSRasesh Mody 	/* Resource number [valid values are 0..31] */
42849ca6a7bSRasesh Mody 	u8 resource;
42949ca6a7bSRasesh Mody 
43049ca6a7bSRasesh Mody 	/* Lock timeout value in seconds [default, none or 1..254] */
43149ca6a7bSRasesh Mody 	u8 timeout;
4328a20e270SRasesh Mody #define ECORE_MCP_RESC_LOCK_TO_DEFAULT	0
4338a20e270SRasesh Mody #define ECORE_MCP_RESC_LOCK_TO_NONE	255
4348a20e270SRasesh Mody 
43549ca6a7bSRasesh Mody 	/* Number of times to retry locking */
43649ca6a7bSRasesh Mody 	u8 retry_num;
43740a373fcSRasesh Mody #define ECORE_MCP_RESC_LOCK_RETRY_CNT_DFLT	10
43849ca6a7bSRasesh Mody 
43949ca6a7bSRasesh Mody 	/* The interval in usec between retries */
44049ca6a7bSRasesh Mody 	u16 retry_interval;
44140a373fcSRasesh Mody #define ECORE_MCP_RESC_LOCK_RETRY_VAL_DFLT	10000
44249ca6a7bSRasesh Mody 
44349ca6a7bSRasesh Mody 	/* Use sleep or delay between retries */
44449ca6a7bSRasesh Mody 	bool sleep_b4_retry;
44549ca6a7bSRasesh Mody 
44649ca6a7bSRasesh Mody 	/* Will be set as true if the resource is free and granted */
44749ca6a7bSRasesh Mody 	bool b_granted;
44849ca6a7bSRasesh Mody 
44949ca6a7bSRasesh Mody 	/* Will be filled with the resource owner.
45049ca6a7bSRasesh Mody 	 * [0..15 = PF0-15, 16 = MFW, 17 = diag over serial]
45149ca6a7bSRasesh Mody 	 */
45249ca6a7bSRasesh Mody 	u8 owner;
45349ca6a7bSRasesh Mody };
45449ca6a7bSRasesh Mody 
4558a20e270SRasesh Mody /**
4568a20e270SRasesh Mody  * @brief Acquires MFW generic resource lock
4578a20e270SRasesh Mody  *
4588a20e270SRasesh Mody  *  @param p_hwfn
4598a20e270SRasesh Mody  *  @param p_ptt
46049ca6a7bSRasesh Mody  *  @param p_params
4618a20e270SRasesh Mody  *
4628a20e270SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful.
4638a20e270SRasesh Mody  */
46449ca6a7bSRasesh Mody enum _ecore_status_t
46549ca6a7bSRasesh Mody ecore_mcp_resc_lock(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
46649ca6a7bSRasesh Mody 		    struct ecore_resc_lock_params *p_params);
46749ca6a7bSRasesh Mody 
46849ca6a7bSRasesh Mody struct ecore_resc_unlock_params {
46949ca6a7bSRasesh Mody 	/* Resource number [valid values are 0..31] */
47049ca6a7bSRasesh Mody 	u8 resource;
47149ca6a7bSRasesh Mody 
47249ca6a7bSRasesh Mody 	/* Allow to release a resource even if belongs to another PF */
47349ca6a7bSRasesh Mody 	bool b_force;
47449ca6a7bSRasesh Mody 
47549ca6a7bSRasesh Mody 	/* Will be set as true if the resource is released */
47649ca6a7bSRasesh Mody 	bool b_released;
47749ca6a7bSRasesh Mody };
4788a20e270SRasesh Mody 
4798a20e270SRasesh Mody /**
4808a20e270SRasesh Mody  * @brief Releases MFW generic resource lock
4818a20e270SRasesh Mody  *
4828a20e270SRasesh Mody  *  @param p_hwfn
4838a20e270SRasesh Mody  *  @param p_ptt
48449ca6a7bSRasesh Mody  *  @param p_params
4858a20e270SRasesh Mody  *
4868a20e270SRasesh Mody  * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful.
4878a20e270SRasesh Mody  */
48849ca6a7bSRasesh Mody enum _ecore_status_t
48949ca6a7bSRasesh Mody ecore_mcp_resc_unlock(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
49049ca6a7bSRasesh Mody 		      struct ecore_resc_unlock_params *p_params);
4918a20e270SRasesh Mody 
492652ee28aSRasesh Mody /**
49340a373fcSRasesh Mody  * @brief - default initialization for lock/unlock resource structs
49440a373fcSRasesh Mody  *
49540a373fcSRasesh Mody  * @param p_lock - lock params struct to be initialized; Can be OSAL_NULL
49640a373fcSRasesh Mody  * @param p_unlock - unlock params struct to be initialized; Can be OSAL_NULL
49740a373fcSRasesh Mody  * @param resource - the requested resource
49840a373fcSRasesh Mody  * @paral b_is_permanent - disable retries & aging when set
49940a373fcSRasesh Mody  */
50030ecf673SRasesh Mody void ecore_mcp_resc_lock_default_init(struct ecore_resc_lock_params *p_lock,
50140a373fcSRasesh Mody 				      struct ecore_resc_unlock_params *p_unlock,
50240a373fcSRasesh Mody 				      enum ecore_resc_lock resource,
50340a373fcSRasesh Mody 				      bool b_is_permanent);
50440a373fcSRasesh Mody 
50540a373fcSRasesh Mody /**
506652ee28aSRasesh Mody  * @brief Learn of supported MFW features; To be done during early init
507652ee28aSRasesh Mody  *
508652ee28aSRasesh Mody  * @param p_hwfn
509652ee28aSRasesh Mody  * @param p_ptt
510652ee28aSRasesh Mody  */
511652ee28aSRasesh Mody enum _ecore_status_t ecore_mcp_get_capabilities(struct ecore_hwfn *p_hwfn,
512652ee28aSRasesh Mody 						struct ecore_ptt *p_ptt);
513652ee28aSRasesh Mody 
514652ee28aSRasesh Mody /**
515652ee28aSRasesh Mody  * @brief Inform MFW of set of features supported by driver. Should be done
516652ee28aSRasesh Mody  * inside the contet of the LOAD_REQ.
517652ee28aSRasesh Mody  *
518652ee28aSRasesh Mody  * @param p_hwfn
519652ee28aSRasesh Mody  * @param p_ptt
520652ee28aSRasesh Mody  */
521652ee28aSRasesh Mody enum _ecore_status_t ecore_mcp_set_capabilities(struct ecore_hwfn *p_hwfn,
522652ee28aSRasesh Mody 						struct ecore_ptt *p_ptt);
523652ee28aSRasesh Mody 
524f5940e7dSRasesh Mody enum ecore_mcp_drv_attr_cmd {
525f5940e7dSRasesh Mody 	ECORE_MCP_DRV_ATTR_CMD_READ,
526f5940e7dSRasesh Mody 	ECORE_MCP_DRV_ATTR_CMD_WRITE,
527f5940e7dSRasesh Mody 	ECORE_MCP_DRV_ATTR_CMD_READ_CLEAR,
528f5940e7dSRasesh Mody 	ECORE_MCP_DRV_ATTR_CMD_CLEAR,
529f5940e7dSRasesh Mody };
530f5940e7dSRasesh Mody 
531f5940e7dSRasesh Mody struct ecore_mcp_drv_attr {
532f5940e7dSRasesh Mody 	enum ecore_mcp_drv_attr_cmd attr_cmd;
533f5940e7dSRasesh Mody 	u32 attr_num;
534f5940e7dSRasesh Mody 
535f5940e7dSRasesh Mody 	/* R/RC - will be set with the read value
536f5940e7dSRasesh Mody 	 * W - should hold the required value to be written
537f5940e7dSRasesh Mody 	 * C - DC
538f5940e7dSRasesh Mody 	 */
539f5940e7dSRasesh Mody 	u32 val;
540f5940e7dSRasesh Mody 
541f5940e7dSRasesh Mody 	/* W - mask/offset to be applied on the given value
542f5940e7dSRasesh Mody 	 * R/RC/C - DC
543f5940e7dSRasesh Mody 	 */
544f5940e7dSRasesh Mody 	u32 mask;
545f5940e7dSRasesh Mody 	u32 offset;
546f5940e7dSRasesh Mody };
547f5940e7dSRasesh Mody 
548f5940e7dSRasesh Mody /**
549f5940e7dSRasesh Mody  * @brief Handle the drivers' attributes that are kept by the MFW.
550f5940e7dSRasesh Mody  *
551f5940e7dSRasesh Mody  * @param p_hwfn
552f5940e7dSRasesh Mody  * @param p_ptt
553f5940e7dSRasesh Mody  * @param p_drv_attr
554f5940e7dSRasesh Mody  */
555f5940e7dSRasesh Mody enum _ecore_status_t
556f5940e7dSRasesh Mody ecore_mcp_drv_attribute(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
557f5940e7dSRasesh Mody 			struct ecore_mcp_drv_attr *p_drv_attr);
558f5940e7dSRasesh Mody 
55947af7019SRasesh Mody /**
56047af7019SRasesh Mody  * @brief Read ufp config from the shared memory.
56147af7019SRasesh Mody  *
56247af7019SRasesh Mody  * @param p_hwfn
56347af7019SRasesh Mody  * @param p_ptt
56447af7019SRasesh Mody  */
56547af7019SRasesh Mody void
56647af7019SRasesh Mody ecore_mcp_read_ufp_config(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
56747af7019SRasesh Mody 
5682fdeb693SRasesh Mody void ecore_mcp_wol_wr(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
5692fdeb693SRasesh Mody 		      u32 offset, u32 val);
5702fdeb693SRasesh Mody 
5713eed444aSRasesh Mody /**
5723eed444aSRasesh Mody  * @brief Get the engine affinity configuration.
5733eed444aSRasesh Mody  *
5743eed444aSRasesh Mody  * @param p_hwfn
5753eed444aSRasesh Mody  * @param p_ptt
5763eed444aSRasesh Mody  */
5773eed444aSRasesh Mody enum _ecore_status_t ecore_mcp_get_engine_config(struct ecore_hwfn *p_hwfn,
5783eed444aSRasesh Mody 						 struct ecore_ptt *p_ptt);
5793eed444aSRasesh Mody 
5803eed444aSRasesh Mody /**
5813eed444aSRasesh Mody  * @brief Get the PPFID bitmap.
5823eed444aSRasesh Mody  *
5833eed444aSRasesh Mody  * @param p_hwfn
5843eed444aSRasesh Mody  * @param p_ptt
5853eed444aSRasesh Mody  */
5863eed444aSRasesh Mody enum _ecore_status_t ecore_mcp_get_ppfid_bitmap(struct ecore_hwfn *p_hwfn,
5873eed444aSRasesh Mody 						struct ecore_ptt *p_ptt);
5883eed444aSRasesh Mody 
589ec94dbc5SRasesh Mody #endif /* __ECORE_MCP_H__ */
590