1*de2fb981Skettenis /* $OpenBSD: qlwreg.h,v 1.7 2014/03/15 21:49:47 kettenis Exp $ */ 2c0265cf2Skettenis 3c0265cf2Skettenis /* 4c0265cf2Skettenis * Copyright (c) 2013, 2014 Jonathan Matthew <jmatthew@openbsd.org> 5c0265cf2Skettenis * Copyright (c) 2014 Mark Kettenis <kettenis@openbsd.org> 6c0265cf2Skettenis * 7c0265cf2Skettenis * Permission to use, copy, modify, and distribute this software for any 8c0265cf2Skettenis * purpose with or without fee is hereby granted, provided that the above 9c0265cf2Skettenis * copyright notice and this permission notice appear in all copies. 10c0265cf2Skettenis * 11c0265cf2Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12c0265cf2Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13c0265cf2Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14c0265cf2Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15c0265cf2Skettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16c0265cf2Skettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17c0265cf2Skettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18c0265cf2Skettenis */ 19c0265cf2Skettenis 20c0265cf2Skettenis /* firmware loading */ 21c0265cf2Skettenis #define QLW_CODE_ORG 0x1000 22c0265cf2Skettenis 23c0265cf2Skettenis /* interrupt types */ 24c0265cf2Skettenis #define QLW_INT_TYPE_MBOX 1 25c0265cf2Skettenis #define QLW_INT_TYPE_ASYNC 2 26c0265cf2Skettenis #define QLW_INT_TYPE_IO 3 27c0265cf2Skettenis #define QLW_INT_TYPE_OTHER 4 28c0265cf2Skettenis 29c0265cf2Skettenis /* ISP registers */ 30c0265cf2Skettenis #define QLW_CFG0 0x04 31c0265cf2Skettenis #define QLW_CFG1 0x06 32c0265cf2Skettenis #define QLW_INT_CTRL 0x08 33c0265cf2Skettenis #define QLW_INT_STATUS 0x0a 34c0265cf2Skettenis #define QLW_SEMA 0x0c 35c0265cf2Skettenis #define QLW_NVRAM 0x0e 36c0265cf2Skettenis #define QLW_FLASH_BIOS_DATA 0x10 37c0265cf2Skettenis #define QLW_FLASH_BIOS_ADDR 0x12 38fdfcaeaeSkettenis #define QLW_CDMA_CFG 0x20 39fdfcaeaeSkettenis #define QLW_DDMA_CFG 0x40 40e753b624Skettenis #define QLW_MBOX_BASE_PCI 0x70 41e753b624Skettenis #define QLW_MBOX_BASE_SBUS 0x80 42fdfcaeaeSkettenis #define QLW_CDMA_CFG_1080 0x80 43fdfcaeaeSkettenis #define QLW_DDMA_CFG_1080 0xa0 44e753b624Skettenis #define QLW_HOST_CMD_CTRL_PCI 0xc0 45c0265cf2Skettenis #define QLW_GPIO_DATA 0xcc 46c0265cf2Skettenis #define QLW_GPIO_ENABLE 0xce 47c0265cf2Skettenis 48e753b624Skettenis #define QLW_HOST_CMD_CTRL_SBUS 0x440 49e753b624Skettenis 50e753b624Skettenis #define QLW_REQ_IN 0x08 51e753b624Skettenis #define QLW_REQ_OUT 0x08 52e753b624Skettenis #define QLW_RESP_IN 0x0a 53e753b624Skettenis #define QLW_RESP_OUT 0x0a 54c0265cf2Skettenis 55fdfcaeaeSkettenis /* QLW_CFG1 */ 56fdfcaeaeSkettenis #define QLW_BURST_ENABLE 0x0004 57fdfcaeaeSkettenis #define QLW_PCI_FIFO_16 0x0010 58fdfcaeaeSkettenis #define QLW_PCI_FIFO_32 0x0020 59fdfcaeaeSkettenis #define QLW_PCI_FIFO_64 0x0030 60fdfcaeaeSkettenis #define QLW_PCI_FIFO_128 0x0040 61fdfcaeaeSkettenis #define QLW_PCI_FIFO_MASK 0x0070 62e753b624Skettenis #define QLW_SBUS_FIFO_64 0x0003 63e753b624Skettenis #define QLW_SBUS_FIFO_32 0x0002 64e753b624Skettenis #define QLW_SBUS_FIFO_16 0x0001 65e753b624Skettenis #define QLW_SBUS_FIFO_8 0x0000 66e753b624Skettenis #define QLW_SBUS_FIFO_MASK 0x0003 67e753b624Skettenis #define QLW_SBUS_BURST_8 0x0008 68fdfcaeaeSkettenis #define QLW_DMA_BANK 0x0300 69fdfcaeaeSkettenis 70c0265cf2Skettenis /* QLW_INT_CTRL */ 71c0265cf2Skettenis #define QLW_RESET 0x0001 72c0265cf2Skettenis 73c0265cf2Skettenis /* QLW_INT_STATUS */ 74c0265cf2Skettenis #define QLW_INT_REQ 0x0002 75c0265cf2Skettenis #define QLW_RISC_INT_REQ 0x0004 76c0265cf2Skettenis 77c0265cf2Skettenis /* QLW_SEMA */ 78c0265cf2Skettenis #define QLW_SEMA_STATUS 0x0002 79c0265cf2Skettenis #define QLW_SEMA_LOCK 0x0001 80c0265cf2Skettenis 81c0265cf2Skettenis /* QLW_NVRAM */ 82c0265cf2Skettenis #define QLW_NVRAM_DATA_IN 0x0008 83c0265cf2Skettenis #define QLW_NVRAM_DATA_OUT 0x0004 84c0265cf2Skettenis #define QLW_NVRAM_CHIP_SEL 0x0002 85c0265cf2Skettenis #define QLW_NVRAM_CLOCK 0x0001 86c0265cf2Skettenis #define QLW_NVRAM_CMD_READ 6 87c0265cf2Skettenis 88fdfcaeaeSkettenis /* QLW_CDMA_CFG and QLW_DDMA_CFG */ 89fdfcaeaeSkettenis #define QLW_DMA_BURST_ENABLE 0x0002 90fdfcaeaeSkettenis 91c0265cf2Skettenis /* QLW_HOST_CMD_CTRL write */ 92c0265cf2Skettenis #define QLW_HOST_CMD_SHIFT 12 93c0265cf2Skettenis #define QLW_HOST_CMD_NOP 0x0 94c0265cf2Skettenis #define QLW_HOST_CMD_RESET 0x1 95c0265cf2Skettenis #define QLW_HOST_CMD_PAUSE 0x2 96c0265cf2Skettenis #define QLW_HOST_CMD_RELEASE 0x3 97c0265cf2Skettenis #define QLW_HOST_CMD_MASK_PARITY 0x4 98c0265cf2Skettenis #define QLW_HOST_CMD_SET_HOST_INT 0x5 99c0265cf2Skettenis #define QLW_HOST_CMD_CLR_HOST_INT 0x6 100c0265cf2Skettenis #define QLW_HOST_CMD_CLR_RISC_INT 0x7 101c0265cf2Skettenis #define QLW_HOST_CMD_BIOS 0x9 102c0265cf2Skettenis #define QLW_HOST_CMD_ENABLE_PARITY 0xa 103c0265cf2Skettenis #define QLW_HOST_CMD_PARITY_ERROR 0xe 104c0265cf2Skettenis 105c0265cf2Skettenis /* QLA_HOST_CMD_CTRL read */ 106c0265cf2Skettenis #define QLA_HOST_STATUS_HOST_INT 0x0080 107c0265cf2Skettenis #define QLA_HOST_STATUS_RISC_RESET 0x0040 108c0265cf2Skettenis #define QLA_HOST_STATUS_RISC_PAUSE 0x0020 109c0265cf2Skettenis #define QLA_HOST_STATUS_RISC_EXT 0x0010 110c0265cf2Skettenis 111c0265cf2Skettenis /* QLW_MBIX_BASE (reg 0) read */ 112c0265cf2Skettenis #define QLW_MBOX_HAS_STATUS 0x4000 113c0265cf2Skettenis #define QLW_MBOX_COMPLETE 0x4000 114c0265cf2Skettenis #define QLW_MBOX_INVALID 0x4001 115c0265cf2Skettenis #define QLW_ASYNC_BUS_RESET 0x8001 116c0265cf2Skettenis #define QLW_ASYNC_SYSTEM_ERROR 0x8002 117c0265cf2Skettenis #define QLW_ASYNC_REQ_XFER_ERROR 0x8003 118c0265cf2Skettenis #define QLW_ASYNC_RSP_XFER_ERROR 0x8004 119c0265cf2Skettenis #define QLW_ASYNC_SCSI_CMD_COMPLETE 0x8020 120c0265cf2Skettenis #define QLW_ASYNC_CTIO_COMPLETE 0x8021 121c0265cf2Skettenis 122c0265cf2Skettenis /* QLW_MBOX_BASE (reg 0) write */ 123c0265cf2Skettenis #define QLW_MBOX_NOP 0x0000 124c0265cf2Skettenis #define QLW_MBOX_LOAD_RAM 0x0001 125c0265cf2Skettenis #define QLW_MBOX_EXEC_FIRMWARE 0x0002 126c0265cf2Skettenis #define QLW_MBOX_WRITE_RAM_WORD 0x0004 127c0265cf2Skettenis #define QLW_MBOX_REGISTER_TEST 0x0006 128c0265cf2Skettenis #define QLW_MBOX_VERIFY_CSUM 0x0007 129c0265cf2Skettenis #define QLW_MBOX_ABOUT_FIRMWARE 0x0008 130de121c55Skettenis #define QLW_MBOX_INIT_REQ_QUEUE 0x0010 131de121c55Skettenis #define QLW_MBOX_INIT_RSP_QUEUE 0x0011 132c0265cf2Skettenis #define QLW_MBOX_BUS_RESET 0x0018 133c0265cf2Skettenis #define QLW_MBOX_GET_FIRMWARE_STATUS 0x001F 134c0265cf2Skettenis #define QLW_MBOX_SET_INITIATOR_ID 0x0030 135c0265cf2Skettenis #define QLW_MBOX_SET_SELECTION_TIMEOUT 0x0031 136c0265cf2Skettenis #define QLW_MBOX_SET_RETRY_COUNT 0x0032 137c0265cf2Skettenis #define QLW_MBOX_SET_TAG_AGE_LIMIT 0x0033 138c0265cf2Skettenis #define QLW_MBOX_SET_CLOCK_RATE 0x0034 139c0265cf2Skettenis #define QLW_MBOX_SET_ACTIVE_NEGATION 0x0035 140c0265cf2Skettenis #define QLW_MBOX_SET_ASYNC_DATA_SETUP 0x0036 141c0265cf2Skettenis #define QLW_MBOX_SET_PCI_CONTROL 0x0037 142c0265cf2Skettenis #define QLW_MBOX_SET_TARGET_PARAMETERS 0x0038 143c0265cf2Skettenis #define QLW_MBOX_SET_DEVICE_QUEUE 0x0039 144c0265cf2Skettenis #define QLW_MBOX_SET_SYSTEM_PARAMETER 0x0045 145c0265cf2Skettenis #define QLW_MBOX_SET_FIRMWARE_FEATURES 0x004a 146c0265cf2Skettenis #define QLW_MBOX_INIT_REQ_QUEUE_A64 0x0052 147c0265cf2Skettenis #define QLW_MBOX_INIT_RSP_QUEUE_A64 0x0053 148c0265cf2Skettenis #define QLW_MBOX_SET_DATA_OVERRUN_RECOVERY 0x005a 149c0265cf2Skettenis 150c0265cf2Skettenis /* mailbox operation register bitfields */ 151c0265cf2Skettenis #define QLW_MBOX_ABOUT_FIRMWARE_IN 0x0001 152c0265cf2Skettenis #define QLW_MBOX_ABOUT_FIRMWARE_OUT 0x004f 153c0265cf2Skettenis #define QLW_MBOX_INIT_FIRMWARE_IN 0x00fd 154c0265cf2Skettenis 155d28ac15bSkettenis #define QLW_FW_FEATURE_FAST_POSTING 0x0001 156d28ac15bSkettenis #define QLW_FW_FEATURE_LVD_NOTIFY 0x0002 157d28ac15bSkettenis 158c0265cf2Skettenis /* nvram layout */ 159c0265cf2Skettenis struct qlw_nvram_target { 160c0265cf2Skettenis u_int8_t parameter; 161c0265cf2Skettenis u_int8_t execution_throttle; 162c0265cf2Skettenis u_int8_t sync_period; 163c0265cf2Skettenis u_int8_t flags; 164c0265cf2Skettenis u_int8_t reserved[2]; 165c0265cf2Skettenis } __packed; 166c0265cf2Skettenis 167c0265cf2Skettenis struct qlw_nvram_1040 { 168c0265cf2Skettenis u_int8_t id[4]; 169c0265cf2Skettenis u_int8_t nvram_version; 170c0265cf2Skettenis u_int8_t config1; 171c0265cf2Skettenis u_int8_t reset_delay; 172c0265cf2Skettenis u_int8_t retry_count; 173c0265cf2Skettenis u_int8_t retry_delay; 174c0265cf2Skettenis u_int8_t config2; 175c0265cf2Skettenis u_int8_t tag_age_limit; 176c0265cf2Skettenis u_int8_t flags1; 177c0265cf2Skettenis u_int16_t selection_timeout; 178c0265cf2Skettenis u_int16_t max_queue_depth; 179c0265cf2Skettenis u_int8_t flags2; 180c0265cf2Skettenis u_int8_t reserved_0[5]; 181c0265cf2Skettenis u_int8_t flags3; 182c0265cf2Skettenis u_int8_t reserved_1[5]; 183c0265cf2Skettenis struct qlw_nvram_target target[16]; 184c0265cf2Skettenis u_int8_t reserved_2[3]; 185c0265cf2Skettenis u_int8_t checksum; 186c0265cf2Skettenis } __packed; 187c0265cf2Skettenis 188c0265cf2Skettenis struct qlw_nvram_bus { 189c0265cf2Skettenis u_int8_t config1; 190c0265cf2Skettenis u_int8_t reset_delay; 191c0265cf2Skettenis u_int8_t retry_count; 192c0265cf2Skettenis u_int8_t retry_delay; 193c0265cf2Skettenis u_int8_t config2; 194c0265cf2Skettenis u_int8_t reserved_0; 195c0265cf2Skettenis u_int16_t selection_timeout; 196c0265cf2Skettenis u_int16_t max_queue_depth; 197c0265cf2Skettenis u_int8_t reserved_1[6]; 198c0265cf2Skettenis struct qlw_nvram_target target[16]; 199c0265cf2Skettenis } __packed; 200c0265cf2Skettenis 201c0265cf2Skettenis struct qlw_nvram_1080 { 202c0265cf2Skettenis u_int8_t id[4]; 203c0265cf2Skettenis u_int8_t nvram_version; 204c0265cf2Skettenis u_int8_t flags1; 205c0265cf2Skettenis u_int16_t flags2; 206c0265cf2Skettenis u_int8_t reserved_0[8]; 207c0265cf2Skettenis u_int8_t isp_config; 208c0265cf2Skettenis u_int8_t termination; 209c0265cf2Skettenis u_int16_t isp_parameter; 210d28ac15bSkettenis u_int16_t fw_features; 211c0265cf2Skettenis u_int16_t reserved_1; 212c0265cf2Skettenis struct qlw_nvram_bus bus[2]; 213c0265cf2Skettenis u_int8_t reserved_2[2]; 214c0265cf2Skettenis u_int16_t subsystem_vendor_id; 215c0265cf2Skettenis u_int16_t subsystem_device_id; 216c0265cf2Skettenis u_int8_t reserved_3; 217c0265cf2Skettenis u_int8_t checksum; 218c0265cf2Skettenis } __packed; 219c0265cf2Skettenis 220c0265cf2Skettenis struct qlw_nvram { 221c0265cf2Skettenis u_int8_t id[4]; 222c0265cf2Skettenis u_int8_t nvram_version; 223c0265cf2Skettenis u_int8_t data[251]; 224c0265cf2Skettenis }; 225c0265cf2Skettenis 226c0265cf2Skettenis #define QLW_TARGET_PPR 0x0020 227c0265cf2Skettenis #define QLW_TARGET_ASYNC 0x0040 228c0265cf2Skettenis #define QLW_TARGET_NARROW 0x0080 229c0265cf2Skettenis #define QLW_TARGET_RENEG 0x0100 230c0265cf2Skettenis #define QLW_TARGET_QFRZ 0x0200 231c0265cf2Skettenis #define QLW_TARGET_ARQ 0x0400 232c0265cf2Skettenis #define QLW_TARGET_TAGS 0x0800 233c0265cf2Skettenis #define QLW_TARGET_SYNC 0x1000 234c0265cf2Skettenis #define QLW_TARGET_WIDE 0x2000 235c0265cf2Skettenis #define QLW_TARGET_PARITY 0x4000 236c0265cf2Skettenis #define QLW_TARGET_DISC 0x8000 237c0265cf2Skettenis #define QLW_TARGET_SAFE 0xc500 238c0265cf2Skettenis #define QLW_TARGET_DEFAULT 0xfd00 239c0265cf2Skettenis 240c0265cf2Skettenis #define QLW_IOCB_CMD_HEAD_OF_QUEUE 0x0002 241c0265cf2Skettenis #define QLW_IOCB_CMD_ORDERED_QUEUE 0x0004 242c0265cf2Skettenis #define QLW_IOCB_CMD_SIMPLE_QUEUE 0x0008 243c0265cf2Skettenis #define QLW_IOCB_CMD_NO_DATA 0x0000 244c0265cf2Skettenis #define QLW_IOCB_CMD_READ_DATA 0x0020 245c0265cf2Skettenis #define QLW_IOCB_CMD_WRITE_DATA 0x0040 246c0265cf2Skettenis #define QLW_IOCB_CMD_NO_FAST_POST 0x0080 247c0265cf2Skettenis 248*de2fb981Skettenis struct qlw_iocb_hdr { 249*de2fb981Skettenis u_int8_t entry_type; 250*de2fb981Skettenis u_int8_t entry_count; 251*de2fb981Skettenis u_int8_t seqno; 252*de2fb981Skettenis u_int8_t flags; 253*de2fb981Skettenis } __packed; 254c0265cf2Skettenis 255c0265cf2Skettenis #define QLW_IOCB_SEGS_PER_CMD 4 256c0265cf2Skettenis #define QLW_IOCB_SEGS_PER_CONT 7 257c0265cf2Skettenis 258c0265cf2Skettenis struct qlw_iocb_seg { 259c0265cf2Skettenis u_int32_t seg_addr; 260c0265cf2Skettenis u_int32_t seg_len; 261c0265cf2Skettenis } __packed; 262c0265cf2Skettenis 263c0265cf2Skettenis /* IOCB types */ 264c0265cf2Skettenis #define QLW_IOCB_CMD_TYPE_0 0x01 265c0265cf2Skettenis #define QLW_IOCB_CONT_TYPE_0 0x02 266c0265cf2Skettenis #define QLW_IOCB_STATUS 0x03 267c0265cf2Skettenis #define QLW_IOCB_MARKER 0x04 268c0265cf2Skettenis 269c0265cf2Skettenis struct qlw_iocb_req0 { 270*de2fb981Skettenis struct qlw_iocb_hdr hdr; /* QLW_IOCB_REQ_TYPE0 */ 271c0265cf2Skettenis 272*de2fb981Skettenis u_int32_t handle; 273*de2fb981Skettenis u_int16_t device; 274*de2fb981Skettenis u_int16_t ccblen; 275*de2fb981Skettenis u_int16_t flags; 276*de2fb981Skettenis u_int16_t reserved; 277*de2fb981Skettenis u_int16_t timeout; 278*de2fb981Skettenis u_int16_t seg_count; 279*de2fb981Skettenis u_int8_t cdb[12]; 280*de2fb981Skettenis struct qlw_iocb_seg segs[4]; 281c0265cf2Skettenis } __packed; 282c0265cf2Skettenis 283c0265cf2Skettenis struct qlw_iocb_cont0 { 284*de2fb981Skettenis struct qlw_iocb_hdr hdr; /* QLW_IOCB_CONT_TYPE_0 */ 285c0265cf2Skettenis 286c0265cf2Skettenis u_int32_t reserved; 287c0265cf2Skettenis struct qlw_iocb_seg segs[7]; 288c0265cf2Skettenis } __packed; 289c0265cf2Skettenis 290*de2fb981Skettenis struct qlw_iocb_status { 291*de2fb981Skettenis struct qlw_iocb_hdr hdr; 292c0265cf2Skettenis 293c0265cf2Skettenis u_int32_t handle; 294c0265cf2Skettenis u_int16_t scsi_status; 295c0265cf2Skettenis u_int16_t completion; 296c0265cf2Skettenis u_int16_t state_flags; 297c0265cf2Skettenis u_int16_t status_flags; 298c0265cf2Skettenis u_int16_t rsp_len; 299c0265cf2Skettenis u_int16_t sense_len; 300c0265cf2Skettenis u_int32_t resid; 301c0265cf2Skettenis u_int8_t fcp_rsp[8]; 302c0265cf2Skettenis u_int8_t sense_data[32]; 303c0265cf2Skettenis } __packed; 304c0265cf2Skettenis 305c0265cf2Skettenis /* completion */ 306c0265cf2Skettenis #define QLW_IOCB_STATUS_COMPLETE 0x0000 307c0265cf2Skettenis #define QLW_IOCB_STATUS_INCOMPLETE 0x0001 308c0265cf2Skettenis #define QLW_IOCB_STATUS_DMA_ERROR 0x0002 309c0265cf2Skettenis #define QLW_IOCB_STATUS_RESET 0x0004 310c0265cf2Skettenis #define QLW_IOCB_STATUS_ABORTED 0x0005 311c0265cf2Skettenis #define QLW_IOCB_STATUS_TIMEOUT 0x0006 312c0265cf2Skettenis #define QLW_IOCB_STATUS_DATA_OVERRUN 0x0007 313c0265cf2Skettenis #define QLW_IOCB_STATUS_DATA_UNDERRUN 0x0015 31477bba8c0Skettenis #define QLW_IOCB_STATUS_QUEUE_FULL 0x001c 31577bba8c0Skettenis #define QLW_IOCB_STATUS_WIDE_FAILED 0x001f 31677bba8c0Skettenis #define QLW_IOCB_STATUS_SYNCXFER_FAILED 0x0020 317c0265cf2Skettenis 318c0265cf2Skettenis #define QLW_STATE_GOT_BUS 0x0100 319c0265cf2Skettenis #define QLW_STATE_GOT_TARGET 0x0200 320c0265cf2Skettenis 321c0265cf2Skettenis #define QLW_SCSI_STATUS_SENSE_VALID 0x0200 322c0265cf2Skettenis 323c0265cf2Skettenis struct qlw_iocb_marker { 324*de2fb981Skettenis struct qlw_iocb_hdr hdr; /* QLW_IOCB_MARKER */ 325c0265cf2Skettenis 326c0265cf2Skettenis u_int32_t handle; 327*de2fb981Skettenis u_int16_t device; 328*de2fb981Skettenis u_int16_t modifier; 329*de2fb981Skettenis u_int8_t reserved2[52]; 330*de2fb981Skettenis 331c0265cf2Skettenis } __packed; 332*de2fb981Skettenis 333*de2fb981Skettenis #define QLW_IOCB_MARKER_SYNC_ALL 2 334