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 _TAVOR_IB_H 28 #define _TAVOR_IB_H 29 30 /* 31 * tavor_ib.h 32 */ 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #include <sys/types.h> 39 #include <sys/ib/adapters/tavor/tavor_ioctl.h> 40 41 #define FWFLASH_IB_DRIVER_NAME "tavor" 42 43 #define NODE_GUID_OFFSET 0x0 44 #define PORT1_GUID_OFFSET 0x08 45 #define PORT2_GUID_OFFSET 0x10 46 #define FLASH_SIZE_OFFSET 0x20 47 #define FLASH_GUID_PTR 0x24 48 49 typedef struct fw_rev_s { 50 uint32_t major; 51 uint32_t minor; 52 uint32_t subminor; 53 uint32_t holder; 54 } fw_rev_t; 55 56 57 typedef struct mlx_is { 58 uint8_t isresv1[16]; 59 uint8_t hwrev; /* hardware version */ 60 uint8_t isver; /* Invariant Sector version */ 61 uint32_t isresv2; 62 /* offset from 0x32 to get log2sectsz */ 63 uint16_t log2sectszp; 64 /* 65 * 3rd lot of reserved bytes CAN BE variable length, 66 * but defaults to 0x18 bytes 67 */ 68 uint8_t isresv3[0x18]; 69 uint16_t log2sectsz; /* log_2 of flash sector size */ 70 uint8_t *isresv4; /* remainder of IS */ 71 } mlx_is_t; 72 73 typedef struct mlx_xps { 74 uint32_t fia; /* fw image addr */ 75 uint32_t fis; /* fw image size */ 76 uint32_t signature; /* firmware signature */ 77 uint8_t xpsresv1[20]; 78 uint8_t vsdpsid[224]; /* VSD and PSID */ 79 uint32_t xpsresv2; 80 uint16_t xpsresv3; /* MUST be zero */ 81 uint16_t crc16; 82 uint8_t *xpsresv4; /* from 0x108 to END OF SECTOR */ 83 } mlx_xps_t; 84 85 86 #define XFI_IMGINFO_OFFSET 28 87 #define XFI_IMGINFO_CKSUM_MASK 0xFF000000 88 #define XFI_IMGINFO_PTR_MASK 0x00FFFFFF 89 90 typedef struct mlx_xfi { 91 uint8_t xfiresv1[28]; 92 uint32_t imageinfoptr; 93 uint32_t xfiresv2; 94 uint32_t nguidptr; 95 uint8_t *xfiremainder; 96 } mlx_xfi_t; 97 98 /* 99 * Of all the structures we poke around with, we're packing 100 * these because we frequently have to operate on them as 101 * plain old byte arrays. If we don't pack it then the compiler 102 * will "properly" align it for us - which results in a 103 * structure that's a l l s p r e a d o u t. 104 */ 105 #pragma pack(1) 106 typedef struct mlx_guid_sect 107 { 108 uint8_t guidresv[16]; 109 uint64_t nodeguid; 110 uint64_t port1guid; 111 uint64_t port2guid; 112 uint64_t sysimguid; 113 uint16_t guidresv2; 114 uint16_t guidcrc; 115 } mlx_guid_sect_t; 116 #pragma pack() 117 118 /* this is 13x 32bit words */ 119 #define GUIDSECTION_SZ sizeof (struct mlx_guid_sect) 120 121 /* we hook this struct into vpr->encap_ident */ 122 typedef struct ib_encap_ident { 123 uint_t magic; 124 int fd; 125 fw_rev_t fw_rev; 126 uint32_t hwrev; 127 uint32_t sector_sz; 128 uint32_t device_sz; 129 uint32_t state; 130 int cmd_set; 131 mlx_mdr_t info; 132 int pn_len; 133 int hwfw_match; 134 uint32_t pfi_guid_addr; /* addr of the offset */ 135 uint32_t sfi_guid_addr; 136 uint32_t pri_guid_section[GUIDSECTION_SZ]; 137 uint32_t sec_guid_section[GUIDSECTION_SZ]; 138 uint64_t ibguids[4]; 139 uint8_t *inv; /* Invariant Sector */ 140 uint8_t *pps; /* Primary Pointer Sector */ 141 uint8_t *sps; /* Secondary Pointer Sector */ 142 uint8_t *pfi; /* Primary Firmware Image */ 143 uint8_t *sfi; /* Secondary Firmware Image */ 144 uint8_t mlx_psid[16]; 145 uint8_t mlx_vsd[208]; 146 } ib_encap_ident_t; 147 148 #define FLASH_PS_SIGNATURE 0x5a445a44 149 150 #define FLASH_IS_SECTOR_SIZE_OFFSET 0x32 151 #define FLASH_IS_SECTOR_SIZE_MASK 0x0000FFFF 152 #define FLASH_IS_HWVER_OFFSET 0x10 153 #define FLASH_IS_HWVER_MASK 0xFF000000 154 #define FLASH_IS_ISVER_MASK 0x00FF0000 155 156 #define FLASH_IS_SECT_SIZE_PTR 0x16 157 #define FLASH_IS_SECT_SIZE_PTR_MASK 0x0000FFFF 158 159 #define FLASH_PS_FI_ADDR_OFFSET 0x00 160 #define FLASH_PS_FW_SIZE_OFFSET 0x04 161 #define FLASH_PS_SIGNATURE_OFFSET 0x08 162 /* Vendor Specific Data (VSD) */ 163 #define FLASH_PS_VSD_OFFSET 0x20 164 /* VSD length in bytes */ 165 #define FLASH_PS_VSD_LENGTH 0xE0 166 #define FLASH_PS_VSD_LENGTH_4 0x38 167 /* PSID is the last 16B of VSD */ 168 #define FLASH_PS_PSID_OFFSET 0xF0 169 170 /* For use with Cisco's VSD */ 171 #define FLASH_VSD_CISCO_SIGNATURE 0x05ad 172 #define FLASH_VSD_CISCO_BOOT_OPTIONS 0x00000004 173 #define FLASH_VSD_CISCO_FLAG_AUTOUPGRADE 0x01000000 174 #define FLASH_VSD_CISCO_FLAG_BOOT_ENABLE_PORT_1 0x00010000 175 #define FLASH_VSD_CISCO_FLAG_BOOT_ENABLE_PORT_2 0x00020000 176 #define FLASH_VSD_CISCO_FLAG_BOOT_ENABLE_SCAN 0x00040000 177 #define FLASH_VSD_CISCO_FLAG_BOOT_TYPE_WELL_KNOWN 0x00000000 178 #define FLASH_VSD_CISCO_FLAG_BOOT_TRY_FOREVER 0x00001000 179 #define FLASH_VSD_CISCO_BOOT_VERSION 2 180 /* For use with Cisco's VSD */ 181 182 #define MLX_CISCO_CHECK 1 183 #define MLX_CISCO_SET 2 184 185 #define FLASH_PS_CRC16_SIZE 0x104 186 #define FLASH_PS_CRC16_OFFSET 0x106 187 188 #define FLASH_FI_NGUID_OFFSET 0x0 189 #define FLASH_FI_P1GUID_OFFSET 0x08 190 #define FLASH_FI_P2GUID_OFFSET 0x10 191 #define FLASH_FI_SYSIMGUID_OFFSET 0x18 192 #define FLASH_GUID_CRC16_SIZE 0x30 193 #define FLASH_GUID_CRC16_OFFSET 0x32 194 #define FLASH_GUID_SIZE 0x34 195 196 #define FLASH_GUID_CRC_LEN 0x2F 197 /* 198 * Used during read/write ioctl calls to setup the offset into the firmware 199 * image memory for that particular sector. 200 */ 201 #define FLASH_SECTOR_OFFSET(fw, sect, sz) \ 202 (caddr_t)((uintptr_t)fw + (sect << sz)) 203 204 /* 205 * Vital System Data from PCI config space. 206 */ 207 uint32_t vsd_int[FLASH_PS_VSD_LENGTH_4]; 208 209 210 /* 211 * Common Flash Interface data. 212 */ 213 typedef union cfi_u { 214 uchar_t cfi_char[TAVOR_CFI_INFO_SIZE]; 215 uint32_t cfi_int[TAVOR_CFI_INFO_QSIZE]; 216 } cfi_t; 217 218 219 #ifdef __cplusplus 220 } 221 #endif 222 223 224 225 226 #endif /* _TAVOR_IB_H */ 227