xref: /illumos-gate/usr/src/uts/common/sys/sata/sata_defs.h (revision fa2ae296aca5e8bb860ad1cb7ebfedc83d914ef8)
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