1 /** @file
2   This file contains all helper functions on the ATA command
3 
4   Copyright (c) 2006 - 2010, 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   @par Revision Reference:
14   2002-6: Add Atapi6 enhancement, support >120GB hard disk, including
15   update - ATAIdentity() func
16   update - AtaBlockIoReadBlocks() func
17   update - AtaBlockIoWriteBlocks() func
18   add    - AtaAtapi6Identify() func
19   add    - AtaReadSectorsExt() func
20   add    - AtaWriteSectorsExt() func
21   add    - AtaPioDataInExt() func
22   add    - AtaPioDataOutExt() func
23 
24 **/
25 
26 #include "IdeBus.h"
27 /**
28   This function is called by ATAIdentify() to identity whether this disk
29   supports ATA/ATAPI6 48bit addressing, ie support >120G capacity
30 
31   @param IdeDev pointer pointing to IDE_BLK_IO_DEV data structure, used to record
32                 all the information of the IDE device.
33 
34   @retval EFI_SUCCESS       The disk specified by IdeDev is a Atapi6 supported one and
35                             48-bit addressing must be used
36   @retval EFI_UNSUPPORTED   The disk dosn't not support Atapi6 or it supports but the
37                             capacity is below 120G, 48bit addressing is not needed
38   @retval  EFI_DEVICE_ERROR      The identify data in IdeDev is incorrect
39   @retval  EFI_INVALID_PARAMETER The identify data in IdeDev is NULL.
40 
41   @note  This function must be called after DEVICE_IDENTITY command has been
42           successfully returned
43 
44 **/
45 EFI_STATUS
AtaAtapi6Identify(IN IDE_BLK_IO_DEV * IdeDev)46 AtaAtapi6Identify (
47   IN  IDE_BLK_IO_DEV  *IdeDev
48   )
49 {
50   UINT8             Index;
51   EFI_LBA           TmpLba;
52   EFI_LBA           Capacity;
53   EFI_IDENTIFY_DATA *Atapi6IdentifyStruct;
54 
55   if (IdeDev->IdData == NULL) {
56     return EFI_INVALID_PARAMETER;
57   }
58 
59   Atapi6IdentifyStruct = IdeDev->IdData;
60 
61   if ((Atapi6IdentifyStruct->AtapiData.cmd_set_support_83 & (BIT15 | BIT14)) != 0x4000) {
62     //
63     // Per ATA-6 spec, word83: bit15 is zero and bit14 is one
64     //
65     return EFI_DEVICE_ERROR;
66   }
67 
68   if ((Atapi6IdentifyStruct->AtapiData.cmd_set_support_83 & BIT10) == 0) {
69     //
70     // The device dosn't support 48 bit addressing
71     //
72     return EFI_UNSUPPORTED;
73   }
74 
75   //
76   // 48 bit address feature set is supported, get maximum capacity
77   //
78   Capacity = Atapi6IdentifyStruct->AtaData.maximum_lba_for_48bit_addressing[0];
79   for (Index = 1; Index < 4; Index++) {
80     //
81     // Lower byte goes first: word[100] is the lowest word, word[103] is highest
82     //
83     TmpLba = Atapi6IdentifyStruct->AtaData.maximum_lba_for_48bit_addressing[Index];
84     Capacity |= LShiftU64 (TmpLba, 16 * Index);
85   }
86 
87   if (Capacity > MAX_28BIT_ADDRESSING_CAPACITY) {
88     //
89     // Capacity exceeds 120GB. 48-bit addressing is really needed
90     //
91     IdeDev->Type = Ide48bitAddressingHardDisk;
92 
93     //
94     // Fill block media information:Media->LogicalPartition ,
95     // Media->WriteCaching will be filledin the DiscoverIdeDevcie() function.
96     //
97     IdeDev->BlkIo.Media->IoAlign        = 4;
98     IdeDev->BlkIo.Media->MediaId        = 1;
99     IdeDev->BlkIo.Media->RemovableMedia = FALSE;
100     IdeDev->BlkIo.Media->MediaPresent   = TRUE;
101     IdeDev->BlkIo.Media->ReadOnly       = FALSE;
102     IdeDev->BlkIo.Media->BlockSize      = 0x200;
103     IdeDev->BlkIo.Media->LastBlock      = Capacity - 1;
104 
105     return EFI_SUCCESS;
106   }
107 
108   return EFI_UNSUPPORTED;
109 }
110 /**
111   Enable SMART of the disk if supported
112 
113   @param IdeDev pointer pointing to IDE_BLK_IO_DEV data structure,used to record
114                 all the information of the IDE device.
115 **/
116 VOID
AtaSMARTSupport(IN IDE_BLK_IO_DEV * IdeDev)117 AtaSMARTSupport (
118   IN  IDE_BLK_IO_DEV  *IdeDev
119   )
120 {
121   EFI_STATUS        Status;
122   BOOLEAN           SMARTSupported;
123   UINT8             Device;
124   EFI_IDENTIFY_DATA *TmpAtaIdentifyPointer;
125   UINT8             DeviceSelect;
126   UINT8             LBAMid;
127   UINT8             LBAHigh;
128 
129   //
130   // Detect if the device supports S.M.A.R.T.
131   //
132   if ((IdeDev->IdData->AtaData.command_set_supported_83 & 0xc000) != 0x4000) {
133     //
134     // Data in word 82 is not valid (bit15 shall be zero and bit14 shall be to one)
135     //
136     return ;
137   } else {
138     if ((IdeDev->IdData->AtaData.command_set_supported_82 & 0x0001) != 0x0001) {
139       //
140       // S.M.A.R.T is not supported by the device
141       //
142       SMARTSupported = FALSE;
143     } else {
144       SMARTSupported = TRUE;
145     }
146   }
147 
148   if (!SMARTSupported) {
149     //
150     // Report nonsupport status code
151     //
152     REPORT_STATUS_CODE (
153       EFI_ERROR_CODE | EFI_ERROR_MINOR,
154       (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_NOTSUPPORTED)
155       );
156   } else {
157     //
158     // Enable this feature
159     //
160     REPORT_STATUS_CODE (
161       EFI_PROGRESS_CODE,
162       (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_ENABLE)
163       );
164 
165     Device = (UINT8) ((IdeDev->Device << 4) | 0xe0);
166     Status = AtaNonDataCommandIn (
167               IdeDev,
168               ATA_CMD_SMART,
169               Device,
170               ATA_SMART_ENABLE_OPERATION,
171               0,
172               0,
173               ATA_CONSTANT_4F,
174               ATA_CONSTANT_C2
175               );
176     //
177     // Detect if this feature is enabled
178     //
179     TmpAtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));
180     if (TmpAtaIdentifyPointer == NULL) {
181       return;
182     }
183 
184     DeviceSelect          = (UINT8) ((IdeDev->Device) << 4);
185     Status = AtaPioDataIn (
186               IdeDev,
187               (VOID *) TmpAtaIdentifyPointer,
188               sizeof (EFI_IDENTIFY_DATA),
189               ATA_CMD_IDENTIFY_DRIVE,
190               DeviceSelect,
191               0,
192               0,
193               0,
194               0
195               );
196     if (EFI_ERROR (Status)) {
197       gBS->FreePool (TmpAtaIdentifyPointer);
198       return ;
199     }
200 
201     //
202     // Check if the feature is enabled
203     //
204     if ((TmpAtaIdentifyPointer->AtaData.command_set_feature_enb_85 & 0x0001) == 0x0001) {
205       //
206       // Read status data
207       //
208       AtaNonDataCommandIn (
209         IdeDev,
210         ATA_CMD_SMART,
211         Device,
212         ATA_SMART_RETURN_STATUS,
213         0,
214         0,
215         ATA_CONSTANT_4F,
216         ATA_CONSTANT_C2
217         );
218       LBAMid  = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb);
219       LBAHigh = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb);
220 
221       if ((LBAMid == 0x4f) && (LBAHigh == 0xc2)) {
222         //
223         // The threshold exceeded condition is not detected by the device
224         //
225         REPORT_STATUS_CODE (
226               EFI_PROGRESS_CODE,
227               (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_UNDERTHRESHOLD)
228               );
229 
230       } else if ((LBAMid == 0xf4) && (LBAHigh == 0x2c)) {
231         //
232         // The threshold exceeded condition is  detected by the device
233         //
234         REPORT_STATUS_CODE (
235               EFI_PROGRESS_CODE,
236               (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_OVERTHRESHOLD)
237               );
238       }
239 
240     } else {
241       //
242       // Report disabled status code
243       //
244       REPORT_STATUS_CODE (
245             EFI_ERROR_CODE | EFI_ERROR_MINOR,
246             (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_DISABLED)
247             );
248     }
249 
250     gBS->FreePool (TmpAtaIdentifyPointer);
251   }
252 
253   return ;
254 }
255 /**
256   Sends out an ATA Identify Command to the specified device.
257 
258   This function is called by DiscoverIdeDevice() during its device
259   identification. It sends out the ATA Identify Command to the
260   specified device. Only ATA device responses to this command. If
261   the command succeeds, it returns the Identify data structure which
262   contains information about the device. This function extracts the
263   information it needs to fill the IDE_BLK_IO_DEV data structure,
264   including device type, media block size, media capacity, and etc.
265 
266   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure,used to record
267                  all the information of the IDE device.
268 
269   @retval EFI_SUCCESS      Identify ATA device successfully.
270   @retval EFI_DEVICE_ERROR ATA Identify Device Command failed or device is not ATA device.
271   @note  parameter IdeDev will be updated in this function.
272 
273 **/
274 EFI_STATUS
ATAIdentify(IN IDE_BLK_IO_DEV * IdeDev)275 ATAIdentify (
276   IN  IDE_BLK_IO_DEV  *IdeDev
277   )
278 {
279   EFI_STATUS        Status;
280   EFI_IDENTIFY_DATA *AtaIdentifyPointer;
281   UINT32            Capacity;
282   UINT8             DeviceSelect;
283   UINTN				Retry;
284 
285   //
286   //  AtaIdentifyPointer is used for accommodating returned IDENTIFY data of
287   //  the ATA Identify command
288   //
289   AtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));
290   if (AtaIdentifyPointer == NULL) {
291     return EFI_OUT_OF_RESOURCES;
292   }
293 
294   //
295   //  use ATA PIO Data In protocol to send ATA Identify command
296   //  and receive data from device
297   //
298   DeviceSelect  = (UINT8) ((IdeDev->Device) << 4);
299 
300 
301   Retry = 3;
302   while (Retry > 0) {
303     Status = AtaPioDataIn (
304               IdeDev,
305               (VOID *) AtaIdentifyPointer,
306               sizeof (EFI_IDENTIFY_DATA),
307               ATA_CMD_IDENTIFY_DRIVE,
308               DeviceSelect,
309               0,
310               0,
311               0,
312               0
313               );
314     //
315     // If ATA Identify command succeeds, then according to the received
316     // IDENTIFY data,
317     // identify the device type ( ATA or not ).
318     // If ATA device, fill the information in IdeDev.
319     // If not ATA device, return IDE_DEVICE_ERROR
320     //
321     if (!EFI_ERROR (Status)) {
322 
323       IdeDev->IdData = AtaIdentifyPointer;
324 
325       //
326       // Print ATA Module Name
327       //
328       PrintAtaModuleName (IdeDev);
329 
330       //
331       // bit 15 of pAtaIdentify->config is used to identify whether device is
332       // ATA device or ATAPI device.
333       // if 0, means ATA device; if 1, means ATAPI device.
334       //
335       if ((AtaIdentifyPointer->AtaData.config & 0x8000) == 0x00) {
336         //
337         // Detect if support S.M.A.R.T. If yes, enable it as default
338         //
339         AtaSMARTSupport (IdeDev);
340 
341         //
342         // Check whether this device needs 48-bit addressing (ATAPI-6 ata device)
343         //
344         Status = AtaAtapi6Identify (IdeDev);
345         if (!EFI_ERROR (Status)) {
346           //
347           // It's a disk with >120GB capacity, initialized in AtaAtapi6Identify()
348           //
349           return EFI_SUCCESS;
350         } else if (Status == EFI_DEVICE_ERROR) {
351 		  //
352 		  // Some disk with big capacity (>200GB) is slow when being identified
353 		  // and will return all zero for word83.
354 		  // We try twice at first. If it fails, we do a SoftRest and try again.
355 		  //
356 		  Retry--;
357 		  if (Retry == 1) {
358 		    //
359 		    // Do a SoftRest before the third attempt.
360 		    //
361 		    AtaSoftReset (IdeDev);
362 		  }
363 		  continue;
364 	    }
365         //
366         // This is a hard disk <= 120GB capacity, treat it as normal hard disk
367         //
368         IdeDev->Type = IdeHardDisk;
369 
370         //
371         // Block Media Information:
372         // Media->LogicalPartition , Media->WriteCaching will be filled
373         // in the DiscoverIdeDevcie() function.
374         //
375         IdeDev->BlkIo.Media->IoAlign        = 4;
376         IdeDev->BlkIo.Media->MediaId        = 1;
377         IdeDev->BlkIo.Media->RemovableMedia = FALSE;
378         IdeDev->BlkIo.Media->MediaPresent   = TRUE;
379         IdeDev->BlkIo.Media->ReadOnly       = FALSE;
380         IdeDev->BlkIo.Media->BlockSize      = 0x200;
381 
382         //
383         // Calculate device capacity
384         //
385         Capacity = ((UINT32)AtaIdentifyPointer->AtaData.user_addressable_sectors_hi << 16) |
386                   AtaIdentifyPointer->AtaData.user_addressable_sectors_lo ;
387         IdeDev->BlkIo.Media->LastBlock = Capacity - 1;
388 
389         return EFI_SUCCESS;
390       }
391 
392     }
393   	break;
394   }
395 
396   gBS->FreePool (AtaIdentifyPointer);
397   //
398   // Make sure the pIdData will not be freed again.
399   //
400   IdeDev->IdData = NULL;
401 
402   return EFI_DEVICE_ERROR;
403 }
404 
405 /**
406   This function is a helper function used to change the char order in a string. It
407   is designed specially for the PrintAtaModuleName() function. After the IDE device
408   is detected, the IDE driver gets the device module name by sending ATA command
409   called ATA Identify Command or ATAPI Identify Command to the specified IDE device.
410   The module name returned is a string of ASCII characters: the first character is bit8--bit15
411   of the first word, the second character is BIT0--bit7 of the first word and so on. Thus
412   the string can not be print directly before it is preprocessed by this func to change
413   the order of characters in each word in the string.
414 
415   @param Destination Indicates the destination string.
416   @param Source      Indicates the source string.
417   @param Size         the length of the string
418 **/
419 VOID
SwapStringChars(IN CHAR8 * Destination,IN CHAR8 * Source,IN UINT32 Size)420 SwapStringChars (
421   IN CHAR8  *Destination,
422   IN CHAR8  *Source,
423   IN UINT32 Size
424   )
425 {
426   UINT32  Index;
427   CHAR8   Temp;
428 
429   for (Index = 0; Index < Size; Index += 2) {
430 
431     Temp                    = Source[Index + 1];
432     Destination[Index + 1]  = Source[Index];
433     Destination[Index]      = Temp;
434   }
435 }
436 /**
437   This function is called by ATAIdentify() or ATAPIIdentify() to print device's module name.
438 
439   @param  IdeDev   pointer pointing to IDE_BLK_IO_DEV data structure, used to record
440                    all the information of the IDE device.
441 **/
442 VOID
PrintAtaModuleName(IN IDE_BLK_IO_DEV * IdeDev)443 PrintAtaModuleName (
444   IN  IDE_BLK_IO_DEV  *IdeDev
445   )
446 {
447   if (IdeDev->IdData == NULL) {
448     return ;
449   }
450 
451   SwapStringChars (IdeDev->ModelName, IdeDev->IdData->AtaData.ModelName, 40);
452   IdeDev->ModelName[40] = 0x00;
453 }
454 
455 /**
456   This function is used to send out ATA commands conforms to the PIO Data In Protocol.
457 
458   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used to record
459                       all the information of the IDE device.
460   @param Buffer       buffer contained data transferred from device to host.
461   @param ByteCount    data size in byte unit of the buffer.
462   @param AtaCommand   value of the Command Register
463   @param Head         value of the Head/Device Register
464   @param SectorCount  value of the Sector Count Register
465   @param SectorNumber value of the Sector Number Register
466   @param CylinderLsb  value of the low byte of the Cylinder Register
467   @param CylinderMsb  value of the high byte of the Cylinder Register
468 
469   @retval EFI_SUCCESS      send out the ATA command and device send required data successfully.
470   @retval EFI_DEVICE_ERROR command sent failed.
471 
472 **/
473 EFI_STATUS
AtaPioDataIn(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * Buffer,IN UINT32 ByteCount,IN UINT8 AtaCommand,IN UINT8 Head,IN UINT8 SectorCount,IN UINT8 SectorNumber,IN UINT8 CylinderLsb,IN UINT8 CylinderMsb)474 AtaPioDataIn (
475   IN  IDE_BLK_IO_DEV  *IdeDev,
476   IN  VOID            *Buffer,
477   IN  UINT32          ByteCount,
478   IN  UINT8           AtaCommand,
479   IN  UINT8           Head,
480   IN  UINT8           SectorCount,
481   IN  UINT8           SectorNumber,
482   IN  UINT8           CylinderLsb,
483   IN  UINT8           CylinderMsb
484   )
485 {
486   UINTN       WordCount;
487   UINTN       Increment;
488   UINT16      *Buffer16;
489   EFI_STATUS  Status;
490 
491   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
492   if (EFI_ERROR (Status)) {
493     return EFI_DEVICE_ERROR;
494   }
495 
496   //
497   //  e0:1110,0000-- bit7 and bit5 are reserved bits.
498   //           bit6 set means LBA mode
499   //
500   IDEWritePortB (
501     IdeDev->PciIo,
502     IdeDev->IoPort->Head,
503     (UINT8) ((IdeDev->Device << 4) | 0xe0 | Head)
504     );
505 
506   //
507   // All ATAPI device's ATA commands can be issued regardless of the
508   // state of the DRDY
509   //
510   if (IdeDev->Type == IdeHardDisk) {
511 
512     Status = DRDYReady (IdeDev, ATATIMEOUT);
513     if (EFI_ERROR (Status)) {
514       return EFI_DEVICE_ERROR;
515     }
516   }
517   //
518   // set all the command parameters
519   // Before write to all the following registers, BSY and DRQ must be 0.
520   //
521   Status = DRQClear2 (IdeDev, ATATIMEOUT);
522   if (EFI_ERROR (Status)) {
523     return EFI_DEVICE_ERROR;
524   }
525 
526   if (AtaCommand == ATA_CMD_SET_FEATURES) {
527     IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, 0x03);
528   }
529 
530   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount);
531   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, SectorNumber);
532   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, CylinderLsb);
533   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, CylinderMsb);
534 
535   //
536   // send command via Command Register
537   //
538   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
539 
540   Buffer16 = (UINT16 *) Buffer;
541 
542   //
543   // According to PIO data in protocol, host can perform a series of reads to
544   // the data register after each time device set DRQ ready;
545   // The data size of "a series of read" is command specific.
546   // For most ATA command, data size received from device will not exceed
547   // 1 sector, hence the data size for "a series of read" can be the whole data
548   // size of one command request.
549   // For ATA command such as Read Sector command, the data size of one ATA
550   // command request is often larger than 1 sector, according to the
551   // Read Sector command, the data size of "a series of read" is exactly 1
552   // sector.
553   // Here for simplification reason, we specify the data size for
554   // "a series of read" to 1 sector (256 words) if data size of one ATA command
555   // request is larger than 256 words.
556   //
557   Increment = 256;
558 
559   //
560   // used to record bytes of currently transfered data
561   //
562   WordCount = 0;
563 
564   while (WordCount < ByteCount / 2) {
565     //
566     // Poll DRQ bit set, data transfer can be performed only when DRQ is ready.
567     //
568     Status = DRQReady2 (IdeDev, ATATIMEOUT);
569     if (EFI_ERROR (Status)) {
570       return EFI_DEVICE_ERROR;
571     }
572 
573     Status = CheckErrorStatus (IdeDev);
574     if (EFI_ERROR (Status)) {
575       return EFI_DEVICE_ERROR;
576     }
577 
578     //
579     // Get the byte count for one series of read
580     //
581     if ((WordCount + Increment) > ByteCount / 2) {
582       Increment = ByteCount / 2 - WordCount;
583     }
584 
585     IDEReadPortWMultiple (
586       IdeDev->PciIo,
587       IdeDev->IoPort->Data,
588       Increment,
589       Buffer16
590       );
591 
592     WordCount += Increment;
593     Buffer16 += Increment;
594 
595   }
596 
597   DRQClear (IdeDev, ATATIMEOUT);
598 
599   return CheckErrorStatus (IdeDev);
600 }
601 
602 /**
603   This function is used to send out ATA commands conforms to the
604   PIO Data Out Protocol.
605 
606   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used
607                       to record all the information of the IDE device.
608   @param *Buffer      buffer contained data transferred from host to device.
609   @param ByteCount    data size in byte unit of the buffer.
610   @param AtaCommand   value of the Command Register
611   @param Head         value of the Head/Device Register
612   @param SectorCount  value of the Sector Count Register
613   @param SectorNumber value of the Sector Number Register
614   @param CylinderLsb  value of the low byte of the Cylinder Register
615   @param CylinderMsb  value of the high byte of the Cylinder Register
616 
617   @retval EFI_SUCCESS      send out the ATA command and device received required
618                            data successfully.
619   @retval EFI_DEVICE_ERROR command sent failed.
620 
621 **/
622 EFI_STATUS
AtaPioDataOut(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * Buffer,IN UINT32 ByteCount,IN UINT8 AtaCommand,IN UINT8 Head,IN UINT8 SectorCount,IN UINT8 SectorNumber,IN UINT8 CylinderLsb,IN UINT8 CylinderMsb)623 AtaPioDataOut (
624   IN  IDE_BLK_IO_DEV  *IdeDev,
625   IN  VOID            *Buffer,
626   IN  UINT32          ByteCount,
627   IN  UINT8           AtaCommand,
628   IN  UINT8           Head,
629   IN  UINT8           SectorCount,
630   IN  UINT8           SectorNumber,
631   IN  UINT8           CylinderLsb,
632   IN  UINT8           CylinderMsb
633   )
634 {
635   UINTN       WordCount;
636   UINTN       Increment;
637   UINT16      *Buffer16;
638   EFI_STATUS  Status;
639 
640   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
641   if (EFI_ERROR (Status)) {
642     return EFI_DEVICE_ERROR;
643   }
644 
645   //
646   // select device via Head/Device register.
647   // Before write Head/Device register, BSY and DRQ must be 0.
648   //
649   Status = DRQClear2 (IdeDev, ATATIMEOUT);
650   if (EFI_ERROR (Status)) {
651     return EFI_DEVICE_ERROR;
652   }
653 
654   //
655   // e0:1110,0000-- bit7 and bit5 are reserved bits.
656   //          bit6 set means LBA mode
657   //
658   IDEWritePortB (
659     IdeDev->PciIo,
660     IdeDev->IoPort->Head,
661     (UINT8) ((IdeDev->Device << 4) | 0xe0 | Head)
662     );
663 
664   Status = DRDYReady (IdeDev, ATATIMEOUT);
665   if (EFI_ERROR (Status)) {
666     return EFI_DEVICE_ERROR;
667   }
668 
669   //
670   // set all the command parameters
671   // Before write to all the following registers, BSY and DRQ must be 0.
672   //
673   Status = DRQClear2 (IdeDev, ATATIMEOUT);
674   if (EFI_ERROR (Status)) {
675     return EFI_DEVICE_ERROR;
676   }
677 
678   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount);
679   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, SectorNumber);
680   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, CylinderLsb);
681   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, CylinderMsb);
682 
683   //
684   // send command via Command Register
685   //
686   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
687 
688   Buffer16 = (UINT16 *) Buffer;
689 
690   //
691   // According to PIO data out protocol, host can perform a series of
692   // writes to the data register after each time device set DRQ ready;
693   // The data size of "a series of read" is command specific.
694   // For most ATA command, data size written to device will not exceed 1 sector,
695   // hence the data size for "a series of write" can be the data size of one
696   // command request.
697   // For ATA command such as Write Sector command, the data size of one
698   // ATA command request is often larger than 1 sector, according to the
699   // Write Sector command, the data size of "a series of read" is exactly
700   // 1 sector.
701   // Here for simplification reason, we specify the data size for
702   // "a series of write" to 1 sector (256 words) if data size of one ATA command
703   // request is larger than 256 words.
704   //
705   Increment = 256;
706   WordCount = 0;
707 
708   while (WordCount < ByteCount / 2) {
709 
710     //
711     // DRQReady2-- read Alternate Status Register to determine the DRQ bit
712     // data transfer can be performed only when DRQ is ready.
713     //
714     Status = DRQReady2 (IdeDev, ATATIMEOUT);
715     if (EFI_ERROR (Status)) {
716       return EFI_DEVICE_ERROR;
717     }
718 
719     Status = CheckErrorStatus (IdeDev);
720     if (EFI_ERROR (Status)) {
721       return EFI_DEVICE_ERROR;
722     }
723 
724    //
725    // Check the remaining byte count is less than 512 bytes
726    //
727    if ((WordCount + Increment) > ByteCount / 2) {
728       Increment = ByteCount / 2 - WordCount;
729     }
730     //
731     // perform a series of write without check DRQ ready
732     //
733 
734     IDEWritePortWMultiple (
735       IdeDev->PciIo,
736       IdeDev->IoPort->Data,
737       Increment,
738       Buffer16
739       );
740     WordCount += Increment;
741     Buffer16 += Increment;
742 
743   }
744 
745   DRQClear (IdeDev, ATATIMEOUT);
746 
747   return CheckErrorStatus (IdeDev);
748 }
749 
750 /**
751   This function is used to analyze the Status Register and print out
752   some debug information and if there is ERR bit set in the Status
753   Register, the Error Register's value is also be parsed and print out.
754 
755   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure, used to
756                  record all the information of the IDE device.
757 
758   @retval EFI_SUCCESS       No err information in the Status Register.
759   @retval EFI_DEVICE_ERROR  Any err information in the Status Register.
760 
761 **/
762 EFI_STATUS
CheckErrorStatus(IN IDE_BLK_IO_DEV * IdeDev)763 CheckErrorStatus (
764   IN  IDE_BLK_IO_DEV  *IdeDev
765   )
766 {
767   UINT8 StatusRegister;
768   UINT8 ErrorRegister;
769 
770   StatusRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);
771 
772   DEBUG_CODE_BEGIN ();
773 
774   if ((StatusRegister & ATA_STSREG_DWF) != 0) {
775     DEBUG (
776       (EFI_D_BLKIO,
777       "CheckErrorStatus()-- %02x : Error : Write Fault\n",
778       StatusRegister)
779       );
780   }
781 
782   if ((StatusRegister & ATA_STSREG_CORR) != 0) {
783     DEBUG (
784       (EFI_D_BLKIO,
785       "CheckErrorStatus()-- %02x : Error : Corrected Data\n",
786       StatusRegister)
787       );
788    }
789 
790   if ((StatusRegister & ATA_STSREG_ERR) != 0) {
791     ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);
792 
793     if ((ErrorRegister & ATA_ERRREG_BBK) != 0) {
794       DEBUG (
795         (EFI_D_BLKIO,
796         "CheckErrorStatus()-- %02x : Error : Bad Block Detected\n",
797         ErrorRegister)
798         );
799       }
800 
801       if ((ErrorRegister & ATA_ERRREG_UNC) != 0) {
802         DEBUG (
803           (EFI_D_BLKIO,
804           "CheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",
805           ErrorRegister)
806           );
807       }
808 
809       if ((ErrorRegister & ATA_ERRREG_MC) != 0) {
810         DEBUG (
811           (EFI_D_BLKIO,
812           "CheckErrorStatus()-- %02x : Error : Media Change\n",
813           ErrorRegister)
814           );
815       }
816 
817       if ((ErrorRegister & ATA_ERRREG_ABRT) != 0) {
818         DEBUG (
819           (EFI_D_BLKIO,
820           "CheckErrorStatus()-- %02x : Error : Abort\n",
821           ErrorRegister)
822           );
823       }
824 
825       if ((ErrorRegister & ATA_ERRREG_TK0NF) != 0) {
826         DEBUG (
827           (EFI_D_BLKIO,
828           "CheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",
829           ErrorRegister)
830           );
831       }
832 
833       if ((ErrorRegister & ATA_ERRREG_AMNF) != 0) {
834         DEBUG (
835           (EFI_D_BLKIO,
836           "CheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",
837           ErrorRegister)
838           );
839       }
840     }
841 
842   DEBUG_CODE_END ();
843 
844   if ((StatusRegister & (ATA_STSREG_ERR | ATA_STSREG_DWF | ATA_STSREG_CORR)) == 0) {
845     return EFI_SUCCESS;
846   }
847 
848   return EFI_DEVICE_ERROR;
849 
850 }
851 
852 /**
853   This function is called by the AtaBlkIoReadBlocks() to perform reading from
854   media in block unit.
855 
856   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used to record
857                         all the information of the IDE device.
858   @param DataBuffer     A pointer to the destination buffer for the data.
859   @param Lba            The starting logical block address to read from on the device media.
860   @param NumberOfBlocks The number of transfer data blocks.
861 
862   @return status is fully dependent on the return status of AtaPioDataIn() function.
863 
864 **/
865 EFI_STATUS
AtaReadSectors(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA Lba,IN UINTN NumberOfBlocks)866 AtaReadSectors (
867   IN  IDE_BLK_IO_DEV  *IdeDev,
868   IN  VOID            *DataBuffer,
869   IN  EFI_LBA         Lba,
870   IN  UINTN           NumberOfBlocks
871   )
872 {
873   EFI_STATUS  Status;
874   UINTN       BlocksRemaining;
875   UINT32      Lba32;
876   UINT8       Lba0;
877   UINT8       Lba1;
878   UINT8       Lba2;
879   UINT8       Lba3;
880   UINT8       AtaCommand;
881   UINT8       SectorCount8;
882   UINT16      SectorCount;
883   UINTN       ByteCount;
884   VOID        *Buffer;
885 
886   Buffer = DataBuffer;
887 
888   //
889   // Using ATA Read Sector(s) command (opcode=0x20) with PIO DATA IN protocol
890   //
891   AtaCommand      = ATA_CMD_READ_SECTORS;
892 
893 
894   BlocksRemaining = NumberOfBlocks;
895 
896   Lba32           = (UINT32) Lba;
897 
898   Status          = EFI_SUCCESS;
899 
900   while (BlocksRemaining > 0) {
901 
902     //
903     // in ATA-3 spec, LBA is in 28 bit width
904     //
905     Lba0  = (UINT8) Lba32;
906     Lba1  = (UINT8) (Lba32 >> 8);
907     Lba2  = (UINT8) (Lba32 >> 16);
908     //
909     // low 4 bit of Lba3 stands for LBA bit24~bit27.
910     //
911     Lba3 = (UINT8) ((Lba32 >> 24) & 0x0f);
912 
913     if (BlocksRemaining >= 0x100) {
914 
915       //
916       //  SectorCount8 is sent to Sector Count register, 0x00 means 256
917       //  sectors to be read
918       //
919       SectorCount8 = 0x00;
920       //
921       //  SectorCount is used to record the number of sectors to be read
922       //
923       SectorCount = 256;
924     } else {
925 
926       SectorCount8  = (UINT8) BlocksRemaining;
927       SectorCount   = (UINT16) BlocksRemaining;
928     }
929 
930     //
931     // ByteCount is the number of bytes that will be read
932     //
933     ByteCount = SectorCount * (IdeDev->BlkIo.Media->BlockSize);
934 
935     //
936     // call AtaPioDataIn() to send Read Sector Command and receive data read
937     //
938     Status = AtaPioDataIn (
939               IdeDev,
940               Buffer,
941               (UINT32) ByteCount,
942               AtaCommand,
943               Lba3,
944               SectorCount8,
945               Lba0,
946               Lba1,
947               Lba2
948               );
949     if (EFI_ERROR (Status)) {
950       return Status;
951     }
952 
953     Lba32 += SectorCount;
954     Buffer = ((UINT8 *) Buffer + ByteCount);
955     BlocksRemaining -= SectorCount;
956   }
957 
958   return Status;
959 }
960 
961 /**
962   This function is called by the AtaBlkIoWriteBlocks() to perform writing onto
963   media in block unit.
964 
965   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure,used to record
966                         all the information of the IDE device.
967   @param BufferData     A pointer to the source buffer for the data.
968   @param Lba            The starting logical block address to write onto the device media.
969   @param NumberOfBlocks The number of transfer data blocks.
970 
971   @return status is fully dependent on the return status of AtaPioDataIn() function.
972 
973 **/
974 EFI_STATUS
AtaWriteSectors(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * BufferData,IN EFI_LBA Lba,IN UINTN NumberOfBlocks)975 AtaWriteSectors (
976   IN  IDE_BLK_IO_DEV  *IdeDev,
977   IN  VOID            *BufferData,
978   IN  EFI_LBA         Lba,
979   IN  UINTN           NumberOfBlocks
980   )
981 {
982   EFI_STATUS  Status;
983   UINTN       BlocksRemaining;
984   UINT32      Lba32;
985   UINT8       Lba0;
986   UINT8       Lba1;
987   UINT8       Lba2;
988   UINT8       Lba3;
989   UINT8       AtaCommand;
990   UINT8       SectorCount8;
991   UINT16      SectorCount;
992   UINTN       ByteCount;
993   VOID        *Buffer;
994 
995   Buffer = BufferData;
996 
997   //
998   // Using Write Sector(s) command (opcode=0x30) with PIO DATA OUT protocol
999   //
1000   AtaCommand      = ATA_CMD_WRITE_SECTORS;
1001 
1002   BlocksRemaining = NumberOfBlocks;
1003 
1004   Lba32           = (UINT32) Lba;
1005 
1006   Status          = EFI_SUCCESS;
1007 
1008   while (BlocksRemaining > 0) {
1009 
1010     Lba0  = (UINT8) Lba32;
1011     Lba1  = (UINT8) (Lba32 >> 8);
1012     Lba2  = (UINT8) (Lba32 >> 16);
1013     Lba3  = (UINT8) ((Lba32 >> 24) & 0x0f);
1014 
1015     if (BlocksRemaining >= 0x100) {
1016 
1017       //
1018       //  SectorCount8 is sent to Sector Count register, 0x00 means 256 sectors
1019       //  to be written
1020       //
1021       SectorCount8 = 0x00;
1022       //
1023       //  SectorCount is used to record the number of sectors to be written
1024       //
1025       SectorCount = 256;
1026     } else {
1027 
1028       SectorCount8  = (UINT8) BlocksRemaining;
1029       SectorCount   = (UINT16) BlocksRemaining;
1030     }
1031 
1032     ByteCount = SectorCount * (IdeDev->BlkIo.Media->BlockSize);
1033 
1034     Status = AtaPioDataOut (
1035               IdeDev,
1036               Buffer,
1037               (UINT32) ByteCount,
1038               AtaCommand,
1039               Lba3,
1040               SectorCount8,
1041               Lba0,
1042               Lba1,
1043               Lba2
1044               );
1045     if (EFI_ERROR (Status)) {
1046       return Status;
1047     }
1048 
1049     Lba32 += SectorCount;
1050     Buffer = ((UINT8 *) Buffer + ByteCount);
1051     BlocksRemaining -= SectorCount;
1052   }
1053 
1054   return Status;
1055 }
1056 /**
1057   This function is used to implement the Soft Reset on the specified device. But,
1058   the ATA Soft Reset mechanism is so strong a reset method that it will force
1059   resetting on both devices connected to the same cable.
1060 
1061   It is called by IdeBlkIoReset(), a interface function of Block
1062   I/O protocol.
1063 
1064   This function can also be used by the ATAPI device to perform reset when
1065   ATAPI Reset command is failed.
1066 
1067   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure, used to record
1068                  all the information of the IDE device.
1069   @retval EFI_SUCCESS       Soft reset completes successfully.
1070   @retval EFI_DEVICE_ERROR  Any step during the reset process is failed.
1071 
1072   @note  The registers initial values after ATA soft reset are different
1073          to the ATA device and ATAPI device.
1074 **/
1075 EFI_STATUS
AtaSoftReset(IN IDE_BLK_IO_DEV * IdeDev)1076 AtaSoftReset (
1077   IN  IDE_BLK_IO_DEV  *IdeDev
1078   )
1079 {
1080 
1081   UINT8 DeviceControl;
1082 
1083   DeviceControl = 0;
1084   //
1085   // set SRST bit to initiate soft reset
1086   //
1087   DeviceControl |= ATA_CTLREG_SRST;
1088 
1089   //
1090   // disable Interrupt
1091   //
1092   DeviceControl |= BIT1;
1093 
1094   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);
1095 
1096   //
1097   // SRST should assert for at least 5 us, we use 10 us for
1098   // better compatibility
1099   //
1100   gBS->Stall (10);
1101 
1102   //
1103   // Enable interrupt to support UDMA, and clear SRST bit
1104   //
1105   DeviceControl = 0;
1106   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);
1107 
1108   //
1109   // Wait for at least 2 ms to check BSY status, we use 10 ms
1110   // for better compatibility
1111   //
1112   gBS->Stall(10000);
1113   //
1114   // slave device needs at most 31s to clear BSY
1115   //
1116   if (WaitForBSYClear (IdeDev, 31000) == EFI_TIMEOUT) {
1117     return EFI_DEVICE_ERROR;
1118   }
1119 
1120   return EFI_SUCCESS;
1121 }
1122 /**
1123   This function is used to send out ATA commands conforms to the PIO Data In
1124   Protocol, supporting ATA/ATAPI-6 standard
1125 
1126   Comparing with ATA-3 data in protocol, we have two differents here:
1127   1. Do NOT wait for DRQ clear before sending command into IDE device.(the
1128   wait will frequently fail... cause writing function return error)
1129 
1130   2. Do NOT wait for DRQ clear after all data readed.(the wait greatly
1131   slow down writing performance by 100 times!)
1132 
1133   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used
1134                       to record all the information of the IDE device.
1135   @param Buffer       buffer contained data transferred from device to host.
1136   @param ByteCount    data size in byte unit of the buffer.
1137   @param AtaCommand   value of the Command Register
1138   @param StartLba     the start LBA of this transaction
1139   @param SectorCount  the count of sectors to be transfered
1140 
1141   @retval EFI_SUCCESS      send out the ATA command and device send required data successfully.
1142   @retval EFI_DEVICE_ERROR command sent failed.
1143 
1144 **/
1145 EFI_STATUS
AtaPioDataInExt(IN IDE_BLK_IO_DEV * IdeDev,IN OUT VOID * Buffer,IN UINT32 ByteCount,IN UINT8 AtaCommand,IN EFI_LBA StartLba,IN UINT16 SectorCount)1146 AtaPioDataInExt (
1147   IN  IDE_BLK_IO_DEV  *IdeDev,
1148   IN  OUT VOID        *Buffer,
1149   IN  UINT32          ByteCount,
1150   IN  UINT8           AtaCommand,
1151   IN  EFI_LBA         StartLba,
1152   IN  UINT16          SectorCount
1153   )
1154 {
1155   UINT8       DevSel;
1156   UINT8       SectorCount8;
1157   UINT8       LbaLow;
1158   UINT8       LbaMid;
1159   UINT8       LbaHigh;
1160   UINTN       WordCount;
1161   UINTN       Increment;
1162   UINT16      *Buffer16;
1163   EFI_STATUS  Status;
1164 
1165   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
1166   if (EFI_ERROR (Status)) {
1167     return EFI_DEVICE_ERROR;
1168   }
1169 
1170   //
1171   // Select device, set bit6 as 1 to indicate LBA mode is used
1172   //
1173   DevSel = (UINT8) (IdeDev->Device << 4);
1174   DevSel |= 0x40;
1175   IDEWritePortB (
1176     IdeDev->PciIo,
1177     IdeDev->IoPort->Head,
1178     DevSel
1179     );
1180 
1181   //
1182   // Wait for DRDY singnal asserting. ATAPI device needn't wait
1183   //
1184   if ( (IdeDev->Type == IdeHardDisk)  ||
1185         (IdeDev->Type == Ide48bitAddressingHardDisk)) {
1186 
1187     Status = DRDYReady (IdeDev, ATATIMEOUT);
1188     if (EFI_ERROR (Status)) {
1189       return EFI_DEVICE_ERROR;
1190     }
1191   }
1192 
1193   //
1194   // Fill feature register if needed
1195   //
1196   if (AtaCommand == ATA_CMD_SET_FEATURES) {
1197     IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, 0x03);
1198   }
1199 
1200   //
1201   // Fill the sector count register, which is a two-byte FIFO. Need write twice.
1202   //
1203   SectorCount8 = (UINT8) (SectorCount >> 8);
1204   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
1205 
1206   SectorCount8 = (UINT8) SectorCount;
1207   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
1208 
1209   //
1210   // Fill the start LBA registers, which are also two-byte FIFO
1211   //
1212   LbaLow  = (UINT8) RShiftU64 (StartLba, 24);
1213   LbaMid  = (UINT8) RShiftU64 (StartLba, 32);
1214   LbaHigh = (UINT8) RShiftU64 (StartLba, 40);
1215   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
1216   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
1217   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
1218 
1219   LbaLow  = (UINT8) StartLba;
1220   LbaMid  = (UINT8) RShiftU64 (StartLba, 8);
1221   LbaHigh = (UINT8) RShiftU64 (StartLba, 16);
1222   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
1223   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
1224   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
1225 
1226   //
1227   // Send command via Command Register, invoking the processing of this command
1228   //
1229   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
1230 
1231   Buffer16 = (UINT16 *) Buffer;
1232 
1233   //
1234   // According to PIO data in protocol, host can perform a series of reads to
1235   // the data register after each time device set DRQ ready;
1236   //
1237 
1238   //
1239   // 256 words
1240   //
1241   Increment = 256;
1242 
1243   //
1244   // used to record bytes of currently transfered data
1245   //
1246   WordCount = 0;
1247 
1248   while (WordCount < ByteCount / 2) {
1249     //
1250     // Poll DRQ bit set, data transfer can be performed only when DRQ is ready.
1251     //
1252     Status = DRQReady2 (IdeDev, ATATIMEOUT);
1253     if (EFI_ERROR (Status)) {
1254       return EFI_DEVICE_ERROR;
1255     }
1256 
1257     Status = CheckErrorStatus (IdeDev);
1258     if (EFI_ERROR (Status)) {
1259       return EFI_DEVICE_ERROR;
1260     }
1261 
1262     //
1263     // Get the byte count for one series of read
1264     //
1265     if ((WordCount + Increment) > ByteCount / 2) {
1266       Increment = ByteCount / 2 - WordCount;
1267     }
1268 
1269     IDEReadPortWMultiple (
1270       IdeDev->PciIo,
1271       IdeDev->IoPort->Data,
1272       Increment,
1273       Buffer16
1274       );
1275 
1276     WordCount += Increment;
1277     Buffer16 += Increment;
1278 
1279   }
1280 
1281   return CheckErrorStatus (IdeDev);
1282 }
1283 /**
1284   Send ATA Ext command into device with NON_DATA protocol.
1285 
1286   @param  IdeDev Standard IDE device private data structure
1287   @param  AtaCommand The ATA command to be sent
1288   @param  Device The value in Device register
1289   @param  Feature The value in Feature register
1290   @param  SectorCount The value in SectorCount register
1291   @param  LbaAddress The LBA address in 48-bit mode
1292 
1293   @retval  EFI_SUCCESS Reading succeed
1294   @retval  EFI_DEVICE_ERROR Error executing commands on this device.
1295 
1296 **/
1297 EFI_STATUS
AtaCommandIssueExt(IN IDE_BLK_IO_DEV * IdeDev,IN UINT8 AtaCommand,IN UINT8 Device,IN UINT16 Feature,IN UINT16 SectorCount,IN EFI_LBA LbaAddress)1298 AtaCommandIssueExt (
1299   IN  IDE_BLK_IO_DEV  *IdeDev,
1300   IN  UINT8           AtaCommand,
1301   IN  UINT8           Device,
1302   IN  UINT16          Feature,
1303   IN  UINT16          SectorCount,
1304   IN  EFI_LBA         LbaAddress
1305   )
1306 {
1307   EFI_STATUS  Status;
1308   UINT8       SectorCount8;
1309   UINT8       Feature8;
1310   UINT8       LbaLow;
1311   UINT8       LbaMid;
1312   UINT8       LbaHigh;
1313 
1314   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
1315   if (EFI_ERROR (Status)) {
1316     return EFI_DEVICE_ERROR;
1317   }
1318 
1319   //
1320   // Select device (bit4), set LBA mode(bit6) (use 0xe0 for compatibility)
1321   //
1322   IDEWritePortB (
1323     IdeDev->PciIo,
1324     IdeDev->IoPort->Head,
1325     (UINT8) ((IdeDev->Device << 4) | 0xe0)
1326     );
1327 
1328   //
1329   // ATA commands for ATA device must be issued when DRDY is set
1330   //
1331   Status = DRDYReady (IdeDev, ATATIMEOUT);
1332   if (EFI_ERROR (Status)) {
1333     return EFI_DEVICE_ERROR;
1334   }
1335 
1336   //
1337   // Pass parameter into device register block
1338   //
1339   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Head, Device);
1340 
1341   //
1342   // Fill the feature register, which is a two-byte FIFO. Need write twice.
1343   //
1344   Feature8 = (UINT8) (Feature >> 8);
1345   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature8);
1346 
1347   Feature8 = (UINT8) Feature;
1348   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature8);
1349 
1350   //
1351   // Fill the sector count register, which is a two-byte FIFO. Need write twice.
1352   //
1353   SectorCount8 = (UINT8) (SectorCount >> 8);
1354   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
1355 
1356   SectorCount8 = (UINT8) SectorCount;
1357   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
1358 
1359   //
1360   // Fill the start LBA registers, which are also two-byte FIFO
1361   //
1362   LbaLow = (UINT8) RShiftU64 (LbaAddress, 24);
1363   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
1364   LbaLow = (UINT8) LbaAddress;
1365   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
1366 
1367   LbaMid = (UINT8) RShiftU64 (LbaAddress, 32);
1368   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
1369   LbaMid = (UINT8) RShiftU64 (LbaAddress, 8);
1370   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
1371 
1372   LbaHigh = (UINT8) RShiftU64 (LbaAddress, 40);
1373   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
1374   LbaHigh = (UINT8) RShiftU64 (LbaAddress, 16);
1375   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
1376 
1377   //
1378   // Work around for Segate 160G disk writing
1379   //
1380   gBS->Stall (1800);
1381 
1382   //
1383   // Send command via Command Register
1384   //
1385   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
1386 
1387   //
1388   // Stall at least 400ns
1389   //
1390   gBS->Stall (100);
1391 
1392   return EFI_SUCCESS;
1393 }
1394 /**
1395   Send ATA Ext command into device with NON_DATA protocol
1396 
1397   @param  IdeDev Standard IDE device private data structure
1398   @param  AtaCommand The ATA command to be sent
1399   @param  Device The value in Device register
1400   @param  Feature The value in Feature register
1401   @param  SectorCount The value in SectorCount register
1402   @param  LbaAddress The LBA address in 48-bit mode
1403 
1404   @retval  EFI_SUCCESS Reading succeed
1405   @retval  EFI_DEVICE_ERROR Error executing commands on this device.
1406 
1407 **/
1408 EFI_STATUS
AtaCommandIssue(IN IDE_BLK_IO_DEV * IdeDev,IN UINT8 AtaCommand,IN UINT8 Device,IN UINT16 Feature,IN UINT16 SectorCount,IN EFI_LBA LbaAddress)1409 AtaCommandIssue (
1410   IN  IDE_BLK_IO_DEV  *IdeDev,
1411   IN  UINT8           AtaCommand,
1412   IN  UINT8           Device,
1413   IN  UINT16          Feature,
1414   IN  UINT16          SectorCount,
1415   IN  EFI_LBA         LbaAddress
1416   )
1417 {
1418   EFI_STATUS  Status;
1419   UINT8       SectorCount8;
1420   UINT8       Feature8;
1421   UINT8       Lba0;
1422   UINT8       Lba1;
1423   UINT8       Lba2;
1424   UINT8       Lba3;
1425 
1426   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
1427   if (EFI_ERROR (Status)) {
1428     return EFI_DEVICE_ERROR;
1429   }
1430 
1431   //
1432   // Select device (bit4), set LBA mode(bit6) (use 0xe0 for compatibility)
1433   //
1434   IDEWritePortB (
1435     IdeDev->PciIo,
1436     IdeDev->IoPort->Head,
1437     (UINT8) ((IdeDev->Device << 4) | 0xe0)
1438     );
1439 
1440   //
1441   // ATA commands for ATA device must be issued when DRDY is set
1442   //
1443   Status = DRDYReady (IdeDev, ATATIMEOUT);
1444   if (EFI_ERROR (Status)) {
1445     return EFI_DEVICE_ERROR;
1446   }
1447 
1448   Lba0  = (UINT8) LbaAddress;
1449   Lba1  = (UINT8) RShiftU64 (LbaAddress, 8);
1450   Lba2  = (UINT8) RShiftU64 (LbaAddress, 16);
1451   Lba3  = (UINT8) RShiftU64 (LbaAddress, 24);
1452   Device = (UINT8) (Device | Lba3);
1453 
1454   //
1455   // Pass parameter into device register block
1456   //
1457   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Head, Device);
1458 
1459   //
1460   // Fill the feature register, which is a two-byte FIFO. Need write twice.
1461   //
1462   Feature8 = (UINT8) Feature;
1463   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature8);
1464 
1465   //
1466   // Fill the sector count register, which is a two-byte FIFO. Need write twice.
1467   //
1468   SectorCount8 = (UINT8) SectorCount;
1469   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
1470 
1471   //
1472   // Fill the start LBA registers, which are also two-byte FIFO
1473   //
1474 
1475   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, Lba0);
1476   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, Lba1);
1477   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, Lba2);
1478 
1479   //
1480   // Send command via Command Register
1481   //
1482   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
1483 
1484   //
1485   // Stall at least 400ns
1486   //
1487   gBS->Stall (100);
1488 
1489   return EFI_SUCCESS;
1490 }
1491 /**
1492   Perform an ATA Udma operation (Read, ReadExt, Write, WriteExt).
1493 
1494   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used
1495                         to record all the information of the IDE device.
1496   @param DataBuffer     A pointer to the source buffer for the data.
1497   @param StartLba       The starting logical block address to write to
1498                         on the device media.
1499   @param NumberOfBlocks The number of transfer data blocks.
1500   @param UdmaOp         The perform operations could be AtaUdmaReadOp, AtaUdmaReadExOp,
1501                         AtaUdmaWriteOp, AtaUdmaWriteExOp
1502 
1503   @retval EFI_SUCCESS          the operation is successful.
1504   @retval EFI_OUT_OF_RESOURCES Build PRD table failed
1505   @retval EFI_UNSUPPORTED      Unknown channel or operations command
1506   @retval EFI_DEVICE_ERROR     Ata command execute failed
1507 
1508 **/
1509 EFI_STATUS
DoAtaUdma(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks,IN ATA_UDMA_OPERATION UdmaOp)1510 DoAtaUdma (
1511   IN  IDE_BLK_IO_DEV      *IdeDev,
1512   IN  VOID                *DataBuffer,
1513   IN  EFI_LBA             StartLba,
1514   IN  UINTN               NumberOfBlocks,
1515   IN  ATA_UDMA_OPERATION  UdmaOp
1516   )
1517 {
1518   IDE_DMA_PRD                   *PrdAddr;
1519   IDE_DMA_PRD                   *UsedPrdAddr;
1520   IDE_DMA_PRD                   *TempPrdAddr;
1521   UINT8                         RegisterValue;
1522   UINT8                         Device;
1523   UINT64                        IoPortForBmic;
1524   UINT64                        IoPortForBmis;
1525   UINT64                        IoPortForBmid;
1526   EFI_STATUS                    Status;
1527   UINTN                         PrdTableNum;
1528   UINTN                         ByteCount;
1529   UINTN                         ByteAvailable;
1530   UINT8                         *PrdBuffer;
1531   UINTN                         RemainBlockNum;
1532   UINT8                         DeviceControl;
1533   UINT32                        Count;
1534   UINTN                         PageCount;
1535   VOID                          *Map;
1536   VOID                          *MemPage;
1537   EFI_PHYSICAL_ADDRESS          DeviceAddress;
1538   UINTN                         MaxDmaCommandSectors;
1539   EFI_PCI_IO_PROTOCOL_OPERATION PciIoProtocolOp;
1540   UINT8                         AtaCommand;
1541 
1542   switch (UdmaOp) {
1543   case AtaUdmaReadOp:
1544     MaxDmaCommandSectors = ATAPI_MAX_DMA_CMD_SECTORS;
1545     PciIoProtocolOp      = EfiPciIoOperationBusMasterWrite;
1546     AtaCommand           = ATA_CMD_READ_DMA;
1547     break;
1548   case AtaUdmaReadExtOp:
1549     MaxDmaCommandSectors = ATAPI_MAX_DMA_EXT_CMD_SECTORS;
1550     PciIoProtocolOp      = EfiPciIoOperationBusMasterWrite;
1551     AtaCommand           = ATA_CMD_READ_DMA_EXT;
1552     break;
1553   case AtaUdmaWriteOp:
1554     MaxDmaCommandSectors = ATAPI_MAX_DMA_CMD_SECTORS;
1555     PciIoProtocolOp      = EfiPciIoOperationBusMasterRead;
1556     AtaCommand           = ATA_CMD_WRITE_DMA;
1557     break;
1558   case AtaUdmaWriteExtOp:
1559     MaxDmaCommandSectors = ATAPI_MAX_DMA_EXT_CMD_SECTORS;
1560     PciIoProtocolOp      = EfiPciIoOperationBusMasterRead;
1561     AtaCommand           = ATA_CMD_WRITE_DMA_EXT;
1562     break;
1563   default:
1564     return EFI_UNSUPPORTED;
1565     break;
1566   }
1567 
1568   //
1569   // Select device
1570   //
1571   Device = (UINT8) ((IdeDev->Device << 4) | 0xe0);
1572   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Head, Device);
1573 
1574   //
1575   // Enable interrupt to support UDMA
1576   //
1577   DeviceControl = 0;
1578   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);
1579 
1580   if (IdePrimary == IdeDev->Channel) {
1581     IoPortForBmic = IdeDev->IoPort->BusMasterBaseAddr + BMICP_OFFSET;
1582     IoPortForBmis = IdeDev->IoPort->BusMasterBaseAddr + BMISP_OFFSET;
1583     IoPortForBmid = IdeDev->IoPort->BusMasterBaseAddr + BMIDP_OFFSET;
1584   } else {
1585     if (IdeSecondary == IdeDev->Channel) {
1586       IoPortForBmic = IdeDev->IoPort->BusMasterBaseAddr + BMICS_OFFSET;
1587       IoPortForBmis = IdeDev->IoPort->BusMasterBaseAddr + BMISS_OFFSET;
1588       IoPortForBmid = IdeDev->IoPort->BusMasterBaseAddr + BMIDS_OFFSET;
1589     } else {
1590       return EFI_UNSUPPORTED;
1591     }
1592   }
1593 
1594   //
1595   // Read BMIS register and clear ERROR and INTR bit
1596   //
1597   IdeDev->PciIo->Io.Read (
1598 					  IdeDev->PciIo,
1599 					  EfiPciIoWidthUint8,
1600 					  EFI_PCI_IO_PASS_THROUGH_BAR,
1601 					  IoPortForBmis,
1602 					  1,
1603 					  &RegisterValue
1604 					  );
1605 
1606   RegisterValue |= (BMIS_INTERRUPT | BMIS_ERROR);
1607 
1608   IdeDev->PciIo->Io.Write (
1609 					  IdeDev->PciIo,
1610 					  EfiPciIoWidthUint8,
1611 					  EFI_PCI_IO_PASS_THROUGH_BAR,
1612 					  IoPortForBmis,
1613 					  1,
1614 					  &RegisterValue
1615 					  );
1616 
1617   Status = EFI_SUCCESS;
1618 
1619   RemainBlockNum = NumberOfBlocks;
1620   while (RemainBlockNum > 0) {
1621 
1622     if (RemainBlockNum >= MaxDmaCommandSectors) {
1623       //
1624       //  SectorCount is used to record the number of sectors to be read
1625       //  Max 65536 sectors can be transfered at a time.
1626       //
1627       NumberOfBlocks = MaxDmaCommandSectors;
1628       RemainBlockNum -= MaxDmaCommandSectors;
1629     } else {
1630       NumberOfBlocks  = (UINT16) RemainBlockNum;
1631       RemainBlockNum  = 0;
1632     }
1633 
1634     //
1635     // Calculate the number of PRD table to make sure the memory region
1636     // not cross 64K boundary
1637     //
1638     ByteCount   = NumberOfBlocks * IdeDev->BlkIo.Media->BlockSize;
1639     PrdTableNum = ((ByteCount >> 16) + 1) + 1;
1640 
1641     //
1642     // Build PRD table
1643     //
1644     PageCount = EFI_SIZE_TO_PAGES (2 * PrdTableNum * sizeof (IDE_DMA_PRD));
1645     Status = IdeDev->PciIo->AllocateBuffer (
1646                     IdeDev->PciIo,
1647                     AllocateAnyPages,
1648                     EfiBootServicesData,
1649                     PageCount,
1650                     &MemPage,
1651                     0
1652                     );
1653     if (EFI_ERROR (Status)) {
1654       return EFI_OUT_OF_RESOURCES;
1655     }
1656     ZeroMem ((VOID *) ((UINTN) MemPage), EFI_PAGES_TO_SIZE (PageCount));
1657 
1658     PrdAddr = (IDE_DMA_PRD *) ((UINTN) MemPage);
1659     //
1660     // To make sure PRD is allocated in one 64K page
1661     //
1662     if (((UINTN) PrdAddr & 0x0FFFF) > (((UINTN) PrdAddr + PrdTableNum * sizeof (IDE_DMA_PRD) - 1) & 0x0FFFF)) {
1663       UsedPrdAddr = (IDE_DMA_PRD *) ((UINTN) ((UINT8 *) PrdAddr + 0x10000) & 0xFFFF0000);
1664     } else {
1665       if ((UINTN) PrdAddr & 0x03) {
1666         UsedPrdAddr = (IDE_DMA_PRD *) ((UINTN) ((UINT8 *) PrdAddr + 0x04) & 0xFFFFFFFC);
1667       } else {
1668         UsedPrdAddr = PrdAddr;
1669       }
1670     }
1671 
1672     //
1673     // Build the PRD table
1674     //
1675     Status = IdeDev->PciIo->Map (
1676                        IdeDev->PciIo,
1677                        PciIoProtocolOp,
1678                        DataBuffer,
1679                        &ByteCount,
1680                        &DeviceAddress,
1681                        &Map
1682                        );
1683     if (EFI_ERROR (Status)) {
1684       IdeDev->PciIo->FreeBuffer (IdeDev->PciIo, PageCount, MemPage);
1685       return EFI_OUT_OF_RESOURCES;
1686     }
1687     PrdBuffer   = (VOID *) ((UINTN) DeviceAddress);
1688     TempPrdAddr = UsedPrdAddr;
1689     while (TRUE) {
1690 
1691       ByteAvailable = 0x10000 - ((UINTN) PrdBuffer & 0xFFFF);
1692 
1693       if (ByteCount <= ByteAvailable) {
1694         TempPrdAddr->RegionBaseAddr = (UINT32) ((UINTN) PrdBuffer);
1695         TempPrdAddr->ByteCount      = (UINT16) ByteCount;
1696         TempPrdAddr->EndOfTable     = 0x8000;
1697         break;
1698       }
1699 
1700       TempPrdAddr->RegionBaseAddr = (UINT32) ((UINTN) PrdBuffer);
1701       TempPrdAddr->ByteCount      = (UINT16) ByteAvailable;
1702 
1703       ByteCount -= ByteAvailable;
1704       PrdBuffer += ByteAvailable;
1705       TempPrdAddr++;
1706     }
1707 
1708     //
1709     // Set the base address to BMID register
1710     //
1711     IdeDev->PciIo->Io.Write (
1712                         IdeDev->PciIo,
1713                         EfiPciIoWidthUint32,
1714                         EFI_PCI_IO_PASS_THROUGH_BAR,
1715                         IoPortForBmid,
1716                         1,
1717                         &UsedPrdAddr
1718                         );
1719 
1720     //
1721     // Set BMIC register to identify the operation direction
1722     //
1723     IdeDev->PciIo->Io.Read (
1724                         IdeDev->PciIo,
1725                         EfiPciIoWidthUint8,
1726                         EFI_PCI_IO_PASS_THROUGH_BAR,
1727                         IoPortForBmic,
1728                         1,
1729                         &RegisterValue
1730                         );
1731 
1732     if (UdmaOp == AtaUdmaReadExtOp || UdmaOp == AtaUdmaReadOp) {
1733       RegisterValue |= BMIC_NREAD;
1734     } else {
1735       RegisterValue &= ~((UINT8) BMIC_NREAD);
1736     }
1737 
1738     IdeDev->PciIo->Io.Write (
1739                         IdeDev->PciIo,
1740                         EfiPciIoWidthUint8,
1741                         EFI_PCI_IO_PASS_THROUGH_BAR,
1742                         IoPortForBmic,
1743                         1,
1744                         &RegisterValue
1745                         );
1746 
1747     if (UdmaOp == AtaUdmaWriteExtOp || UdmaOp == AtaUdmaReadExtOp) {
1748       Status = AtaCommandIssueExt (
1749                  IdeDev,
1750                  AtaCommand,
1751                  Device,
1752                  0,
1753                  (UINT16) NumberOfBlocks,
1754                  StartLba
1755                  );
1756     } else {
1757       Status = AtaCommandIssue (
1758                  IdeDev,
1759                  AtaCommand,
1760                  Device,
1761                  0,
1762                  (UINT16) NumberOfBlocks,
1763                  StartLba
1764                  );
1765     }
1766 
1767     if (EFI_ERROR (Status)) {
1768       IdeDev->PciIo->FreeBuffer (IdeDev->PciIo, PageCount, MemPage);
1769       IdeDev->PciIo->Unmap (IdeDev->PciIo, Map);
1770       return EFI_DEVICE_ERROR;
1771     }
1772 
1773     //
1774     // Set START bit of BMIC register
1775     //
1776     IdeDev->PciIo->Io.Read (
1777                         IdeDev->PciIo,
1778                         EfiPciIoWidthUint8,
1779                         EFI_PCI_IO_PASS_THROUGH_BAR,
1780                         IoPortForBmic,
1781                         1,
1782                         &RegisterValue
1783                         );
1784 
1785     RegisterValue |= BMIC_START;
1786 
1787     IdeDev->PciIo->Io.Write (
1788                         IdeDev->PciIo,
1789                         EfiPciIoWidthUint8,
1790                         EFI_PCI_IO_PASS_THROUGH_BAR,
1791                         IoPortForBmic,
1792                         1,
1793                         &RegisterValue
1794                         );
1795 
1796     //
1797     // Check the INTERRUPT and ERROR bit of BMIS
1798     // Max transfer number of sectors for one command is 65536(32Mbyte),
1799     // it will cost 1 second to transfer these data in UDMA mode 2(33.3MBps).
1800     // So set the variable Count to 2000, for about 2 second timeout time.
1801     //
1802     Status = EFI_SUCCESS;
1803     Count = 2000;
1804     while (TRUE) {
1805 
1806       IdeDev->PciIo->Io.Read (
1807                           IdeDev->PciIo,
1808                           EfiPciIoWidthUint8,
1809                           EFI_PCI_IO_PASS_THROUGH_BAR,
1810                           IoPortForBmis,
1811                           1,
1812                           &RegisterValue
1813                           );
1814       if (((RegisterValue & (BMIS_INTERRUPT | BMIS_ERROR)) != 0) || (Count == 0)) {
1815         if (((RegisterValue & BMIS_ERROR) != 0) || (Count == 0)) {
1816 		  Status = EFI_DEVICE_ERROR;
1817 		  break;
1818         }
1819         break;
1820       }
1821 
1822       gBS->Stall (1000);
1823       Count --;
1824     }
1825 
1826     IdeDev->PciIo->FreeBuffer (IdeDev->PciIo, PageCount, MemPage);
1827     IdeDev->PciIo->Unmap (IdeDev->PciIo, Map);
1828     //
1829     // Read BMIS register and clear ERROR and INTR bit
1830     //
1831     IdeDev->PciIo->Io.Read (
1832                         IdeDev->PciIo,
1833                         EfiPciIoWidthUint8,
1834                         EFI_PCI_IO_PASS_THROUGH_BAR,
1835                         IoPortForBmis,
1836                         1,
1837                         &RegisterValue
1838                         );
1839 
1840     RegisterValue |= (BMIS_INTERRUPT | BMIS_ERROR);
1841 
1842     IdeDev->PciIo->Io.Write (
1843                         IdeDev->PciIo,
1844                         EfiPciIoWidthUint8,
1845                         EFI_PCI_IO_PASS_THROUGH_BAR,
1846                         IoPortForBmis,
1847                         1,
1848                         &RegisterValue
1849                         );
1850 	//
1851     // Read Status Register of IDE device to clear interrupt
1852     //
1853     RegisterValue = IDEReadPortB(IdeDev->PciIo,IdeDev->IoPort->Reg.Status);
1854     //
1855     // Clear START bit of BMIC register
1856     //
1857     IdeDev->PciIo->Io.Read (
1858                         IdeDev->PciIo,
1859                         EfiPciIoWidthUint8,
1860                         EFI_PCI_IO_PASS_THROUGH_BAR,
1861                         IoPortForBmic,
1862                         1,
1863                         &RegisterValue
1864                         );
1865 
1866     RegisterValue &= ~((UINT8) BMIC_START);
1867 
1868     IdeDev->PciIo->Io.Write (
1869                         IdeDev->PciIo,
1870                         EfiPciIoWidthUint8,
1871                         EFI_PCI_IO_PASS_THROUGH_BAR,
1872                         IoPortForBmic,
1873                         1,
1874                         &RegisterValue
1875                         );
1876 
1877     if ((RegisterValue & BMIS_ERROR) != 0) {
1878       return EFI_DEVICE_ERROR;
1879     }
1880 
1881 	if (EFI_ERROR (Status)) {
1882 	  break;
1883 	}
1884     DataBuffer = (UINT8 *) DataBuffer + NumberOfBlocks * IdeDev->BlkIo.Media->BlockSize;
1885     StartLba += NumberOfBlocks;
1886   }
1887 
1888   //
1889   // Disable interrupt of Select device
1890   //
1891   IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl);
1892   DeviceControl |= ATA_CTLREG_IEN_L;
1893   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Alt.DeviceControl, DeviceControl);
1894 
1895   return Status;
1896 }
1897 
1898 
1899 /**
1900   This function is called by the AtaBlkIoReadBlocks() to perform reading from
1901   media in block unit. The function has been enhanced to support >120GB access
1902   and transfer at most 65536 blocks per command
1903 
1904   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used to record
1905                         all the information of the IDE device.
1906   @param DataBuffer     A pointer to the destination buffer for the data.
1907   @param StartLba       The starting logical block address to read from on the device media.
1908   @param NumberOfBlocks The number of transfer data blocks.
1909 
1910   @return status depends on the function DoAtaUdma() returns.
1911 **/
1912 EFI_STATUS
AtaUdmaReadExt(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)1913 AtaUdmaReadExt (
1914   IN  IDE_BLK_IO_DEV  *IdeDev,
1915   IN  VOID            *DataBuffer,
1916   IN  EFI_LBA         StartLba,
1917   IN  UINTN           NumberOfBlocks
1918   )
1919 {
1920   return DoAtaUdma (IdeDev, DataBuffer, StartLba, NumberOfBlocks, AtaUdmaReadExtOp);
1921 }
1922 /**
1923   This function is called by the AtaBlkIoReadBlocks() to perform
1924   reading from media in block unit. The function has been enhanced to
1925   support >120GB access and transfer at most 65536 blocks per command
1926 
1927   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used to record
1928                         all the information of the IDE device.
1929   @param DataBuffer     A pointer to the destination buffer for the data.
1930   @param StartLba       The starting logical block address to read from
1931                         on the device media.
1932   @param NumberOfBlocks The number of transfer data blocks.
1933 
1934   @return status depends on the function DoAtaUdma() returns.
1935 **/
1936 EFI_STATUS
AtaUdmaRead(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)1937 AtaUdmaRead (
1938   IN  IDE_BLK_IO_DEV  *IdeDev,
1939   IN  VOID            *DataBuffer,
1940   IN  EFI_LBA         StartLba,
1941   IN  UINTN           NumberOfBlocks
1942   )
1943 {
1944   return DoAtaUdma (IdeDev, DataBuffer, StartLba, NumberOfBlocks, AtaUdmaReadOp);
1945 }
1946 
1947 /**
1948   This function is called by the AtaBlkIoReadBlocks() to perform
1949   reading from media in block unit. The function has been enhanced to
1950   support >120GB access and transfer at most 65536 blocks per command
1951 
1952   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used to record
1953                         all the information of the IDE device.
1954   @param DataBuffer     A pointer to the destination buffer for the data.
1955   @param StartLba       The starting logical block address to read from on the device media.
1956   @param NumberOfBlocks The number of transfer data blocks.
1957 
1958   @return status is fully dependent on the return status of AtaPioDataInExt() function.
1959 **/
1960 EFI_STATUS
AtaReadSectorsExt(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)1961 AtaReadSectorsExt (
1962   IN  IDE_BLK_IO_DEV  *IdeDev,
1963   IN  VOID            *DataBuffer,
1964   IN  EFI_LBA         StartLba,
1965   IN  UINTN           NumberOfBlocks
1966   )
1967 {
1968   EFI_STATUS  Status;
1969   UINTN       BlocksRemaining;
1970   EFI_LBA     Lba64;
1971   UINT8       AtaCommand;
1972   UINT16      SectorCount;
1973   UINT32      ByteCount;
1974   VOID        *Buffer;
1975 
1976   //
1977   // Using ATA "Read Sectors Ext" command(opcode=0x24) with PIO DATA IN protocol
1978   //
1979   AtaCommand      = ATA_CMD_READ_SECTORS_EXT;
1980   Buffer          = DataBuffer;
1981   BlocksRemaining = NumberOfBlocks;
1982   Lba64           = StartLba;
1983   Status          = EFI_SUCCESS;
1984 
1985   while (BlocksRemaining > 0) {
1986 
1987     if (BlocksRemaining >= 0x10000) {
1988       //
1989       //  SectorCount is used to record the number of sectors to be read
1990       //  Max 65536 sectors can be transfered at a time.
1991       //
1992       SectorCount = 0xffff;
1993     } else {
1994       SectorCount = (UINT16) BlocksRemaining;
1995     }
1996 
1997     //
1998     // ByteCount is the number of bytes that will be read
1999     //
2000     ByteCount = SectorCount * (IdeDev->BlkIo.Media->BlockSize);
2001 
2002     //
2003     // call AtaPioDataInExt() to send Read Sector Command and receive data read
2004     //
2005     Status = AtaPioDataInExt (
2006               IdeDev,
2007               Buffer,
2008               ByteCount,
2009               AtaCommand,
2010               Lba64,
2011               SectorCount
2012               );
2013     if (EFI_ERROR (Status)) {
2014       return Status;
2015     }
2016 
2017     Lba64 += SectorCount;
2018     Buffer = ((UINT8 *) Buffer + ByteCount);
2019     BlocksRemaining -= SectorCount;
2020   }
2021 
2022   return Status;
2023 }
2024 /**
2025   This function is the ATA implementation for ReadBlocks in the
2026   Block I/O Protocol interface.
2027 
2028   @param IdeBlkIoDevice Indicates the calling context.
2029   @param MediaId        The media id that the read request is for.
2030   @param Lba            The starting logical block address to read from on the device.
2031   @param BufferSize     The size of the Buffer in bytes. This must be a  multiple
2032                         of the intrinsic block size of the device.
2033 
2034   @param Buffer         A pointer to the destination buffer for the data. The caller
2035                         is responsible for either having implicit or explicit ownership
2036                         of the memory that data is read into.
2037 
2038   @retval EFI_SUCCESS          Read Blocks successfully.
2039   @retval EFI_DEVICE_ERROR     Read Blocks failed.
2040   @retval EFI_NO_MEDIA         There is no media in the device.
2041   @retval EFI_MEDIA_CHANGE     The MediaId is not for the current media.
2042   @retval EFI_BAD_BUFFER_SIZE  The BufferSize parameter is not a multiple of the
2043                                intrinsic block size of the device.
2044   @retval EFI_INVALID_PARAMETER  The read request contains LBAs that are not valid,
2045                                  or the data buffer is not valid.
2046 
2047   @note If Read Block error because of device error, this function will call
2048         AtaSoftReset() function to reset device.
2049 
2050 **/
2051 EFI_STATUS
AtaBlkIoReadBlocks(IN IDE_BLK_IO_DEV * IdeBlkIoDevice,IN UINT32 MediaId,IN EFI_LBA Lba,IN UINTN BufferSize,OUT VOID * Buffer)2052 AtaBlkIoReadBlocks (
2053   IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
2054   IN UINT32           MediaId,
2055   IN EFI_LBA          Lba,
2056   IN UINTN            BufferSize,
2057   OUT VOID            *Buffer
2058   )
2059 {
2060   EFI_BLOCK_IO_MEDIA  *Media;
2061   UINTN               BlockSize;
2062   UINTN               NumberOfBlocks;
2063   EFI_STATUS          Status;
2064 
2065   if (Buffer == NULL) {
2066     return EFI_INVALID_PARAMETER;
2067   }
2068 
2069   if (BufferSize == 0) {
2070     return EFI_SUCCESS;
2071   }
2072 
2073   Status = EFI_SUCCESS;
2074 
2075   //
2076   //  Get the intrinsic block size
2077   //
2078   Media           = IdeBlkIoDevice->BlkIo.Media;
2079   BlockSize       = Media->BlockSize;
2080 
2081   NumberOfBlocks  = BufferSize / BlockSize;
2082 
2083   if (MediaId != Media->MediaId) {
2084     return EFI_MEDIA_CHANGED;
2085   }
2086 
2087   if (BufferSize % BlockSize != 0) {
2088     return EFI_BAD_BUFFER_SIZE;
2089   }
2090 
2091   if (!(Media->MediaPresent)) {
2092     return EFI_NO_MEDIA;
2093   }
2094 
2095   if (Lba > Media->LastBlock) {
2096     return EFI_INVALID_PARAMETER;
2097   }
2098 
2099   if ((Lba + NumberOfBlocks - 1) > Media->LastBlock) {
2100     return EFI_INVALID_PARAMETER;
2101   }
2102 
2103   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
2104     return EFI_INVALID_PARAMETER;
2105   }
2106 
2107   Status = EFI_SUCCESS;
2108   if (IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
2109     //
2110     // For ATA/ATAPI-6 device(capcity > 120GB), use ATA-6 read block mechanism
2111     //
2112     if (IdeBlkIoDevice->UdmaMode.Valid) {
2113       Status = AtaUdmaReadExt (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2114     } else {
2115       Status = AtaReadSectorsExt (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2116     }
2117   } else {
2118     //
2119     // For ATA-3 compatible device, use ATA-3 read block mechanism
2120     //
2121     if (IdeBlkIoDevice->UdmaMode.Valid) {
2122       Status = AtaUdmaRead (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2123     } else {
2124       Status = AtaReadSectors (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2125     }
2126   }
2127 
2128   if (EFI_ERROR (Status)) {
2129     AtaSoftReset (IdeBlkIoDevice);
2130     return EFI_DEVICE_ERROR;
2131   }
2132 
2133   return EFI_SUCCESS;
2134 
2135 }
2136 /**
2137   This function is used to send out ATA commands conforms to the
2138   PIO Data Out Protocol, supporting ATA/ATAPI-6 standard
2139 
2140   Comparing with ATA-3 data out protocol, we have two differents here:<BR>
2141   1. Do NOT wait for DRQ clear before sending command into IDE device.(the
2142   wait will frequently fail... cause writing function return error)
2143 
2144   2. Do NOT wait for DRQ clear after all data readed.(the wait greatly
2145   slow down writing performance by 100 times!)
2146 
2147   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used
2148                        to record all the information of the IDE device.
2149   @param Buffer       buffer contained data transferred from host to device.
2150   @param ByteCount    data size in byte unit of the buffer.
2151   @param AtaCommand   value of the Command Register
2152   @param StartLba     the start LBA of this transaction
2153   @param SectorCount  the count of sectors to be transfered
2154 
2155   @retval EFI_SUCCESS      send out the ATA command and device receive required
2156                            data successfully.
2157   @retval EFI_DEVICE_ERROR command sent failed.
2158 
2159 **/
2160 EFI_STATUS
AtaPioDataOutExt(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * Buffer,IN UINT32 ByteCount,IN UINT8 AtaCommand,IN EFI_LBA StartLba,IN UINT16 SectorCount)2161 AtaPioDataOutExt (
2162   IN  IDE_BLK_IO_DEV  *IdeDev,
2163   IN  VOID            *Buffer,
2164   IN  UINT32          ByteCount,
2165   IN  UINT8           AtaCommand,
2166   IN  EFI_LBA         StartLba,
2167   IN  UINT16          SectorCount
2168   )
2169 {
2170   UINT8       DevSel;
2171   UINT8       SectorCount8;
2172   UINT8       LbaLow;
2173   UINT8       LbaMid;
2174   UINT8       LbaHigh;
2175   UINTN       WordCount;
2176   UINTN       Increment;
2177   UINT16      *Buffer16;
2178   EFI_STATUS  Status;
2179 
2180   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
2181   if (EFI_ERROR (Status)) {
2182     return EFI_DEVICE_ERROR;
2183   }
2184 
2185   //
2186   // Select device. Set bit6 as 1 to indicate LBA mode is used
2187   //
2188   DevSel = (UINT8) (IdeDev->Device << 4);
2189   DevSel |= 0x40;
2190   IDEWritePortB (
2191     IdeDev->PciIo,
2192     IdeDev->IoPort->Head,
2193     DevSel
2194     );
2195 
2196   //
2197   // Wait for DRDY singnal asserting.
2198   //
2199   Status = DRDYReady (IdeDev, ATATIMEOUT);
2200   if (EFI_ERROR (Status)) {
2201     return EFI_DEVICE_ERROR;
2202   }
2203 
2204   //
2205   // Fill feature register if needed
2206   //
2207   if (AtaCommand == ATA_CMD_SET_FEATURES) {
2208     IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, 0x03);
2209   }
2210 
2211   //
2212   // Fill the sector count register, which is a two-byte FIFO. Need write twice.
2213   //
2214   SectorCount8 = (UINT8) (SectorCount >> 8);
2215   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
2216 
2217   SectorCount8 = (UINT8) SectorCount;
2218   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
2219 
2220   //
2221   // Fill the start LBA registers, which are also two-byte FIFO
2222   //
2223   LbaLow  = (UINT8) RShiftU64 (StartLba, 24);
2224   LbaMid  = (UINT8) RShiftU64 (StartLba, 32);
2225   LbaHigh = (UINT8) RShiftU64 (StartLba, 40);
2226   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
2227   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
2228   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
2229 
2230   LbaLow  = (UINT8) StartLba;
2231   LbaMid  = (UINT8) RShiftU64 (StartLba, 8);
2232   LbaHigh = (UINT8) RShiftU64 (StartLba, 16);
2233   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
2234   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
2235   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
2236 
2237   //
2238   // Send command via Command Register, invoking the processing of this command
2239   //
2240   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
2241 
2242   Buffer16 = (UINT16 *) Buffer;
2243 
2244   //
2245   // According to PIO Data Out protocol, host can perform a series of writes to
2246   // the data register after each time device set DRQ ready;
2247   //
2248   Increment = 256;
2249 
2250   //
2251   // used to record bytes of currently transfered data
2252   //
2253   WordCount = 0;
2254 
2255   while (WordCount < ByteCount / 2) {
2256     //
2257     // Poll DRQ bit set, data transfer can be performed only when DRQ is ready.
2258     //
2259     Status = DRQReady2 (IdeDev, ATATIMEOUT);
2260     if (EFI_ERROR (Status)) {
2261       return EFI_DEVICE_ERROR;
2262     }
2263 
2264     Status = CheckErrorStatus (IdeDev);
2265     if (EFI_ERROR (Status)) {
2266       return EFI_DEVICE_ERROR;
2267     }
2268 
2269     //
2270     // Write data into device by one series of writing to data register
2271     //
2272     if ((WordCount + Increment) > ByteCount / 2) {
2273       Increment = ByteCount / 2 - WordCount;
2274     }
2275 
2276     IDEWritePortWMultiple (
2277       IdeDev->PciIo,
2278       IdeDev->IoPort->Data,
2279       Increment,
2280       Buffer16
2281       );
2282 
2283     WordCount += Increment;
2284     Buffer16 += Increment;
2285 
2286   }
2287   return CheckErrorStatus (IdeDev);
2288 }
2289 /**
2290   This function is called by the AtaBlkIoWriteBlocks() to perform
2291   writing to media in block unit. The function has been enhanced to
2292   support >120GB access and transfer at most 65536 blocks per command
2293 
2294   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used
2295                         to record all the information of the IDE device.
2296   @param DataBuffer     A pointer to the source buffer for the data.
2297   @param StartLba       The starting logical block address to write to
2298                         on the device media.
2299   @param NumberOfBlocks The number of transfer data blocks.
2300 
2301   @return status depends on the function DoAtaUdma() returns.
2302 **/
2303 EFI_STATUS
AtaUdmaWriteExt(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)2304 AtaUdmaWriteExt (
2305   IN  IDE_BLK_IO_DEV  *IdeDev,
2306   IN  VOID            *DataBuffer,
2307   IN  EFI_LBA         StartLba,
2308   IN  UINTN           NumberOfBlocks
2309   )
2310 {
2311   return DoAtaUdma (IdeDev, DataBuffer, StartLba, NumberOfBlocks, AtaUdmaWriteExtOp);
2312 }
2313 
2314 /**
2315   This function is called by the AtaBlkIoWriteBlocks() to perform
2316   writing to media in block unit.
2317 
2318   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure, used
2319                         to record all the information of the IDE device.
2320   @param DataBuffer     A pointer to the source buffer for the data.
2321   @param StartLba       The starting logical block address to write to
2322                         on the device media.
2323   @param NumberOfBlocks The number of transfer data blocks.
2324 
2325   @return status depends on the function DoAtaUdma() returns.
2326 **/
2327 EFI_STATUS
AtaUdmaWrite(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)2328 AtaUdmaWrite (
2329   IN  IDE_BLK_IO_DEV  *IdeDev,
2330   IN  VOID            *DataBuffer,
2331   IN  EFI_LBA         StartLba,
2332   IN  UINTN           NumberOfBlocks
2333   )
2334 {
2335   return DoAtaUdma (IdeDev, DataBuffer, StartLba, NumberOfBlocks, AtaUdmaWriteOp);
2336 }
2337 /**
2338   This function is called by the AtaBlkIoWriteBlocks() to perform
2339   writing onto media in block unit. The function has been enhanced to
2340   support >120GB access and transfer at most 65536 blocks per command
2341 
2342   @param IdeDev         pointer pointing to IDE_BLK_IO_DEV data structure,used
2343                         to record all the information of the IDE device.
2344   @param DataBuffer     A pointer to the source buffer for the data.
2345   @param StartLba       The starting logical block address to write onto the device
2346                         media.
2347   @param NumberOfBlocks The number of transfer data blocks.
2348 
2349   @return status is fully dependent on the return status of AtaPioDataOutExt() function.
2350 **/
2351 EFI_STATUS
AtaWriteSectorsExt(IN IDE_BLK_IO_DEV * IdeDev,IN VOID * DataBuffer,IN EFI_LBA StartLba,IN UINTN NumberOfBlocks)2352 AtaWriteSectorsExt (
2353   IN  IDE_BLK_IO_DEV  *IdeDev,
2354   IN  VOID            *DataBuffer,
2355   IN  EFI_LBA         StartLba,
2356   IN  UINTN           NumberOfBlocks
2357   )
2358 {
2359   EFI_STATUS  Status;
2360   EFI_LBA     Lba64;
2361   UINTN       BlocksRemaining;
2362   UINT8       AtaCommand;
2363   UINT16      SectorCount;
2364   UINT32      ByteCount;
2365   VOID        *Buffer;
2366 
2367   //
2368   // Using ATA "Write Sectors Ext" cmd(opcode=0x24) with PIO DATA OUT protocol
2369   //
2370   AtaCommand      = ATA_CMD_WRITE_SECTORS_EXT;
2371   Lba64           = StartLba;
2372   Buffer          = DataBuffer;
2373   BlocksRemaining = NumberOfBlocks;
2374 
2375   Status          = EFI_SUCCESS;
2376 
2377   while (BlocksRemaining > 0) {
2378 
2379     if (BlocksRemaining >= 0x10000) {
2380       //
2381       //  SectorCount is used to record the number of sectors to be written.
2382       //  Max 65536 sectors can be transfered at a time.
2383       //
2384       SectorCount = 0xffff;
2385     } else {
2386       SectorCount = (UINT16) BlocksRemaining;
2387     }
2388 
2389     //
2390     // ByteCount is the number of bytes that will be written
2391     //
2392     ByteCount = SectorCount * (IdeDev->BlkIo.Media->BlockSize);
2393 
2394     //
2395     // Call AtaPioDataOutExt() to send "Write Sectors Ext" Command
2396     //
2397     Status = AtaPioDataOutExt (
2398               IdeDev,
2399               Buffer,
2400               ByteCount,
2401               AtaCommand,
2402               Lba64,
2403               SectorCount
2404               );
2405     if (EFI_ERROR (Status)) {
2406       return Status;
2407     }
2408 
2409     Lba64 += SectorCount;
2410     Buffer = ((UINT8 *) Buffer + ByteCount);
2411     BlocksRemaining -= SectorCount;
2412   }
2413 
2414   return Status;
2415 }
2416 /**
2417   This function is the ATA implementation for WriteBlocks in the
2418   Block I/O Protocol interface.
2419 
2420   @param IdeBlkIoDevice  Indicates the calling context.
2421   @param MediaId         The media id that the write request is for.
2422   @param Lba             The starting logical block address to write onto the device.
2423   @param BufferSize      The size of the Buffer in bytes. This must be a multiple
2424                          of the intrinsic block size of the device.
2425   @param Buffer          A pointer to the source buffer for the data.The caller
2426                          is responsible for either having implicit or explicit
2427                          ownership of the memory that data is written from.
2428 
2429   @retval EFI_SUCCESS       Write Blocks successfully.
2430   @retval EFI_DEVICE_ERROR  Write Blocks failed.
2431   @retval EFI_NO_MEDIA      There is no media in the device.
2432   @retval EFI_MEDIA_CHANGE  The MediaId is not for the current media.
2433 
2434   @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the
2435                                 intrinsic block size of the device.
2436   @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
2437                                 or the data buffer is not valid.
2438 
2439   @note If Write Block error because of device error, this function will call
2440         AtaSoftReset() function to reset device.
2441 **/
2442 EFI_STATUS
AtaBlkIoWriteBlocks(IN IDE_BLK_IO_DEV * IdeBlkIoDevice,IN UINT32 MediaId,IN EFI_LBA Lba,IN UINTN BufferSize,OUT VOID * Buffer)2443 AtaBlkIoWriteBlocks (
2444   IN  IDE_BLK_IO_DEV   *IdeBlkIoDevice,
2445   IN  UINT32           MediaId,
2446   IN  EFI_LBA          Lba,
2447   IN  UINTN            BufferSize,
2448   OUT VOID             *Buffer
2449   )
2450 {
2451 
2452   EFI_BLOCK_IO_MEDIA  *Media;
2453   UINTN               BlockSize;
2454   UINTN               NumberOfBlocks;
2455   EFI_STATUS          Status;
2456 
2457   if (Buffer == NULL) {
2458     return EFI_INVALID_PARAMETER;
2459   }
2460 
2461   if (BufferSize == 0) {
2462     return EFI_SUCCESS;
2463   }
2464 
2465   Status = EFI_SUCCESS;
2466 
2467   //
2468   // Get the intrinsic block size
2469   //
2470   Media           = IdeBlkIoDevice->BlkIo.Media;
2471   BlockSize       = Media->BlockSize;
2472   NumberOfBlocks  = BufferSize / BlockSize;
2473 
2474   if (MediaId != Media->MediaId) {
2475     return EFI_MEDIA_CHANGED;
2476   }
2477 
2478   if (BufferSize % BlockSize != 0) {
2479     return EFI_BAD_BUFFER_SIZE;
2480   }
2481 
2482   if (Lba > Media->LastBlock) {
2483     return EFI_INVALID_PARAMETER;
2484   }
2485 
2486   if ((Lba + NumberOfBlocks - 1) > Media->LastBlock) {
2487     return EFI_INVALID_PARAMETER;
2488   }
2489 
2490   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
2491     return EFI_INVALID_PARAMETER;
2492   }
2493 
2494   Status = EFI_SUCCESS;
2495   if (IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
2496     //
2497     // For ATA/ATAPI-6 device(capcity > 120GB), use ATA-6 write block mechanism
2498     //
2499     if (IdeBlkIoDevice->UdmaMode.Valid) {
2500       Status = AtaUdmaWriteExt (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2501     } else {
2502       Status = AtaWriteSectorsExt (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2503     }
2504   } else {
2505     //
2506     // For ATA-3 compatible device, use ATA-3 write block mechanism
2507     //
2508     if (IdeBlkIoDevice->UdmaMode.Valid) {
2509       Status = AtaUdmaWrite (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2510     } else {
2511       Status = AtaWriteSectors (IdeBlkIoDevice, Buffer, Lba, NumberOfBlocks);
2512     }
2513   }
2514 
2515   if (EFI_ERROR (Status)) {
2516     AtaSoftReset (IdeBlkIoDevice);
2517     return EFI_DEVICE_ERROR;
2518   }
2519 
2520   return EFI_SUCCESS;
2521 }
2522 /**
2523   Enable Long Physical Sector Feature for ATA device.
2524 
2525   @param   IdeDev  The IDE device data
2526 
2527   @retval  EFI_SUCCESS      The ATA device supports Long Physical Sector feature
2528                             and corresponding fields in BlockIo structure is updated.
2529   @retval  EFI_UNSUPPORTED  The device is not ATA device or Long Physical Sector
2530                             feature is not supported.
2531 **/
2532 EFI_STATUS
AtaEnableLongPhysicalSector(IN IDE_BLK_IO_DEV * IdeDev)2533 AtaEnableLongPhysicalSector (
2534   IN  IDE_BLK_IO_DEV  *IdeDev
2535   )
2536 {
2537   EFI_ATA_IDENTIFY_DATA  *AtaIdentifyData;
2538   UINT16                 PhyLogicSectorSupport;
2539 
2540   ASSERT (IdeDev->IdData != NULL);
2541   //
2542   // Only valid for ATA device
2543   //
2544   AtaIdentifyData       = (EFI_ATA_IDENTIFY_DATA *) &IdeDev->IdData->AtaData;
2545   if ((AtaIdentifyData->config & 0x8000) != 0) {
2546     return EFI_UNSUPPORTED;
2547   }
2548   PhyLogicSectorSupport = AtaIdentifyData->phy_logic_sector_support;
2549   //
2550   // Check whether Long Physical Sector Feature is supported
2551   //
2552   if ((PhyLogicSectorSupport & 0xc000) == 0x4000) {
2553     IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock = 1;
2554     IdeDev->BlkIo.Media->LowestAlignedLba              = 0;
2555     //
2556     // Check whether one physical block contains multiple physical blocks
2557     //
2558     if ((PhyLogicSectorSupport & 0x2000) != 0) {
2559       IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock =
2560         (UINT32) (1 << (PhyLogicSectorSupport & 0x000f));
2561       //
2562       // Check lowest alignment of logical blocks within physical block
2563       //
2564       if ((AtaIdentifyData->alignment_logic_in_phy_blocks & 0xc000) == 0x4000) {
2565         IdeDev->BlkIo.Media->LowestAlignedLba =
2566           (EFI_LBA) ((IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock - ((UINT32)AtaIdentifyData->alignment_logic_in_phy_blocks & 0x3fff)) %
2567           IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock);
2568       }
2569     }
2570     //
2571     // Check logical block size
2572     //
2573     IdeDev->BlkIo.Media->BlockSize = 0x200;
2574     if ((PhyLogicSectorSupport & 0x1000) != 0) {
2575       IdeDev->BlkIo.Media->BlockSize = (UINT32) (
2576         ((AtaIdentifyData->logic_sector_size_hi << 16) |
2577          AtaIdentifyData->logic_sector_size_lo) * sizeof (UINT16)
2578         );
2579     }
2580     return EFI_SUCCESS;
2581   } else {
2582     return EFI_UNSUPPORTED;
2583   }
2584 }
2585 /**
2586   Send ATA command into device with NON_DATA protocol
2587 
2588   @param  IdeDev Standard IDE device private data structure
2589   @param  AtaCommand The ATA command to be sent
2590   @param  Device The value in Device register
2591   @param  Feature The value in Feature register
2592   @param  SectorCount The value in SectorCount register
2593   @param  LbaLow The value in LBA_LOW register
2594   @param  LbaMiddle The value in LBA_MIDDLE register
2595   @param  LbaHigh The value in LBA_HIGH register
2596 
2597   @retval  EFI_SUCCESS Reading succeed
2598   @retval  EFI_ABORTED Command failed
2599   @retval  EFI_DEVICE_ERROR Device status error.
2600 
2601 **/
2602 EFI_STATUS
AtaNonDataCommandIn(IN IDE_BLK_IO_DEV * IdeDev,IN UINT8 AtaCommand,IN UINT8 Device,IN UINT8 Feature,IN UINT8 SectorCount,IN UINT8 LbaLow,IN UINT8 LbaMiddle,IN UINT8 LbaHigh)2603 AtaNonDataCommandIn (
2604   IN  IDE_BLK_IO_DEV  *IdeDev,
2605   IN  UINT8           AtaCommand,
2606   IN  UINT8           Device,
2607   IN  UINT8           Feature,
2608   IN  UINT8           SectorCount,
2609   IN  UINT8           LbaLow,
2610   IN  UINT8           LbaMiddle,
2611   IN  UINT8           LbaHigh
2612   )
2613 {
2614   EFI_STATUS  Status;
2615   UINT8       StatusRegister;
2616 
2617   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
2618   if (EFI_ERROR (Status)) {
2619     return EFI_DEVICE_ERROR;
2620   }
2621 
2622   //
2623   // Select device (bit4), set Lba mode(bit6) (use 0xe0 for compatibility)
2624   //
2625   IDEWritePortB (
2626     IdeDev->PciIo,
2627     IdeDev->IoPort->Head,
2628     (UINT8) ((IdeDev->Device << 4) | 0xe0)
2629     );
2630 
2631   //
2632   // ATA commands for ATA device must be issued when DRDY is set
2633   //
2634   Status = DRDYReady (IdeDev, ATATIMEOUT);
2635   if (EFI_ERROR (Status)) {
2636     return EFI_DEVICE_ERROR;
2637   }
2638 
2639   //
2640   // Pass parameter into device register block
2641   //
2642   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Head, Device);
2643   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature);
2644   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount);
2645   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
2646   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMiddle);
2647   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
2648 
2649   //
2650   // Send command via Command Register
2651   //
2652   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
2653 
2654   //
2655   // Wait for command completion
2656   // For ATAPI_SMART_CMD, we may need more timeout to let device
2657   // adjust internal states.
2658   //
2659   if (AtaCommand == ATA_CMD_SMART) {
2660     Status = WaitForBSYClear (IdeDev, ATASMARTTIMEOUT);
2661   } else {
2662     Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
2663   }
2664   if (EFI_ERROR (Status)) {
2665     return EFI_DEVICE_ERROR;
2666   }
2667 
2668   StatusRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);
2669   if ((StatusRegister & ATA_STSREG_ERR) == ATA_STSREG_ERR) {
2670     //
2671     // Failed to execute command, abort operation
2672     //
2673     return EFI_ABORTED;
2674   }
2675 
2676   return EFI_SUCCESS;
2677 }
2678 
2679 /**
2680   Send ATA Ext command into device with NON_DATA protocol
2681 
2682   @param  IdeDev Standard IDE device private data structure
2683   @param  AtaCommand The ATA command to be sent
2684   @param  Device The value in Device register
2685   @param  Feature The value in Feature register
2686   @param  SectorCount The value in SectorCount register
2687   @param  LbaAddress The LBA address in 48-bit mode
2688 
2689   @retval  EFI_SUCCESS Reading succeed
2690   @retval  EFI_ABORTED Command failed
2691   @retval  EFI_DEVICE_ERROR Device status error.
2692 
2693 **/
2694 EFI_STATUS
AtaNonDataCommandInExt(IN IDE_BLK_IO_DEV * IdeDev,IN UINT8 AtaCommand,IN UINT8 Device,IN UINT16 Feature,IN UINT16 SectorCount,IN EFI_LBA LbaAddress)2695 AtaNonDataCommandInExt (
2696   IN  IDE_BLK_IO_DEV  *IdeDev,
2697   IN  UINT8           AtaCommand,
2698   IN  UINT8           Device,
2699   IN  UINT16          Feature,
2700   IN  UINT16          SectorCount,
2701   IN  EFI_LBA         LbaAddress
2702   )
2703 {
2704   EFI_STATUS  Status;
2705   UINT8       StatusRegister;
2706   UINT8       SectorCount8;
2707   UINT8       Feature8;
2708   UINT8       LbaLow;
2709   UINT8       LbaMid;
2710   UINT8       LbaHigh;
2711 
2712   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
2713   if (EFI_ERROR (Status)) {
2714     return EFI_DEVICE_ERROR;
2715   }
2716 
2717   //
2718   // Select device (bit4), set LBA mode(bit6) (use 0xe0 for compatibility)
2719   //
2720   IDEWritePortB (
2721     IdeDev->PciIo,
2722     IdeDev->IoPort->Head,
2723     (UINT8) ((IdeDev->Device << 4) | 0xe0)
2724     );
2725 
2726   //
2727   // ATA commands for ATA device must be issued when DRDY is set
2728   //
2729   Status = DRDYReady (IdeDev, ATATIMEOUT);
2730   if (EFI_ERROR (Status)) {
2731     return EFI_DEVICE_ERROR;
2732   }
2733 
2734   //
2735   // Pass parameter into device register block
2736   //
2737   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Head, Device);
2738 
2739   //
2740   // Fill the feature register, which is a two-byte FIFO. Need write twice.
2741   //
2742   Feature8 = (UINT8) (Feature >> 8);
2743   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature8);
2744 
2745   Feature8 = (UINT8) Feature;
2746   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Feature, Feature8);
2747 
2748   //
2749   // Fill the sector count register, which is a two-byte FIFO. Need write twice.
2750   //
2751   SectorCount8 = (UINT8) (SectorCount >> 8);
2752   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
2753 
2754   SectorCount8 = (UINT8) SectorCount;
2755   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorCount, SectorCount8);
2756 
2757   //
2758   // Fill the start LBA registers, which are also two-byte FIFO
2759   //
2760   LbaLow  = (UINT8) RShiftU64 (LbaAddress, 24);
2761   LbaMid  = (UINT8) RShiftU64 (LbaAddress, 32);
2762   LbaHigh = (UINT8) RShiftU64 (LbaAddress, 40);
2763   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
2764   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
2765   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
2766 
2767   LbaLow  = (UINT8) LbaAddress;
2768   LbaMid  = (UINT8) RShiftU64 (LbaAddress, 8);
2769   LbaHigh = (UINT8) RShiftU64 (LbaAddress, 16);
2770   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->SectorNumber, LbaLow);
2771   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderLsb, LbaMid);
2772   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->CylinderMsb, LbaHigh);
2773 
2774   //
2775   // Send command via Command Register
2776   //
2777   IDEWritePortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Command, AtaCommand);
2778 
2779   //
2780   // Wait for command completion
2781   //
2782   Status = WaitForBSYClear (IdeDev, ATATIMEOUT);
2783   if (EFI_ERROR (Status)) {
2784     return EFI_DEVICE_ERROR;
2785   }
2786 
2787   StatusRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);
2788   if ((StatusRegister & ATA_STSREG_ERR) == ATA_STSREG_ERR) {
2789     //
2790     // Failed to execute command, abort operation
2791     //
2792     return EFI_ABORTED;
2793   }
2794 
2795   return EFI_SUCCESS;
2796 }
2797 
2798 
2799 
2800