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 2012060SDavid.Hollister@Sun.COM */ 2112060SDavid.Hollister@Sun.COM /* 2212060SDavid.Hollister@Sun.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 2310696SDavid.Hollister@Sun.COM */ 2410696SDavid.Hollister@Sun.COM #ifndef _PMCS_DEF_H 2510696SDavid.Hollister@Sun.COM #define _PMCS_DEF_H 2610696SDavid.Hollister@Sun.COM #ifdef __cplusplus 2710696SDavid.Hollister@Sun.COM extern "C" { 2810696SDavid.Hollister@Sun.COM #endif 2910696SDavid.Hollister@Sun.COM 3010696SDavid.Hollister@Sun.COM typedef enum { 3110696SDavid.Hollister@Sun.COM NOTHING, /* nothing connected here */ 3210696SDavid.Hollister@Sun.COM SATA, /* SATA connection */ 3310696SDavid.Hollister@Sun.COM SAS, /* direct or indirect SAS connection */ 3410696SDavid.Hollister@Sun.COM EXPANDER, /* connection to an expander */ 3510696SDavid.Hollister@Sun.COM NEW /* Brand new device (pending state) */ 3610696SDavid.Hollister@Sun.COM } pmcs_dtype_t; 3710696SDavid.Hollister@Sun.COM 3810696SDavid.Hollister@Sun.COM /* 3910696SDavid.Hollister@Sun.COM * This structure defines a PHY device that represents what we 4010696SDavid.Hollister@Sun.COM * are connected to. 4110696SDavid.Hollister@Sun.COM * 4210696SDavid.Hollister@Sun.COM * The eight real physical PHYs that are in the PMC8X6G are represented 4310696SDavid.Hollister@Sun.COM * as an array of eight of these structures which define what these 4410696SDavid.Hollister@Sun.COM * real PHYs are connected to. 4510696SDavid.Hollister@Sun.COM * 4610696SDavid.Hollister@Sun.COM * Depending upon what is actually connected to each PHY, the 4710696SDavid.Hollister@Sun.COM * type set will define what we're connected to. If it is 4810696SDavid.Hollister@Sun.COM * a direct SATA connection, the phy will describe a SATA endpoint 4910696SDavid.Hollister@Sun.COM * If it is a direct SAS connection, it will describe a SAS 5010696SDavid.Hollister@Sun.COM * endpoint. 5110696SDavid.Hollister@Sun.COM * 5210696SDavid.Hollister@Sun.COM * If it is an EXPANDER, this will describe the edge of an expander. 5310696SDavid.Hollister@Sun.COM * As we perform discovery on what is in an EXPANDER we define an 5410696SDavid.Hollister@Sun.COM * additional list of phys that represent what the Expander is connected to. 5510696SDavid.Hollister@Sun.COM */ 5610696SDavid.Hollister@Sun.COM #define PMCS_HW_MIN_LINK_RATE SAS_LINK_RATE_1_5GBIT 5710696SDavid.Hollister@Sun.COM #define PMCS_HW_MAX_LINK_RATE SAS_LINK_RATE_6GBIT 5810696SDavid.Hollister@Sun.COM 5911347SRamana.Srikanth@Sun.COM #define PMCS_INVALID_DEVICE_ID 0xffffffff 60*12791Sdavid.hollister@oracle.com #define PMCS_DEVICE_ID_MASK 0xffff 6111347SRamana.Srikanth@Sun.COM #define PMCS_PHY_INVALID_PORT_ID 0xf 6210696SDavid.Hollister@Sun.COM 6311307SDavid.Hollister@Sun.COM #define PMCS_PM_MAX_NAMELEN 16 6411601SDavid.Hollister@Sun.COM #define PMCS_MAX_REENUMERATE 2 /* Maximum re-enumeration attempts */ 6511601SDavid.Hollister@Sun.COM 6611601SDavid.Hollister@Sun.COM /* 6711601SDavid.Hollister@Sun.COM * Number of usecs to wait after last noted activate/deactivate callback 6811601SDavid.Hollister@Sun.COM * before possibly restarting discovery 6911601SDavid.Hollister@Sun.COM */ 7011601SDavid.Hollister@Sun.COM #define PMCS_REDISCOVERY_DELAY (5 * MICROSEC) 7111307SDavid.Hollister@Sun.COM 7210696SDavid.Hollister@Sun.COM struct pmcs_phy { 7310696SDavid.Hollister@Sun.COM pmcs_phy_t *sibling; /* sibling phy */ 7410696SDavid.Hollister@Sun.COM pmcs_phy_t *parent; /* parent phy */ 7510696SDavid.Hollister@Sun.COM pmcs_phy_t *children; /* head of list of children */ 7610696SDavid.Hollister@Sun.COM pmcs_phy_t *dead_next; /* dead PHY list link */ 7710696SDavid.Hollister@Sun.COM list_node_t list_node; /* list element */ 7810696SDavid.Hollister@Sun.COM uint32_t device_id; /* PMC8X6G device handle */ 7910696SDavid.Hollister@Sun.COM uint32_t 8010696SDavid.Hollister@Sun.COM ncphy : 8, /* # of contained phys for expander */ 8110696SDavid.Hollister@Sun.COM hw_event_ack : 24; /* XXX: first level phy event acked */ 8210696SDavid.Hollister@Sun.COM uint8_t phynum; /* phy number on parent expander */ 8310696SDavid.Hollister@Sun.COM uint8_t width; /* how many phys wide */ 8410696SDavid.Hollister@Sun.COM uint8_t ds_recovery_retries; /* # error retry attempts */ 8511087SRamana.Srikanth@Sun.COM uint8_t ds_prev_good_recoveries; /* # successful recoveries */ 8611087SRamana.Srikanth@Sun.COM clock_t prev_recovery; /* previous successful recovery */ 8711087SRamana.Srikanth@Sun.COM clock_t last_good_recovery; /* oldest successful recovery */ 8811087SRamana.Srikanth@Sun.COM /* within PMCS_MAX_DS_RECOVERY_TIME time frame */ 8910696SDavid.Hollister@Sun.COM pmcs_dtype_t dtype; /* current dtype of the phy */ 9010696SDavid.Hollister@Sun.COM pmcs_dtype_t pend_dtype; /* new dtype (pending change) */ 9110696SDavid.Hollister@Sun.COM uint32_t 9210696SDavid.Hollister@Sun.COM level : 8, /* level in expander tree */ 9310696SDavid.Hollister@Sun.COM tolerates_sas2 : 1, /* tolerates SAS2 SMP */ 9410696SDavid.Hollister@Sun.COM spinup_hold : 1, /* spinup hold needs releasing */ 9510696SDavid.Hollister@Sun.COM atdt : 3, /* attached device type */ 9610696SDavid.Hollister@Sun.COM portid : 4, /* PMC8X6G port context */ 9710696SDavid.Hollister@Sun.COM link_rate : 4, /* current supported speeds */ 9810696SDavid.Hollister@Sun.COM valid_device_id : 1, /* device id is valid */ 9910696SDavid.Hollister@Sun.COM abort_sent : 1, /* we've sent an abort */ 10010696SDavid.Hollister@Sun.COM abort_pending : 1, /* we have an abort pending */ 10110696SDavid.Hollister@Sun.COM need_rl_ext : 1, /* need SATA RL_EXT recocvery */ 10210696SDavid.Hollister@Sun.COM subsidiary : 1, /* this is part of a wide phy */ 10310696SDavid.Hollister@Sun.COM configured : 1, /* is configured */ 10410696SDavid.Hollister@Sun.COM dead : 1, /* dead */ 10511347SRamana.Srikanth@Sun.COM changed : 1, /* this phy is changing */ 10611601SDavid.Hollister@Sun.COM reenumerate : 1, /* attempt re-enumeration */ 10712443Sdavid.hollister@oracle.com virtual : 1, /* This is a virtual PHY */ 10811347SRamana.Srikanth@Sun.COM deregister_wait : 1; /* phy waiting to get deregistered */ 10910696SDavid.Hollister@Sun.COM clock_t config_stop; /* When config attempts will stop */ 11010696SDavid.Hollister@Sun.COM hrtime_t abort_all_start; 11110696SDavid.Hollister@Sun.COM kcondvar_t abort_all_cv; /* Wait for ABORT_ALL completion */ 11210696SDavid.Hollister@Sun.COM kmutex_t phy_lock; 11310696SDavid.Hollister@Sun.COM volatile uint32_t ref_count; /* Targets & work on this PHY */ 11411601SDavid.Hollister@Sun.COM uint32_t enum_attempts; /* # of enumeration attempts */ 11510696SDavid.Hollister@Sun.COM uint8_t sas_address[8]; /* SAS address for this PHY */ 11610696SDavid.Hollister@Sun.COM struct { 11710696SDavid.Hollister@Sun.COM uint32_t 11810696SDavid.Hollister@Sun.COM prog_min_rate :4, 11910696SDavid.Hollister@Sun.COM hw_min_rate :4, 12010696SDavid.Hollister@Sun.COM prog_max_rate :4, 12110696SDavid.Hollister@Sun.COM hw_max_rate :4, 12210696SDavid.Hollister@Sun.COM reserved :16; 12310696SDavid.Hollister@Sun.COM } state; 12410696SDavid.Hollister@Sun.COM char path[32]; /* path name for this phy */ 12510696SDavid.Hollister@Sun.COM pmcs_hw_t *pwp; /* back ptr to hba struct */ 12610696SDavid.Hollister@Sun.COM pmcs_iport_t *iport; /* back ptr to the iport handle */ 12711501SDavid.Hollister@Sun.COM pmcs_iport_t *last_iport; /* last iport this PHY was on */ 12810696SDavid.Hollister@Sun.COM pmcs_xscsi_t *target; /* back ptr to current target */ 12912668Ssrikanth.suravajhala@oracle.com pmcs_xscsi_t **target_addr; /* address of real target pointer */ 13010696SDavid.Hollister@Sun.COM kstat_t *phy_stats; /* kstats for this phy */ 13111307SDavid.Hollister@Sun.COM /* 13211307SDavid.Hollister@Sun.COM * Attached port phy mask and target port phymask. With 16 bytes 13311307SDavid.Hollister@Sun.COM * we can represent a phymask for anything with up to 64 ports 13411307SDavid.Hollister@Sun.COM */ 13511307SDavid.Hollister@Sun.COM uint64_t att_port_pm; /* att port pm for this PHY */ 13611307SDavid.Hollister@Sun.COM uint64_t att_port_pm_tmp; /* Temp area for wide-ports */ 13711307SDavid.Hollister@Sun.COM char att_port_pm_str[PMCS_PM_MAX_NAMELEN + 1]; 13811307SDavid.Hollister@Sun.COM uint64_t tgt_port_pm; /* tgt port pm for this PHY */ 13911307SDavid.Hollister@Sun.COM uint64_t tgt_port_pm_tmp; /* Temp area for wide-ports */ 14011307SDavid.Hollister@Sun.COM char tgt_port_pm_str[PMCS_PM_MAX_NAMELEN + 1]; 14111601SDavid.Hollister@Sun.COM smp_routing_attr_t routing_attr; /* Routing attr. from discover resp. */ 14211601SDavid.Hollister@Sun.COM smp_routing_attr_t routing_method; /* Actual routing method used. */ 14311601SDavid.Hollister@Sun.COM smp_report_general_resp_t rg_resp; /* Response to REPORT_GENERAL */ 14411601SDavid.Hollister@Sun.COM smp_discover_resp_t disc_resp; /* Response to DISCOVER */ 14510696SDavid.Hollister@Sun.COM }; 14610696SDavid.Hollister@Sun.COM 14710696SDavid.Hollister@Sun.COM /* maximum number of ds recovery retries (ds_recovery_retries) */ 14811347SRamana.Srikanth@Sun.COM #define PMCS_MAX_DS_RECOVERY_RETRIES 10 14910696SDavid.Hollister@Sun.COM 15011087SRamana.Srikanth@Sun.COM /* max time allowed for successful recovery */ 15111087SRamana.Srikanth@Sun.COM #define PMCS_MAX_DS_RECOVERY_TIME (60 * 1000000) /* 60 seconds */ 15211087SRamana.Srikanth@Sun.COM 15311087SRamana.Srikanth@Sun.COM /* ds recovery on same same phy is not allowed within this interval */ 15411087SRamana.Srikanth@Sun.COM #define PMCS_DS_RECOVERY_INTERVAL (1000000) /* 1 second */ 15511087SRamana.Srikanth@Sun.COM 15610696SDavid.Hollister@Sun.COM 15710696SDavid.Hollister@Sun.COM /* 15810696SDavid.Hollister@Sun.COM * Inbound and Outbound Queue Related Definitions. 15910696SDavid.Hollister@Sun.COM * 16010696SDavid.Hollister@Sun.COM * The PMC8X6G has a programmable number of inbound and outbound circular 16110696SDavid.Hollister@Sun.COM * queues for use in message passing between the host and the PMC8X6G 16210696SDavid.Hollister@Sun.COM * (up to 64 queues for the Rev C Chip). This driver does not use all 16310696SDavid.Hollister@Sun.COM * possible queues. 16410696SDavid.Hollister@Sun.COM * 16510696SDavid.Hollister@Sun.COM * Each Queue is given 4K of consistent memory and we set a 64 byte size for 16610696SDavid.Hollister@Sun.COM * the queue entry size (this gives us 256 queue entries per queue). 16710696SDavid.Hollister@Sun.COM * 16810696SDavid.Hollister@Sun.COM * This allocation then continues up a further PMCS_SCRATCH_SIZE bytes 16910696SDavid.Hollister@Sun.COM * that the driver uses as a temporary scratch area for things like 17010696SDavid.Hollister@Sun.COM * SMP discovery. 17110696SDavid.Hollister@Sun.COM * 17210696SDavid.Hollister@Sun.COM * This control area looks like this: 17310696SDavid.Hollister@Sun.COM * 17410696SDavid.Hollister@Sun.COM * Offset What 17510696SDavid.Hollister@Sun.COM * ------------------------------------------------ 17610696SDavid.Hollister@Sun.COM * 0 IQ 0 Consumer Index 17710696SDavid.Hollister@Sun.COM * 4 IQ 1 Consumer Index 17810696SDavid.Hollister@Sun.COM * 8..255 ... 17910696SDavid.Hollister@Sun.COM * 252..255 IQ 63 Consumer Index 18010696SDavid.Hollister@Sun.COM * 256 OQ 0 Producer Index 18110696SDavid.Hollister@Sun.COM * 260 OQ 1 Producer Index 18210696SDavid.Hollister@Sun.COM * 264..259 .... 18310696SDavid.Hollister@Sun.COM * 508..511 OQ 63 Producer Index 18410696SDavid.Hollister@Sun.COM * 512..512+PMCS_SCRATCH_SIZE-1 Scratch area. 18510696SDavid.Hollister@Sun.COM */ 18610696SDavid.Hollister@Sun.COM #define IQCI_BASE_OFFSET 0 18710696SDavid.Hollister@Sun.COM #define IQ_OFFSET(qnum) (IQCI_BASE_OFFSET + (qnum << 2)) 18810696SDavid.Hollister@Sun.COM #define OQPI_BASE_OFFSET 256 18910696SDavid.Hollister@Sun.COM #define OQ_OFFSET(qnum) (OQPI_BASE_OFFSET + (qnum << 2)) 19010696SDavid.Hollister@Sun.COM 19110696SDavid.Hollister@Sun.COM /* 19210696SDavid.Hollister@Sun.COM * Work related structures. Each one of these structures is paired 19310696SDavid.Hollister@Sun.COM * with *any* command that is fed to the PMC8X6G via one of the 19410696SDavid.Hollister@Sun.COM * Inbound Queues. The work structure has a tag to compare with 19510696SDavid.Hollister@Sun.COM * the message that comes back out of an Outbound Queue. The 19610696SDavid.Hollister@Sun.COM * work structure also points to the phy which this command is 19710696SDavid.Hollister@Sun.COM * tied to. It also has a pointer a callback function (if defined). 19810696SDavid.Hollister@Sun.COM * See that TAG Architecture below for the various kinds of 19910696SDavid.Hollister@Sun.COM * dispositions of a work structure. 20010696SDavid.Hollister@Sun.COM */ 20110696SDavid.Hollister@Sun.COM 20210696SDavid.Hollister@Sun.COM /* 20310696SDavid.Hollister@Sun.COM * Work Structure States 20410696SDavid.Hollister@Sun.COM * 20510696SDavid.Hollister@Sun.COM * NIL -> READY 20610696SDavid.Hollister@Sun.COM * READY -> NIL 20710696SDavid.Hollister@Sun.COM * READY -> ONCHIP 20810696SDavid.Hollister@Sun.COM * ONCHIP -> INTR 20910696SDavid.Hollister@Sun.COM * INTR -> READY 21010696SDavid.Hollister@Sun.COM * INTR -> NIL 21110696SDavid.Hollister@Sun.COM * INTR -> ABORTED 21210696SDavid.Hollister@Sun.COM * INTR -> TIMED_OUT 21310696SDavid.Hollister@Sun.COM * ABORTED -> NIL 21410696SDavid.Hollister@Sun.COM * TIMED_OUT -> NIL 21510696SDavid.Hollister@Sun.COM */ 21610696SDavid.Hollister@Sun.COM typedef enum { 21710696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_NIL = 0, 21810696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_READY, 21910696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_ONCHIP, 22010696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_INTR, 22110696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_IOCOMPQ, 22210696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_ABORTED, 22310696SDavid.Hollister@Sun.COM PMCS_WORK_STATE_TIMED_OUT 22410696SDavid.Hollister@Sun.COM } pmcs_work_state_t; 22510696SDavid.Hollister@Sun.COM 22610696SDavid.Hollister@Sun.COM struct pmcwork { 22710696SDavid.Hollister@Sun.COM STAILQ_ENTRY(pmcwork) next; 22810696SDavid.Hollister@Sun.COM kmutex_t lock; 22910696SDavid.Hollister@Sun.COM kcondvar_t sleep_cv; 23010696SDavid.Hollister@Sun.COM void *ptr; /* linkage or callback function */ 23110696SDavid.Hollister@Sun.COM void *arg; /* command specific data */ 23210696SDavid.Hollister@Sun.COM pmcs_phy_t *phy; /* phy who owns this command */ 23310696SDavid.Hollister@Sun.COM pmcs_xscsi_t *xp; /* Back pointer to xscsi struct */ 23410696SDavid.Hollister@Sun.COM volatile uint32_t htag; /* tag for this structure */ 23511048SDavid.Hollister@Sun.COM uint32_t abt_htag; /* Tag of command to be aborted */ 23610696SDavid.Hollister@Sun.COM uint32_t 23710696SDavid.Hollister@Sun.COM timer : 27, 23810696SDavid.Hollister@Sun.COM onwire : 1, 23910696SDavid.Hollister@Sun.COM dead : 1, 24010696SDavid.Hollister@Sun.COM state : 3; 24110696SDavid.Hollister@Sun.COM hrtime_t start; /* timestamp start */ 24210696SDavid.Hollister@Sun.COM uint32_t ssp_event; /* ssp event */ 24310696SDavid.Hollister@Sun.COM pmcs_dtype_t dtype; /* stash, incase phy gets cleared */ 24410696SDavid.Hollister@Sun.COM 24510696SDavid.Hollister@Sun.COM void *last_ptr; 24610696SDavid.Hollister@Sun.COM void *last_arg; 24710696SDavid.Hollister@Sun.COM pmcs_phy_t *last_phy; 24810696SDavid.Hollister@Sun.COM pmcs_xscsi_t *last_xp; 24910696SDavid.Hollister@Sun.COM uint32_t last_htag; 25010696SDavid.Hollister@Sun.COM pmcs_work_state_t last_state; 25110696SDavid.Hollister@Sun.COM hrtime_t finish; 25210696SDavid.Hollister@Sun.COM }; 25312506Sjesse.butler@oracle.com #define PMCS_ABT_HTAG_ALL 0xffffffff 25410696SDavid.Hollister@Sun.COM 25510696SDavid.Hollister@Sun.COM #define PMCS_REC_EVENT 0xffffffff /* event recovery */ 25610696SDavid.Hollister@Sun.COM 25710696SDavid.Hollister@Sun.COM /* 25810696SDavid.Hollister@Sun.COM * This structure defines a PMC-Sierra defined firmware header. 25910696SDavid.Hollister@Sun.COM */ 26010696SDavid.Hollister@Sun.COM #pragma pack(4) 26110696SDavid.Hollister@Sun.COM typedef struct { 26210696SDavid.Hollister@Sun.COM char vendor_id[8]; 26310696SDavid.Hollister@Sun.COM uint8_t product_id; 26410696SDavid.Hollister@Sun.COM uint8_t hwrev; 26510696SDavid.Hollister@Sun.COM uint8_t destination_partition; 26610696SDavid.Hollister@Sun.COM uint8_t reserved0; 26710696SDavid.Hollister@Sun.COM uint8_t fwrev[4]; 26810696SDavid.Hollister@Sun.COM uint32_t firmware_length; 26910696SDavid.Hollister@Sun.COM uint32_t crc; 27010696SDavid.Hollister@Sun.COM uint32_t start_address; 27110696SDavid.Hollister@Sun.COM uint8_t data[]; 27210696SDavid.Hollister@Sun.COM } pmcs_fw_hdr_t; 27310696SDavid.Hollister@Sun.COM #pragma pack() 27410696SDavid.Hollister@Sun.COM 27510696SDavid.Hollister@Sun.COM /* 27610696SDavid.Hollister@Sun.COM * Offlevel work as a bit pattern. 27710696SDavid.Hollister@Sun.COM */ 27810696SDavid.Hollister@Sun.COM #define PMCS_WORK_DISCOVER 0 27910696SDavid.Hollister@Sun.COM #define PMCS_WORK_ABORT_HANDLE 3 28010696SDavid.Hollister@Sun.COM #define PMCS_WORK_SPINUP_RELEASE 4 28110696SDavid.Hollister@Sun.COM #define PMCS_WORK_SAS_HW_ACK 5 28210696SDavid.Hollister@Sun.COM #define PMCS_WORK_SATA_RUN 6 28310696SDavid.Hollister@Sun.COM #define PMCS_WORK_RUN_QUEUES 7 28410696SDavid.Hollister@Sun.COM #define PMCS_WORK_ADD_DMA_CHUNKS 8 28510696SDavid.Hollister@Sun.COM #define PMCS_WORK_DS_ERR_RECOVERY 9 28610696SDavid.Hollister@Sun.COM #define PMCS_WORK_SSP_EVT_RECOVERY 10 28711347SRamana.Srikanth@Sun.COM #define PMCS_WORK_DEREGISTER_DEV 11 28811847SDavid.Hollister@Sun.COM #define PMCS_WORK_DUMP_REGS 12 28910696SDavid.Hollister@Sun.COM 29010696SDavid.Hollister@Sun.COM /* 29110696SDavid.Hollister@Sun.COM * The actual values as they appear in work_flags 29210696SDavid.Hollister@Sun.COM */ 29310696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_DISCOVER (1 << 0) 29410696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_ABORT_HANDLE (1 << 3) 29510696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_SPINUP_RELEASE (1 << 4) 29610696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_SAS_HW_ACK (1 << 5) 29710696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_SATA_RUN (1 << 6) 29810696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_RUN_QUEUES (1 << 7) 29910696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_ADD_DMA_CHUNKS (1 << 8) 30010696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_DS_ERR_RECOVERY (1 << 9) 30110696SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_SSP_EVT_RECOVERY (1 << 10) 30211347SRamana.Srikanth@Sun.COM #define PMCS_WORK_FLAG_DEREGISTER_DEV (1 << 11) 30311847SDavid.Hollister@Sun.COM #define PMCS_WORK_FLAG_DUMP_REGS (1 << 12) 30410696SDavid.Hollister@Sun.COM 30510696SDavid.Hollister@Sun.COM /* 30610696SDavid.Hollister@Sun.COM * This structure is used by this function to test MPI (and interrupts) 30710696SDavid.Hollister@Sun.COM * after MPI has been started to make sure it's working reliably. 30810696SDavid.Hollister@Sun.COM */ 30910696SDavid.Hollister@Sun.COM typedef struct { 31010696SDavid.Hollister@Sun.COM uint32_t signature; 31110696SDavid.Hollister@Sun.COM uint32_t count; 31210696SDavid.Hollister@Sun.COM uint32_t *ptr; 31310696SDavid.Hollister@Sun.COM } echo_test_t; 31410696SDavid.Hollister@Sun.COM #define ECHO_SIGNATURE 0xbebebeef 31510696SDavid.Hollister@Sun.COM 31610696SDavid.Hollister@Sun.COM /* 31710696SDavid.Hollister@Sun.COM * Tag Architecture. The PMC has 32 bit tags for MPI messages. 31810696SDavid.Hollister@Sun.COM * We use this tag this way. 31910696SDavid.Hollister@Sun.COM * 32010696SDavid.Hollister@Sun.COM * bits what 32110696SDavid.Hollister@Sun.COM * ------------------------ 32210696SDavid.Hollister@Sun.COM * 31 done bit 32312258Ssrikanth.suravajhala@oracle.com * 30 non-io cmd bit 32412258Ssrikanth.suravajhala@oracle.com * 29..28 tag type 32510696SDavid.Hollister@Sun.COM * 27..12 rolling serial number 32610696SDavid.Hollister@Sun.COM * 11..0 index into work area to get pmcwork structure 32710696SDavid.Hollister@Sun.COM * 32810696SDavid.Hollister@Sun.COM * A tag type of NONE means that nobody is waiting on any results, 32910696SDavid.Hollister@Sun.COM * so the interrupt code frees the work structure that has this 33010696SDavid.Hollister@Sun.COM * tag. 33110696SDavid.Hollister@Sun.COM * 33210696SDavid.Hollister@Sun.COM * A tag type of CBACK means that the the interrupt handler 33310696SDavid.Hollister@Sun.COM * takes the tag 'arg' in the work structure to be a callback 33410696SDavid.Hollister@Sun.COM * function pointer (see pmcs_cb_t). The callee is responsible 33510696SDavid.Hollister@Sun.COM * for freeing the work structure that has this tag. 33610696SDavid.Hollister@Sun.COM * 33710696SDavid.Hollister@Sun.COM * A tag type of WAIT means that the issuer of the work needs 33810696SDavid.Hollister@Sun.COM * be woken up from interrupt level when the command completes 33910696SDavid.Hollister@Sun.COM * (or times out). If work structure tag 'arg' is non-null, 34010696SDavid.Hollister@Sun.COM * up to 2*PMCS_QENTRY_SIZE bits of data from the Outbound Queue 34110696SDavid.Hollister@Sun.COM * entry may be copied to the area pointed to by 'arg'. This 34210696SDavid.Hollister@Sun.COM * allows issuers to get directly at the results of the command 34310696SDavid.Hollister@Sun.COM * they issed. The synchronization point for the issuer and the 34410696SDavid.Hollister@Sun.COM * interrupt code for command done notification is the setting 34510696SDavid.Hollister@Sun.COM * of the 'DONE' bit in the tag as stored in the work structure. 34610696SDavid.Hollister@Sun.COM */ 34710696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE_FREE 0 34810696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE_NONE 1 34910696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE_CBACK 2 35010696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE_WAIT 3 35110696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE_SHIFT 28 35210696SDavid.Hollister@Sun.COM #define PMCS_TAG_SERNO_SHIFT 12 35310696SDavid.Hollister@Sun.COM #define PMCS_TAG_INDEX_SHIFT 0 35412258Ssrikanth.suravajhala@oracle.com #define PMCS_TAG_TYPE_MASK 0x30000000 35512258Ssrikanth.suravajhala@oracle.com #define PMCS_TAG_NONIO_CMD 0x40000000 35610696SDavid.Hollister@Sun.COM #define PMCS_TAG_DONE 0x80000000 35710696SDavid.Hollister@Sun.COM #define PMCS_TAG_SERNO_MASK 0x0ffff000 35810696SDavid.Hollister@Sun.COM #define PMCS_TAG_INDEX_MASK 0x00000fff 35910696SDavid.Hollister@Sun.COM #define PMCS_TAG_TYPE(x) \ 36010696SDavid.Hollister@Sun.COM (((x) & PMCS_TAG_TYPE_MASK) >> PMCS_TAG_TYPE_SHIFT) 36110696SDavid.Hollister@Sun.COM #define PMCS_TAG_SERNO(x) \ 36210696SDavid.Hollister@Sun.COM (((x) & PMCS_TAG_SERNO_MASK) >> PMCS_TAG_SERNO_SHIFT) 36310696SDavid.Hollister@Sun.COM #define PMCS_TAG_INDEX(x) \ 36410696SDavid.Hollister@Sun.COM (((x) & PMCS_TAG_INDEX_MASK) >> PMCS_TAG_INDEX_SHIFT) 36510696SDavid.Hollister@Sun.COM #define PMCS_TAG_FREE 0 36610696SDavid.Hollister@Sun.COM #define PMCS_COMMAND_DONE(x) \ 36710696SDavid.Hollister@Sun.COM (((x)->htag == PMCS_TAG_FREE) || (((x)->htag & PMCS_TAG_DONE) != 0)) 36810696SDavid.Hollister@Sun.COM #define PMCS_COMMAND_ACTIVE(x) \ 36910696SDavid.Hollister@Sun.COM ((x)->htag != PMCS_TAG_FREE && (x)->state == PMCS_WORK_STATE_ONCHIP) 37010696SDavid.Hollister@Sun.COM 37110696SDavid.Hollister@Sun.COM /* 37210696SDavid.Hollister@Sun.COM * Miscellaneous Definitions 37310696SDavid.Hollister@Sun.COM */ 37410696SDavid.Hollister@Sun.COM #define CLEAN_MESSAGE(m, x) { \ 37510696SDavid.Hollister@Sun.COM int _j = x; \ 37610696SDavid.Hollister@Sun.COM while (_j < PMCS_MSG_SIZE) { \ 37710696SDavid.Hollister@Sun.COM m[_j++] = 0; \ 37810696SDavid.Hollister@Sun.COM } \ 37910696SDavid.Hollister@Sun.COM } 38010696SDavid.Hollister@Sun.COM 38110696SDavid.Hollister@Sun.COM #define COPY_MESSAGE(t, f, a) { \ 38210696SDavid.Hollister@Sun.COM int _j; \ 38310696SDavid.Hollister@Sun.COM for (_j = 0; _j < a; _j++) { \ 38410696SDavid.Hollister@Sun.COM t[_j] = f[_j]; \ 38510696SDavid.Hollister@Sun.COM } \ 38610696SDavid.Hollister@Sun.COM while (_j < PMCS_MSG_SIZE) { \ 38710696SDavid.Hollister@Sun.COM t[_j++] = 0; \ 38810696SDavid.Hollister@Sun.COM } \ 38910696SDavid.Hollister@Sun.COM } 39010696SDavid.Hollister@Sun.COM 39110696SDavid.Hollister@Sun.COM #define PMCS_PHY_ADDRESSABLE(pp) \ 39210696SDavid.Hollister@Sun.COM ((pp)->level == 0 && (pp)->dtype == SATA && \ 39310696SDavid.Hollister@Sun.COM ((pp)->sas_address[0] >> 4) != 5) 39410696SDavid.Hollister@Sun.COM 39510696SDavid.Hollister@Sun.COM #define RESTART_DISCOVERY(pwp) \ 39610696SDavid.Hollister@Sun.COM ASSERT(!mutex_owned(&pwp->config_lock)); \ 39710696SDavid.Hollister@Sun.COM mutex_enter(&pwp->config_lock); \ 39810696SDavid.Hollister@Sun.COM pwp->config_changed = B_TRUE; \ 39910696SDavid.Hollister@Sun.COM mutex_exit(&pwp->config_lock); \ 40010696SDavid.Hollister@Sun.COM SCHEDULE_WORK(pwp, PMCS_WORK_DISCOVER); 40110696SDavid.Hollister@Sun.COM 40210696SDavid.Hollister@Sun.COM #define RESTART_DISCOVERY_LOCKED(pwp) \ 40310696SDavid.Hollister@Sun.COM ASSERT(mutex_owned(&pwp->config_lock)); \ 40410696SDavid.Hollister@Sun.COM pwp->config_changed = B_TRUE; \ 40510696SDavid.Hollister@Sun.COM SCHEDULE_WORK(pwp, PMCS_WORK_DISCOVER); 40610696SDavid.Hollister@Sun.COM 40710696SDavid.Hollister@Sun.COM #define PHY_CHANGED(pwp, p) \ 40811048SDavid.Hollister@Sun.COM pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, p, NULL, "%s changed in " \ 40911048SDavid.Hollister@Sun.COM "%s line %d", p->path, __func__, __LINE__); \ 41011601SDavid.Hollister@Sun.COM p->changed = 1; \ 41111601SDavid.Hollister@Sun.COM p->enum_attempts = 0 41210696SDavid.Hollister@Sun.COM 41310696SDavid.Hollister@Sun.COM #define PHY_CHANGED_AT_LOCATION(pwp, p, func, line) \ 41411048SDavid.Hollister@Sun.COM pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, p, NULL, "%s changed in " \ 41511048SDavid.Hollister@Sun.COM "%s line %d", p->path, func, line); \ 41611601SDavid.Hollister@Sun.COM p->changed = 1; \ 41711601SDavid.Hollister@Sun.COM p->enum_attempts = 0 41810696SDavid.Hollister@Sun.COM 41910696SDavid.Hollister@Sun.COM #define PHY_TYPE(pptr) \ 42010696SDavid.Hollister@Sun.COM (((pptr)->dtype == NOTHING)? "NOTHING" : \ 42110696SDavid.Hollister@Sun.COM (((pptr)->dtype == SATA)? "SATA" : \ 42210696SDavid.Hollister@Sun.COM (((pptr)->dtype == SAS)? "SAS" : "EXPANDER"))) 42310696SDavid.Hollister@Sun.COM 42410696SDavid.Hollister@Sun.COM #define IS_ROOT_PHY(pptr) (pptr->parent == NULL) 42510696SDavid.Hollister@Sun.COM 42610696SDavid.Hollister@Sun.COM #define PMCS_HIPRI(pwp, oq, c) \ 42710696SDavid.Hollister@Sun.COM (pwp->hipri_queue & (1 << PMCS_IQ_OTHER)) ? \ 42810696SDavid.Hollister@Sun.COM (PMCS_IOMB_HIPRI | PMCS_IOMB_IN_SAS(oq, c)) : \ 42910696SDavid.Hollister@Sun.COM (PMCS_IOMB_IN_SAS(oq, c)) 43010696SDavid.Hollister@Sun.COM 43110696SDavid.Hollister@Sun.COM #define SCHEDULE_WORK(hwp, wrk) \ 43210696SDavid.Hollister@Sun.COM (void) atomic_set_long_excl(&hwp->work_flags, wrk) 43310696SDavid.Hollister@Sun.COM 43410696SDavid.Hollister@Sun.COM /* 43510696SDavid.Hollister@Sun.COM * Check to see if the requested work bit is set. Either way, the bit will 43610696SDavid.Hollister@Sun.COM * be cleared upon return. 43710696SDavid.Hollister@Sun.COM */ 43810696SDavid.Hollister@Sun.COM #define WORK_SCHEDULED(hwp, wrk) \ 43910696SDavid.Hollister@Sun.COM (atomic_clear_long_excl(&hwp->work_flags, wrk) == 0) 44010696SDavid.Hollister@Sun.COM 44110696SDavid.Hollister@Sun.COM /* 44210696SDavid.Hollister@Sun.COM * Check to see if the requested work bit is set. The value will not be 44310696SDavid.Hollister@Sun.COM * changed in this case. The atomic_xx_nv operations can be quite expensive 44410696SDavid.Hollister@Sun.COM * so this should not be used in non-DEBUG code. 44510696SDavid.Hollister@Sun.COM */ 44610696SDavid.Hollister@Sun.COM #define WORK_IS_SCHEDULED(hwp, wrk) \ 44710696SDavid.Hollister@Sun.COM ((atomic_and_ulong_nv(&hwp->work_flags, (ulong_t)-1) & (1 << wrk)) != 0) 44810696SDavid.Hollister@Sun.COM 44910696SDavid.Hollister@Sun.COM #define WAIT_FOR(p, t, r) \ 45012078SJesse.Butler@Sun.COM clock_t _lb = ddi_get_lbolt(); \ 45110696SDavid.Hollister@Sun.COM r = 0; \ 45210696SDavid.Hollister@Sun.COM while (!PMCS_COMMAND_DONE(p)) { \ 45312078SJesse.Butler@Sun.COM clock_t _ret = cv_timedwait(&p->sleep_cv, \ 45412078SJesse.Butler@Sun.COM &p->lock, _lb + drv_usectohz(t * 1000)); \ 45512078SJesse.Butler@Sun.COM if (!PMCS_COMMAND_DONE(p) && _ret < 0) { \ 45610696SDavid.Hollister@Sun.COM r = 1; \ 45710696SDavid.Hollister@Sun.COM break; \ 45810696SDavid.Hollister@Sun.COM } \ 45910696SDavid.Hollister@Sun.COM } 46010696SDavid.Hollister@Sun.COM 46110696SDavid.Hollister@Sun.COM /* 46210696SDavid.Hollister@Sun.COM * Signal the next I/O completion thread to start running. 46310696SDavid.Hollister@Sun.COM */ 46410696SDavid.Hollister@Sun.COM 46510696SDavid.Hollister@Sun.COM #define PMCS_CQ_RUN_LOCKED(hwp) \ 46610696SDavid.Hollister@Sun.COM if (!STAILQ_EMPTY(&hwp->cq) || hwp->iocomp_cb_head) { \ 46710696SDavid.Hollister@Sun.COM pmcs_cq_thr_info_t *cqti; \ 46810696SDavid.Hollister@Sun.COM cqti = &hwp->cq_info.cq_thr_info \ 46910696SDavid.Hollister@Sun.COM [hwp->cq_info.cq_next_disp_thr]; \ 47010696SDavid.Hollister@Sun.COM hwp->cq_info.cq_next_disp_thr++; \ 47110696SDavid.Hollister@Sun.COM if (hwp->cq_info.cq_next_disp_thr == \ 47210696SDavid.Hollister@Sun.COM hwp->cq_info.cq_threads) { \ 47310696SDavid.Hollister@Sun.COM hwp->cq_info.cq_next_disp_thr = 0; \ 47410696SDavid.Hollister@Sun.COM } \ 47510696SDavid.Hollister@Sun.COM mutex_enter(&cqti->cq_thr_lock); \ 47610696SDavid.Hollister@Sun.COM cv_signal(&cqti->cq_cv); \ 47710696SDavid.Hollister@Sun.COM mutex_exit(&cqti->cq_thr_lock); \ 47812343Sdavid.hollister@oracle.com } 47910696SDavid.Hollister@Sun.COM 48010696SDavid.Hollister@Sun.COM #define PMCS_CQ_RUN(hwp) \ 48110696SDavid.Hollister@Sun.COM mutex_enter(&hwp->cq_lock); \ 48210696SDavid.Hollister@Sun.COM PMCS_CQ_RUN_LOCKED(hwp); \ 48310696SDavid.Hollister@Sun.COM mutex_exit(&hwp->cq_lock); 48410696SDavid.Hollister@Sun.COM 48510696SDavid.Hollister@Sun.COM 48610696SDavid.Hollister@Sun.COM /* 48710696SDavid.Hollister@Sun.COM * Watchdog/SCSA timer definitions 48810696SDavid.Hollister@Sun.COM */ 48910696SDavid.Hollister@Sun.COM /* usecs to SCSA watchdog ticks */ 49010696SDavid.Hollister@Sun.COM #define US2WT(x) (x)/10 49110696SDavid.Hollister@Sun.COM 49210696SDavid.Hollister@Sun.COM /* 49310696SDavid.Hollister@Sun.COM * More misc 49410696SDavid.Hollister@Sun.COM */ 49510696SDavid.Hollister@Sun.COM #define BYTE0(x) (((x) >> 0) & 0xff) 49610696SDavid.Hollister@Sun.COM #define BYTE1(x) (((x) >> 8) & 0xff) 49710696SDavid.Hollister@Sun.COM #define BYTE2(x) (((x) >> 16) & 0xff) 49810696SDavid.Hollister@Sun.COM #define BYTE3(x) (((x) >> 24) & 0xff) 49910696SDavid.Hollister@Sun.COM #define BYTE4(x) (((x) >> 32) & 0xff) 50010696SDavid.Hollister@Sun.COM #define BYTE5(x) (((x) >> 40) & 0xff) 50110696SDavid.Hollister@Sun.COM #define BYTE6(x) (((x) >> 48) & 0xff) 50210696SDavid.Hollister@Sun.COM #define BYTE7(x) (((x) >> 56) & 0xff) 50310696SDavid.Hollister@Sun.COM #define WORD0(x) (((x) >> 0) & 0xffff) 50410696SDavid.Hollister@Sun.COM #define WORD1(x) (((x) >> 16) & 0xffff) 50510696SDavid.Hollister@Sun.COM #define WORD2(x) (((x) >> 32) & 0xffff) 50610696SDavid.Hollister@Sun.COM #define WORD3(x) (((x) >> 48) & 0xffff) 50710696SDavid.Hollister@Sun.COM #define DWORD0(x) ((uint32_t)(x)) 50810696SDavid.Hollister@Sun.COM #define DWORD1(x) ((uint32_t)(((uint64_t)x) >> 32)) 50910696SDavid.Hollister@Sun.COM 51010696SDavid.Hollister@Sun.COM #define SAS_ADDR_FMT "0x%02x%02x%02x%02x%02x%02x%02x%02x" 51110696SDavid.Hollister@Sun.COM #define SAS_ADDR_PRT(x) x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7] 51210696SDavid.Hollister@Sun.COM 51310696SDavid.Hollister@Sun.COM #define PMCS_VALID_LINK_RATE(r) \ 51410696SDavid.Hollister@Sun.COM ((r == SAS_LINK_RATE_1_5GBIT) || (r == SAS_LINK_RATE_3GBIT) || \ 51510696SDavid.Hollister@Sun.COM (r == SAS_LINK_RATE_6GBIT)) 51610696SDavid.Hollister@Sun.COM 51710696SDavid.Hollister@Sun.COM /* 51810696SDavid.Hollister@Sun.COM * This is here to avoid inclusion of <sys/ctype.h> which is not lint clean. 51910696SDavid.Hollister@Sun.COM */ 52010696SDavid.Hollister@Sun.COM #define HEXDIGIT(x) (((x) >= '0' && (x) <= '9') || \ 52110696SDavid.Hollister@Sun.COM ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F')) 52210696SDavid.Hollister@Sun.COM 52312120SDavid.Hollister@Sun.COM #define NSECS_PER_SEC 1000000000UL 52412120SDavid.Hollister@Sun.COM 52510696SDavid.Hollister@Sun.COM 52610696SDavid.Hollister@Sun.COM typedef void (*pmcs_cb_t) (pmcs_hw_t *, pmcwork_t *, uint32_t *); 52710696SDavid.Hollister@Sun.COM 52810696SDavid.Hollister@Sun.COM /* 52910696SDavid.Hollister@Sun.COM * Defines and structure used for tracing/logging information 53010696SDavid.Hollister@Sun.COM */ 53110696SDavid.Hollister@Sun.COM 53210696SDavid.Hollister@Sun.COM #define PMCS_TBUF_ELEM_SIZE 120 53310696SDavid.Hollister@Sun.COM #define PMCS_TBUF_NUM_ELEMS_DEF 100000 53410696SDavid.Hollister@Sun.COM 53511048SDavid.Hollister@Sun.COM #define PMCS_TBUF_UA_MAX_SIZE 32 53610696SDavid.Hollister@Sun.COM typedef struct { 53711048SDavid.Hollister@Sun.COM /* Target-specific data */ 53811048SDavid.Hollister@Sun.COM uint16_t target_num; 53911048SDavid.Hollister@Sun.COM char target_ua[PMCS_TBUF_UA_MAX_SIZE]; 54011048SDavid.Hollister@Sun.COM /* PHY-specific data */ 54111048SDavid.Hollister@Sun.COM uint8_t phy_sas_address[8]; 54211048SDavid.Hollister@Sun.COM char phy_path[32]; 54311048SDavid.Hollister@Sun.COM pmcs_dtype_t phy_dtype; 54411048SDavid.Hollister@Sun.COM /* Log data */ 54510696SDavid.Hollister@Sun.COM timespec_t timestamp; 54612120SDavid.Hollister@Sun.COM uint64_t fw_timestamp; 54710696SDavid.Hollister@Sun.COM char buf[PMCS_TBUF_ELEM_SIZE]; 54810696SDavid.Hollister@Sun.COM } pmcs_tbuf_t; 54910696SDavid.Hollister@Sun.COM 55010696SDavid.Hollister@Sun.COM /* 55110696SDavid.Hollister@Sun.COM * Firmware event log header format 55210696SDavid.Hollister@Sun.COM */ 55310696SDavid.Hollister@Sun.COM typedef struct pmcs_fw_event_hdr_s { 55410696SDavid.Hollister@Sun.COM uint32_t fw_el_signature; 55510696SDavid.Hollister@Sun.COM uint32_t fw_el_entry_start_offset; 55610696SDavid.Hollister@Sun.COM uint32_t fw_el_rsvd1; 55710696SDavid.Hollister@Sun.COM uint32_t fw_el_buf_size; 55810696SDavid.Hollister@Sun.COM uint32_t fw_el_rsvd2; 55910696SDavid.Hollister@Sun.COM uint32_t fw_el_oldest_idx; 56010696SDavid.Hollister@Sun.COM uint32_t fw_el_latest_idx; 56110696SDavid.Hollister@Sun.COM uint32_t fw_el_entry_size; 56210696SDavid.Hollister@Sun.COM } pmcs_fw_event_hdr_t; 56310696SDavid.Hollister@Sun.COM 56412060SDavid.Hollister@Sun.COM /* 56512120SDavid.Hollister@Sun.COM * Firmware event log entry format 56612120SDavid.Hollister@Sun.COM */ 56712120SDavid.Hollister@Sun.COM typedef struct pmcs_fw_event_entry_s { 56812120SDavid.Hollister@Sun.COM uint32_t num_words : 3, 56912120SDavid.Hollister@Sun.COM reserved : 25, 57012120SDavid.Hollister@Sun.COM severity: 4; 57112120SDavid.Hollister@Sun.COM uint32_t ts_upper; 57212120SDavid.Hollister@Sun.COM uint32_t ts_lower; 57312120SDavid.Hollister@Sun.COM uint32_t seq_num; 57412120SDavid.Hollister@Sun.COM uint32_t logw0; 57512120SDavid.Hollister@Sun.COM uint32_t logw1; 57612120SDavid.Hollister@Sun.COM uint32_t logw2; 57712120SDavid.Hollister@Sun.COM uint32_t logw3; 57812120SDavid.Hollister@Sun.COM } pmcs_fw_event_entry_t; 57912120SDavid.Hollister@Sun.COM 58012120SDavid.Hollister@Sun.COM #define PMCS_FWLOG_TIMER_DIV 8 /* fw timer has 8ns granularity */ 58112120SDavid.Hollister@Sun.COM #define PMCS_FWLOG_AAP1_SIG 0x1234AAAA 58212120SDavid.Hollister@Sun.COM #define PMCS_FWLOG_IOP_SIG 0x5678CCCC 58312120SDavid.Hollister@Sun.COM 58412120SDavid.Hollister@Sun.COM /* 58512060SDavid.Hollister@Sun.COM * Receptacle information 58612060SDavid.Hollister@Sun.COM */ 58712060SDavid.Hollister@Sun.COM #define PMCS_NUM_RECEPTACLES 2 58812060SDavid.Hollister@Sun.COM 58912060SDavid.Hollister@Sun.COM #define PMCS_RECEPT_LABEL_0 "SAS0" 59012060SDavid.Hollister@Sun.COM #define PMCS_RECEPT_LABEL_1 "SAS1" 59112060SDavid.Hollister@Sun.COM 59212120SDavid.Hollister@Sun.COM #define PMCS_RECEPT_PM_0 "f0" 59312120SDavid.Hollister@Sun.COM #define PMCS_RECEPT_PM_1 "f" 59412060SDavid.Hollister@Sun.COM 59510696SDavid.Hollister@Sun.COM #ifdef __cplusplus 59610696SDavid.Hollister@Sun.COM } 59710696SDavid.Hollister@Sun.COM #endif 59810696SDavid.Hollister@Sun.COM #endif /* _PMCS_DEF_H */ 599