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  * Copyright(c) 2009-2015 Broadcom Corporation, all rights reserved
38  * Proprietary and Confidential Information.
39  *
40  * This source file is the property of Broadcom Corporation, and
41  * may not be copied or distributed in any isomorphic form without
42  * the prior written consent of Broadcom Corporation.
43  *
44  * Name: bdn.h
45  *
46  * Description: BDN definitions
47  *
48  * Author: Yaniv Rosner
49  *
50  ****************************************************************************/
51 
52 #ifndef BDN_H
53 #define BDN_H
54 
55 #if 0
56 typedef u32 bdn_cfg;
57 #define BDN_CFG_SIZE_MASK		0x0000ffff
58 #define BDN_CFG_SIZE_OFFSET		0
59 #define BDN_CFG_STATE_MASK		0x00ff0000
60 #define BDN_CFG_STATE_OFFSET		16
61 	#define BDN_CFG_STATE_ACTIVE		0x00010000
62 	#define BDN_CFG_STATE_PENDING		0x00020000
63 	#define BDN_CFG_STATE_DEFAULT		0x00040000
64 
65 #define SERVER_DESCRIPTION_MAX_LENGTH 64
66 struct server_descrip {
67 	u8 len;
68 	u8 str[SERVER_DESCRIPTION_MAX_LENGTH];
69 };
70 
71 #define SERVER_UUID_LENGTH	 36
72 struct server_uuid {
73 	u8 len;
74 	u8 str[SERVER_UUID_LENGTH];
75 };
76 
77 #define GENERALIZED_TIME_MAX_SIZE 16 /* YYYYMMDDhhmmss.s */
78 struct generalized_time {
79 	u8 len;
80 	u8 time_str[GENERALIZED_TIME_MAX_SIZE];
81 };
82 #define CONNECTION_ID_LENGTH	16
83 
84 #define SLOT_TYPE_NUM_MAX_LENGTH 32
85 struct slot_type_num {
86 	u8 len;
87 	u8 str[SLOT_TYPE_NUM_MAX_LENGTH];
88 };
89 
90 #define ILO_MGMT_MAX_NUM_OF_ADDR 3
91 #define ILO_MGMT_ADDR_MAX_LENGTH 16
92 struct iLO_mgmt_addr {
93 	u8 num_of_add;
94 	u8 len_of_add[ILO_MGMT_MAX_NUM_OF_ADDR];
95 	u8 str[ILO_MGMT_MAX_NUM_OF_ADDR][ILO_MGMT_ADDR_MAX_LENGTH];
96 };
97 
98 #define ENCLOSURE_ID_LENGTH	 36
99 struct enclosure_id {
100 	u8 len;
101 	u8 str[ENCLOSURE_ID_LENGTH];
102 	u8 res[3];
103 };
104 
105 struct base_dev_next_os {
106 	u8 reset_2_factory;
107 	u8 res[3];
108 };
109 
110 struct base_dev_now {
111 	u8 one_view_config;
112 	u8 res[3];
113 };
114 
115 struct base_dev {
116 	struct base_dev_now now;
117 	struct base_dev_next_os next_os;
118 };
119 
120 struct server_info {
121 	u8 optional_bitmap;
122 #define SERVER_INFO_ILO_MGMT_VLAN_PRESENT	(1<<0)
123 #define SERVER_INFO_DATA_TIMESTAMP_PRESENT	(1<<1)
124 #define SERVER_INFO_ENCLOSURE_ID_PRESENT	(1<<2)
125 	struct server_descrip server_descrip;
126 	struct server_uuid server_uuid;
127 	struct slot_type_num slot_type_num;
128 	struct iLO_mgmt_addr iLO_mgmt_addr;
129 	u16 iLO_mgmt_vlan;
130 	struct generalized_time data_timestamp;
131 };
132 
133 struct Codec_Info {
134 	u32 version;	/* Version of Codec */
135 
136 	enum codec_location {
137 		e_None		= 0,
138 		e_Here		= 1,
139 		e_FRU_EEPROM	= 2
140 	} loc; /* DEFAULT e-None */
141 	u16 total_size;	/* total size of Codec in bytes.Max size 32K (64K?)*/
142 	u16 num_msg_segments;	/* number of segments = total size / max message payload size */
143 };
144 
145 #define MAX_CODEC_SIZE		0x8000
146 #define CODEC_SEGMENT_SIZE	0x400
147 #define NUMBER_OF_SEGMENTS (MAX_CODEC_SIZE/CODEC_SEGMENT_SIZE)
148 struct codec_t {
149 	u8 data[NUMBER_OF_SEGMENTS][CODEC_SEGMENT_SIZE];
150 };
151 
152 struct bdn_netport_now {
153 	bdn_cfg hdr;
154 	u8 enable_port;
155 	u8 enable_diag;
156 	u8 num_pfs_min_bw;
157 	u8 num_pfs_max_bw;
158 	u8 min_bw[MCP_GLOB_FUNC_MAX];
159 	u8 max_bw[MCP_GLOB_FUNC_MAX];
160 };
161 
162 struct bdn_netport_on_port_reset {
163 	bdn_cfg hdr;
164 	u32 link_config;
165 /* Same definitions as in PORT_HW_CFG_SPEED_CAPABILITY_D3_MASK */
166 #define BDN_LINK_CONFIG_ADVERTISED_SPEED_MASK	0x0000ffff
167 #define BDN_LINK_CONFIG_ADVERTISED_SPEED_SHIFT	0
168 /* Same definitions as PORT_FEATURE_FLOW_CONTROL_MASK */
169 #define BDN_LINK_CONFIG_FLOW_CONTROL_MASK	0x00070000
170 #define BDN_LINK_CONFIG_FLOW_CONTROL_SHIFT	16
171 
172 #define BDN_LINK_CONFIG_PFC_ENABLED_MASK	0x00080000
173 #define BDN_LINK_CONFIG_PFC_ENABLED_SHIFT	19
174 
175 #define BDN_LINK_CONFIG_EEE_ENABLED_MASK	0x00100000
176 #define BDN_LINK_CONFIG_EEE_ENABLED_SHIFT	20
177 };
178 
179 struct bdn_netport_next_os_boot {
180 	bdn_cfg hdr;
181 	u8   num_pfs;
182 	u8   num_vf_per_pf[MCP_GLOB_FUNC_MAX];
183 };
184 
185 struct bdn_netport_diag_ctrl {
186 	bdn_cfg hdr;
187 	u8  port_reset;
188 	u8  local_loopback;
189 	u8  remote_loopback;
190 	u8  rsrv[1];
191 };
192 
193 struct bdn_netport {
194 	struct bdn_netport_now now;
195 	struct bdn_netport_on_port_reset on_port_reset; /* On Port Reset */
196 	struct bdn_netport_next_os_boot next_os_boot; /* Next OS Boot */
197 	struct bdn_netport_diag_ctrl diag_ctrl;
198 };
199 
200 #define CONNECTION_ID_LEN 16
201 struct bdn_flexfunc_now {
202 	bdn_cfg hdr;
203 	u8 connection_id[CONNECTION_ID_LEN];
204 	u8 fnic_enabled;
205 	u8 rsrv[3];
206 };
207 
208 struct bdn_flexfunc_next_os_boot {
209 	bdn_cfg hdr;
210 	u32 optional_bitmap;
211 #define FLEXFUNC_CFG_NEXT_OS_C2S_PCP_MAP_PRESENT	(1<<0)
212 #define FLEXFUNC_CFG_NEXT_OS_PORT_ASSIGNMENT_PRESENT	(1<<1)
213 #define FLEXFUNC_CFG_NEXT_OS_EMB_LAG_PRESENT		(1<<2)
214 	u8 mac_addr[6];
215 	u8 func_type;
216 	u8 boot_mode;
217 	u8 c_2_s_pcp_map[9]; /*  Maps O/S C-VLAN PCP value to S-VLAN PCP value for TX
218 			      * -- items 1-8 correspond to the O/S C-VLAN PCP values 0-7
219 			      * -- item 9 is the default if no C-VLAN present
220 			      * -- Values in these 9 bytes are the expected S-PCP values.
221 			      * -- If NetDev-Device-Module: EVB-Support.c-2-s-pcp-map = FALSE, then
222 			      * --     all values must be identical
223 			      * -- else, it supports C-PCP -> S-PCP mapping
224 			      */
225 	u16 mtu_size;
226 	u8 rsrv[1];
227 };
228 
229 struct bdn_flex_func_diag_ctrl {
230 	bdn_cfg hdr;
231 	u8  enable_wol;
232 	u8  rsrv[3];
233 };
234 
235 struct bdn_flex_func {
236 	struct bdn_flexfunc_now now;
237 	struct bdn_flexfunc_next_os_boot next_os_boot; /* Next OS Boot */
238 	struct bdn_flex_func_diag_ctrl diag_ctrl;
239 };
240 
241 #define FC_NPIV_WWPN_SIZE 8
242 #define FC_NPIV_WWNN_SIZE 8
243 struct bdn_npiv_settings {
244 	u8 npiv_wwpn[FC_NPIV_WWPN_SIZE];
245 	u8 npiv_wwnn[FC_NPIV_WWNN_SIZE];
246 };
247 
248 struct bdn_fc_npiv_cfg {
249 	/* hdr used internally by the MFW */
250 	u32 hdr;
251 	u32 num_of_npiv;
252 };
253 
254 #define MAX_NUMBER_NPIV 64
255 struct bdn_fc_npiv_tbl {
256 	struct bdn_fc_npiv_cfg fc_npiv_cfg;
257 	struct bdn_npiv_settings settings[MAX_NUMBER_NPIV];
258 };
259 
260 
261 struct bdn_fc_npiv {
262 	struct bdn_fc_npiv_tbl now; /* Next device level reset */
263 };
264 
265 struct bdn_iscsi_initiator_cfg {
266 	u32 optional_bitmap;
267 #define ISCSI_INITIATOR_ROUTE_PRESENT	(1<<0)
268 #define ISCSI_INITIATOR_PRIMARY_DNS_PRESENT	(1<<1)
269 #define ISCSI_INITIATOR_SECONDARY_DNS_PRESENT	(1<<2)
270 	u8 name[232];
271 	u8 ip_add[16];
272 	u8 netmask[16];
273 	u8 route[16];
274 	u8 primary_dns[16];
275 	u8 secondary_dns[16];
276 };
277 
278 struct bdn_iscsi_target_params {
279 	u32 optional_bitmap;
280 #define ISCSI_TARGET_LLMNR_ENABLE_PRESENT	(1<<0)
281 #define ISCSI_TARGET_ROUTE_ADV_ENABLE_PRESENT	(1<<1)
282 #define ISCSI_TARGET_IPV2_PRESENT	(1<<2)
283 	u8 name[232];
284 	u32 lun;
285 	u8 ip_addr[16];
286 	u32 tcp_port;
287 	u8 ip_addr_2[16];
288 	u32 tcp_port_2;
289 	u32 llmnr_en;
290 	u32 route_adv_en;
291 };
292 
293 struct bdn_iscsi_authentication {
294 	u32 optional_bitmap;
295 #define ISCSI_AUTH_CHAP_USERNAME_PRESENT	(1<<0)
296 #define ISCSI_AUTH_CHAP_SECRET_PRESENT	(1<<1)
297 #define ISCSI_AUTH_MUTUAL_USERNAME_PRESENT	(1<<2)
298 #define ISCSI_AUTH_MUTUAL_SECRET_PRESENT	(1<<3)
299 	u32 auth_meth;
300 	u8 username[232];
301 	u8 secret[16];
302 	u32 secret_len;
303 	u8 mutual_username[232];
304 	u8 mutual_secret[16];
305 	u32 mutual_secret_len;
306 };
307 
308 struct bdn_iscsi_boot_cfg {
309 	u32 optional_bitmap;
310 #define ISCSI_CFG_CVID_PRESENT	(1<<0)
311 #define ISCSI_CFG_DNS_VIA_DHCP_PRESENT	(1<<1)
312 #define ISCSI_CFG_TARGET_INFO_DHCP_PRESENT	(1<<2)
313 #define ISCSI_CFG_INITIATOR_PRESENT	(1<<3)
314 #define ISCSI_CFG_TARGET_PRESENT	(1<<4)
315 #define ISCSI_CFG_DHCP_VENDOR_ID_PRESENT	(1<<5)
316 #define ISCSI_CFG_AUTH_PRESENT	(1<<6)
317 #define ISCSI_AUTH_HEADER_DIGEST_FLAG_PRESENT	(1<<7)
318 #define ISCSI_AUTH_DATA_DIGEST_FLAG_PRESENT	(1<<8)
319 	bdn_cfg hdr;
320 	u32 cvid;
321 	u32 ip_add_type;
322 	u32 dns_via_dhcp;
323 	u32 target_via_dhcp;
324 	u8 dhcp_vendor_id[32];
325 	u32 head_digest_flag_en;
326 	u32 data_digest_flag_en;
327 };
328 
329 struct bdn_iscsi_boot_next_dlr {
330 	struct bdn_iscsi_boot_cfg cfg; /* Next device level reset */
331 	struct bdn_iscsi_initiator_cfg initiator_cfg;
332 	struct bdn_iscsi_target_params target_params;
333 	struct bdn_iscsi_authentication authentication;
334 };
335 
336 struct bdn_iscsi_boot {
337 	struct bdn_iscsi_boot_next_dlr next_dlr; /* Next device level reset */
338 };
339 
340 #define FCOE_TARGETS_WWPN_SIZE 8
341 #define FCOE_TARGETS_LUN_SIZE 8
342 
343 struct bdn_fcoe_targets {
344 	u8 wwpn[FCOE_TARGETS_WWPN_SIZE];
345 	u8 lun_id[FCOE_TARGETS_LUN_SIZE];
346 };
347 
348 struct bdn_fcoe_boot_cfg {
349 		u32 optional_bitmap;
350 #define FCOE_CFG_CVID_PRESENT	(1<<0)
351 #define FCOE_BASE_WWNN_PRESENT	(1<<1)
352 #define FCOE_WWPN_PRESENT	(1<<2)
353 	bdn_cfg hdr;
354 	u32 cvid;
355 	u8 base_wwnn[FCOE_TARGETS_WWPN_SIZE]; /* Host World wide name*/
356 	u8 wwpn[FCOE_TARGETS_WWPN_SIZE]; /* base wwpn */
357 	u32 num_of_fcoe_targets;
358 };
359 
360 struct bdn_fcoe_boot_next_dlr {
361 	struct bdn_fcoe_boot_cfg cfg; /* Next device level reset */
362 	struct bdn_fcoe_targets fcoe_targets[8];
363 };
364 
365 struct bdn_fcoe_boot {
366 	struct bdn_fcoe_boot_next_dlr next_dlr; /* Next device level reset */
367 };
368 #ifndef PF_NUM_MAX
369 #define PF_NUM_MAX 8
370 #endif
371 struct bdn_ncsi_next_dlr {
372 	bdn_cfg hdr;
373 	u32 ncsi_scid;
374 };
375 
376 struct bdn_ncsi {
377 	struct bdn_ncsi_next_dlr bdn_ncsi_next_dlr;
378 };
379 
380 // Rapid-Response-Poll-Module definition
381 #define MAX_CCT_SIZE			64
382 #define VALID_RPP_SIGNATURE		0x69616853
383 struct rpp_sum_stc {
384 	u32 hash;
385 	u32 num;
386 };
387 
388 struct digest_stc {
389 	u8 type;
390 	u8 inst;
391 	u16 digest;
392 };
393 
394 struct bdn_rapid_respon_stc {
395 	u32 sig;
396 	struct rpp_sum_stc rpp_sum;
397 	u8 num_of_cct;
398 	u8 res[3];
399 	struct digest_stc cct[MAX_CCT_SIZE];
400 #ifdef CONFIG_SUPPORT_SCI
401 	struct digest_stc sci[MAX_CCT_SIZE];
402 #endif
403 };
404 
405 struct bdn {
406 	u32 size;
407 	struct base_dev	base_dev;
408 	struct server_info server_info;
409 	struct bdn_netport netport[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
410 	struct bdn_flex_func flexfunc[PF_NUM_MAX];
411 	struct bdn_fc_npiv fc_npiv[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
412 	struct bdn_iscsi_boot iscsi_boot[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
413 	struct bdn_fcoe_boot fcoe_boot[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
414 	struct bdn_ncsi ncsi;
415 	struct bdn_rapid_respon_stc rpp_stc;
416 	struct enclosure_id serv_info_enc_id;
417 	u32 crc;
418 };
419 
420 union bdn_image {
421 	struct bdn bdn;
422 	u8 rsrv[0x9000];
423 };
424 
425 /* Expected BDN size is basically the offset of rsrv within the bdn structure */
426 #define BDN_SIZE (sizeof(struct bdn))
427 #define BDN_SERVER_INFO()		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, server_info))
428 #define BDN_BASE_DEV_NEXT_OS()		   (ASN1_P->bdn_addr + OFFSETOF(struct bdn, base_dev.next_os))
429 #define BDN_BASE_DEV_NOW()			  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, base_dev.now))
430 /* #define BDN_CODEC_INFO()		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec_info)) */
431 /* #define BDN_CODEC_DATA()		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec)) */
432 #define BDN_NETPORT_NOW(papo)		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].now))
433 #define BDN_NETPORT_ON_PORT_RESET(papo)   (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].on_port_reset))
434 #define BDN_NETPORT_NEXT_OS_BOOT(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].next_os_boot))
435 #define BDN_NETPORT_DIAG_CTRL(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].diag_ctrl))
436 #define BDN_FLEXFUNC_NOW(pf_num)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].now))
437 #define BDN_FLEXFUNC_NEXT_OS_BOOT(pf_num) (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].next_os_boot))
438 #define BDN_FLEXFUNC_DIAG_CTRL(pf_num)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].diag_ctrl))
439 #define BDN_FC_NPIV_NOW(papo)		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now))
440 #define BDN_FC_NPIV_NOW_CFG(papo)		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now.fc_npiv_cfg))
441 #define BDN_FC_NPIV_NOW_SETTINGS(papo, idx)		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now.settings[idx]))
442 #define BDN_ISCSI_BOOT_NEXT_DLR_CFG(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.cfg))
443 #define BDN_ISCSI_BOOT_NEXT_DLR_INITIATOR(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.initiator_cfg))
444 #define BDN_ISCSI_BOOT_NEXT_DLR_TARGET(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.target_params))
445 #define BDN_ISCSI_BOOT_NEXT_DLR_AUTHENTICATION(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.authentication))
446 #define BDN_FCOE_BOOT_NEXT_DLR_CFG(papo)	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fcoe_boot[(papo.path << 1) + papo.port].next_dlr.cfg))
447 #define BDN_FCOE_BOOT_NEXT_DLR_TARGET(papo, idx)	 (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fcoe_boot[(papo.path << 1) + papo.port].next_dlr.fcoe_targets[idx]))
448 #define BDN_NCSI_NEXT_DLR()	  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, ncsi.bdn_ncsi_next_dlr))
449 #define BDN_RAPID_RESPONSE		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, rpp_stc))
450 #define BDN_SERV_INFO_ENC_ID()		  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, serv_info_enc_id))
451 #define BDN_CRC()			  (ASN1_P->bdn_addr + sizeof(union bdn_image))
452 #endif
453 
454 #define BDN_SIZE_IMAGE_MAX		(0x9000)
455 
456 #define BDN_SIZE_OF_MAC			(6)
457 #define BDN_SIZE_OF_WWN			(8)
458 #define BDN_SIZE_OF_IPV4		(4)
459 #define BDN_SIZE_OF_IPV6		(16)
460 #define BDN_DIR_MAX			(8)
461 #define BDN_SIZE_OF_PF_PER_PORT		(16)
462 #define BDN_SIZE_OF_CONNECTION_ID	(16)
463 #define BDN_SIZE_OF_C2SPCP_MAP		(9)
464 #define BDN_SIZE_OF_ISCSI_NAME		(236)
465 #define BDN_SIZE_OF_ISCSI_SEC		(16)
466 #define BDN_SIZE_OF_FCOE_TARGETS	(8)
467 #define BDN_SIZE_OF_FCOE_LUN_ID		(8)
468 #define BDN_SIZE_OF_DHCP_VENDOR_ID	(32)
469 #define BDN_SIZE_OF_SERV_DESC		(64)
470 #define BDN_SIZE_OF_SERV_UUID		(36)
471 #define BDN_SIZE_OF_SERV_SLOT		(32)
472 #define BDN_NUM_OF_ILO_ADDR		(3)
473 #define BDN_SIZE_OF_ILO_ADDR		(16)
474 #define BDN_SIZE_OF_SERV_TIME		(20)
475 #define BDN_SIZE_OF_ENCLOSURE_ID	(36)
476 #define BDN_CCT_MAX_SIZE		(64)
477 #define BDN_SCI_MAX_SIZE		(64)
478 
479 struct bdn_dir {
480 	u16 offset;
481 	u16 length;
482 };
483 
484 #define BDN_DIR_CFG_NOW			(0)
485 #define BDN_DIR_CFG_NEXT_FLR		(1)
486 #define BDN_DIR_CFG_PORT_RESET		(2)
487 #define BDN_DIR_CFG_NEXT_DLR		(3)
488 #define BDN_DIR_CFG_NEXT_OS_BOOT	(4)
489 #define BDN_DIR_CFG_NEXT_PWR_CYC	(5)
490 #define BDN_DIR_CFG_DIAG_CTRL		(6)
491 
492 typedef u32 bdn_cfg_state;
493 #define BDN_CFG_STATE_MASK		0x000000ff
494 #define BDN_CFG_STATE_OFFSET		0
495 #define BDN_CFG_STATE_NA		0x00000000
496 #define BDN_CFG_STATE_ACTIVE		0x00000001
497 #define BDN_CFG_STATE_PENDING		0x00000002
498 #define BDN_CFG_STATE_DEFAULT		0x00000004
499 
500 #define BDN_CFG_STATE_IS(x, y)		((((x)->state & BDN_CFG_STATE_MASK) >> BDN_CFG_STATE_OFFSET) == BDN_CFG_STATE_##y)
501 #define BDN_OPTIONAL_SET(x, y)		(x)->optional |= (1 << (y))
502 #define BDN_OPTIONAL_CHECK(x, y)	((x)->optional & (1 << (y)))
503 
504 /*.************************* Base-Device-Module************************* */
505 struct bdn_base_now {
506 	bdn_cfg_state	state;
507 	u32		optional;
508 
509 	u32	rsv:24,
510 		dci_mgmt:8;
511 
512 	u32	rsrv;
513 };
514 
515 struct bdn_base_osb {
516 	bdn_cfg_state	state;
517 	u32		optional;
518 
519 	u32	rsv:31,
520 		reset_2_factory:1;
521 
522 	u32	rsrv;
523 };
524 
525 struct bdn_base {
526 	struct bdn_dir		dir[BDN_DIR_MAX];
527 
528 	struct bdn_base_now	now;
529 	struct bdn_base_osb	osb;	/* Next os reboot */
530 };
531 
532 /*.************************* Network-Device-Module********************** */
533 struct bdn_nport_now {
534 	bdn_cfg_state	state;
535 	u32		optional;
536 #define BDN_NETPORT_NOW_OPT_MIN_BW		(0)
537 #define BDN_NETPORT_NOW_OPT_MAX_BW		(1)
538 
539 	u32	rsv:14,
540 		enable_port:1,
541 		enable_diag:1,
542 		num_pfs_min_bw:8,
543 		num_pfs_max_bw:8;
544 
545 	u8	min_bw[BDN_SIZE_OF_PF_PER_PORT];
546 	u8	max_bw[BDN_SIZE_OF_PF_PER_PORT];
547 
548 	u32	rsrv;
549 };
550 
551 struct bdn_nport_plr {
552 	bdn_cfg_state	state;
553 	u32		optional;
554 #define BDN_NETPORT_RESET_OPT_ADV_SPEED		(0)
555 #define BDN_NETPORT_RESET_OPT_FLOW_CTRL		(1)
556 #define BDN_NETPORT_RESET_OPT_EEE_ENABLE	(2)
557 
558 	u32	rsv:11,
559 		eee_enable:1,
560 		flow_ctrl:4,
561 		adv_speed:16;
562 
563 	u32	rsrv;
564 };
565 
566 struct bdn_nport_osb {
567 	bdn_cfg_state	state;
568 	u32		optional;
569 #define BDN_NETPORT_BOOT_OPT_NUM_VF		(0)
570 #define BDN_NETPORT_BOOT_OPT_NPIV_ENABLE	(1)
571 
572 	u32	rsv:23,
573 		npiv_enable:1,
574 		num_pfs:8;
575 	u8	num_vfs[BDN_SIZE_OF_PF_PER_PORT];
576 
577 	u32	rsrv;
578 };
579 
580 struct bdn_nport_dgn {
581 	bdn_cfg_state	state;
582 	u32		optional;
583 
584 	u32	rsv:29,
585 		port_reset:1,
586 		local_loopback:1,
587 		remote_loopback:1;
588 
589 	u32	rsrv;
590 };
591 
592 struct bdn_nport {
593 	struct bdn_dir		dir[BDN_DIR_MAX];
594 
595 	struct bdn_nport_now	now;
596 	struct bdn_nport_plr	plr;	/* Next device level reset */
597 	struct bdn_nport_osb	osb;	/* Next os reboot */
598 	struct bdn_nport_dgn	dgn;
599 };
600 
601 /* ************************* FlexFunc-Module************************* */
602 struct bdn_flex_now {
603 	bdn_cfg_state	state;
604 	u32		optional;
605 
606 	u8	connection_id[BDN_SIZE_OF_CONNECTION_ID];
607 	u32	rsv:31,
608 		fnic_enabled:1;
609 
610 	u32	rsrv;
611 };
612 
613 struct bdn_flex_dlr {
614 	bdn_cfg_state	state;
615 	u32		optional;
616 #define BDN_FLEXFUNC_DLR_OPT_FC_WWNN		(0)
617 #define BDN_FLEXFUNC_DLR_OPT_FC_WWPN		(1)
618 
619 	u8	fc_wwnn[BDN_SIZE_OF_WWN];
620 	u8	fc_wwpn[BDN_SIZE_OF_WWN];
621 
622 	u32	rsrv[2];
623 };
624 
625 struct bdn_flex_osb {
626 	bdn_cfg_state	state;
627 	u32		optional;
628 #define BDN_FLEXFUNC_BOOT_OPT_C2SPCP_MAP	(0)
629 #define BDN_FLEXFUNC_BOOT_OPT_PORT_ASSIGNMENT	(1)
630 #define BDN_FLEXFUNC_BOOT_OPT_EMB_LAG		(2)
631 #define BDN_FLEXFUNC_BOOT_OPT_MTU_SIZE		(3)
632 #define BDN_FLEXFUNC_BOOT_OPT_OVER_MTU		(4)
633 
634 	u8	mac_addr[BDN_SIZE_OF_MAC];
635 	u8	c_2_s_pcp_map[BDN_SIZE_OF_C2SPCP_MAP];
636 	/*  Maps O/S C-VLAN PCP value to S-VLAN PCP value for TX
637 	 * -- items 1-8 correspond to the O/S C-VLAN PCP values 0-7
638 	 * -- item 9 is the default if no C-VLAN present
639 	 * -- Values in these 9 bytes are the expected S-PCP values.
640 	 * -- If NetDev-Device-Module: EVB-Support.c-2-s-pcp-map = FALSE, then
641 	 * --     all values must be identical
642 	 * -- else, it supports C-PCP -> S-PCP mapping
643 	 */
644 	u8	func_type;
645 	u32	rsv:2,
646 		valid_mac_addr:1,
647 		override_mtu:1,
648 		boot_mode:4,
649 		port_assign:4,
650 		emb_lag:4,
651 		mtu_size:16;
652 
653 	u32	rsrv;
654 };
655 
656 struct bdn_flex_dgn {
657 	bdn_cfg_state	state;
658 	u32		optional;
659 
660 	u32	rsv:31,
661 		enable_wol:1;
662 
663 	u32	rsrv;
664 };
665 
666 struct bdn_flex {
667 	struct bdn_dir		dir[BDN_DIR_MAX];
668 
669 	struct bdn_flex_now	now;
670 	struct bdn_flex_dlr	dlr;	/* Next device level reset */
671 	struct bdn_flex_osb	osb;	/* Next os reboot */
672 	struct bdn_flex_dgn	dgn;
673 };
674 
675 /* ************************* FC-NPIV-Module************************* */
676 struct bdn_npiv_dlr {
677 	bdn_cfg_state	state;
678 	u32		optional;
679 
680 	struct dci_fc_npiv_tbl	npiv_tbl;
681 };
682 
683 struct bdn_npiv {
684 	struct bdn_dir		dir[BDN_DIR_MAX];
685 
686 	struct bdn_npiv_dlr	dlr;	/* Next device level reset */
687 };
688 
689 /* ************************* iSCSI-Boot-Module************************* */
690 struct bdn_iscsi_init {
691 	u32	rsv:21,
692 		opt_route:1,
693 		opt_pri_dns:1,
694 		opt_sec_dns:1,
695 		name_size:8;
696 
697 	u8	ip_add[BDN_SIZE_OF_IPV6];
698 	u8	netmask[BDN_SIZE_OF_IPV6];
699 	u8	route[BDN_SIZE_OF_IPV6];
700 	u8	primary_dns[BDN_SIZE_OF_IPV6];
701 	u8	secondary_dns[BDN_SIZE_OF_IPV6];
702 	u8	name[BDN_SIZE_OF_ISCSI_NAME];
703 };
704 
705 struct bdn_iscsi_trgt {
706 	u32 optional;
707 #define BDN_ISCSI_TARGET_OPT_LLMNR_ENABLE	(0)
708 #define BDN_ISCSI_TARGET_OPT_ROUTE_ADV_ENABLE	(1)
709 
710 	u32	rsv:21,
711 		opt_ip2:1,
712 		llmnr_en:1,
713 		route_adv_en:1,
714 		name_size:8;
715 
716 	u32	lun;
717 	u16	tcpport;
718 	u16	tcpport2;
719 
720 	u8	ip[BDN_SIZE_OF_IPV6];
721 	u8	ip2[BDN_SIZE_OF_IPV6];
722 	u8	name[BDN_SIZE_OF_ISCSI_NAME];
723 
724 	u32	rsrv;
725 };
726 
727 struct bdn_iscsi_auth {
728 	u32	rsv:2,
729 		c_sec_size:6,
730 		auth_method:2,
731 		m_sec_size:6,
732 		c_name_size:8,
733 		m_name_size:8;
734 
735 	u8	chap_username[BDN_SIZE_OF_ISCSI_NAME];
736 	u8	chap_secret[BDN_SIZE_OF_ISCSI_SEC];
737 	u8	mutual_username[BDN_SIZE_OF_ISCSI_NAME];
738 	u8	mutual_secret[BDN_SIZE_OF_ISCSI_SEC];
739 
740 	u32	rsrv;
741 };
742 
743 struct bdn_iboot_dlr {
744 	bdn_cfg_state	state;
745 	u32		optional;
746 #define BDN_ISCSI_BOOT_OPT_CVID			(0)
747 #define BDN_ISCSI_BOOT_OPT_INITIATOR		(1)
748 #define BDN_ISCSI_BOOT_OPT_TARGET		(2)
749 #define BDN_ISCSI_BOOT_OPT_AUTH			(3)
750 #define BDN_ISCSI_BOOT_OPT_HEAD_DIGEST_EN	(4)
751 #define BDN_ISCSI_BOOT_OPT_DATA_DIGEST_EN	(5)
752 
753 	u32	rsv:4,
754 		initiator_dhcp:1,
755 		target_dhcp:1,
756 		head_digest_en:1,
757 		data_digest_en:1,
758 		dhcp_vendor_id_size:8,
759 		ip_type:4,
760 		cvid:12;
761 
762 	u8	dhcp_vendor_id[BDN_SIZE_OF_DHCP_VENDOR_ID];
763 
764 	u32	rsrv;
765 
766 	struct bdn_iscsi_init	init;
767 	struct bdn_iscsi_trgt	trgt;
768 	struct bdn_iscsi_auth	auth;
769 };
770 
771 struct bdn_iboot {
772 	struct bdn_dir		dir[BDN_DIR_MAX];
773 
774 	struct bdn_iboot_dlr	dlr;	/* Next device level reset */
775 };
776 
777 /* ************************* FCoE-Boot-Module************************* */
778 struct bdn_fcoe_trgt {
779 	u8 wwpn[BDN_SIZE_OF_WWN];
780 	u8 lunid[BDN_SIZE_OF_FCOE_LUN_ID];
781 };
782 
783 struct bdn_fboot_dlr {
784 	bdn_cfg_state	state;
785 	u32		optional;
786 
787 	u32	rsv:24,
788 		num_of_targets:4;
789 
790 	struct bdn_fcoe_trgt trgt[BDN_SIZE_OF_FCOE_TARGETS];
791 
792 	u32	rsrv;
793 };
794 
795 struct bdn_fboot {
796 	struct bdn_dir		dir[BDN_DIR_MAX];
797 
798 	struct bdn_fboot_dlr	dlr;	 /* Next device level reset */
799 };
800 
801 /* *************************    NCSI-Module    ************************* */
802 struct bdn_ncsi_dlr {
803 	bdn_cfg_state	state;
804 	u32		optional;
805 
806 	u32	ncsi_scid:12,
807 		rsv:20;
808 	u32	rsv2;
809 };
810 
811 struct bdn_ncsi {
812 	struct bdn_dir		dir[BDN_DIR_MAX];
813 
814 	struct bdn_ncsi_dlr	dlr;
815 };
816 
817 /* ************************* Server-Info-Module************************* */
818 struct bdn_serv {
819 	bdn_cfg_state	state;
820 	u32		optional;
821 #define BDN_SERV_INFO_OPT_ILO_VLAN	(0)
822 #define BDN_SERV_INFO_OPT_TIMESTAMP	(1)
823 #define BDN_SERV_INFO_OPT_ENCLOSURE	(2)
824 
825 	u16 ilo_vlan;
826 	u8 serv_desc_size;
827 	u8 serv_uuid_size;
828 	u8 slot_info_size;
829 	u8 timestamp_size;
830 	u8 enclosure_size;
831 	u8 ilo_addr_num;
832 	u8 ilo_addr_size[BDN_NUM_OF_ILO_ADDR];
833 	u8 crc8; /* the crc8 from last put command */
834 
835 	u8 serv_desc[BDN_SIZE_OF_SERV_DESC];
836 	u8 serv_uuid[BDN_SIZE_OF_SERV_UUID];
837 	u8 slot_info[BDN_SIZE_OF_SERV_SLOT];
838 	u8 ilo_addr[BDN_NUM_OF_ILO_ADDR][BDN_SIZE_OF_ILO_ADDR];
839 	u8 timestamp[BDN_SIZE_OF_SERV_TIME];
840 	u8 enclosure[BDN_SIZE_OF_ENCLOSURE_ID];
841 };
842 
843 /* ********************* Rapid-Response-Poll-Module ******************** */
844 struct bdn_rrp_digest {
845 	u8	object;
846 	u8	index;	/* the index from zero */
847 	u16	digest;
848 };
849 
850 struct bdn_rrp {
851 	bdn_cfg_state	state;
852 	u32		optional;
853 #define BDN_RRP_OPT_CCT		(0)
854 #define BDN_RRP_OPT_SCI		(1)
855 
856 	u32	hash;
857 	u32	num_cct:8,
858 		num_sci:8,
859 		rsv:16;
860 
861 	struct bdn_rrp_digest cct[BDN_CCT_MAX_SIZE];
862 	struct bdn_rrp_digest sci[BDN_SCI_MAX_SIZE];
863 };
864 
865 /* 0x20 bytes */
866 struct bdn_head {
867 	u32	signature;
868 #define BDN_HEAD_SIGN_SHIFT		(8)
869 #define BDN_HEAD_SIGN_MASK		(0xffffff << BDN_HEAD_SIGN_SHIFT)
870 #define BDN_HEAD_SIGN_VALID		(((u32)'B' << 16) | ((u32)'D' << 8) | 'N')
871 #define BDN_HEAD_SIGN_VER_SHIFT		(0)
872 #define BDN_HEAD_SIGN_VER_MASK		(0xff << BDN_HEAD_SIGN_VER_SHIFT)
873 #define BDN_HEAD_SIGN_VER_CURRENT	(1)
874 #define BDN_HEAD_SIGN_CURRENT		((BDN_HEAD_SIGN_VALID << BDN_HEAD_SIGN_SHIFT) | (BDN_HEAD_SIGN_VER_CURRENT << BDN_HEAD_SIGN_VER_SHIFT))
875 
876 	u32	num_port:8,
877 		num_func:8,
878 		rsrv_bit:16;
879 
880 	struct bdn_dir	glob;
881 	struct bdn_dir	port;
882 	struct bdn_dir	func;
883 
884 	u32	rsrv[3];
885 };
886 
887 struct bdn_glob {
888 #define BDN_DIR_GLOB_SERV_INFO		0
889 #define BDN_DIR_GLOB_BASE_DEV		1
890 #define BDN_DIR_GLOB_NCSI		2
891 #define BDN_DIR_GLOB_RRP		3
892 	struct bdn_dir	dir[BDN_DIR_MAX];
893 
894 	struct bdn_serv	serv;
895 	struct bdn_base	base;
896 	struct bdn_ncsi	ncsi;
897 	struct bdn_rrp	rrp;
898 
899 	u32	rsrv[8];
900 };
901 
902 struct bdn_port {
903 #define BDN_DIR_PORT_NETPORT		0
904 #define BDN_DIR_PORT_FC_NPIV		1
905 #define BDN_DIR_PORT_ISCSI_BOOT		2
906 #define BDN_DIR_PORT_FCOE_BOOT		3
907 	struct bdn_dir		dir[BDN_DIR_MAX];
908 
909 	struct bdn_nport	port;
910 	struct bdn_npiv		npiv;
911 	struct bdn_iboot	iboot;
912 	struct bdn_fboot	fboot;
913 
914 };
915 
916 struct bdn_func {
917 #define BDN_DIR_FUNC_FLEX_FUNC		0
918 	struct bdn_dir	dir[BDN_DIR_MAX];
919 
920 	struct bdn_flex	flex;
921 
922 	u32	rsrv[4];
923 };
924 
925 struct bdn {
926 	struct bdn_head head;
927 	struct bdn_glob glob;
928 	struct bdn_port port[MCP_GLOB_PORT_MAX];
929 	struct bdn_func func[MCP_GLOB_FUNC_MAX];
930 };
931 
932 #define BDN_OFFSET_GLOB(x)		(OFFSETOF(struct bdn, glob.x) & 0xffff)
933 #define BDN_OFFSET_BASE(x)		(OFFSETOF(struct bdn, glob.base.x) & 0xffff)
934 #define BDN_OFFSET_NCSI(x)		(OFFSETOF(struct bdn, glob.ncsi.x) & 0xffff)
935 #define BDN_OFFSET_PORT(x, y)		(OFFSETOF(struct bdn, port[(x)].y) & 0xffff)
936 #define BDN_OFFSET_NPORT(x, y)		(OFFSETOF(struct bdn, port[(x)].port.y) & 0xffff)
937 #define BDN_OFFSET_NPIV(x, y)		(OFFSETOF(struct bdn, port[(x)].npiv.y) & 0xffff)
938 #define BDN_OFFSET_IBOOT(x, y)		(OFFSETOF(struct bdn, port[(x)].iboot.y) & 0xffff)
939 #define BDN_OFFSET_FBOOT(x, y)		(OFFSETOF(struct bdn, port[(x)].fboot.y) & 0xffff)
940 #define BDN_OFFSET_FUNC(x, y)		(OFFSETOF(struct bdn, func[(x)].y) & 0xffff)
941 #define BDN_OFFSET_FLEX(x, y)		(OFFSETOF(struct bdn, func[(x)].flex.y) & 0xffff)
942 #define BDN_OFFSET_CRC			(BDN_SIZE_IMAGE_MAX - 4)
943 
944 union bdn_image {
945 	struct bdn bdn;
946 	u8_t rsrv[BDN_SIZE_IMAGE_MAX];
947 };
948 
949 #endif /* BDN_H */
950