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 (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://www.opensolaris.org/os/licensing.
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 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _HDRS_HERMON_IB_H
28 #define	_HDRS_HERMON_IB_H
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * ConnectX (hermon) specific definitions.
36  */
37 
38 /*
39  * The reference for the definitions in this file is the
40  *
41  *	Mellanox HCA Flash Programming Application Note
42  * (Mellanox document number 2205AN)
43  * rev 1.45, 2007. Chapter 4 in particular.
44  */
45 
46 #include <sys/types.h>
47 #include <sys/ib/adapters/hermon/hermon_ioctl.h>
48 #include "MELLANOX.h"
49 
50 #define	FWFLASH_IB_HERMON_DRIVER	"hermon"
51 
52 /*
53  * Image Info section: Refer Mellanox App note 1.45, Section 4.4
54  *
55  * The Image Info section contains management information about the
56  * firmware image. It consists of a series of consecutive data tags.
57  * Each tag contains a 32-bit header, providing a TagID which indicates
58  * the data type, and the size of the data in the tag.
59  */
60 #define	MLX_MASK_TAGID		0xff000000
61 #define	MLX_MASK_TAGSIZE	0x00ffffff
62 
63 enum tag_ids {
64 	CNX_IMAGE_INFO_REV	= 0,	/* IMAGE_INFO format revision */
65 	CNX_FW_VER		= 1,	/* Firmware Version */
66 	CNX_FW_BUILD_TIME	= 2,	/* Firmware Build Time */
67 	CNX_DEV_TYPE		= 3,	/* Device Type */
68 	CNX_PSID		= 4,	/* Parameter Set IDentification */
69 	CNX_VSD			= 5,	/* Vendor Specific Data */
70 	CNX_RES1		= 6,	/* reserved */
71 	CNX_RES2		= 7,	/* reserved */
72 	CNX_VSD_VENDOR_ID	= 8,	/* PCISIG vendor ID */
73 	/* 0x9 - 0xFE are reserved */
74 	CNX_END_TAG		= 0xff	/* END tag */
75 };
76 
77 enum tag_sizes {
78 	CNX_IMAGE_INFO_REV_SZ	= 4,
79 	CNX_FW_VER_SZ		= 8,
80 	CNX_FW_BUILD_TIME_SZ	= 8,
81 	CNX_DEV_TYPE_SZ		= 4,
82 	CNX_PSID_SZ		= 16,
83 	CNX_VSD_SZ		= 208,
84 	CNX_VSD_VENDOR_ID_SZ	= 4,
85 	CNX_END_TAG_SZ		= 0
86 };
87 
88 /*
89  * Image Info Format revision (TagID - CNX_IMAGE_INFO_REV).
90  * Provides the format revision of the Image Info section. Currently it is 0x1
91  */
92 #define	CNX_IMAGE_INFO_VER	1
93 
94 /*
95  * Firmware Version (TagID - CNX_FW_VER)
96  * Provides the major, minor and sub-minor versions of the firmware image.
97  */
98 #define	CNX_MASK_FW_VER_MAJ	0xffff0000
99 #define	CNX_MASK_FW_VER_MIN	CNX_MASK_FW_VER_MAJ
100 #define	CNX_MASK_FW_VER_SUBMIN	0x0000ffff
101 
102 typedef struct cnx_fw_rev_s {
103 	uint16_t	major;
104 	uint16_t	reserved;
105 	uint16_t	minor;
106 	uint16_t	subminor;
107 } cnx_fw_rev_t;
108 
109 
110 /*
111  * Firmware Build Time (TagID - CNX_FW_BUILD_TIME)
112  * Provides the data and time of the firmware image build.
113  */
114 #define	CNX_MASK_FW_BUILD_HOUR	0x00ff0000
115 #define	CNX_MASK_FW_BUILD_MIN	0x0000ff00
116 #define	CNX_MASK_FW_BUILD_SEC	0x000000ff
117 #define	CNX_MASK_FW_BUILD_YEAR	0xffff0000
118 #define	CNX_MASK_FW_BUILD_MON	0x0000ff00
119 #define	CNX_MASK_FW_BUILD_DAY	0x000000ff
120 
121 typedef struct cnx_fw_build_time_tag {
122 	uint8_t		reserved;
123 	uint8_t		hour;
124 	uint8_t		minute;
125 	uint8_t		second;
126 	uint16_t	year;
127 	uint8_t		month;
128 	uint8_t		day;
129 } cnx_fw_build_time_t;
130 
131 /*
132  * Device Type (TagID - CNX_DEV_TYPE)
133  * The device type tag is only 4 bytes long, so we don't bother to
134  * declare a separate struct for it.
135  *
136  * The CNX_MASK_DEV_TYPE_REV provides the mask to extract the hardware
137  * device's PCI Revision ID.
138  * The CNX_MASK_DEV_TYPE_ID provides the mask to extract the hardware
139  * device's PCI Device ID.
140  */
141 #define	CNX_MASK_DEV_TYPE_REV	0x00ff0000
142 #define	CNX_MASK_DEV_TYPE_ID	0x0000ffff
143 
144 /*
145  * The PSID (TagID - CNX_PSID) and VSD (TagID - CNX_VSD) tag contents are
146  * just bytes without any specific structure, so we'll declare their sizes
147  * but nothing else.
148  */
149 #define	CNX_TAG_PSID_SIZE		0x10
150 #define	CNX_TAG_VSD_SIZE		0xD0
151 
152 /*
153  * VSD Vendor ID (TagID - CNX_VSD_VENDOR_ID)
154  * The VSD Vendor ID tag holds the PCISIG vendor ID of the vendor that
155  * fills the VSD tag.
156  */
157 #define	CNX_MASK_VSD_VENDORID		0x00ff
158 
159 typedef struct cnx_img_info_s {
160 	cnx_fw_rev_t		fw_rev;
161 	cnx_fw_build_time_t	fw_buildtime;
162 	uint16_t		dev_id;
163 	uint16_t		vsd_vendor_id;
164 	uint8_t			psid[CNX_PSID_SZ];
165 	uint8_t			vsd[CNX_VSD_SZ];
166 } cnx_img_info_t;
167 
168 /*
169  * ConnectX Devices Firmware Image Format
170  */
171 typedef struct mlx_cnx_xfi {			/* Byte Offset */
172 	uint32_t	magic_pattern[4];	/* 0x00 - 0x0F */
173 	uint8_t		xfiresv1[24];		/* 0x10 - 0x27 */
174 	uint32_t	failsafechunkinfo;	/* 0x28 - 0x2B */
175 	uint32_t	imageinfoptr;		/* 0x2C - 0x2F */
176 	uint32_t	fwimagesz;		/* 0x30 - 0x33 */
177 	uint32_t	nguidptr;		/* 0x34 - 0x37 */
178 	uint8_t		*xfiremainder;
179 } mlx_cnx_xfi_t;
180 
181 uint32_t	cnx_magic_pattern[4] = {
182 			0x4D544657,
183 			0x8CDFD000,
184 			0xDEAD9270,
185 			0x4154BEEF };
186 
187 #define	CNX_XFI_IMGINFO_CKSUM_MASK	0xFF000000
188 #define	CNX_XFI_IMGINFO_PTR_MASK	0x00FFFFFF
189 
190 #define	CNX_HWVER_OFFSET		0x20
191 #define	CNX_HWVER_MASK			0xFF000000
192 
193 #define	CNX_CHUNK_SIZE_OFFSET		0x28
194 #define	CNX_IMG_INF_PTR_OFFSET		0x2C
195 #define	CNX_IMG_INF_SZ_OFFSET		-0x0C
196 #define	CNX_IMG_SIZE_OFFSET		0x30
197 #define	CNX_NGUIDPTR_OFFSET		0x34
198 
199 /*
200  * ConnectX Devices GUID Section Structure.
201  *
202  * Of all the structures we poke around with, we're packing
203  * these because we frequently have to operate on them as
204  * plain old byte arrays. If we don't pack it then the compiler
205  * will "properly" align it for us - which results in a
206  * structure that's a l l  s p r e a d  o u t.
207  */
208 #pragma pack(1)
209 typedef struct mlx_cnx_guid_sect {	/* Byte Offset */
210 	uint8_t		guidresv[16];	/* 0x00 - 0x0F */
211 	uint64_t	nodeguid;	/* 0x10 - 0x17 */
212 	uint64_t	port1guid;	/* 0x18 - 0x1F */
213 	uint64_t	port2guid;	/* 0x20 - 0x27 */
214 	uint64_t	sysimguid;	/* 0x28 - 0x2F */
215 	uint64_t	port1_mac; 	/* 0x30 - 0x31 - rsvd - must be zero */
216 					/* 0x32 - 0x37 - Port1 MAC [47:0] */
217 	uint64_t	port2_mac; 	/* 0x38 - 0x39 - rsvd - must be zero */
218 					/* 0x3A - 0x3F - Port2 MAC [47:0] */
219 	uint16_t	guidresv2;	/* 0x40 - 0x41 */
220 	uint16_t	guidcrc;	/* 0x42 - 0x43 */
221 } mlx_cnx_guid_sect_t;
222 #pragma pack()
223 
224 #define	CNX_NGUID_OFFSET		0x10
225 #define	CNX_P1GUID_OFFSET		0x18
226 #define	CNX_P2GUID_OFFSET		0x20
227 #define	CNX_SYSIMGUID_OFFSET		0x28
228 #define	CNX_P1MAC_OFFSET		0x32
229 #define	CNX_P2MAC_OFFSET		0x3A
230 #define	CNX_GUID_CRC16_SIZE		0x40	/* 00-3F */
231 #define	CNX_GUID_CRC16_OFFSET		0x42
232 
233 
234 /* we hook this struct into vpr->encap_ident */
235 typedef struct ib_cnx_encap_ident_s {
236 	uint_t		magic;		/* FWFLASH_IB_MAGIC_NUMBER */
237 	int		fd;		/* fd of hermon device */
238 	int		cmd_set;	/* COMMAND SET */
239 	int		pn_len;		/* Part# Length */
240 	int		hwfw_match;	/* 1 = match, 0 - nomatch */
241 					/* Used during write for validation */
242 	cnx_img_info_t	hwfw_img_info;	/* HW Image Info Section */
243 	cnx_img_info_t	file_img_info;	/* Image File's Image Info Section */
244 	mlx_mdr_t	info;		/* Details of HW part#, name, */
245 	uint32_t	*fw;		/* this where image is read to */
246 	uint32_t	hwrev;		/* H/W revision. ex: A0, A1 */
247 	uint32_t	fw_sz;		/* FW image size */
248 	uint32_t	sector_sz;	/* FW sector size */
249 	uint32_t	device_sz;	/* FW device size */
250 	uint32_t	state;
251 	uint64_t	ibguids[4];	/* HW's GUIDs backup info */
252 	uint64_t	ib_mac[2];	/* HW's MAC backup info */
253 	uint32_t	log2_chunk_sz;	/* FW chunk size */
254 	uint32_t	img2_start_addr;	/* Boot Address, 0 - Pri */
255 } ib_cnx_encap_ident_t;
256 
257 /*
258  * Common Flash Interface data.
259  */
260 typedef union cfi_u {
261 	uchar_t		cfi_char[HERMON_CFI_INFO_SIZE];
262 	uint32_t	cfi_int[HERMON_CFI_INFO_QSIZE];
263 } cfi_t;
264 
265 /* used by both identify and verifier plugin */
266 uint16_t cnx_crc16(uint8_t *image, uint32_t size, int is_image);
267 int cnx_is_magic_pattern_present(int *data, int hwim_or_fwim);
268 int cnx_parse_img_info(int *buf, uint32_t byte_size, cnx_img_info_t *img_info,
269     int is_image);
270 
271 #define	CNX_FILE_IMG	1	/* Processing File Image */
272 #define	CNX_HW_IMG	2	/* Processing Hardware Image */
273 
274 /* Validate the handle */
275 #define	CNX_I_CHECK_HANDLE(s)	\
276 	((s == NULL) || ((s)->magic != FWFLASH_IB_MAGIC_NUMBER))
277 
278 #ifdef __cplusplus
279 }
280 #endif
281 
282 #endif /* _HDRS_HERMON_IB_H */
283