166f9d5cbSmlf /* 266f9d5cbSmlf * CDDL HEADER START 366f9d5cbSmlf * 466f9d5cbSmlf * The contents of this file are subject to the terms of the 566f9d5cbSmlf * Common Development and Distribution License (the "License"). 666f9d5cbSmlf * You may not use this file except in compliance with the License. 766f9d5cbSmlf * 866f9d5cbSmlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 966f9d5cbSmlf * or http://www.opensolaris.org/os/licensing. 1066f9d5cbSmlf * See the License for the specific language governing permissions 1166f9d5cbSmlf * and limitations under the License. 1266f9d5cbSmlf * 1366f9d5cbSmlf * When distributing Covered Code, include this CDDL HEADER in each 1466f9d5cbSmlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1566f9d5cbSmlf * If applicable, add the following below this CDDL HEADER, with the 1666f9d5cbSmlf * fields enclosed by brackets "[]" replaced with your own identifying 1766f9d5cbSmlf * information: Portions Copyright [yyyy] [name of copyright owner] 1866f9d5cbSmlf * 1966f9d5cbSmlf * CDDL HEADER END 2066f9d5cbSmlf */ 2166f9d5cbSmlf 2266f9d5cbSmlf /* 23fcacecd0SPhi Tran * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 24257c04ecSMarcel Telka * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 258b35e523SJerry Jelinek * Copyright 2019 Joyent, Inc. 26*fa2ae296SJason King * Copyright 2024 RackTop Systems, Inc. 2766f9d5cbSmlf */ 2866f9d5cbSmlf 2966f9d5cbSmlf #ifndef _SATA_DEFS_H 3066f9d5cbSmlf #define _SATA_DEFS_H 3166f9d5cbSmlf 3266f9d5cbSmlf #ifdef __cplusplus 3366f9d5cbSmlf extern "C" { 3466f9d5cbSmlf #endif 3566f9d5cbSmlf 36b8b2574eSls24207 #include <sys/scsi/generic/mode.h> 37b8b2574eSls24207 3866f9d5cbSmlf /* 3966f9d5cbSmlf * Common ATA commands (subset) 4066f9d5cbSmlf */ 4166f9d5cbSmlf #define SATAC_DIAG 0x90 /* diagnose command */ 4266f9d5cbSmlf #define SATAC_RECAL 0x10 /* restore cmd, 4 bits step rate */ 4366f9d5cbSmlf #define SATAC_FORMAT 0x50 /* format track command */ 4466f9d5cbSmlf #define SATAC_SET_FEATURES 0xef /* set features */ 4566f9d5cbSmlf #define SATAC_IDLE_IM 0xe1 /* idle immediate */ 4666f9d5cbSmlf #define SATAC_STANDBY_IM 0xe0 /* standby immediate */ 4766f9d5cbSmlf #define SATAC_DOOR_LOCK 0xde /* door lock */ 4866f9d5cbSmlf #define SATAC_DOOR_UNLOCK 0xdf /* door unlock */ 4966f9d5cbSmlf #define SATAC_IDLE 0xe3 /* idle */ 502ee4dfc7SJane Chu #define SATAC_STANDBY 0xe2 /* standby */ 5166f9d5cbSmlf 5266f9d5cbSmlf /* 5366f9d5cbSmlf * ATA/ATAPI disk commands (subset) 5466f9d5cbSmlf */ 55fcacecd0SPhi Tran #define SATAC_DSM 0x06 /* Data Set Management */ 5666f9d5cbSmlf #define SATAC_DEVICE_RESET 0x08 /* ATAPI device reset */ 57a022fe3eSls24207 #define SATAC_DOWNLOAD_MICROCODE 0x92 /* Download microcode */ 5866f9d5cbSmlf #define SATAC_EJECT 0xed /* media eject */ 5966f9d5cbSmlf #define SATAC_FLUSH_CACHE 0xe7 /* flush write-cache */ 6066f9d5cbSmlf #define SATAC_ID_DEVICE 0xec /* IDENTIFY DEVICE */ 6166f9d5cbSmlf #define SATAC_ID_PACKET_DEVICE 0xa1 /* ATAPI identify packet device */ 6266f9d5cbSmlf #define SATAC_INIT_DEVPARMS 0x91 /* initialize device parameters */ 6366f9d5cbSmlf #define SATAC_PACKET 0xa0 /* ATAPI packet */ 6466f9d5cbSmlf #define SATAC_RDMULT 0xc4 /* read multiple w/DMA */ 6566f9d5cbSmlf #define SATAC_RDSEC 0x20 /* read sector */ 6666f9d5cbSmlf #define SATAC_RDVER 0x40 /* read verify */ 6766f9d5cbSmlf #define SATAC_READ_DMA 0xc8 /* read DMA */ 6866f9d5cbSmlf #define SATAC_SEEK 0x70 /* seek */ 6966f9d5cbSmlf #define SATAC_SERVICE 0xa2 /* queued/overlap service */ 7066f9d5cbSmlf #define SATAC_SETMULT 0xc6 /* set multiple mode */ 7166f9d5cbSmlf #define SATAC_WRITE_DMA 0xca /* write (multiple) w/DMA */ 7266f9d5cbSmlf #define SATAC_WRMULT 0xc5 /* write multiple */ 7366f9d5cbSmlf #define SATAC_WRSEC 0x30 /* write sector */ 7466f9d5cbSmlf #define SATAC_RDSEC_EXT 0x24 /* read sector extended (LBA48) */ 7566f9d5cbSmlf #define SATAC_READ_DMA_EXT 0x25 /* read DMA extended (LBA48) */ 7666f9d5cbSmlf #define SATAC_RDMULT_EXT 0x29 /* read multiple extended (LBA48) */ 7766f9d5cbSmlf #define SATAC_WRSEC_EXT 0x34 /* read sector extended (LBA48) */ 7866f9d5cbSmlf #define SATAC_WRITE_DMA_EXT 0x35 /* read DMA extended (LBA48) */ 7966f9d5cbSmlf #define SATAC_WRMULT_EXT 0x39 /* read multiple extended (LBA48) */ 8066f9d5cbSmlf 8166f9d5cbSmlf #define SATAC_READ_DMA_QUEUED 0xc7 /* read DMA / may be queued */ 8266f9d5cbSmlf #define SATAC_READ_DMA_QUEUED_EXT 0x26 /* read DMA ext / may be queued */ 8366f9d5cbSmlf #define SATAC_WRITE_DMA_QUEUED 0xcc /* read DMA / may be queued */ 8466f9d5cbSmlf #define SATAC_WRITE_DMA_QUEUED_EXT 0x36 /* read DMA ext / may be queued */ 8566f9d5cbSmlf #define SATAC_READ_PM_REG 0xe4 /* read port mult reg */ 8666f9d5cbSmlf #define SATAC_WRITE_PM_REG 0xe8 /* write port mult reg */ 8766f9d5cbSmlf 8866f9d5cbSmlf #define SATAC_READ_FPDMA_QUEUED 0x60 /* First-Party-DMA read queued */ 8966f9d5cbSmlf #define SATAC_WRITE_FPDMA_QUEUED 0x61 /* First-Party-DMA write queued */ 9066f9d5cbSmlf 9166f9d5cbSmlf #define SATAC_READ_LOG_EXT 0x2f /* read log */ 92c03acfcaSls24207 93c03acfcaSls24207 #define SATAC_SMART 0xb0 /* SMART */ 94c03acfcaSls24207 9566f9d5cbSmlf #define SATA_LOG_PAGE_10 0x10 /* log page 0x10 - SATA error */ 9666f9d5cbSmlf /* 978aa6aadbSXiao-Yu Zhang * Port Multiplier Commands 988aa6aadbSXiao-Yu Zhang */ 998aa6aadbSXiao-Yu Zhang #define SATAC_READ_PORTMULT 0xe4 /* read port multiplier */ 1008aa6aadbSXiao-Yu Zhang #define SATAC_WRITE_PORTMULT 0xe8 /* write port multiplier */ 1018aa6aadbSXiao-Yu Zhang 1028aa6aadbSXiao-Yu Zhang /* 10366f9d5cbSmlf * Power Managment Commands (subset) 10466f9d5cbSmlf */ 10566f9d5cbSmlf #define SATAC_CHECK_POWER_MODE 0xe5 /* check power mode */ 10666f9d5cbSmlf 10766f9d5cbSmlf #define SATA_PWRMODE_STANDBY 0 /* standby mode */ 10866f9d5cbSmlf #define SATA_PWRMODE_IDLE 0x80 /* idle mode */ 1092ee4dfc7SJane Chu #define SATA_PWRMODE_ACTIVE_SPINDOWN 0x40 /* PM0 and spinning down */ 1102ee4dfc7SJane Chu #define SATA_PWRMODE_ACTIVE_SPINUP 0x41 /* PM0 and spinning up */ 1112ee4dfc7SJane Chu #define SATA_PWRMODE_ACTIVE 0xFF /* active or idle mode */ 11266f9d5cbSmlf 11366f9d5cbSmlf 11466f9d5cbSmlf /* 115c03acfcaSls24207 * SMART FEATURES Subcommands 116c03acfcaSls24207 */ 117c03acfcaSls24207 #define SATA_SMART_READ_DATA 0xd0 118c03acfcaSls24207 #define SATA_SMART_ATTR_AUTOSAVE 0xd2 119c03acfcaSls24207 #define SATA_SMART_EXECUTE_OFFLINE_IMM 0xd4 120c03acfcaSls24207 #define SATA_SMART_READ_LOG 0xd5 121c03acfcaSls24207 #define SATA_SMART_WRITE_LOG 0xd6 122c03acfcaSls24207 #define SATA_SMART_ENABLE_OPS 0xd8 123c03acfcaSls24207 #define SATA_SMART_DISABLE_OPS 0xd9 124c03acfcaSls24207 #define SATA_SMART_RETURN_STATUS 0xda 125c03acfcaSls24207 126c03acfcaSls24207 /* 12766f9d5cbSmlf * SET FEATURES Subcommands 12866f9d5cbSmlf */ 12966f9d5cbSmlf #define SATAC_SF_ENABLE_WRITE_CACHE 0x02 13066f9d5cbSmlf #define SATAC_SF_TRANSFER_MODE 0x03 1312038334aSUnknown #define SATAC_SF_DISABLE_RMSN 0x31 132b8b2574eSls24207 #define SATAC_SF_ENABLE_ACOUSTIC 0x42 13366f9d5cbSmlf #define SATAC_SF_DISABLE_READ_AHEAD 0x55 13466f9d5cbSmlf #define SATAC_SF_DISABLE_WRITE_CACHE 0x82 13566f9d5cbSmlf #define SATAC_SF_ENABLE_READ_AHEAD 0xaa 136b8b2574eSls24207 #define SATAC_SF_DISABLE_ACOUSTIC 0xc2 1372038334aSUnknown #define SATAC_SF_ENABLE_RMSN 0x95 13866f9d5cbSmlf 13966f9d5cbSmlf /* 14066f9d5cbSmlf * SET FEATURES transfer mode values 14166f9d5cbSmlf */ 14266f9d5cbSmlf #define SATAC_TRANSFER_MODE_PIO_DEFAULT 0x00 14366f9d5cbSmlf #define SATAC_TRANSFER_MODE_PIO_DISABLE_IODRY 0x01 14466f9d5cbSmlf #define SATAC_TRANSFER_MODE_PIO_FLOW_CONTROL 0x08 14566f9d5cbSmlf #define SATAC_TRANSFER_MODE_MULTI_WORD_DMA 0x20 14666f9d5cbSmlf #define SATAC_TRANSFER_MODE_ULTRA_DMA 0x40 14766f9d5cbSmlf 148a022fe3eSls24207 /* 149a022fe3eSls24207 * Download microcode subcommands 150a022fe3eSls24207 */ 151a022fe3eSls24207 #define SATA_DOWNLOAD_MCODE_TEMP 1 /* Revert on/ reset/pwr cycle */ 152a022fe3eSls24207 #define SATA_DOWNLOAD_MCODE_SAVE 7 /* No offset, keep mcode */ 153a022fe3eSls24207 154a022fe3eSls24207 15566f9d5cbSmlf /* Generic ATA definitions */ 15666f9d5cbSmlf 157489f952bSls24207 #define SATA_TAG_QUEUING_SHIFT 3 15837a077efSls24207 #define SATA_TAG_QUEUING_MASK 0x1f 15966f9d5cbSmlf /* 16066f9d5cbSmlf * Identify Device data 1612038334aSUnknown * Although both ATA and ATAPI devices' Identify Data have the same length, 16266f9d5cbSmlf * some words have different meaning/content and/or are irrelevant for 16366f9d5cbSmlf * other type of device. 16466f9d5cbSmlf * Following is the ATA Device Identify data layout 16566f9d5cbSmlf */ 16666f9d5cbSmlf typedef struct sata_id { 16766f9d5cbSmlf /* WORD */ 16866f9d5cbSmlf /* OFFSET COMMENT */ 16966f9d5cbSmlf ushort_t ai_config; /* 0 general configuration bits */ 17066f9d5cbSmlf ushort_t ai_fixcyls; /* 1 # of cylinders (obsolete) */ 17166f9d5cbSmlf ushort_t ai_resv0; /* 2 # reserved */ 17266f9d5cbSmlf ushort_t ai_heads; /* 3 # of heads (obsolete) */ 17366f9d5cbSmlf ushort_t ai_trksiz; /* 4 # of bytes/track (retired) */ 17466f9d5cbSmlf ushort_t ai_secsiz; /* 5 # of bytes/sector (retired) */ 17566f9d5cbSmlf ushort_t ai_sectors; /* 6 # of sectors/track (obsolete) */ 17666f9d5cbSmlf ushort_t ai_resv1[3]; /* 7 "Vendor Unique" */ 17766f9d5cbSmlf char ai_drvser[20]; /* 10 Serial number */ 17866f9d5cbSmlf ushort_t ai_buftype; /* 20 Buffer type */ 17966f9d5cbSmlf ushort_t ai_bufsz; /* 21 Buffer size in 512 byte incr */ 18066f9d5cbSmlf ushort_t ai_ecc; /* 22 # of ecc bytes avail on rd/wr */ 18166f9d5cbSmlf char ai_fw[8]; /* 23 Firmware revision */ 18266f9d5cbSmlf char ai_model[40]; /* 27 Model # */ 18366f9d5cbSmlf ushort_t ai_mult1; /* 47 Multiple command flags */ 18466f9d5cbSmlf ushort_t ai_dwcap; /* 48 Doubleword capabilities */ 18566f9d5cbSmlf ushort_t ai_cap; /* 49 Capabilities */ 18666f9d5cbSmlf ushort_t ai_resv2; /* 50 Reserved */ 18766f9d5cbSmlf ushort_t ai_piomode; /* 51 PIO timing mode */ 18866f9d5cbSmlf ushort_t ai_dmamode; /* 52 DMA timing mode */ 18966f9d5cbSmlf ushort_t ai_validinfo; /* 53 bit0: wds 54-58, bit1: 64-70 */ 19066f9d5cbSmlf ushort_t ai_curcyls; /* 54 # of current cylinders */ 19166f9d5cbSmlf ushort_t ai_curheads; /* 55 # of current heads */ 19266f9d5cbSmlf ushort_t ai_cursectrk; /* 56 # of current sectors/track */ 19366f9d5cbSmlf ushort_t ai_cursccp[2]; /* 57 current sectors capacity */ 19466f9d5cbSmlf ushort_t ai_mult2; /* 59 multiple sectors info */ 19566f9d5cbSmlf ushort_t ai_addrsec[2]; /* 60 LBA only: no of addr secs */ 1962038334aSUnknown ushort_t ai_dirdma; /* 62 valid in ATA/ATAPI7, DMADIR */ 1972038334aSUnknown ushort_t ai_dworddma; /* 63 multi word dma modes */ 19866f9d5cbSmlf ushort_t ai_advpiomode; /* 64 advanced PIO modes supported */ 19966f9d5cbSmlf ushort_t ai_minmwdma; /* 65 min multi-word dma cycle info */ 20066f9d5cbSmlf ushort_t ai_recmwdma; /* 66 rec multi-word dma cycle info */ 20166f9d5cbSmlf ushort_t ai_minpio; /* 67 min PIO cycle info */ 20266f9d5cbSmlf ushort_t ai_minpioflow; /* 68 min PIO cycle info w/flow ctl */ 203fcacecd0SPhi Tran ushort_t ai_addsupported; /* 69 additional supported */ 204fcacecd0SPhi Tran ushort_t ai_resv3; /* 70 reserved */ 20566f9d5cbSmlf ushort_t ai_typtime[2]; /* 71-72 timing */ 20666f9d5cbSmlf ushort_t ai_resv4[2]; /* 73-74 reserved */ 20766f9d5cbSmlf ushort_t ai_qdepth; /* 75 queue depth */ 20866f9d5cbSmlf ushort_t ai_satacap; /* 76 SATA capabilities */ 20966f9d5cbSmlf ushort_t ai_resv5; /* 77 reserved */ 21066f9d5cbSmlf ushort_t ai_satafsup; /* 78 SATA features supported */ 21166f9d5cbSmlf ushort_t ai_satafenbl; /* 79 SATA features enabled */ 21266f9d5cbSmlf ushort_t ai_majorversion; /* 80 major versions supported */ 21366f9d5cbSmlf ushort_t ai_minorversion; /* 81 minor version number supported */ 21466f9d5cbSmlf ushort_t ai_cmdset82; /* 82 command set supported */ 21566f9d5cbSmlf ushort_t ai_cmdset83; /* 83 more command sets supported */ 21666f9d5cbSmlf ushort_t ai_cmdset84; /* 84 more command sets supported */ 21766f9d5cbSmlf ushort_t ai_features85; /* 85 enabled features */ 21866f9d5cbSmlf ushort_t ai_features86; /* 86 enabled features */ 21966f9d5cbSmlf ushort_t ai_features87; /* 87 enabled features */ 22066f9d5cbSmlf ushort_t ai_ultradma; /* 88 Ultra DMA mode */ 22166f9d5cbSmlf ushort_t ai_erasetime; /* 89 security erase time */ 22266f9d5cbSmlf ushort_t ai_erasetimex; /* 90 enhanced security erase time */ 223c03acfcaSls24207 ushort_t ai_adv_pwr_mgmt; /* 91 advanced power management time */ 224c03acfcaSls24207 ushort_t ai_master_pwd; /* 92 master password revision code */ 225c03acfcaSls24207 ushort_t ai_hrdwre_reset; /* 93 hardware reset result */ 226c03acfcaSls24207 ushort_t ai_acoustic; /* 94 accoustic management values */ 227c03acfcaSls24207 ushort_t ai_stream_min_sz; /* 95 stream minimum request size */ 228c03acfcaSls24207 ushort_t ai_stream_xfer_d; /* 96 streaming transfer time (DMA) */ 229c03acfcaSls24207 ushort_t ai_stream_lat; /* 97 streaming access latency */ 230c03acfcaSls24207 ushort_t ai_streamperf[2]; /* 98-99 streaming performance gran. */ 23166f9d5cbSmlf ushort_t ai_addrsecxt[4]; /* 100 extended max LBA sector */ 232c03acfcaSls24207 ushort_t ai_stream_xfer_p; /* 104 streaming transfer time (PIO) */ 233fcacecd0SPhi Tran ushort_t ai_maxcount; /* 105 max count of 512-byte blocks of */ 234fcacecd0SPhi Tran /* LBA range entries */ 235c03acfcaSls24207 ushort_t ai_phys_sect_sz; /* 106 physical sector size */ 236c03acfcaSls24207 ushort_t ai_seek_delay; /* 107 inter-seek delay time (usecs) */ 237c03acfcaSls24207 ushort_t ai_naa_ieee_oui; /* 108 NAA/IEEE OUI */ 238c03acfcaSls24207 ushort_t ai_ieee_oui_uid; /* 109 IEEE OUT/unique id */ 239c03acfcaSls24207 ushort_t ai_uid_mid; /* 110 unique id (mid) */ 240c03acfcaSls24207 ushort_t ai_uid_low; /* 111 unique id (low) */ 241c03acfcaSls24207 ushort_t ai_resv_wwn[4]; /* 112-115 reserved for WWN ext. */ 242c03acfcaSls24207 ushort_t ai_incits; /* 116 reserved for INCITS TR-37-2004 */ 243c03acfcaSls24207 ushort_t ai_words_lsec[2]; /* 117-118 words per logical sector */ 244c03acfcaSls24207 ushort_t ai_cmdset119; /* 119 more command sets supported */ 245c03acfcaSls24207 ushort_t ai_features120; /* 120 enabled features */ 246fcacecd0SPhi Tran ushort_t ai_padding1[6]; /* pad to 126 */ 247c03acfcaSls24207 ushort_t ai_rmsn; /* 127 removable media notification */ 24866f9d5cbSmlf ushort_t ai_securestatus; /* 128 security status */ 24966f9d5cbSmlf ushort_t ai_vendor[31]; /* 129-159 vendor specific */ 250fcacecd0SPhi Tran ushort_t ai_padding2[8]; /* 160 pad to 168 */ 2517063fd1bSPhi Tran ushort_t ai_nomformfactor; /* 168 nominal form factor */ 252fcacecd0SPhi Tran ushort_t ai_dsm; /* 169 data set management */ 253fcacecd0SPhi Tran ushort_t ai_padding3[6]; /* 170 pad to 176 */ 254c03acfcaSls24207 ushort_t ai_curmedser[30]; /* 176-205 current media serial # */ 255c03acfcaSls24207 ushort_t ai_sctsupport; /* 206 SCT command transport */ 256fcacecd0SPhi Tran ushort_t ai_padding4[10]; /* 207 pad to 217 */ 2577063fd1bSPhi Tran ushort_t ai_medrotrate; /* 217 nominal media rotation rate */ 258fcacecd0SPhi Tran ushort_t ai_padding5[37]; /* 218 pad to 255 */ 25966f9d5cbSmlf ushort_t ai_integrity; /* 255 integrity word */ 26066f9d5cbSmlf } sata_id_t; 26166f9d5cbSmlf 26266f9d5cbSmlf 26366f9d5cbSmlf /* Identify Device: general config bits - word 0 */ 26466f9d5cbSmlf 26566f9d5cbSmlf #define SATA_ATA_TYPE_MASK 0x8001 /* ATA Device type mask */ 26666f9d5cbSmlf #define SATA_ATA_TYPE 0x0000 /* ATA device */ 26766f9d5cbSmlf #define SATA_REM_MEDIA 0x0080 /* Removable media */ 268789ba267Spawelw #define SATA_INCOMPLETE_DATA 0x0004 /* Incomplete Identify Device data */ 2692ce278ebSying tian - Beijing China #define SATA_CFA_TYPE 0x848a /* CFA feature set device */ 27066f9d5cbSmlf 27166f9d5cbSmlf #define SATA_ID_SERIAL_OFFSET 10 27266f9d5cbSmlf #define SATA_ID_SERIAL_LEN 20 27366f9d5cbSmlf #define SATA_ID_MODEL_OFFSET 27 27466f9d5cbSmlf #define SATA_ID_MODEL_LEN 40 275184cd04cScth #define SATA_ID_FW_LEN 8 2767063fd1bSPhi Tran #define SATA_ID_BDC_LEN 0x3c 277d996f1b8SPhi Tran #define SATA_ID_ATA_INFO_LEN 0x238 27866f9d5cbSmlf 27966f9d5cbSmlf /* Identify Device: common capability bits - word 49 */ 28066f9d5cbSmlf 28166f9d5cbSmlf #define SATA_DMA_SUPPORT 0x0100 28266f9d5cbSmlf #define SATA_LBA_SUPPORT 0x0200 28366f9d5cbSmlf #define SATA_IORDY_DISABLE 0x0400 28466f9d5cbSmlf #define SATA_IORDY_SUPPORT 0x0800 28566f9d5cbSmlf #define SATA_STANDBYTIMER 0x2000 28666f9d5cbSmlf 28766f9d5cbSmlf /* Identify Device: ai_validinfo (word 53) */ 28866f9d5cbSmlf 28966f9d5cbSmlf #define SATA_VALIDINFO_88 0x0004 /* word 88 supported fields valid */ 2902038334aSUnknown #define SATA_VALIDINFO_70_64 0x0004 /* words 70-64 fields valid */ 29166f9d5cbSmlf 292fcacecd0SPhi Tran /* Identify Device: ai_addsupported (word 69) */ 293fcacecd0SPhi Tran 294fcacecd0SPhi Tran #define SATA_DETERMINISTIC_READ 0x4000 /* word 69 deterministic read supp. */ 295fcacecd0SPhi Tran #define SATA_READ_ZERO 0x0020 /* word 69 read zero after TRIM supp. */ 296fcacecd0SPhi Tran 29766f9d5cbSmlf /* Identify Device: ai_majorversion (word 80) */ 29866f9d5cbSmlf 2992038334aSUnknown #define SATA_MAJVER_7 0x0080 /* ATA/ATAPI-7 version supported */ 3002038334aSUnknown #define SATA_MAJVER_654 0x0070 /* ATA/ATAPI-6,5 or 4 ver supported */ 30166f9d5cbSmlf #define SATA_MAJVER_6 0x0040 /* ATA/ATAPI-6 version supported */ 3022038334aSUnknown #define SATA_MAJVER_5 0x0020 /* ATA/ATAPI-7 version supported */ 30366f9d5cbSmlf #define SATA_MAJVER_4 0x0010 /* ATA/ATAPI-4 version supported */ 30466f9d5cbSmlf 30566f9d5cbSmlf /* Identify Device: command set supported/enabled bits - words 83 and 86 */ 30666f9d5cbSmlf 30766f9d5cbSmlf #define SATA_EXT48 0x0400 /* 48 bit address feature */ 3082038334aSUnknown #define SATA_PWRUP_IN_STANDBY 0x0020 /* Power-up in standby mode supp/en */ 3092038334aSUnknown #define SATA_RM_STATUS_NOTIFIC 0x0010 /* Removable Media Stat Notification */ 31066f9d5cbSmlf #define SATA_RW_DMA_QUEUED_CMD 0x0002 /* R/W DMA Queued supported */ 31166f9d5cbSmlf #define SATA_DWNLOAD_MCODE_CMD 0x0001 /* Download Microcode CMD supp/enbld */ 312b8b2574eSls24207 #define SATA_ACOUSTIC_MGMT 0x0200 /* Acoustic Management features */ 31366f9d5cbSmlf 31466f9d5cbSmlf /* Identify Device: command set supported/enabled bits - words 82 and 85 */ 31566f9d5cbSmlf 316c03acfcaSls24207 #define SATA_SMART_SUPPORTED 0x0001 /* SMART feature set is supported */ 31766f9d5cbSmlf #define SATA_WRITE_CACHE 0x0020 /* Write Cache supported/enabled */ 31866f9d5cbSmlf #define SATA_LOOK_AHEAD 0x0040 /* Look Ahead supported/enabled */ 31966f9d5cbSmlf #define SATA_DEVICE_RESET_CMD 0x0200 /* Device Reset CMD supported/enbld */ 32066f9d5cbSmlf #define SATA_READ_BUFFER_CMD 0x2000 /* Read Buffer CMD supported/enbld */ 32166f9d5cbSmlf #define SATA_WRITE_BUFFER_CMD 0x1000 /* Write Buffer CMD supported/enbld */ 322c03acfcaSls24207 #define SATA_SMART_ENABLED 0x0001 /* SMART feature set is enabled */ 323c03acfcaSls24207 324c03acfcaSls24207 /* Identify Device: command set supported/enabled bits - words 84 & 87 */ 325c03acfcaSls24207 #define SATA_SMART_SELF_TEST_SUPPORTED 0x0002 /* SMART self-test supported */ 3262ee4dfc7SJane Chu /* IDLE IMMEDIATE with UNLOAD FEATURE supported */ 3272ee4dfc7SJane Chu #define SATA_IDLE_UNLOAD_SUPPORTED 0x2000 328*fa2ae296SJason King #define SATA_GPL_SUPPORTED 0x0020 /* General Purpose Logging supported */ 32966f9d5cbSmlf 3300bc523e5SAlan Perry /* Identify Device: physical sector size - word 106 */ 3310bc523e5SAlan Perry #define SATA_L2PS_CHECK_BIT 0x4000 /* Set when this word valid */ 3320bc523e5SAlan Perry #define SATA_L2PS_HAS_MULT 0x2000 /* Multiple logical sectors per phys */ 3330bc523e5SAlan Perry #define SATA_L2PS_BIG_SECTORS 0x1000 /* Logical sector size > 512 */ 3340bc523e5SAlan Perry #define SATA_L2PS_EXP_MASK 0x000f /* Logical sectors per phys exponent */ 3350bc523e5SAlan Perry 3362038334aSUnknown /* Identify (Packet) Device word 63, ATA/ATAPI-6 & 7 */ 33766f9d5cbSmlf #define SATA_MDMA_SEL_MASK 0x0700 /* Multiword DMA selected */ 33866f9d5cbSmlf #define SATA_MDMA_2_SEL 0x0400 /* Multiword DMA mode 2 selected */ 33966f9d5cbSmlf #define SATA_MDMA_1_SEL 0x0200 /* Multiword DMA mode 1 selected */ 34066f9d5cbSmlf #define SATA_MDMA_0_SEL 0x0100 /* Multiword DMA mode 0 selected */ 34166f9d5cbSmlf #define SATA_MDMA_2_SUP 0x0004 /* Multiword DMA mode 2 supported */ 34266f9d5cbSmlf #define SATA_MDMA_1_SUP 0x0002 /* Multiword DMA mode 1 supported */ 34366f9d5cbSmlf #define SATA_MDMA_0_SUP 0x0001 /* Multiword DMA mode 0 supported */ 3442038334aSUnknown #define SATA_MDMA_SUP_MASK 0x0007 /* Multiword DMA supported */ 3452038334aSUnknown 3462038334aSUnknown /* Identify (Packet) Device Word 88 */ 3472038334aSUnknown #define SATA_UDMA_SUP_MASK 0x007f /* UDMA modes supported */ 3482038334aSUnknown #define SATA_UDMA_SEL_MASK 0x7f00 /* UDMA modes selected */ 34966f9d5cbSmlf 3508b35e523SJerry Jelinek /* Data Set Management: word 169 */ 3518b35e523SJerry Jelinek #define SATA_DSM_TRIM 0x0001 /* Set when TRIM is supported */ 3528b35e523SJerry Jelinek 353c03acfcaSls24207 /* Identify Device: command set supported/enabled bits - word 206 */ 354c03acfcaSls24207 355c03acfcaSls24207 /* All are SCT Command Transport support */ 356c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_SUP 0x0001 /* anything */ 357c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_LNG_SECT_SUP 0x0002 /* Long Sector Access */ 358c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_WR_SAME_SUP 0x0004 /* Write Same */ 359c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_ERR_RCOV_SUP 0x0008 /* Error Recovery Control */ 360c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_FEAT_CTL_SUP 0x0010 /* Features Control */ 361c03acfcaSls24207 #define SATA_SCT_CMD_TRANS_DATA_TBL_SUP 0x0020 /* Data Tables supported */ 362c03acfcaSls24207 36366f9d5cbSmlf #define SATA_DISK_SECTOR_SIZE 512 /* HD physical sector size */ 36466f9d5cbSmlf 36566f9d5cbSmlf /* Identify Packet Device data definitions (ATAPI devices) */ 36666f9d5cbSmlf 36766f9d5cbSmlf /* Identify Packet Device: general config bits - word 0 */ 36866f9d5cbSmlf 36966f9d5cbSmlf #define SATA_ATAPI_TYPE_MASK 0xc000 37066f9d5cbSmlf #define SATA_ATAPI_TYPE 0x8000 /* ATAPI device */ 37166f9d5cbSmlf #define SATA_ATAPI_ID_PKT_SZ 0x0003 /* Packet size mask */ 37266f9d5cbSmlf #define SATA_ATAPI_ID_PKT_12B 0x0000 /* Packet size 12 bytes */ 37366f9d5cbSmlf #define SATA_ATAPI_ID_PKT_16B 0x0001 /* Packet size 16 bytes */ 37466f9d5cbSmlf #define SATA_ATAPI_ID_DRQ_TYPE 0x0060 /* DRQ asserted in 3ms after pkt */ 37566f9d5cbSmlf #define SATA_ATAPI_ID_DRQ_INTR 0x0020 /* Obsolete in ATA/ATAPI 7 */ 37666f9d5cbSmlf 377257c04ecSMarcel Telka #define SATA_ATAPI_ID_DEV_TYPE 0x1f00 /* device type/command set mask */ 37866f9d5cbSmlf #define SATA_ATAPI_ID_DEV_SHFT 8 37966f9d5cbSmlf #define SATA_ATAPI_DIRACC_DEV 0x0000 /* Direct Access device */ 38066f9d5cbSmlf #define SATA_ATAPI_SQACC_DEV 0x0100 /* Sequential access dev (tape ?) */ 381257c04ecSMarcel Telka #define SATA_ATAPI_PROC_DEV 0x0300 /* Processor device */ 38266f9d5cbSmlf #define SATA_ATAPI_CDROM_DEV 0x0500 /* CD_ROM device */ 38366f9d5cbSmlf 38466f9d5cbSmlf /* 38566f9d5cbSmlf * Status bits from ATAPI Interrupt reason register (AT_COUNT) register 38666f9d5cbSmlf */ 38766f9d5cbSmlf #define SATA_ATAPI_I_COD 0x01 /* Command or Data */ 38866f9d5cbSmlf #define SATA_ATAPI_I_IO 0x02 /* IO direction */ 38966f9d5cbSmlf #define SATA_ATAPI_I_RELEASE 0x04 /* Release for ATAPI overlap */ 39066f9d5cbSmlf 39166f9d5cbSmlf /* ATAPI feature reg definitions */ 39266f9d5cbSmlf 3932038334aSUnknown #define SATA_ATAPI_F_DATA_DIR_READ 0x04 /* DMA transfer to the host */ 3942038334aSUnknown #define SATA_ATAPI_F_OVERLAP 0x02 /* Not used by Sun drivers */ 3952038334aSUnknown #define SATA_ATAPI_F_DMA 0x01 /* Packet DMA command */ 39666f9d5cbSmlf 39766f9d5cbSmlf 3982038334aSUnknown /* ATAPI IDENTIFY_DRIVE capabilities word (49) */ 3992038334aSUnknown 4002038334aSUnknown #define SATA_ATAPI_ID_CAP_DMA 0x0100 /* if zero, check word 62 */ 4012038334aSUnknown #define SATA_ATAPI_ID_CAP_OVERLAP 0x2000 4022038334aSUnknown 40366f9d5cbSmlf /* 4042038334aSUnknown * ATAPI Identify Packet Device word 62 4052038334aSUnknown * Word 62 is not valid for ATA/ATAPI-6 4062038334aSUnknown * Defs below are for ATA/ATAPI-7 40766f9d5cbSmlf */ 4082038334aSUnknown #define SATA_ATAPI_ID_DMADIR_REQ 0x8000 /* DMA direction required */ 4092038334aSUnknown #define SATA_ATAPI_ID_DMA_SUP 0x0400 /* DMA is supported */ 41066f9d5cbSmlf 41166f9d5cbSmlf /* 41266f9d5cbSmlf * ATAPI signature bits 41366f9d5cbSmlf */ 41466f9d5cbSmlf #define SATA_ATAPI_SIG_HI 0xeb /* in high cylinder register */ 41566f9d5cbSmlf #define SATA_ATAPI_SIG_LO 0x14 /* in low cylinder register */ 41666f9d5cbSmlf 41766f9d5cbSmlf /* These values are pre-set for CD_ROM/DVD ? */ 41866f9d5cbSmlf 41966f9d5cbSmlf #define SATA_ATAPI_SECTOR_SIZE 2048 42066f9d5cbSmlf #define SATA_ATAPI_MAX_BYTES_PER_DRQ 0xf800 /* 16 bits - 2KB ie 62KB */ 42166f9d5cbSmlf #define SATA_ATAPI_HEADS 64 42266f9d5cbSmlf #define SATA_ATAPI_SECTORS_PER_TRK 32 42366f9d5cbSmlf 42466f9d5cbSmlf /* SATA Capabilites bits (word 76) */ 42566f9d5cbSmlf 42666f9d5cbSmlf #define SATA_NCQ 0x100 42713c8743eSMarcel Telka #define SATA_3_SPEED 0x008 42866f9d5cbSmlf #define SATA_2_SPEED 0x004 42966f9d5cbSmlf #define SATA_1_SPEED 0x002 43066f9d5cbSmlf 43166f9d5cbSmlf /* SATA Features Supported (word 78) - not used */ 43266f9d5cbSmlf 43366f9d5cbSmlf /* SATA Features Enabled (word 79) - not used */ 43466f9d5cbSmlf 4357095af19Sying tian - Beijing China #define SATA_READ_AHEAD_SUPPORTED(x) ((x).ai_cmdset82 & SATA_LOOK_AHEAD) 4367095af19Sying tian - Beijing China #define SATA_READ_AHEAD_ENABLED(x) ((x).ai_features85 & SATA_LOOK_AHEAD) 4377095af19Sying tian - Beijing China #define SATA_WRITE_CACHE_SUPPORTED(x) ((x).ai_cmdset82 & SATA_WRITE_CACHE) 4387095af19Sying tian - Beijing China #define SATA_WRITE_CACHE_ENABLED(x) ((x).ai_features85 & SATA_WRITE_CACHE) 4397095af19Sying tian - Beijing China #define SATA_RM_NOTIFIC_SUPPORTED(x) \ 4407095af19Sying tian - Beijing China ((x).ai_cmdset83 & SATA_RM_STATUS_NOTIFIC) 4417095af19Sying tian - Beijing China #define SATA_RM_NOTIFIC_ENABLED(x) \ 4427095af19Sying tian - Beijing China ((x).ai_features86 & SATA_RM_STATUS_NOTIFIC) 4437095af19Sying tian - Beijing China 44466f9d5cbSmlf /* 4454e540238Sls24207 * Generic NCQ related defines 4464e540238Sls24207 */ 4474e540238Sls24207 4484e540238Sls24207 #define NQ 0x80 /* Not a queued cmd - tag not valid */ 4494e540238Sls24207 #define NCQ_TAG_MASK 0x1f /* NCQ command tag mask */ 4504e540238Sls24207 #define FIS_TYPE_REG_H2D 0x27 /* Reg FIS - Host to Device */ 4514e540238Sls24207 #define FIS_CMD_UPDATE 0x80 4524e540238Sls24207 /* 45366f9d5cbSmlf * Status bits from AT_STATUS register 45466f9d5cbSmlf */ 45566f9d5cbSmlf #define SATA_STATUS_BSY 0x80 /* controller busy */ 45666f9d5cbSmlf #define SATA_STATUS_DRDY 0x40 /* drive ready */ 45766f9d5cbSmlf #define SATA_STATUS_DF 0x20 /* device fault */ 45866f9d5cbSmlf #define SATA_STATUS_DSC 0x10 /* seek operation complete */ 45966f9d5cbSmlf #define SATA_STATUS_DRQ 0x08 /* data request */ 46066f9d5cbSmlf #define SATA_STATUS_CORR 0x04 /* obsolete */ 46166f9d5cbSmlf #define SATA_STATUS_IDX 0x02 /* obsolete */ 46266f9d5cbSmlf #define SATA_STATUS_ERR 0x01 /* error flag */ 46366f9d5cbSmlf 46466f9d5cbSmlf /* 46566f9d5cbSmlf * Status bits from AT_ERROR register 46666f9d5cbSmlf */ 46766f9d5cbSmlf #define SATA_ERROR_ICRC 0x80 /* CRC data transfer error detected */ 46866f9d5cbSmlf #define SATA_ERROR_UNC 0x40 /* uncorrectable data error */ 46966f9d5cbSmlf #define SATA_ERROR_MC 0x20 /* Media change */ 47066f9d5cbSmlf #define SATA_ERROR_IDNF 0x10 /* ID/Address not found */ 47166f9d5cbSmlf #define SATA_ERROR_MCR 0x08 /* media change request */ 47266f9d5cbSmlf #define SATA_ERROR_ABORT 0x04 /* aborted command */ 47366f9d5cbSmlf #define SATA_ERROR_NM 0x02 /* no media */ 47466f9d5cbSmlf #define SATA_ERROR_EOM 0x02 /* end of media (Packet cmds) */ 47566f9d5cbSmlf #define SATA_ERROR_ILI 0x01 /* cmd sepcific */ 47666f9d5cbSmlf 477c03acfcaSls24207 478c03acfcaSls24207 /* 479c03acfcaSls24207 * Bits from the device control register 480c03acfcaSls24207 */ 481c03acfcaSls24207 #define SATA_DEVCTL_NIEN 0x02 /* not interrupt enabled */ 482c03acfcaSls24207 #define SATA_DEVCTL_SRST 0x04 /* software reset */ 483c03acfcaSls24207 #define SATA_DEVCTL_HOB 0x80 /* high order bit */ 484c03acfcaSls24207 48566f9d5cbSmlf /* device_reg */ 48666f9d5cbSmlf #define SATA_ADH_LBA 0x40 /* addressing in LBA mode not chs */ 48766f9d5cbSmlf 4882038334aSUnknown /* ATAPI transport version-in Inquiry data */ 4892038334aSUnknown #define SATA_ATAPI_TRANS_VERSION(inq) \ 4902038334aSUnknown (*((uint8_t *)(inq) + 3) >> 4) 491c03acfcaSls24207 492c03acfcaSls24207 #define SCSI_LOG_PAGE_HDR_LEN 4 /* # bytes of a SCSI log page header */ 493c03acfcaSls24207 #define SCSI_LOG_PARAM_HDR_LEN 4 /* # byttes of a SCSI log param hdr */ 494c03acfcaSls24207 495c03acfcaSls24207 /* Number of log entries per extended selftest log block */ 496c03acfcaSls24207 #define ENTRIES_PER_EXT_SELFTEST_LOG_BLK 19 497c03acfcaSls24207 498c03acfcaSls24207 /* Number of entries per SCSI LOG SENSE SELFTEST RESULTS page */ 499c03acfcaSls24207 #define SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS 20 500c03acfcaSls24207 501c03acfcaSls24207 /* Length of a SCSI LOG SENSE SELFTEST RESULTS parameter */ 502c03acfcaSls24207 #define SCSI_LOG_SENSE_SELFTEST_PARAM_LEN 0x10 503c03acfcaSls24207 504c03acfcaSls24207 #define DIAGNOSTIC_FAILURE_ON_COMPONENT 0x40 505c03acfcaSls24207 506c03acfcaSls24207 #define SCSI_COMPONENT_81 0x81 507c03acfcaSls24207 #define SCSI_COMPONENT_82 0x82 508c03acfcaSls24207 #define SCSI_COMPONENT_83 0x83 509c03acfcaSls24207 #define SCSI_COMPONENT_84 0x84 510c03acfcaSls24207 #define SCSI_COMPONENT_85 0x85 511c03acfcaSls24207 #define SCSI_COMPONENT_86 0x86 512c03acfcaSls24207 #define SCSI_COMPONENT_87 0x87 513c03acfcaSls24207 #define SCSI_COMPONENT_88 0x88 514c03acfcaSls24207 515c03acfcaSls24207 #define SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED 0x67 516c03acfcaSls24207 #define SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED 0x0b 517c03acfcaSls24207 518c03acfcaSls24207 #define SCSI_PREDICTED_FAILURE 0x5d 519c03acfcaSls24207 #define SCSI_GENERAL_HD_FAILURE 0x10 520c03acfcaSls24207 521489f952bSls24207 #define SCSI_INFO_EXCEPTIONS_PARAM_LEN 4 522c03acfcaSls24207 523*fa2ae296SJason King #define READ_LOG_EXT_LOG_DIRECTORY 0x00 524*fa2ae296SJason King #define DEVICE_STATS_LOG 0x04 525*fa2ae296SJason King #define DEVSTAT_GENERAL_STATS 0x01 526*fa2ae296SJason King #define DEVSTAT_ROTATING_MEDIA_PAGE 0x03 527*fa2ae296SJason King #define DEVSTAT_GENERAL_ERRORS_PAGE 0x04 528*fa2ae296SJason King #define DEVSTAT_TEMP_PAGE 0x05 529*fa2ae296SJason King #define DEVSTAT_SSD_PAGE 0x07 530*fa2ae296SJason King #define SMART_SELFTEST_LOG_PAGE 0x06 531*fa2ae296SJason King #define EXT_SMART_SELFTEST_LOG_PAGE 0x07 53237a077efSls24207 #define READ_LOG_EXT_NCQ_ERROR_RECOVERY 0x10 533*fa2ae296SJason King 534*fa2ae296SJason King 535*fa2ae296SJason King #define SATA_STAT_SUPPORTED(x) ((x) & (1ULL << 63)) 536*fa2ae296SJason King #define SATA_STAT_VALID(x) ((x) & (1ULL << 62)) 537*fa2ae296SJason King #define SATA_STAT_VALUE(x) ((x) & ((1ULL << 59) - 1)) 53837a077efSls24207 53937a077efSls24207 /* 54037a077efSls24207 * SATA NCQ error recovery page (0x10) 54137a077efSls24207 */ 54237a077efSls24207 struct sata_ncq_error_recovery_page { 54337a077efSls24207 uint8_t ncq_tag; 54437a077efSls24207 uint8_t reserved1; 54537a077efSls24207 uint8_t ncq_status; 54637a077efSls24207 uint8_t ncq_error; 54737a077efSls24207 uint8_t ncq_sector_number; 54837a077efSls24207 uint8_t ncq_cyl_low; 54937a077efSls24207 uint8_t ncq_cyl_high; 55037a077efSls24207 uint8_t ncq_dev_head; 55137a077efSls24207 uint8_t ncq_sector_number_ext; 55237a077efSls24207 uint8_t ncq_cyl_low_ext; 55337a077efSls24207 uint8_t ncq_cyl_high_ext; 55437a077efSls24207 uint8_t reserved2; 55537a077efSls24207 uint8_t ncq_sector_count; 55637a077efSls24207 uint8_t ncq_sector_count_ext; 55737a077efSls24207 uint8_t reserved3[242]; 55837a077efSls24207 uint8_t ncq_vendor_unique[255]; 55937a077efSls24207 uint8_t ncq_checksum; 56037a077efSls24207 }; 56137a077efSls24207 5622ee4dfc7SJane Chu /* SMART attribute of Start/Stop Count */ 5632ee4dfc7SJane Chu #define SMART_START_STOP_COUNT_ID 0x4 5642ee4dfc7SJane Chu 565c03acfcaSls24207 /* 566c03acfcaSls24207 * SMART data structures 567c03acfcaSls24207 */ 568c03acfcaSls24207 struct smart_data { 569c03acfcaSls24207 uint8_t smart_vendor_specific[362]; 570c03acfcaSls24207 uint8_t smart_offline_data_collection_status; 571c03acfcaSls24207 uint8_t smart_selftest_exec_status; 572c03acfcaSls24207 uint8_t smart_secs_to_complete_offline_data[2]; 573c03acfcaSls24207 uint8_t smart_vendor_specific2; 574c03acfcaSls24207 uint8_t smart_offline_data_collection_capability; 575c03acfcaSls24207 uint8_t smart_capability[2]; 576c03acfcaSls24207 uint8_t smart_error_logging_capability; 577c03acfcaSls24207 uint8_t smart_vendor_specific3; 578c03acfcaSls24207 uint8_t smart_short_selftest_polling_time; 579c03acfcaSls24207 uint8_t smart_extended_selftest_polling_time; 580c03acfcaSls24207 uint8_t smart_conveyance_selftest_polling_time; 581c03acfcaSls24207 uint8_t smart_reserved[11]; 582c03acfcaSls24207 uint8_t smart_vendor_specific4[125]; 583c03acfcaSls24207 uint8_t smart_checksum; 584c03acfcaSls24207 }; 585c03acfcaSls24207 586c03acfcaSls24207 struct smart_selftest_log_entry { 587c03acfcaSls24207 uint8_t smart_selftest_log_lba_low; 588c03acfcaSls24207 uint8_t smart_selftest_log_status; 589c03acfcaSls24207 uint8_t smart_selftest_log_timestamp[2]; 590c03acfcaSls24207 uint8_t smart_selftest_log_checkpoint; 591c03acfcaSls24207 uint8_t smart_selftest_log_failing_lba[4]; /* from LSB to MSB */ 592c03acfcaSls24207 uint8_t smart_selftest_log_vendor_specific[15]; 593c03acfcaSls24207 }; 594c03acfcaSls24207 595c03acfcaSls24207 #define NUM_SMART_SELFTEST_LOG_ENTRIES 21 596c03acfcaSls24207 struct smart_selftest_log { 597c03acfcaSls24207 uint8_t smart_selftest_log_revision[2]; 598c03acfcaSls24207 struct smart_selftest_log_entry 599c03acfcaSls24207 smart_selftest_log_entries[NUM_SMART_SELFTEST_LOG_ENTRIES]; 600c03acfcaSls24207 uint8_t smart_selftest_log_vendor_specific[2]; 601c03acfcaSls24207 uint8_t smart_selftest_log_index; 602c03acfcaSls24207 uint8_t smart_selftest_log_reserved[2]; 603c03acfcaSls24207 uint8_t smart_selftest_log_checksum; 604c03acfcaSls24207 }; 605c03acfcaSls24207 606c03acfcaSls24207 struct smart_ext_selftest_log_entry { 607c03acfcaSls24207 uint8_t smart_ext_selftest_log_lba_low; 608c03acfcaSls24207 uint8_t smart_ext_selftest_log_status; 609c03acfcaSls24207 uint8_t smart_ext_selftest_log_timestamp[2]; 610c03acfcaSls24207 uint8_t smart_ext_selftest_log_checkpoint; 611c03acfcaSls24207 uint8_t smart_ext_selftest_log_failing_lba[6]; 612c03acfcaSls24207 uint8_t smart_ext_selftest_log_vendor_specific[15]; 613c03acfcaSls24207 }; 614c03acfcaSls24207 615c03acfcaSls24207 struct smart_ext_selftest_log { 616c03acfcaSls24207 uint8_t smart_ext_selftest_log_rev; 617c03acfcaSls24207 uint8_t smart_ext_selftest_log_reserved; 618c03acfcaSls24207 uint8_t smart_ext_selftest_log_index[2]; 619c03acfcaSls24207 struct smart_ext_selftest_log_entry smart_ext_selftest_log_entries[19]; 620c03acfcaSls24207 uint8_t smart_ext_selftest_log_vendor_specific[2]; 621c03acfcaSls24207 uint8_t smart_ext_selftest_log_reserved2[11]; 622c03acfcaSls24207 uint8_t smart_ext_selftest_log_checksum; 623c03acfcaSls24207 }; 624c03acfcaSls24207 625c03acfcaSls24207 struct read_log_ext_directory { 626c03acfcaSls24207 uint8_t read_log_ext_vers[2]; /* general purpose log version */ 627489f952bSls24207 uint8_t read_log_ext_nblks[255][2]; /* # of blks @ log addr index+1 */ 628c03acfcaSls24207 }; 629c03acfcaSls24207 630c03acfcaSls24207 /* 6312ee4dfc7SJane Chu * The definition of CONTROL byte field in SCSI command 6322ee4dfc7SJane Chu * according to SAM 5 6332ee4dfc7SJane Chu */ 6342ee4dfc7SJane Chu #define CTL_BYTE_VENDOR_MASK 0xc0 6352ee4dfc7SJane Chu #define CTL_BYTE_NACA_MASK 0x04 6362ee4dfc7SJane Chu 6372ee4dfc7SJane Chu /* 6382ee4dfc7SJane Chu * The definition of mask in START STOP UNIT command 6392ee4dfc7SJane Chu */ 6402ee4dfc7SJane Chu #define START_STOP_IMMED_MASK 0x01 6412ee4dfc7SJane Chu #define START_STOP_POWER_COND_MASK 0xF0 6422ee4dfc7SJane Chu #define START_STOP_START_MASK 0x01 6432ee4dfc7SJane Chu #define START_STOP_LOEJ_MASK 0x02 6442ee4dfc7SJane Chu #define START_STOP_NOFLUSH_MASK 0x04 6452ee4dfc7SJane Chu #define START_STOP_MODIFIER_MASK 0x0f 6462ee4dfc7SJane Chu #define START_STOP_POWER_COND_SHIFT 4 6472ee4dfc7SJane Chu 6482ee4dfc7SJane Chu /* 649c03acfcaSls24207 * SMART specific data 6500bc523e5SAlan Perry * These eventually need to go to a generic scsi header file 651c03acfcaSls24207 * for now they will reside here 652c03acfcaSls24207 */ 65337a077efSls24207 #define PC_CUMULATIVE_VALUES 0x01 654c03acfcaSls24207 #define PAGE_CODE_GET_SUPPORTED_LOG_PAGES 0x00 655*fa2ae296SJason King #define PAGE_CODE_READ_ERRORS 0x03 656*fa2ae296SJason King #define PAGE_CODE_TEMPERATURE 0x0d 657*fa2ae296SJason King #define PAGE_CODE_START_STOP_CYCLE_COUNTER 0x0e 658c03acfcaSls24207 #define PAGE_CODE_SELF_TEST_RESULTS 0x10 659*fa2ae296SJason King #define PAGE_CODE_SOLID_STATE_MEDIA 0x11 660*fa2ae296SJason King #define PAGE_CODE_GENERAL_STATS 0x19 661c03acfcaSls24207 #define PAGE_CODE_INFORMATION_EXCEPTIONS 0x2f 662c03acfcaSls24207 #define PAGE_CODE_SMART_READ_DATA 0x30 663c03acfcaSls24207 664c03acfcaSls24207 665c03acfcaSls24207 struct log_parameter { 666c03acfcaSls24207 uint8_t param_code[2]; /* parameter dependant */ 667c03acfcaSls24207 uint8_t param_ctrl_flags; /* see defines below */ 668c03acfcaSls24207 uint8_t param_len; /* # of bytes following */ 669*fa2ae296SJason King uint8_t param_values[]; /* # of bytes defined by param_len */ 670c03acfcaSls24207 }; 671c03acfcaSls24207 672c03acfcaSls24207 /* param_ctrl_flag fields */ 673c03acfcaSls24207 #define LOG_CTRL_LP 0x01 /* list parameter */ 674c03acfcaSls24207 #define LOG_CTRL_LBIN 0x02 /* list is binary */ 675c03acfcaSls24207 #define LOG_CTRL_TMC 0x0c /* threshold met criteria */ 676c03acfcaSls24207 #define LOG_CTRL_ETC 0x10 /* enable threshold comparison */ 677c03acfcaSls24207 #define LOG_CTRL_TSD 0x20 /* target save disable */ 678c03acfcaSls24207 #define LOG_CTRL_DS 0x40 /* disable save */ 679c03acfcaSls24207 #define LOG_CTRL_DU 0x80 /* disable update */ 680c03acfcaSls24207 681c03acfcaSls24207 #define SMART_MAGIC_VAL_1 0x4f 682c03acfcaSls24207 #define SMART_MAGIC_VAL_2 0xc2 683c03acfcaSls24207 #define SMART_MAGIC_VAL_3 0xf4 684c03acfcaSls24207 #define SMART_MAGIC_VAL_4 0x2c 685c03acfcaSls24207 686c03acfcaSls24207 #define SCT_STATUS_LOG_PAGE 0xe0 687c03acfcaSls24207 688*fa2ae296SJason King #define SCSI_NO_TEMP 0xff 689*fa2ae296SJason King 690b8b2574eSls24207 /* 691b8b2574eSls24207 * Acoustic management 692b8b2574eSls24207 */ 693b8b2574eSls24207 694b8b2574eSls24207 struct mode_acoustic_management { 695b8b2574eSls24207 struct mode_page mode_page; /* common mode page header */ 696b8b2574eSls24207 uchar_t acoustic_manag_enable; /* Set to 1 enable, Set 0 disable */ 697b8b2574eSls24207 uchar_t acoustic_manag_level; /* Acoustic management level */ 698b8b2574eSls24207 uchar_t vendor_recommended_value; /* Vendor recommended value */ 699b8b2574eSls24207 }; 700b8b2574eSls24207 701b8b2574eSls24207 #define PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT 3 /* Acoustic manag pg len */ 702b8b2574eSls24207 #define P_CNTRL_CURRENT 0 703b8b2574eSls24207 #define P_CNTRL_CHANGEABLE 1 704b8b2574eSls24207 #define P_CNTRL_DEFAULT 2 705b8b2574eSls24207 #define P_CNTRL_SAVED 3 706b8b2574eSls24207 707b8b2574eSls24207 #define ACOUSTIC_DISABLED 0 708b8b2574eSls24207 #define ACOUSTIC_ENABLED 1 709b8b2574eSls24207 710b8b2574eSls24207 #define MODEPAGE_ACOUSTIC_MANAG 0x30 711b8b2574eSls24207 7128d483882Smlf /* 7138aa6aadbSXiao-Yu Zhang * Port Multiplier registers' offsets 7148aa6aadbSXiao-Yu Zhang */ 7158aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR0 0x0 7168aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR1 0x1 7178aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR2 0x2 7188aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR32 0x20 7198aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR33 0x21 7208aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR64 0x40 7218aa6aadbSXiao-Yu Zhang #define SATA_PMULT_GSCR96 0x60 7228aa6aadbSXiao-Yu Zhang 7238aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PORTNUM_MASK 0xf 7248aa6aadbSXiao-Yu Zhang 7258aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PSCR0 0x0 7268aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PSCR1 0x1 7278aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PSCR2 0x2 7288aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PSCR3 0x3 7298aa6aadbSXiao-Yu Zhang #define SATA_PMULT_PSCR4 0x4 7308aa6aadbSXiao-Yu Zhang 7318aa6aadbSXiao-Yu Zhang #define SATA_PMULT_REG_SSTS (SATA_PMULT_PSCR0) 7328aa6aadbSXiao-Yu Zhang #define SATA_PMULT_REG_SERR (SATA_PMULT_PSCR1) 7338aa6aadbSXiao-Yu Zhang #define SATA_PMULT_REG_SCTL (SATA_PMULT_PSCR2) 7348aa6aadbSXiao-Yu Zhang #define SATA_PMULT_REG_SACT (SATA_PMULT_PSCR3) 7358aa6aadbSXiao-Yu Zhang #define SATA_PMULT_REG_SNTF (SATA_PMULT_PSCR4) 7368aa6aadbSXiao-Yu Zhang 7378aa6aadbSXiao-Yu Zhang /* 7388aa6aadbSXiao-Yu Zhang * Port Multiplier capabilities 7398aa6aadbSXiao-Yu Zhang * (Indicated by GSCR64, and enabled by GSCR96) 7408aa6aadbSXiao-Yu Zhang */ 7418aa6aadbSXiao-Yu Zhang #define SATA_PMULT_CAP_BIST (1 << 0) 7428aa6aadbSXiao-Yu Zhang #define SATA_PMULT_CAP_PMREQ (1 << 1) 7438aa6aadbSXiao-Yu Zhang #define SATA_PMULT_CAP_SSC (1 << 2) 7448aa6aadbSXiao-Yu Zhang #define SATA_PMULT_CAP_SNOTIF (1 << 3) 7458aa6aadbSXiao-Yu Zhang #define SATA_PMULT_CAP_PHYEVENT (1 << 4) 7468aa6aadbSXiao-Yu Zhang 7478aa6aadbSXiao-Yu Zhang /* 7488d483882Smlf * sstatus field definitions 7498d483882Smlf */ 7508d483882Smlf #define SSTATUS_DET_SHIFT 0 7518d483882Smlf #define SSTATUS_SPD_SHIFT 4 7528d483882Smlf #define SSTATUS_IPM_SHIFT 8 7538d483882Smlf 7548d483882Smlf #define SSTATUS_DET (0xf << SSTATUS_DET_SHIFT) 7558d483882Smlf #define SSTATUS_SPD (0xf << SSTATUS_SPD_SHIFT) 7568d483882Smlf #define SSTATUS_IPM (0xf << SSTATUS_IPM_SHIFT) 7578d483882Smlf 7588d483882Smlf /* 7598d483882Smlf * sstatus DET values 7608d483882Smlf */ 7618d483882Smlf #define SSTATUS_DET_NODEV 0 /* No dev detected */ 7628d483882Smlf #define SSTATUS_DET_DEVPRE_NOPHYCOM 1 /* dev detected */ 7638d483882Smlf #define SSTATUS_DET_DEVPRE_PHYCOM 3 /* dev detected */ 7648d483882Smlf #define SSTATUS_DET_PHYOFFLINE 4 /* PHY is in offline */ 7658d483882Smlf 7668d483882Smlf #define SSTATUS_GET_DET(x) \ 7678d483882Smlf (x & SSTATUS_DET) 7688d483882Smlf 7698d483882Smlf #define SSTATUS_SET_DET(x, new_val) \ 7708d483882Smlf (x = (x & ~SSTATUS_DET) | (new_val & SSTATUS_DET)) 7718d483882Smlf 77213c8743eSMarcel Telka #define SSTATUS_SPD_NODEV 0 /* No device present */ 77313c8743eSMarcel Telka #define SSTATUS_SPD_GEN1 1 /* Gen 1 rate negotiated */ 77413c8743eSMarcel Telka #define SSTATUS_SPD_GEN2 2 /* Gen 2 rate negotiated */ 77513c8743eSMarcel Telka #define SSTATUS_SPD_GEN3 3 /* Gen 3 rate negotiated */ 7768d483882Smlf 7778d483882Smlf /* 7788d483882Smlf * sstatus IPM values 7798d483882Smlf */ 7808d483882Smlf #define SSTATUS_IPM_NODEV_NOPHYCOM 0x0 /* No dev, no PHY */ 7818d483882Smlf #define SSTATUS_IPM_ACTIVE 0x1 /* Interface active */ 7828d483882Smlf #define SSTATUS_IPM_POWERPARTIAL 0x2 /* partial power mgmnt */ 7838d483882Smlf #define SSTATUS_IPM_POWERSLUMBER 0x6 /* slumber power mgmt */ 7848d483882Smlf 7858d483882Smlf #define SSTATUS_GET_IPM(x) \ 7868d483882Smlf ((x & SSTATUS_IPM) >> SSTATUS_IPM_SHIFT) 7878d483882Smlf 7888d483882Smlf #define SSTATUS_SET_IPM(x, new_val) \ 7898d483882Smlf (x = (x & ~SSTATUS_IPM) | \ 7908d483882Smlf ((new_val << SSTATUS_IPM_SHIFT) & SSTATUS_IPM)) 7918d483882Smlf 7928d483882Smlf 7938d483882Smlf /* 7948d483882Smlf * serror register fields 7958d483882Smlf */ 7968d483882Smlf #define SERROR_DATA_ERR_FIXED (1 << 0) /* D integrity err */ 7978d483882Smlf #define SERROR_COMM_ERR_FIXED (1 << 1) /* comm err recov */ 7988d483882Smlf #define SERROR_DATA_ERR (1 << 8) /* D integrity err */ 7998d483882Smlf #define SERROR_PERSISTENT_ERR (1 << 9) /* norecov com err */ 8008d483882Smlf #define SERROR_PROTOCOL_ERR (1 << 10) /* protocol err */ 8018d483882Smlf #define SERROR_INT_ERR (1 << 11) /* internal err */ 8028d483882Smlf #define SERROR_PHY_RDY_CHG (1 << 16) /* PHY state change */ 8038d483882Smlf #define SERROR_PHY_INT_ERR (1 << 17) /* PHY internal err */ 8048d483882Smlf #define SERROR_COMM_WAKE (1 << 18) /* COM wake */ 8058d483882Smlf #define SERROR_10B_TO_8B_ERR (1 << 19) /* 10B-to-8B decode */ 8068d483882Smlf #define SERROR_DISPARITY_ERR (1 << 20) /* disparity err */ 8078d483882Smlf #define SERROR_CRC_ERR (1 << 21) /* CRC err */ 8088d483882Smlf #define SERROR_HANDSHAKE_ERR (1 << 22) /* Handshake err */ 8098d483882Smlf #define SERROR_LINK_SEQ_ERR (1 << 23) /* Link seq err */ 8108d483882Smlf #define SERROR_TRANS_ERR (1 << 24) /* Tran state err */ 8118d483882Smlf #define SERROR_FIS_TYPE (1 << 25) /* FIS type err */ 8128d483882Smlf #define SERROR_EXCHANGED_ERR (1 << 26) /* Device exchanged */ 8138d483882Smlf 8148d483882Smlf /* 8158d483882Smlf * S-Control Bridge port x register fields 8168d483882Smlf */ 8178d483882Smlf #define SCONTROL_DET_SHIFT 0 8188d483882Smlf #define SCONTROL_SPD_SHIFT 4 8198d483882Smlf #define SCONTROL_IPM_SHIFT 8 8208d483882Smlf #define SCONTROL_SPM_SHIFT 12 8218d483882Smlf 82213c8743eSMarcel Telka #define SCONTROL_DET (0xf << SCONTROL_DET_SHIFT) 82313c8743eSMarcel Telka #define SCONTROL_SPD (0xf << SCONTROL_SPD_SHIFT) 82413c8743eSMarcel Telka #define SCONTROL_IPM (0xf << SCONTROL_IPM_SHIFT) 82513c8743eSMarcel Telka #define SCONTROL_SPM (0xf << SCONTROL_SPM_SHIFT) 8268d483882Smlf 8278d483882Smlf #define SCONTROL_GET_DET(x) \ 8288d483882Smlf (x & SCONTROL_DET) 8298d483882Smlf 8308d483882Smlf #define SCONTROL_SET_DET(x, new_val) \ 8318d483882Smlf (x = (x & ~SCONTROL_DET) | (new_val & SCONTROL_DET)) 8328d483882Smlf 8338d483882Smlf #define SCONTROL_DET_NOACTION 0 /* Do nothing to port */ 8348d483882Smlf #define SCONTROL_DET_COMRESET 1 /* Re-initialize port */ 8358d483882Smlf #define SCONTROL_DET_DISABLE 4 /* Disable port */ 8368d483882Smlf 8378d483882Smlf #define SCONTROL_SPD_NOLIMIT 0 /* No speed limit */ 8388d483882Smlf #define SCONTROL_SPD_GEN1 1 /* Limit Gen 1 rate */ 8398d483882Smlf #define SCONTROL_SPD_GEN2 2 /* Limit Gen 2 rate */ 84013c8743eSMarcel Telka #define SCONTROL_SPD_GEN3 3 /* Limit Gen 3 rate */ 8418d483882Smlf 84213bcbb7aSyt160523 #define SCONTROL_GET_IPM(x) \ 84313bcbb7aSyt160523 ((x & SCONTROL_IPM) >> SCONTROL_IPM_SHIFT) 84413bcbb7aSyt160523 84513bcbb7aSyt160523 #define SCONTROL_SET_IPM(x, new_val) \ 84613bcbb7aSyt160523 (x = (x & ~SCONTROL_IPM) | \ 84713bcbb7aSyt160523 ((new_val << SCONTROL_IPM_SHIFT) & SCONTROL_IPM)) 84813bcbb7aSyt160523 84933b27906SGarrett D'Amore /* NB: IPM disable value is a bit-field (though not described) */ 8508d483882Smlf #define SCONTROL_IPM_NORESTRICT 0 /* No PM limit */ 8518d483882Smlf #define SCONTROL_IPM_DISABLE_PARTIAL 1 /* Disable partial */ 8528d483882Smlf #define SCONTROL_IPM_DISABLE_SLUMBER 2 /* Disable slumber */ 8538d483882Smlf #define SCONTROL_IPM_DISABLE_BOTH 3 /* Disable both */ 85433b27906SGarrett D'Amore #define SCONTROL_IPM_DISABLE_DEVSLEEP 4 /* Disable devsleep */ 85533b27906SGarrett D'Amore #define SCONTROL_IPM_DISABLE_ALL 7 /* Disable all PM */ 8568d483882Smlf 8578d483882Smlf #define SCONTROL_SPM_NORESTRICT 0 /* No PM limits */ 8588d483882Smlf #define SCONTROL_SPM_DO_PARTIAL 1 /* Go to partial */ 8598d483882Smlf #define SCONTROL_SPM_DO_SLUMBER 2 /* Go to slumber */ 8608d483882Smlf #define SCONTROL_SPM_DO_ACTIVE 4 /* Go to active */ 8618d483882Smlf 86266f9d5cbSmlf #ifdef __cplusplus 86366f9d5cbSmlf } 86466f9d5cbSmlf #endif 86566f9d5cbSmlf 86666f9d5cbSmlf #endif /* _SATA_DEFS_H */ 867