1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SATA_HBA_H 28 #define _SATA_HBA_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include <sys/sata/sata_defs.h> 35 36 /* 37 * SATA Host Bus Adapter (HBA) driver transport definitions 38 */ 39 40 #include <sys/types.h> 41 42 #ifndef TRUE 43 #define TRUE 1 44 #define FALSE 0 45 #endif 46 47 #define SATA_SUCCESS 0 48 #define SATA_RETRY 1 49 #define SATA_FAILURE -1 50 51 52 /* SATA Framework definitions */ 53 54 #define SATA_MAX_CPORTS 32 /* Max number of controller ports */ 55 /* Multiplier (PMult) */ 56 #define SATA_MAX_PMPORTS 16 /* Maximum number of ports on PMult */ 57 #define SATA_PMULT_HOSTPORT 0xf /* Port Multiplier host port number */ 58 59 60 /* 61 * SATA device address 62 * Address qualifier flags are used to specify what is addressed (device 63 * or port) and where (controller or port multiplier data port). 64 */ 65 struct sata_address { 66 uint8_t cport; /* Controller's SATA port number */ 67 uint8_t pmport; /* Port Multiplier SATA port number */ 68 uint8_t qual; /* Address Qualifier flags */ 69 uint8_t pad; /* Reserved */ 70 }; 71 72 typedef struct sata_address sata_address_t; 73 74 /* 75 * SATA address Qualifier flags (in qual field of sata_address struct). 76 * They are mutually exclusive. 77 */ 78 79 #define SATA_ADDR_NULL 0x00 /* No address */ 80 #define SATA_ADDR_DCPORT 0x01 /* Device attched to controller port */ 81 #define SATA_ADDR_DPMPORT 0x02 /* Device attched to PM device port */ 82 #define SATA_ADDR_CPORT 0x04 /* Controller's device port */ 83 #define SATA_ADDR_PMPORT 0x08 /* Port Multiplier's device port */ 84 #define SATA_ADDR_CNTRL 0x10 /* Controller */ 85 #define SATA_ADDR_PMULT 0x20 /* Port Multiplier */ 86 #define SATA_ADDR_PMULT_SPEC 0x40 /* Port Multiplier Specific */ 87 88 /* 89 * SATA port status and control register block. 90 * The sstatus, serror, scontrol, sactive and snotific 91 * are the copies of the SATA port status and control registers. 92 * (Port SStatus, SError, SControl, SActive and SNotification are 93 * defined by Serial ATA r1.0a sepc and Serial ATA II spec. 94 */ 95 96 struct sata_port_scr 97 { 98 uint32_t sstatus; /* Port SStatus register */ 99 uint32_t serror; /* Port SError register */ 100 uint32_t scontrol; /* Port SControl register */ 101 uint32_t sactive; /* Port SActive register */ 102 uint32_t snotific; /* Port SNotification register */ 103 }; 104 105 typedef struct sata_port_scr sata_port_scr_t; 106 107 /* 108 * SATA Port Multiplier general status and control register block. 109 * The gscr0, gscr1, gscr2 are the copyies of the register on port multiplier. 110 * GSCR[0], GSCR[1], GSCR[2] are defined in SATA defined by Port Multiplier 111 * 1.0/1.1/1.2 spec. 112 */ 113 struct sata_pmult_gscr { 114 uint32_t gscr0; /* Product Identifier register */ 115 uint32_t gscr1; /* Resrved Information register */ 116 uint32_t gscr2; /* Port Information register */ 117 uint32_t gscr64; /* Feature register */ 118 uint32_t resv[4]; /* Reseved */ 119 }; 120 121 typedef struct sata_pmult_gscr sata_pmult_gscr_t; 122 123 /* 124 * SATA Device Structure (rev 1) 125 * Used to request/return state of the controller, port, port multiplier 126 * or an attached drive: 127 * The satadev_addr.cport, satadev_addr.pmport and satadev_addr.qual 128 * fields are used to specify SATA address (see sata_address structure 129 * description). 130 * The satadev_scr structure is used to pass the content of a port 131 * status and control registers. 132 * The satadev_add_info field is used by SATA HBA driver to return an 133 * additional information, which type depends on the function using 134 * sata_device as argument. For example: 135 * - in case of sata_tran_probe_port() this field should contain 136 * a number of available Port Multiplier device ports; 137 * - in case of sata_hba_event_notify() this field may contain 138 * a value specific for a reported event. 139 */ 140 #define SATA_DEVICE_REV_1 1 141 #define SATA_DEVICE_REV SATA_DEVICE_REV_1 142 143 struct sata_device 144 { 145 int satadev_rev; /* structure version */ 146 struct sata_address satadev_addr; /* sata port/device address */ 147 uint32_t satadev_state; /* Port or device state */ 148 uint32_t satadev_type; /* Attached device type */ 149 struct sata_port_scr satadev_scr; /* Port status and ctrl regs */ 150 uint32_t satadev_add_info; /* additional information, */ 151 /* function specific */ 152 }; 153 154 typedef struct sata_device sata_device_t; 155 156 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_device)) 157 158 159 /* 160 * satadev_state field of sata_device structure. 161 * Common flags specifying current state of a port or an attached drive. 162 * These states are mutually exclusive, obviously 163 */ 164 #define SATA_STATE_UNKNOWN 0x000000 165 #define SATA_STATE_READY 0x000010 166 167 /* 168 * Attached drive specific states (satadev_state field of the sata_device 169 * structure). 170 * SATA_DSTATE_PWR_ACTIVE, SATA_DSTATE_PWR_IDLE and SATA_DSTATE_PWR_STANDBY 171 * are mutually exclusive. All other states may be combined with each other 172 * and with one of the power states. 173 * These flags may be used only if the address qualifier (satadev_addr.qual) is 174 * set to SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT value. 175 */ 176 177 #define SATA_DSTATE_PWR_ACTIVE 0x000100 178 #define SATA_DSTATE_PWR_IDLE 0x000200 179 #define SATA_DSTATE_PWR_STANDBY 0x000400 180 #define SATA_DSTATE_RESET 0x001000 181 #define SATA_DSTATE_PMULT_INIT 0x002000 182 #define SATA_DSTATE_FAILED 0x008000 183 184 /* Mask for drive power states */ 185 #define SATA_DSTATE_PWR (SATA_DSTATE_PWR_ACTIVE | \ 186 SATA_DSTATE_PWR_IDLE | \ 187 SATA_DSTATE_PWR_STANDBY) 188 /* 189 * SATA Port specific states (satadev_state field of sata_device structure). 190 * SATA_PSTATE_PWRON and SATA_PSTATE_PWROFF are mutually exclusive. 191 * All other states may be combined with each other and with one of the power 192 * level state. 193 * These flags may be used only if the address qualifier (satadev_addr.qual) is 194 * set to SATA_ADDR_CPORT or SATA_ADDR_PMPORT value. 195 */ 196 197 #define SATA_PSTATE_PWRON 0x010000 198 #define SATA_PSTATE_PWROFF 0X020000 199 #define SATA_PSTATE_SHUTDOWN 0x040000 200 #define SATA_PSTATE_FAILED 0x080000 201 202 /* Mask for the valid port-specific state flags */ 203 #define SATA_PSTATE_VALID (SATA_PSTATE_PWRON | \ 204 SATA_PSTATE_PWROFF | \ 205 SATA_PSTATE_SHUTDOWN | \ 206 SATA_PSTATE_FAILED) 207 208 /* Mask for a port power states */ 209 #define SATA_PSTATE_PWR (SATA_PSTATE_PWRON | \ 210 SATA_PSTATE_PWROFF) 211 /* 212 * Device type (in satadev_type field of sata_device structure). 213 * More device types may be added in the future. 214 */ 215 216 #define SATA_DTYPE_NONE 0x00 /* No device attached */ 217 #define SATA_DTYPE_ATADISK 0x01 /* ATA disk */ 218 #define SATA_DTYPE_ATAPI 0x40 /* ATAPI device */ 219 #define SATA_DTYPE_ATAPICD \ 220 (SATA_DTYPE_ATAPI|0x02) /* ATAPI CD/DVD device */ 221 #define SATA_DTYPE_ATAPITAPE \ 222 (SATA_DTYPE_ATAPI|0x04) /* ATAPI tape */ 223 #define SATA_DTYPE_ATAPIDISK \ 224 (SATA_DTYPE_ATAPI|0x08) /* ATAPI disk */ 225 #define SATA_DTYPE_PMULT 0x10 /* Port Multiplier */ 226 #define SATA_DTYPE_UNKNOWN 0x20 /* Device attached, unkown */ 227 228 229 /* 230 * SATA cmd structure (rev 1) 231 * 232 * SATA HBA framework always sets all fields except status_reg and error_reg. 233 * SATA HBA driver action depends on the addressing type specified by 234 * addr_type field: 235 * If LBA48 addressing is indicated, SATA HBA driver has to load values from 236 * satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg, 237 * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg 238 * to appropriate registers prior to loading other registers. 239 * For other addressing modes, SATA HBA driver should skip loading values 240 * from satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg, 241 * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg 242 * fields and load only remaining field values to corresponding registers. 243 * 244 * satacmd_sec_count_msb and satamcd_sec_count_lsb values are loaded into 245 * sec_count register, satacmd_sec_count_msb loaded first (if LBA48 246 * addressing is used). 247 * satacmd_lba_low_msb and satacmd_lba_low_lsb values are loaded into the 248 * lba_low register, satacmd_lba_low_msb loaded first (if LBA48 addressing 249 * is used). The lba_low register is the newer name for the old 250 * sector_number register. 251 * satacmd_lba_mid_msb and satacmd_lba_mid_lsb values are loaded into lba_mid 252 * register, satacmd_lba_mid_msb loaded first (if LBA48 addressing is used). 253 * The lba_mid register is the newer name for the old cylinder_low register. 254 * satacmd_lba_high_msb and satacmd_lba_high_lsb values are loaded into 255 * the lba_high regster, satacmd_lba_high_msb loaded first (if LBA48 256 * addressing is used). The lba_high register is a newer name for the old 257 * cylinder_high register. 258 * 259 * No addressing mode is selected when an ata command does not involve actual 260 * reading/writing data from/to the media (for example IDENTIFY DEVICE or 261 * SET FEATURE command), or the ATAPI PACKET command is sent. 262 * If ATAPI PACKET command is sent and tagged commands are used, 263 * SATA HBA driver has to provide and manage a tag value and 264 * set it into the sector_count register. 265 * 266 * Device Control register is not specified in sata_cmd structure - SATA HBA 267 * driver shall set it accordingly to current mode of operation (interrupt 268 * enable/disable). 269 * 270 * Buffer structure's b_flags should be used to determine the 271 * address type of b_un.b_addr. However, there is no need to allocate DMA 272 * resources for the buffer in SATA HBA driver. 273 * DMA resources for a buffer structure are allocated by the SATA HBA 274 * framework. Scatter/gather list is to be used only for DMA transfers 275 * and it should be based on the DMA cookies list. 276 * 277 * Upon completion of a command, SATA HBA driver has to update 278 * satacmd_status_reg and satacmd_error_reg to reflect the contents of 279 * the corresponding device status and error registers. 280 * If the command completed successfully, satacmd_flags.sata_copy_xxx flags 281 * specify what register fields should be updated in sata_cmd structure. 282 * If the command completed with error, SATA HBA driver has to update 283 * satacmd_sec_count_msb, satacmd_sec_count_lsb, satacmd_lba_low_msb, 284 * satacmd_lba_low_lsb, satacmd_lba_mid_msb, satacmd_lba_mid_lsb, 285 * satacmd_lba_high_msb and satacmd_lba_high_lsb to values read from the 286 * corresponding device registers. 287 * If an operation could not complete because of the port error, the 288 * sata_pkt.satapkt_device.satadev_scr structure has to be updated. 289 * 290 * If ATAPI PACKET command was sent and command completed with error, 291 * rqsense structure has to be filed by SATA HBA driver. The satacmd_arq_cdb 292 * points to pre-set request sense cdb that may be used for issuing request 293 * sense data from the device. 294 * 295 * The sata_max_queue_depth field specifies the maximum allowable queue depth 296 * minus one, i.e. for maximum queue depth of 32, sata_max_queue_depth would 297 * be set to value 0x1f. 298 * If FPDMA-type command was sent and command completed with error, the HBA 299 * driver may use pre-set command READ LOG EXTENDED command pointed to 300 * by satacmd_rle_sata_cmd field to retrieve error data from a device. 301 * Only ATA register fields of the sata_cmd are set-up for that purpose. 302 * 303 * If the READ MULTIPLIER command was specified in cmd_reg (command directed 304 * to a port multiplier host port rather then to an attached device), 305 * upon the command completion SATA HBA driver has to update_sector count 306 * and lba fields of the sata_cmd structure to values returned via 307 * command block registers (task file registers). 308 */ 309 #define SATA_CMD_REV_1 1 310 #define SATA_CMD_REV_2 2 311 #define SATA_CMD_REV_3 3 312 #define SATA_CMD_REV SATA_CMD_REV_3 313 314 #define SATA_ATAPI_MAX_CDB_LEN 16 /* Covers both 12 and 16 byte cdbs */ 315 #define SATA_ATAPI_RQSENSE_LEN 24 /* Allocated Request Sense data */ 316 #define SATA_ATAPI_MIN_RQSENSE_LEN 18 /* Min Fixed size Request Sense data */ 317 #define SATA_ATAPI_RQSENSE_CDB_LEN 6 /* Request Sense CDB length */ 318 319 #define SATA_MAX_QUEUE_DEPTH 32 /* Default max queue depth */ 320 321 struct sata_cmd { 322 int satacmd_rev; /* version */ 323 struct buf *satacmd_bp; /* ptr to buffer structure */ 324 struct sata_cmd_flags { 325 uint32_t sata_data_direction : 3; /* 0-2 */ 326 uint32_t : 1; /* reserved */ /* 3 */ 327 uint32_t sata_queue_stag : 1; /* 4 */ 328 uint32_t sata_queue_otag : 1; /* 5 */ 329 uint32_t : 2; /* reserved */ /* 6-7 */ 330 uint32_t sata_queued : 1; /* 8 */ 331 uint32_t : 3; /* reserved */ /* 9-11 */ 332 uint32_t sata_ignore_dev_reset : 1; /* 12 */ 333 uint32_t sata_clear_dev_reset : 1; /* 13 */ 334 uint32_t : 2; /* reserved */ /* 14-15 */ 335 uint32_t sata_special_regs : 1; /* 16 */ 336 uint32_t sata_copy_out_sec_count_msb : 1; /* 17 */ 337 uint32_t sata_copy_out_lba_low_msb : 1; /* 18 */ 338 uint32_t sata_copy_out_lba_mid_msb : 1; /* 19 */ 339 uint32_t sata_copy_out_lba_high_msb : 1; /* 20 */ 340 uint32_t sata_copy_out_sec_count_lsb : 1; /* 21 */ 341 uint32_t sata_copy_out_lba_low_lsb : 1; /* 22 */ 342 uint32_t sata_copy_out_lba_mid_lsb : 1; /* 23 */ 343 uint32_t sata_copy_out_lba_high_lsb : 1; /* 24 */ 344 uint32_t sata_copy_out_device_reg : 1; /* 25 */ 345 uint32_t sata_copy_out_error_reg : 1; /* 26 */ 346 uint32_t sata_max_queue_depth: 5; /* 27-31 */ 347 } satacmd_flags; 348 uint8_t satacmd_addr_type; /* addr type: LBA28, LBA48 */ 349 uint8_t satacmd_features_reg_ext; /* features reg extended */ 350 uint8_t satacmd_sec_count_msb; /* sector count MSB (LBA48) */ 351 uint8_t satacmd_lba_low_msb; /* LBA Low MSB (LBA48) */ 352 uint8_t satacmd_lba_mid_msb; /* LBA Mid MSB (LBA48) */ 353 uint8_t satacmd_lba_high_msb; /* LBA High MSB (LBA48) */ 354 uint8_t satacmd_sec_count_lsb; /* sector count LSB */ 355 uint8_t satacmd_lba_low_lsb; /* LBA Low LSB */ 356 uint8_t satacmd_lba_mid_lsb; /* LBA Mid LSB */ 357 uint8_t satacmd_lba_high_lsb; /* LBA High LSB */ 358 uint8_t satacmd_device_reg; /* ATA dev reg & LBA28 MSB */ 359 uint8_t satacmd_cmd_reg; /* ata command code */ 360 uint8_t satacmd_features_reg; /* ATA features register */ 361 uint8_t satacmd_status_reg; /* ATA status register */ 362 uint8_t satacmd_error_reg; /* ATA error register */ 363 uint8_t satacmd_acdb_len; /* ATAPI cdb length */ 364 uint8_t satacmd_acdb[SATA_ATAPI_MAX_CDB_LEN]; /* ATAPI cdb */ 365 366 /* kept for binary compat. */ 367 uint8_t *pad1; /* unused */ 368 369 uint8_t satacmd_rqsense[SATA_ATAPI_RQSENSE_LEN]; 370 /* 371 * Error retrieval buffer 372 * dma handle pointer 373 * (for buffer DMA syncing) 374 * Valid only in error 375 * retrieval packet! 376 */ 377 ddi_dma_handle_t *satacmd_err_ret_buf_handle; 378 379 int satacmd_num_dma_cookies; /* number of dma cookies */ 380 /* ptr to dma cookie list */ 381 ddi_dma_cookie_t *satacmd_dma_cookie_list; 382 }; 383 384 typedef struct sata_cmd sata_cmd_t; 385 386 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_cmd)) 387 388 389 /* ATA address type (in satacmd_addr_type field */ 390 #define ATA_ADDR_LBA 0x1 391 #define ATA_ADDR_LBA28 0x2 392 #define ATA_ADDR_LBA48 0x4 393 394 /* 395 * satacmd_flags : contain data transfer direction flags, 396 * tagged queuing type flags, queued command flag, and reset state handling 397 * flag. 398 */ 399 400 /* 401 * Data transfer direction flags (satacmd_flags.sata_data_direction) 402 * Direction flags are mutually exclusive. 403 */ 404 #define SATA_DIR_NODATA_XFER 0x0001 /* No data transfer */ 405 #define SATA_DIR_READ 0x0002 /* Reading data from a device */ 406 #define SATA_DIR_WRITE 0x0004 /* Writing data to a device */ 407 408 /* 409 * Tagged Queuing type flags 410 * satacmd_flags.sata_queue_stag 411 * satacmd_flags.sata_queue_otag 412 * 413 * These flags indicate how the SATA command should be queued. 414 * 415 * sata_queue_stag 416 * Simple-queue-tagged command. It may be executed out-of-order in respect 417 * to other queued commands. 418 * sata_queue_otag 419 * Ordered-queue-tagged command. It cannot be executed out-of-order in 420 * respect to other commands, i.e. it should be executed in the order of 421 * being transported to the HBA. 422 * 423 * Translated head-of-queue-tagged scsi commands and commands that are 424 * to be put at the head of the queue are treated as sata_queue_otag 425 * tagged commands. 426 */ 427 428 429 /* 430 * Queuing command set-up flag (satacmd_flags.sata_queued). 431 * This flag indicates that sata_cmd was set-up for DMA Queued command 432 * (either READ_DMA_QUEUED, READ_DMA_QUEUED_EXT, WRITE_DMA_QUEUED or 433 * WRITE_DMA_QUEUED_EXT command) or one of the Native Command Queuing commands 434 * (either READ_FPDMA_QUEUED or WRITE_FPDMA_QUEUED). 435 * This flag will be used only if sata_tran_hba_flags indicates controller 436 * support for queuing and the device for which sata_cmd is prepared supports 437 * either legacy queuing (indicated by Device Identify data word 83 bit 2) 438 * or NCQ (indicated by word 76 of Device Identify data). 439 */ 440 441 /* 442 * Reset state handling 443 * satacmd_flags.sata_ignore_dev_reset 444 * satacmd_flags.sata_clear_dev_reset 445 * 446 * SATA HBA device enters reset state if the device was subjected to 447 * the Device Reset (may also enter this state if the device was reset 448 * as a side effect of port reset). SATA HBA driver sets this state. 449 * Device stays in this condition until explicit request from SATA HBA 450 * framework to clear the state. 451 */ 452 453 /* 454 * SATA Packet structure (rev 1) 455 * hba_driver_private is for a private use of the SATA HBA driver; 456 * satapkt_framework_private is used only by SATA HBA framework; 457 * satapkt_comp is a callback function to be called when packet 458 * execution is completed (for any reason) if mode of operation is not 459 * synchronous (SATA_OPMODE_SYNCH); 460 * satapkt_reason specifies why the packet operation was completed 461 * 462 * NOTE: after the packet completion callback SATA HBA driver should not 463 * attempt to access any sata_pkt fields because sata_pkt is not valid anymore 464 * (it could have been destroyed). 465 * Since satapkt_hba_driver_private field cannot be retrieved, any hba private 466 * data respources allocated per packet and accessed via this pointer should 467 * either be freed before the completion callback is done, or the pointer has 468 * to be saved by the HBA driver before the completion callback. 469 */ 470 #define SATA_PKT_REV_1 1 471 #define SATA_PKT_REV SATA_PKT_REV_1 472 473 struct sata_pkt { 474 int satapkt_rev; /* version */ 475 struct sata_device satapkt_device; /* Device address/type */ 476 477 /* HBA driver private data */ 478 void *satapkt_hba_driver_private; 479 480 /* SATA framework priv data */ 481 void *satapkt_framework_private; 482 483 /* Rqsted mode of operation */ 484 uint32_t satapkt_op_mode; 485 486 struct sata_cmd satapkt_cmd; /* composite sata command */ 487 int satapkt_time; /* time allotted to command */ 488 void (*satapkt_comp)(struct sata_pkt *); /* callback */ 489 int satapkt_reason; /* completion reason */ 490 }; 491 492 typedef struct sata_pkt sata_pkt_t; 493 494 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt)) 495 496 497 /* 498 * Operation mode flags (in satapkt_op_mode field of sata_pkt structure). 499 * Use to specify what should be a mode of operation for specified command. 500 * Default (000b) means use Interrupt and Asynchronous mode to 501 * perform an operation. 502 * Synchronous operation menas that the packet operation has to be completed 503 * before the function called to initiate the operation returns. 504 */ 505 #define SATA_OPMODE_INTERRUPTS 0 /* Use interrupts (hint) */ 506 #define SATA_OPMODE_POLLING 1 /* Use polling instead of interrupts */ 507 #define SATA_OPMODE_ASYNCH 0 /* Return immediately after accepting pkt */ 508 #define SATA_OPMODE_SYNCH 4 /* Perform synchronous operation */ 509 510 /* 511 * satapkt_reason values: 512 * 513 * SATA_PKT_QUEUE_FULL - cmd not sent because of queue full (detected 514 * by the controller). If a device reject command for this reason, it 515 * should be reported as SATA_PKT_DEV_ERROR 516 * 517 * SATA_PKT_CMD_NOT_SUPPORTED - command not supported by a controller 518 * Controller is unable to send such command to a device. 519 * If device rejects a command, it should be reported as 520 * SATA_PKT_DEV_ERROR. 521 * 522 * SATA_PKT_DEV_ERROR - cmd failed because of device reported an error. 523 * The content of status_reg (ERROR bit has to be set) and error_reg 524 * fields of the sata_cmd structure have to be set and will be used 525 * by SATA HBA Framework to determine the error cause. 526 * 527 * SATA_PKT_PORT_ERROR - cmd failed because of a link or a port error. 528 * Link failed / no communication with a device / communication error 529 * or other port related error was detected by a controller. 530 * sata_pkt.satapkt_device.satadev_scr.sXXXXXXX words have to be set. 531 * 532 * SATA_PKT_ABORTED - cmd execution was aborted by the request from the 533 * framework. Abort mechanism is HBA driver specific. 534 * 535 * SATA_PKT_TIMEOUT - cmd execution has timed-out. Timeout specified by 536 * pkt_time was exceeded. The command was terminated by the SATA HBA 537 * driver. 538 * 539 * SATA_PKT_COMPLETED - this is a value returned when an operation 540 * completes without errors. 541 * 542 * SATA_PKT_BUSY - packet was not accepted for execution because the 543 * driver was busy performing some other operation(s). 544 * 545 * SATA_PKT_RESET - packet execution was aborted because of device 546 * reset originated by either the HBA driver or the SATA framework. 547 * 548 */ 549 550 #define SATA_PKT_BUSY -1 /* Not completed, busy */ 551 #define SATA_PKT_COMPLETED 0 /* No error */ 552 #define SATA_PKT_DEV_ERROR 1 /* Device reported error */ 553 #define SATA_PKT_QUEUE_FULL 2 /* Not accepted, queue full */ 554 #define SATA_PKT_PORT_ERROR 3 /* Not completed, port error */ 555 #define SATA_PKT_CMD_UNSUPPORTED 4 /* Cmd unsupported */ 556 #define SATA_PKT_ABORTED 5 /* Aborted by request */ 557 #define SATA_PKT_TIMEOUT 6 /* Operation timeut */ 558 #define SATA_PKT_RESET 7 /* Aborted by reset request */ 559 560 /* 561 * Error retrieval sata packet types 562 */ 563 #define SATA_ERR_RETR_PKT_TYPE_NCQ 1 564 #define SATA_ERR_RETR_PKT_TYPE_ATAPI 2 565 566 /* 567 * Read/write port multiplier packet types 568 */ 569 #define SATA_RDWR_PMULT_PKT_TYPE_READ 1 570 #define SATA_RDWR_PMULT_PKT_TYPE_WRITE 2 571 572 /* 573 * Hoplug functions vector structure (rev 1) 574 */ 575 #define SATA_TRAN_HOTPLUG_OPS_REV_1 1 576 577 struct sata_tran_hotplug_ops { 578 int sata_tran_hotplug_ops_rev; /* version */ 579 int (*sata_tran_port_activate)(dev_info_t *, sata_device_t *); 580 int (*sata_tran_port_deactivate)(dev_info_t *, sata_device_t *); 581 }; 582 583 typedef struct sata_tran_hotplug_ops sata_tran_hotplug_ops_t; 584 585 586 /* 587 * Power management functions vector structure (rev 1) 588 * The embedded function returns information about the controller's 589 * power level. 590 * Additional functions may be added in the future without changes to 591 * sata_tran structure. 592 */ 593 #define SATA_TRAN_PWRMGT_OPS_REV_1 1 594 595 struct sata_tran_pwrmgt_ops { 596 int sata_tran_pwrmgt_ops_rev; /* version */ 597 int (*sata_tran_get_pwr_level)(dev_info_t *, sata_device_t *); 598 }; 599 600 typedef struct sata_tran_pwrmgt_ops sata_tran_pwrmgt_ops_t; 601 602 603 /* 604 * SATA port PHY Power Level 605 * These states correspond to the interface power management state as defined 606 * in Serial ATA spec. 607 */ 608 #define SATA_TRAN_PORTPWR_LEVEL1 1 /* Interface in active PM state */ 609 #define SATA_TRAN_PORTPWR_LEVEL2 2 /* Interface in PARTIAL PM state */ 610 #define SATA_TRAN_PORTPWR_LEVEL3 3 /* Interface in SLUMBER PM state */ 611 612 /* 613 * SATA HBA Tran structure (rev 1) 614 * Registered with SATA Framework 615 * 616 * dma_attr is a pointer to data (buffer) dma attibutes of the controller 617 * DMA engine. 618 * 619 * The qdepth field specifies number of commands that may be accepted by 620 * the controller. Value range 1-32. A value greater than 1 indicates that 621 * the controller supports queuing. Support for Native Command Queuing 622 * indicated by SATA_CTLF_NCQ flag also requires qdepth set to a value 623 * greater then 1. 624 * 625 */ 626 #define SATA_TRAN_HBA_REV_1 1 627 #define SATA_TRAN_HBA_REV_2 2 628 #define SATA_TRAN_HBA_REV_3 3 629 #define SATA_TRAN_HBA_REV SATA_TRAN_HBA_REV_3 630 631 struct sata_hba_tran { 632 int sata_tran_hba_rev; /* version */ 633 dev_info_t *sata_tran_hba_dip; /* Controler dev info */ 634 ddi_dma_attr_t *sata_tran_hba_dma_attr; /* DMA attributes */ 635 int sata_tran_hba_num_cports; /* Num of HBA device ports */ 636 uint16_t sata_tran_hba_features_support; /* HBA features */ 637 uint16_t sata_tran_hba_qdepth; /* HBA-supported queue depth */ 638 639 int (*sata_tran_probe_port)(dev_info_t *, sata_device_t *); 640 int (*sata_tran_start)(dev_info_t *, sata_pkt_t *); 641 int (*sata_tran_abort)(dev_info_t *, sata_pkt_t *, int); 642 int (*sata_tran_reset_dport)(dev_info_t *, 643 sata_device_t *); 644 int (*sata_tran_selftest)(dev_info_t *, sata_device_t *); 645 646 /* Hotplug vector */ 647 struct sata_tran_hotplug_ops *sata_tran_hotplug_ops; 648 649 /* Power mgt vector */ 650 struct sata_tran_pwrmgt_ops *sata_tran_pwrmgt_ops; 651 652 int (*sata_tran_ioctl)(dev_info_t *, int, intptr_t); 653 }; 654 655 typedef struct sata_hba_tran sata_hba_tran_t; 656 657 658 /* 659 * Controller's features support flags (sata_tran_hba_features_support). 660 * Note: SATA_CTLF_NCQ indicates that SATA controller supports NCQ in addition 661 * to legacy queuing commands, indicated by SATA_CTLF_QCMD flag. 662 */ 663 664 #define SATA_CTLF_ATAPI 0x001 /* ATAPI support */ 665 #define SATA_CTLF_PORT_MULTIPLIER 0x010 /* Port Multiplier suport */ 666 #define SATA_CTLF_HOTPLUG 0x020 /* Hotplug support */ 667 #define SATA_CTLF_ASN 0x040 /* Asynchronous Event Support */ 668 #define SATA_CTLF_QCMD 0x080 /* Queued commands support */ 669 #define SATA_CTLF_NCQ 0x100 /* NCQ support */ 670 #define SATA_CTLF_PMULT_FBS 0x200 /* FIS-based switching support */ 671 672 /* 673 * sata_tran_start() return values. 674 * When pkt is not accepted, the satapkt_reason has to be updated 675 * before function returns - it should reflect the same reason for not being 676 * executed as the return status of above functions. 677 * If pkt was accepted and executed synchronously, 678 * satapk_reason should indicate a completion status. 679 */ 680 #define SATA_TRAN_ACCEPTED 0 /* accepted */ 681 #define SATA_TRAN_QUEUE_FULL 1 /* not accepted, queue full */ 682 #define SATA_TRAN_PORT_ERROR 2 /* not accepted, port error */ 683 #define SATA_TRAN_CMD_UNSUPPORTED 3 /* not accepted, cmd not supported */ 684 #define SATA_TRAN_BUSY 4 /* not accepted, busy */ 685 686 687 /* 688 * sata_tran_abort() abort type flag 689 */ 690 #define SATA_ABORT_PACKET 0 691 #define SATA_ABORT_ALL_PACKETS 1 692 693 694 /* 695 * Events handled by SATA HBA Framework 696 * More then one event may be reported at the same time 697 * 698 * SATA_EVNT__DEVICE_ATTACHED 699 * HBA detected the presence of a device ( electrical connection with 700 * a device was detected ). 701 * 702 * SATA_EVNT_DEVICE_DETACHED 703 * HBA detected the detachment of a device (electrical connection with 704 * a device was broken) 705 * 706 * SATA_EVNT_LINK_LOST 707 * HBA lost link with an attached device 708 * 709 * SATA_EVNT_LINK_ESTABLISHED 710 * HBA established a link with an attached device 711 * 712 * SATA_EVNT_PORT_FAILED 713 * HBA has determined that the port failed and is unuseable 714 * 715 * SATA_EVENT_DEVICE_RESET 716 * SATA device was reset, causing loss of the device setting 717 * 718 * SATA_EVNT_PWR_LEVEL_CHANGED 719 * A port or entire SATA controller power level has changed 720 * 721 * SATA_EVNT_PMULT_LINK_CHANGED 722 * Port multiplier detect change on a link of its device port 723 * 724 */ 725 #define SATA_EVNT_DEVICE_ATTACHED 0x01 726 #define SATA_EVNT_DEVICE_DETACHED 0x02 727 #define SATA_EVNT_LINK_LOST 0x04 728 #define SATA_EVNT_LINK_ESTABLISHED 0x08 729 #define SATA_EVNT_PORT_FAILED 0x10 730 #define SATA_EVNT_DEVICE_RESET 0x20 731 #define SATA_EVNT_PWR_LEVEL_CHANGED 0x40 732 #define SATA_EVNT_PMULT_LINK_CHANGED 0x80 733 734 /* 735 * SATA Framework interface entry points 736 */ 737 int sata_hba_init(struct modlinkage *); 738 int sata_hba_attach(dev_info_t *, sata_hba_tran_t *, ddi_attach_cmd_t); 739 int sata_hba_detach(dev_info_t *, ddi_detach_cmd_t); 740 void sata_hba_fini(struct modlinkage *); 741 void sata_hba_event_notify(dev_info_t *, sata_device_t *, int); 742 sata_pkt_t *sata_get_error_retrieval_pkt(dev_info_t *, sata_device_t *, int); 743 void sata_free_error_retrieval_pkt(sata_pkt_t *); 744 sata_pkt_t *sata_get_rdwr_pmult_pkt(dev_info_t *, sata_device_t *, uint8_t, 745 uint32_t, uint32_t); 746 void sata_free_rdwr_pmult_pkt(sata_pkt_t *); 747 void sata_register_pmult(dev_info_t *, sata_device_t *, sata_pmult_gscr_t *); 748 void sata_free_dma_resources(sata_pkt_t *); 749 750 /* 751 * SATA trace ring buffer constants 752 */ 753 #define DMSG_RING_SIZE 0x100000 /* 1MB */ 754 #define DMSG_BUF_SIZE 256 755 756 /* 757 * SATA trace ring buffer content 758 */ 759 typedef struct sata_trace_dmsg { 760 dev_info_t *dip; 761 timespec_t timestamp; 762 char buf[DMSG_BUF_SIZE]; 763 struct sata_trace_dmsg *next; 764 } sata_trace_dmsg_t; 765 766 /* 767 * SATA trace ring buffer header 768 */ 769 typedef struct sata_trace_rbuf { 770 kmutex_t lock; /* lock to avoid clutter */ 771 int looped; /* completed ring */ 772 int allocfailed; /* dmsg mem alloc failed */ 773 size_t size; /* current size */ 774 size_t maxsize; /* max size */ 775 sata_trace_dmsg_t *dmsgh; /* messages head */ 776 sata_trace_dmsg_t *dmsgp; /* ptr to last message */ 777 } sata_trace_rbuf_t; 778 779 /* 780 * SATA trace ring buffer interfaces 781 */ 782 void sata_trace_debug(dev_info_t *, const char *fmt, ...); 783 void sata_vtrace_debug(dev_info_t *, const char *fmt, va_list); 784 785 #ifdef __cplusplus 786 } 787 #endif 788 789 #endif /* _SATA_HBA_H */ 790