• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
409