nrelease - fix/improve livecd
[dragonfly.git] / sys / dev / disk / ahci / atascsi.h
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_DATA_SET_MANAGEMENT 0x06 /* Data Set Management command */
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_PACKET            0xa0
33 #define ATA_C_ATAPI_IDENTIFY    0xa1
34 #define ATA_C_READDMA           0xc8
35 #define ATA_C_WRITEDMA          0xca
36 #define ATA_C_READ_PM           0xe4
37 #define ATA_C_WRITE_PM          0xe8
38 #define ATA_C_FLUSH_CACHE       0xe7
39 #define ATA_C_FLUSH_CACHE_EXT   0xea /* lba48 */
40 #define ATA_C_IDENTIFY          0xec
41 #define ATA_C_SET_FEATURES      0xef
42 #define ATA_C_SEC_FREEZE_LOCK   0xf5
43
44 /*
45  * ATA SET FEATURES subcommands
46  */
47 #define ATA_SF_DSM_TRIM          0x01 /* TRIM DSM feature */
48 #define ATA_SF_WRITECACHE_EN    0x02
49 #define ATA_SF_SETXFER          0x03
50 #define ATA_SF_SATAFT_ENA       0x10
51 #define ATA_SF_SATAFT_DIS       0x90
52 #define ATA_SF_LOOKAHEAD_EN     0xaa
53
54 /*
55  * ATA SATA FEATURES args
56  */
57 #define ATA_SATAFT_NONZDMA      0x01    /* DMA non-zero buffer offset */
58 #define ATA_SATAFT_DMAAAOPT     0x02    /* DMA AA optimization */
59 #define ATA_SATAFT_DEVIPS       0x03    /* Device-initiated pwr state*/
60 #define ATA_SATAFT_INORDER      0x04    /* in-order data delivery */
61 #define ATA_SATAFT_ASYNCNOTIFY  0x05    /* Async notification */
62 #define ATA_SATAFT_DEVAPS       0x07    /* Device auto partial to slumber */
63 #define ATA_SATAFT_DEVSLEEP     0x09    /* DevSleep power management state */
64
65 struct ata_identify {
66         u_int16_t       config;         /*   0 */
67         u_int16_t       ncyls;          /*   1 */
68         u_int16_t       reserved1;      /*   2 */
69         u_int16_t       nheads;         /*   3 */
70         u_int16_t       track_size;     /*   4 */
71         u_int16_t       sector_size;    /*   5 */
72         u_int16_t       nsectors;       /*   6 */
73         u_int16_t       reserved2[3];   /*   7 vendor unique */
74         u_int8_t        serial[20];     /*  10 */
75         u_int16_t       buffer_type;    /*  20 */
76         u_int16_t       buffer_size;    /*  21 */
77         u_int16_t       ecc;            /*  22 */
78         u_int8_t        firmware[8];    /*  23 */
79         u_int8_t        model[40];      /*  27 */
80         u_int16_t       multi;          /*  47 */
81         u_int16_t       dwcap;          /*  48 */
82         u_int16_t       cap;            /*  49 */
83         u_int16_t       reserved3;      /*  50 */
84         u_int16_t       piomode;        /*  51 */
85         u_int16_t       dmamode;        /*  52 */
86         u_int16_t       validinfo;      /*  53 */
87         u_int16_t       curcyls;        /*  54 */
88         u_int16_t       curheads;       /*  55 */
89         u_int16_t       cursectrk;      /*  56 */
90         u_int16_t       curseccp[2];    /*  57 */
91         u_int16_t       mult2;          /*  59 */
92         u_int16_t       addrsec[2];     /*  60 */
93         u_int16_t       worddma;        /*  62 */
94         u_int16_t       dworddma;       /*  63 */
95         u_int16_t       advpiomode;     /*  64 */
96         u_int16_t       minmwdma;       /*  65 */
97         u_int16_t       recmwdma;       /*  66 */
98         u_int16_t       minpio;         /*  67 */
99         u_int16_t       minpioflow;     /*  68 */
100         u_int16_t       support3;       /*  69 */
101 #define ATA_SUPPORT_RZAT                0x0020
102 #define ATA_SUPPORT_DRAT                0x4000
103         u_int16_t       reserved4;      /*  70 */
104         u_int16_t       typtime[2];     /*  71 */
105         u_int16_t       reserved5[2];   /*  73 */
106         u_int16_t       qdepth;         /*  75 */
107         u_int16_t       satacap;        /*  76 */
108         u_int16_t       satacap2;       /*  77 */
109 #define SATA_CAP2_SNDRCV_FPDMA          (1 << 6)
110         u_int16_t       satafsup;       /*  78 */
111 #define SATA_FEATURE_SUP_DEVIPS         0x0008
112 #define SATA_FEATURE_SUP_DEVSLEEP       0x0100
113         u_int16_t       satafen;        /*  79 */
114         u_int16_t       majver;         /*  80 */
115         u_int16_t       minver;         /*  81 */
116         u_int16_t       cmdset82;       /*  82 */
117         u_int16_t       cmdset83;       /*  83 */
118         u_int16_t       cmdset84;       /*  84 */
119         u_int16_t       features85;     /*  85 */
120         u_int16_t       features86;     /*  86 */
121         u_int16_t       features87;     /*  87 */
122 #define ATA_ID_F87_WWN          (1<<8)
123         u_int16_t       ultradma;       /*  88 */
124         u_int16_t       erasetime;      /*  89 */
125         u_int16_t       erasetimex;     /*  90 */
126         u_int16_t       apm;            /*  91 */
127         u_int16_t       masterpw;       /*  92 */
128         u_int16_t       hwreset;        /*  93 */
129         u_int16_t       acoustic;       /*  94 */
130         u_int16_t       stream_min;     /*  95 */
131         u_int16_t       stream_xfer_d;  /*  96 */
132         u_int16_t       stream_lat;     /*  97 */
133         u_int16_t       streamperf[2];  /*  98 */
134         u_int16_t       addrsecxt[4];   /* 100 */
135         u_int16_t       stream_xfer_p;  /* 104 */
136         u_int16_t       max_dsm_blocks; /* 105 */
137         u_int16_t       phys_sect_sz;   /* 106 */
138         u_int16_t       seek_delay;     /* 107 */
139         u_int16_t       naa_ieee_oui;   /* 108 */
140         u_int16_t       ieee_oui_uid;   /* 109 */
141         u_int16_t       uid_mid;        /* 110 */
142         u_int16_t       uid_low;        /* 111 */
143         u_int16_t       resv_wwn[4];    /* 112 */
144         u_int16_t       incits;         /* 116 */
145         u_int16_t       words_lsec[2];  /* 117 */
146         u_int16_t       cmdset119;      /* 119 */
147         u_int16_t       features120;    /* 120 */
148         u_int16_t       padding2[6];
149         u_int16_t       rmsn;           /* 127 */
150         u_int16_t       securestatus;   /* 128 */
151 #define ATA_SECURE_LOCKED               (1<<2)
152 #define ATA_SECURE_FROZEN               (1<<3)
153         u_int16_t       vendor[31];     /* 129 */
154         u_int16_t       padding3[9];    /* 160 */
155         u_int16_t       support_dsm;    /* 169 */       
156 #define ATA_SUPPORT_DSM_TRIM            0x0001
157         u_int16_t       padding5[6];    /* 170 */
158         u_int16_t       curmedser[30];  /* 176 */
159         u_int16_t       sctsupport;     /* 206 */
160         u_int16_t       padding4[10];   /* 207 */
161         u_int16_t       nomrota_rate;   /* 217 */
162         u_int16_t       padding6[37];   /* 218 */
163         u_int16_t       integrity;      /* 255 */
164 } __packed;
165
166 /*
167  * IDENTIFY DEVICE data
168  */
169 #define ATA_IDENTIFY_SECURITY           (1 << 1)
170 #define ATA_IDENTIFY_WRITECACHE         (1 << 5)
171 #define ATA_IDENTIFY_LOOKAHEAD          (1 << 6)
172
173 /*
174  * Frame Information Structures
175  */
176
177 #define ATA_FIS_LENGTH          20
178
179 struct ata_fis_h2d {
180         u_int8_t                type;
181 #define ATA_FIS_TYPE_H2D                0x27
182         u_int8_t                flags;
183 #define ATA_H2D_FLAGS_CMD               (1<<7)
184         u_int8_t                command;
185         u_int8_t                features;
186 #define ATA_H2D_FEATURES_DMA            (1<<0)
187 #define ATA_H2D_FEATURES_DIR            (1<<2)
188 #define ATA_H2D_FEATURES_DIR_READ       (1<<2)
189 #define ATA_H2D_FEATURES_DIR_WRITE      (0<<2)
190
191         u_int8_t                lba_low;
192         u_int8_t                lba_mid;
193         u_int8_t                lba_high;
194         u_int8_t                device;
195 #define ATA_H2D_DEVICE_LBA              0x40
196
197         u_int8_t                lba_low_exp;
198         u_int8_t                lba_mid_exp;
199         u_int8_t                lba_high_exp;
200         u_int8_t                features_exp;
201
202         u_int8_t                sector_count;
203         u_int8_t                sector_count_exp;
204         u_int8_t                reserved0;
205         u_int8_t                control;
206 #define ATA_FIS_CONTROL_SRST    0x04
207 #define ATA_FIS_CONTROL_4BIT    0x08
208
209         u_int8_t                reserved1;
210         u_int8_t                reserved2;
211         u_int8_t                reserved3;
212         u_int8_t                reserved4;
213 } __packed;
214
215 struct ata_fis_d2h {
216         u_int8_t                type;
217 #define ATA_FIS_TYPE_D2H                0x34
218         u_int8_t                flags;
219 #define ATA_D2H_FLAGS_INTR              (1<<6)
220         u_int8_t                status;
221         u_int8_t                error;
222
223         u_int8_t                lba_low;
224         u_int8_t                lba_mid;
225         u_int8_t                lba_high;
226         u_int8_t                device;
227
228         u_int8_t                lba_low_exp;
229         u_int8_t                lba_mid_exp;
230         u_int8_t                lba_high_exp;
231         u_int8_t                reserved0;
232
233         u_int8_t                sector_count;
234         u_int8_t                sector_count_exp;
235         u_int8_t                reserved1;
236         u_int8_t                reserved2;
237
238         u_int8_t                reserved3;
239         u_int8_t                reserved4;
240         u_int8_t                reserved5;
241         u_int8_t                reserved6;
242 } __packed;
243
244 /*
245  * SATA log page 10h -
246  * looks like a D2H FIS, with errored tag number in first byte.
247  */
248 struct ata_log_page_10h {
249         struct ata_fis_d2h      err_regs;
250 #define ATA_LOG_10H_TYPE_NOTQUEUED      0x80
251 #define ATA_LOG_10H_TYPE_TAG_MASK       0x1f
252         u_int8_t                reserved[256 - sizeof(struct ata_fis_d2h)];
253         u_int8_t                vendor_specific[255];
254         u_int8_t                checksum;
255 } __packed;
256
257 /*
258  * SATA registers
259  */
260
261 #define SATA_SStatus_DET                0x00f
262 #define SATA_SStatus_DET_NODEV          0x000
263 #define SATA_SStatus_DET_NOPHY          0x001
264 #define SATA_SStatus_DET_DEV            0x003
265 #define SATA_SStatus_DET_OFFLINE        0x008
266
267 #define SATA_SStatus_SPD                0x0f0
268 #define SATA_SStatus_SPD_NONE           0x000
269 #define SATA_SStatus_SPD_1_5            0x010
270 #define SATA_SStatus_SPD_3_0            0x020
271
272 #define SATA_SStatus_IPM                0xf00
273 #define SATA_SStatus_IPM_NODEV          0x000
274 #define SATA_SStatus_IPM_ACTIVE         0x100
275 #define SATA_SStatus_IPM_PARTIAL        0x200
276 #define SATA_SStatus_IPM_SLUMBER        0x600
277
278 #define SATA_SIGNATURE_PORT_MULTIPLIER  0x96690101
279 #define SATA_SIGNATURE_ATAPI            0xeb140101
280 #define SATA_SIGNATURE_DISK             0x00000101
281
282 /*
283  * ATA interface
284  */
285
286 struct ahci_port;
287
288 struct ata_port {
289         struct ata_identify     at_identify;    /* only if ATA_PORT_T_DISK */
290         struct ahci_port        *at_ahci_port;
291         int                     at_type;
292 #define ATA_PORT_T_NONE                 0
293 #define ATA_PORT_T_DISK                 1
294 #define ATA_PORT_T_ATAPI                2
295 #define ATA_PORT_T_PM                   3
296         int                     at_features;
297 #define ATA_PORT_F_WCACHE               (1 << 0)
298 #define ATA_PORT_F_RAHEAD               (1 << 1)
299 #define ATA_PORT_F_FRZLCK               (1 << 2)
300 #define ATA_PORT_F_RESCAN               (1 << 3) /* re-check on bus scan */
301         int                     at_probe;
302 #define ATA_PROBE_NEED_INIT             0
303 #define ATA_PROBE_NEED_HARD_RESET       1
304 #define ATA_PROBE_NEED_SOFT_RESET       2
305 #define ATA_PROBE_NEED_IDENT            3
306 #define ATA_PROBE_GOOD                  4
307 #define ATA_PROBE_FAILED                7
308         int                     at_ncqdepth;
309         u_int64_t               at_capacity;    /* only if ATA_PORT_T_DISK */
310         int                     at_target;      /* port multiplier port */
311         char                    at_name[16];
312 };
313
314 struct ata_xfer {
315         struct ata_fis_h2d      *fis;
316         struct ata_fis_d2h      rfis;
317         u_int8_t                *packetcmd;
318         u_int8_t                tag;
319         u_int64_t               lba;            /* diagnostic only */
320
321         void                    *data;
322         size_t                  datalen;
323         size_t                  resid;
324
325         void                    (*complete)(struct ata_xfer *);
326         u_int                   timeout;
327         int                     serial;         /* detect timeout races */
328
329         int                     flags;
330 #define ATA_F_READ                      (1<<0)
331 #define ATA_F_WRITE                     (1<<1)
332 #define ATA_F_NOWAIT                    (1<<2)
333 #define ATA_F_POLL                      (1<<3)
334 #define ATA_F_PIO                       (1<<4)
335 #define ATA_F_PACKET                    (1<<5)
336 #define ATA_F_NCQ                       (1<<6)
337 #define ATA_F_TIMEOUT_RUNNING           (1<<7)
338 #define ATA_F_TIMEOUT_DESIRED           (1<<8)
339 #define ATA_F_TIMEOUT_EXPIRED           (1<<9)
340 #define ATA_F_AUTOSENSE                 (1<<10)
341 #define ATA_F_EXCLUSIVE                 (1<<11)
342 #define ATA_F_SILENT                    (1<<12)
343 #define ATA_FMT_FLAGS                   "\020"                          \
344                                         "\015SILENT"                    \
345                                         "\014EXCLUSIVE"                 \
346                                         "\013AUTOSENSE"                 \
347                                         "\012EXPIRED"                   \
348                                         "\011DESIRED" "\010TRUNNING"    \
349                                         "\007NCQ" "\006PACKET"          \
350                                         "\005PIO" "\004POLL" "\003NOWAIT" \
351                                         "\002WRITE" "\001READ"
352
353         volatile int            state;
354 #define ATA_S_SETUP                     0
355 #define ATA_S_PENDING                   1
356 #define ATA_S_COMPLETE                  2
357 #define ATA_S_ERROR                     3
358 #define ATA_S_TIMEOUT                   4
359 #define ATA_S_ONCHIP                    5
360 #define ATA_S_PUT                       6
361
362         void                    *atascsi_private;
363         struct ata_port         *at;    /* NULL if direct-attached */
364 };
365