xref: /dragonfly/sys/dev/disk/sili/atascsi.h (revision e27434d7864e9fb4463c99205dbd3eff78bdcae7)
1 /*
2  * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  *
16  * $OpenBSD: atascsi.h,v 1.33 2009/02/16 21:19:06 miod Exp $
17  */
18 
19 struct atascsi;
20 struct scsi_link;
21 
22 /*
23  * ATA commands
24  */
25 
26 #define ATA_C_SATA_FEATURE_ENA          0x10
27 #define ATA_C_READDMA_EXT     0x25
28 #define ATA_C_READ_LOG_EXT    0x2f
29 #define ATA_C_WRITEDMA_EXT    0x35
30 #define ATA_C_READ_FPDMA      0x60
31 #define ATA_C_WRITE_FPDMA     0x61
32 #define ATA_C_SATA_FEATURE_DIS          0x90
33 #define ATA_C_PACKET                    0xa0
34 #define ATA_C_ATAPI_IDENTIFY  0xa1
35 #define ATA_C_READDMA                   0xc8
36 #define ATA_C_WRITEDMA                  0xca
37 #define ATA_C_READ_PM                   0xe4
38 #define ATA_C_WRITE_PM                  0xe8
39 #define ATA_C_FLUSH_CACHE     0xe7
40 #define ATA_C_FLUSH_CACHE_EXT 0xea /* lba48 */
41 #define ATA_C_IDENTIFY                  0xec
42 #define ATA_C_SET_FEATURES    0xef
43 #define ATA_C_SEC_FREEZE_LOCK 0xf5
44 
45 /*
46  * ATA SATA FEATURES subcommands
47  */
48 #define ATA_SATAFT_NONZDMA    0x01      /* DMA non-zero buffer offset */
49 #define ATA_SATAFT_DMAAAOPT   0x02      /* DMA AA optimization */
50 #define ATA_SATAFT_DEVIPS     0x03      /* Device-initiated pwr state*/
51 #define ATA_SATAFT_INORDER    0x04      /* in-order data delivery */
52 #define ATA_SATAFT_ASYNCNOTIFY          0x05      /* Async notification */
53 
54 /*
55  * ATA SET FEATURES subcommands
56  */
57 #define ATA_SF_WRITECACHE_EN  0x02
58 #define ATA_SF_SETXFER                  0x03
59 #define ATA_SF_LOOKAHEAD_EN   0xaa
60 
61 struct ata_identify {
62           u_int16_t config;             /*   0 */
63           u_int16_t ncyls;              /*   1 */
64           u_int16_t reserved1;          /*   2 */
65           u_int16_t nheads;             /*   3 */
66           u_int16_t track_size;         /*   4 */
67           u_int16_t sector_size;        /*   5 */
68           u_int16_t nsectors; /*   6 */
69           u_int16_t reserved2[3];       /*   7 vendor unique */
70           u_int8_t  serial[20];         /*  10 */
71           u_int16_t buffer_type;        /*  20 */
72           u_int16_t buffer_size;        /*  21 */
73           u_int16_t ecc;                /*  22 */
74           u_int8_t  firmware[8];        /*  23 */
75           u_int8_t  model[40];          /*  27 */
76           u_int16_t multi;              /*  47 */
77           u_int16_t dwcap;              /*  48 */
78           u_int16_t cap;                /*  49 */
79           u_int16_t reserved3;          /*  50 */
80           u_int16_t piomode;  /*  51 */
81           u_int16_t dmamode;  /*  52 */
82           u_int16_t validinfo;          /*  53 */
83           u_int16_t curcyls;  /*  54 */
84           u_int16_t curheads; /*  55 */
85           u_int16_t cursectrk;          /*  56 */
86           u_int16_t curseccp[2];        /*  57 */
87           u_int16_t mult2;              /*  59 */
88           u_int16_t addrsec[2];         /*  60 */
89           u_int16_t worddma;  /*  62 */
90           u_int16_t dworddma; /*  63 */
91           u_int16_t advpiomode;         /*  64 */
92           u_int16_t minmwdma; /*  65 */
93           u_int16_t recmwdma; /*  66 */
94           u_int16_t minpio;             /*  67 */
95           u_int16_t minpioflow;         /*  68 */
96           u_int16_t reserved4[2];       /*  69 */
97           u_int16_t typtime[2];         /*  71 */
98           u_int16_t reserved5[2];       /*  73 */
99           u_int16_t qdepth;             /*  75 */
100           u_int16_t satacap;  /*  76 */
101           u_int16_t reserved6;          /*  77 */
102           u_int16_t satafsup; /*  78 */
103           u_int16_t satafen;  /*  79 */
104           u_int16_t majver;             /*  80 */
105           u_int16_t minver;             /*  81 */
106           u_int16_t cmdset82; /*  82 */
107           u_int16_t cmdset83; /*  83 */
108           u_int16_t cmdset84; /*  84 */
109           u_int16_t features85;         /*  85 */
110           u_int16_t features86;         /*  86 */
111           u_int16_t features87;         /*  87 */
112 #define ATA_ID_F87_WWN                  (1<<8)
113           u_int16_t ultradma; /*  88 */
114           u_int16_t erasetime;          /*  89 */
115           u_int16_t erasetimex;         /*  90 */
116           u_int16_t apm;                /*  91 */
117           u_int16_t masterpw; /*  92 */
118           u_int16_t hwreset;  /*  93 */
119           u_int16_t acoustic; /*  94 */
120           u_int16_t stream_min;         /*  95 */
121           u_int16_t stream_xfer_d;      /*  96 */
122           u_int16_t stream_lat;         /*  97 */
123           u_int16_t streamperf[2];      /*  98 */
124           u_int16_t addrsecxt[4];       /* 100 */
125           u_int16_t stream_xfer_p;      /* 104 */
126           u_int16_t padding1; /* 105 */
127           u_int16_t phys_sect_sz;       /* 106 */
128           u_int16_t seek_delay;         /* 107 */
129           u_int16_t naa_ieee_oui;       /* 108 */
130           u_int16_t ieee_oui_uid;       /* 109 */
131           u_int16_t uid_mid;  /* 110 */
132           u_int16_t uid_low;  /* 111 */
133           u_int16_t resv_wwn[4];        /* 112 */
134           u_int16_t incits;             /* 116 */
135           u_int16_t words_lsec[2];      /* 117 */
136           u_int16_t cmdset119;          /* 119 */
137           u_int16_t features120;        /* 120 */
138           u_int16_t padding2[6];
139           u_int16_t rmsn;               /* 127 */
140           u_int16_t securestatus;       /* 128 */
141 #define ATA_SECURE_LOCKED               (1<<2)
142 #define ATA_SECURE_FROZEN               (1<<3)
143           u_int16_t vendor[31];         /* 129 */
144           u_int16_t padding3[16];       /* 160 */
145           u_int16_t curmedser[30];      /* 176 */
146           u_int16_t sctsupport;         /* 206 */
147           u_int16_t padding4[48];       /* 207 */
148           u_int16_t integrity;          /* 255 */
149 } __packed;
150 
151 /*
152  * IDENTIFY DEVICE data
153  */
154 #define ATA_IDENTIFY_SECURITY           (1 << 1)
155 #define ATA_IDENTIFY_WRITECACHE                   (1 << 5)
156 #define ATA_IDENTIFY_LOOKAHEAD                    (1 << 6)
157 
158 /*
159  * Frame Information Structures
160  */
161 
162 #define ATA_FIS_LENGTH                  20
163 
164 struct ata_fis_h2d {
165           u_int8_t            type;
166 #define ATA_FIS_TYPE_H2D                0x27
167           u_int8_t            flags;
168 #define ATA_H2D_FLAGS_CMD               (1<<7)
169           u_int8_t            command;
170           u_int8_t            features;
171 #define ATA_H2D_FEATURES_DMA            (1<<0)
172 #define ATA_H2D_FEATURES_DIR            (1<<2)
173 #define ATA_H2D_FEATURES_DIR_READ       (1<<2)
174 #define ATA_H2D_FEATURES_DIR_WRITE      (0<<2)
175 
176           u_int8_t            lba_low;
177           u_int8_t            lba_mid;
178           u_int8_t            lba_high;
179           u_int8_t            device;
180 #define ATA_H2D_DEVICE_LBA              0x40
181 
182           u_int8_t            lba_low_exp;
183           u_int8_t            lba_mid_exp;
184           u_int8_t            lba_high_exp;
185           u_int8_t            features_exp;
186 
187           u_int8_t            sector_count;
188           u_int8_t            sector_count_exp;
189           u_int8_t            reserved0;
190           u_int8_t            control;
191 #define ATA_FIS_CONTROL_SRST  0x04
192 #define ATA_FIS_CONTROL_4BIT  0x08
193 
194           u_int8_t            reserved1;
195           u_int8_t            reserved2;
196           u_int8_t            reserved3;
197           u_int8_t            reserved4;
198 } __packed;
199 
200 struct ata_fis_d2h {
201           u_int8_t            type;
202 #define ATA_FIS_TYPE_D2H                0x34
203           u_int8_t            flags;
204 #define ATA_D2H_FLAGS_INTR              (1<<6)
205           u_int8_t            status;
206           u_int8_t            error;
207 
208           u_int8_t            lba_low;
209           u_int8_t            lba_mid;
210           u_int8_t            lba_high;
211           u_int8_t            device;
212 
213           u_int8_t            lba_low_exp;
214           u_int8_t            lba_mid_exp;
215           u_int8_t            lba_high_exp;
216           u_int8_t            reserved0;
217 
218           u_int8_t            sector_count;
219           u_int8_t            sector_count_exp;
220           u_int8_t            reserved1;
221           u_int8_t            reserved2;
222 
223           u_int8_t            reserved3;
224           u_int8_t            reserved4;
225           u_int8_t            reserved5;
226           u_int8_t            reserved6;
227 } __packed;
228 
229 /*
230  * SATA log page 10h -
231  * looks like a D2H FIS, with errored tag number in first byte.
232  */
233 struct ata_log_page_10h {
234           struct ata_fis_d2h  err_regs;
235 #define ATA_LOG_10H_TYPE_NOTQUEUED      0x80
236 #define ATA_LOG_10H_TYPE_TAG_MASK       0x1f
237           u_int8_t            reserved[256 - sizeof(struct ata_fis_d2h)];
238           u_int8_t            vendor_specific[255];
239           u_int8_t            checksum;
240 } __packed;
241 
242 /*
243  * SATA registers
244  */
245 
246 #define SATA_SStatus_DET                0x00f
247 #define SATA_SStatus_DET_NODEV                    0x000
248 #define SATA_SStatus_DET_NOPHY                    0x001
249 #define SATA_SStatus_DET_DEV            0x003
250 #define SATA_SStatus_DET_OFFLINE        0x008
251 
252 #define SATA_SStatus_SPD                0x0f0
253 #define SATA_SStatus_SPD_NONE           0x000
254 #define SATA_SStatus_SPD_1_5            0x010
255 #define SATA_SStatus_SPD_3_0            0x020
256 
257 #define SATA_SStatus_IPM                0xf00
258 #define SATA_SStatus_IPM_NODEV                    0x000
259 #define SATA_SStatus_IPM_ACTIVE                   0x100
260 #define SATA_SStatus_IPM_PARTIAL        0x200
261 #define SATA_SStatus_IPM_SLUMBER        0x600
262 
263 #define SATA_SIGNATURE_PORT_MULTIPLIER  0x96690101
264 #define SATA_SIGNATURE_ATAPI            0xeb140101
265 #define SATA_SIGNATURE_DISK             0x00000101
266 
267 /*
268  * ATA interface
269  */
270 
271 struct sili_port;
272 
273 struct ata_port {
274           struct ata_identify at_identify;        /* only if ATA_PORT_T_DISK */
275           struct sili_port    *at_sili_port;
276           int                           at_type;
277 #define ATA_PORT_T_NONE                           0
278 #define ATA_PORT_T_DISK                           1
279 #define ATA_PORT_T_ATAPI                2
280 #define ATA_PORT_T_PM                             3
281           int                           at_features;
282 #define ATA_PORT_F_WCACHE               (1 << 0)
283 #define ATA_PORT_F_RAHEAD               (1 << 1)
284 #define ATA_PORT_F_FRZLCK               (1 << 2)
285 #define ATA_PORT_F_RESCAN               (1 << 3) /* re-check on bus scan */
286 #define ATA_PORT_F_READLOG              (1 << 4) /* must read log page */
287           int                           at_probe;
288 #define ATA_PROBE_NEED_INIT             0
289 #define ATA_PROBE_NEED_HARD_RESET       1
290 #define ATA_PROBE_NEED_SOFT_RESET       2
291 #define ATA_PROBE_NEED_IDENT            3
292 #define ATA_PROBE_GOOD                            4
293 #define ATA_PROBE_FAILED                7
294           int                           at_ncqdepth;
295           u_int64_t           at_capacity;        /* only if ATA_PORT_T_DISK */
296           int                           at_target;          /* port multiplier port */
297           char                          at_name[16];
298 };
299 
300 struct ata_xfer {
301           struct ata_fis_h2d  *fis;
302           struct ata_fis_d2h  *rfis;
303           u_int8_t            *packetcmd;
304           u_int8_t            tag;
305 
306           void                          *data;
307           size_t                        datalen;
308           size_t                        resid;
309 
310           void                          (*complete)(struct ata_xfer *);
311           u_int                         timeout;
312           int                           serial;             /* detect timeout races */
313 
314           int                           flags;
315 #define ATA_F_READ                      (1<<0)
316 #define ATA_F_WRITE                     (1<<1)
317 #define ATA_F_NOWAIT                              (1<<2)
318 #define ATA_F_POLL                      (1<<3)
319 #define ATA_F_PIO                       (1<<4)
320 #define ATA_F_PACKET                              (1<<5)
321 #define ATA_F_NCQ                       (1<<6)
322 #define ATA_F_TIMEOUT_RUNNING           (1<<7)
323 #define ATA_F_TIMEOUT_DESIRED           (1<<8)
324 #define ATA_F_TIMEOUT_EXPIRED           (1<<9)
325 #define ATA_F_AUTOSENSE                           (1<<10)
326 #define ATA_F_EXCLUSIVE                           (1<<11)
327 #define ATA_FMT_FLAGS                             "\020"                                  \
328                                                   "\014EXCLUSIVE"                         \
329                                                   "\013AUTOSENSE"                         \
330                                                   "\012EXPIRED"                           \
331                                                   "\011DESIRED" "\010TRUNNING"  \
332                                                   "\007NCQ" "\006PACKET"                  \
333                                                   "\005PIO" "\004POLL" "\003NOWAIT" \
334                                                   "\002WRITE" "\001READ"
335 
336           volatile int                  state;
337 #define ATA_S_SETUP                     0
338 #define ATA_S_PENDING                             1
339 #define ATA_S_COMPLETE                            2
340 #define ATA_S_ERROR                     3
341 #define ATA_S_TIMEOUT                             4
342 #define ATA_S_ONCHIP                              5
343 #define ATA_S_PUT                       6
344 
345           void                          *atascsi_private;
346           struct ata_port         *at;  /* NULL if direct-attached */
347 };
348