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.
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.
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]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _HDRS_HERMON_IB_H
28 #define _HDRS_HERMON_IB_H
35 * ConnectX (hermon) specific definitions.
39 * The reference for the definitions in this file is the
41 * Mellanox HCA Flash Programming Application Note
42 * (Mellanox document number 2205AN)
43 * rev 1.45, 2007. Chapter 4 in particular.
46 #include <sys/types.h>
47 #include <sys/ib/adapters/hermon/hermon_ioctl.h>
50 #define FWFLASH_IB_HERMON_DRIVER "hermon"
53 * Image Info section: Refer Mellanox App note 1.45, Section 4.4
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.
60 #define MLX_MASK_TAGID 0xff000000
61 #define MLX_MASK_TAGSIZE 0x00ffffff
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 */
78 CNX_IMAGE_INFO_REV_SZ
= 4,
80 CNX_FW_BUILD_TIME_SZ
= 8,
84 CNX_VSD_VENDOR_ID_SZ
= 4,
89 * Image Info Format revision (TagID - CNX_IMAGE_INFO_REV).
90 * Provides the format revision of the Image Info section. Currently it is 0x1
92 #define CNX_IMAGE_INFO_VER 1
95 * Firmware Version (TagID - CNX_FW_VER)
96 * Provides the major, minor and sub-minor versions of the firmware image.
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
102 typedef struct cnx_fw_rev_s
{
111 * Firmware Build Time (TagID - CNX_FW_BUILD_TIME)
112 * Provides the data and time of the firmware image build.
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
121 typedef struct cnx_fw_build_time_tag
{
129 } cnx_fw_build_time_t
;
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.
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.
141 #define CNX_MASK_DEV_TYPE_REV 0x00ff0000
142 #define CNX_MASK_DEV_TYPE_ID 0x0000ffff
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
149 #define CNX_TAG_PSID_SIZE 0x10
150 #define CNX_TAG_VSD_SIZE 0xD0
153 * VSD Vendor ID (TagID - CNX_VSD_VENDOR_ID)
154 * The VSD Vendor ID tag holds the PCISIG vendor ID of the vendor that
157 #define CNX_MASK_VSD_VENDORID 0x00ff
159 typedef struct cnx_img_info_s
{
161 cnx_fw_build_time_t fw_buildtime
;
163 uint16_t vsd_vendor_id
;
164 uint8_t psid
[CNX_PSID_SZ
];
165 uint8_t vsd
[CNX_VSD_SZ
];
169 * ConnectX Devices Firmware Image Format
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
;
181 uint32_t cnx_magic_pattern
[4] = {
187 #define CNX_XFI_IMGINFO_CKSUM_MASK 0xFF000000
188 #define CNX_XFI_IMGINFO_PTR_MASK 0x00FFFFFF
190 #define CNX_HWVER_OFFSET 0x20
191 #define CNX_HWVER_MASK 0xFF000000
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
200 * ConnectX Devices GUID Section Structure.
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.
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
;
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
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 */
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
;
258 * Common Flash Interface data.
260 typedef union cfi_u
{
261 uchar_t cfi_char
[HERMON_CFI_INFO_SIZE
];
262 uint32_t cfi_int
[HERMON_CFI_INFO_QSIZE
];
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
,
271 #define CNX_FILE_IMG 1 /* Processing File Image */
272 #define CNX_HW_IMG 2 /* Processing Hardware Image */
274 /* Validate the handle */
275 #define CNX_I_CHECK_HANDLE(s) \
276 ((s == NULL) || ((s)->magic != FWFLASH_IB_MAGIC_NUMBER))
282 #endif /* _HDRS_HERMON_IB_H */