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 2009-2015 QLogic Corporation.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*
  28  * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
  29  */
  30 
  31 #ifndef _QLT_REGS_H
  32 #define _QLT_REGS_H
  33 
  34 #include <sys/stmf_defines.h>
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 /*
  41  * Register offsets
  42  */
  43 #define REG_FLASH_ADDR          0x00
  44 #define REG_FLASH_DATA          0x04
  45 #define REG_CTRL_STATUS         0x08
  46 #define REG_INTR_CTRL           0x0C
  47 #define REG_INTR_STATUS         0x10
  48 
  49 #define REG_REQ_IN_PTR          0x1C
  50 #define REG_REQ_OUT_PTR         0x20
  51 #define REG_RESP_IN_PTR         0x24
  52 #define REG_RESP_OUT_PTR        0x28
  53 #define REG_PREQ_IN_PTR         0x2C
  54 #define REG_PREQ_OUT_PTR        0x30
  55 #define REG_ATIO_IN_PTR         0x3C
  56 #define REG_ATIO_OUT_PTR        0x40
  57 
  58 #define REG_RISC_STATUS         0x44
  59 #define REG_HCCR                0x48
  60 #define REG_GPIO_DATA           0x4C
  61 #define REG_GPIO_ENABLE         0x50
  62 #define REG_IOBUS_BASE_ADDR     0x54
  63 #define REG_HOST_SEMA           0x58
  64 #define REG_MBOX0               0x80
  65 
  66 #define REG_MBOX(n)             (REG_MBOX0 + (n << 1))
  67 
  68 #define MAX_MBOXES              32
  69 
  70 /*
  71  * Ctrl Status register definitions
  72  */
  73 #define FLASH_ERROR             BIT_18
  74 #define DMA_ACTIVE_STATUS       BIT_17
  75 #define DMA_SHUTDOWN_CTRL       BIT_16
  76 #define FUNCTION_NUMBER         BIT_15
  77 #define H2RISC_INTR             BIT_6
  78 #define RISC_RESET              BIT_5
  79 /*
  80  * #define      81XX_FUNCTION_NUMBER    BIT_15 | BIT_14 | BIT_13 | BIT_12
  81  */
  82 #define PCI_X_BUS_MODE          (BIT_8 | BIT_9 | BIT_10 | BIT_11)
  83 #define PCI_X_XFER_CTRL         (BIT_4 | BIT_5)
  84 #define PCI_64_BIT_SLOT         BIT_2
  85 #define FLASH_WRITE_ENABLE      BIT_1
  86 #define CHIP_SOFT_RESET         BIT_0
  87 
  88 /*
  89  * INTR_CTRL register
  90  */
  91 #define ENABLE_RISC_INTR        BIT_3
  92 
  93 /*
  94  * INTR_STATUS register
  95  */
  96 #define RISC_PCI_INTR_REQUEST   BIT_3
  97 
  98 /*
  99  * RISC_STATUS register
 100  */
 101 #define FW_INTR_INFO_MASK               (BIT_15 | BIT_14 | BIT_13 | BIT_12 | \
 102                                         BIT_11 | BIT_10 | BIT_9 | BIT_8 | \
 103                                         BIT_7 | BIT_6 | BIT_5 | BIT_4 | \
 104                                         BIT_3 | BIT_2 | BIT_1)
 105 #define FW_INTR_INFO_SHIFT              18
 106 
 107 #define FW_INTR_INFO(status)            (status & (FW_INTR_INFO_MASK << \
 108                                         FW_INTR_INFO_SHIFT))
 109 #define RISC_HOST_INTR_REQUEST          BIT_15
 110 #define RISC_PAUSED                     BIT_8
 111 
 112 #define FW_INTR_STATUS_MASK             (BIT_7 | BIT_6 | BIT_5 | BIT_4 | \
 113                                         BIT_3 | BIT_2 | BIT_1 | BIT_0)
 114 
 115 #define ROM_MBX_CMD_SUCCESSFUL          0x01
 116 #define ROM_MBX_CMD_NOT_SUCCESSFUL      0x02
 117 #define MBX_CMD_SUCCESSFUL              0x10
 118 #define MBX_CMD_NOT_SUCCESSFUL          0x11
 119 #define ASYNC_EVENT                     0x12
 120 #define RESP_Q_UPDATE                   0x13
 121 #define ATIO_Q_UPDATE                   0x1c
 122 #define RESP_ATIO_Q_UPDATE              0x1d
 123 
 124 
 125 /*
 126  * Firmware state codes from get firmware state mailbox command
 127  */
 128 #define FSTATE_CONFIG_WAIT      0
 129 #define FSTATE_WAIT_AL_PA       1
 130 #define FSTATE_WAIT_LOGIN       2
 131 #define FSTATE_READY            3
 132 #define FSTATE_LOSS_SYNC        4
 133 #define FSTATE_ERROR            5
 134 #define FSTATE_NON_PART         7
 135 
 136 #define FSTATE_MPI_NIC_ERROR    0x10
 137 
 138 
 139 /*
 140  * Mailbox command completion status.
 141  */
 142 #define QLT_MBX_CMD_SUCCESS             0x4000
 143 
 144 
 145 /*
 146  * HCCR commands
 147  */
 148 #define NOP                             0x00
 149 #define SET_RISC_RESET                  0x01
 150 #define CLEAR_RISC_RESET                0x02
 151 #define SET_RISC_PAUSE                  0x03
 152 #define CLEAR_RISC_PAUSE                0x04
 153 #define SET_HOST_TO_RISC_INTR           0x05
 154 #define CLEAR_HOST_TO_RISC_INTR         0x06
 155 #define CLEAR_RISC_TO_PCI_INTR          0x0A
 156 
 157 #define HCCR_CMD_SHIFT                  28
 158 #define HCCR_CMD(cmd)                   ((uint32_t)cmd << HCCR_CMD_SHIFT)
 159 
 160 /*
 161  * ISP8100/83xx Multi-Queue MBAR definitions
 162  */
 163 #define MQBAR_REQ_IN                    0x0
 164 #define MQBAR_REQ_OUT                   0x4
 165 #define MQBAR_RESP_IN                   0x8
 166 #define MQBAR_RESP_OUT                  0xc
 167 
 168 #define MQBAR_ATIO_IN                   0x10
 169 #define MQBAR_ATIO_OUT                  0x14
 170 
 171 /* 83xx uses 32 bytes per queue pair */
 172 #define MQBAR_REG_SIZE                  0x20
 173 #define MQBAR_REG_OFFSET                4096
 174 
 175 #define MQ_MAX_QUEUES                   8
 176 #define MQ_MAX_QUEUES_MASK              (MQ_MAX_QUEUES - 1)
 177 
 178 /*
 179  * Flash/NVRAM definitions
 180  */
 181 #define FLASH_DATA_FLAG                 BIT_31
 182 
 183 #define FLASH_CONF_ADDR                 0x7FFD0000
 184 
 185 #define FLASH_DATA_ADDR                 0x7FF00000
 186 
 187 #define FLASH_2400_DATA_ADDR            0x7FF00000
 188 #define FLASH_2500_DATA_ADDR            0x7FF00000
 189 #define FLASH_2700_DATA_ADDR            0x7F800000
 190 #define FLASH_8100_DATA_ADDR            0x7F800000
 191 #define FLASH_8200_DATA_ADDR            0
 192 #define FLASH_8300_DATA_ADDR            0x7F800000
 193 
 194 #define FLASH_DATA_ADDR_81XX            0x7F8D0000
 195                                         /* 0x7F80000 + 0xD0000 */
 196 #define FLASH_DATA_ADDR_83XX            0x7FA70000
 197                                         /* 0x7F80000 + 0x270000 */
 198 
 199 #define NVRAM_CONF_ADDR                 0x7FFF0000
 200 #define NVRAM_DATA_ADDR                 0x7FFE0000
 201 
 202 #define NVRAM_2400_FUNC0_ADDR           0x80
 203 #define NVRAM_2400_FUNC1_ADDR           0x180
 204 
 205 #define NVRAM_2500_FUNC0_ADDR           0x48080
 206 #define NVRAM_2500_FUNC1_ADDR           0x48180
 207 
 208 #define NVRAM_2700_FUNC0_ADDR           0x270080
 209 #define NVRAM_2700_FUNC1_ADDR           0x270180
 210 #define NVRAM_2700_FUNC2_ADDR           0x270280
 211 #define NVRAM_2700_FUNC3_ADDR           0x270380
 212 
 213 #define NVRAM_8100_FUNC0_ADDR           0xD0080
 214 #define NVRAM_8100_FUNC1_ADDR           0xD0180
 215 
 216 #define NVRAM_8300_FC_FUNC0_ADDR        0x270080
 217 #define NVRAM_8300_FC_FUNC1_ADDR        0x270180
 218 
 219 #define NVRAM_8300_FCOE_FUNC0_ADDR      0x274080
 220 #define NVRAM_8300_FCOE_FUNC1_ADDR      0x274180
 221 
 222 #define NVRAM_FUNC0_ADDR                (NVRAM_DATA_ADDR + 0x80)
 223 #define NVRAM_FUNC1_ADDR                (NVRAM_DATA_ADDR + 0x180)
 224 
 225 #define QLT25_NVRAM_FUNC0_ADDR          (FLASH_DATA_ADDR + 0x48080)
 226 #define QLT25_NVRAM_FUNC1_ADDR          (FLASH_DATA_ADDR + 0x48180)
 227 
 228 #define QLT27_NVRAM_FUNC0_ADDR          (FLASH_2700_DATA_ADDR + 0x270080)
 229 #define QLT27_NVRAM_FUNC1_ADDR          (FLASH_2700_DATA_ADDR + 0x270180)
 230 #define QLT27_NVRAM_FUNC2_ADDR          (FLASH_2700_DATA_ADDR + 0x270280)
 231 #define QLT27_NVRAM_FUNC3_ADDR          (FLASH_2700_DATA_ADDR + 0x270380)
 232 
 233 #define QLT81_NVRAM_FUNC0_ADDR          (FLASH_DATA_ADDR_81XX + 0x80)
 234 #define QLT81_NVRAM_FUNC1_ADDR          (FLASH_DATA_ADDR_81XX + 0x180)
 235 
 236 #define QLT83FC_NVRAM_FUNC0_ADDR        (FLASH_DATA_ADDR_83XX + 0x80)
 237 #define QLT83FC_NVRAM_FUNC1_ADDR        (FLASH_DATA_ADDR_83XX + 0x180)
 238 
 239 #define QLT83FCOE_NVRAM_FUNC0_ADDR      (FLASH_DATA_ADDR_83XX + 0x4080)
 240 #define QLT83FCOE_NVRAM_FUNC1_ADDR      (FLASH_DATA_ADDR_83XX + 0x4180)
 241 
 242 #define VPD_2400_FUNC0_ADDR             0
 243 #define VPD_2400_FUNC1_ADDR             0x100
 244 
 245 #define VPD_2500_FUNC0_ADDR             0x48000
 246 #define VPD_2500_FUNC1_ADDR             0x48100
 247 
 248 #define VPD_2700_FUNC0_ADDR             0x270000
 249 #define VPD_2700_FUNC1_ADDR             0x270100
 250 #define VPD_2700_FUNC2_ADDR             0x270200
 251 #define VPD_2700_FUNC3_ADDR             0x270300
 252 
 253 #define VPD_8100_FUNC0_ADDR             0xD0000
 254 #define VPD_8100_FUNC1_ADDR             0xD0400
 255 
 256 #define VPD_8021_FUNC0_ADDR             0xFA300
 257 #define VPD_8021_FUNC1_ADDR             0xFA300
 258 
 259 #define VPD_8300_FC_FUNC0_ADDR          0x270000
 260 #define VPD_8300_FC_FUNC1_ADDR          0x270100
 261 
 262 #define VPD_8300_FCOE_FUNC0_ADDR        0x274000
 263 #define VPD_8300_FCOE_FUNC1_ADDR        0x274100
 264 #define VPD_SIZE                        0x80
 265 
 266 #define QLT24_VPD_FUNC0_ADDR            (NVRAM_DATA_ADDR + 0x0)
 267 #define QLT24_VPD_FUNC1_ADDR            (NVRAM_DATA_ADDR + 0x100)
 268 
 269 #define QLT25_VPD_FUNC0_ADDR            (FLASH_DATA_ADDR + 0x48000)
 270 #define QLT25_VPD_FUNC1_ADDR            (FLASH_DATA_ADDR + 0x48100)
 271 
 272 #define QLT27_VPD_FUNC0_ADDR            (FLASH_2700_DATA_ADDR + 0x270000)
 273 #define QLT27_VPD_FUNC1_ADDR            (FLASH_2700_DATA_ADDR + 0x270100)
 274 #define QLT27_VPD_FUNC2_ADDR            (FLASH_2700_DATA_ADDR + 0x270200)
 275 #define QLT27_VPD_FUNC3_ADDR            (FLASH_2700_DATA_ADDR + 0x270300)
 276 
 277 #define QLT81_VPD_FUNC0_ADDR            (FLASH_8100_DATA_ADDR + 0xD0000)
 278 #define QLT81_VPD_FUNC1_ADDR            (FLASH_8100_DATA_ADDR + 0xD0400)
 279 
 280 #define QLT83FC_VPD_FUNC0_ADDR          (FLASH_8300_DATA_ADDR + 0x270000)
 281 #define QLT83FC_VPD_FUNC1_ADDR          (FLASH_8300_DATA_ADDR + 0x270100)
 282 
 283 #define QLT83FCOE_VPD_FUNC0_ADDR        (FLASH_8300_DATA_ADDR + 0x274000)
 284 #define QLT83FCOE_VPD_FUNC1_ADDR        (FLASH_8300_DATA_ADDR + 0x274100)
 285 
 286 #define FLASH_2400_FIRMWARE_ADDR        0x20000
 287 #define FLASH_2400_FIRMWARE_SIZE        0x10000
 288 
 289 #define FLASH_2500_FIRMWARE_ADDR        0x20000
 290 #define FLASH_2500_FIRMWARE_SIZE        0x10000
 291 
 292 #define FLASH_8100_FIRMWARE_ADDR        0xA0000
 293 #define FLASH_8100_FIRMWARE_SIZE        0x20000
 294 
 295 #define FLASH_8300_BFE_ADDR             0x200000 /* BIOS/FCode/EFI */
 296 #define FLASH_8300_BFE_SIZE             0x80000
 297 
 298 #define FLASH_8300_FC_FIRMWARE_ADDR     0x240000
 299 #define FLASH_8300_FCOE_FIRMWARE_ADDR   0x220000
 300 #define FLASH_8300_FIRMWARE_SIZE        0x20000
 301 
 302 #define FLASH_8300_FIRMWARE_IMAGE_ADDR  0x40000
 303 #define FLASH_8300_FIRMWARE_IMAGE_SIZE  0x80000
 304 
 305 #define FLASH_8200_BOOTLOADER_ADDR      0x4000
 306 #define FLASH_8200_BOOTLOADER_SIZE      0x8000
 307 
 308 #define FLASH_8300_BOOTLOADER_ADDR      0x4000
 309 #define FLASH_8300_BOOTLOADER_SIZE      0x8000
 310 
 311 #define FLASH_2400_DESCRIPTOR_TABLE     0
 312 #define FLASH_2500_DESCRIPTOR_TABLE     0x50000
 313 #define FLASH_8100_DESCRIPTOR_TABLE     0xD8000
 314 #define FLASH_8200_DESCRIPTOR_TABLE     0
 315 #define FLASH_8300_DESCRIPTOR_TABLE     0xFC000
 316 
 317 #define FLASH_2400_LAYOUT_TABLE         0x11400
 318 #define FLASH_2500_LAYOUT_TABLE         0x50400
 319 #define FLASH_8100_LAYOUT_TABLE         0xD8400
 320 #define FLASH_8200_LAYOUT_TABLE         0xFC400
 321 #define FLASH_8300_LAYOUT_TABLE         0xFC400
 322 
 323 #define FLASH_2400_BOOT_CODE_ADDR       0
 324 #define FLASH_2500_BOOT_CODE_ADDR       0
 325 #define FLASH_2700_BOOT_CODE_ADDR       0x200000
 326 #define FLASH_8100_BOOT_CODE_ADDR       0x80000
 327 #define FLASH_8300_BOOT_CODE_ADDR       0x200000
 328 
 329 #define VPD_TAG_END                     0x78
 330 #define VPD_TAG_CHKSUM                  "RV"
 331 #define VPD_TAG_SN                      "SN"
 332 #define VPD_TAG_PN                      "PN"
 333 #define VPD_TAG_PRODID                  "\x82"
 334 #define VPD_TAG_LRT                     0x90
 335 #define VPD_TAG_LRTC                    0x91
 336 
 337 typedef struct qlt_rom_header {
 338         uint8_t         signature[2];
 339         uint8_t         reserved[0x16];
 340         uint8_t         dataoffset[2];
 341         uint8_t         pad[6];
 342 } qlt_rom_header_t;
 343 
 344 typedef struct qlt_rom_data {
 345         uint8_t         signature[4];
 346         uint8_t         vid[2];
 347         uint8_t         did[2];
 348         uint8_t         reserved0[2];
 349         uint8_t         pcidatalen[2];
 350         uint8_t         pcidatarev;
 351         uint8_t         classcode[3];
 352         uint8_t         imagelength[2]; /* In sectors */
 353         uint8_t         revisionlevel[2];
 354         uint8_t         codetype;
 355         uint8_t         indicator;
 356         uint8_t         reserved1[2];
 357         uint8_t         pad[8];
 358 } qlt_rom_data_t;
 359 
 360 typedef struct qlt_rom_image {
 361         qlt_rom_header_t        header;
 362         qlt_rom_data_t          data;
 363         uint32_t                cksum;
 364 } qlt_rom_image_t;
 365 
 366 #define PCI_HEADER0             0x55
 367 #define PCI_HEADER1             0xAA
 368 #define PCI_DATASIG             "PCIR"
 369 #define PCI_SECTOR_SIZE         0x200
 370 #define PCI_CODE_X86PC          0
 371 #define PCI_CODE_FCODE          1
 372 #define PCI_CODE_HPPA           2
 373 #define PCI_CODE_EFI            3
 374 #define PCI_CODE_FW             0xfe
 375 #define PCI_IND_LAST_IMAGE      0x80
 376 #define SBUS_CODE_FCODE         0xf1
 377 
 378 /*
 379  * Firmware Dump structure definition
 380  */
 381 #define QL_2200_FW_DUMP_SIZE    0x68000         /* bytes */
 382 #define QL_2300_FW_DUMP_SIZE    0xE2000         /* bytes */
 383 #define QL_6322_FW_DUMP_SIZE    0xE2000         /* bytes */
 384 #define QL_24XX_FW_DUMP_SIZE    0x0330000       /* bytes */
 385 #define QL_25XX_FW_DUMP_SIZE    0x0330000       /* bytes */
 386 
 387 #define QL_24XX_VPD_SIZE        0x200           /* bytes */
 388 #define QL_24XX_SFP_SIZE        0x200           /* bytes */
 389 
 390 #define LNF_NVRAM_DATA          BIT_0
 391 #define LNF_VPD_DATA            BIT_1
 392 #define LNF_BFE_DATA            BIT_2
 393 
 394 typedef struct qlt_nvram {
 395         /* NVRAM header. */
 396         uint8_t id[4];
 397         uint8_t nvram_version[2];
 398         uint8_t reserved_0[2];
 399 
 400         /* Firmware Initialization Control Block. */
 401         uint8_t version[2];
 402         uint8_t reserved_1[2];
 403         uint8_t max_frame_length[2];
 404         uint8_t execution_throttle[2];
 405         uint8_t exchange_count[2];
 406         uint8_t hard_address[2];
 407         uint8_t port_name[8];
 408         uint8_t node_name[8];
 409         uint8_t login_retry_count[2];
 410         uint8_t link_down_on_nos[2];
 411         uint8_t interrupt_delay_timer[2];
 412         uint8_t login_timeout[2];
 413 
 414         /*
 415          * BIT 0  = Hard Assigned Loop ID
 416          * BIT 1  = Enable Fairness
 417          * BIT 2  = Enable Full-Duplex
 418          * BIT 3  = Reserved
 419          * BIT 4  = Target Mode Enable
 420          * BIT 5  = Initiator Mode Disable
 421          * BIT 6  = Reserved
 422          * BIT 7  = Reserved
 423          *
 424          * BIT 8  = Reserved
 425          * BIT 9  = Disable Initial LIP
 426          * BIT 10 = Descending Loop ID Search
 427          * BIT 11 = Previous Assigned Loop ID
 428          * BIT 12 = Reserved
 429          * BIT 13 = Full Login after LIP
 430          * BIT 14 = Node Name Option
 431          * BIT 15-31 = Reserved
 432          */
 433         uint8_t firmware_options_1[4];
 434 
 435         /*
 436          * BIT 0  = Operation Mode bit 0
 437          * BIT 1  = Operation Mode bit 1
 438          * BIT 2  = Operation Mode bit 2
 439          * BIT 3  = Operation Mode bit 3
 440          * BIT 4  = Connection Options bit 0
 441          * BIT 5  = Connection Options bit 1
 442          * BIT 6  = Connection Options bit 2
 443          * BIT 7  = Enable Non part on LIHA failure
 444          *
 445          * BIT 8  = Enable Class 2
 446          * BIT 9  = Enable ACK0
 447          * BIT 10 = Reserved
 448          * BIT 11 = Enable FC-SP Security
 449          * BIT 12 = FC Tape Enable
 450          * BIT 13-31 = Reserved
 451          */
 452         uint8_t firmware_options_2[4];
 453 
 454         /*
 455          * BIT 0  = Reserved
 456          * BIT 1  = Soft ID only
 457          * BIT 2  = Reserved
 458          * BIT 3  = Reserved
 459          * BIT 4  = FCP RSP Payload bit 0
 460          * BIT 5  = FCP RSP Payload bit 1
 461          * BIT 6  = Enable Rec Out-of-Order data frame handling
 462          * BIT 7  = Disable Automatic PLOGI on Local Loop
 463          *
 464          * BIT 8  = Reserved
 465          * BIT 9  = Enable Out-of-Order FCP_XFER_RDY relative
 466          *          offset handling
 467          * BIT 10 = Reserved
 468          * BIT 11 = Reserved
 469          * BIT 12 = Reserved
 470          * BIT 13 = Data Rate bit 0
 471          * BIT 14 = Data Rate bit 1
 472          * BIT 15 = Data Rate bit 2
 473          * BIT 16 = 75-ohm Termination Select
 474          * BIT 17-31 = Reserved
 475          */
 476         uint8_t firmware_options_3[4];
 477 
 478         /*
 479          * Serial Link Control (offset 56)
 480          * BIT 0  = control enable
 481          * BIT 1-15 = Reserved
 482          */
 483         uint8_t swing_opt[2];
 484 
 485         /*
 486          * Serial Link Control 1G (offset 58)
 487          * BIT 0-7   = Reserved
 488          *
 489          * BIT 8-10  = output swing
 490          * BIT 11-13 = output emphasis
 491          * BIT 14-15 = Reserved
 492          */
 493         uint8_t swing_1g[2];
 494 
 495         /*
 496          * Serial Link Control 2G (offset 60)
 497          * BIT 0-7   = Reserved
 498          *
 499          * BIT 8-10  = output swing
 500          * BIT 11-13 = output emphasis
 501          * BIT 14-15 = Reserved
 502          */
 503         uint8_t swing_2g[2];
 504 
 505         /*
 506          * Serial Link Control 4G (offset 62)
 507          * BIT 0-7   = Reserved
 508          *
 509          * BIT 8-10  = output swing
 510          * BIT 11-13 = output emphasis
 511          * BIT 14-15 = Reserved
 512          */
 513         uint8_t swing_4g[2];
 514 
 515         /* Offset 64. */
 516         uint8_t reserved_2[32];
 517 
 518         /* Offset 96. */
 519         uint8_t reserved_3[32];
 520 
 521         /* PCIe table entries. */
 522         uint8_t reserved_4[32];
 523 
 524         /* Offset 160. */
 525         uint8_t reserved_5[32];
 526 
 527         /* Offset 192. */
 528         uint8_t reserved_6[32];
 529 
 530         /* Offset 224. */
 531         uint8_t reserved_7[32];
 532 
 533         /*
 534          * BIT 0  = Enable spinup delay
 535          * BIT 1  = Disable BIOS
 536          * BIT 2  = Enable Memory Map BIOS
 537          * BIT 3  = Enable Selectable Boot
 538          * BIT 4  = Disable RISC code load
 539          * BIT 5  = Disable serdes
 540          * BIT 6  = Enable opt boot mode
 541          * BIT 7  = Enable int mode BIOS
 542          *
 543          * BIT 8  =
 544          * BIT 9  =
 545          * BIT 10 = Enable lip full login
 546          * BIT 11 = Enable target reset
 547          * BIT 12 =
 548          * BIT 13 = Default Node Name Option
 549          * BIT 14 = Default valid
 550          * BIT 15 = Enable alternate WWN
 551          *
 552          * BIT 16-31 =
 553          */
 554         uint8_t host_p[4];
 555 
 556         uint8_t alternate_port_name[8];
 557         uint8_t alternate_node_name[8];
 558 
 559         uint8_t boot_port_name[8];
 560         uint8_t boot_lun_number[2];
 561         uint8_t reserved_8[2];
 562 
 563         uint8_t alt1_boot_port_name[8];
 564         uint8_t alt1_boot_lun_number[2];
 565         uint8_t reserved_9[2];
 566 
 567         uint8_t alt2_boot_port_name[8];
 568         uint8_t alt2_boot_lun_number[2];
 569         uint8_t reserved_10[2];
 570 
 571         uint8_t alt3_boot_port_name[8];
 572         uint8_t alt3_boot_lun_number[2];
 573         uint8_t reserved_11[2];
 574 
 575         /*
 576          * BIT 0 = Selective Login
 577          * BIT 1 = Alt-Boot Enable
 578          * BIT 2 = Reserved
 579          * BIT 3 = Enable Boot Order List
 580          * BIT 4 = Reserved
 581          * BIT 5 = Enable Selective LUN
 582          * BIT 6 = Reserved
 583          * BIT 7-31 =
 584          */
 585         uint8_t efi_parameters[4];
 586 
 587         uint8_t reset_delay;
 588         uint8_t reserved_12;
 589         uint8_t reserved_13[2];
 590 
 591         uint8_t boot_id_number[2];
 592         uint8_t reserved_14[2];
 593 
 594         uint8_t max_luns_per_target[2];
 595         uint8_t reserved_15[2];
 596 
 597         uint8_t port_down_retry_count[2];
 598         uint8_t link_down_timeout[2];
 599 
 600         /*
 601          * FCode parameters word (offset 344)
 602          *
 603          * BIT 0 = Enable BIOS pathname
 604          * BIT 1 = fcode qlc
 605          * BIT 2 = fcode host
 606          * BIT 3-7 =
 607          */
 608         uint8_t fcode_p0;
 609         uint8_t reserved_16[7];
 610 
 611         /* Offset 352. */
 612         uint8_t prev_drv_ver_major;
 613         uint8_t prev_drv_ver_submajob;
 614         uint8_t prev_drv_ver_minor;
 615         uint8_t prev_drv_ver_subminor;
 616 
 617         uint8_t prev_bios_ver_major[2];
 618         uint8_t prev_bios_ver_minor[2];
 619 
 620         uint8_t prev_efi_ver_major[2];
 621         uint8_t prev_efi_ver_minor[2];
 622 
 623         uint8_t prev_fw_ver_major[2];
 624         uint8_t prev_fw_ver_minor;
 625         uint8_t prev_fw_ver_subminor;
 626 
 627         uint8_t reserved_17[16];
 628 
 629         /* Offset 384. */
 630         uint8_t def_port_name[8];
 631         uint8_t def_node_name[8];
 632 
 633         uint8_t reserved_18[16];
 634 
 635         /* Offset 416. */
 636         uint8_t reserved_19[32];
 637 
 638         /* Offset 448. */
 639         uint8_t reserved_20[28];
 640 
 641         /* Offset 476. */
 642         uint8_t fw_table_offset[2];
 643         uint8_t fw_table_sig[2];
 644 
 645         /* Offset 480. */
 646         uint8_t model_name[8];
 647 
 648         /* Offset 488. */
 649         uint8_t power_table[16];
 650 
 651         uint8_t subsystem_vendor_id[2];
 652         uint8_t subsystem_device_id[2];
 653 
 654         uint8_t checksum[4];
 655 } qlt_nvram_t;
 656 
 657 /* ISP81xx Extended Initialisation Control Block */
 658 typedef struct qlt_ext_icb_81xx {
 659 
 660         uint8_t version[2];
 661         uint8_t fcf_vlan_match;
 662         uint8_t reserved_6[3];
 663         uint8_t fcf_vlan_id[2];
 664         uint8_t fcf_fabric_name[8];
 665         uint8_t reserved_7[14];
 666         uint8_t spma_proposed_mac_address[6];
 667         uint8_t reserved_8[28];
 668 
 669 } qlt_ext_icb_81xx_t;
 670 
 671 typedef struct qlt_nvram_81xx {
 672         /* NVRAM header. */
 673         uint8_t id[4];
 674         uint8_t nvram_version[2];
 675         uint8_t reserved_0[2];
 676 
 677         /* Firmware Initialization Control Block. */
 678         uint8_t version[2];
 679         uint8_t reserved_1[2];
 680         uint8_t max_frame_length[2];
 681         uint8_t execution_throttle[2];
 682         uint8_t exchange_count[2];
 683         uint8_t reserved_2[2];
 684         uint8_t port_name[8];
 685         uint8_t node_name[8];
 686         uint8_t login_retry_count[2];
 687         uint8_t reserved_3[2];
 688         uint8_t interrupt_delay_timer[2];
 689         uint8_t login_timeout[2];
 690 
 691         /*
 692          * BIT 0  = Hard Assigned Loop ID
 693          * BIT 1  = Enable Fairness
 694          * BIT 2  = Enable Full-Duplex
 695          * BIT 3  = Reserved
 696          * BIT 4  = Target Mode Enable
 697          * BIT 5  = Initiator Mode Disable
 698          * BIT 6  = Reserved
 699          * BIT 7  = Reserved
 700          *
 701          * BIT 8  = Reserved
 702          * BIT 9  = Reserved
 703          * BIT 10 = Reserved
 704          * BIT 11 = Reserved
 705          * BIT 12 = Reserved
 706          * BIT 13 = Reserved
 707          * BIT 14 = Node Name Option
 708          * BIT 15-31 = Reserved
 709          */
 710         uint8_t firmware_options_1[4];
 711 
 712         /*
 713          * BIT 0  = Operation Mode bit 0
 714          * BIT 1  = Operation Mode bit 1
 715          * BIT 2  = Operation Mode bit 2
 716          * BIT 3  = Operation Mode bit 3
 717          * BIT 4  = Reserved
 718          * BIT 5  = Reserved
 719          * BIT 6  = Reserved
 720          * BIT 7  = Reserved
 721          *
 722          * BIT 8  = Enable Class 2
 723          * BIT 9  = Enable ACK0
 724          * BIT 10 = Reserved
 725          * BIT 11 = Enable FC-SP Security
 726          * BIT 12 = FC Tape Enable
 727          * BIT 13 = Reserved
 728          * BIT 14 = Target PRLI Control
 729          * BIT 15-31 = Reserved
 730          */
 731         uint8_t firmware_options_2[4];
 732 
 733         /*
 734          * BIT 0  = Reserved
 735          * BIT 1  = Soft ID only
 736          * BIT 2  = Reserved
 737          * BIT 3  = Reserved
 738          * BIT 4  = FCP RSP Payload bit 0
 739          * BIT 5  = FCP RSP Payload bit 1
 740          * BIT 6  = Enable Rec Out-of-Order data frame handling
 741          * BIT 7  = Reserved
 742          *
 743          * BIT 8  = Reserved
 744          * BIT 9  = Enable Out-of-Order FCP_XFER_RDY relative
 745          *          offset handling
 746          * BIT 10 = Reserved
 747          * BIT 11 = Reserved
 748          * BIT 12 = Reserved
 749          * BIT 13 = Reserved
 750          * BIT 14 = Reserved
 751          * BIT 15 = Reserved
 752          * BIT 16 = Reserved
 753          * BIT 17 = Enable Multiple FCFs
 754          * BIT 18-20 = MAC Addressing Mode
 755          * BIT 21-25 = Ethernet Data Rate
 756          * BIT 26 = Enable Ethernet Header Receive ATIO_Q
 757          * BIT 27 = Enable Ethernet Header Receive RSP_Q
 758          * BIT 28-29 = SPMA Selection
 759          * BIT 30-31 = Reserved
 760          */
 761         uint8_t firmware_options_3[4];
 762 
 763         /* Offset 56 (38h). */
 764         uint8_t reserved_4[8];
 765 
 766         /* Offset 64 (40h). */
 767         uint8_t enode_mac[6];
 768 
 769         /* Offset 70 (46h). */
 770         uint8_t reserved_5[26];
 771 
 772         /* Offset 96 (60h). */
 773         uint8_t oem_specific;
 774         uint8_t reserved_6[15];
 775 
 776         /* Offset 112 (70h). */
 777         uint8_t reserved_7[16];
 778 
 779         /* Offset 128 (80h). */
 780         qlt_ext_icb_81xx_t   ext_blk;
 781 
 782         /* Offset 192. */
 783         uint8_t reserved_8[32];
 784 
 785         /* Offset 224. */
 786         uint8_t reserved_9[32];
 787 
 788         uint8_t host_p[4];
 789 
 790         uint8_t alternate_port_name[8];
 791         uint8_t alternate_name_name[8];
 792 
 793         uint8_t boot_port_name[8];
 794         uint8_t boot_lun_number[2];
 795         uint8_t reserved_10[2];
 796 
 797         uint8_t alt1_boot_port_name[8];
 798         uint8_t alt1_boot_lun_number[2];
 799         uint8_t reserved_11[2];
 800 
 801         uint8_t alt2_boot_port_name[8];
 802         uint8_t alt2_boot_lun_number[2];
 803         uint8_t reserved_12[2];
 804 
 805         uint8_t alt3_boot_port_name[8];
 806         uint8_t alt3_boot_lun_number[2];
 807         uint8_t reserved_13[2];
 808 
 809         /*
 810          * BIT 0 = Selective Login
 811          * BIT 1 = Alt-Boot Enable
 812          * BIT 2 = Reserved
 813          * BIT 3 = Enable Boot Order List
 814          * BIT 4 = Reserved
 815          * BIT 5 = Enable Selective LUN
 816          * BIT 6 = Reserved
 817          * BIT 7-31 =
 818          */
 819         uint8_t efi_parameters[4];
 820 
 821         uint8_t reset_delay;
 822         uint8_t reserved_14;
 823         uint8_t reserved_15[2];
 824 
 825         uint8_t boot_id_number[2];
 826         uint8_t reserved_16[2];
 827 
 828         uint8_t max_luns_per_target[2];
 829         uint8_t reserved_17[2];
 830 
 831         uint8_t port_down_retry_count[2];
 832         uint8_t link_down_timeout[2];
 833 
 834         /*
 835          * FCode parameters word (offset 344)
 836          *
 837          * BIT 0 = Enable BIOS pathname
 838          * BIT 1 = fcode qlc
 839          * BIT 2 = fcode host
 840          * BIT 3-7 =
 841          */
 842         uint8_t fcode_parameter[2];
 843         uint8_t reserved_18[6];
 844 
 845         /* Offset 352. */
 846         uint8_t reserved_19[4];
 847         uint8_t reserved_20[10];
 848         uint8_t reserved_21[2];
 849         uint8_t reserved_22[16];
 850 
 851         /* Offset 384. */
 852         uint8_t reserved_23[16];
 853         uint8_t reserved_24[16];
 854 
 855         /* Offset 416. */
 856         uint8_t reserved_25[64];
 857 
 858         /* Offset 480. */
 859         uint8_t model_name[16];
 860 
 861         /* Offset 496. */
 862         uint8_t feature_mask_l[2];
 863         uint8_t feature_mask_h[2];
 864         uint8_t reserved_26[4];
 865 
 866         uint8_t subsystem_vendor_id[2];
 867         uint8_t subsystem_device_id[2];
 868 
 869         uint8_t checksum[4];
 870 
 871 } qlt_nvram_81xx_t;
 872 
 873 /*
 874  * firmware dump Entry Types
 875  */
 876 #define DT_NOP           0
 877 #define DT_THDR         99
 878 #define DT_TEND         255
 879 #define DT_RIOB1        256
 880 #define DT_WIOB1        257
 881 #define DT_RIOB2        258
 882 #define DT_WIOB2        259
 883 #define DT_RPCI         260
 884 #define DT_WPCI         261
 885 #define DT_RRAM         262
 886 #define DT_GQUE         263
 887 #define DT_GFCE         264
 888 #define DT_PRISC        265
 889 #define DT_RRISC        266
 890 #define DT_DINT         267
 891 #define DT_GHBD         268
 892 #define DT_SCRA         269
 893 #define DT_RRREG        270
 894 #define DT_WRREG        271
 895 #define DT_RRRAM        272
 896 #define DT_RPCIC        273
 897 #define DT_GQUES        274
 898 #define DT_WDMP         275
 899 
 900 /*
 901  * firmware dump Template Header (Entry Type 99)
 902  */
 903 typedef struct qlt_dt_hdr {
 904         uint32_t        type;
 905         uint32_t        first_entry_offset;
 906         uint32_t        size_of_template;
 907         uint32_t        rsv;
 908         uint32_t        num_of_entries;
 909         uint32_t        version;
 910         uint32_t        driver_timestamp;
 911         uint32_t        checksum;
 912         uint32_t        rsv_1;
 913         uint32_t        driver_info[3];
 914         uint32_t        saved_state_area[16];
 915         uint32_t        rsv_2[8];
 916         uint32_t        ver_attr[5];
 917 } qlt_dt_hdr_t;
 918 
 919 /*
 920  * firmware dump Common Entry Header
 921  */
 922 typedef struct qlt_dt_entry_hdr {
 923         uint32_t        type;
 924         uint32_t        size;
 925         uint32_t        rsv;
 926 #ifdef _BIG_ENDIAN
 927         uint8_t         driver_flags;
 928         uint8_t         rsv_2;
 929         uint8_t         rsv_1;
 930         uint8_t         capture_flags;
 931 #else
 932         uint8_t         capture_flags;
 933         uint8_t         rsv_1;
 934         uint8_t         rsv_2;
 935         uint8_t         driver_flags;
 936 #endif
 937 } qlt_dt_entry_hdr_t;
 938 
 939 /*
 940  * Capture Flags
 941  */
 942 #define PF_ONLY_FLAG    BIT_0   /* Physical Function Only */
 943 #define PF_VF_FLAG      BIT_1   /* Physical and Virtual Functions */
 944 
 945 /*
 946  * Driver Flags
 947  */
 948 #define SKIPPED_FLAG    BIT_7   /* driver skipped this entry  */
 949 
 950 /*
 951  * firmware dump Entry Including Header
 952  */
 953 typedef struct qlt_dt_entry {
 954         qlt_dt_entry_hdr_t      h;
 955         uint32_t                data[1];
 956 } qlt_dt_entry_t;
 957 
 958 /*
 959  * firmware dump Template image
 960  */
 961 typedef struct qlt_dmp_template {
 962         uint32_t        rsv[2];
 963         uint32_t        len;
 964         uint32_t        major_ver;
 965         uint32_t        minor_ver;
 966         uint32_t        subminor_ver;
 967         uint32_t        attribute;
 968         qlt_dt_hdr_t    hdr;
 969         qlt_dt_entry_t  entries[1];
 970 } qlt_dmp_template_t;
 971 
 972 typedef struct qlt_dt_riob1 {
 973         qlt_dt_entry_hdr_t      h;
 974         uint32_t                addr;
 975 #ifdef _BIG_ENDIAN
 976         uint8_t                 pci_offset;
 977         uint8_t                 reg_count_h;
 978         uint8_t                 reg_count_l;
 979         uint8_t                 reg_size;
 980 #else
 981         uint8_t                 reg_size;
 982         uint8_t                 reg_count_l;
 983         uint8_t                 reg_count_h;
 984         uint8_t                 pci_offset;
 985 #endif
 986 } qlt_dt_riob1_t;
 987 
 988 typedef struct qlt_dt_wiob1 {
 989         qlt_dt_entry_hdr_t      h;
 990         uint32_t                addr;
 991         uint32_t                data;
 992 #ifdef _BIG_ENDIAN
 993         uint8_t                 rsv[3];
 994         uint8_t                 pci_offset;
 995 #else
 996         uint8_t                 pci_offset;
 997         uint8_t                 rsv[3];
 998 #endif
 999 } qlt_dt_wiob1_t;
1000 
1001 typedef struct qlt_dt_riob2 {
1002         qlt_dt_entry_hdr_t      h;
1003         uint32_t                addr;
1004 #ifdef _BIG_ENDIAN
1005         uint8_t                 pci_offset;
1006         uint8_t                 reg_count_h;
1007         uint8_t                 reg_count_l;
1008         uint8_t                 reg_size;
1009         uint8_t                 rsv[3];
1010         uint8_t                 bank_sel_offset;
1011 #else
1012         uint8_t                 reg_size;
1013         uint8_t                 reg_count_l;
1014         uint8_t                 reg_count_h;
1015         uint8_t                 pci_offset;
1016         uint8_t                 bank_sel_offset;
1017         uint8_t                 rsv[3];
1018 #endif
1019         uint32_t                reg_bank;
1020 } qlt_dt_riob2_t;
1021 
1022 typedef struct qlt_dt_wiob2 {
1023         qlt_dt_entry_hdr_t      h;
1024         uint32_t                addr;
1025 #ifdef _BIG_ENDIAN
1026         uint8_t                 rsv[2];
1027         uint8_t                 data_h;
1028         uint8_t                 data_l;
1029         uint8_t                 bank_sel_offset;
1030         uint8_t                 pci_offset;
1031         uint8_t                 rsv1[2];
1032 #else
1033         uint8_t                 data_l;
1034         uint8_t                 data_h;
1035         uint8_t                 rsv[2];
1036         uint8_t                 rsv1[2];
1037         uint8_t                 pci_offset;
1038         uint8_t                 bank_sel_offset;
1039 #endif
1040         uint32_t                reg_bank;
1041 } qlt_dt_wiob2_t;
1042 
1043 typedef struct qlt_dt_rpci {
1044         qlt_dt_entry_hdr_t      h;
1045         uint32_t                addr;
1046 } qlt_dt_rpci_t;
1047 
1048 typedef struct qlt_dt_wpci {
1049         qlt_dt_entry_hdr_t      h;
1050         uint32_t                addr;
1051         uint32_t                data;
1052 } qlt_dt_wpci_t, qlt_dt_wrreg_t;
1053 
1054 typedef struct qlt_dt_rram {
1055         qlt_dt_entry_hdr_t      h;
1056 #ifdef _BIG_ENDIAN
1057         uint8_t                 rsv[3];
1058         uint8_t                 ram_area;
1059 #else
1060         uint8_t                 ram_area;
1061         uint8_t                 rsv[3];
1062 #endif
1063         uint32_t                start_addr;
1064         uint32_t                end_addr;
1065 } qlt_dt_rram_t;
1066 
1067 typedef struct qlt_dt_gque {
1068         qlt_dt_entry_hdr_t      h;
1069         uint32_t                num_queues;
1070 #ifdef _BIG_ENDIAN
1071         uint8_t                 rsv[3];
1072         uint8_t                 queue_type;
1073 #else
1074         uint8_t                 queue_type;
1075         uint8_t                 rsv[3];
1076 #endif
1077 } qlt_dt_gque_t, qlt_dt_gques_t;
1078 
1079 typedef struct qlt_dt_gfce {
1080         qlt_dt_entry_hdr_t      h;
1081         uint32_t                fce_trace_size;
1082         uint32_t                write_pointer[2];
1083         uint32_t                base_pointer[2];
1084         uint32_t                fce_enable_mb0;
1085         uint32_t                fce_enable_mb2;
1086         uint32_t                fce_enable_mb3;
1087         uint32_t                fce_enable_mb4;
1088         uint32_t                fce_enable_mb5;
1089         uint32_t                fce_enable_mb6;
1090 } qlt_dt_gfce_t;
1091 
1092 typedef struct qlt_dt_prisc {
1093         qlt_dt_entry_hdr_t      h;
1094 } qlt_dt_prisc_t, qlt_dt_rrisc_t;
1095 
1096 typedef struct qlt_dt_dint {
1097         qlt_dt_entry_hdr_t      h;
1098 #ifdef _BIG_ENDIAN
1099         uint8_t                 rsv[3];
1100         uint8_t                 pci_offset;
1101 #else
1102         uint8_t                 pci_offset;
1103         uint8_t                 rsv[3];
1104 #endif
1105         uint32_t                data;
1106 } qlt_dt_dint_t;
1107 
1108 typedef struct qlt_dt_ghbd {
1109         qlt_dt_entry_hdr_t      h;
1110 #ifdef _BIG_ENDIAN
1111         uint8_t                 rsv[3];
1112         uint8_t                 host_buf_type;
1113 #else
1114         uint8_t                 host_buf_type;
1115         uint8_t                 rsv[3];
1116 #endif
1117         uint32_t                buf_size;
1118         uint32_t                start_addr;
1119 } qlt_dt_ghbd_t;
1120 
1121 typedef struct qlt_dt_scra {
1122         qlt_dt_entry_hdr_t      h;
1123         uint32_t                scratch_size;
1124 } qlt_dt_scra_t;
1125 
1126 typedef struct qlt_dt_rrreg {
1127         qlt_dt_entry_hdr_t      h;
1128         uint32_t                addr;
1129         uint32_t                count;
1130 } qlt_dt_rrreg_t, qlt_dt_rrram_t, qlt_dt_rpcic_t;
1131 
1132 typedef struct qlt_dt_wdmp {
1133         qlt_dt_entry_hdr_t      h;
1134         uint32_t                length;
1135         uint32_t                data[1];
1136 } qlt_dt_wdmp_t;
1137 
1138 #ifdef  __cplusplus
1139 }
1140 #endif
1141 
1142 #endif /* _QLT_REGS_H */