110696SDavid.Hollister@Sun.COM /* 210696SDavid.Hollister@Sun.COM * CDDL HEADER START 310696SDavid.Hollister@Sun.COM * 410696SDavid.Hollister@Sun.COM * The contents of this file are subject to the terms of the 510696SDavid.Hollister@Sun.COM * Common Development and Distribution License (the "License"). 610696SDavid.Hollister@Sun.COM * You may not use this file except in compliance with the License. 710696SDavid.Hollister@Sun.COM * 810696SDavid.Hollister@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 910696SDavid.Hollister@Sun.COM * or http://www.opensolaris.org/os/licensing. 1010696SDavid.Hollister@Sun.COM * See the License for the specific language governing permissions 1110696SDavid.Hollister@Sun.COM * and limitations under the License. 1210696SDavid.Hollister@Sun.COM * 1310696SDavid.Hollister@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1410696SDavid.Hollister@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1510696SDavid.Hollister@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1610696SDavid.Hollister@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1710696SDavid.Hollister@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1810696SDavid.Hollister@Sun.COM * 1910696SDavid.Hollister@Sun.COM * CDDL HEADER END 2010696SDavid.Hollister@Sun.COM * 2112258Ssrikanth.suravajhala@oracle.com */ 2212258Ssrikanth.suravajhala@oracle.com /* 2312258Ssrikanth.suravajhala@oracle.com * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 2410696SDavid.Hollister@Sun.COM */ 2510696SDavid.Hollister@Sun.COM /* 2610696SDavid.Hollister@Sun.COM * PMC 8x6G IOMB Definitions 2710696SDavid.Hollister@Sun.COM */ 2810696SDavid.Hollister@Sun.COM #ifndef _PMCS_IOMB_H 2910696SDavid.Hollister@Sun.COM #define _PMCS_IOMB_H 3010696SDavid.Hollister@Sun.COM #ifdef __cplusplus 3110696SDavid.Hollister@Sun.COM extern "C" { 3210696SDavid.Hollister@Sun.COM #endif 3310696SDavid.Hollister@Sun.COM 3410696SDavid.Hollister@Sun.COM /* 3510696SDavid.Hollister@Sun.COM * An IOMB (IO Message Buffer) is the principle means of communication 3610696SDavid.Hollister@Sun.COM * between the PMC and the HOST. The host places IOMBs on the Inbound 3710696SDavid.Hollister@Sun.COM * Queues (IQ) which are in HOST memory and updates a producer index 3810696SDavid.Hollister@Sun.COM * within the PMC. The PMC pulls the IOMB off the IQ and updates a 3910696SDavid.Hollister@Sun.COM * consumer index in HOST memory. If appropriate, when the PMC is 4010696SDavid.Hollister@Sun.COM * done with the action requested by the IOMB, the PMC writes a 4110696SDavid.Hollister@Sun.COM * reply IOMB to host memory and updates its producer index and 4210696SDavid.Hollister@Sun.COM * interrupts the HOST. 4310696SDavid.Hollister@Sun.COM */ 4410696SDavid.Hollister@Sun.COM /* 4510696SDavid.Hollister@Sun.COM * The first word of all IOMBs is always laid out thusly: 4610696SDavid.Hollister@Sun.COM * 4710696SDavid.Hollister@Sun.COM * |Byte 3 |Byte 2 |Byte 1 |Byte 0 | 4810696SDavid.Hollister@Sun.COM * +-------------+-------------+----------------------+ 4910696SDavid.Hollister@Sun.COM * |V Resvd BC|Resvd OBID |CAT | OPCODE | 5010696SDavid.Hollister@Sun.COM * +--------------------------------------------------+ 5110696SDavid.Hollister@Sun.COM * 5210696SDavid.Hollister@Sun.COM * V == Valid 5310696SDavid.Hollister@Sun.COM * BC = Buffer Count 5410696SDavid.Hollister@Sun.COM * OBID = Outbound Queue ID 5510696SDavid.Hollister@Sun.COM * CAT = Category 5610696SDavid.Hollister@Sun.COM * OPCODE = Well, uh, OPCODE. 5710696SDavid.Hollister@Sun.COM */ 5810696SDavid.Hollister@Sun.COM 5910696SDavid.Hollister@Sun.COM #define PMCS_IOMB_VALID (1U << 31) 6010696SDavid.Hollister@Sun.COM #define PMCS_IOMB_HIPRI (1U << 30) 6110696SDavid.Hollister@Sun.COM #define PMCS_IOMB_BC_SHIFT (24) 6210696SDavid.Hollister@Sun.COM #define PMCS_IOMB_BC_MASK (0xf << PMCS_IOMB_BC_SHIFT) 6310696SDavid.Hollister@Sun.COM #define PMCS_IOMB_OBID_SHIFT (16) 6410696SDavid.Hollister@Sun.COM #define PMCS_IOMB_OBID_MASK (0xf << PMCS_IOMB_OBID_SHIFT) 6510696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_SHIFT (12) 6610696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_MASK (0xf << PMCS_IOMB_CAT_SHIFT) 6710696SDavid.Hollister@Sun.COM #define PMCS_IOMB_OPCODE_MASK (0xfff) 6810696SDavid.Hollister@Sun.COM 6910696SDavid.Hollister@Sun.COM 7010696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_NET 0 7110696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_FC 1 7210696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_SAS 2 7310696SDavid.Hollister@Sun.COM #define PMCS_IOMB_CAT_SCSI 3 7410696SDavid.Hollister@Sun.COM 7510696SDavid.Hollister@Sun.COM /* 7610696SDavid.Hollister@Sun.COM * Shorthand 7710696SDavid.Hollister@Sun.COM */ 7810696SDavid.Hollister@Sun.COM #define PMCS_IOMB_IN_SAS(q, opcode) \ 7910696SDavid.Hollister@Sun.COM (PMCS_IOMB_VALID | (1 << PMCS_IOMB_BC_SHIFT) | \ 8010696SDavid.Hollister@Sun.COM (PMCS_IOMB_CAT_SAS << PMCS_IOMB_CAT_SHIFT) | \ 8110696SDavid.Hollister@Sun.COM ((q << PMCS_IOMB_OBID_SHIFT) & PMCS_IOMB_OBID_MASK) | \ 8210696SDavid.Hollister@Sun.COM (opcode & PMCS_IOMB_OPCODE_MASK)) 8310696SDavid.Hollister@Sun.COM 8410696SDavid.Hollister@Sun.COM /* 8510696SDavid.Hollister@Sun.COM * PMC IOMB Inbound Queue Opcodes 8610696SDavid.Hollister@Sun.COM */ 8710696SDavid.Hollister@Sun.COM #define PMCIN_ECHO 0x01 8810696SDavid.Hollister@Sun.COM #define PMCIN_GET_INFO 0x02 8910696SDavid.Hollister@Sun.COM #define PMCIN_GET_VPD 0x03 9010696SDavid.Hollister@Sun.COM #define PMCIN_PHY_START 0x04 9110696SDavid.Hollister@Sun.COM #define PMCIN_PHY_STOP 0x05 9210696SDavid.Hollister@Sun.COM #define PMCIN_SSP_INI_IO_START 0x06 9310696SDavid.Hollister@Sun.COM #define PMCIN_SSP_INI_TM_START 0x07 9410696SDavid.Hollister@Sun.COM #define PMCIN_SSP_INI_EXT_IO_START 0x08 9510696SDavid.Hollister@Sun.COM #define PMCIN_DEVICE_HANDLE_ACCEPT 0x09 9610696SDavid.Hollister@Sun.COM #define PMCIN_SSP_TGT_IO_START 0x0A 9710696SDavid.Hollister@Sun.COM #define PMCIN_SSP_TGT_RESPONSE_START 0x0B 9810696SDavid.Hollister@Sun.COM #define PMCIN_SSP_INI_EDC_EXT_IO_START 0x0C 9910696SDavid.Hollister@Sun.COM #define PMCIN_SSP_INI_EDC_EXT_IO_START1 0x0D 10010696SDavid.Hollister@Sun.COM #define PMCIN_SSP_TGT_EDC_IO_START 0x0E 10110696SDavid.Hollister@Sun.COM #define PMCIN_SSP_ABORT 0x0F 10210696SDavid.Hollister@Sun.COM #define PMCIN_DEREGISTER_DEVICE_HANDLE 0x10 10310696SDavid.Hollister@Sun.COM #define PMCIN_GET_DEVICE_HANDLE 0x11 10410696SDavid.Hollister@Sun.COM #define PMCIN_SMP_REQUEST 0x12 10510696SDavid.Hollister@Sun.COM #define PMCIN_SMP_RESPONSE 0x13 10610696SDavid.Hollister@Sun.COM #define PMCIN_SMP_ABORT 0x14 10710696SDavid.Hollister@Sun.COM #define PMCIN_ASSISTED_DISCOVERY 0x15 10810696SDavid.Hollister@Sun.COM #define PMCIN_REGISTER_DEVICE 0x16 10910696SDavid.Hollister@Sun.COM #define PMCIN_SATA_HOST_IO_START 0x17 11010696SDavid.Hollister@Sun.COM #define PMCIN_SATA_ABORT 0x18 11110696SDavid.Hollister@Sun.COM #define PMCIN_LOCAL_PHY_CONTROL 0x19 11210696SDavid.Hollister@Sun.COM #define PMCIN_GET_DEVICE_INFO 0x1A 11310696SDavid.Hollister@Sun.COM #define PMCIN_TWI 0x1B 11410696SDavid.Hollister@Sun.COM #define PMCIN_FW_FLASH_UPDATE 0x20 11510696SDavid.Hollister@Sun.COM #define PMCIN_SET_VPD 0x21 11610696SDavid.Hollister@Sun.COM #define PMCIN_GPIO 0x22 11710696SDavid.Hollister@Sun.COM #define PMCIN_SAS_DIAG_MODE_START_END 0x23 11810696SDavid.Hollister@Sun.COM #define PMCIN_SAS_DIAG_EXECUTE 0x24 11912258Ssrikanth.suravajhala@oracle.com #define PMCIN_SAS_HW_EVENT_ACK 0x25 12010696SDavid.Hollister@Sun.COM #define PMCIN_GET_TIME_STAMP 0x26 12110696SDavid.Hollister@Sun.COM #define PMCIN_PORT_CONTROL 0x27 12210696SDavid.Hollister@Sun.COM #define PMCIN_GET_NVMD_DATA 0x28 12310696SDavid.Hollister@Sun.COM #define PMCIN_SET_NVMD_DATA 0x29 12410696SDavid.Hollister@Sun.COM #define PMCIN_SET_DEVICE_STATE 0x2A 12510696SDavid.Hollister@Sun.COM #define PMCIN_GET_DEVICE_STATE 0x2B 12610696SDavid.Hollister@Sun.COM 12710696SDavid.Hollister@Sun.COM /* 12810696SDavid.Hollister@Sun.COM * General Inbound Queue related parameters (DWORD 4) 12910696SDavid.Hollister@Sun.COM */ 13010696SDavid.Hollister@Sun.COM #define PMCIN_MESSAGE_REPORT (1 << 2) 13110696SDavid.Hollister@Sun.COM #define PMCIN_DS_ABORT_TASK (1 << 3) 13210696SDavid.Hollister@Sun.COM #define PMCIN_DS_IN_RECOVERY (1 << 4) 13310696SDavid.Hollister@Sun.COM #define PMCIN_DATADIR_NONE (0x00 << 8) 13410696SDavid.Hollister@Sun.COM #define PMCIN_DATADIR_2_INI (0x01 << 8) 13510696SDavid.Hollister@Sun.COM #define PMCIN_DATADIR_2_DEV (0x02 << 8) 13610696SDavid.Hollister@Sun.COM 13710696SDavid.Hollister@Sun.COM 13810696SDavid.Hollister@Sun.COM /* 13910696SDavid.Hollister@Sun.COM * SATA Host IO Start ATA Protocol Types 14010696SDavid.Hollister@Sun.COM * (placed into DWORD 4) 14110696SDavid.Hollister@Sun.COM */ 14210696SDavid.Hollister@Sun.COM 14310696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_SRST_ASSERT (0x01 << 10) 14410696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_SRT_DEASSERT (0x02 << 10) 14510696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_EXECDEVDIAG (0x03 << 10) 14610696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_NONDATA (0x04 << 10) 14710696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_PIO (0x05 << 10) 14810696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_DMA (0x06 << 10) 14910696SDavid.Hollister@Sun.COM #define SATA_PROTOCOL_FPDMA (0x07 << 10) 15010696SDavid.Hollister@Sun.COM 15110696SDavid.Hollister@Sun.COM /* 15210696SDavid.Hollister@Sun.COM * SAS Host IO Start TLR definitions 15310696SDavid.Hollister@Sun.COM * (placed into DWORD 4) 15410696SDavid.Hollister@Sun.COM */ 15510696SDavid.Hollister@Sun.COM #define SAS_TLR_ALL 0 /* SAS 1.1 and SAS 2.0 per device mode page */ 15610696SDavid.Hollister@Sun.COM #define SAS_TLR_ON 1 /* unconditionally on */ 15710696SDavid.Hollister@Sun.COM #define SAS_TLR_OFF 2 /* unconditionally off */ 15810696SDavid.Hollister@Sun.COM #define SAS_TLR_SAS2 3 /* SAS 2.0 per device mode page */ 15910696SDavid.Hollister@Sun.COM 16010696SDavid.Hollister@Sun.COM /* 16110696SDavid.Hollister@Sun.COM * IOP SMP Request Information 16210696SDavid.Hollister@Sun.COM */ 16310696SDavid.Hollister@Sun.COM #define SMP_INDIRECT_RESPONSE 0x01 16410696SDavid.Hollister@Sun.COM #define SMP_INDIRECT_REQUEST 0x02 16510696SDavid.Hollister@Sun.COM #define SMP_PHY_OVERRIDE 0x04 16610696SDavid.Hollister@Sun.COM #define SMP_REQUEST_LENGTH_SHIFT 16 16710696SDavid.Hollister@Sun.COM 16810696SDavid.Hollister@Sun.COM /* 16910696SDavid.Hollister@Sun.COM * PHY Start related definitions 17010696SDavid.Hollister@Sun.COM */ 17110696SDavid.Hollister@Sun.COM #define PHY_LINK_1_5 0x01 17210696SDavid.Hollister@Sun.COM #define PHY_LINK_3 0x02 17310696SDavid.Hollister@Sun.COM #define PHY_LINK_6 0x04 17410696SDavid.Hollister@Sun.COM #define PHY_LINK_ALL (PHY_LINK_1_5 | PHY_LINK_3 | PHY_LINK_6) 17510696SDavid.Hollister@Sun.COM #define PHY_LINK_SHIFT 8 17610696SDavid.Hollister@Sun.COM 17710696SDavid.Hollister@Sun.COM #define PHY_LM_SAS 1 17810696SDavid.Hollister@Sun.COM #define PHY_LM_SATA 2 17910696SDavid.Hollister@Sun.COM #define PHY_LM_AUTO 3 18010696SDavid.Hollister@Sun.COM #define PHY_MODE_SHIFT 12 18110696SDavid.Hollister@Sun.COM 18210696SDavid.Hollister@Sun.COM #define PHY_SPINUP_HOLD (1 << 14) 18310696SDavid.Hollister@Sun.COM 18410696SDavid.Hollister@Sun.COM /* 18510696SDavid.Hollister@Sun.COM * LOCAL PHY CONTROL related definitions 18610696SDavid.Hollister@Sun.COM */ 18710696SDavid.Hollister@Sun.COM 18810696SDavid.Hollister@Sun.COM /* 18910696SDavid.Hollister@Sun.COM * Device Registration related definitions 19010696SDavid.Hollister@Sun.COM */ 19110696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_LINK_RATE_SHIFT 24 19210696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_TYPE_SATA 0 19310696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_TYPE_SAS (1 << 28) 19410696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_TYPE_SATA_DIRECT (1 << 29) 19510696SDavid.Hollister@Sun.COM 19610696SDavid.Hollister@Sun.COM #define PMCS_PHYID_SHIFT 4 /* level 0 registration only */ 19710696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_TLR 0x1 /* Transport Layer Retry */ 19810696SDavid.Hollister@Sun.COM 19911980SDavid.Hollister@Sun.COM #define PMCS_DEVREG_IT_NEXUS_TIMEOUT 2000U 20010696SDavid.Hollister@Sun.COM 20110696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_HA 0x2 /* Host Assigned upper 16 */ 20210696SDavid.Hollister@Sun.COM /* bits for device ID. */ 20310696SDavid.Hollister@Sun.COM /* 20410696SDavid.Hollister@Sun.COM * These are used for getting/setting data in the NVRAM (SEEPROM, VPD, etc.) 20510696SDavid.Hollister@Sun.COM */ 20610696SDavid.Hollister@Sun.COM 20710696SDavid.Hollister@Sun.COM typedef struct pmcs_get_nvmd_cmd_s { 20810696SDavid.Hollister@Sun.COM uint32_t header; /* DWORD 0 */ 20910696SDavid.Hollister@Sun.COM uint32_t htag; /* DWORD 1 */ 21010696SDavid.Hollister@Sun.COM uint8_t tdas_nvmd; /* DWORD 2 */ 21110696SDavid.Hollister@Sun.COM uint8_t tbn_tdps; 21210696SDavid.Hollister@Sun.COM uint8_t tda; 21310696SDavid.Hollister@Sun.COM uint8_t ip; 21410696SDavid.Hollister@Sun.COM uint8_t doa[3]; /* DWORD 3 Data Offset Addr */ 21510696SDavid.Hollister@Sun.COM uint8_t d_len; /* Direct Pld Data Len */ 21610696SDavid.Hollister@Sun.COM uint32_t rsvd[8]; /* DWORDS 4-11 */ 21710696SDavid.Hollister@Sun.COM uint32_t ipbal; /* 12 - Ind Pld buf addr low */ 21810696SDavid.Hollister@Sun.COM uint32_t ipbah; /* 13 - Ind Pld buf addr high */ 21910696SDavid.Hollister@Sun.COM uint32_t ipdl; /* 14 - Ind Pld data length */ 22010696SDavid.Hollister@Sun.COM uint32_t rsvd3; 22110696SDavid.Hollister@Sun.COM } pmcs_get_nvmd_cmd_t; 22210696SDavid.Hollister@Sun.COM 22310696SDavid.Hollister@Sun.COM typedef struct pmcs_set_nvmd_cmd_s { 22410696SDavid.Hollister@Sun.COM uint32_t header; /* DWORD 0 */ 22510696SDavid.Hollister@Sun.COM uint32_t htag; /* DWORD 1 */ 22610696SDavid.Hollister@Sun.COM uint8_t tdas_nvmd; /* DWORD 2 */ 22710696SDavid.Hollister@Sun.COM uint8_t tbn_tdps; 22810696SDavid.Hollister@Sun.COM uint8_t tda; 22910696SDavid.Hollister@Sun.COM uint8_t ip; 23010696SDavid.Hollister@Sun.COM uint8_t doa[3]; /* DWORD 3 Data Offset Addr */ 23110696SDavid.Hollister@Sun.COM uint8_t d_len; /* Direct Pld Data Len */ 23210696SDavid.Hollister@Sun.COM uint32_t signature; /* DWORD 4 */ 23310696SDavid.Hollister@Sun.COM uint32_t rsvd[7]; /* DWORDS 5-11 */ 23410696SDavid.Hollister@Sun.COM uint32_t ipbal; /* 12 - Ind Pld buf addr low */ 23510696SDavid.Hollister@Sun.COM uint32_t ipbah; /* 13 - Ind Pld buf addr high */ 23610696SDavid.Hollister@Sun.COM uint32_t ipdl; /* 14 - Ind Pld data length */ 23710696SDavid.Hollister@Sun.COM uint32_t rsvd2; 23810696SDavid.Hollister@Sun.COM } pmcs_set_nvmd_cmd_t; 23910696SDavid.Hollister@Sun.COM 24010696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_DIRECT_PLD 0x00 24110696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_INDIRECT_PLD 0x80 24210696SDavid.Hollister@Sun.COM 24310696SDavid.Hollister@Sun.COM /* TWI bus number is upper 4 bits of tbn_tdps */ 24410696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TBN(x) (x << 4) 24510696SDavid.Hollister@Sun.COM 24610696SDavid.Hollister@Sun.COM /* TWI Device Page Size bits (lower 4 bits of tbn_tdps */ 24710696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDPS_1 0 /* 1 byte */ 24810696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDPS_8 1 /* 8 bytes */ 24910696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDPS_16 2 /* 16 bytes */ 25010696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDPS_32 3 /* 32 bytes */ 25110696SDavid.Hollister@Sun.COM 25210696SDavid.Hollister@Sun.COM /* TWI Device Address Size (upper 4 bits of tdas_nvmd) */ 25310696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDAS_1 (0 << 4) /* 1 byte */ 25410696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TDAS_2 (1 << 4) /* 2 bytes */ 25510696SDavid.Hollister@Sun.COM 25610696SDavid.Hollister@Sun.COM /* 25710696SDavid.Hollister@Sun.COM * TWI Device Address 25810696SDavid.Hollister@Sun.COM * The address used to access TWI device for the 2Kb SEEPROM device is 25910696SDavid.Hollister@Sun.COM * arranged as follows: 26010696SDavid.Hollister@Sun.COM * Bits 7-4 are fixed (0xA) 26110696SDavid.Hollister@Sun.COM * Bits 3-1 are page numbers for each 256 byte page 26210696SDavid.Hollister@Sun.COM * Bit 0: Set to "1" to read, "0" to write 26310696SDavid.Hollister@Sun.COM * Bit 0 is set/reset by the firmware based on whether the command is a 26410696SDavid.Hollister@Sun.COM * SET or a GET. 26510696SDavid.Hollister@Sun.COM */ 26610696SDavid.Hollister@Sun.COM #define PMCIN_TDA_BASE 0xA0 26710696SDavid.Hollister@Sun.COM #define PMCIN_TDA_PAGE(x) (PMCIN_TDA_BASE | (x << 1)) 26810696SDavid.Hollister@Sun.COM 26910696SDavid.Hollister@Sun.COM /* NVM Device bits (lower 4 bits of tdas_nvmd) */ 27010696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_TWI 0 /* TWI Device */ 27110696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_SEEPROM 1 /* SEEPROM Device */ 27210696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_VPD 4 /* VPD Flash Memory */ 27310696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_AAP1 5 /* AAP1 Register Dump */ 27410696SDavid.Hollister@Sun.COM #define PMCIN_NVMD_IOP 6 /* IOP Register Dump */ 27510696SDavid.Hollister@Sun.COM 27610696SDavid.Hollister@Sun.COM #define PMCS_SEEPROM_PAGE_SIZE 256 27710696SDavid.Hollister@Sun.COM 27810696SDavid.Hollister@Sun.COM /* 27910696SDavid.Hollister@Sun.COM * Minimum and maximum sizes of SPCBoot image 28010696SDavid.Hollister@Sun.COM */ 28110696SDavid.Hollister@Sun.COM #define PMCS_SPCBOOT_MIN_SIZE 64 28210696SDavid.Hollister@Sun.COM #define PMCS_SPCBOOT_MAX_SIZE 512 28310696SDavid.Hollister@Sun.COM 28410696SDavid.Hollister@Sun.COM #define PMCS_SEEPROM_SIGNATURE 0xFEDCBA98 28510696SDavid.Hollister@Sun.COM 28610696SDavid.Hollister@Sun.COM /* 28710696SDavid.Hollister@Sun.COM * Register dump information 28810696SDavid.Hollister@Sun.COM * 28910696SDavid.Hollister@Sun.COM * There are two 16KB regions for register dump information 29010696SDavid.Hollister@Sun.COM */ 29110696SDavid.Hollister@Sun.COM 29210696SDavid.Hollister@Sun.COM #define PMCS_REGISTER_DUMP_FLASH_SIZE (1024 * 16) 29310696SDavid.Hollister@Sun.COM #define PMCS_REGISTER_DUMP_BLOCK_SIZE 4096 /* Must be read 4K at a time */ 29410696SDavid.Hollister@Sun.COM #define PMCS_FLASH_CHUNK_SIZE 4096 /* Must be read 4K at a time */ 29510696SDavid.Hollister@Sun.COM #define PMCS_REG_DUMP_SIZE (1024 * 1024 * 12) 29610696SDavid.Hollister@Sun.COM #define PMCS_NVMD_EVENT_LOG_OFFSET 0x10000 29710696SDavid.Hollister@Sun.COM #define PMCS_IQP_TRACE_BUFFER_SIZE (1024 * 512) 29810696SDavid.Hollister@Sun.COM 29910696SDavid.Hollister@Sun.COM /* 30010696SDavid.Hollister@Sun.COM * The list of items we can retrieve via the GET_NVMD_DATA command 30110696SDavid.Hollister@Sun.COM */ 30210696SDavid.Hollister@Sun.COM 30310696SDavid.Hollister@Sun.COM typedef enum { 30410696SDavid.Hollister@Sun.COM PMCS_NVMD_VPD = 0, 30510696SDavid.Hollister@Sun.COM PMCS_NVMD_REG_DUMP, 30610696SDavid.Hollister@Sun.COM PMCS_NVMD_EVENT_LOG, 30710696SDavid.Hollister@Sun.COM PMCS_NVMD_SPCBOOT 30810696SDavid.Hollister@Sun.COM } pmcs_nvmd_type_t; 30910696SDavid.Hollister@Sun.COM 31010696SDavid.Hollister@Sun.COM /* 31110696SDavid.Hollister@Sun.COM * Command types, descriptors and offsets for SAS_DIAG_EXECUTE. 31210696SDavid.Hollister@Sun.COM */ 31310696SDavid.Hollister@Sun.COM #define PMCS_DIAG_CMD_DESC_SHIFT 8 31410696SDavid.Hollister@Sun.COM #define PMCS_DIAG_CMD_SHIFT 13 31510696SDavid.Hollister@Sun.COM #define PMCS_DIAG_REPORT_GET 0x04 /* Get counters */ 31610696SDavid.Hollister@Sun.COM #define PMCS_ERR_CNT_RESET 0x05 /* Clear counters */ 31710696SDavid.Hollister@Sun.COM #define PMCS_DISPARITY_ERR_CNT 0x02 /* Disparity error count */ 31810696SDavid.Hollister@Sun.COM #define PMCS_LOST_DWORD_SYNC_CNT 0x05 /* Lost DWord sync count */ 31910696SDavid.Hollister@Sun.COM #define PMCS_INVALID_DWORD_CNT 0x06 /* Invalid DWord count */ 32010696SDavid.Hollister@Sun.COM #define PMCS_RESET_FAILED_CNT 0x0C /* PHY reset failed count */ 32110696SDavid.Hollister@Sun.COM 32210696SDavid.Hollister@Sun.COM /* 32310696SDavid.Hollister@Sun.COM * VPD data layout 32410696SDavid.Hollister@Sun.COM */ 32510696SDavid.Hollister@Sun.COM 326*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_INT_VERSION 1 /* supported version for Thebe INT */ 327*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_EXT_VERSION 2 /* supported version for Thebe EXT */ 32810696SDavid.Hollister@Sun.COM #define PMCS_VPD_DATA_PAGE 2 /* VPD starts at offset 512 */ 32910696SDavid.Hollister@Sun.COM #define PMCS_VPD_RO_BYTE 0x90 /* Start of "read-only" data */ 33010696SDavid.Hollister@Sun.COM #define PMCS_VPD_START 0x82 /* VPD start byte */ 33110696SDavid.Hollister@Sun.COM #define PMCS_VPD_END 0x78 /* VPD end byte */ 33210696SDavid.Hollister@Sun.COM 333*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_INT_SSID_BYTE1 0x02 /* Byte 1 of Thebe INT SSID */ 334*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_INT_SSID_BYTE2 0x02 /* Byte 2 of Thebe INT SSID */ 335*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_EXT_SSID_BYTE1 0x00 /* Byte 1 of Thebe EXT SSID */ 336*12698Ssrikanth.suravajhala@oracle.com #define PMCS_EEPROM_EXT_SSID_BYTE2 0x22 /* Byte 2 of Thebe EXT SSID */ 337*12698Ssrikanth.suravajhala@oracle.com 33810696SDavid.Hollister@Sun.COM /* 33910696SDavid.Hollister@Sun.COM * This structure defines the "header" for the VPD data. Everything 34010696SDavid.Hollister@Sun.COM * following this structure is self-defining. The consumer just needs 34110696SDavid.Hollister@Sun.COM * to allocate a buffer large enough for vpd_length + 3 bytes of data. 34210696SDavid.Hollister@Sun.COM */ 34310696SDavid.Hollister@Sun.COM 34410696SDavid.Hollister@Sun.COM typedef struct { 34510696SDavid.Hollister@Sun.COM uint8_t eeprom_version; 34610696SDavid.Hollister@Sun.COM uint8_t vpd_length[2]; /* # bytes that follow, little-endian */ 34710696SDavid.Hollister@Sun.COM uint8_t hba_sas_wwid[8]; 34810696SDavid.Hollister@Sun.COM uint8_t subsys_pid[2]; 34910696SDavid.Hollister@Sun.COM uint8_t subsys_vid[2]; 35010696SDavid.Hollister@Sun.COM uint8_t vpd_start_byte; /* 0x82 */ 35110696SDavid.Hollister@Sun.COM uint8_t strid_length[2]; /* little-endian */ 35210696SDavid.Hollister@Sun.COM /* strid_length bytes follow */ 35310696SDavid.Hollister@Sun.COM } pmcs_vpd_header_t; 35410696SDavid.Hollister@Sun.COM 35510696SDavid.Hollister@Sun.COM typedef struct { 35610696SDavid.Hollister@Sun.COM char keyword[2]; 35710696SDavid.Hollister@Sun.COM uint8_t value_length; 35810696SDavid.Hollister@Sun.COM char value[1]; /* Length is actually value_length */ 35910696SDavid.Hollister@Sun.COM } pmcs_vpd_kv_t; 36010696SDavid.Hollister@Sun.COM 36110696SDavid.Hollister@Sun.COM /* 36210696SDavid.Hollister@Sun.COM * From here on out are definitions related to Outbound Queues 36310696SDavid.Hollister@Sun.COM * (completions of Inbound Queue requests and async events) 36410696SDavid.Hollister@Sun.COM */ 36510696SDavid.Hollister@Sun.COM 36610696SDavid.Hollister@Sun.COM /* 36710696SDavid.Hollister@Sun.COM * PMC IOMB Outbound Queue Opcodes 36810696SDavid.Hollister@Sun.COM */ 36910696SDavid.Hollister@Sun.COM #define PMCOUT_ECHO 0x01 37010696SDavid.Hollister@Sun.COM #define PMCOUT_GET_INFO 0x02 37110696SDavid.Hollister@Sun.COM #define PMCOUT_GET_VPD 0x03 37210696SDavid.Hollister@Sun.COM #define PMCOUT_SAS_HW_EVENT 0x04 37310696SDavid.Hollister@Sun.COM #define PMCOUT_SSP_COMPLETION 0x05 37410696SDavid.Hollister@Sun.COM #define PMCOUT_SMP_COMPLETION 0x06 37510696SDavid.Hollister@Sun.COM #define PMCOUT_LOCAL_PHY_CONTROL 0x07 37610696SDavid.Hollister@Sun.COM #define PMCOUT_SAS_ASSISTED_DISCOVERY_EVENT 0x08 37710696SDavid.Hollister@Sun.COM #define PMCOUT_SATA_ASSISTED_DISCOVERY_EVENT 0x09 37810696SDavid.Hollister@Sun.COM #define PMCOUT_DEVICE_REGISTRATION 0x0A 37910696SDavid.Hollister@Sun.COM #define PMCOUT_DEREGISTER_DEVICE_HANDLE 0x0B 38010696SDavid.Hollister@Sun.COM #define PMCOUT_GET_DEVICE_HANDLE 0x0C 38110696SDavid.Hollister@Sun.COM #define PMCOUT_SATA_COMPLETION 0x0D 38210696SDavid.Hollister@Sun.COM #define PMCOUT_SATA_EVENT 0x0E 38310696SDavid.Hollister@Sun.COM #define PMCOUT_SSP_EVENT 0x0F 38410696SDavid.Hollister@Sun.COM #define PMCOUT_DEVICE_HANDLE_ARRIVED 0x10 38510696SDavid.Hollister@Sun.COM #define PMCOUT_SSP_REQUEST_RECEIVED 0x12 38610696SDavid.Hollister@Sun.COM #define PMCOUT_DEVICE_INFO 0x13 38710696SDavid.Hollister@Sun.COM #define PMCOUT_FW_FLASH_UPDATE 0x14 38810696SDavid.Hollister@Sun.COM #define PMCOUT_SET_VPD 0x15 38910696SDavid.Hollister@Sun.COM #define PMCOUT_GPIO 0x16 39010696SDavid.Hollister@Sun.COM #define PMCOUT_GPIO_EVENT 0x17 39110696SDavid.Hollister@Sun.COM #define PMCOUT_GENERAL_EVENT 0x18 39210696SDavid.Hollister@Sun.COM #define PMCOUT_TWI 0x19 39310696SDavid.Hollister@Sun.COM #define PMCOUT_SSP_ABORT 0x1A 39410696SDavid.Hollister@Sun.COM #define PMCOUT_SATA_ABORT 0x1B 39510696SDavid.Hollister@Sun.COM #define PMCOUT_SAS_DIAG_MODE_START_END 0x1C 39610696SDavid.Hollister@Sun.COM #define PMCOUT_SAS_DIAG_EXECUTE 0x1D 39710696SDavid.Hollister@Sun.COM #define PMCOUT_GET_TIME_STAMP 0x1E 39810696SDavid.Hollister@Sun.COM #define PMCOUT_SAS_HW_EVENT_ACK_ACK 0x1F 39910696SDavid.Hollister@Sun.COM #define PMCOUT_PORT_CONTROL 0x20 40010696SDavid.Hollister@Sun.COM #define PMCOUT_SKIP_ENTRIES 0x21 40110696SDavid.Hollister@Sun.COM #define PMCOUT_SMP_ABORT 0x22 40210696SDavid.Hollister@Sun.COM #define PMCOUT_GET_NVMD_DATA 0x23 40310696SDavid.Hollister@Sun.COM #define PMCOUT_SET_NVMD_DATA 0x24 40410696SDavid.Hollister@Sun.COM #define PMCOUT_DEVICE_HANDLE_REMOVED 0x25 40510696SDavid.Hollister@Sun.COM #define PMCOUT_SET_DEVICE_STATE 0x26 40610696SDavid.Hollister@Sun.COM #define PMCOUT_GET_DEVICE_STATE 0x27 40710696SDavid.Hollister@Sun.COM #define PMCOUT_SET_DEVICE_INFO 0x28 40810696SDavid.Hollister@Sun.COM 40910696SDavid.Hollister@Sun.COM /* 41010696SDavid.Hollister@Sun.COM * General Outbound Status Definitions 41110696SDavid.Hollister@Sun.COM */ 41210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OK 0x00 41310696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_ABORTED 0x01 41410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OVERFLOW 0x02 41510696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_UNDERFLOW 0x03 41610696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_FAILED 0x04 41710696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_ABORT_RESET 0x05 41810696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_NOT_VALID 0x06 41910696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_NO_DEVICE 0x07 42010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_ILLEGAL_PARAMETER 0x08 42110696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_LINK_FAILURE 0x09 42210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_PROG_ERROR 0x0A 42310696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_EDC_IN_ERROR 0x0B 42410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_EDC_OUT_ERROR 0x0C 42510696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_ERROR_HW_TIMEOUT 0x0D 42610696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERR_BREAK 0x0E 42710696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERR_PHY_NOT_READY 0x0F 42810696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_PROTOCOL_NOT_SUPPORTED 0x10 42910696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_ZONE_VIOLATION 0x11 43010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_BREAK 0x12 43110696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS 0x13 43210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPENCNX_ERROR_BAD_DESTINATION 0x14 43310696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED 0x15 43410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 0x16 43510696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_WRONG_DESTINATION 0x17 43611601SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_OPEN_CNX_ERROR_UNKNOWN_ERROR 0x18 43710696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_XFER_ERROR_NAK_RECEIVED 0x19 43810696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_ACK_NAK_TIMEOUT 0x1A 43910696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_PEER_ABORTED 0x1B 44010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_RX_FRAME 0x1C 44110696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_XFER_ERROR_DMA 0x1D 44210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_CREDIT_TIMEOUT 0x1E 44310696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_SATA_LINK_TIMEOUT 0x1F 44410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_SATA 0x20 44510696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_REJECTED_NCQ_MODE 0x21 44610696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_ABORTED_DUE_TO_SRST 0x22 44710696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_ABORTED_NCQ_MODE 0x23 44810696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_XFER_OPEN_RETRY_TIMEOUT 0x24 44910696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_SMP_RESP_CONNECTION_ERROR 0x25 45010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_UNEXPECTED_PHASE 0x26 45110696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_RDY_OVERRUN 0x27 45210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_RDY_NOT_EXPECTED 0x28 45310696SDavid.Hollister@Sun.COM /* 0x29 */ 45410696SDavid.Hollister@Sun.COM /* 0x2A */ 45510696SDavid.Hollister@Sun.COM /* 0x2B */ 45610696SDavid.Hollister@Sun.COM /* 0x2C */ 45710696SDavid.Hollister@Sun.COM /* 0x2D */ 45810696SDavid.Hollister@Sun.COM /* 0x2E */ 45910696SDavid.Hollister@Sun.COM /* 0x2F */ 46010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT 0x30 46110696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NACK 0x31 46210696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK 0x32 46310696SDavid.Hollister@Sun.COM /* 0x33 */ 46410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_OFFSET_MISMATCH 0x34 46510696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_ERROR_ZERO_DATA_LEN 0x35 46610696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_XFER_CMD_FRAME_ISSUED 0x36 46710696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_ERROR_INTERNAL_SMP_RESOURCE 0x37 46810696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_PORT_IN_RESET 0x38 46910696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_DS_NON_OPERATIONAL 0x39 47010696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_DS_IN_RECOVERY 0x3A 47111601SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_TM_TAG_NOT_FOUND 0x3B 47211601SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_SSP_EXT_IU_ZERO_LEN_ERROR 0x3D 47311601SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY 0x3F 47410696SDavid.Hollister@Sun.COM #define PMCOUT_STATUS_IO_ABORT_IN_PROGRESS 0x40 47510696SDavid.Hollister@Sun.COM 47610696SDavid.Hollister@Sun.COM /* 47711241SDavid.Hollister@Sun.COM * IOMB formats 47811241SDavid.Hollister@Sun.COM * 47911241SDavid.Hollister@Sun.COM * NOTE: All IOMBs are little-endian with exceptions to certain parts of 48011241SDavid.Hollister@Sun.COM * some IOMBs. For example, the SSP_RESPONSE_IU in the SSP_COMPLETION 48111241SDavid.Hollister@Sun.COM * outbound IOMB is big-endian (SAS). 48211241SDavid.Hollister@Sun.COM */ 48311241SDavid.Hollister@Sun.COM 48411241SDavid.Hollister@Sun.COM /* Common IOMB header */ 48511241SDavid.Hollister@Sun.COM 48611241SDavid.Hollister@Sun.COM typedef struct pmcs_iomb_header { 48711241SDavid.Hollister@Sun.COM uint8_t opcode_lo; 48811241SDavid.Hollister@Sun.COM DECL_BITFIELD2(opcode_hi: 4, 48911241SDavid.Hollister@Sun.COM cat : 4); 49011241SDavid.Hollister@Sun.COM DECL_BITFIELD2(obid : 6, 49111241SDavid.Hollister@Sun.COM rsvd1 : 2); 49211241SDavid.Hollister@Sun.COM DECL_BITFIELD4(buf_count: 5, 49311241SDavid.Hollister@Sun.COM rsvd2 : 1, 49411241SDavid.Hollister@Sun.COM h_bit : 1, 49511241SDavid.Hollister@Sun.COM v_bit : 1); 49611241SDavid.Hollister@Sun.COM } pmcs_iomb_header_t; 49711241SDavid.Hollister@Sun.COM 49811241SDavid.Hollister@Sun.COM /* PMCOUT_SSP_COMPLETION */ 49911241SDavid.Hollister@Sun.COM 50011241SDavid.Hollister@Sun.COM typedef struct pmcout_ssp_comp { 50111241SDavid.Hollister@Sun.COM pmcs_iomb_header_t header; 50211241SDavid.Hollister@Sun.COM uint32_t htag; 50311241SDavid.Hollister@Sun.COM uint32_t status; 50411241SDavid.Hollister@Sun.COM uint32_t param; 50511241SDavid.Hollister@Sun.COM uint16_t ssp_tag; 50611241SDavid.Hollister@Sun.COM DECL_BITFIELD3(resc_v : 1, 50711241SDavid.Hollister@Sun.COM resc_pad : 2, 50811241SDavid.Hollister@Sun.COM rsvd1 : 5); 50911241SDavid.Hollister@Sun.COM uint8_t rsvd2; 51011241SDavid.Hollister@Sun.COM /* SSP_RESPONSE_IU (if it exists) */ 51111241SDavid.Hollister@Sun.COM /* Residual count (if resc_v is set) */ 51211241SDavid.Hollister@Sun.COM } pmcout_ssp_comp_t; 51311241SDavid.Hollister@Sun.COM 51411241SDavid.Hollister@Sun.COM 51511241SDavid.Hollister@Sun.COM /* 51610696SDavid.Hollister@Sun.COM * Device State definitions 51710696SDavid.Hollister@Sun.COM */ 51811090SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_NOT_AVAILABLE 0x0 /* Unconfigured tgt */ 51910696SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_OPERATIONAL 0x1 52010696SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_PORT_IN_RESET 0x2 52110696SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_IN_RECOVERY 0x3 52210696SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_IN_ERROR 0x4 52310696SDavid.Hollister@Sun.COM #define PMCS_DEVICE_STATE_NON_OPERATIONAL 0x7 52410696SDavid.Hollister@Sun.COM 52510696SDavid.Hollister@Sun.COM /* 52610696SDavid.Hollister@Sun.COM * Reset Types 52710696SDavid.Hollister@Sun.COM */ 52810696SDavid.Hollister@Sun.COM #define PMCS_SSP_LINK_RESET 0x1 52910696SDavid.Hollister@Sun.COM #define PMCS_SSP_HARD_RESET 0x2 53010696SDavid.Hollister@Sun.COM #define PMCS_SMP_HARD_RESET 0x3 53110696SDavid.Hollister@Sun.COM 53210696SDavid.Hollister@Sun.COM /* 53310696SDavid.Hollister@Sun.COM * PHYOP for LOCAL_PHY_CONTROL Command 53410696SDavid.Hollister@Sun.COM */ 53510696SDavid.Hollister@Sun.COM #define PMCS_PHYOP_LINK_RESET 0x01 53610696SDavid.Hollister@Sun.COM #define PMCS_PHYOP_HARD_RESET 0x02 53710696SDavid.Hollister@Sun.COM 53810696SDavid.Hollister@Sun.COM /* 53910696SDavid.Hollister@Sun.COM * Specialized status values 54010696SDavid.Hollister@Sun.COM */ 54110696SDavid.Hollister@Sun.COM /* PHY Stop Status Results */ 54210696SDavid.Hollister@Sun.COM #define IOP_PHY_STOP_OK 0x0 54310696SDavid.Hollister@Sun.COM #define IOP_PHY_STOP_INVALID 0x1 54410696SDavid.Hollister@Sun.COM #define IOP_PHY_STOP_ERROR 0x3 54510696SDavid.Hollister@Sun.COM #define IOP_PHY_STOP_ALREADY 0x4 54610696SDavid.Hollister@Sun.COM 54710696SDavid.Hollister@Sun.COM /* PHY Start Status Results */ 54810696SDavid.Hollister@Sun.COM #define IOP_PHY_START_OK 0 54910696SDavid.Hollister@Sun.COM #define IOP_PHY_START_INVALID 1 55010696SDavid.Hollister@Sun.COM #define IOP_PHY_START_ALREADY 2 55110696SDavid.Hollister@Sun.COM #define IOP_PHY_START_ERROR 3 55210696SDavid.Hollister@Sun.COM 55310696SDavid.Hollister@Sun.COM /* SET/GET_NVMD status results */ 55410696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_SUCCESS 0x0000 55510696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PLD_NVMD_COMB_ERR 0x0001 55610696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PLD_LEN_ERR 0x0002 55710696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_DEV_NACK 0x2001 55810696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_DEV_LOST_ARB 0x2002 55910696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_TIMEOUT 0x2021 56010696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_BUS_NACK 0x2081 56110696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_DEV_ARB_FAIL 0x2082 56210696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_TWI_BUS_SER_TIMEO 0x20FF 56310696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PART_NOT_IN_FLASH 0x9001 56410696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_LEN_TOO_LARGE 0x9002 56510696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_FLASH_PRGRM_FAIL 0x9003 56610696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_DEVID_MATCH_FAIL 0x9004 56710696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_VENDID_MATCH_FAIL 0x9005 56810696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_SEC_ERASE_TIMEO 0x9006 56910696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_SEC_ERASE_CWE 0x9007 57010696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_FLASH_DEV_BUSY 0x9008 57110696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_FLASH_DEV_NOT_SUP 0x9009 57210696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_FLASH_NO_CFI 0x900A 57310696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_ERASE_BLOCKS 0x900B 57410696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PART_READ_ONLY 0x900C 57510696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PART_INV_MAP_TYPE 0x900D 57610696SDavid.Hollister@Sun.COM #define PMCS_NVMD_STAT_PART_INIT_STR_DIS 0x900E 57710696SDavid.Hollister@Sun.COM 57810696SDavid.Hollister@Sun.COM /* 57910696SDavid.Hollister@Sun.COM * General Event Status Codes 58010696SDavid.Hollister@Sun.COM */ 58110696SDavid.Hollister@Sun.COM #define INBOUND_IOMB_V_BIT_NOT_SET 0x1 58210696SDavid.Hollister@Sun.COM #define INBOUND_IOMB_OPC_NOT_SUPPORTED 0x2 58310696SDavid.Hollister@Sun.COM 58410696SDavid.Hollister@Sun.COM /* Device Register Status Results */ 58510696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_OK 0x0 58610696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_DEVICE_ALREADY_REGISTERED 0x2 58710696SDavid.Hollister@Sun.COM #define PMCS_DEVREG_PHY_ALREADY_REGISTERED 0x4 58810696SDavid.Hollister@Sun.COM 58910696SDavid.Hollister@Sun.COM /* 59010696SDavid.Hollister@Sun.COM * Flash Update responses 59110696SDavid.Hollister@Sun.COM */ 59210696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_COMPLETE_PENDING_REBOOT 0x0 59310696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_IN_PROGRESS 0x1 59410696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_HDR_ERR 0x2 59510696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_OFFSET_ERR 0x3 59610696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_UPDATE_CRC_ERR 0x4 59710696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_LENGTH_ERR 0x5 59810696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_HW_ERR 0x6 59910696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10 60010696SDavid.Hollister@Sun.COM #define FLASH_UPDATE_DISABLED 0x11 60110696SDavid.Hollister@Sun.COM 60210696SDavid.Hollister@Sun.COM /* 60310696SDavid.Hollister@Sun.COM * IOP SAS HW Event Related definitions 60410696SDavid.Hollister@Sun.COM */ 60510696SDavid.Hollister@Sun.COM 60610696SDavid.Hollister@Sun.COM #define IOP_EVENT_LINK_RATE(x) ((x >> 28) & 0xf) 60710696SDavid.Hollister@Sun.COM #define IOP_EVENT_STATUS(x) ((x >> 24) & 0xf) 60810696SDavid.Hollister@Sun.COM #define IOP_EVENT_EVENT(x) ((x >> 8) & 0xffff) 60910696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHYNUM(x) ((x >> 4) & 0xf) 61010696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORTID(x) ((x) & 0xf) 61110696SDavid.Hollister@Sun.COM 61210696SDavid.Hollister@Sun.COM 61310696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_STOP_STATUS 0x03 61410696SDavid.Hollister@Sun.COM #define IOP_EVENT_SAS_PHY_UP 0x04 61510696SDavid.Hollister@Sun.COM #define IOP_EVENT_SATA_PHY_UP 0x05 61610696SDavid.Hollister@Sun.COM #define IOP_EVENT_SATA_SPINUP_HOLD 0x06 61710696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_DOWN 0x07 61810696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_INVALID 0x08 /* < fw 1.6 */ 61910696SDavid.Hollister@Sun.COM #define IOP_EVENT_BROADCAST_CHANGE 0x09 62010696SDavid.Hollister@Sun.COM #define IOP_EVENT_BROADCAST_SES 0x0B 62110696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_INBOUND_CRC 0x0C 62210696SDavid.Hollister@Sun.COM #define IOP_EVENT_HARD_RESET_RECEIVED 0x0D 62310696SDavid.Hollister@Sun.COM #define IOP_EVENT_EVENT_ID_FRAME_TIMO 0x0F 62410696SDavid.Hollister@Sun.COM #define IOP_EVENT_BROADCAST_EXP 0x10 62510696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_START_STATUS 0x11 62610696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_INVALID_DWORD 0x12 62710696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_DISPARITY_ERROR 0x13 62810696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_CODE_VIOLATION 0x14 62910696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_LOSS_OF_DWORD_SYN 0x15 63010696SDavid.Hollister@Sun.COM #define IOP_EVENT_PHY_ERR_PHY_RESET_FAILD 0x16 63110696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_RECOVERY_TIMER_TMO 0x17 63210696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_RECOVER 0x18 63310696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_RESET_TIMER_TMO 0x19 63410696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_RESET_COMPLETE 0x20 63510696SDavid.Hollister@Sun.COM #define IOP_EVENT_BROADCAST_ASYNC_EVENT 0x21 63611601SDavid.Hollister@Sun.COM #define IOP_EVENT_IT_NEXUS_LOSS 0x22 63710696SDavid.Hollister@Sun.COM 63810696SDavid.Hollister@Sun.COM 63910696SDavid.Hollister@Sun.COM #define IOP_EVENT_PORT_STATE(x) ((x) & 0xf) 64010696SDavid.Hollister@Sun.COM #define IOP_EVENT_NPIP(x) (((x) >> 4) & 0xf) 64110696SDavid.Hollister@Sun.COM 64210696SDavid.Hollister@Sun.COM #define IOP_EVENT_PS_NIL 0x0 /* PORT_ID not valid yet */ 64310696SDavid.Hollister@Sun.COM #define IOP_EVENT_PS_VALID 0x1 /* PORT_ID now valid */ 64410696SDavid.Hollister@Sun.COM #define IOP_EVENT_PS_LOSTCOMM 0x2 /* Link temporarily down */ 64510696SDavid.Hollister@Sun.COM #define IOP_EVENT_PS_IN_RESET 0x4 /* Port in reset */ 64610696SDavid.Hollister@Sun.COM #define IOP_EVENT_PS_INVALID 0x8 /* PORT_ID now dead */ 64710696SDavid.Hollister@Sun.COM 64810696SDavid.Hollister@Sun.COM /* 64910696SDavid.Hollister@Sun.COM * HW Event Acknowledge Response Values 65010696SDavid.Hollister@Sun.COM */ 65110696SDavid.Hollister@Sun.COM #define SAS_HW_EVENT_ACK_OK 0x0 65210696SDavid.Hollister@Sun.COM #define SAS_HW_EVENT_ACK_INVALID_SEA 0x1 65310696SDavid.Hollister@Sun.COM #define SAS_HW_EVENT_ACK_INVALID_PHY 0x2 65410696SDavid.Hollister@Sun.COM #define SAS_HW_EVENT_ACK_INVALID_PORT 0x4 65510696SDavid.Hollister@Sun.COM #define SAS_HW_EVENT_ACK_INVALID_PARAM 0x8 65610696SDavid.Hollister@Sun.COM 65710696SDavid.Hollister@Sun.COM /* 65810696SDavid.Hollister@Sun.COM * IOMB Queue definitions and Macros 65910696SDavid.Hollister@Sun.COM */ 66010696SDavid.Hollister@Sun.COM 66110696SDavid.Hollister@Sun.COM #define ADDQI(ix, n, qd) ((ix + n) & (qd - 1)) 66210696SDavid.Hollister@Sun.COM #define INCQI(ix, qd) ix = ADDQI(ix, 1, qd) 66310696SDavid.Hollister@Sun.COM #define QI2O(ix, n, qd) (ADDQI(ix, n, qd) * PMCS_QENTRY_SIZE) 66410696SDavid.Hollister@Sun.COM 66510696SDavid.Hollister@Sun.COM /* 66610696SDavid.Hollister@Sun.COM * Inbound Queue Producer Indices live inside the PMC card. 66710696SDavid.Hollister@Sun.COM * 66810696SDavid.Hollister@Sun.COM * Inbound Queue Consumer indices live in host memory. We use the Consumer 66910696SDavid.Hollister@Sun.COM * Index to return a pointer to an Inbound Queue entry. We then can fill 67010696SDavid.Hollister@Sun.COM * it with an IOMB. We then update the the Producer index which kicks 67110696SDavid.Hollister@Sun.COM * card to read the IOMB we just wrote. 67210696SDavid.Hollister@Sun.COM * 67310696SDavid.Hollister@Sun.COM * There is one mutex for each inbound queue that is held from the time 67410696SDavid.Hollister@Sun.COM * we get an entry until we increment the producer index, or released 67510696SDavid.Hollister@Sun.COM * manually if we don't actually send the message. 67610696SDavid.Hollister@Sun.COM */ 67710696SDavid.Hollister@Sun.COM 67810696SDavid.Hollister@Sun.COM /* 67910696SDavid.Hollister@Sun.COM * NB: the appropriate iqp_lock must be held 68010696SDavid.Hollister@Sun.COM */ 68110696SDavid.Hollister@Sun.COM #define GET_IQ_ENTRY(hwp, qnum) \ 68210696SDavid.Hollister@Sun.COM ((ADDQI(hwp->shadow_iqpi[qnum], 1, hwp->ioq_depth) == \ 68310696SDavid.Hollister@Sun.COM pmcs_rd_iqci(hwp, qnum)) ? NULL : \ 68410696SDavid.Hollister@Sun.COM &hwp->iqp[qnum][hwp->shadow_iqpi[qnum] * (PMCS_QENTRY_SIZE >> 2)]) 68510696SDavid.Hollister@Sun.COM 68610696SDavid.Hollister@Sun.COM /* 68710696SDavid.Hollister@Sun.COM * NB: This releases the lock on the Inbound Queue that GET_IO_IQ_ENTRY 68810696SDavid.Hollister@Sun.COM * acquired below. 68910696SDavid.Hollister@Sun.COM */ 69010696SDavid.Hollister@Sun.COM #ifdef DEBUG 69110696SDavid.Hollister@Sun.COM #define INC_IQ_ENTRY(hwp, qnum) \ 69210696SDavid.Hollister@Sun.COM { \ 69310696SDavid.Hollister@Sun.COM uint32_t htag; \ 69410696SDavid.Hollister@Sun.COM ASSERT(mutex_owned(&(hwp)->iqp_lock[qnum])); \ 69510696SDavid.Hollister@Sun.COM htag = hwp->iqp[qnum][(hwp->shadow_iqpi[qnum] * \ 69610696SDavid.Hollister@Sun.COM (PMCS_QENTRY_SIZE >> 2)) + 1]; \ 69710696SDavid.Hollister@Sun.COM mutex_enter(&(hwp)->dbglock); \ 69810696SDavid.Hollister@Sun.COM pmcs_iqp_trace(hwp, qnum); \ 69910696SDavid.Hollister@Sun.COM mutex_exit(&(hwp)->dbglock); \ 70010696SDavid.Hollister@Sun.COM INCQI(hwp->shadow_iqpi[qnum], hwp->ioq_depth); \ 70110696SDavid.Hollister@Sun.COM if (ddi_dma_sync(hwp->cip_handles, 0, 0, \ 70210696SDavid.Hollister@Sun.COM DDI_DMA_SYNC_FORDEV) != DDI_SUCCESS) { \ 70311048SDavid.Hollister@Sun.COM pmcs_prt(hwp, PMCS_PRT_DEBUG, NULL, NULL, "Condition " \ 70411048SDavid.Hollister@Sun.COM "failed at %s():%d", __func__, __LINE__); \ 70510696SDavid.Hollister@Sun.COM } \ 70611048SDavid.Hollister@Sun.COM hwp->ftime[hwp->fti] = gethrtime(); \ 70710696SDavid.Hollister@Sun.COM pmcs_wr_iqpi(hwp, qnum, hwp->shadow_iqpi[qnum]); \ 70810696SDavid.Hollister@Sun.COM mutex_exit(&(hwp)->iqp_lock[qnum]); \ 70910696SDavid.Hollister@Sun.COM mutex_enter(&(hwp)->dbglock); \ 71010696SDavid.Hollister@Sun.COM hwp->ftag_lines[hwp->fti] = __LINE__; \ 71110696SDavid.Hollister@Sun.COM hwp->ftags[hwp->fti++] = htag; \ 71210696SDavid.Hollister@Sun.COM mutex_exit(&(hwp)->dbglock); \ 71310696SDavid.Hollister@Sun.COM } 71410696SDavid.Hollister@Sun.COM #else 71510696SDavid.Hollister@Sun.COM #define INC_IQ_ENTRY(hwp, qnum) \ 71610696SDavid.Hollister@Sun.COM INCQI(hwp->shadow_iqpi[qnum], hwp->ioq_depth); \ 71710696SDavid.Hollister@Sun.COM if (ddi_dma_sync(hwp->cip_handles, 0, 0, \ 71810696SDavid.Hollister@Sun.COM DDI_DMA_SYNC_FORDEV) != DDI_SUCCESS) { \ 71911048SDavid.Hollister@Sun.COM pmcs_prt(hwp, PMCS_PRT_DEBUG, NULL, NULL, "Condition " \ 72011048SDavid.Hollister@Sun.COM "failed at %s():%d", __func__, __LINE__); \ 72110696SDavid.Hollister@Sun.COM } \ 72210696SDavid.Hollister@Sun.COM pmcs_wr_iqpi(hwp, qnum, hwp->shadow_iqpi[qnum]); \ 72310696SDavid.Hollister@Sun.COM mutex_exit(&(hwp)->iqp_lock[qnum]) 72410696SDavid.Hollister@Sun.COM #endif 72510696SDavid.Hollister@Sun.COM 72610696SDavid.Hollister@Sun.COM 72710696SDavid.Hollister@Sun.COM /* 72810696SDavid.Hollister@Sun.COM * NB: sucessfull acquisition of an IO Inbound Queue 72910696SDavid.Hollister@Sun.COM * entry leaves the lock on that Inbound Queue held. 73010696SDavid.Hollister@Sun.COM */ 73110696SDavid.Hollister@Sun.COM #define GET_IO_IQ_ENTRY(pwp, msg, did, iq) \ 73210696SDavid.Hollister@Sun.COM iq = did & PMCS_IO_IQ_MASK; \ 73310696SDavid.Hollister@Sun.COM mutex_enter(&(pwp)->iqp_lock[iq]); \ 73410696SDavid.Hollister@Sun.COM msg = GET_IQ_ENTRY(pwp, iq); \ 73510696SDavid.Hollister@Sun.COM if (msg == NULL) { \ 73610696SDavid.Hollister@Sun.COM mutex_exit(&(pwp)->iqp_lock[iq]); \ 73710696SDavid.Hollister@Sun.COM for (iq = 0; iq <= PMCS_NON_HIPRI_QUEUES; iq++) { \ 73810696SDavid.Hollister@Sun.COM mutex_enter(&(pwp)->iqp_lock[iq]); \ 73910696SDavid.Hollister@Sun.COM msg = GET_IQ_ENTRY(pwp, iq); \ 74010696SDavid.Hollister@Sun.COM if (msg) { \ 74110696SDavid.Hollister@Sun.COM break; \ 74210696SDavid.Hollister@Sun.COM } \ 74310696SDavid.Hollister@Sun.COM mutex_exit(&(pwp->iqp_lock[iq])); \ 74410696SDavid.Hollister@Sun.COM } \ 74510696SDavid.Hollister@Sun.COM } 74610696SDavid.Hollister@Sun.COM 74710696SDavid.Hollister@Sun.COM /* 74810696SDavid.Hollister@Sun.COM * Outbound Queue Macros 74910696SDavid.Hollister@Sun.COM * 75010696SDavid.Hollister@Sun.COM * Outbound Queue Consumer indices live inside the card. 75110696SDavid.Hollister@Sun.COM * 75210696SDavid.Hollister@Sun.COM * Outbound Queue Producer indices live in host memory. When the card 75310696SDavid.Hollister@Sun.COM * wants to send an IOMB, it uses the producer index to find the spot 75410696SDavid.Hollister@Sun.COM * to write the IOMB. After it's done it updates the producer index 75510696SDavid.Hollister@Sun.COM * and interrupts the host. The host reads the producer index (from 75610696SDavid.Hollister@Sun.COM * host memory) and reads IOMBs up to but not including that index. 75710696SDavid.Hollister@Sun.COM * It writes that index back to the consumer index on the card, 75810696SDavid.Hollister@Sun.COM * signifying that it has read up to that which the card has sent. 75910696SDavid.Hollister@Sun.COM */ 76010696SDavid.Hollister@Sun.COM #define GET_OQ_ENTRY(hwp, qn, ix, o) \ 76110696SDavid.Hollister@Sun.COM &hwp->oqp[qn][QI2O(ix, o, hwp->ioq_depth) >> 2] 76210696SDavid.Hollister@Sun.COM 76310696SDavid.Hollister@Sun.COM #define STEP_OQ_ENTRY(hwp, qn, ix, n) ix = ADDQI(ix, n, hwp->ioq_depth) 76410696SDavid.Hollister@Sun.COM 76510696SDavid.Hollister@Sun.COM #define SYNC_OQ_ENTRY(hwp, qn, ci, pi) \ 76610696SDavid.Hollister@Sun.COM pmcs_wr_oqci(hwp, qn, ci); \ 76710696SDavid.Hollister@Sun.COM (hwp)->oqci[qn] = ci; \ 76810696SDavid.Hollister@Sun.COM (hwp)->oqpi[qn] = pi 76910696SDavid.Hollister@Sun.COM 77010696SDavid.Hollister@Sun.COM #ifdef __cplusplus 77110696SDavid.Hollister@Sun.COM } 77210696SDavid.Hollister@Sun.COM #endif 77310696SDavid.Hollister@Sun.COM #endif /* _PMCS_IOMB_H */ 774