tavor_ib.h revision 9517:b4839b0aa7a4
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 35extern "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 49typedef 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 57typedef 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 73typedef 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 90typedef 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) 106typedef 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 */ 122typedef 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 */ 207uint32_t vsd_int[FLASH_PS_VSD_LENGTH_4]; 208 209 210/* 211 * Common Flash Interface data. 212 */ 213typedef 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