xref: /openbmc/linux/drivers/net/ethernet/brocade/bna/bfi.h (revision 078086f3c17fae8af6c077153773c4a10392ffbf)
1f844a0eaSJeff Kirsher /*
2f844a0eaSJeff Kirsher  * Linux network driver for Brocade Converged Network Adapter.
3f844a0eaSJeff Kirsher  *
4f844a0eaSJeff Kirsher  * This program is free software; you can redistribute it and/or modify it
5f844a0eaSJeff Kirsher  * under the terms of the GNU General Public License (GPL) Version 2 as
6f844a0eaSJeff Kirsher  * published by the Free Software Foundation
7f844a0eaSJeff Kirsher  *
8f844a0eaSJeff Kirsher  * This program is distributed in the hope that it will be useful, but
9f844a0eaSJeff Kirsher  * WITHOUT ANY WARRANTY; without even the implied warranty of
10f844a0eaSJeff Kirsher  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11f844a0eaSJeff Kirsher  * General Public License for more details.
12f844a0eaSJeff Kirsher  */
13f844a0eaSJeff Kirsher /*
14f844a0eaSJeff Kirsher  * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
15f844a0eaSJeff Kirsher  * All rights reserved
16f844a0eaSJeff Kirsher  * www.brocade.com
17f844a0eaSJeff Kirsher  */
18f844a0eaSJeff Kirsher 
19f844a0eaSJeff Kirsher #ifndef __BFI_H__
20f844a0eaSJeff Kirsher #define __BFI_H__
21f844a0eaSJeff Kirsher 
22f844a0eaSJeff Kirsher #include "bfa_defs.h"
23f844a0eaSJeff Kirsher 
24f844a0eaSJeff Kirsher #pragma pack(1)
25f844a0eaSJeff Kirsher 
26f844a0eaSJeff Kirsher /**
27f844a0eaSJeff Kirsher  * BFI FW image type
28f844a0eaSJeff Kirsher  */
29f844a0eaSJeff Kirsher #define	BFI_FLASH_CHUNK_SZ			256	/*!< Flash chunk size */
30f844a0eaSJeff Kirsher #define	BFI_FLASH_CHUNK_SZ_WORDS	(BFI_FLASH_CHUNK_SZ/sizeof(u32))
31f844a0eaSJeff Kirsher enum {
32f844a0eaSJeff Kirsher 	BFI_IMAGE_CB_FC,
33f844a0eaSJeff Kirsher 	BFI_IMAGE_CT_FC,
34f844a0eaSJeff Kirsher 	BFI_IMAGE_CT_CNA,
35f844a0eaSJeff Kirsher 	BFI_IMAGE_MAX,
36f844a0eaSJeff Kirsher };
37f844a0eaSJeff Kirsher 
38f844a0eaSJeff Kirsher /**
39f844a0eaSJeff Kirsher  * Msg header common to all msgs
40f844a0eaSJeff Kirsher  */
41f844a0eaSJeff Kirsher struct bfi_mhdr {
42f844a0eaSJeff Kirsher 	u8		msg_class;	/*!< @ref enum bfi_mclass	    */
43f844a0eaSJeff Kirsher 	u8		msg_id;		/*!< msg opcode with in the class   */
44f844a0eaSJeff Kirsher 	union {
45f844a0eaSJeff Kirsher 		struct {
46*078086f3SRasesh Mody 			u8	qid;
47*078086f3SRasesh Mody 			u8	fn_lpu;	/*!< msg destination		    */
48f844a0eaSJeff Kirsher 		} h2i;
49f844a0eaSJeff Kirsher 		u16	i2htok;	/*!< token in msgs to host	    */
50f844a0eaSJeff Kirsher 	} mtag;
51f844a0eaSJeff Kirsher };
52f844a0eaSJeff Kirsher 
53*078086f3SRasesh Mody #define bfi_fn_lpu(__fn, __lpu)	((__fn) << 1 | (__lpu))
54*078086f3SRasesh Mody #define bfi_mhdr_2_fn(_mh)	((_mh)->mtag.h2i.fn_lpu >> 1)
55*078086f3SRasesh Mody #define bfi_mhdr_2_qid(_mh)	((_mh)->mtag.h2i.qid)
56*078086f3SRasesh Mody 
57*078086f3SRasesh Mody #define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do {		\
58f844a0eaSJeff Kirsher 	(_mh).msg_class			= (_mc);		\
59f844a0eaSJeff Kirsher 	(_mh).msg_id			= (_op);		\
60*078086f3SRasesh Mody 	(_mh).mtag.h2i.fn_lpu	= (_fn_lpu);			\
61f844a0eaSJeff Kirsher } while (0)
62f844a0eaSJeff Kirsher 
63f844a0eaSJeff Kirsher #define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {		\
64f844a0eaSJeff Kirsher 	(_mh).msg_class			= (_mc);		\
65f844a0eaSJeff Kirsher 	(_mh).msg_id			= (_op);		\
66f844a0eaSJeff Kirsher 	(_mh).mtag.i2htok		= (_i2htok);		\
67f844a0eaSJeff Kirsher } while (0)
68f844a0eaSJeff Kirsher 
69f844a0eaSJeff Kirsher /*
70f844a0eaSJeff Kirsher  * Message opcodes: 0-127 to firmware, 128-255 to host
71f844a0eaSJeff Kirsher  */
72f844a0eaSJeff Kirsher #define BFI_I2H_OPCODE_BASE	128
73f844a0eaSJeff Kirsher #define BFA_I2HM(_x)			((_x) + BFI_I2H_OPCODE_BASE)
74f844a0eaSJeff Kirsher 
75f844a0eaSJeff Kirsher /**
76f844a0eaSJeff Kirsher  ****************************************************************************
77f844a0eaSJeff Kirsher  *
78f844a0eaSJeff Kirsher  * Scatter Gather Element and Page definition
79f844a0eaSJeff Kirsher  *
80f844a0eaSJeff Kirsher  ****************************************************************************
81f844a0eaSJeff Kirsher  */
82f844a0eaSJeff Kirsher 
83f844a0eaSJeff Kirsher #define BFI_SGE_INLINE	1
84f844a0eaSJeff Kirsher #define BFI_SGE_INLINE_MAX	(BFI_SGE_INLINE + 1)
85f844a0eaSJeff Kirsher 
86f844a0eaSJeff Kirsher /**
87f844a0eaSJeff Kirsher  * SG Flags
88f844a0eaSJeff Kirsher  */
89f844a0eaSJeff Kirsher enum {
90f844a0eaSJeff Kirsher 	BFI_SGE_DATA		= 0,	/*!< data address, not last	     */
91f844a0eaSJeff Kirsher 	BFI_SGE_DATA_CPL	= 1,	/*!< data addr, last in current page */
92f844a0eaSJeff Kirsher 	BFI_SGE_DATA_LAST	= 3,	/*!< data address, last		     */
93f844a0eaSJeff Kirsher 	BFI_SGE_LINK		= 2,	/*!< link address		     */
94f844a0eaSJeff Kirsher 	BFI_SGE_PGDLEN		= 2,	/*!< cumulative data length for page */
95f844a0eaSJeff Kirsher };
96f844a0eaSJeff Kirsher 
97f844a0eaSJeff Kirsher /**
98f844a0eaSJeff Kirsher  * DMA addresses
99f844a0eaSJeff Kirsher  */
100f844a0eaSJeff Kirsher union bfi_addr_u {
101f844a0eaSJeff Kirsher 	struct {
102f844a0eaSJeff Kirsher 		u32	addr_lo;
103f844a0eaSJeff Kirsher 		u32	addr_hi;
104f844a0eaSJeff Kirsher 	} a32;
105f844a0eaSJeff Kirsher };
106f844a0eaSJeff Kirsher 
107f844a0eaSJeff Kirsher /**
108f844a0eaSJeff Kirsher  * Scatter Gather Element
109f844a0eaSJeff Kirsher  */
110f844a0eaSJeff Kirsher struct bfi_sge {
111f844a0eaSJeff Kirsher #ifdef __BIGENDIAN
112f844a0eaSJeff Kirsher 	u32	flags:2,
113f844a0eaSJeff Kirsher 			rsvd:2,
114f844a0eaSJeff Kirsher 			sg_len:28;
115f844a0eaSJeff Kirsher #else
116f844a0eaSJeff Kirsher 	u32	sg_len:28,
117f844a0eaSJeff Kirsher 			rsvd:2,
118f844a0eaSJeff Kirsher 			flags:2;
119f844a0eaSJeff Kirsher #endif
120f844a0eaSJeff Kirsher 	union bfi_addr_u sga;
121f844a0eaSJeff Kirsher };
122f844a0eaSJeff Kirsher 
123f844a0eaSJeff Kirsher /**
124f844a0eaSJeff Kirsher  * Scatter Gather Page
125f844a0eaSJeff Kirsher  */
126f844a0eaSJeff Kirsher #define BFI_SGPG_DATA_SGES		7
127f844a0eaSJeff Kirsher #define BFI_SGPG_SGES_MAX		(BFI_SGPG_DATA_SGES + 1)
128f844a0eaSJeff Kirsher #define BFI_SGPG_RSVD_WD_LEN	8
129f844a0eaSJeff Kirsher struct bfi_sgpg {
130f844a0eaSJeff Kirsher 	struct bfi_sge sges[BFI_SGPG_SGES_MAX];
131f844a0eaSJeff Kirsher 	u32	rsvd[BFI_SGPG_RSVD_WD_LEN];
132f844a0eaSJeff Kirsher };
133f844a0eaSJeff Kirsher 
134f844a0eaSJeff Kirsher /*
135f844a0eaSJeff Kirsher  * Large Message structure - 128 Bytes size Msgs
136f844a0eaSJeff Kirsher  */
137f844a0eaSJeff Kirsher #define BFI_LMSG_SZ		128
138f844a0eaSJeff Kirsher #define BFI_LMSG_PL_WSZ	\
139f844a0eaSJeff Kirsher 			((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
140f844a0eaSJeff Kirsher 
141f844a0eaSJeff Kirsher struct bfi_msg {
142f844a0eaSJeff Kirsher 	struct bfi_mhdr mhdr;
143f844a0eaSJeff Kirsher 	u32	pl[BFI_LMSG_PL_WSZ];
144f844a0eaSJeff Kirsher };
145f844a0eaSJeff Kirsher 
146f844a0eaSJeff Kirsher /**
147f844a0eaSJeff Kirsher  * Mailbox message structure
148f844a0eaSJeff Kirsher  */
149f844a0eaSJeff Kirsher #define BFI_MBMSG_SZ		7
150f844a0eaSJeff Kirsher struct bfi_mbmsg {
151f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;
152f844a0eaSJeff Kirsher 	u32		pl[BFI_MBMSG_SZ];
153f844a0eaSJeff Kirsher };
154f844a0eaSJeff Kirsher 
155f844a0eaSJeff Kirsher /**
156*078086f3SRasesh Mody  * Supported PCI function class codes (personality)
157*078086f3SRasesh Mody  */
158*078086f3SRasesh Mody enum bfi_pcifn_class {
159*078086f3SRasesh Mody 	BFI_PCIFN_CLASS_FC	= 0x0c04,
160*078086f3SRasesh Mody 	BFI_PCIFN_CLASS_ETH	= 0x0200,
161*078086f3SRasesh Mody };
162*078086f3SRasesh Mody 
163*078086f3SRasesh Mody /**
164f844a0eaSJeff Kirsher  * Message Classes
165f844a0eaSJeff Kirsher  */
166f844a0eaSJeff Kirsher enum bfi_mclass {
167f844a0eaSJeff Kirsher 	BFI_MC_IOC		= 1,	/*!< IO Controller (IOC)	    */
168f844a0eaSJeff Kirsher 	BFI_MC_DIAG		= 2,	/*!< Diagnostic Msgs		    */
169f844a0eaSJeff Kirsher 	BFI_MC_FLASH		= 3,	/*!< Flash message class	    */
170f844a0eaSJeff Kirsher 	BFI_MC_CEE		= 4,	/*!< CEE			    */
171f844a0eaSJeff Kirsher 	BFI_MC_FCPORT		= 5,	/*!< FC port			    */
172f844a0eaSJeff Kirsher 	BFI_MC_IOCFC		= 6,	/*!< FC - IO Controller (IOC)	    */
173f844a0eaSJeff Kirsher 	BFI_MC_LL		= 7,	/*!< Link Layer			    */
174f844a0eaSJeff Kirsher 	BFI_MC_UF		= 8,	/*!< Unsolicited frame receive	    */
175f844a0eaSJeff Kirsher 	BFI_MC_FCXP		= 9,	/*!< FC Transport		    */
176f844a0eaSJeff Kirsher 	BFI_MC_LPS		= 10,	/*!< lport fc login services	    */
177f844a0eaSJeff Kirsher 	BFI_MC_RPORT		= 11,	/*!< Remote port		    */
178f844a0eaSJeff Kirsher 	BFI_MC_ITNIM		= 12,	/*!< I-T nexus (Initiator mode)	    */
179f844a0eaSJeff Kirsher 	BFI_MC_IOIM_READ	= 13,	/*!< read IO (Initiator mode)	    */
180f844a0eaSJeff Kirsher 	BFI_MC_IOIM_WRITE	= 14,	/*!< write IO (Initiator mode)	    */
181f844a0eaSJeff Kirsher 	BFI_MC_IOIM_IO		= 15,	/*!< IO (Initiator mode)	    */
182f844a0eaSJeff Kirsher 	BFI_MC_IOIM		= 16,	/*!< IO (Initiator mode)	    */
183f844a0eaSJeff Kirsher 	BFI_MC_IOIM_IOCOM	= 17,	/*!< good IO completion		    */
184f844a0eaSJeff Kirsher 	BFI_MC_TSKIM		= 18,	/*!< Initiator Task management	    */
185f844a0eaSJeff Kirsher 	BFI_MC_SBOOT		= 19,	/*!< SAN boot services		    */
186f844a0eaSJeff Kirsher 	BFI_MC_IPFC		= 20,	/*!< IP over FC Msgs		    */
187f844a0eaSJeff Kirsher 	BFI_MC_PORT		= 21,	/*!< Physical port		    */
188f844a0eaSJeff Kirsher 	BFI_MC_SFP		= 22,	/*!< SFP module			    */
189f844a0eaSJeff Kirsher 	BFI_MC_MSGQ		= 23,	/*!< MSGQ			    */
190f844a0eaSJeff Kirsher 	BFI_MC_ENET		= 24,	/*!< ENET commands/responses	    */
191f844a0eaSJeff Kirsher 	BFI_MC_MAX		= 32
192f844a0eaSJeff Kirsher };
193f844a0eaSJeff Kirsher 
194f844a0eaSJeff Kirsher #define BFI_IOC_MAX_CQS		4
195f844a0eaSJeff Kirsher #define BFI_IOC_MAX_CQS_ASIC	8
196f844a0eaSJeff Kirsher #define BFI_IOC_MSGLEN_MAX	32	/* 32 bytes */
197f844a0eaSJeff Kirsher 
198f844a0eaSJeff Kirsher #define BFI_BOOT_TYPE_OFF		8
199f844a0eaSJeff Kirsher #define BFI_BOOT_LOADER_OFF		12
200f844a0eaSJeff Kirsher 
201f844a0eaSJeff Kirsher #define BFI_BOOT_TYPE_NORMAL		0
202f844a0eaSJeff Kirsher #define	BFI_BOOT_TYPE_FLASH		1
203f844a0eaSJeff Kirsher #define	BFI_BOOT_TYPE_MEMTEST		2
204f844a0eaSJeff Kirsher 
205f844a0eaSJeff Kirsher #define BFI_BOOT_LOADER_OS		0
206f844a0eaSJeff Kirsher 
207af027a34SRasesh Mody #define BFI_FWBOOT_ENV_OS		0
208af027a34SRasesh Mody 
209f844a0eaSJeff Kirsher #define BFI_BOOT_MEMTEST_RES_ADDR   0x900
210f844a0eaSJeff Kirsher #define BFI_BOOT_MEMTEST_RES_SIG    0xA0A1A2A3
211f844a0eaSJeff Kirsher 
212f844a0eaSJeff Kirsher /**
213f844a0eaSJeff Kirsher  *----------------------------------------------------------------------
214f844a0eaSJeff Kirsher  *				IOC
215f844a0eaSJeff Kirsher  *----------------------------------------------------------------------
216f844a0eaSJeff Kirsher  */
217f844a0eaSJeff Kirsher 
218*078086f3SRasesh Mody /**
219*078086f3SRasesh Mody  * Different asic generations
220*078086f3SRasesh Mody  */
221*078086f3SRasesh Mody enum bfi_asic_gen {
222*078086f3SRasesh Mody 	BFI_ASIC_GEN_CB		= 1,
223*078086f3SRasesh Mody 	BFI_ASIC_GEN_CT		= 2,
224*078086f3SRasesh Mody };
225*078086f3SRasesh Mody 
226*078086f3SRasesh Mody enum bfi_asic_mode {
227*078086f3SRasesh Mody 	BFI_ASIC_MODE_FC	= 1,	/* FC upto 8G speed		*/
228*078086f3SRasesh Mody 	BFI_ASIC_MODE_FC16	= 2,	/* FC upto 16G speed		*/
229*078086f3SRasesh Mody 	BFI_ASIC_MODE_ETH	= 3,	/* Ethernet ports		*/
230*078086f3SRasesh Mody 	BFI_ASIC_MODE_COMBO	= 4,	/* FC 16G and Ethernet 10G port	*/
231*078086f3SRasesh Mody };
232*078086f3SRasesh Mody 
233f844a0eaSJeff Kirsher enum bfi_ioc_h2i_msgs {
234f844a0eaSJeff Kirsher 	BFI_IOC_H2I_ENABLE_REQ		= 1,
235f844a0eaSJeff Kirsher 	BFI_IOC_H2I_DISABLE_REQ		= 2,
236f844a0eaSJeff Kirsher 	BFI_IOC_H2I_GETATTR_REQ		= 3,
237f844a0eaSJeff Kirsher 	BFI_IOC_H2I_DBG_SYNC		= 4,
238f844a0eaSJeff Kirsher 	BFI_IOC_H2I_DBG_DUMP		= 5,
239f844a0eaSJeff Kirsher };
240f844a0eaSJeff Kirsher 
241f844a0eaSJeff Kirsher enum bfi_ioc_i2h_msgs {
242f844a0eaSJeff Kirsher 	BFI_IOC_I2H_ENABLE_REPLY	= BFA_I2HM(1),
243f844a0eaSJeff Kirsher 	BFI_IOC_I2H_DISABLE_REPLY	= BFA_I2HM(2),
244f844a0eaSJeff Kirsher 	BFI_IOC_I2H_GETATTR_REPLY	= BFA_I2HM(3),
245*078086f3SRasesh Mody 	BFI_IOC_I2H_HBEAT		= BFA_I2HM(4),
246f844a0eaSJeff Kirsher };
247f844a0eaSJeff Kirsher 
248f844a0eaSJeff Kirsher /**
249f844a0eaSJeff Kirsher  * BFI_IOC_H2I_GETATTR_REQ message
250f844a0eaSJeff Kirsher  */
251f844a0eaSJeff Kirsher struct bfi_ioc_getattr_req {
252f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;
253f844a0eaSJeff Kirsher 	union bfi_addr_u	attr_addr;
254f844a0eaSJeff Kirsher };
255f844a0eaSJeff Kirsher 
256f844a0eaSJeff Kirsher struct bfi_ioc_attr {
257f844a0eaSJeff Kirsher 	u64		mfg_pwwn;	/*!< Mfg port wwn	   */
258f844a0eaSJeff Kirsher 	u64		mfg_nwwn;	/*!< Mfg node wwn	   */
259f844a0eaSJeff Kirsher 	mac_t		mfg_mac;	/*!< Mfg mac		   */
260*078086f3SRasesh Mody 	u8		port_mode;	/* enum bfi_port_mode	   */
261*078086f3SRasesh Mody 	u8		rsvd_a;
262f844a0eaSJeff Kirsher 	u64		pwwn;
263f844a0eaSJeff Kirsher 	u64		nwwn;
264f844a0eaSJeff Kirsher 	mac_t		mac;		/*!< PBC or Mfg mac	   */
265f844a0eaSJeff Kirsher 	u16	rsvd_b;
266f844a0eaSJeff Kirsher 	mac_t		fcoe_mac;
267f844a0eaSJeff Kirsher 	u16	rsvd_c;
268f844a0eaSJeff Kirsher 	char		brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
269f844a0eaSJeff Kirsher 	u8		pcie_gen;
270f844a0eaSJeff Kirsher 	u8		pcie_lanes_orig;
271f844a0eaSJeff Kirsher 	u8		pcie_lanes;
272f844a0eaSJeff Kirsher 	u8		rx_bbcredit;	/*!< receive buffer credits */
273f844a0eaSJeff Kirsher 	u32	adapter_prop;	/*!< adapter properties     */
274f844a0eaSJeff Kirsher 	u16	maxfrsize;	/*!< max receive frame size */
275f844a0eaSJeff Kirsher 	char		asic_rev;
276f844a0eaSJeff Kirsher 	u8		rsvd_d;
277f844a0eaSJeff Kirsher 	char		fw_version[BFA_VERSION_LEN];
278f844a0eaSJeff Kirsher 	char		optrom_version[BFA_VERSION_LEN];
279f844a0eaSJeff Kirsher 	struct bfa_mfg_vpd vpd;
280f844a0eaSJeff Kirsher 	u32	card_type;	/*!< card type			*/
281f844a0eaSJeff Kirsher };
282f844a0eaSJeff Kirsher 
283f844a0eaSJeff Kirsher /**
284f844a0eaSJeff Kirsher  * BFI_IOC_I2H_GETATTR_REPLY message
285f844a0eaSJeff Kirsher  */
286f844a0eaSJeff Kirsher struct bfi_ioc_getattr_reply {
287f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;	/*!< Common msg header		*/
288f844a0eaSJeff Kirsher 	u8			status;	/*!< cfg reply status		*/
289f844a0eaSJeff Kirsher 	u8			rsvd[3];
290f844a0eaSJeff Kirsher };
291f844a0eaSJeff Kirsher 
292f844a0eaSJeff Kirsher /**
293f844a0eaSJeff Kirsher  * Firmware memory page offsets
294f844a0eaSJeff Kirsher  */
295f844a0eaSJeff Kirsher #define BFI_IOC_SMEM_PG0_CB	(0x40)
296f844a0eaSJeff Kirsher #define BFI_IOC_SMEM_PG0_CT	(0x180)
297f844a0eaSJeff Kirsher 
298f844a0eaSJeff Kirsher /**
299f844a0eaSJeff Kirsher  * Firmware statistic offset
300f844a0eaSJeff Kirsher  */
301f844a0eaSJeff Kirsher #define BFI_IOC_FWSTATS_OFF	(0x6B40)
302f844a0eaSJeff Kirsher #define BFI_IOC_FWSTATS_SZ	(4096)
303f844a0eaSJeff Kirsher 
304f844a0eaSJeff Kirsher /**
305f844a0eaSJeff Kirsher  * Firmware trace offset
306f844a0eaSJeff Kirsher  */
307f844a0eaSJeff Kirsher #define BFI_IOC_TRC_OFF		(0x4b00)
308f844a0eaSJeff Kirsher #define BFI_IOC_TRC_ENTS	256
309f844a0eaSJeff Kirsher 
310f844a0eaSJeff Kirsher #define BFI_IOC_FW_SIGNATURE	(0xbfadbfad)
311f844a0eaSJeff Kirsher #define BFI_IOC_MD5SUM_SZ	4
312f844a0eaSJeff Kirsher struct bfi_ioc_image_hdr {
313f844a0eaSJeff Kirsher 	u32	signature;	/*!< constant signature */
314*078086f3SRasesh Mody 	u8	asic_gen;	/*!< asic generation */
315*078086f3SRasesh Mody 	u8	asic_mode;
316*078086f3SRasesh Mody 	u8	port0_mode;	/*!< device mode for port 0 */
317*078086f3SRasesh Mody 	u8	port1_mode;	/*!< device mode for port 1 */
318f844a0eaSJeff Kirsher 	u32	exec;		/*!< exec vector	*/
319*078086f3SRasesh Mody 	u32	bootenv;	/*!< firmware boot env */
320f844a0eaSJeff Kirsher 	u32	rsvd_b[4];
321f844a0eaSJeff Kirsher 	u32	md5sum[BFI_IOC_MD5SUM_SZ];
322f844a0eaSJeff Kirsher };
323f844a0eaSJeff Kirsher 
324*078086f3SRasesh Mody #define BFI_FWBOOT_DEVMODE_OFF		4
325*078086f3SRasesh Mody #define BFI_FWBOOT_TYPE_OFF		8
326*078086f3SRasesh Mody #define BFI_FWBOOT_ENV_OFF		12
327*078086f3SRasesh Mody #define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
328*078086f3SRasesh Mody 	(((u32)(__asic_gen)) << 24 |	\
329*078086f3SRasesh Mody 	 ((u32)(__asic_mode)) << 16 |	\
330*078086f3SRasesh Mody 	 ((u32)(__p0_mode)) << 8 |	\
331*078086f3SRasesh Mody 	 ((u32)(__p1_mode)))
332*078086f3SRasesh Mody 
333f844a0eaSJeff Kirsher enum bfi_fwboot_type {
334f844a0eaSJeff Kirsher 	BFI_FWBOOT_TYPE_NORMAL	= 0,
335f844a0eaSJeff Kirsher 	BFI_FWBOOT_TYPE_FLASH	= 1,
336f844a0eaSJeff Kirsher 	BFI_FWBOOT_TYPE_MEMTEST	= 2,
337f844a0eaSJeff Kirsher };
338f844a0eaSJeff Kirsher 
339*078086f3SRasesh Mody enum bfi_port_mode {
340*078086f3SRasesh Mody 	BFI_PORT_MODE_FC	= 1,
341*078086f3SRasesh Mody 	BFI_PORT_MODE_ETH	= 2,
342*078086f3SRasesh Mody };
343*078086f3SRasesh Mody 
344f844a0eaSJeff Kirsher /**
345f844a0eaSJeff Kirsher  *  BFI_IOC_I2H_READY_EVENT message
346f844a0eaSJeff Kirsher  */
347f844a0eaSJeff Kirsher struct bfi_ioc_rdy_event {
348f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;		/*!< common msg header */
349f844a0eaSJeff Kirsher 	u8			init_status;	/*!< init event status */
350f844a0eaSJeff Kirsher 	u8			rsvd[3];
351f844a0eaSJeff Kirsher };
352f844a0eaSJeff Kirsher 
353f844a0eaSJeff Kirsher struct bfi_ioc_hbeat {
354f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;		/*!< common msg header		*/
355f844a0eaSJeff Kirsher 	u32	   hb_count;	/*!< current heart beat count	*/
356f844a0eaSJeff Kirsher };
357f844a0eaSJeff Kirsher 
358f844a0eaSJeff Kirsher /**
359f844a0eaSJeff Kirsher  * IOC hardware/firmware state
360f844a0eaSJeff Kirsher  */
361f844a0eaSJeff Kirsher enum bfi_ioc_state {
362f844a0eaSJeff Kirsher 	BFI_IOC_UNINIT		= 0,	/*!< not initialized		     */
363f844a0eaSJeff Kirsher 	BFI_IOC_INITING		= 1,	/*!< h/w is being initialized	     */
364f844a0eaSJeff Kirsher 	BFI_IOC_HWINIT		= 2,	/*!< h/w is initialized		     */
365f844a0eaSJeff Kirsher 	BFI_IOC_CFG		= 3,	/*!< IOC configuration in progress   */
366f844a0eaSJeff Kirsher 	BFI_IOC_OP		= 4,	/*!< IOC is operational		     */
367f844a0eaSJeff Kirsher 	BFI_IOC_DISABLING	= 5,	/*!< IOC is being disabled	     */
368f844a0eaSJeff Kirsher 	BFI_IOC_DISABLED	= 6,	/*!< IOC is disabled		     */
369f844a0eaSJeff Kirsher 	BFI_IOC_CFG_DISABLED	= 7,	/*!< IOC is being disabled;transient */
370f844a0eaSJeff Kirsher 	BFI_IOC_FAIL		= 8,	/*!< IOC heart-beat failure	     */
371f844a0eaSJeff Kirsher 	BFI_IOC_MEMTEST		= 9,	/*!< IOC is doing memtest	     */
372f844a0eaSJeff Kirsher };
373f844a0eaSJeff Kirsher 
374f844a0eaSJeff Kirsher #define BFI_IOC_ENDIAN_SIG  0x12345678
375f844a0eaSJeff Kirsher 
376f844a0eaSJeff Kirsher enum {
377f844a0eaSJeff Kirsher 	BFI_ADAPTER_TYPE_FC	= 0x01,		/*!< FC adapters	   */
378f844a0eaSJeff Kirsher 	BFI_ADAPTER_TYPE_MK	= 0x0f0000,	/*!< adapter type mask     */
379f844a0eaSJeff Kirsher 	BFI_ADAPTER_TYPE_SH	= 16,	        /*!< adapter type shift    */
380f844a0eaSJeff Kirsher 	BFI_ADAPTER_NPORTS_MK	= 0xff00,	/*!< number of ports mask  */
381f844a0eaSJeff Kirsher 	BFI_ADAPTER_NPORTS_SH	= 8,	        /*!< number of ports shift */
382f844a0eaSJeff Kirsher 	BFI_ADAPTER_SPEED_MK	= 0xff,		/*!< adapter speed mask    */
383f844a0eaSJeff Kirsher 	BFI_ADAPTER_SPEED_SH	= 0,	        /*!< adapter speed shift   */
384f844a0eaSJeff Kirsher 	BFI_ADAPTER_PROTO	= 0x100000,	/*!< prototype adapaters   */
385f844a0eaSJeff Kirsher 	BFI_ADAPTER_TTV		= 0x200000,	/*!< TTV debug capable     */
386f844a0eaSJeff Kirsher 	BFI_ADAPTER_UNSUPP	= 0x400000,	/*!< unknown adapter type  */
387f844a0eaSJeff Kirsher };
388f844a0eaSJeff Kirsher 
389f844a0eaSJeff Kirsher #define BFI_ADAPTER_GETP(__prop, __adap_prop)			\
390f844a0eaSJeff Kirsher 	(((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>	\
391f844a0eaSJeff Kirsher 		BFI_ADAPTER_ ## __prop ## _SH)
392f844a0eaSJeff Kirsher #define BFI_ADAPTER_SETP(__prop, __val)				\
393f844a0eaSJeff Kirsher 	((__val) << BFI_ADAPTER_ ## __prop ## _SH)
394f844a0eaSJeff Kirsher #define BFI_ADAPTER_IS_PROTO(__adap_type)			\
395f844a0eaSJeff Kirsher 	((__adap_type) & BFI_ADAPTER_PROTO)
396f844a0eaSJeff Kirsher #define BFI_ADAPTER_IS_TTV(__adap_type)				\
397f844a0eaSJeff Kirsher 	((__adap_type) & BFI_ADAPTER_TTV)
398f844a0eaSJeff Kirsher #define BFI_ADAPTER_IS_UNSUPP(__adap_type)			\
399f844a0eaSJeff Kirsher 	((__adap_type) & BFI_ADAPTER_UNSUPP)
400f844a0eaSJeff Kirsher #define BFI_ADAPTER_IS_SPECIAL(__adap_type)			\
401f844a0eaSJeff Kirsher 	((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO |	\
402f844a0eaSJeff Kirsher 			BFI_ADAPTER_UNSUPP))
403f844a0eaSJeff Kirsher 
404f844a0eaSJeff Kirsher /**
405f844a0eaSJeff Kirsher  * BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages
406f844a0eaSJeff Kirsher  */
407f844a0eaSJeff Kirsher struct bfi_ioc_ctrl_req {
408f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;
409*078086f3SRasesh Mody 	u16			clscode;
410*078086f3SRasesh Mody 	u16			rsvd;
411f844a0eaSJeff Kirsher 	u32		tv_sec;
412f844a0eaSJeff Kirsher };
413f844a0eaSJeff Kirsher 
414f844a0eaSJeff Kirsher /**
415f844a0eaSJeff Kirsher  * BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages
416f844a0eaSJeff Kirsher  */
417f844a0eaSJeff Kirsher struct bfi_ioc_ctrl_reply {
418f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;			/*!< Common msg header     */
419f844a0eaSJeff Kirsher 	u8			status;		/*!< enable/disable status */
420*078086f3SRasesh Mody 	u8			port_mode;	/*!< enum bfa_mode */
421*078086f3SRasesh Mody 	u8			cap_bm;		/*!< capability bit mask */
422*078086f3SRasesh Mody 	u8			rsvd;
423f844a0eaSJeff Kirsher };
424f844a0eaSJeff Kirsher 
425f844a0eaSJeff Kirsher #define BFI_IOC_MSGSZ   8
426f844a0eaSJeff Kirsher /**
427f844a0eaSJeff Kirsher  * H2I Messages
428f844a0eaSJeff Kirsher  */
429f844a0eaSJeff Kirsher union bfi_ioc_h2i_msg_u {
430f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;
431f844a0eaSJeff Kirsher 	struct bfi_ioc_ctrl_req enable_req;
432f844a0eaSJeff Kirsher 	struct bfi_ioc_ctrl_req disable_req;
433f844a0eaSJeff Kirsher 	struct bfi_ioc_getattr_req getattr_req;
434f844a0eaSJeff Kirsher 	u32			mboxmsg[BFI_IOC_MSGSZ];
435f844a0eaSJeff Kirsher };
436f844a0eaSJeff Kirsher 
437f844a0eaSJeff Kirsher /**
438f844a0eaSJeff Kirsher  * I2H Messages
439f844a0eaSJeff Kirsher  */
440f844a0eaSJeff Kirsher union bfi_ioc_i2h_msg_u {
441f844a0eaSJeff Kirsher 	struct bfi_mhdr mh;
442*078086f3SRasesh Mody 	struct bfi_ioc_ctrl_reply fw_event;
443f844a0eaSJeff Kirsher 	u32			mboxmsg[BFI_IOC_MSGSZ];
444f844a0eaSJeff Kirsher };
445f844a0eaSJeff Kirsher 
446af027a34SRasesh Mody /**
447af027a34SRasesh Mody  *----------------------------------------------------------------------
448af027a34SRasesh Mody  *				MSGQ
449af027a34SRasesh Mody  *----------------------------------------------------------------------
450af027a34SRasesh Mody  */
451af027a34SRasesh Mody 
452af027a34SRasesh Mody enum bfi_msgq_h2i_msgs {
453af027a34SRasesh Mody 	BFI_MSGQ_H2I_INIT_REQ	   = 1,
454af027a34SRasesh Mody 	BFI_MSGQ_H2I_DOORBELL_PI	= 2,
455af027a34SRasesh Mody 	BFI_MSGQ_H2I_DOORBELL_CI	= 3,
456af027a34SRasesh Mody 	BFI_MSGQ_H2I_CMDQ_COPY_RSP      = 4,
457af027a34SRasesh Mody };
458af027a34SRasesh Mody 
459af027a34SRasesh Mody enum bfi_msgq_i2h_msgs {
460af027a34SRasesh Mody 	BFI_MSGQ_I2H_INIT_RSP	   = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ),
461af027a34SRasesh Mody 	BFI_MSGQ_I2H_DOORBELL_PI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI),
462af027a34SRasesh Mody 	BFI_MSGQ_I2H_DOORBELL_CI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI),
463af027a34SRasesh Mody 	BFI_MSGQ_I2H_CMDQ_COPY_REQ      = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP),
464af027a34SRasesh Mody };
465af027a34SRasesh Mody 
466af027a34SRasesh Mody /* Messages(commands/responsed/AENS will have the following header */
467af027a34SRasesh Mody struct bfi_msgq_mhdr {
468af027a34SRasesh Mody 	u8	msg_class;
469af027a34SRasesh Mody 	u8	msg_id;
470af027a34SRasesh Mody 	u16	msg_token;
471af027a34SRasesh Mody 	u16	num_entries;
472af027a34SRasesh Mody 	u8	enet_id;
473af027a34SRasesh Mody 	u8	rsvd[1];
474af027a34SRasesh Mody };
475af027a34SRasesh Mody 
476af027a34SRasesh Mody #define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do {	\
477af027a34SRasesh Mody 	(_mh).msg_class	 = (_mc);	\
478af027a34SRasesh Mody 	(_mh).msg_id	    = (_mid);       \
479af027a34SRasesh Mody 	(_mh).msg_token	 = (_tok);       \
480af027a34SRasesh Mody 	(_mh).enet_id	   = (_enet_id);   \
481af027a34SRasesh Mody } while (0)
482af027a34SRasesh Mody 
483af027a34SRasesh Mody /*
484af027a34SRasesh Mody  * Mailbox  for messaging interface
485af027a34SRasesh Mody  */
486af027a34SRasesh Mody #define BFI_MSGQ_CMD_ENTRY_SIZE	 (64)    /* TBD */
487af027a34SRasesh Mody #define BFI_MSGQ_RSP_ENTRY_SIZE	 (64)    /* TBD */
488af027a34SRasesh Mody 
489af027a34SRasesh Mody #define bfi_msgq_num_cmd_entries(_size)				 \
490af027a34SRasesh Mody 	(((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE)
491af027a34SRasesh Mody 
492af027a34SRasesh Mody struct bfi_msgq {
493af027a34SRasesh Mody 	union bfi_addr_u addr;
494af027a34SRasesh Mody 	u16 q_depth;     /* Total num of entries in the queue */
495af027a34SRasesh Mody 	u8 rsvd[2];
496af027a34SRasesh Mody };
497af027a34SRasesh Mody 
498af027a34SRasesh Mody /* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
499af027a34SRasesh Mody struct bfi_msgq_cfg_req {
500af027a34SRasesh Mody 	struct bfi_mhdr mh;
501af027a34SRasesh Mody 	struct bfi_msgq cmdq;
502af027a34SRasesh Mody 	struct bfi_msgq rspq;
503af027a34SRasesh Mody };
504af027a34SRasesh Mody 
505af027a34SRasesh Mody /* BFI_ENET_MSGQ_CFG_RSP */
506af027a34SRasesh Mody struct bfi_msgq_cfg_rsp {
507af027a34SRasesh Mody 	struct bfi_mhdr mh;
508af027a34SRasesh Mody 	u8 cmd_status;
509af027a34SRasesh Mody 	u8 rsvd[3];
510af027a34SRasesh Mody };
511af027a34SRasesh Mody 
512af027a34SRasesh Mody /* BFI_MSGQ_H2I_DOORBELL */
513af027a34SRasesh Mody struct bfi_msgq_h2i_db {
514af027a34SRasesh Mody 	struct bfi_mhdr mh;
515af027a34SRasesh Mody 	union {
516af027a34SRasesh Mody 		u16 cmdq_pi;
517af027a34SRasesh Mody 		u16 rspq_ci;
518af027a34SRasesh Mody 	} idx;
519af027a34SRasesh Mody };
520af027a34SRasesh Mody 
521af027a34SRasesh Mody /* BFI_MSGQ_I2H_DOORBELL */
522af027a34SRasesh Mody struct bfi_msgq_i2h_db {
523af027a34SRasesh Mody 	struct bfi_mhdr mh;
524af027a34SRasesh Mody 	union {
525af027a34SRasesh Mody 		u16 rspq_pi;
526af027a34SRasesh Mody 		u16 cmdq_ci;
527af027a34SRasesh Mody 	} idx;
528af027a34SRasesh Mody };
529af027a34SRasesh Mody 
530af027a34SRasesh Mody #define BFI_CMD_COPY_SZ 28
531af027a34SRasesh Mody 
532af027a34SRasesh Mody /* BFI_MSGQ_H2I_CMD_COPY_RSP */
533af027a34SRasesh Mody struct bfi_msgq_h2i_cmdq_copy_rsp {
534af027a34SRasesh Mody 	struct bfi_mhdr mh;
535af027a34SRasesh Mody 	u8	      data[BFI_CMD_COPY_SZ];
536af027a34SRasesh Mody };
537af027a34SRasesh Mody 
538af027a34SRasesh Mody /* BFI_MSGQ_I2H_CMD_COPY_REQ */
539af027a34SRasesh Mody struct bfi_msgq_i2h_cmdq_copy_req {
540af027a34SRasesh Mody 	struct bfi_mhdr mh;
541af027a34SRasesh Mody 	u16     offset;
542af027a34SRasesh Mody 	u16     len;
543af027a34SRasesh Mody };
544af027a34SRasesh Mody 
545f844a0eaSJeff Kirsher #pragma pack()
546f844a0eaSJeff Kirsher 
547f844a0eaSJeff Kirsher #endif /* __BFI_H__ */
548