mcp_private.h revision 337519
1/*
2 * Copyright (c) 2017-2018 Cavium, Inc.
3 * All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions
7 *  are met:
8 *
9 *  1. Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 *  POSSIBILITY OF SUCH DAMAGE.
26 *
27 * $FreeBSD: stable/10/sys/dev/qlnx/qlnxe/mcp_private.h 337519 2018-08-09 01:39:47Z davidcs $
28 *
29 */
30
31/****************************************************************************
32 *
33 * Name:        mcp_private.h
34 *
35 * Description: MCP private data. Located in HSI only to provide debug access
36 *              for diag.
37 *
38 ****************************************************************************/
39
40#ifndef MCP_PRIVATE_H
41#define MCP_PRIVATE_H
42
43#if (!defined MFW_SIM) && (!defined RECOVERY)
44#include "eth.h"
45#include "pmm.h"
46#include "ah_eth.h"
47#include "e5_eth.h"
48#endif
49#include "global.h"
50#include "mcp_public.h"
51
52typedef enum active_mf_mode {
53	MF_MODE_SF = 0,
54	MF_MODE_MF_ALLOWED,
55	MF_MODE_MF_SWITCH_INDEPENDENT,
56	MF_MODE_NIV
57} active_mf_mode_t;
58
59enum ov_current_cfg {
60	CURR_CFG_NONE =	0,
61	CURR_CFG_OS,
62	CURR_CFG_VENDOR_SPEC,
63	CURR_CFG_OTHER,
64	CURR_CFG_VC_CLP,
65	CURR_CFG_CNU,
66	CURR_CFG_DCI,
67	CURR_CFG_HII,
68};
69
70struct dci_info_global {
71	u16 mba_ver;
72	u8 current_cfg;
73	u8 extern_dci_mgmt;
74	u8 pci_bus_num;
75	u8 boot_progress;
76};
77
78/* Resource allocation information of one resource */
79struct resource_info_private {
80	u16 size; /* number of allocated resources */
81	u16 offset; /* Offset of the 1st resource */
82	u8 flags;
83};
84
85/* Cache for resource allocation of one PF */
86struct res_alloc_cache {
87	u8 pf_num;
88	struct resource_info_private res[RESOURCE_MAX_NUM];
89};
90
91struct pf_sb_t {
92	u8 sb_for_pf_size;
93	u8 sb_for_pf_offset;
94	u8 sb_for_vf_size;
95	u8 sb_for_vf_offset;
96};
97
98/**************************************/
99/*                                    */
100/*     P R I V A T E    G L O B A L   */
101/*                                    */
102/**************************************/
103struct private_global {
104	active_mf_mode_t mf_mode; /* TBD - require initialization */
105	u32 exp_rom_nvm_addr;
106
107	/* The pmm_config structure holds all active phy/link configuration */
108#if (!defined MFW_SIM) && (!defined RECOVERY)
109#ifdef b900
110	struct pmm_config eth_cfg;
111#elif b940
112	struct ah_eth eth_cfg;
113#elif b510
114	struct e5_eth eth_cfg;
115#else
116#endif
117#endif
118	u32 lldp_counter;
119
120	u32 avs_init_timestamp;
121
122	u32 seconds_since_mcp_reset;
123
124	u32 last_malloc_dir_used_timestamp;
125#define MAX_USED_DIR_ALLOWED_TIME (3) /* Seconds */
126
127	u32 drv_nvm_state;
128	/* Per PF bitmask */
129#define DRV_NVM_STATE_IN_PROGRESS_MASK		(0x0001ffff)
130#define DRV_NVM_STATE_IN_PROGRESS_OFFSET	(0)
131#define DRV_NVM_STATE_IN_PROGRESS_VAL_MFW	(0x00010000)
132
133	u32 storm_fw_ver;
134
135	/* OneView data*/
136	struct dci_info_global dci_global;
137
138	/* Resource allocation cached data */
139	struct res_alloc_cache res_alloc;
140#define G_RES_ALLOC_P	(&g_spad.private_data.global.res_alloc)
141	u32 resource_max_values[RESOURCE_MAX_NUM];
142	u32 glb_counter_100ms;
143	/*collection of global bits and controls*/
144	u32 flags_and_ctrl;
145#define PRV_GLOBAL_FIO_BMB_INITIATED_MASK				0x00000001
146#define PRV_GLOBAL_FIO_BMB_INITIATED_OFFSET				0
147#define PRV_GLOBAL_ENABLE_NET_THREAD_LONG_RUN_MASK		0x00000002
148#define PRV_GLOBAL_ENABLE_NET_THREAD_LONG_RUN_OFFSET	1
149
150#ifdef b900
151	u32 es_fir_engines : 8, es_fir_valid_bitmap : 8, es_l2_engines : 8, es_l2_valid_bitmap : 8;
152#endif
153	u64 ecc_events;
154};
155
156/**************************************/
157/*                                    */
158/*     P R I V A T E    P A T H       */
159/*                                    */
160/**************************************/
161struct private_path {
162	u32 recovery_countdown; /* Counting down 2 seconds, using TMR3 */
163#define RECOVERY_MAX_COUNTDOWN_SECONDS 2
164
165	u32 drv_load_vars; /* When the seconds_since_mcp_reset gets here */
166#define DRV_LOAD_DEF_TIMEOUT 10
167#define DRV_LOAD_TIMEOUT_MASK			0x0000ffff
168#define DRV_LOAD_TIMEOUT_OFFSET			0
169#define DRV_LOAD_NEED_FORCE_MASK		0xffff0000
170#define DRV_LOAD_NEED_FORCE_OFFSET		16
171	struct load_rsp_stc drv_load_params;
172	u64 ecc_events;
173};
174
175
176/**************************************/
177/*                                    */
178/*     P R I V A T E    P O R T       */
179/*                                    */
180/**************************************/
181struct drv_port_info_t {
182	u32_t port_state;
183#define DRV_STATE_LINK_LOCK_FLAG                    0x00000001
184#define DRV_WAIT_DBG_PRN                            0x00000002
185
186	/* There are maximum 8 PFs per port */
187#define DRV_STATE_LOADED_MASK                       0x0000ff00
188#define DRV_STATE_LOADED_OFFSET                      8
189
190#define DRV_STATE_PF_TRANSITION_MASK                0x00ff0000
191#define DRV_STATE_PF_TRANSITION_OFFSET               16
192
193#define DRV_STATE_PF_PHY_INIT_MASK	                 0xff000000
194#define DRV_STATE_PF_PHY_INIT_OFFSET                 24
195};
196
197typedef enum _lldp_subscriber_e {
198	LLDP_SUBSCRIBER_MANDATORY = 0,
199	LLDP_SUBSCRIBER_SYSTEM,
200	LLDP_SUBSCRIBER_DCBX_IEEE,
201	LLDP_SUBSCRIBER_DCBX_CEE,
202	LLDP_SUBSCRIBER_EEE,
203	LLDP_SUBSCRIBER_CDCP,
204	LLDP_SUBSCRIBER_DCI,
205	LLDP_SUBSCRIBER_UFP,
206	LLDP_SUBSCRIBER_NCSI,
207	MAX_SUBSCRIBERS
208} lldp_subscriber_e;
209
210typedef struct {
211	u16 valid;
212	u16 type_len;
213#define LLDP_LEN_MASK           (0x01ff)
214#define LLDP_LEN_OFFSET          (0)
215#define LLDP_TYPE_MASK          (0xfe00)
216#define LLDP_TYPE_OFFSET         (9)
217	u8 *value_p;
218} tlv_s;
219
220typedef u16(*lldp_prepare_tlv_func)(u8 port, lldp_agent_e lldp_agent, u8 *buffer);
221
222typedef struct {
223	u16 valid;
224	lldp_prepare_tlv_func func;
225} subscriber_callback_send_s;
226
227typedef u8(*lldp_process_func)(u8 port, u8 num, u8 **tlvs);
228
229#define MAX_NUM_SUBTYPES	4
230typedef struct {
231	u8 valid;
232	u8 oui[3];
233	u8 subtype_list[MAX_NUM_SUBTYPES];
234	u8 num_subtypes;
235	lldp_process_func func;
236} subscriber_callback_receive_s;
237
238#define MAX_ETH_HEADER      14  /* TODO: to be extended per requirements */
239#define MAX_PACKET_SIZE     (1516)  /* So it can be devided by 4 */
240#define LLDP_CHASSIS_ID_TLV_LEN     7
241#define LLDP_PORT_ID_TLV_LEN     7
242typedef struct {
243	u16 len;
244	u8 header[MAX_ETH_HEADER];
245} lldp_eth_header_s;
246
247typedef struct {
248	struct lldp_config_params_s lldp_config_params;
249	u16 lldp_ttl;
250	u8 lldp_cur_credit;
251	subscriber_callback_send_s subscriber_callback_send[MAX_SUBSCRIBERS];
252	lldp_eth_header_s lldp_eth_header;
253	u32 lldp_time_to_send;
254	u32 lldp_ttl_expired;
255	u32 lldp_sent;
256	u8 first_lldp;
257	subscriber_callback_receive_s subscriber_callback_receive[MAX_SUBSCRIBERS];
258} lldp_params_s;
259
260#define MAX_TLVS		20
261typedef struct {
262	u8 current_received_tlv_index;
263	u8 *received_tlvs[MAX_TLVS];
264} lldp_receive_data_s;
265
266#define MAX_REGISTERED_TLVS	12
267
268typedef struct {
269	u32 config; /* Uses same defines as local config plus some more below*/
270#define DCBX_MODE_MASK				0x00000010
271#define DCBX_MODE_OFFSET				4
272#define DCBX_MODE_DRIVER			0
273#define DCBX_MODE_DEFAULT			1
274#define DCBX_CHANGED_MASK			0x00000f00
275#define DCBX_CHANGED_OFFSET			8
276#define DCBX_CONTROL_CHANGED_MASK		0x00000100
277#define DCBX_CONTROL_CHANGED_OFFSET		8
278#define DCBX_PFC_CHANGED_MASK			0x00000200
279#define DCBX_PFC_CHANGED_OFFSET			9
280#define DCBX_ETS_CHANGED_MASK			0x00000400
281#define DCBX_ETS_CHANGED_OFFSET			10
282#define DCBX_APP_CHANGED_MASK			0x00000800
283#define DCBX_APP_CHANGED_OFFSET			11
284
285	u32 seq_no;
286	u32 ack_no;
287	u32 received_seq_no;
288	u8 tc_map[8];
289	u8 num_used_tcs;
290} dcbx_state_s;
291
292#ifdef CONFIG_HP_DCI_SUPPORT
293struct dci_info_port {
294	u32 config;
295#define DCI_PORT_CFG_ENABLE_OFFSET		(0)
296#define DCI_PORT_CFG_ENABLE_MASK		(1 << DCI_PORT_CFG_ENABLE_OFFSET)
297#define DCI_PORT_CFG_ENABLE_DIAG_OFFSET		(1)
298#define DCI_PORT_CFG_ENABLE_DIAG_MASK		(1 << DCI_PORT_CFG_ENABLE_DIAG_OFFSET)
299#define DCI_PORT_CFG_DIAG_L_LOOP_OFFSET		(2)
300#define DCI_PORT_CFG_DIAG_L_LOOP_MASK		(1 << DCI_PORT_CFG_DIAG_L_LOOP_OFFSET)
301#define DCI_PORT_CFG_DIAG_R_LOOP_OFFSET		(3)
302#define DCI_PORT_CFG_DIAG_R_LOOP_MASK		(1 << DCI_PORT_CFG_DIAG_R_LOOP_OFFSET)
303
304};
305#endif
306
307struct lldp_cdcp {
308	u32 flags;
309#define	NTPMR_TTL_EXPIRED		0x00000001
310#define CDCP_TLV_RCVD			0x00000002
311#define CDCP_TLV_SENT			0x00000004
312
313	u32 remote_mib;
314#define CDCP_ROLE_MASK			0x00000001
315#define CDCP_ROLE_OFFSET			0
316#define CDCP_ROLE_BRIDGE		0x0
317#define CDCP_ROLE_STATION		0x1
318
319#define CDCP_SCOMP_MASK			0x00000002
320#define CDCP_SCOMP_OFFSET		1
321
322#define CDCP_CHAN_CAP_MASK		0x0000fff0
323#define CDCP_CHAN_CAP_OFFSET		4
324
325	u32 num_of_chan;
326};
327
328/* Accommodates link-tlv size for max-pf scids (27) + end-of-tlv size (2) */
329#define UFP_REQ_MAX_PAYLOAD_SIZE		(32)
330
331/* Accommodates max-NIC props-tlv-size (117:5 +(16*7)), link-tlv (27),
332 * end-tlv (2).
333 */
334#define UFP_RSP_MAX_PAYLOAD_SIZE		(160)
335struct ufp_info_port {
336	u8 req_payload[UFP_REQ_MAX_PAYLOAD_SIZE];
337	u8 rsp_payload[UFP_RSP_MAX_PAYLOAD_SIZE];
338	u16 req_len;
339	u16 rsp_len;
340	u8 switch_version;
341	u8 switch_status;
342	u8 flags;
343#define UFP_CAP_ENABLED			(1 << 0)
344#define UFP_REQ_SENT			(1 << 1)
345#define UFP_RSP_SENT			(1 << 2)
346#define UFP_CAP_SENT			(1 << 3)
347	u8 pending_flags;
348#define UFP_REQ_PENDING			(1 << 0)
349#define UFP_RSP_PENDING			(1 << 1)
350};
351
352#define UFP_ENABLED(_port_)			\
353	(g_spad.private_data.port[_port_].ufp_port.flags & UFP_CAP_ENABLED)
354
355/* Max 200-byte packet, accommodates UFP_RSP_MAX_PAYLOAD_SIZE */
356#define ECP_MAX_PKT_SIZE		(200)
357
358/* Tx-state machine, Qbg variable names specified in comments on the right */
359struct ecp_tx_state {
360	u8 tx_pkt[ECP_MAX_PKT_SIZE];
361	BOOL ulp_req_rcvd;	/* requestReceived */
362	BOOL ack_rcvd;		/* ackReceived */
363	u16 req_seq_num;	/* sequence */
364
365	/* State used for timer-based retries */
366	u16 ack_timer_counter;
367#define ECP_TIMEOUT_COUNT		1	/* 1 second to detect ACK timeout */
368	u16 num_retries;	/* retries */
369#define ECP_MAX_RETRIES			3
370	u32 tx_errors;		/* txErrors */
371	u32 ulp_pkt_len;
372};
373
374typedef void (*ulp_rx_indication_t)(u8 port, u16 subtype, u32 pkt_len, u8 *pkt);
375/* Rx state machine, Qbg variable names specified in comments on the right */
376struct ecp_rx_state {
377	BOOL ecpdu_rcvd;	/* ecpduReceived */
378	u16 last_req_seq;	/* lastSeq */
379	u8 first_req_rcvd;
380	u8 rsvd;
381	ulp_rx_indication_t rx_cb_func;
382};
383
384struct ecp_state_s {
385	struct ecp_tx_state tx_state;
386	struct ecp_rx_state rx_state;
387	u16 subtype;
388};
389
390struct private_port {
391	struct drv_port_info_t port_info;
392	active_mf_mode_t mf_mode;
393	u32 prev_link_change_count;
394	/* LLDP structures */
395	lldp_params_s lldp_params[LLDP_MAX_LLDP_AGENTS];
396	lldp_receive_data_s lldp_receive_data[MAX_SUBSCRIBERS];
397
398	/* DCBX */
399	dcbx_state_s dcbx_state;
400
401	u32 net_buffer[MAX_PACKET_SIZE / 4]; /* Buffer to send any packet to network */
402
403	/* time stamp of the end of NIG drain time for the TX drain */
404	u32 nig_drain_end_ts;
405	/* time stamp of the end of NIG drain time for the TC pause drain, this timer is used togther for all TC */
406	u32 nig_drain_tc_end_ts;
407	u32 tc_drain_en_bitmap;
408	tlv_s lldp_core_tlv_desc[LLDP_MAX_LLDP_AGENTS][MAX_REGISTERED_TLVS];
409	u8 current_core_tlv_num[LLDP_MAX_LLDP_AGENTS];
410	struct mcp_mac lldp_mac;
411#ifdef CONFIG_HP_DCI_SUPPORT
412	struct dci_info_port dci_port;
413#endif
414	struct lldp_cdcp cdcp_info;
415	struct ufp_info_port ufp_port;
416	struct ecp_state_s ecp_info;
417	struct lldp_stats_stc lldp_stats[LLDP_MAX_LLDP_AGENTS];
418	u32 temperature;
419	u8 prev_ext_lasi_status;
420	u8 rsvd1;
421	u16 rsvd2;
422
423};
424
425/**************************************/
426/*                                    */
427/*     P R I V A T E    F U N C       */
428/*                                    */
429/**************************************/
430struct drv_func_info_t {
431	u32_t func_state;
432#define DRV_STATE_UNKNOWN                           0x00000000
433#define DRV_STATE_UNLOADED                          0x00000001
434#define DRV_STATE_D3                                0x00000004
435
436#define DRV_STATE_PRESENT_FLAG                      0x00000100
437#define DRV_STATE_RUNNING                          (0x00000002 | DRV_STATE_PRESENT_FLAG)
438
439#define DRV_STATE_NOT_RESPONDING                    0x00000003 /* Will result with non-zero value when compared with DRV_STATE_RUNNING or with DRV_STATE_UNLOADED */
440#define DRV_STATE_BACK_AFTER_TO                    (DRV_STATE_NOT_RESPONDING | DRV_STATE_PRESENT_FLAG)
441
442#define DRV_STATE_DIAG                             (0x00000010 | DRV_STATE_PRESENT_FLAG)
443
444#define DRV_STATE_TRANSITION_FLAG                   0x00001000
445#define DRV_STATE_LOADING_TRANSITION               (DRV_STATE_TRANSITION_FLAG | DRV_STATE_PRESENT_FLAG)
446#define DRV_STATE_UNLOADING_TRANSITION             (DRV_STATE_TRANSITION_FLAG | DRV_STATE_PRESENT_FLAG | DRV_STATE_UNLOADED)
447
448	u32_t driver_last_activity;
449
450	u32_t wol_mac_addr[2];
451	u32_t drv_feature_support; /* See DRV_MB_PARAM_FEATURE_SUPPORT_FUNC_* */
452
453	u8_t unload_wol_param; /* See drv_mb_param */
454	u8_t eswitch_mode;
455	u8_t ppfid_bmp;
456};
457
458struct dci_info_func {
459	u8 config;
460#define DCI_FUNC_CFG_FNIC_ENABLE_OFFSET		(0)
461#define DCI_FUNC_CFG_FNIC_ENABLE_MASK		(1 << DCI_FUNC_CFG_FNIC_ENABLE_OFFSET)
462#define DCI_FUNC_CFG_OS_MTU_OVERRIDE_OFFSET	(1)
463#define DCI_FUNC_CFG_OS_MTU_OVERRIDE_MASK	(1 << DCI_FUNC_CFG_OS_MTU_OVERRIDE_OFFSET)
464#define DCI_FUNC_CFG_DIAG_WOL_ENABLE_OFFSET	(2)
465#define DCI_FUNC_CFG_DIAG_WOL_ENABLE_MASK	(1 << DCI_FUNC_CFG_DIAG_WOL_ENABLE_OFFSET)
466
467	u8 drv_state;
468	u16 fcoe_cvid;
469	u8 fcoe_fabric_name[8];
470#define CONNECTION_ID_LENGTH			16
471	u8 local_conn_id[CONNECTION_ID_LENGTH];
472};
473
474struct private_func {
475	struct drv_func_info_t func_info;
476	u32 init_hw_page;
477	struct pf_sb_t sb;
478	struct dci_info_func dci_func;
479};
480
481
482/**************************************/
483/*                                    */
484/*     P R I V A T E    D A T A       */
485/*                                    */
486/**************************************/
487struct mcp_private_data {
488	/* Basically no need for section offsets here, since this is private data.
489	 * TBD - should consider adding section offsets if we want diag to parse this correctly !!
490	 */
491	struct private_global global;
492	struct private_path path[MCP_GLOB_PATH_MAX];
493	struct private_port port[MCP_GLOB_PORT_MAX];
494	struct private_func func[MCP_GLOB_FUNC_MAX];
495
496};
497#endif /* MCP_PRIVATE_H */
498