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