]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
IntelSiliconPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Ata / AtaAtapiPassThru / AhciMode.h
CommitLineData
a41b5272 1/** @file\r
2 Header file for AHCI mode of ATA host controller.\r
d1102dba 3\r
f3100a1a 4 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
d1102dba
LG
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
a41b5272 9\r
d1102dba
LG
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
a41b5272 12\r
13**/\r
14#ifndef __ATA_HC_AHCI_MODE_H__\r
15#define __ATA_HC_AHCI_MODE_H__\r
16\r
17#define EFI_AHCI_BAR_INDEX 0x05\r
18\r
19#define EFI_AHCI_CAPABILITY_OFFSET 0x0000\r
1ff1dd0f 20#define EFI_AHCI_CAP_SAM BIT18\r
cbd2a4b3 21#define EFI_AHCI_CAP_SSS BIT27\r
22#define EFI_AHCI_CAP_S64A BIT31\r
a41b5272 23#define EFI_AHCI_GHC_OFFSET 0x0004\r
24#define EFI_AHCI_GHC_RESET BIT0\r
25#define EFI_AHCI_GHC_IE BIT1\r
26#define EFI_AHCI_GHC_ENABLE BIT31\r
27#define EFI_AHCI_IS_OFFSET 0x0008\r
28#define EFI_AHCI_PI_OFFSET 0x000C\r
29\r
6b13aa60 30#define EFI_AHCI_MAX_PORTS 32\r
31\r
f3100a1a
RN
32#define AHCI_CAPABILITY2_OFFSET 0x0024\r
33#define AHCI_CAP2_SDS BIT3\r
34#define AHCI_CAP2_SADM BIT4\r
35\r
a41b5272 36typedef struct {\r
37 UINT32 Lower32;\r
38 UINT32 Upper32;\r
39} DATA_32;\r
40\r
41typedef union {\r
42 DATA_32 Uint32;\r
43 UINT64 Uint64;\r
44} DATA_64;\r
45\r
cbd2a4b3 46//\r
47// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms.\r
1fb805b1 48// Add a bit of margin for robustness.\r
cbd2a4b3 49//\r
1fb805b1 50#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 15\r
cbd2a4b3 51//\r
52// Refer SATA1.0a spec, the FIS enable time should be less than 500ms.\r
53//\r
54#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500)\r
55//\r
56// Refer SATA1.0a spec, the bus reset time should be less than 1s.\r
57//\r
58#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1)\r
59\r
a41b5272 60#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000\r
61#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000\r
62#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000\r
63#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000\r
64\r
65//\r
66// Each PRDT entry can point to a memory block up to 4M byte\r
67//\r
68#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000\r
69\r
70#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device\r
d1102dba 71#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20\r
a41b5272 72#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host\r
73#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20\r
74#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host\r
75#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4\r
76#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional\r
77#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28\r
78#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional\r
79#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional\r
80#define EFI_AHCI_FIS_BIST_LENGTH 12\r
81#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host\r
82#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20\r
83#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host\r
84#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8\r
85\r
86#define EFI_AHCI_D2H_FIS_OFFSET 0x40\r
87#define EFI_AHCI_DMA_FIS_OFFSET 0x00\r
88#define EFI_AHCI_PIO_FIS_OFFSET 0x20\r
89#define EFI_AHCI_SDB_FIS_OFFSET 0x58\r
90#define EFI_AHCI_FIS_TYPE_MASK 0xFF\r
91#define EFI_AHCI_U_FIS_OFFSET 0x60\r
92\r
93//\r
94// Port register\r
95//\r
96#define EFI_AHCI_PORT_START 0x0100\r
97#define EFI_AHCI_PORT_REG_WIDTH 0x0080\r
98#define EFI_AHCI_PORT_CLB 0x0000\r
99#define EFI_AHCI_PORT_CLBU 0x0004\r
100#define EFI_AHCI_PORT_FB 0x0008\r
101#define EFI_AHCI_PORT_FBU 0x000C\r
102#define EFI_AHCI_PORT_IS 0x0010\r
103#define EFI_AHCI_PORT_IS_DHRS BIT0\r
104#define EFI_AHCI_PORT_IS_PSS BIT1\r
105#define EFI_AHCI_PORT_IS_SSS BIT2\r
106#define EFI_AHCI_PORT_IS_SDBS BIT3\r
107#define EFI_AHCI_PORT_IS_UFS BIT4\r
108#define EFI_AHCI_PORT_IS_DPS BIT5\r
109#define EFI_AHCI_PORT_IS_PCS BIT6\r
110#define EFI_AHCI_PORT_IS_DIS BIT7\r
111#define EFI_AHCI_PORT_IS_PRCS BIT22\r
112#define EFI_AHCI_PORT_IS_IPMS BIT23\r
113#define EFI_AHCI_PORT_IS_OFS BIT24\r
114#define EFI_AHCI_PORT_IS_INFS BIT26\r
115#define EFI_AHCI_PORT_IS_IFS BIT27\r
116#define EFI_AHCI_PORT_IS_HBDS BIT28\r
117#define EFI_AHCI_PORT_IS_HBFS BIT29\r
118#define EFI_AHCI_PORT_IS_TFES BIT30\r
119#define EFI_AHCI_PORT_IS_CPDS BIT31\r
120#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF\r
121#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F\r
122\r
123#define EFI_AHCI_PORT_IE 0x0014\r
124#define EFI_AHCI_PORT_CMD 0x0018\r
125#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE\r
126#define EFI_AHCI_PORT_CMD_ST BIT0\r
127#define EFI_AHCI_PORT_CMD_SUD BIT1\r
128#define EFI_AHCI_PORT_CMD_POD BIT2\r
cbd2a4b3 129#define EFI_AHCI_PORT_CMD_CLO BIT3\r
a41b5272 130#define EFI_AHCI_PORT_CMD_CR BIT15\r
131#define EFI_AHCI_PORT_CMD_FRE BIT4\r
132#define EFI_AHCI_PORT_CMD_FR BIT14\r
133#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL)\r
134#define EFI_AHCI_PORT_CMD_PMA BIT17\r
135#define EFI_AHCI_PORT_CMD_HPCP BIT18\r
136#define EFI_AHCI_PORT_CMD_MPSP BIT19\r
137#define EFI_AHCI_PORT_CMD_CPD BIT20\r
138#define EFI_AHCI_PORT_CMD_ESP BIT21\r
139#define EFI_AHCI_PORT_CMD_ATAPI BIT24\r
140#define EFI_AHCI_PORT_CMD_DLAE BIT25\r
141#define EFI_AHCI_PORT_CMD_ALPE BIT26\r
142#define EFI_AHCI_PORT_CMD_ASP BIT27\r
143#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)\r
144#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )\r
145#define EFI_AHCI_PORT_TFD 0x0020\r
146#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)\r
147#define EFI_AHCI_PORT_TFD_BSY BIT7\r
148#define EFI_AHCI_PORT_TFD_DRQ BIT3\r
149#define EFI_AHCI_PORT_TFD_ERR BIT0\r
150#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00\r
151#define EFI_AHCI_PORT_SIG 0x0024\r
152#define EFI_AHCI_PORT_SSTS 0x0028\r
153#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F\r
154#define EFI_AHCI_PORT_SSTS_DET 0x0001\r
155#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003\r
156#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0\r
157#define EFI_AHCI_PORT_SCTL 0x002C\r
158#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F\r
159#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)\r
160#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001\r
161#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003\r
162#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0\r
163#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00\r
164#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300\r
165#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100\r
166#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200\r
167#define EFI_AHCI_PORT_SERR 0x0030\r
168#define EFI_AHCI_PORT_SERR_RDIE BIT0\r
169#define EFI_AHCI_PORT_SERR_RCE BIT1\r
170#define EFI_AHCI_PORT_SERR_TDIE BIT8\r
171#define EFI_AHCI_PORT_SERR_PCDIE BIT9\r
172#define EFI_AHCI_PORT_SERR_PE BIT10\r
173#define EFI_AHCI_PORT_SERR_IE BIT11\r
174#define EFI_AHCI_PORT_SERR_PRC BIT16\r
175#define EFI_AHCI_PORT_SERR_PIE BIT17\r
176#define EFI_AHCI_PORT_SERR_CW BIT18\r
177#define EFI_AHCI_PORT_SERR_BDE BIT19\r
178#define EFI_AHCI_PORT_SERR_DE BIT20\r
179#define EFI_AHCI_PORT_SERR_CRCE BIT21\r
490b5ea1 180#define EFI_AHCI_PORT_SERR_HE BIT22\r
a41b5272 181#define EFI_AHCI_PORT_SERR_LSE BIT23\r
182#define EFI_AHCI_PORT_SERR_TSTE BIT24\r
183#define EFI_AHCI_PORT_SERR_UFT BIT25\r
184#define EFI_AHCI_PORT_SERR_EX BIT26\r
185#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF\r
186#define EFI_AHCI_PORT_SACT 0x0034\r
187#define EFI_AHCI_PORT_CI 0x0038\r
188#define EFI_AHCI_PORT_SNTF 0x003C\r
f3100a1a
RN
189#define AHCI_PORT_DEVSLP 0x0044\r
190#define AHCI_PORT_DEVSLP_ADSE BIT0\r
191#define AHCI_PORT_DEVSLP_DSP BIT1\r
192#define AHCI_PORT_DEVSLP_DETO_MASK 0x000003FC\r
193#define AHCI_PORT_DEVSLP_MDAT_MASK 0x00007C00\r
194#define AHCI_PORT_DEVSLP_DITO_MASK 0x01FF8000\r
195#define AHCI_PORT_DEVSLP_DM_MASK 0x1E000000\r
a41b5272 196\r
197#pragma pack(1)\r
198//\r
199// Command List structure includes total 32 entries.\r
200// The entry data structure is listed at the following.\r
201//\r
202typedef struct {\r
203 UINT32 AhciCmdCfl:5; //Command FIS Length\r
204 UINT32 AhciCmdA:1; //ATAPI\r
205 UINT32 AhciCmdW:1; //Write\r
206 UINT32 AhciCmdP:1; //Prefetchable\r
207 UINT32 AhciCmdR:1; //Reset\r
208 UINT32 AhciCmdB:1; //BIST\r
209 UINT32 AhciCmdC:1; //Clear Busy upon R_OK\r
210 UINT32 AhciCmdRsvd:1;\r
211 UINT32 AhciCmdPmp:4; //Port Multiplier Port\r
212 UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length\r
213 UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count\r
214 UINT32 AhciCmdCtba; //Command Table Descriptor Base Address\r
215 UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs\r
d1102dba 216 UINT32 AhciCmdRsvd1[4];\r
a41b5272 217} EFI_AHCI_COMMAND_LIST;\r
218\r
219//\r
220// This is a software constructed FIS.\r
d1102dba 221// For data transfer operations, this is the H2D Register FIS format as\r
a41b5272 222// specified in the Serial ATA Revision 2.6 specification.\r
223//\r
224typedef struct {\r
225 UINT8 AhciCFisType;\r
226 UINT8 AhciCFisPmNum:4;\r
227 UINT8 AhciCFisRsvd:1;\r
228 UINT8 AhciCFisRsvd1:1;\r
229 UINT8 AhciCFisRsvd2:1;\r
230 UINT8 AhciCFisCmdInd:1;\r
231 UINT8 AhciCFisCmd;\r
232 UINT8 AhciCFisFeature;\r
233 UINT8 AhciCFisSecNum;\r
234 UINT8 AhciCFisClyLow;\r
235 UINT8 AhciCFisClyHigh;\r
236 UINT8 AhciCFisDevHead;\r
237 UINT8 AhciCFisSecNumExp;\r
238 UINT8 AhciCFisClyLowExp;\r
239 UINT8 AhciCFisClyHighExp;\r
240 UINT8 AhciCFisFeatureExp;\r
241 UINT8 AhciCFisSecCount;\r
242 UINT8 AhciCFisSecCountExp;\r
243 UINT8 AhciCFisRsvd3;\r
244 UINT8 AhciCFisControl;\r
245 UINT8 AhciCFisRsvd4[4];\r
246 UINT8 AhciCFisRsvd5[44];\r
247} EFI_AHCI_COMMAND_FIS;\r
248\r
249//\r
250// ACMD: ATAPI command (12 or 16 bytes)\r
251//\r
252typedef struct {\r
253 UINT8 AtapiCmd[0x10];\r
254} EFI_AHCI_ATAPI_COMMAND;\r
255\r
256//\r
257// Physical Region Descriptor Table includes up to 65535 entries\r
258// The entry data structure is listed at the following.\r
259// the actual entry number comes from the PRDTL field in the command\r
d1102dba 260// list entry for this command slot.\r
a41b5272 261//\r
262typedef struct {\r
263 UINT32 AhciPrdtDba; //Data Base Address\r
264 UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs\r
265 UINT32 AhciPrdtRsvd;\r
266 UINT32 AhciPrdtDbc:22; //Data Byte Count\r
267 UINT32 AhciPrdtRsvd1:9;\r
268 UINT32 AhciPrdtIoc:1; //Interrupt on Completion\r
269} EFI_AHCI_COMMAND_PRDT;\r
270\r
271//\r
272// Command table data strucute which is pointed to by the entry in the command list\r
273//\r
274typedef struct {\r
275 EFI_AHCI_COMMAND_FIS CommandFis; // A software constructed FIS.\r
276 EFI_AHCI_ATAPI_COMMAND AtapiCmd; // 12 or 16 bytes ATAPI cmd.\r
277 UINT8 Reserved[0x30];\r
278 EFI_AHCI_COMMAND_PRDT PrdtTable[65535]; // The scatter/gather list for data transfer\r
279} EFI_AHCI_COMMAND_TABLE;\r
280\r
281//\r
282// Received FIS structure\r
283//\r
284typedef struct {\r
285 UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00\r
286 UINT8 AhciDmaSetupFisRsvd[0x04];\r
287 UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20\r
d1102dba 288 UINT8 AhciPioSetupFisRsvd[0x0C];\r
a41b5272 289 UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40\r
290 UINT8 AhciD2HRegisterFisRsvd[0x04];\r
291 UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58\r
292 UINT8 AhciUnknownFis[0x40]; // Unkonwn Fis: offset 0x60\r
d1102dba
LG
293 UINT8 AhciUnknownFisRsvd[0x60];\r
294} EFI_AHCI_RECEIVED_FIS;\r
a41b5272 295\r
f3100a1a
RN
296typedef struct {\r
297 UINT8 Madt : 5;\r
298 UINT8 Reserved_5 : 3;\r
299 UINT8 Deto;\r
300 UINT16 Reserved_16;\r
301 UINT32 Reserved_32 : 31;\r
302 UINT32 Supported : 1;\r
303} DEVSLP_TIMING_VARIABLES;\r
304\r
a41b5272 305#pragma pack()\r
306\r
307typedef struct {\r
308 EFI_AHCI_RECEIVED_FIS *AhciRFis;\r
309 EFI_AHCI_COMMAND_LIST *AhciCmdList;\r
310 EFI_AHCI_COMMAND_TABLE *AhciCommandTable;\r
311 EFI_AHCI_RECEIVED_FIS *AhciRFisPciAddr;\r
312 EFI_AHCI_COMMAND_LIST *AhciCmdListPciAddr;\r
313 EFI_AHCI_COMMAND_TABLE *AhciCommandTablePciAddr;\r
314 UINT64 MaxCommandListSize;\r
315 UINT64 MaxCommandTableSize;\r
316 UINT64 MaxReceiveFisSize;\r
317 VOID *MapRFis;\r
318 VOID *MapCmdList;\r
319 VOID *MapCommandTable;\r
320} EFI_AHCI_REGISTERS;\r
321\r
322/**\r
d1102dba 323 This function is used to send out ATAPI commands conforms to the Packet Command\r
a41b5272 324 with PIO Protocol.\r
325\r
326 @param PciIo The PCI IO protocol instance.\r
327 @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.\r
d1102dba 328 @param Port The number of port.\r
a41b5272 329 @param PortMultiplier The number of port multiplier.\r
330 @param Packet A pointer to EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET structure.\r
331\r
332 @retval EFI_SUCCESS send out the ATAPI packet command successfully\r
333 and device sends data successfully.\r
334 @retval EFI_DEVICE_ERROR the device failed to send data.\r
335\r
336**/\r
337EFI_STATUS\r
338EFIAPI\r
339AhciPacketCommandExecute (\r
340 IN EFI_PCI_IO_PROTOCOL *PciIo,\r
341 IN EFI_AHCI_REGISTERS *AhciRegisters,\r
342 IN UINT8 Port,\r
343 IN UINT8 PortMultiplier,\r
344 IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
345 );\r
346\r
347/**\r
348 Start command for give slot on specific port.\r
d1102dba 349\r
a41b5272 350 @param PciIo The PCI IO protocol instance.\r
351 @param Port The number of port.\r
352 @param CommandSlot The number of CommandSlot.\r
8536cc4b 353 @param Timeout The timeout value of start, uses 100ns as a unit.\r
d1102dba 354\r
a41b5272 355 @retval EFI_DEVICE_ERROR The command start unsuccessfully.\r
356 @retval EFI_TIMEOUT The operation is time out.\r
357 @retval EFI_SUCCESS The command start successfully.\r
358\r
359**/\r
360EFI_STATUS\r
361EFIAPI\r
362AhciStartCommand (\r
363 IN EFI_PCI_IO_PROTOCOL *PciIo,\r
364 IN UINT8 Port,\r
365 IN UINT8 CommandSlot,\r
366 IN UINT64 Timeout\r
367 );\r
368\r
369/**\r
370 Stop command running for giving port\r
d1102dba 371\r
a41b5272 372 @param PciIo The PCI IO protocol instance.\r
373 @param Port The number of port.\r
8536cc4b 374 @param Timeout The timeout value of stop, uses 100ns as a unit.\r
d1102dba 375\r
a41b5272 376 @retval EFI_DEVICE_ERROR The command stop unsuccessfully.\r
377 @retval EFI_TIMEOUT The operation is time out.\r
378 @retval EFI_SUCCESS The command stop successfully.\r
379\r
380**/\r
381EFI_STATUS\r
382EFIAPI\r
383AhciStopCommand (\r
384 IN EFI_PCI_IO_PROTOCOL *PciIo,\r
385 IN UINT8 Port,\r
386 IN UINT64 Timeout\r
387 );\r
388\r
a41b5272 389#endif\r
390\r