1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, v.1,  (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 
22 /*
23 * Copyright 2014-2017 Cavium, Inc.
24 * The contents of this file are subject to the terms of the Common Development
25 * and Distribution License, v.1,  (the "License").
26 
27 * You may not use this file except in compliance with the License.
28 
29 * You can obtain a copy of the License at available
30 * at http://opensource.org/licenses/CDDL-1.0
31 
32 * See the License for the specific language governing permissions and
33 * limitations under the License.
34 */
35 
36 /****************************************************************************
37  *
38  * Name:        mcp_private.h
39  *
40  * Description: MCP private data. Located in HSI only to provide debug access
41  *              for diag.
42  *
43  ****************************************************************************/
44 
45 #ifndef MCP_PRIVATE_H
46 #define MCP_PRIVATE_H
47 
48 #if (!defined MFW_SIM) && (!defined RECOVERY)
49 #include "eth.h"
50 #include "pmm.h"
51 #include "ah_eth.h"
52 #endif
53 #include "mcp_public.h"
54 
55 typedef enum active_mf_mode {
56 	MF_MODE_SF = 0,
57 	MF_MODE_MF_ALLOWED,
58 	MF_MODE_MF_SWITCH_INDEPENDENT,
59 	MF_MODE_NIV
60 } active_mf_mode_t;
61 
62 enum ov_current_cfg {
63 	CURR_CFG_NONE =	0,
64 	CURR_CFG_OS,
65 	CURR_CFG_VENDOR_SPEC,
66 	CURR_CFG_OTHER,
67 	CURR_CFG_VC_CLP,
68 	CURR_CFG_CNU,
69 	CURR_CFG_DCI,
70 	CURR_CFG_HII,
71 };
72 
73 struct dci_info_global {
74 	enum ov_current_cfg current_cfg;
75 	u8 pci_bus_num;
76 	u8 boot_progress;
77 };
78 
79 /* Resource allocation information of one resource */
80 struct resource_info_private {
81 	u16 size; /* number of allocated resources */
82 	u16 offset; /* Offset of the 1st resource */
83 	u8 flags;
84 };
85 
86 /* Cache for resource allocation of one PF */
87 struct res_alloc_cache {
88 	u8 pf_num;
89 	struct resource_info_private res[RESOURCE_MAX_NUM];
90 };
91 
92 struct pf_sb_t {
93 	u8 sb_for_pf_size;
94 	u8 sb_for_pf_offset;
95 	u8 sb_for_vf_size;
96 	u8 sb_for_vf_offset;
97 };
98 
99 /**************************************/
100 /*                                    */
101 /*     P R I V A T E    G L O B A L   */
102 /*                                    */
103 /**************************************/
104 struct private_global {
105 	active_mf_mode_t mf_mode; /* TBD - require initialization */
106 	u32 exp_rom_nvm_addr;
107 
108 	/* The pmm_config structure holds all active phy/link configuration */
109 #ifndef RECOVERY
110 #ifdef b900
111 	struct pmm_config eth_cfg;
112 #else
113 	struct ah_eth eth_cfg;
114 #endif
115 #endif
116 
117 	u32 lldp_counter;
118 
119 	u32 avs_init_timestamp;
120 
121 	u32 seconds_since_mcp_reset;
122 
123 	u32 last_malloc_dir_used_timestamp;
124 #define MAX_USED_DIR_ALLOWED_TIME (3) /* Seconds */
125 
126 	u32 drv_nvm_state;
127 	/* Per PF bitmask */
128 #define DRV_NVM_STATE_IN_PROGRESS_MASK		(0x0000ffff)
129 #define DRV_NVM_STATE_IN_PROGRESS_OFFSET	(0)
130 
131 	u32 storm_fw_ver;
132 
133 	/* OneView data*/
134 	struct dci_info_global dci_global;
135 
136 	/* Resource allocation cached data */
137 	struct res_alloc_cache res_alloc;
138 #define G_RES_ALLOC_P	(&g_spad.private_data.global.res_alloc)
139 	u32 resource_max_values[RESOURCE_MAX_NUM];
140 };
141 
142 /**************************************/
143 /*                                    */
144 /*     P R I V A T E    P A T H       */
145 /*                                    */
146 /**************************************/
147 struct private_path {
148 	u32 recovery_countdown; /* Counting down 2 seconds, using TMR3 */
149 #define RECOVERY_MAX_COUNTDOWN_SECONDS 2
150 
151 	u32 drv_load_vars; /* When the seconds_since_mcp_reset gets here */
152 #define DRV_LOAD_TIMEOUT_MASK			0x0000ffff
153 #define DRV_LOAD_TIMEOUT_SHIFT			0
154 #define DRV_LOAD_NEED_FORCE_MASK		0xffff0000
155 #define DRV_LOAD_NEED_FORCE_SHIFT		16
156 	struct load_rsp_stc drv_load_params;
157 };
158 
159 
160 /**************************************/
161 /*                                    */
162 /*     P R I V A T E    P O R T       */
163 /*                                    */
164 /**************************************/
165 struct drv_port_info_t {
166 	u32_t port_state;
167 #define DRV_STATE_LINK_LOCK_FLAG                    0x00000001
168 #define DRV_WAIT_DBG_PRN                            0x00000002
169 
170 	/* There are maximum 8 PFs per port */
171 #define DRV_STATE_LOADED_MASK                       0x0000ff00
172 #define DRV_STATE_LOADED_SHIFT                      8
173 
174 #define DRV_STATE_PF_TRANSITION_MASK                0x00ff0000
175 #define DRV_STATE_PF_TRANSITION_SHIFT               16
176 
177 #define DRV_STATE_PF_PHY_INIT_MASK	                 0xff000000
178 #define DRV_STATE_PF_PHY_INIT_SHIFT                 24
179 };
180 
181 typedef enum _lldp_subscriber_e {
182 	LLDP_SUBSCRIBER_MANDATORY = 0,
183 	LLDP_SUBSCRIBER_DCBX_IEEE,
184 	LLDP_SUBSCRIBER_DCBX_CEE,
185 	LLDP_SUBSCRIBER_EEE,
186 	LLDP_SUBSCRIBER_DCI,
187 	MAX_SUBSCRIBERS
188 } lldp_subscriber_e;
189 
190 typedef struct {
191 	u16 valid;
192 	u16 type_len;
193 #define LLDP_LEN_MASK           (0x01ff)
194 #define LLDP_LEN_SHIFT          (0)
195 #define LLDP_TYPE_MASK          (0xfe00)
196 #define LLDP_TYPE_SHIFT         (9)
197 	u8 *value_p;
198 } tlv_s;
199 
200 typedef u16(*lldp_prepare_tlv_func)(u8 port, lldp_agent_e lldp_agent, u8 *buffer);
201 
202 typedef struct {
203 	u16 valid;
204 	lldp_prepare_tlv_func func;
205 } subscriber_callback_send_s;
206 
207 typedef u8(*lldp_process_func)(u8 port, u8 num, u8 **tlvs);
208 
209 #define MAX_NUM_SUBTYPES	4
210 typedef struct {
211 	u8 valid;
212 	u8 oui[3];
213 	u8 subtype_list[MAX_NUM_SUBTYPES];
214 	u8 num_subtypes;
215 	lldp_process_func func;
216 } subscriber_callback_receive_s;
217 
218 #define MAX_ETH_HEADER      14  /* TODO: to be extended per requirements */
219 #define MAX_PACKET_SIZE     (1516)  /* So it can be devided by 4 */
220 #define LLDP_CHASSIS_ID_TLV_LEN     7
221 #define LLDP_PORT_ID_TLV_LEN     7
222 #define MAX_TLV_BUFFER		128 /* In dwords. 512 in bytes*/
223 typedef struct {
224 	u16 len;
225 	u8 header[MAX_ETH_HEADER];
226 } lldp_eth_header_s;
227 
228 typedef struct {
229 	struct lldp_config_params_s lldp_config_params;
230 	u16 lldp_ttl;
231 	u8 lldp_cur_credit;
232 	subscriber_callback_send_s subscriber_callback_send[MAX_SUBSCRIBERS];
233 	lldp_eth_header_s lldp_eth_header;
234 	u32 lldp_time_to_send;
235 	u32 lldp_ttl_expired;
236 	u32 lldp_sent;
237 	u8 first_lldp;
238 	subscriber_callback_receive_s subscriber_callback_receive[MAX_SUBSCRIBERS];
239 } lldp_params_s;
240 
241 #define MAX_TLVS		20
242 typedef struct {
243 	u8 current_received_tlv_index;
244 	u8 *received_tlvs[MAX_TLVS];
245 } lldp_receive_data_s;
246 
247 #define MAX_REGISTERED_TLVS	6
248 
249 typedef struct {
250 	u32 config; /* Uses same defines as local config plus some more below*/
251 #define DCBX_MODE_MASK				0x00000010
252 #define DCBX_MODE_SHIFT				4
253 #define DCBX_MODE_DRIVER			0
254 #define DCBX_MODE_DEFAULT			1
255 #define DCBX_CHANGED_MASK			0x00000f00
256 #define DCBX_CHANGED_SHIFT			8
257 #define DCBX_CONTROL_CHANGED_MASK		0x00000100
258 #define DCBX_CONTROL_CHANGED_SHIFT		8
259 #define DCBX_PFC_CHANGED_MASK			0x00000200
260 #define DCBX_PFC_CHANGED_SHIFT			9
261 #define DCBX_ETS_CHANGED_MASK			0x00000400
262 #define DCBX_ETS_CHANGED_SHIFT			10
263 #define DCBX_APP_CHANGED_MASK			0x00000800
264 #define DCBX_APP_CHANGED_SHIFT			11
265 
266 	u32 seq_no;
267 	u32 ack_no;
268 	u32 received_seq_no;
269 	u8 tc_map[8];
270 	u8 num_used_tcs;
271 } dcbx_state_s;
272 
273 #ifdef CONFIG_HP_DCI_SUPPORT
274 struct dci_info_port {
275 	u32 config;
276 #define DCI_PORT_CFG_ENABLE_SHIFT		(0)
277 #define DCI_PORT_CFG_ENABLE_MASK		(1 << DCI_PORT_CFG_ENABLE_SHIFT)
278 #define DCI_PORT_CFG_ENABLE_DIAG_SHIFT		(1)
279 #define DCI_PORT_CFG_ENABLE_DIAG_MASK		(1 << DCI_PORT_CFG_ENABLE_DIAG_SHIFT)
280 #define DCI_PORT_CFG_DIAG_L_LOOP_SHIFT		(2)
281 #define DCI_PORT_CFG_DIAG_L_LOOP_MASK		(1 << DCI_PORT_CFG_DIAG_L_LOOP_SHIFT)
282 #define DCI_PORT_CFG_DIAG_R_LOOP_SHIFT		(3)
283 #define DCI_PORT_CFG_DIAG_R_LOOP_MASK		(1 << DCI_PORT_CFG_DIAG_R_LOOP_SHIFT)
284 
285 };
286 #endif
287 
288 struct private_port {
289 	struct drv_port_info_t port_info;
290 	active_mf_mode_t mf_mode;
291 	u32 prev_link_change_count;
292 	/* LLDP structures */
293 	lldp_params_s lldp_params[LLDP_MAX_LLDP_AGENTS];
294 	lldp_receive_data_s lldp_receive_data[MAX_SUBSCRIBERS];
295 
296 	/* DCBX */
297 	dcbx_state_s dcbx_state;
298 
299 	u32 net_buffer[MAX_PACKET_SIZE / 4]; /* Buffer to send any packet to network */
300 
301 	/* time stamp of the end of NIG drain time for the TX drain */
302 	u32 nig_drain_end_ts;
303 	/* time stamp of the end of NIG drain time for the TC pause drain, this timer is used togther for all TC */
304 	u32 nig_drain_tc_end_ts;
305 	u32 tc_drain_en_bitmap;
306 	u32 recv_lldp_tlvs[LLDP_MAX_LLDP_AGENTS][MAX_TLV_BUFFER];
307 	tlv_s lldp_core_tlv_desc[LLDP_MAX_LLDP_AGENTS][MAX_REGISTERED_TLVS];
308 	u8 current_core_tlv_num[LLDP_MAX_LLDP_AGENTS];
309 	struct mcp_mac lldp_mac;
310 #ifdef CONFIG_HP_DCI_SUPPORT
311 	struct dci_info_port dci_port;
312 #endif
313 	u32 temperature;
314 
315 };
316 
317 /**************************************/
318 /*                                    */
319 /*     P R I V A T E    F U N C       */
320 /*                                    */
321 /**************************************/
322 struct drv_func_info_t {
323 	u32_t func_state;
324 #define DRV_STATE_UNKNOWN                           0x00000000
325 #define DRV_STATE_UNLOADED                          0x00000001
326 #define DRV_STATE_D3                                0x00000004
327 
328 #define DRV_STATE_PRESENT_FLAG                      0x00000100
329 #define DRV_STATE_RUNNING                          (0x00000002 | DRV_STATE_PRESENT_FLAG)
330 
331 #define DRV_STATE_NOT_RESPONDING                    0x00000003 /* Will result with non-zero value when compared with DRV_STATE_RUNNING or with DRV_STATE_UNLOADED */
332 #define DRV_STATE_BACK_AFTER_TO                    (DRV_STATE_NOT_RESPONDING | DRV_STATE_PRESENT_FLAG)
333 
334 #define DRV_STATE_DIAG                             (0x00000010 | DRV_STATE_PRESENT_FLAG)
335 
336 #define DRV_STATE_TRANSITION_FLAG                   0x00001000
337 #define DRV_STATE_LOADING_TRANSITION               (DRV_STATE_TRANSITION_FLAG | DRV_STATE_PRESENT_FLAG)
338 #define DRV_STATE_UNLOADING_TRANSITION             (DRV_STATE_TRANSITION_FLAG | DRV_STATE_PRESENT_FLAG | DRV_STATE_UNLOADED)
339 
340 	u32_t driver_last_activity;
341 
342 	u32_t wol_mac_addr[2];
343 	u32_t drv_feature_support; /* See DRV_MB_PARAM_FEATURE_SUPPORT_FUNC_* */
344 
345 	u8_t unload_wol_param; /* See drv_mb_param */
346 	u8_t eswitch_mode;
347 };
348 
349 struct dci_info_func {
350 	u8 config;
351 #define DCI_FUNC_CFG_FNIC_ENABLE_SHIFT		(0)
352 #define DCI_FUNC_CFG_FNIC_ENABLE_MASK		(1 << DCI_FUNC_CFG_FNIC_ENABLE_SHIFT)
353 #define DCI_FUNC_CFG_OS_MTU_OVERRIDE_SHIFT	(1)
354 #define DCI_FUNC_CFG_OS_MTU_OVERRIDE_MASK	(1 << DCI_FUNC_CFG_OS_MTU_OVERRIDE_SHIFT)
355 #define DCI_FUNC_CFG_DIAG_WOL_ENABLE_SHIFT	(2)
356 #define DCI_FUNC_CFG_DIAG_WOL_ENABLE_MASK	(1 << DCI_FUNC_CFG_DIAG_WOL_ENABLE_SHIFT)
357 
358 	u8 drv_state;
359 	u16 fcoe_cvid;
360 	u8 fcoe_fabric_name[8];
361 };
362 
363 struct private_func {
364 	struct drv_func_info_t func_info;
365 	u32 init_hw_page;
366 	u32 num_of_msix;
367 	struct pf_sb_t sb;
368 	struct dci_info_func dci_func;
369 };
370 
371 
372 /**************************************/
373 /*                                    */
374 /*     P R I V A T E    D A T A       */
375 /*                                    */
376 /**************************************/
377 struct mcp_private_data {
378 	/* Basically no need for section offsets here, since this is private data.
379 	 * TBD - should consider adding section offsets if we want diag to parse this correctly !!
380 	 */
381 	struct private_global global;
382 	struct private_path path[MCP_GLOB_PATH_MAX];
383 	struct private_port port[MCP_GLOB_PORT_MAX];
384 	struct private_func func[MCP_GLOB_FUNC_MAX];
385 
386 };
387 #endif /* MCP_PRIVATE_H */
388