summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/IndustryStandard/Scsi.h
blob: 64b9918b82a01d5f5667fb68dc65358ca1d07510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
/** @file
  Support for SCSI-2 standard

  Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __SCSI_H__
#define __SCSI_H__

//
// SCSI command OP Code
//
//
// Commands for all device types
//
#define EFI_SCSI_OP_CHANGE_DEFINITION 0x40
#define EFI_SCSI_OP_COMPARE           0x39
#define EFI_SCSI_OP_COPY              0x18
#define EFI_SCSI_OP_COPY_VERIFY       0x3a
#define EFI_SCSI_OP_INQUIRY           0x12
#define EFI_SCSI_OP_LOG_SELECT        0x4c
#define EFI_SCSI_OP_LOG_SENSE         0x4d
#define EFI_SCSI_OP_MODE_SEL6         0x15
#define EFI_SCSI_OP_MODE_SEL10        0x55
#define EFI_SCSI_OP_MODE_SEN6         0x1a
#define EFI_SCSI_OP_MODE_SEN10        0x5a
#define EFI_SCSI_OP_READ_BUFFER       0x3c
#define EFI_SCSI_OP_RECEIVE_DIAG      0x1c
#define EFI_SCSI_OP_REQUEST_SENSE     0x03
#define EFI_SCSI_OP_SEND_DIAG         0x1d
#define EFI_SCSI_OP_TEST_UNIT_READY   0x00
#define EFI_SCSI_OP_WRITE_BUFF        0x3b

//
// Additional commands for Direct Access Devices
//
#define EFI_SCSI_OP_FORMAT          0x04
#define EFI_SCSI_OP_LOCK_UN_CACHE   0x36
#define EFI_SCSI_OP_PREFETCH        0x34
#define EFI_SCSI_OP_MEDIA_REMOVAL   0x1e
#define EFI_SCSI_OP_READ6           0x08
#define EFI_SCSI_OP_READ10          0x28
#define EFI_SCSI_OP_READ16          0x88
#define EFI_SCSI_OP_READ_CAPACITY   0x25
#define EFI_SCSI_OP_READ_CAPACITY16 0x9e
#define EFI_SCSI_OP_READ_DEFECT     0x37
#define EFI_SCSI_OP_READ_LONG       0x3e
#define EFI_SCSI_OP_REASSIGN_BLK    0x07
#define EFI_SCSI_OP_RELEASE         0x17
#define EFI_SCSI_OP_REZERO          0x01
#define EFI_SCSI_OP_SEARCH_DATA_E   0x31
#define EFI_SCSI_OP_SEARCH_DATA_H   0x30
#define EFI_SCSI_OP_SEARCH_DATA_L   0x32
#define EFI_SCSI_OP_SEEK6           0x0b
#define EFI_SCSI_OP_SEEK10          0x2b
#define EFI_SCSI_OP_SEND_DIAG       0x1d
#define EFI_SCSI_OP_SET_LIMIT       0x33
#define EFI_SCSI_OP_START_STOP_UNIT 0x1b
#define EFI_SCSI_OP_SYNC_CACHE      0x35
#define EFI_SCSI_OP_VERIFY          0x2f
#define EFI_SCSI_OP_WRITE6          0x0a
#define EFI_SCSI_OP_WRITE10         0x2a
#define EFI_SCSI_OP_WRITE16         0x8a
#define EFI_SCSI_OP_WRITE_VERIFY    0x2e
#define EFI_SCSI_OP_WRITE_LONG      0x3f
#define EFI_SCSI_OP_WRITE_SAME      0x41
#define EFI_SCSI_OP_UNMAP           0x42

//
// Additional commands for Sequential Access Devices
//
#define EFI_SCSI_OP_ERASE             0x19
#define EFI_SCSI_OP_LOAD_UNLOAD       0x1b
#define EFI_SCSI_OP_LOCATE            0x2b
#define EFI_SCSI_OP_READ_BLOCK_LIMIT  0x05
#define EFI_SCSI_OP_READ_POS          0x34
#define EFI_SCSI_OP_READ_REVERSE      0x0f
#define EFI_SCSI_OP_RECOVER_BUF_DATA  0x14
#define EFI_SCSI_OP_RESERVE_UNIT      0x16
#define EFI_SCSI_OP_REWIND            0x01
#define EFI_SCSI_OP_SPACE             0x11
#define EFI_SCSI_OP_VERIFY_TAPE       0x13
#define EFI_SCSI_OP_WRITE_FILEMARK    0x10

//
// Additional commands for Printer Devices
//
#define EFI_SCSI_OP_PRINT       0x0a
#define EFI_SCSI_OP_SLEW_PRINT  0x0b
#define EFI_SCSI_OP_STOP_PRINT  0x1b
#define EFI_SCSI_OP_SYNC_BUFF   0x10

//
// Additional commands for Processor Devices
//
#define EFI_SCSI_OP_RECEIVE 0x08
#define EFI_SCSI_OP_SEND    0x0a

//
// Additional commands for Write-Once Devices
//
#define EFI_SCSI_OP_MEDIUM_SCAN     0x38
#define EFI_SCSI_OP_SEARCH_DAT_E10  0x31
#define EFI_SCSI_OP_SEARCH_DAT_E12  0xb1
#define EFI_SCSI_OP_SEARCH_DAT_H10  0x30
#define EFI_SCSI_OP_SEARCH_DAT_H12  0xb0
#define EFI_SCSI_OP_SEARCH_DAT_L10  0x32
#define EFI_SCSI_OP_SEARCH_DAT_L12  0xb2
#define EFI_SCSI_OP_SET_LIMIT10     0x33
#define EFI_SCSI_OP_SET_LIMIT12     0xb3
#define EFI_SCSI_OP_VERIFY10        0x2f
#define EFI_SCSI_OP_VERIFY12        0xaf
#define EFI_SCSI_OP_WRITE12         0xaa
#define EFI_SCSI_OP_WRITE_VERIFY10  0x2e
#define EFI_SCSI_OP_WRITE_VERIFY12  0xae

//
// Additional commands for CD-ROM Devices
//
#define EFI_SCSI_OP_PLAY_AUD_10       0x45
#define EFI_SCSI_OP_PLAY_AUD_12       0xa5
#define EFI_SCSI_OP_PLAY_AUD_MSF      0x47
#define EFI_SCSI_OP_PLAY_AUD_TKIN     0x48
#define EFI_SCSI_OP_PLAY_TK_REL10     0x49
#define EFI_SCSI_OP_PLAY_TK_REL12     0xa9
#define EFI_SCSI_OP_READ_CD_CAPACITY  0x25
#define EFI_SCSI_OP_READ_HEADER       0x44
#define EFI_SCSI_OP_READ_SUB_CHANNEL  0x42
#define EFI_SCSI_OP_READ_TOC          0x43

//
// Additional commands for Scanner Devices
//
#define EFI_SCSI_OP_GET_DATABUFF_STAT 0x34
#define EFI_SCSI_OP_GET_WINDOW        0x25
#define EFI_SCSI_OP_OBJECT_POS        0x31
#define EFI_SCSI_OP_SCAN              0x1b
#define EFI_SCSI_OP_SET_WINDOW        0x24

//
// Additional commands for Optical Memory Devices
//
#define EFI_SCSI_OP_UPDATE_BLOCK  0x3d

//
// Additional commands for Medium Changer Devices
//
#define EFI_SCSI_OP_EXCHANGE_MEDIUM   0xa6
#define EFI_SCSI_OP_INIT_ELEMENT_STAT 0x07
#define EFI_SCSI_OP_POS_TO_ELEMENT    0x2b
#define EFI_SCSI_OP_REQUEST_VE_ADDR   0xb5
#define EFI_SCSI_OP_SEND_VOL_TAG      0xb6

//
// Additional commands for Communication Devices
//
#define EFI_SCSI_OP_GET_MESSAGE6    0x08
#define EFI_SCSI_OP_GET_MESSAGE10   0x28
#define EFI_SCSI_OP_GET_MESSAGE12   0xa8
#define EFI_SCSI_OP_SEND_MESSAGE6   0x0a
#define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
#define EFI_SCSI_OP_SEND_MESSAGE12  0xaa

//
// Additional commands for Secure Transactions
//
#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5

//
// SCSI Data Transfer Direction
//
#define EFI_SCSI_DATA_IN  0
#define EFI_SCSI_DATA_OUT 1

//
// SCSI Block Command Cache Control Parameters
//
#define EFI_SCSI_BLOCK_FUA  BIT3  ///< Force Unit Access
#define EFI_SCSI_BLOCK_DPO  BIT4  ///< Disable Page Out

//
// Peripheral Device Type Definitions
//
#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g. magnetic disk)
#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device (e.g. magnetic tape)
#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g. some optical disks)
#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g. some optical disks)
#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer device (e.g. jukeboxes)
#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications device (obsolete)
#define EFI_SCSI_TYPE_ASCIT8_1        0x0A  ///< Defined by ASC IT8 (Graphic arts pre-press devices)
#define EFI_SCSI_TYPE_ASCIT8_2        0x0B  ///< Defined by ASC IT8 (Graphic arts pre-press devices)
#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller device (e.g., RAID)
#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access device (e.g., magnetic disk)
#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer device
#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive Interface
#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager device
#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device type

//
// Page Codes for INQUIRY command
//
#define EFI_SCSI_PAGE_CODE_SUPPORTED_VPD    0x00
#define EFI_SCSI_PAGE_CODE_BLOCK_LIMITS_VPD 0xB0

#pragma pack(1)
///
/// Standard INQUIRY data format
///
typedef struct {
  UINT8 Peripheral_Type : 5;
  UINT8 Peripheral_Qualifier : 3;
  UINT8 DeviceType_Modifier : 7;
  UINT8 Rmb : 1;
  UINT8 Version;
  UINT8 Response_Data_Format;
  UINT8 Addnl_Length;
  UINT8 Reserved_5_95[95 - 5 + 1];
} EFI_SCSI_INQUIRY_DATA;

///
/// Supported VPD Pages VPD page
///
typedef struct {
  UINT8 Peripheral_Type : 5;
  UINT8 Peripheral_Qualifier : 3;
  UINT8 PageCode;
  UINT8 PageLength2;
  UINT8 PageLength1;
  UINT8 SupportedVpdPageList[0x100];
} EFI_SCSI_SUPPORTED_VPD_PAGES_VPD_PAGE;

///
/// Block Limits VPD page
///
typedef struct {
  UINT8 Peripheral_Type : 5;
  UINT8 Peripheral_Qualifier : 3;
  UINT8 PageCode;
  UINT8 PageLength2;
  UINT8 PageLength1;
  UINT8 WriteSameNonZero : 1;
  UINT8 Reserved_4 : 7;
  UINT8 MaximumCompareAndWriteLength;
  UINT8 OptimalTransferLengthGranularity2;
  UINT8 OptimalTransferLengthGranularity1;
  UINT8 MaximumTransferLength4;
  UINT8 MaximumTransferLength3;
  UINT8 MaximumTransferLength2;
  UINT8 MaximumTransferLength1;
  UINT8 OptimalTransferLength4;
  UINT8 OptimalTransferLength3;
  UINT8 OptimalTransferLength2;
  UINT8 OptimalTransferLength1;
  UINT8 MaximumPrefetchXdreadXdwriteTransferLength4;
  UINT8 MaximumPrefetchXdreadXdwriteTransferLength3;
  UINT8 MaximumPrefetchXdreadXdwriteTransferLength2;
  UINT8 MaximumPrefetchXdreadXdwriteTransferLength1;
  UINT8 MaximumUnmapLbaCount4;
  UINT8 MaximumUnmapLbaCount3;
  UINT8 MaximumUnmapLbaCount2;
  UINT8 MaximumUnmapLbaCount1;
  UINT8 MaximumUnmapBlockDescriptorCount4;
  UINT8 MaximumUnmapBlockDescriptorCount3;
  UINT8 MaximumUnmapBlockDescriptorCount2;
  UINT8 MaximumUnmapBlockDescriptorCount1;
  UINT8 OptimalUnmapGranularity4;
  UINT8 OptimalUnmapGranularity3;
  UINT8 OptimalUnmapGranularity2;
  UINT8 OptimalUnmapGranularity1;
  UINT8 UnmapGranularityAlignment4 : 7;
  UINT8 UnmapGranularityAlignmentValid : 1;
  UINT8 UnmapGranularityAlignment3;
  UINT8 UnmapGranularityAlignment2;
  UINT8 UnmapGranularityAlignment1;
  UINT8 MaximumWriteSameLength4;
  UINT8 MaximumWriteSameLength3;
  UINT8 MaximumWriteSameLength2;
  UINT8 MaximumWriteSameLength1;
  UINT8 MaximumAtomicTransferLength4;
  UINT8 MaximumAtomicTransferLength3;
  UINT8 MaximumAtomicTransferLength2;
  UINT8 MaximumAtomicTransferLength1;
  UINT8 AtomicAlignment4;
  UINT8 AtomicAlignment3;
  UINT8 AtomicAlignment2;
  UINT8 AtomicAlignment1;
  UINT8 AtomicTransferLengthGranularity4;
  UINT8 AtomicTransferLengthGranularity3;
  UINT8 AtomicTransferLengthGranularity2;
  UINT8 AtomicTransferLengthGranularity1;
  UINT8 MaximumAtomicTransferLengthWithAtomicBoundary4;
  UINT8 MaximumAtomicTransferLengthWithAtomicBoundary3;
  UINT8 MaximumAtomicTransferLengthWithAtomicBoundary2;
  UINT8 MaximumAtomicTransferLengthWithAtomicBoundary1;
  UINT8 MaximumAtomicBoundarySize4;
  UINT8 MaximumAtomicBoundarySize3;
  UINT8 MaximumAtomicBoundarySize2;
  UINT8 MaximumAtomicBoundarySize1;
} EFI_SCSI_BLOCK_LIMITS_VPD_PAGE;

///
/// Error codes 70h and 71h sense data format
///
typedef struct {
  UINT8 Error_Code : 7;
  UINT8 Valid : 1;
  UINT8 Segment_Number;
  UINT8 Sense_Key : 4;
  UINT8 Reserved_21 : 1;
  UINT8 Ili : 1;
  UINT8 Reserved_22 : 2;
  UINT8 Information_3_6[4];
  UINT8 Addnl_Sense_Length;           ///< Additional sense length (n-7)
  UINT8 Vendor_Specific_8_11[4];
  UINT8 Addnl_Sense_Code;             ///< Additional sense code
  UINT8 Addnl_Sense_Code_Qualifier;   ///< Additional sense code qualifier
  UINT8 Field_Replaceable_Unit_Code;  ///< Field replaceable unit code
  UINT8 Reserved_15_17[3];
} EFI_SCSI_SENSE_DATA;

///
/// SCSI Disk READ CAPACITY Data
///
typedef struct {
  UINT8 LastLba3;
  UINT8 LastLba2;
  UINT8 LastLba1;
  UINT8 LastLba0;
  UINT8 BlockSize3;
  UINT8 BlockSize2;
  UINT8 BlockSize1;
  UINT8 BlockSize0;
} EFI_SCSI_DISK_CAPACITY_DATA;

typedef struct {
  UINT8 LastLba7;
  UINT8 LastLba6;
  UINT8 LastLba5;
  UINT8 LastLba4;
  UINT8 LastLba3;
  UINT8 LastLba2;
  UINT8 LastLba1;
  UINT8 LastLba0;
  UINT8 BlockSize3;
  UINT8 BlockSize2;
  UINT8 BlockSize1;
  UINT8 BlockSize0;
  UINT8 Protection;
  UINT8 LogicPerPhysical;
  UINT8 LowestAlignLogic2;
  UINT8 LowestAlignLogic1;
  UINT8 Reserved[16];
} EFI_SCSI_DISK_CAPACITY_DATA16;

typedef struct {
  UINT16 DataLen;
  UINT16 BlkDespDataLen;
  UINT8  Reserved[4];
} EFI_SCSI_DISK_UNMAP_PARAM_LIST_HEADER;

typedef struct {
  UINT64 Lba;
  UINT32 BlockNum;
  UINT8  Reserved[4];
} EFI_SCSI_DISK_UNMAP_BLOCK_DESP;


#pragma pack()

//
// Sense Key
//
#define EFI_SCSI_SK_NO_SENSE          (0x0)
#define EFI_SCSI_SK_RECOVERY_ERROR    (0x1)
#define EFI_SCSI_SK_NOT_READY         (0x2)
#define EFI_SCSI_SK_MEDIUM_ERROR      (0x3)
#define EFI_SCSI_SK_HARDWARE_ERROR    (0x4)
#define EFI_SCSI_SK_ILLEGAL_REQUEST   (0x5)
#define EFI_SCSI_SK_UNIT_ATTENTION    (0x6)
#define EFI_SCSI_SK_DATA_PROTECT      (0x7)
#define EFI_SCSI_SK_BLANK_CHECK       (0x8)
#define EFI_SCSI_SK_VENDOR_SPECIFIC   (0x9)
#define EFI_SCSI_SK_RESERVED_A        (0xA)
#define EFI_SCSI_SK_ABORT             (0xB)
#define EFI_SCSI_SK_RESERVED_C        (0xC)
#define EFI_SCSI_SK_OVERFLOW          (0xD)
#define EFI_SCSI_SK_MISCOMPARE        (0xE)
#define EFI_SCSI_SK_RESERVED_F        (0xF)

//
// Additional Sense Codes and Sense Code Qualifiers.
// Only some frequently used additional sense codes and qualifiers are
// defined here. Please refer to SCSI standard for full value definition.
//
#define EFI_SCSI_ASC_NOT_READY                    (0x04)
#define EFI_SCSI_ASCQ_IN_PROGRESS                 (0x01)

#define EFI_SCSI_ASC_MEDIA_ERR1                   (0x10)
#define EFI_SCSI_ASC_MEDIA_ERR2                   (0x11)
#define EFI_SCSI_ASC_MEDIA_ERR3                   (0x14)
#define EFI_SCSI_ASC_MEDIA_ERR4                   (0x30)
#define EFI_SCSI_ASC_MEDIA_UPSIDE_DOWN            (0x06)
#define EFI_SCSI_ASC_INVALID_CMD                  (0x20)
#define EFI_SCSI_ASC_LBA_OUT_OF_RANGE             (0x21)
#define EFI_SCSI_ASC_INVALID_FIELD                (0x24)
#define EFI_SCSI_ASC_WRITE_PROTECTED              (0x27)
#define EFI_SCSI_ASC_MEDIA_CHANGE                 (0x28)
#define EFI_SCSI_ASC_RESET                        (0x29)   ///< Power On Reset or Bus Reset occurred
#define EFI_SCSI_ASC_ILLEGAL_FIELD                (0x26)
#define EFI_SCSI_ASC_NO_MEDIA                     (0x3A)
#define EFI_SCSI_ASC_ILLEGAL_MODE_FOR_THIS_TRACK  (0x64)

#endif