1 | /* $Id: ata.h 76585 2019-01-01 06:31:29Z vboxsync $ */
|
---|
2 | /** @file
|
---|
3 | * VBox storage devices: ATA/ATAPI declarations
|
---|
4 | */
|
---|
5 |
|
---|
6 | /*
|
---|
7 | * Copyright (C) 2006-2019 Oracle Corporation
|
---|
8 | *
|
---|
9 | * This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
10 | * available from http://www.virtualbox.org. This file is free software;
|
---|
11 | * you can redistribute it and/or modify it under the terms of the GNU
|
---|
12 | * General Public License (GPL) as published by the Free Software
|
---|
13 | * Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
14 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
15 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
16 | *
|
---|
17 | * The contents of this file may alternatively be used under the terms
|
---|
18 | * of the Common Development and Distribution License Version 1.0
|
---|
19 | * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
|
---|
20 | * VirtualBox OSE distribution, in which case the provisions of the
|
---|
21 | * CDDL are applicable instead of those of the GPL.
|
---|
22 | *
|
---|
23 | * You may elect to license modified versions of this file under the
|
---|
24 | * terms and conditions of either the GPL or the CDDL or both.
|
---|
25 | */
|
---|
26 |
|
---|
27 | #ifndef VBOX_INCLUDED_ata_h
|
---|
28 | #define VBOX_INCLUDED_ata_h
|
---|
29 | #ifndef RT_WITHOUT_PRAGMA_ONCE
|
---|
30 | # pragma once
|
---|
31 | #endif
|
---|
32 |
|
---|
33 |
|
---|
34 | /* Bits of HD_STATUS */
|
---|
35 | #define ATA_STAT_ERR 0x01
|
---|
36 | #define ATA_STAT_INDEX 0x02
|
---|
37 | #define ATA_STAT_ECC 0x04 /* Corrected error */
|
---|
38 | #define ATA_STAT_DRQ 0x08
|
---|
39 | #define ATA_STAT_SEEK 0x10
|
---|
40 | #define ATA_STAT_SRV 0x10
|
---|
41 | #define ATA_STAT_WRERR 0x20
|
---|
42 | #define ATA_STAT_READY 0x40
|
---|
43 | #define ATA_STAT_BUSY 0x80
|
---|
44 |
|
---|
45 | /* Bits for HD_ERROR */
|
---|
46 | #define MARK_ERR 0x01 /* Bad address mark */
|
---|
47 | #define TRK0_ERR 0x02 /* couldn't find track 0 */
|
---|
48 | #define ABRT_ERR 0x04 /* Command aborted */
|
---|
49 | #define MCR_ERR 0x08 /* media change request */
|
---|
50 | #define ID_ERR 0x10 /* ID field not found */
|
---|
51 | #define MC_ERR 0x20 /* media changed */
|
---|
52 | #define ECC_ERR 0x40 /* Uncorrectable ECC error */
|
---|
53 | #define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */
|
---|
54 | #define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */
|
---|
55 |
|
---|
56 | /* Bits for uATARegDevCtl. */
|
---|
57 | #define ATA_DEVCTL_DISABLE_IRQ 0x02
|
---|
58 | #define ATA_DEVCTL_RESET 0x04
|
---|
59 | #define ATA_DEVCTL_HOB 0x80
|
---|
60 |
|
---|
61 |
|
---|
62 | /* ATA/ATAPI Commands (as of ATA/ATAPI-8 draft T13/1699D Revision 3a).
|
---|
63 | * Please keep this in sync with g_apszATACmdNames. */
|
---|
64 | typedef enum ATACMD
|
---|
65 | {
|
---|
66 | ATA_NOP = 0x00,
|
---|
67 | ATA_CFA_REQUEST_EXTENDED_ERROR_CODE = 0x03,
|
---|
68 | ATA_DATA_SET_MANAGEMENT = 0x06,
|
---|
69 | ATA_DEVICE_RESET = 0x08,
|
---|
70 | ATA_RECALIBRATE = 0x10,
|
---|
71 | ATA_READ_SECTORS = 0x20,
|
---|
72 | ATA_READ_SECTORS_WITHOUT_RETRIES = 0x21,
|
---|
73 | ATA_READ_LONG = 0x22,
|
---|
74 | ATA_READ_LONG_WITHOUT_RETRIES = 0x23,
|
---|
75 | ATA_READ_SECTORS_EXT = 0x24,
|
---|
76 | ATA_READ_DMA_EXT = 0x25,
|
---|
77 | ATA_READ_DMA_QUEUED_EXT = 0x26,
|
---|
78 | ATA_READ_NATIVE_MAX_ADDRESS_EXT = 0x27,
|
---|
79 | ATA_READ_MULTIPLE_EXT = 0x29,
|
---|
80 | ATA_READ_STREAM_DMA_EXT = 0x2a,
|
---|
81 | ATA_READ_STREAM_EXT = 0x2b,
|
---|
82 | ATA_READ_LOG_EXT = 0x2f,
|
---|
83 | ATA_WRITE_SECTORS = 0x30,
|
---|
84 | ATA_WRITE_SECTORS_WITHOUT_RETRIES = 0x31,
|
---|
85 | ATA_WRITE_LONG = 0x32,
|
---|
86 | ATA_WRITE_LONG_WITHOUT_RETRIES = 0x33,
|
---|
87 | ATA_WRITE_SECTORS_EXT = 0x34,
|
---|
88 | ATA_WRITE_DMA_EXT = 0x35,
|
---|
89 | ATA_WRITE_DMA_QUEUED_EXT = 0x36,
|
---|
90 | ATA_SET_MAX_ADDRESS_EXT = 0x37,
|
---|
91 | ATA_CFA_WRITE_SECTORS_WITHOUT_ERASE = 0x38,
|
---|
92 | ATA_WRITE_MULTIPLE_EXT = 0x39,
|
---|
93 | ATA_WRITE_STREAM_DMA_EXT = 0x3a,
|
---|
94 | ATA_WRITE_STREAM_EXT = 0x3b,
|
---|
95 | ATA_WRITE_VERIFY = 0x3c,
|
---|
96 | ATA_WRITE_DMA_FUA_EXT = 0x3d,
|
---|
97 | ATA_WRITE_DMA_QUEUED_FUA_EXT = 0x3e,
|
---|
98 | ATA_WRITE_LOG_EXT = 0x3f,
|
---|
99 | ATA_READ_VERIFY_SECTORS = 0x40,
|
---|
100 | ATA_READ_VERIFY_SECTORS_WITHOUT_RETRIES = 0x41,
|
---|
101 | ATA_READ_VERIFY_SECTORS_EXT = 0x42,
|
---|
102 | ATA_WRITE_UNCORRECTABLE_EXT = 0x45,
|
---|
103 | ATA_READ_LOG_DMA_EXT = 0x47,
|
---|
104 | ATA_FORMAT_TRACK = 0x50,
|
---|
105 | ATA_CONFIGURE_STREAM = 0x51,
|
---|
106 | ATA_WRITE_LOG_DMA_EXT = 0x57,
|
---|
107 | ATA_TRUSTED_RECEIVE = 0x5c,
|
---|
108 | ATA_TRUSTED_RECEIVE_DMA = 0x5d,
|
---|
109 | ATA_TRUSTED_SEND = 0x5e,
|
---|
110 | ATA_TRUSTED_SEND_DMA = 0x5f,
|
---|
111 | ATA_READ_FPDMA_QUEUED = 0x60,
|
---|
112 | ATA_WRITE_FPDMA_QUEUED = 0x61,
|
---|
113 | ATA_SEEK = 0x70,
|
---|
114 | ATA_CFA_TRANSLATE_SECTOR = 0x87,
|
---|
115 | ATA_EXECUTE_DEVICE_DIAGNOSTIC = 0x90,
|
---|
116 | ATA_INITIALIZE_DEVICE_PARAMETERS = 0x91,
|
---|
117 | ATA_DOWNLOAD_MICROCODE = 0x92,
|
---|
118 | ATA_STANDBY_IMMEDIATE__ALT = 0x94,
|
---|
119 | ATA_IDLE_IMMEDIATE__ALT = 0x95,
|
---|
120 | ATA_STANDBY__ALT = 0x96,
|
---|
121 | ATA_IDLE__ALT = 0x97,
|
---|
122 | ATA_CHECK_POWER_MODE__ALT = 0x98,
|
---|
123 | ATA_SLEEP__ALT = 0x99,
|
---|
124 | ATA_PACKET = 0xa0,
|
---|
125 | ATA_IDENTIFY_PACKET_DEVICE = 0xa1,
|
---|
126 | ATA_SERVICE = 0xa2,
|
---|
127 | ATA_SMART = 0xb0,
|
---|
128 | ATA_DEVICE_CONFIGURATION_OVERLAY = 0xb1,
|
---|
129 | ATA_NV_CACHE = 0xb6,
|
---|
130 | ATA_CFA_ERASE_SECTORS = 0xc0,
|
---|
131 | ATA_READ_MULTIPLE = 0xc4,
|
---|
132 | ATA_WRITE_MULTIPLE = 0xc5,
|
---|
133 | ATA_SET_MULTIPLE_MODE = 0xc6,
|
---|
134 | ATA_READ_DMA_QUEUED = 0xc7,
|
---|
135 | ATA_READ_DMA = 0xc8,
|
---|
136 | ATA_READ_DMA_WITHOUT_RETRIES = 0xc9,
|
---|
137 | ATA_WRITE_DMA = 0xca,
|
---|
138 | ATA_WRITE_DMA_WITHOUT_RETRIES = 0xcb,
|
---|
139 | ATA_WRITE_DMA_QUEUED = 0xcc,
|
---|
140 | ATA_CFA_WRITE_MULTIPLE_WITHOUT_ERASE = 0xcd,
|
---|
141 | ATA_WRITE_MULTIPLE_FUA_EXT = 0xce,
|
---|
142 | ATA_CHECK_MEDIA_CARD_TYPE = 0xd1,
|
---|
143 | ATA_GET_MEDIA_STATUS = 0xda,
|
---|
144 | ATA_ACKNOWLEDGE_MEDIA_CHANGE = 0xdb,
|
---|
145 | ATA_BOOT_POST_BOOT = 0xdc,
|
---|
146 | ATA_BOOT_PRE_BOOT = 0xdd,
|
---|
147 | ATA_MEDIA_LOCK = 0xde,
|
---|
148 | ATA_MEDIA_UNLOCK = 0xdf,
|
---|
149 | ATA_STANDBY_IMMEDIATE = 0xe0,
|
---|
150 | ATA_IDLE_IMMEDIATE = 0xe1,
|
---|
151 | ATA_STANDBY = 0xe2,
|
---|
152 | ATA_IDLE = 0xe3,
|
---|
153 | ATA_READ_BUFFER = 0xe4,
|
---|
154 | ATA_CHECK_POWER_MODE = 0xe5,
|
---|
155 | ATA_SLEEP = 0xe6,
|
---|
156 | ATA_FLUSH_CACHE = 0xe7,
|
---|
157 | ATA_WRITE_BUFFER = 0xe8,
|
---|
158 | ATA_WRITE_SAME = 0xe9,
|
---|
159 | ATA_FLUSH_CACHE_EXT = 0xea,
|
---|
160 | ATA_IDENTIFY_DEVICE = 0xec,
|
---|
161 | ATA_MEDIA_EJECT = 0xed,
|
---|
162 | ATA_IDENTIFY_DMA = 0xee,
|
---|
163 | ATA_SET_FEATURES = 0xef,
|
---|
164 | ATA_SECURITY_SET_PASSWORD = 0xf1,
|
---|
165 | ATA_SECURITY_UNLOCK = 0xf2,
|
---|
166 | ATA_SECURITY_ERASE_PREPARE = 0xf3,
|
---|
167 | ATA_SECURITY_ERASE_UNIT = 0xf4,
|
---|
168 | ATA_SECURITY_FREEZE_LOCK = 0xf5,
|
---|
169 | ATA_SECURITY_DISABLE_PASSWORD = 0xf6,
|
---|
170 | ATA_READ_NATIVE_MAX_ADDRESS = 0xf8,
|
---|
171 | ATA_SET_MAX = 0xf9
|
---|
172 | } ATACMD;
|
---|
173 |
|
---|
174 |
|
---|
175 | #define ATA_MODE_MDMA 0x20
|
---|
176 | #define ATA_MODE_UDMA 0x40
|
---|
177 |
|
---|
178 |
|
---|
179 | #define ATA_TRANSFER_ID(thismode, maxspeed, currmode) \
|
---|
180 | ( ((1 << (maxspeed + 1)) - 1) \
|
---|
181 | | ((((thismode ^ currmode) & 0xf8) == 0) ? 1 << ((currmode & 0x07) + 8) : 0))
|
---|
182 |
|
---|
183 | /**
|
---|
184 | * Length of the ATA VPD data (without termination)
|
---|
185 | */
|
---|
186 | #define ATA_SERIAL_NUMBER_LENGTH 20
|
---|
187 | #define ATA_FIRMWARE_REVISION_LENGTH 8
|
---|
188 | #define ATA_MODEL_NUMBER_LENGTH 40
|
---|
189 |
|
---|
190 | /** Mask to get the LBA value from a LBA range. */
|
---|
191 | #define ATA_RANGE_LBA_MASK UINT64_C(0xffffffffffff)
|
---|
192 | /** Mas to get the length value from a LBA range. */
|
---|
193 | #define ATA_RANGE_LENGTH_MASK UINT64_C(0xffff000000000000)
|
---|
194 | /** Returns the length of the range in sectors. */
|
---|
195 | #define ATA_RANGE_LENGTH_GET(val) (((val) & ATA_RANGE_LENGTH_MASK) >> 48)
|
---|
196 |
|
---|
197 | /* ATAPI defines */
|
---|
198 |
|
---|
199 | #define ATAPI_PACKET_SIZE 12
|
---|
200 |
|
---|
201 |
|
---|
202 | #define ATAPI_INT_REASON_CD 0x01 /* 0 = data transfer */
|
---|
203 | #define ATAPI_INT_REASON_IO 0x02 /* 1 = transfer to the host */
|
---|
204 | #define ATAPI_INT_REASON_REL 0x04
|
---|
205 | #define ATAPI_INT_REASON_TAG_MASK 0xf8
|
---|
206 |
|
---|
207 | #if defined(LOG_ENABLED) && defined(IN_RING3)
|
---|
208 | const char * ATACmdText(uint8_t uCmd);
|
---|
209 | #endif
|
---|
210 |
|
---|
211 | #endif /* !VBOX_INCLUDED_ata_h */
|
---|
212 |
|
---|