1 /** @file
2   This file implements ATA pass through transaction for ATA bus driver.
3 
4   This file implements the low level execution of ATA pass through transaction.
5   It transforms the high level identity, read/write, reset command to ATA pass
6   through command and protocol.
7 
8   NOTE: This file also implements the StorageSecurityCommandProtocol(SSP). For input
9   parameter SecurityProtocolSpecificData, ATA spec has no explicitly definition
10   for Security Protocol Specific layout. This implementation uses big endian for
11   Cylinder register.
12 
13   Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
14   This program and the accompanying materials
15   are licensed and made available under the terms and conditions of the BSD License
16   which accompanies this distribution.  The full text of the license may be found at
17   http://opensource.org/licenses/bsd-license.php
18 
19   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
20   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 
22 
23 **/
24 
25 #include "AtaBus.h"
26 
27 #define ATA_CMD_TRUST_NON_DATA    0x5B
28 #define ATA_CMD_TRUST_RECEIVE     0x5C
29 #define ATA_CMD_TRUST_RECEIVE_DMA 0x5D
30 #define ATA_CMD_TRUST_SEND        0x5E
31 #define ATA_CMD_TRUST_SEND_DMA    0x5F
32 
33 //
34 // Look up table (UdmaValid, IsWrite) for EFI_ATA_PASS_THRU_CMD_PROTOCOL
35 //
36 EFI_ATA_PASS_THRU_CMD_PROTOCOL mAtaPassThruCmdProtocols[][2] = {
37   {
38     EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN,
39     EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT
40   },
41   {
42     EFI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_IN,
43     EFI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_OUT,
44   }
45 };
46 
47 //
48 // Look up table (UdmaValid, Lba48Bit, IsIsWrite) for ATA_CMD
49 //
50 UINT8 mAtaCommands[][2][2] = {
51   {
52     {
53       ATA_CMD_READ_SECTORS,            // 28-bit LBA; PIO read
54       ATA_CMD_WRITE_SECTORS            // 28-bit LBA; PIO write
55     },
56     {
57       ATA_CMD_READ_SECTORS_EXT,        // 48-bit LBA; PIO read
58       ATA_CMD_WRITE_SECTORS_EXT        // 48-bit LBA; PIO write
59     }
60   },
61   {
62     {
63       ATA_CMD_READ_DMA,                // 28-bit LBA; DMA read
64       ATA_CMD_WRITE_DMA                // 28-bit LBA; DMA write
65     },
66     {
67       ATA_CMD_READ_DMA_EXT,            // 48-bit LBA; DMA read
68       ATA_CMD_WRITE_DMA_EXT            // 48-bit LBA; DMA write
69     }
70   }
71 };
72 
73 //
74 // Look up table (UdmaValid, IsTrustSend) for ATA_CMD
75 //
76 UINT8 mAtaTrustCommands[2][2] = {
77   {
78     ATA_CMD_TRUST_RECEIVE,            // PIO read
79     ATA_CMD_TRUST_SEND                // PIO write
80   },
81   {
82     ATA_CMD_TRUST_RECEIVE_DMA,        // DMA read
83     ATA_CMD_TRUST_SEND_DMA            // DMA write
84   }
85 };
86 
87 
88 //
89 // Look up table (Lba48Bit) for maximum transfer block number
90 //
91 UINTN mMaxTransferBlockNumber[] = {
92   MAX_28BIT_TRANSFER_BLOCK_NUM,
93   MAX_48BIT_TRANSFER_BLOCK_NUM
94 };
95 
96 
97 /**
98   Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.PassThru().
99 
100   This function wraps the PassThru() invocation for ATA pass through function
101   for an ATA device. It assembles the ATA pass through command packet for ATA
102   transaction.
103 
104   @param[in, out]  AtaDevice   The ATA child device involved for the operation.
105   @param[in, out]  TaskPacket  Pointer to a Pass Thru Command Packet. Optional,
106                                if it is NULL, blocking mode, and use the packet
107                                in AtaDevice. If it is not NULL, non blocking mode,
108                                and pass down this Packet.
109   @param[in, out]  Event       If Event is NULL, then blocking I/O is performed.
110                                If Event is not NULL and non-blocking I/O is
111                                supported,then non-blocking I/O is performed,
112                                and Event will be signaled when the write
113                                request is completed.
114 
115   @return The return status from EFI_ATA_PASS_THRU_PROTOCOL.PassThru().
116 
117 **/
118 EFI_STATUS
AtaDevicePassThru(IN OUT ATA_DEVICE * AtaDevice,IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET * TaskPacket,OPTIONAL IN OUT EFI_EVENT Event OPTIONAL)119 AtaDevicePassThru (
120   IN OUT ATA_DEVICE                       *AtaDevice,
121   IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket, OPTIONAL
122   IN OUT EFI_EVENT                        Event OPTIONAL
123   )
124 {
125   EFI_STATUS                              Status;
126   EFI_ATA_PASS_THRU_PROTOCOL              *AtaPassThru;
127   EFI_ATA_PASS_THRU_COMMAND_PACKET        *Packet;
128 
129   //
130   // Assemble packet. If it is non blocking mode, the Ata driver should keep each
131   // subtask and clean them when the event is signaled.
132   //
133   if (TaskPacket != NULL) {
134     Packet = TaskPacket;
135     Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));
136     if (Packet->Asb == NULL) {
137       return EFI_OUT_OF_RESOURCES;
138     }
139 
140     CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));
141     Packet->Acb = AllocateCopyPool (sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb);
142   } else {
143     Packet = &AtaDevice->Packet;
144     Packet->Asb = AtaDevice->Asb;
145     Packet->Acb = &AtaDevice->Acb;
146   }
147 
148   AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru;
149 
150   Status = AtaPassThru->PassThru (
151                           AtaPassThru,
152                           AtaDevice->Port,
153                           AtaDevice->PortMultiplierPort,
154                           Packet,
155                           Event
156                           );
157   //
158   // Ensure ATA pass through caller and callee have the same
159   // interpretation of ATA pass through protocol.
160   //
161   ASSERT (Status != EFI_INVALID_PARAMETER);
162   ASSERT (Status != EFI_BAD_BUFFER_SIZE);
163 
164   return Status;
165 }
166 
167 
168 /**
169   Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.ResetDevice().
170 
171   This function wraps the ResetDevice() invocation for ATA pass through function
172   for an ATA device.
173 
174   @param  AtaDevice         The ATA child device involved for the operation.
175 
176   @return The return status from EFI_ATA_PASS_THRU_PROTOCOL.PassThru().
177 
178 **/
179 EFI_STATUS
ResetAtaDevice(IN ATA_DEVICE * AtaDevice)180 ResetAtaDevice (
181   IN ATA_DEVICE                           *AtaDevice
182   )
183 {
184   EFI_ATA_PASS_THRU_PROTOCOL              *AtaPassThru;
185 
186   AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru;
187 
188   //
189   // Report Status Code to indicate reset happens
190   //
191   REPORT_STATUS_CODE_WITH_DEVICE_PATH (
192     EFI_PROGRESS_CODE,
193     (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_RESET),
194     AtaDevice->AtaBusDriverData->ParentDevicePath
195     );
196 
197   return AtaPassThru->ResetDevice (
198                         AtaPassThru,
199                         AtaDevice->Port,
200                         AtaDevice->PortMultiplierPort
201                         );
202 }
203 
204 
205 /**
206   Prints ATA model name to ATA device structure.
207 
208   This function converts ATA device model name from ATA identify data
209   to a string in ATA device structure. It needs to change the character
210   order in the original model name string.
211 
212   @param  AtaDevice         The ATA child device involved for the operation.
213 
214 **/
215 VOID
PrintAtaModelName(IN OUT ATA_DEVICE * AtaDevice)216 PrintAtaModelName (
217   IN OUT ATA_DEVICE  *AtaDevice
218   )
219 {
220   UINTN   Index;
221   CHAR8   *Source;
222   CHAR16  *Destination;
223 
224   Source = AtaDevice->IdentifyData->ModelName;
225   Destination = AtaDevice->ModelName;
226 
227   //
228   // Swap the byte order in the original module name.
229   //
230   for (Index = 0; Index < MAX_MODEL_NAME_LEN; Index += 2) {
231     Destination[Index]      = Source[Index + 1];
232     Destination[Index + 1]  = Source[Index];
233   }
234   AtaDevice->ModelName[MAX_MODEL_NAME_LEN] = L'\0';
235 }
236 
237 
238 /**
239   Gets ATA device Capacity according to ATA 6.
240 
241   This function returns the capacity of the ATA device if it follows
242   ATA 6 to support 48 bit addressing.
243 
244   @param  AtaDevice         The ATA child device involved for the operation.
245 
246   @return The capacity of the ATA device or 0 if the device does not support
247           48-bit addressing defined in ATA 6.
248 
249 **/
250 EFI_LBA
GetAtapi6Capacity(IN ATA_DEVICE * AtaDevice)251 GetAtapi6Capacity (
252   IN ATA_DEVICE                 *AtaDevice
253   )
254 {
255   EFI_LBA                       Capacity;
256   EFI_LBA                       TmpLba;
257   UINTN                         Index;
258   ATA_IDENTIFY_DATA             *IdentifyData;
259 
260   IdentifyData = AtaDevice->IdentifyData;
261   if ((IdentifyData->command_set_supported_83 & BIT10) == 0) {
262     //
263     // The device doesn't support 48 bit addressing
264     //
265     return 0;
266   }
267 
268   //
269   // 48 bit address feature set is supported, get maximum capacity
270   //
271   Capacity = 0;
272   for (Index = 0; Index < 4; Index++) {
273     //
274     // Lower byte goes first: word[100] is the lowest word, word[103] is highest
275     //
276     TmpLba = IdentifyData->maximum_lba_for_48bit_addressing[Index];
277     Capacity |= LShiftU64 (TmpLba, 16 * Index);
278   }
279 
280   return Capacity;
281 }
282 
283 
284 /**
285   Identifies ATA device via the Identify data.
286 
287   This function identifies the ATA device and initializes the Media information in
288   Block IO protocol interface.
289 
290   @param  AtaDevice         The ATA child device involved for the operation.
291 
292   @retval EFI_UNSUPPORTED   The device is not a valid ATA device (hard disk).
293   @retval EFI_SUCCESS       The device is successfully identified and Media information
294                             is correctly initialized.
295 
296 **/
297 EFI_STATUS
IdentifyAtaDevice(IN OUT ATA_DEVICE * AtaDevice)298 IdentifyAtaDevice (
299   IN OUT ATA_DEVICE                 *AtaDevice
300   )
301 {
302   ATA_IDENTIFY_DATA                 *IdentifyData;
303   EFI_BLOCK_IO_MEDIA                *BlockMedia;
304   EFI_LBA                           Capacity;
305   UINT16                            PhyLogicSectorSupport;
306   UINT16                            UdmaMode;
307 
308   IdentifyData = AtaDevice->IdentifyData;
309 
310   if ((IdentifyData->config & BIT15) != 0) {
311     //
312     // This is not an hard disk
313     //
314     return EFI_UNSUPPORTED;
315   }
316 
317   DEBUG ((EFI_D_INFO, "AtaBus - Identify Device: Port %x PortMultiplierPort %x\n", AtaDevice->Port, AtaDevice->PortMultiplierPort));
318 
319   //
320   // Check whether the WORD 88 (supported UltraDMA by drive) is valid
321   //
322   if ((IdentifyData->field_validity & BIT2) != 0) {
323     UdmaMode = IdentifyData->ultra_dma_mode;
324     if ((UdmaMode & (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6)) != 0) {
325       //
326       // If BIT0~BIT6 is selected, then UDMA is supported
327       //
328       AtaDevice->UdmaValid = TRUE;
329     }
330   }
331 
332   Capacity = GetAtapi6Capacity (AtaDevice);
333   if (Capacity > MAX_28BIT_ADDRESSING_CAPACITY) {
334     //
335     // Capacity exceeds 120GB. 48-bit addressing is really needed
336     //
337     AtaDevice->Lba48Bit = TRUE;
338   } else {
339     //
340     // This is a hard disk <= 120GB capacity, treat it as normal hard disk
341     //
342     Capacity = ((UINT32)IdentifyData->user_addressable_sectors_hi << 16) | IdentifyData->user_addressable_sectors_lo;
343     AtaDevice->Lba48Bit = FALSE;
344   }
345 
346   //
347   // Block Media Information:
348   //
349   BlockMedia = &AtaDevice->BlockMedia;
350   BlockMedia->LastBlock = Capacity - 1;
351   BlockMedia->IoAlign = AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign;
352   //
353   // Check whether Long Physical Sector Feature is supported
354   //
355   PhyLogicSectorSupport = IdentifyData->phy_logic_sector_support;
356   if ((PhyLogicSectorSupport & (BIT14 | BIT15)) == BIT14) {
357     //
358     // Check whether one physical block contains multiple physical blocks
359     //
360     if ((PhyLogicSectorSupport & BIT13) != 0) {
361       BlockMedia->LogicalBlocksPerPhysicalBlock = (UINT32) (1 << (PhyLogicSectorSupport & 0x000f));
362       //
363       // Check lowest alignment of logical blocks within physical block
364       //
365       if ((IdentifyData->alignment_logic_in_phy_blocks & (BIT14 | BIT15)) == BIT14) {
366         BlockMedia->LowestAlignedLba = (EFI_LBA) ((BlockMedia->LogicalBlocksPerPhysicalBlock - ((UINT32)IdentifyData->alignment_logic_in_phy_blocks & 0x3fff)) %
367           BlockMedia->LogicalBlocksPerPhysicalBlock);
368       }
369     }
370     //
371     // Check logical block size
372     //
373     if ((PhyLogicSectorSupport & BIT12) != 0) {
374       BlockMedia->BlockSize = (UINT32) (((IdentifyData->logic_sector_size_hi << 16) | IdentifyData->logic_sector_size_lo) * sizeof (UINT16));
375     }
376     AtaDevice->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
377   }
378   //
379   // Get ATA model name from identify data structure.
380   //
381   PrintAtaModelName (AtaDevice);
382 
383   return EFI_SUCCESS;
384 }
385 
386 
387 /**
388   Discovers whether it is a valid ATA device.
389 
390   This function issues ATA_CMD_IDENTIFY_DRIVE command to the ATA device to identify it.
391   If the command is executed successfully, it then identifies it and initializes
392   the Media information in Block IO protocol interface.
393 
394   @param  AtaDevice         The ATA child device involved for the operation.
395 
396   @retval EFI_SUCCESS       The device is successfully identified and Media information
397                             is correctly initialized.
398   @return others            Some error occurs when discovering the ATA device.
399 
400 **/
401 EFI_STATUS
DiscoverAtaDevice(IN OUT ATA_DEVICE * AtaDevice)402 DiscoverAtaDevice (
403   IN OUT ATA_DEVICE                 *AtaDevice
404   )
405 {
406   EFI_STATUS                        Status;
407   EFI_ATA_COMMAND_BLOCK             *Acb;
408   EFI_ATA_PASS_THRU_COMMAND_PACKET  *Packet;
409   UINTN                             Retry;
410 
411   //
412   // Prepare for ATA command block.
413   //
414   Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
415   Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE;
416   Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));
417 
418   //
419   // Prepare for ATA pass through packet.
420   //
421   Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
422   Packet->InDataBuffer = AtaDevice->IdentifyData;
423   Packet->InTransferLength = sizeof (ATA_IDENTIFY_DATA);
424   Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN;
425   Packet->Length   = EFI_ATA_PASS_THRU_LENGTH_BYTES | EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;
426   Packet->Timeout  = ATA_TIMEOUT;
427 
428   Retry = MAX_RETRY_TIMES;
429   do {
430     Status = AtaDevicePassThru (AtaDevice, NULL, NULL);
431     if (!EFI_ERROR (Status)) {
432       //
433       // The command is issued successfully
434       //
435       Status = IdentifyAtaDevice (AtaDevice);
436       return Status;
437     }
438   } while (Retry-- > 0);
439 
440   return Status;
441 }
442 
443 /**
444   Transfer data from ATA device.
445 
446   This function performs one ATA pass through transaction to transfer data from/to
447   ATA device. It chooses the appropriate ATA command and protocol to invoke PassThru
448   interface of ATA pass through.
449 
450   @param[in, out]  AtaDevice       The ATA child device involved for the operation.
451   @param[in, out]  TaskPacket      Pointer to a Pass Thru Command Packet. Optional,
452                                    if it is NULL, blocking mode, and use the packet
453                                    in AtaDevice. If it is not NULL, non blocking mode,
454                                    and pass down this Packet.
455   @param[in, out]  Buffer          The pointer to the current transaction buffer.
456   @param[in]       StartLba        The starting logical block address to be accessed.
457   @param[in]       TransferLength  The block number or sector count of the transfer.
458   @param[in]       IsWrite         Indicates whether it is a write operation.
459   @param[in]       Event           If Event is NULL, then blocking I/O is performed.
460                                    If Event is not NULL and non-blocking I/O is
461                                    supported,then non-blocking I/O is performed,
462                                    and Event will be signaled when the write
463                                    request is completed.
464 
465   @retval EFI_SUCCESS       The data transfer is complete successfully.
466   @return others            Some error occurs when transferring data.
467 
468 **/
469 EFI_STATUS
TransferAtaDevice(IN OUT ATA_DEVICE * AtaDevice,IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET * TaskPacket,OPTIONAL IN OUT VOID * Buffer,IN EFI_LBA StartLba,IN UINT32 TransferLength,IN BOOLEAN IsWrite,IN EFI_EVENT Event OPTIONAL)470 TransferAtaDevice (
471   IN OUT ATA_DEVICE                       *AtaDevice,
472   IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket, OPTIONAL
473   IN OUT VOID                             *Buffer,
474   IN EFI_LBA                              StartLba,
475   IN UINT32                               TransferLength,
476   IN BOOLEAN                              IsWrite,
477   IN EFI_EVENT                            Event OPTIONAL
478   )
479 {
480   EFI_ATA_COMMAND_BLOCK             *Acb;
481   EFI_ATA_PASS_THRU_COMMAND_PACKET  *Packet;
482 
483   //
484   // Ensure AtaDevice->UdmaValid, AtaDevice->Lba48Bit and IsWrite are valid boolean values
485   //
486   ASSERT ((UINTN) AtaDevice->UdmaValid < 2);
487   ASSERT ((UINTN) AtaDevice->Lba48Bit < 2);
488   ASSERT ((UINTN) IsWrite < 2);
489   //
490   // Prepare for ATA command block.
491   //
492   Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
493   Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite];
494   Acb->AtaSectorNumber = (UINT8) StartLba;
495   Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8);
496   Acb->AtaCylinderHigh = (UINT8) RShiftU64 (StartLba, 16);
497   Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));
498   Acb->AtaSectorCount = (UINT8) TransferLength;
499   if (AtaDevice->Lba48Bit) {
500     Acb->AtaSectorNumberExp = (UINT8) RShiftU64 (StartLba, 24);
501     Acb->AtaCylinderLowExp = (UINT8) RShiftU64 (StartLba, 32);
502     Acb->AtaCylinderHighExp = (UINT8) RShiftU64 (StartLba, 40);
503     Acb->AtaSectorCountExp = (UINT8) (TransferLength >> 8);
504   } else {
505     Acb->AtaDeviceHead = (UINT8) (Acb->AtaDeviceHead | RShiftU64 (StartLba, 24));
506   }
507 
508   //
509   // Prepare for ATA pass through packet.
510   //
511   if (TaskPacket != NULL) {
512     Packet = ZeroMem (TaskPacket, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
513   } else {
514     Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
515   }
516 
517   if (IsWrite) {
518     Packet->OutDataBuffer = Buffer;
519     Packet->OutTransferLength = TransferLength;
520   } else {
521     Packet->InDataBuffer = Buffer;
522     Packet->InTransferLength = TransferLength;
523   }
524 
525   Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsWrite];
526   Packet->Length = EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;
527   //
528   // |------------------------|-----------------|------------------------|-----------------|
529   // | ATA PIO Transfer Mode  |  Transfer Rate  | ATA DMA Transfer Mode  |  Transfer Rate  |
530   // |------------------------|-----------------|------------------------|-----------------|
531   // |       PIO Mode 0       |  3.3Mbytes/sec  | Single-word DMA Mode 0 |  2.1Mbytes/sec  |
532   // |------------------------|-----------------|------------------------|-----------------|
533   // |       PIO Mode 1       |  5.2Mbytes/sec  | Single-word DMA Mode 1 |  4.2Mbytes/sec  |
534   // |------------------------|-----------------|------------------------|-----------------|
535   // |       PIO Mode 2       |  8.3Mbytes/sec  | Single-word DMA Mode 2 |  8.4Mbytes/sec  |
536   // |------------------------|-----------------|------------------------|-----------------|
537   // |       PIO Mode 3       | 11.1Mbytes/sec  | Multi-word DMA Mode 0  |  4.2Mbytes/sec  |
538   // |------------------------|-----------------|------------------------|-----------------|
539   // |       PIO Mode 4       | 16.6Mbytes/sec  | Multi-word DMA Mode 1  | 13.3Mbytes/sec  |
540   // |------------------------|-----------------|------------------------|-----------------|
541   //
542   // As AtaBus is used to manage ATA devices, we have to use the lowest transfer rate to
543   // calculate the possible maximum timeout value for each read/write operation.
544   // The timout value is rounded up to nearest integar and here an additional 30s is added
545   // to follow ATA spec in which it mentioned that the device may take up to 30s to respond
546   // commands in the Standby/Idle mode.
547   //
548   if (AtaDevice->UdmaValid) {
549     //
550     // Calculate the maximum timeout value for DMA read/write operation.
551     //
552     Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 2100000) + 31);
553   } else {
554     //
555     // Calculate the maximum timeout value for PIO read/write operation
556     //
557     Packet->Timeout  = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 3300000) + 31);
558   }
559 
560   return AtaDevicePassThru (AtaDevice, TaskPacket, Event);
561 }
562 
563 /**
564   Free SubTask.
565 
566   @param[in, out]  Task      Pointer to task to be freed.
567 
568 **/
569 VOID
570 EFIAPI
FreeAtaSubTask(IN OUT ATA_BUS_ASYN_SUB_TASK * Task)571 FreeAtaSubTask (
572   IN OUT ATA_BUS_ASYN_SUB_TASK  *Task
573   )
574 {
575   if (Task->Packet.Asb != NULL) {
576     FreeAlignedBuffer (Task->Packet.Asb, sizeof (EFI_ATA_STATUS_BLOCK));
577   }
578   if (Task->Packet.Acb != NULL) {
579     FreePool (Task->Packet.Acb);
580   }
581 
582   FreePool (Task);
583 }
584 
585 /**
586   Terminate any in-flight non-blocking I/O requests by signaling an EFI_ABORTED
587   in the TransactionStatus member of the EFI_BLOCK_IO2_TOKEN for the non-blocking
588   I/O. After that it is safe to free any Token or Buffer data structures that
589   were allocated to initiate the non-blockingI/O requests that were in-flight for
590   this device.
591 
592   @param[in]  AtaDevice     The ATA child device involved for the operation.
593 
594 **/
595 VOID
596 EFIAPI
AtaTerminateNonBlockingTask(IN ATA_DEVICE * AtaDevice)597 AtaTerminateNonBlockingTask (
598   IN ATA_DEVICE               *AtaDevice
599   )
600 {
601   BOOLEAN               SubTaskEmpty;
602   EFI_TPL               OldTpl;
603   ATA_BUS_ASYN_TASK     *AtaTask;
604   LIST_ENTRY            *Entry;
605   LIST_ENTRY            *List;
606 
607   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
608   //
609   // Abort all executing tasks from now.
610   //
611   AtaDevice->Abort = TRUE;
612 
613   List = &AtaDevice->AtaTaskList;
614   for (Entry = GetFirstNode (List); !IsNull (List, Entry);) {
615     AtaTask  = ATA_ASYN_TASK_FROM_ENTRY (Entry);
616     AtaTask->Token->TransactionStatus = EFI_ABORTED;
617     gBS->SignalEvent (AtaTask->Token->Event);
618 
619     Entry = RemoveEntryList (Entry);
620     FreePool (AtaTask);
621   }
622   gBS->RestoreTPL (OldTpl);
623 
624   do {
625     OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
626     //
627     // Wait for executing subtasks done.
628     //
629     SubTaskEmpty = IsListEmpty (&AtaDevice->AtaSubTaskList);
630     gBS->RestoreTPL (OldTpl);
631   } while (!SubTaskEmpty);
632 
633   //
634   // Aborting operation has been done. From now on, don't need to abort normal operation.
635   //
636   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
637   AtaDevice->Abort = FALSE;
638   gBS->RestoreTPL (OldTpl);
639 }
640 
641 /**
642   Call back funtion when the event is signaled.
643 
644   @param[in]  Event     The Event this notify function registered to.
645   @param[in]  Context   Pointer to the context data registered to the
646                         Event.
647 
648 **/
649 VOID
650 EFIAPI
AtaNonBlockingCallBack(IN EFI_EVENT Event,IN VOID * Context)651 AtaNonBlockingCallBack (
652   IN EFI_EVENT                Event,
653   IN VOID                     *Context
654   )
655 {
656   ATA_BUS_ASYN_SUB_TASK *Task;
657   ATA_BUS_ASYN_TASK     *AtaTask;
658   ATA_DEVICE            *AtaDevice;
659   LIST_ENTRY            *Entry;
660   EFI_STATUS            Status;
661 
662   Task = (ATA_BUS_ASYN_SUB_TASK *) Context;
663   gBS->CloseEvent (Event);
664 
665   AtaDevice = Task->AtaDevice;
666 
667   //
668   // Check the command status.
669   // If there is error during the sub task source allocation, the error status
670   // should be returned to the caller directly, so here the Task->Token may already
671   // be deleted by the caller and no need to update the status.
672   //
673   if ((!(*Task->IsError)) && ((Task->Packet.Asb->AtaStatus & 0x01) == 0x01)) {
674     Task->Token->TransactionStatus = EFI_DEVICE_ERROR;
675   }
676 
677   if (AtaDevice->Abort) {
678     Task->Token->TransactionStatus = EFI_ABORTED;
679   }
680 
681   DEBUG ((
682     EFI_D_BLKIO,
683     "NON-BLOCKING EVENT FINISHED!- STATUS = %r\n",
684     Task->Token->TransactionStatus
685     ));
686 
687   //
688   // Reduce the SubEventCount, till it comes to zero.
689   //
690   (*Task->UnsignalledEventCount) --;
691   DEBUG ((EFI_D_BLKIO, "UnsignalledEventCount = %d\n", *Task->UnsignalledEventCount));
692 
693   //
694   // Remove the SubTask from the Task list.
695   //
696   RemoveEntryList (&Task->TaskEntry);
697   if ((*Task->UnsignalledEventCount) == 0) {
698     //
699     // All Sub tasks are done, then signal the upper layer event.
700     // Except there is error during the sub task source allocation.
701     //
702     if (!(*Task->IsError)) {
703       gBS->SignalEvent (Task->Token->Event);
704       DEBUG ((EFI_D_BLKIO, "Signal the upper layer event!\n"));
705     }
706 
707     FreePool (Task->UnsignalledEventCount);
708     FreePool (Task->IsError);
709 
710 
711     //
712     // Finish all subtasks and move to the next task in AtaTaskList.
713     //
714     if (!IsListEmpty (&AtaDevice->AtaTaskList)) {
715       Entry   = GetFirstNode (&AtaDevice->AtaTaskList);
716       AtaTask = ATA_ASYN_TASK_FROM_ENTRY (Entry);
717       DEBUG ((EFI_D_BLKIO, "Start to embark a new Ata Task\n"));
718       DEBUG ((EFI_D_BLKIO, "AtaTask->NumberOfBlocks = %x; AtaTask->Token=%x\n", AtaTask->NumberOfBlocks, AtaTask->Token));
719       Status = AccessAtaDevice (
720                  AtaTask->AtaDevice,
721                  AtaTask->Buffer,
722                  AtaTask->StartLba,
723                  AtaTask->NumberOfBlocks,
724                  AtaTask->IsWrite,
725                  AtaTask->Token
726                  );
727       if (EFI_ERROR (Status)) {
728         AtaTask->Token->TransactionStatus = Status;
729         gBS->SignalEvent (AtaTask->Token->Event);
730       }
731       RemoveEntryList (Entry);
732       FreePool (AtaTask);
733     }
734   }
735 
736   DEBUG ((
737     EFI_D_BLKIO,
738     "PACKET INFO: Write=%s, Length=%x, LowCylinder=%x, HighCylinder=%x, SectionNumber=%x\n",
739     Task->Packet.OutDataBuffer != NULL ? L"YES" : L"NO",
740     Task->Packet.OutDataBuffer != NULL ? Task->Packet.OutTransferLength : Task->Packet.InTransferLength,
741     Task->Packet.Acb->AtaCylinderLow,
742     Task->Packet.Acb->AtaCylinderHigh,
743     Task->Packet.Acb->AtaSectorCount
744     ));
745 
746   //
747   // Free the buffer of SubTask.
748   //
749   FreeAtaSubTask (Task);
750 }
751 
752 /**
753   Read or write a number of blocks from ATA device.
754 
755   This function performs ATA pass through transactions to read/write data from/to
756   ATA device. It may separate the read/write request into several ATA pass through
757   transactions.
758 
759   @param[in, out]  AtaDevice       The ATA child device involved for the operation.
760   @param[in, out]  Buffer          The pointer to the current transaction buffer.
761   @param[in]       StartLba        The starting logical block address to be accessed.
762   @param[in]       NumberOfBlocks  The block number or sector count of the transfer.
763   @param[in]       IsWrite         Indicates whether it is a write operation.
764   @param[in, out]  Token           A pointer to the token associated with the transaction.
765 
766   @retval EFI_SUCCESS       The data transfer is complete successfully.
767   @return others            Some error occurs when transferring data.
768 
769 **/
770 EFI_STATUS
AccessAtaDevice(IN OUT ATA_DEVICE * AtaDevice,IN OUT UINT8 * Buffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks,IN BOOLEAN IsWrite,IN OUT EFI_BLOCK_IO2_TOKEN * Token)771 AccessAtaDevice(
772   IN OUT ATA_DEVICE                 *AtaDevice,
773   IN OUT UINT8                      *Buffer,
774   IN EFI_LBA                        StartLba,
775   IN UINTN                          NumberOfBlocks,
776   IN BOOLEAN                        IsWrite,
777   IN OUT EFI_BLOCK_IO2_TOKEN        *Token
778   )
779 {
780   EFI_STATUS                        Status;
781   UINTN                             MaxTransferBlockNumber;
782   UINTN                             TransferBlockNumber;
783   UINTN                             BlockSize;
784   ATA_BUS_ASYN_SUB_TASK             *SubTask;
785   UINTN                             *EventCount;
786   UINTN                             TempCount;
787   ATA_BUS_ASYN_TASK                 *AtaTask;
788   EFI_EVENT                         SubEvent;
789   UINTN                             Index;
790   BOOLEAN                           *IsError;
791   EFI_TPL                           OldTpl;
792 
793   TempCount  = 0;
794   Status     = EFI_SUCCESS;
795   EventCount = NULL;
796   IsError    = NULL;
797   Index      = 0;
798   SubTask    = NULL;
799   SubEvent   = NULL;
800   AtaTask    = NULL;
801 
802   //
803   // Ensure AtaDevice->Lba48Bit is a valid boolean value
804   //
805   ASSERT ((UINTN) AtaDevice->Lba48Bit < 2);
806   MaxTransferBlockNumber = mMaxTransferBlockNumber[AtaDevice->Lba48Bit];
807   BlockSize              = AtaDevice->BlockMedia.BlockSize;
808 
809   //
810   // Initial the return status and shared account for Non Blocking.
811   //
812   if ((Token != NULL) && (Token->Event != NULL)) {
813     OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
814 
815     if (!IsListEmpty (&AtaDevice->AtaSubTaskList)) {
816       AtaTask = AllocateZeroPool (sizeof (ATA_BUS_ASYN_TASK));
817       if (AtaTask == NULL) {
818         gBS->RestoreTPL (OldTpl);
819         return EFI_OUT_OF_RESOURCES;
820       }
821       AtaTask->AtaDevice      = AtaDevice;
822       AtaTask->Buffer         = Buffer;
823       AtaTask->IsWrite        = IsWrite;
824       AtaTask->NumberOfBlocks = NumberOfBlocks;
825       AtaTask->Signature      = ATA_TASK_SIGNATURE;
826       AtaTask->StartLba       = StartLba;
827       AtaTask->Token          = Token;
828 
829       InsertTailList (&AtaDevice->AtaTaskList, &AtaTask->TaskEntry);
830       gBS->RestoreTPL (OldTpl);
831       return EFI_SUCCESS;
832     }
833     gBS->RestoreTPL (OldTpl);
834 
835     Token->TransactionStatus = EFI_SUCCESS;
836     EventCount = AllocateZeroPool (sizeof (UINTN));
837     if (EventCount == NULL) {
838       return EFI_OUT_OF_RESOURCES;
839     }
840 
841     IsError = AllocateZeroPool (sizeof (BOOLEAN));
842     if (IsError == NULL) {
843       FreePool (EventCount);
844       return EFI_OUT_OF_RESOURCES;
845     }
846     DEBUG ((EFI_D_BLKIO, "Allocation IsError Addr=%x\n", IsError));
847     *IsError = FALSE;
848     TempCount   = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber;
849     *EventCount = TempCount;
850     DEBUG ((EFI_D_BLKIO, "AccessAtaDevice, NumberOfBlocks=%x\n", NumberOfBlocks));
851     DEBUG ((EFI_D_BLKIO, "AccessAtaDevice, MaxTransferBlockNumber=%x\n", MaxTransferBlockNumber));
852     DEBUG ((EFI_D_BLKIO, "AccessAtaDevice, EventCount=%x\n", TempCount));
853   } else {
854     while (!IsListEmpty (&AtaDevice->AtaTaskList) || !IsListEmpty (&AtaDevice->AtaSubTaskList)) {
855       //
856       // Stall for 100us.
857       //
858       MicroSecondDelay (100);
859     }
860   }
861 
862   do {
863     if (NumberOfBlocks > MaxTransferBlockNumber) {
864       TransferBlockNumber = MaxTransferBlockNumber;
865       NumberOfBlocks     -= MaxTransferBlockNumber;
866     } else  {
867       TransferBlockNumber = NumberOfBlocks;
868       NumberOfBlocks      = 0;
869     }
870 
871     //
872     // Create sub event for the sub ata task. Non-blocking mode.
873     //
874     if ((Token != NULL) && (Token->Event != NULL)) {
875       SubTask  = NULL;
876       SubEvent = NULL;
877 
878       SubTask = AllocateZeroPool (sizeof (ATA_BUS_ASYN_SUB_TASK));
879       if (SubTask == NULL) {
880         Status = EFI_OUT_OF_RESOURCES;
881         goto EXIT;
882       }
883 
884       OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
885       SubTask->UnsignalledEventCount = EventCount;
886       SubTask->Signature             = ATA_SUB_TASK_SIGNATURE;
887       SubTask->AtaDevice             = AtaDevice;
888       SubTask->Token                 = Token;
889       SubTask->IsError               = IsError;
890       InsertTailList (&AtaDevice->AtaSubTaskList, &SubTask->TaskEntry);
891       gBS->RestoreTPL (OldTpl);
892 
893       Status = gBS->CreateEvent (
894                       EVT_NOTIFY_SIGNAL,
895                       TPL_NOTIFY,
896                       AtaNonBlockingCallBack,
897                       SubTask,
898                       &SubEvent
899                       );
900       //
901       // If resource allocation fail, the un-signalled event count should equal to
902       // the original one minus the unassigned subtasks number.
903       //
904       if (EFI_ERROR (Status)) {
905         Status = EFI_OUT_OF_RESOURCES;
906         goto EXIT;
907       }
908 
909       Status = TransferAtaDevice (AtaDevice, &SubTask->Packet, Buffer, StartLba, (UINT32) TransferBlockNumber, IsWrite, SubEvent);
910     } else {
911       //
912       // Blocking Mode.
913       //
914       DEBUG ((EFI_D_BLKIO, "Blocking AccessAtaDevice, TransferBlockNumber=%x; StartLba = %x\n", TransferBlockNumber, StartLba));
915       Status = TransferAtaDevice (AtaDevice, NULL, Buffer, StartLba, (UINT32) TransferBlockNumber, IsWrite, NULL);
916     }
917 
918     if (EFI_ERROR (Status)) {
919       goto EXIT;
920     }
921 
922     Index++;
923     StartLba += TransferBlockNumber;
924     Buffer   += TransferBlockNumber * BlockSize;
925   } while (NumberOfBlocks > 0);
926 
927 EXIT:
928   if ((Token != NULL) && (Token->Event != NULL)) {
929     //
930     // Release resource at non-blocking mode.
931     //
932     if (EFI_ERROR (Status)) {
933       OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
934       Token->TransactionStatus = Status;
935       *EventCount = (*EventCount) - (TempCount - Index);
936       *IsError    = TRUE;
937 
938       if (*EventCount == 0) {
939         FreePool (EventCount);
940         FreePool (IsError);
941       }
942 
943       if (SubTask != NULL) {
944         RemoveEntryList (&SubTask->TaskEntry);
945         FreeAtaSubTask (SubTask);
946       }
947 
948       if (SubEvent != NULL) {
949         gBS->CloseEvent (SubEvent);
950       }
951       gBS->RestoreTPL (OldTpl);
952     }
953   }
954 
955   return Status;
956 }
957 
958 /**
959   Trust transfer data from/to ATA device.
960 
961   This function performs one ATA pass through transaction to do a trust transfer from/to
962   ATA device. It chooses the appropriate ATA command and protocol to invoke PassThru
963   interface of ATA pass through.
964 
965   @param  AtaDevice                    The ATA child device involved for the operation.
966   @param  Buffer                       The pointer to the current transaction buffer.
967   @param  SecurityProtocolId           The value of the "Security Protocol" parameter of
968                                        the security protocol command to be sent.
969   @param  SecurityProtocolSpecificData The value of the "Security Protocol Specific" parameter
970                                        of the security protocol command to be sent.
971   @param  TransferLength               The block number or sector count of the transfer.
972   @param  IsTrustSend                  Indicates whether it is a trust send operation or not.
973   @param  Timeout                      The timeout, in 100ns units, to use for the execution
974                                        of the security protocol command. A Timeout value of 0
975                                        means that this function will wait indefinitely for the
976                                        security protocol command to execute. If Timeout is greater
977                                        than zero, then this function will return EFI_TIMEOUT
978                                        if the time required to execute the receive data command
979                                        is greater than Timeout.
980   @param  TransferLengthOut            A pointer to a buffer to store the size in bytes of the data
981                                        written to the buffer. Ignore it when IsTrustSend is TRUE.
982 
983   @retval EFI_SUCCESS       The data transfer is complete successfully.
984   @return others            Some error occurs when transferring data.
985 
986 **/
987 EFI_STATUS
988 EFIAPI
TrustTransferAtaDevice(IN OUT ATA_DEVICE * AtaDevice,IN OUT VOID * Buffer,IN UINT8 SecurityProtocolId,IN UINT16 SecurityProtocolSpecificData,IN UINTN TransferLength,IN BOOLEAN IsTrustSend,IN UINT64 Timeout,OUT UINTN * TransferLengthOut)989 TrustTransferAtaDevice (
990   IN OUT ATA_DEVICE                 *AtaDevice,
991   IN OUT VOID                       *Buffer,
992   IN UINT8                          SecurityProtocolId,
993   IN UINT16                         SecurityProtocolSpecificData,
994   IN UINTN                          TransferLength,
995   IN BOOLEAN                        IsTrustSend,
996   IN UINT64                         Timeout,
997   OUT UINTN                         *TransferLengthOut
998   )
999 {
1000   EFI_ATA_COMMAND_BLOCK             *Acb;
1001   EFI_ATA_PASS_THRU_COMMAND_PACKET  *Packet;
1002   EFI_STATUS                        Status;
1003   VOID                              *NewBuffer;
1004   EFI_ATA_PASS_THRU_PROTOCOL        *AtaPassThru;
1005 
1006   //
1007   // Ensure AtaDevice->UdmaValid and IsTrustSend are valid boolean values
1008   //
1009   ASSERT ((UINTN) AtaDevice->UdmaValid < 2);
1010   ASSERT ((UINTN) IsTrustSend < 2);
1011   //
1012   // Prepare for ATA command block.
1013   //
1014   Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
1015   if (TransferLength == 0) {
1016     Acb->AtaCommand    = ATA_CMD_TRUST_NON_DATA;
1017   } else {
1018     Acb->AtaCommand    = mAtaTrustCommands[AtaDevice->UdmaValid][IsTrustSend];
1019   }
1020   Acb->AtaFeatures      = SecurityProtocolId;
1021   Acb->AtaSectorCount   = (UINT8) (TransferLength / 512);
1022   Acb->AtaSectorNumber  = (UINT8) ((TransferLength / 512) >> 8);
1023   //
1024   // NOTE: ATA Spec has no explicitly definition for Security Protocol Specific layout.
1025   // Here use big endian for Cylinder register.
1026   //
1027   Acb->AtaCylinderHigh  = (UINT8) SecurityProtocolSpecificData;
1028   Acb->AtaCylinderLow   = (UINT8) (SecurityProtocolSpecificData >> 8);
1029   Acb->AtaDeviceHead    = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));
1030 
1031   //
1032   // Prepare for ATA pass through packet.
1033   //
1034   Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
1035   if (TransferLength == 0) {
1036     Packet->InTransferLength  = 0;
1037     Packet->OutTransferLength = 0;
1038     Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA;
1039   } else if (IsTrustSend) {
1040     //
1041     // Check the alignment of the incoming buffer prior to invoking underlying ATA PassThru
1042     //
1043     AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru;
1044     if ((AtaPassThru->Mode->IoAlign > 1) && !IS_ALIGNED (Buffer, AtaPassThru->Mode->IoAlign)) {
1045       NewBuffer = AllocateAlignedBuffer (AtaDevice, TransferLength);
1046       if (NewBuffer == NULL) {
1047         return EFI_OUT_OF_RESOURCES;
1048       }
1049 
1050       CopyMem (NewBuffer, Buffer, TransferLength);
1051       FreePool (Buffer);
1052       Buffer = NewBuffer;
1053     }
1054     Packet->OutDataBuffer = Buffer;
1055     Packet->OutTransferLength = (UINT32) TransferLength;
1056     Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
1057   } else {
1058     Packet->InDataBuffer = Buffer;
1059     Packet->InTransferLength = (UINT32) TransferLength;
1060     Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
1061   }
1062   Packet->Length   = EFI_ATA_PASS_THRU_LENGTH_BYTES;
1063   Packet->Timeout  = Timeout;
1064 
1065   Status = AtaDevicePassThru (AtaDevice, NULL, NULL);
1066   if (TransferLengthOut != NULL) {
1067     if (! IsTrustSend) {
1068       *TransferLengthOut = Packet->InTransferLength;
1069     }
1070   }
1071   return Status;
1072 }
1073