]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h
3a7f6331ca1f8f342d0e9df85248c3be90b8bb1a
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordSmm / OpalAhciMode.h
1 /** @file
2 Header file for AHCI mode of ATA host controller.
3
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15
16 #ifndef __OPAL_PASSWORD_AHCI_MODE_H__
17 #define __OPAL_PASSWORD_AHCI_MODE_H__
18
19 //
20 // OPAL LIBRARY CALLBACKS
21 //
22 #define ATA_COMMAND_TRUSTED_RECEIVE 0x5C
23 #define ATA_COMMAND_TRUSTED_SEND 0x5E
24
25 //
26 // ATA TRUSTED commands express transfer Length in 512 byte multiple
27 //
28 #define ATA_TRUSTED_TRANSFER_LENGTH_MULTIPLE 512
29 #define ATA_DEVICE_LBA 0x40 ///< Set for commands with LBA (rather than CHS) addresses
30
31
32 #define EFI_AHCI_BAR_INDEX 0x05
33
34 #define EFI_AHCI_CAPABILITY_OFFSET 0x0000
35 #define EFI_AHCI_CAP_SAM BIT18
36 #define EFI_AHCI_GHC_OFFSET 0x0004
37 #define EFI_AHCI_GHC_RESET BIT0
38 #define EFI_AHCI_GHC_IE BIT1
39 #define EFI_AHCI_GHC_ENABLE BIT31
40 #define EFI_AHCI_IS_OFFSET 0x0008
41 #define EFI_AHCI_PI_OFFSET 0x000C
42
43 typedef struct {
44 UINT32 Lower32;
45 UINT32 Upper32;
46 } DATA_32;
47
48 typedef union {
49 DATA_32 Uint32;
50 UINT64 Uint64;
51 } DATA_64;
52
53 //
54 // Each PRDT entry can point to a memory block up to 4M byte
55 //
56 #define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000
57
58 #define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device
59 #define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20
60 #define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host
61 #define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20
62 #define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host
63 #define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4
64 #define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional
65 #define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28
66 #define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional
67 #define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional
68 #define EFI_AHCI_FIS_BIST_LENGTH 12
69 #define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host
70 #define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20
71 #define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host
72 #define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
73
74 #define EFI_AHCI_D2H_FIS_OFFSET 0x40
75 #define EFI_AHCI_DMA_FIS_OFFSET 0x00
76 #define EFI_AHCI_PIO_FIS_OFFSET 0x20
77 #define EFI_AHCI_SDB_FIS_OFFSET 0x58
78 #define EFI_AHCI_FIS_TYPE_MASK 0xFF
79 #define EFI_AHCI_U_FIS_OFFSET 0x60
80
81 //
82 // Port register
83 //
84 #define EFI_AHCI_PORT_START 0x0100
85 #define EFI_AHCI_PORT_REG_WIDTH 0x0080
86 #define EFI_AHCI_PORT_CLB 0x0000
87 #define EFI_AHCI_PORT_CLBU 0x0004
88 #define EFI_AHCI_PORT_FB 0x0008
89 #define EFI_AHCI_PORT_FBU 0x000C
90 #define EFI_AHCI_PORT_IS 0x0010
91 #define EFI_AHCI_PORT_IS_DHRS BIT0
92 #define EFI_AHCI_PORT_IS_PSS BIT1
93 #define EFI_AHCI_PORT_IS_SSS BIT2
94 #define EFI_AHCI_PORT_IS_SDBS BIT3
95 #define EFI_AHCI_PORT_IS_UFS BIT4
96 #define EFI_AHCI_PORT_IS_DPS BIT5
97 #define EFI_AHCI_PORT_IS_PCS BIT6
98 #define EFI_AHCI_PORT_IS_DIS BIT7
99 #define EFI_AHCI_PORT_IS_PRCS BIT22
100 #define EFI_AHCI_PORT_IS_IPMS BIT23
101 #define EFI_AHCI_PORT_IS_OFS BIT24
102 #define EFI_AHCI_PORT_IS_INFS BIT26
103 #define EFI_AHCI_PORT_IS_IFS BIT27
104 #define EFI_AHCI_PORT_IS_HBDS BIT28
105 #define EFI_AHCI_PORT_IS_HBFS BIT29
106 #define EFI_AHCI_PORT_IS_TFES BIT30
107 #define EFI_AHCI_PORT_IS_CPDS BIT31
108 #define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF
109 #define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
110
111 #define EFI_AHCI_PORT_IE 0x0014
112 #define EFI_AHCI_PORT_CMD 0x0018
113 #define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE
114 #define EFI_AHCI_PORT_CMD_ST BIT0
115 #define EFI_AHCI_PORT_CMD_SUD BIT1
116 #define EFI_AHCI_PORT_CMD_POD BIT2
117 #define EFI_AHCI_PORT_CMD_COL BIT3
118 #define EFI_AHCI_PORT_CMD_CR BIT15
119 #define EFI_AHCI_PORT_CMD_FRE BIT4
120 #define EFI_AHCI_PORT_CMD_FR BIT14
121 #define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL)
122 #define EFI_AHCI_PORT_CMD_PMA BIT17
123 #define EFI_AHCI_PORT_CMD_HPCP BIT18
124 #define EFI_AHCI_PORT_CMD_MPSP BIT19
125 #define EFI_AHCI_PORT_CMD_CPD BIT20
126 #define EFI_AHCI_PORT_CMD_ESP BIT21
127 #define EFI_AHCI_PORT_CMD_ATAPI BIT24
128 #define EFI_AHCI_PORT_CMD_DLAE BIT25
129 #define EFI_AHCI_PORT_CMD_ALPE BIT26
130 #define EFI_AHCI_PORT_CMD_ASP BIT27
131 #define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
132 #define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )
133 #define EFI_AHCI_PORT_TFD 0x0020
134 #define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
135 #define EFI_AHCI_PORT_TFD_BSY BIT7
136 #define EFI_AHCI_PORT_TFD_DRQ BIT3
137 #define EFI_AHCI_PORT_TFD_ERR BIT0
138 #define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00
139 #define EFI_AHCI_PORT_SIG 0x0024
140 #define EFI_AHCI_PORT_SSTS 0x0028
141 #define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F
142 #define EFI_AHCI_PORT_SSTS_DET 0x0001
143 #define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003
144 #define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0
145 #define EFI_AHCI_PORT_SCTL 0x002C
146 #define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F
147 #define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)
148 #define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001
149 #define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003
150 #define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0
151 #define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00
152 #define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300
153 #define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100
154 #define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200
155 #define EFI_AHCI_PORT_SERR 0x0030
156 #define EFI_AHCI_PORT_SERR_RDIE BIT0
157 #define EFI_AHCI_PORT_SERR_RCE BIT1
158 #define EFI_AHCI_PORT_SERR_TDIE BIT8
159 #define EFI_AHCI_PORT_SERR_PCDIE BIT9
160 #define EFI_AHCI_PORT_SERR_PE BIT10
161 #define EFI_AHCI_PORT_SERR_IE BIT11
162 #define EFI_AHCI_PORT_SERR_PRC BIT16
163 #define EFI_AHCI_PORT_SERR_PIE BIT17
164 #define EFI_AHCI_PORT_SERR_CW BIT18
165 #define EFI_AHCI_PORT_SERR_BDE BIT19
166 #define EFI_AHCI_PORT_SERR_DE BIT20
167 #define EFI_AHCI_PORT_SERR_CRCE BIT21
168 #define EFI_AHCI_PORT_SERR_HE BIT22
169 #define EFI_AHCI_PORT_SERR_LSE BIT23
170 #define EFI_AHCI_PORT_SERR_TSTE BIT24
171 #define EFI_AHCI_PORT_SERR_UFT BIT25
172 #define EFI_AHCI_PORT_SERR_EX BIT26
173 #define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF
174 #define EFI_AHCI_PORT_SACT 0x0034
175 #define EFI_AHCI_PORT_CI 0x0038
176 #define EFI_AHCI_PORT_SNTF 0x003C
177
178
179 #pragma pack(1)
180 //
181 // Command List structure includes total 32 entries.
182 // The entry Data structure is listed at the following.
183 //
184 typedef struct {
185 UINT32 AhciCmdCfl:5; //Command FIS Length
186 UINT32 AhciCmdA:1; //ATAPI
187 UINT32 AhciCmdW:1; //Write
188 UINT32 AhciCmdP:1; //Prefetchable
189 UINT32 AhciCmdR:1; //Reset
190 UINT32 AhciCmdB:1; //BIST
191 UINT32 AhciCmdC:1; //Clear Busy upon R_OK
192 UINT32 AhciCmdRsvd:1;
193 UINT32 AhciCmdPmp:4; //Port Multiplier Port
194 UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length
195 UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count
196 UINT32 AhciCmdCtba; //Command Table Descriptor Base Address
197 UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs
198 UINT32 AhciCmdRsvd1[4];
199 } EFI_AHCI_COMMAND_LIST;
200
201 //
202 // This is a software constructed FIS.
203 // For Data transfer operations, this is the H2D Register FIS format as
204 // specified in the Serial ATA Revision 2.6 specification.
205 //
206 typedef struct {
207 UINT8 AhciCFisType;
208 UINT8 AhciCFisPmNum:4;
209 UINT8 AhciCFisRsvd:1;
210 UINT8 AhciCFisRsvd1:1;
211 UINT8 AhciCFisRsvd2:1;
212 UINT8 AhciCFisCmdInd:1;
213 UINT8 AhciCFisCmd;
214 UINT8 AhciCFisFeature;
215 UINT8 AhciCFisSecNum;
216 UINT8 AhciCFisClyLow;
217 UINT8 AhciCFisClyHigh;
218 UINT8 AhciCFisDevHead;
219 UINT8 AhciCFisSecNumExp;
220 UINT8 AhciCFisClyLowExp;
221 UINT8 AhciCFisClyHighExp;
222 UINT8 AhciCFisFeatureExp;
223 UINT8 AhciCFisSecCount;
224 UINT8 AhciCFisSecCountExp;
225 UINT8 AhciCFisRsvd3;
226 UINT8 AhciCFisControl;
227 UINT8 AhciCFisRsvd4[4];
228 UINT8 AhciCFisRsvd5[44];
229 } EFI_AHCI_COMMAND_FIS;
230
231 //
232 // ACMD: ATAPI command (12 or 16 bytes)
233 //
234 typedef struct {
235 UINT8 AtapiCmd[0x10];
236 } EFI_AHCI_ATAPI_COMMAND;
237
238 //
239 // Physical Region Descriptor Table includes up to 65535 entries
240 // The entry Data structure is listed at the following.
241 // the actual entry number comes from the PRDTL field in the command
242 // list entry for this command slot.
243 //
244 typedef struct {
245 UINT32 AhciPrdtDba; //Data Base Address
246 UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs
247 UINT32 AhciPrdtRsvd;
248 UINT32 AhciPrdtDbc:22; //Data Byte Count
249 UINT32 AhciPrdtRsvd1:9;
250 UINT32 AhciPrdtIoc:1; //Interrupt on Completion
251 } EFI_AHCI_COMMAND_PRDT;
252
253 //
254 // Command table Data strucute which is pointed to by the entry in the command list
255 //
256 typedef struct {
257 EFI_AHCI_COMMAND_FIS CommandFis; // A software constructed FIS.
258 EFI_AHCI_ATAPI_COMMAND AtapiCmd; // 12 or 16 bytes ATAPI cmd.
259 UINT8 Reserved[0x30];
260 EFI_AHCI_COMMAND_PRDT PrdtTable; // The scatter/gather list for Data transfer
261 } EFI_AHCI_COMMAND_TABLE;
262
263 //
264 // Received FIS structure
265 //
266 typedef struct {
267 UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00
268 UINT8 AhciDmaSetupFisRsvd[0x04];
269 UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20
270 UINT8 AhciPioSetupFisRsvd[0x0C];
271 UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40
272 UINT8 AhciD2HRegisterFisRsvd[0x04];
273 UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58
274 UINT8 AhciUnknownFis[0x40]; // Unkonwn Fis: offset 0x60
275 UINT8 AhciUnknownFisRsvd[0x60];
276 } EFI_AHCI_RECEIVED_FIS;
277
278 #pragma pack()
279
280 typedef struct {
281 EFI_AHCI_RECEIVED_FIS *AhciRFis;
282 EFI_AHCI_COMMAND_LIST *AhciCmdList;
283 EFI_AHCI_COMMAND_TABLE *AhciCommandTable;
284 } EFI_AHCI_REGISTERS;
285
286 extern EFI_AHCI_REGISTERS mAhciRegisters;
287 extern UINT32 mAhciBar;
288
289 /**
290 Send Buffer cmd to specific device.
291
292 @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
293 @param Port The number of port.
294 @param PortMultiplier The timeout Value of stop.
295 @param Buffer The Data Buffer to store IDENTIFY PACKET Data.
296
297 @retval EFI_DEVICE_ERROR The cmd abort with error occurs.
298 @retval EFI_TIMEOUT The operation is time out.
299 @retval EFI_UNSUPPORTED The device is not ready for executing.
300 @retval EFI_SUCCESS The cmd executes successfully.
301
302 **/
303 EFI_STATUS
304 EFIAPI
305 AhciIdentify (
306 IN EFI_AHCI_REGISTERS *AhciRegisters,
307 IN UINT8 Port,
308 IN UINT8 PortMultiplier,
309 IN OUT ATA_IDENTIFY_DATA *Buffer
310 );
311
312 /**
313 Get AHCI mode base address registers' Value.
314
315 @param[in] Bus The bus number of ata host controller.
316 @param[in] Device The device number of ata host controller.
317 @param[in] Function The function number of ata host controller.
318
319 @retval EFI_UNSUPPORTED Return this Value when the BARs is not IO type
320 @retval EFI_SUCCESS Get the Base address successfully
321 @retval Other Read the pci configureation Data error
322
323 **/
324 EFI_STATUS
325 EFIAPI
326 GetAhciBaseAddress (
327 IN UINTN Bus,
328 IN UINTN Device,
329 IN UINTN Function
330 );
331
332 /**
333 Allocate transfer-related Data struct which is used at AHCI mode.
334
335 @retval EFI_OUT_OF_RESOURCE The allocation is failure.
336 @retval EFI_SUCCESS Successful to allocate memory.
337
338 **/
339 EFI_STATUS
340 EFIAPI
341 AhciAllocateResource (
342 VOID
343 );
344
345 /**
346 Free allocated transfer-related Data struct which is used at AHCI mode.
347
348 **/
349 VOID
350 EFIAPI
351 AhciFreeResource (
352 VOID
353 );
354
355 /**
356 Initialize ATA host controller at AHCI mode.
357
358 The function is designed to initialize ATA host controller.
359
360 @param[in] Port The port number to do initialization.
361
362 **/
363 EFI_STATUS
364 EFIAPI
365 AhciModeInitialize (
366 UINT8 Port
367 );
368
369 /**
370 Start a PIO Data transfer on specific port.
371
372 @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
373 @param Port The number of port.
374 @param PortMultiplier The timeout Value of stop.
375 @param AtapiCommand The atapi command will be used for the transfer.
376 @param AtapiCommandLength The Length of the atapi command.
377 @param Read The transfer direction.
378 @param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK Data.
379 @param AtaStatusBlock The EFI_ATA_STATUS_BLOCK Data.
380 @param MemoryAddr The pointer to the Data Buffer.
381 @param DataCount The Data count to be transferred.
382 @param Timeout The timeout Value of non Data transfer.
383
384 @retval EFI_DEVICE_ERROR The PIO Data transfer abort with error occurs.
385 @retval EFI_TIMEOUT The operation is time out.
386 @retval EFI_UNSUPPORTED The device is not ready for transfer.
387 @retval EFI_SUCCESS The PIO Data transfer executes successfully.
388
389 **/
390 EFI_STATUS
391 EFIAPI
392 AhciPioTransfer (
393 IN EFI_AHCI_REGISTERS *AhciRegisters,
394 IN UINT8 Port,
395 IN UINT8 PortMultiplier,
396 IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
397 IN UINT8 AtapiCommandLength,
398 IN BOOLEAN Read,
399 IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
400 IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
401 IN OUT VOID *MemoryAddr,
402 IN UINT32 DataCount,
403 IN UINT64 Timeout
404 );
405
406
407 #endif
408