39 if (!EFI_ERROR (Status)) {
44 &gPeiAtaControllerPpiGuid,
47 (
VOID **)&AtaControllerPpi
52 if (AtapiBlkIoDev ==
NULL) {
53 return EFI_OUT_OF_RESOURCES;
56 AtapiBlkIoDev->Signature = ATAPI_BLK_IO_DEV_SIGNATURE;
57 AtapiBlkIoDev->AtaControllerPpi = AtaControllerPpi;
67 AtapiBlkIoDev->AtapiBlkIo2.
Revision = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;
72 AtapiBlkIoDev->PpiDescriptor.
Flags = EFI_PEI_PPI_DESCRIPTOR_PPI;
73 AtapiBlkIoDev->PpiDescriptor.
Guid = &gEfiPeiVirtualBlockIoPpiGuid;
74 AtapiBlkIoDev->PpiDescriptor.
Ppi = &AtapiBlkIoDev->AtapiBlkIo;
76 AtapiBlkIoDev->PpiDescriptor2.
Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
77 AtapiBlkIoDev->PpiDescriptor2.
Guid = &gEfiPeiVirtualBlockIo2PpiGuid;
78 AtapiBlkIoDev->PpiDescriptor2.
Ppi = &AtapiBlkIoDev->AtapiBlkIo2;
80 DEBUG ((DEBUG_INFO,
"Atatpi Device Count is %d\n", AtapiBlkIoDev->DeviceCount));
81 if (AtapiBlkIoDev->DeviceCount != 0) {
83 if (EFI_ERROR (Status)) {
84 return EFI_OUT_OF_RESOURCES;
120 AtapiBlkIoDev =
NULL;
122 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO_THIS (This);
124 *NumberBlockDevices = AtapiBlkIoDev->DeviceCount;
171 AtapiBlkIoDev =
NULL;
173 if ((This ==
NULL) || (MediaInfo ==
NULL)) {
174 return EFI_INVALID_PARAMETER;
177 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO_THIS (This);
179 DeviceCount = AtapiBlkIoDev->DeviceCount;
184 if ((DeviceIndex < 1) || (DeviceIndex > DeviceCount) || (DeviceIndex > MAX_IDE_DEVICES)) {
185 return EFI_INVALID_PARAMETER;
188 Index = DeviceIndex - 1;
193 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo DevicePosition is %d\n", AtapiBlkIoDev->DeviceInfo[Index].DevicePosition));
194 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo DeviceType is %d\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
DeviceType));
195 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo MediaPresent is %d\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
MediaPresent));
196 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo BlockSize is 0x%x\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
BlockSize));
197 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo LastBlock is 0x%x\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
LastBlock));
201 AtapiBlkIoDev->DeviceInfo[Index].DevicePosition,
202 &AtapiBlkIoDev->DeviceInfo[Index].MediaInfo,
203 &AtapiBlkIoDev->DeviceInfo[Index].MediaInfo2
206 return EFI_DEVICE_ERROR;
209 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo DevicePosition is %d\n", AtapiBlkIoDev->DeviceInfo[Index].DevicePosition));
210 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo DeviceType is %d\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
DeviceType));
211 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo MediaPresent is %d\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
MediaPresent));
212 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo BlockSize is 0x%x\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
BlockSize));
213 DEBUG ((DEBUG_INFO,
"Atatpi GetInfo LastBlock is 0x%x\n", AtapiBlkIoDev->DeviceInfo[Index].MediaInfo.
LastBlock));
270 UINTN NumberOfBlocks;
274 AtapiBlkIoDev =
NULL;
277 return EFI_INVALID_PARAMETER;
280 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO_THIS (This);
282 if (Buffer ==
NULL) {
283 return EFI_INVALID_PARAMETER;
286 if (BufferSize == 0) {
297 return EFI_DEVICE_ERROR;
306 if (BufferSize % BlockSize != 0) {
307 return EFI_BAD_BUFFER_SIZE;
310 NumberOfBlocks = BufferSize / BlockSize;
312 if ((StartLBA + NumberOfBlocks - 1) > AtapiBlkIoDev->DeviceInfo[DeviceIndex - 1].MediaInfo2.
LastBlock) {
313 return EFI_INVALID_PARAMETER;
318 AtapiBlkIoDev->DeviceInfo[DeviceIndex - 1].DevicePosition,
324 if (EFI_ERROR (Status)) {
325 return EFI_DEVICE_ERROR;
361 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO2_THIS (This);
365 &AtapiBlkIoDev->AtapiBlkIo,
413 AtapiBlkIoDev =
NULL;
415 if ((This ==
NULL) || (MediaInfo ==
NULL)) {
416 return EFI_INVALID_PARAMETER;
419 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO2_THIS (This);
423 &AtapiBlkIoDev->AtapiBlkIo,
427 if (EFI_ERROR (Status)) {
487 AtapiBlkIoDev =
NULL;
490 return EFI_INVALID_PARAMETER;
493 AtapiBlkIoDev = PEI_RECOVERY_ATAPI_FROM_BLKIO2_THIS (This);
497 &AtapiBlkIoDev->AtapiBlkIo,
522 UINTN DevicePosition;
527 UINT16 CommandBlockBaseAddr;
528 UINT16 ControlBlockBaseAddr;
529 UINT32 IdeEnabledNumber;
542 AtapiBlkIoDev->AtaControllerPpi->EnableAtaChannel (
544 AtapiBlkIoDev->AtaControllerPpi,
552 DEBUG ((DEBUG_INFO,
"Delay for %d seconds for SATA devices to spin-up\n",
PcdGet16 (PcdSataSpinUpDelayInSecForRecoveryPath)));
558 IdeEnabledNumber = AtapiBlkIoDev->AtaControllerPpi->GetIdeRegsBaseAddr (
560 AtapiBlkIoDev->AtaControllerPpi,
567 for (Index1 = 0; Index1 < IdeEnabledNumber; Index1++) {
569 AtapiBlkIoDev->IdeIoPortReg[Index1].Data = CommandBlockBaseAddr;
570 AtapiBlkIoDev->IdeIoPortReg[Index1].Reg1.Feature = (UINT16)(CommandBlockBaseAddr + 0x1);
571 AtapiBlkIoDev->IdeIoPortReg[Index1].SectorCount = (UINT16)(CommandBlockBaseAddr + 0x2);
572 AtapiBlkIoDev->IdeIoPortReg[Index1].SectorNumber = (UINT16)(CommandBlockBaseAddr + 0x3);
573 AtapiBlkIoDev->IdeIoPortReg[Index1].CylinderLsb = (UINT16)(CommandBlockBaseAddr + 0x4);
574 AtapiBlkIoDev->IdeIoPortReg[Index1].CylinderMsb = (UINT16)(CommandBlockBaseAddr + 0x5);
575 AtapiBlkIoDev->IdeIoPortReg[Index1].Head = (UINT16)(CommandBlockBaseAddr + 0x6);
576 AtapiBlkIoDev->IdeIoPortReg[Index1].Reg.Command = (UINT16)(CommandBlockBaseAddr + 0x7);
579 AtapiBlkIoDev->IdeIoPortReg[Index1].Alt.DeviceControl = ControlBlockBaseAddr;
580 AtapiBlkIoDev->IdeIoPortReg[Index1].DriveAddress = (UINT16)(ControlBlockBaseAddr + 0x1);
585 for (Index2 = IdeMaster; Index2 < IdeMaxDevice; Index2++) {
589 DevicePosition = Index1 * 2 + Index2;
595 AtapiBlkIoDev->DeviceInfo[DeviceCount].DevicePosition = DevicePosition;
599 Status =
DetectMedia (AtapiBlkIoDev, DevicePosition, &MediaInfo, &MediaInfo2);
600 CopyMem (&(AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo), &MediaInfo, sizeof (MediaInfo));
601 CopyMem (&(AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo2), &MediaInfo2, sizeof (MediaInfo2));
603 DEBUG ((DEBUG_INFO,
"Atatpi Device Position is %d\n", DevicePosition));
604 DEBUG ((DEBUG_INFO,
"Atatpi DeviceType is %d\n", MediaInfo.
DeviceType));
606 DEBUG ((DEBUG_INFO,
"Atatpi BlockSize is 0x%x\n", MediaInfo.
BlockSize));
608 if (EFI_ERROR (Status)) {
609 AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo.MediaPresent =
FALSE;
610 AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo.LastBlock = 0;
611 AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo2.MediaPresent =
FALSE;
612 AtapiBlkIoDev->DeviceInfo[DeviceCount].MediaInfo2.LastBlock = 0;
620 AtapiBlkIoDev->DeviceCount = DeviceCount;
653 Status =
Inquiry (AtapiBlkIoDev, DevicePosition, MediaInfo, MediaInfo2);
654 if (!EFI_ERROR (Status)) {
684 UINT16 StatusRegister;
686 UINT16 CommandRegister;
687 UINT16 ErrorRegister;
688 UINT16 SectorCountRegister;
692 UINT8 SectorCountValue;
694 Channel = (UINT8)(DevicePosition / 2);
695 Device = (UINT8)(DevicePosition % 2);
697 ASSERT (Channel < MAX_IDE_CHANNELS);
699 StatusRegister = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Status;
700 HeadRegister = AtapiBlkIoDev->IdeIoPortReg[Channel].Head;
701 CommandRegister = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Command;
702 ErrorRegister = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg1.Error;
703 SectorCountRegister = AtapiBlkIoDev->IdeIoPortReg[Channel].SectorCount;
708 IoWrite8 (HeadRegister, (UINT8)((Device << 4) | 0xe0));
713 SectorCountValue = 0x55;
714 IoWrite8 (SectorCountRegister, SectorCountValue);
719 IoWrite8 (HeadRegister, (UINT8)((Device << 4) | 0xe0));
721 Status =
DRDYReady (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), 100);
726 IoWrite8 (HeadRegister, (UINT8)((Device << 4) | 0xe0));
730 IoWrite8 (CommandRegister, AtaCommand);
732 Status =
WaitForBSYClear (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), 3000);
733 if (EFI_ERROR (Status)) {
737 StatusValue =
IoRead8 (StatusRegister);
747 SectorCountValue =
IoRead8 (SectorCountRegister);
754 ErrorValue =
IoRead8 (ErrorRegister);
761 return EFI_NOT_FOUND;
765 if ((SectorCountValue == 0x00) || (SectorCountValue == 0x80) || (SectorCountValue == 0xff)) {
770 IoWrite8 (HeadRegister, (UINT8)((Device << 4) | 0xe0));
777 SectorCountValue = 0x55;
778 IoWrite8 (SectorCountRegister, SectorCountValue);
781 SectorCountValue =
IoRead8 (SectorCountRegister);
782 if (SectorCountValue != 0x55) {
783 return EFI_NOT_FOUND;
793 return EFI_NOT_FOUND;
816 Channel = (UINT8)(DevicePosition / 2);
818 ASSERT (Channel < MAX_IDE_CHANNELS);
822 Status =
WaitForBSYClear (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), 31000);
823 if (EFI_ERROR (Status)) {
831 Status =
CheckPowerMode (AtapiBlkIoDev, DevicePosition, AtaCommand);
832 if ((Status == EFI_ABORTED) || (Status ==
EFI_SUCCESS)) {
858 UINT16 StatusRegister;
863 StatusRegister = IdeIoRegisters->Reg.Status;
865 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
867 StatusValue =
IoRead8 (StatusRegister);
875 }
while (Delay != 0);
903 UINT16 StatusRegister;
909 StatusRegister = IdeIoRegisters->Reg.Status;
911 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
913 StatusValue =
IoRead8 (StatusRegister);
922 ErrValue =
IoRead8 (IdeIoRegisters->Reg1.Error);
931 }
while (Delay != 0);
959 UINT16 StatusRegister;
965 StatusRegister = IdeIoRegisters->Reg.Status;
967 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
969 StatusValue =
IoRead8 (StatusRegister);
979 ErrValue =
IoRead8 (IdeIoRegisters->Reg1.Error);
988 }
while (Delay != 0);
1012 IN UINTN TimeoutInMilliSeconds
1016 UINT16 AltStatusRegister;
1017 UINT8 AltStatusValue;
1022 AltStatusRegister = IdeIoRegisters->Alt.AltStatus;
1024 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
1026 AltStatusValue =
IoRead8 (AltStatusRegister);
1036 ErrValue =
IoRead8 (IdeIoRegisters->Reg1.Error);
1045 }
while (Delay != 0);
1070 IN UINTN TimeoutInMilliSeconds
1074 UINT16 StatusRegister;
1081 StatusRegister = IdeIoRegisters->Reg.Status;
1083 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
1088 StatusValue =
IoRead8 (StatusRegister);
1098 ErrValue =
IoRead8 (IdeIoRegisters->Reg1.Error);
1107 }
while (Delay != 0);
1132 IN UINTN TimeoutInMilliSeconds
1136 UINT16 AltStatusRegister;
1137 UINT8 AltStatusValue;
1142 AltStatusRegister = IdeIoRegisters->Alt.AltStatus;
1144 Delay = ((TimeoutInMilliSeconds * STALL_1_MILLI_SECOND) / 250) + 1;
1146 AltStatusValue =
IoRead8 (AltStatusRegister);
1156 ErrValue =
IoRead8 (IdeIoRegisters->Reg1.Error);
1165 }
while (Delay != 0);
1192 StatusValue =
IoRead8 (StatusReg);
1198 return EFI_DEVICE_ERROR;
1224 UINT16 SectorCountReg;
1225 UINT16 SectorNumberReg;
1226 UINT16 CylinderLsbReg;
1227 UINT16 CylinderMsbReg;
1237 ByteCount =
sizeof (AtapiIdentifyData);
1238 Buffer16 = (UINT16 *)&AtapiIdentifyData;
1240 Channel = (UINT8)(DevicePosition / 2);
1241 Device = (UINT8)(DevicePosition % 2);
1243 ASSERT (Channel < MAX_IDE_CHANNELS);
1245 StatusReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Status;
1246 HeadReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Head;
1247 CommandReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Command;
1248 DataReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Data;
1249 SectorCountReg = AtapiBlkIoDev->IdeIoPortReg[Channel].SectorCount;
1250 SectorNumberReg = AtapiBlkIoDev->IdeIoPortReg[Channel].SectorNumber;
1251 CylinderLsbReg = AtapiBlkIoDev->IdeIoPortReg[Channel].CylinderLsb;
1252 CylinderMsbReg = AtapiBlkIoDev->IdeIoPortReg[Channel].CylinderMsb;
1259 &(AtapiBlkIoDev->IdeIoPortReg[Channel]),
1263 return EFI_DEVICE_ERROR;
1270 if (
DRQClear2 (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), ATATIMEOUT) !=
EFI_SUCCESS) {
1271 return EFI_DEVICE_ERROR;
1278 IoWrite8 (HeadReg, (UINT8)((Device << 4) | 0xe0));
1286 &(AtapiBlkIoDev->IdeIoPortReg[Channel]),
1290 return EFI_DEVICE_ERROR;
1323 while (WordCount < ByteCount / 2) {
1327 Status =
DRQReady2 (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), ATATIMEOUT);
1333 return EFI_DEVICE_ERROR;
1339 if ((WordCount + Increment) > ByteCount / 2) {
1340 Increment = ByteCount / 2 - WordCount;
1346 for (Index = 0; Index < Increment; Index++) {
1350 WordCount += Increment;
1358 &(AtapiBlkIoDev->IdeIoPortReg[Channel]),
1421 IN UINT32 ByteCount,
1422 IN UINTN TimeoutInMilliSeconds
1431 UINT16 CylinderLsbReg;
1432 UINT16 CylinderMsbReg;
1433 UINT16 DeviceControlReg;
1437 UINT16 *CommandIndex;
1446 UINT32 RequiredWordCount;
1451 UINT32 ActualWordCount;
1453 Channel = (UINT8)(DevicePosition / 2);
1454 Device = (UINT8)(DevicePosition % 2);
1456 ASSERT (Channel < MAX_IDE_CHANNELS);
1458 StatusReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Status;
1459 HeadReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Head;
1460 CommandReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Command;
1461 FeatureReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg1.Feature;
1462 CylinderLsbReg = AtapiBlkIoDev->IdeIoPortReg[Channel].CylinderLsb;
1463 CylinderMsbReg = AtapiBlkIoDev->IdeIoPortReg[Channel].CylinderMsb;
1464 DeviceControlReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Alt.DeviceControl;
1465 DataReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Data;
1473 &(AtapiBlkIoDev->IdeIoPortReg[Channel]),
1477 return EFI_DEVICE_ERROR;
1495 IoWrite8 (CylinderLsbReg, (UINT8)(ATAPI_MAX_BYTE_COUNT & 0x00ff));
1496 IoWrite8 (CylinderMsbReg, (UINT8)(ATAPI_MAX_BYTE_COUNT >> 8));
1510 Status =
DRQReady (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), TimeoutInMilliSeconds);
1518 CommandIndex = Packet->Data16;
1519 for (Count = 0; Count < 6; Count++, CommandIndex++) {
1524 StatusValue =
IoRead8 (StatusReg);
1531 return EFI_DEVICE_ERROR;
1534 if ((Buffer ==
NULL) || (ByteCount == 0)) {
1543 RequiredWordCount = ByteCount / 2;
1547 ActualWordCount = 0;
1550 while ((Status ==
EFI_SUCCESS) && (ActualWordCount < RequiredWordCount)) {
1557 &(AtapiBlkIoDev->IdeIoPortReg[Channel]),
1558 TimeoutInMilliSeconds
1567 StatusValue =
IoRead8 (StatusReg);
1572 WordCount =
IoRead8 (CylinderMsbReg) << 8;
1573 WordCount = WordCount |
IoRead8 (CylinderLsbReg);
1574 WordCount = WordCount & 0xffff;
1580 for (Index = 0; (Index < WordCount) && (ActualWordCount < RequiredWordCount); Index++, ActualWordCount++) {
1587 RequiredWordCount =
MIN (
1597 Status =
DRQClear2 (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), TimeoutInMilliSeconds);
1599 return EFI_DEVICE_ERROR;
1659 return EFI_DEVICE_ERROR;
1665 switch (Idata.peripheral_type & 0x1f) {
1671 MediaInfo->MediaPresent =
FALSE;
1672 MediaInfo->LastBlock = 0;
1673 MediaInfo->BlockSize = 0x200;
1675 MediaInfo2->RemovableMedia =
TRUE;
1676 MediaInfo2->MediaPresent =
FALSE;
1677 MediaInfo2->ReadOnly =
FALSE;
1678 MediaInfo2->BlockSize = 0x200;
1679 MediaInfo2->LastBlock = 0;
1687 MediaInfo->MediaPresent =
FALSE;
1688 MediaInfo->LastBlock = 0;
1689 MediaInfo->BlockSize = 0x800;
1691 MediaInfo2->RemovableMedia =
TRUE;
1692 MediaInfo2->MediaPresent =
FALSE;
1693 MediaInfo2->ReadOnly =
TRUE;
1694 MediaInfo2->BlockSize = 0x200;
1695 MediaInfo2->LastBlock = 0;
1699 return EFI_UNSUPPORTED;
1732 BOOLEAN NeedReadCapacity;
1738 if (SenseBuffers ==
NULL) {
1739 return EFI_OUT_OF_RESOURCES;
1746 for (Index = 0; Index < 2; Index++) {
1759 SenseCounts = MAX_SENSE_KEY_COUNT;
1761 NeedReadCapacity =
TRUE;
1763 for (Index = 0; Index < 5; Index++) {
1764 SenseCounts = MAX_SENSE_KEY_COUNT;
1771 DEBUG ((DEBUG_INFO,
"Atapi Request Sense Count is %d\n", SenseCounts));
1783 if (
IsNoMedia (SenseBuffers, SenseCounts)) {
1784 NeedReadCapacity =
FALSE;
1785 MediaInfo->MediaPresent =
FALSE;
1786 MediaInfo->LastBlock = 0;
1787 MediaInfo2->MediaPresent =
FALSE;
1788 MediaInfo2->LastBlock = 0;
1792 return EFI_DEVICE_ERROR;
1796 if (NeedReadCapacity) {
1805 for (Index = 0; (Index < RetryNum) && (Index < MaxRetryNum); Index++) {
1806 Status =
ReadCapacity (AtapiBlkIoDev, DevicePosition, MediaInfo, MediaInfo2);
1808 SenseCounts = MAX_SENSE_KEY_COUNT;
1811 Status =
RequestSense (AtapiBlkIoDev, DevicePosition, SenseBuffers, &SenseCounts);
1835 if (
IsNoMedia (SenseBuffers, SenseCounts)) {
1836 MediaInfo->MediaPresent =
FALSE;
1837 MediaInfo->LastBlock = 0;
1838 MediaInfo2->MediaPresent =
FALSE;
1839 MediaInfo2->LastBlock = 0;
1844 return EFI_DEVICE_ERROR;
1847 if (!
IsDriveReady (SenseBuffers, SenseCounts, &NeedRetry)) {
1856 return EFI_DEVICE_ERROR;
1886 IN BOOLEAN Extensive
1892 UINT16 DeviceControlReg;
1898 Channel = (UINT8)(DevicePosition / 2);
1899 Device = (UINT8)(DevicePosition % 2);
1901 ASSERT (Channel < MAX_IDE_CHANNELS);
1903 DeviceControlReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Alt.DeviceControl;
1904 CommandReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Reg.Command;
1905 HeadReg = AtapiBlkIoDev->IdeIoPortReg[Channel].Head;
1917 IoWrite8 (DeviceControlReg, DevControl);
1931 IoWrite8 (DeviceControlReg, DevControl);
1936 if (
WaitForBSYClear (AtapiBlkIoDev, &(AtapiBlkIoDev->IdeIoPortReg[Channel]), 31000) == EFI_TIMEOUT) {
1937 return EFI_DEVICE_ERROR;
1944 DeviceSelect = (UINT8)(((BIT7 | BIT5) | (Device << 4)));
1955 return EFI_DEVICE_ERROR;
1984 IN OUT UINT8 *SenseCounts
2001 Ptr = (UINT16 *)SenseBuffers;
2009 for (SenseReq =
TRUE; SenseReq;) {
2027 if (*SenseCounts == 0) {
2028 return EFI_DEVICE_ERROR;
2036 if (*SenseCounts > MAX_SENSE_KEY_COUNT) {
2046 if ((Sense->sense_key != ATA_SK_NO_SENSE) && ((*SenseCounts) < 20)) {
2093 ZeroMem (&Data,
sizeof (Data));
2094 ZeroMem (&FormatData,
sizeof (FormatData));
2096 if (MediaInfo->DeviceType ==
IdeCDROM) {
2113 Packet.ReadFormatCapacity.allocation_length_lo = 12;
2118 (UINT16 *)(&FormatData),
2125 if (MediaInfo->DeviceType ==
IdeCDROM) {
2126 MediaInfo->LastBlock = ((UINT32)Data.LastLba3 << 24) | (Data.LastLba2 << 16) | (Data.LastLba1 << 8) | Data.LastLba0;
2127 MediaInfo->MediaPresent =
TRUE;
2132 MediaInfo->BlockSize = 0x800;
2134 MediaInfo2->LastBlock = MediaInfo->LastBlock;
2135 MediaInfo2->MediaPresent = MediaInfo->MediaPresent;
2136 MediaInfo2->BlockSize = (UINT32)MediaInfo->BlockSize;
2139 if (MediaInfo->DeviceType ==
IdeLS120) {
2140 if (FormatData.DesCode == 3) {
2141 MediaInfo->MediaPresent =
FALSE;
2142 MediaInfo->LastBlock = 0;
2143 MediaInfo2->MediaPresent =
FALSE;
2144 MediaInfo2->LastBlock = 0;
2146 MediaInfo->LastBlock = ((UINT32)FormatData.LastLba3 << 24) |
2147 (FormatData.LastLba2 << 16) |
2148 (FormatData.LastLba1 << 8) |
2149 FormatData.LastLba0;
2150 MediaInfo->LastBlock--;
2152 MediaInfo->MediaPresent =
TRUE;
2154 MediaInfo->BlockSize = 0x200;
2156 MediaInfo2->LastBlock = MediaInfo->LastBlock;
2157 MediaInfo2->MediaPresent = MediaInfo->MediaPresent;
2158 MediaInfo2->BlockSize = (UINT32)MediaInfo->BlockSize;
2164 return EFI_DEVICE_ERROR;
2195 UINTN BlocksRemaining;
2206 Read10Packet = &Packet.Read10;
2207 Lba32 = (UINT32)StartLba;
2213 MaxBlock = (UINT16)(0x10000 / BlockSize);
2217 BlocksRemaining = NumberOfBlocks;
2220 while (BlocksRemaining > 0) {
2221 if (BlocksRemaining <= MaxBlock) {
2222 SectorCount = (UINT16)BlocksRemaining;
2224 SectorCount = MaxBlock;
2236 Read10Packet->Lba3 = (UINT8)(Lba32 & 0xff);
2237 Read10Packet->Lba2 = (UINT8)(Lba32 >> 8);
2238 Read10Packet->Lba1 = (UINT8)(Lba32 >> 16);
2239 Read10Packet->Lba0 = (UINT8)(Lba32 >> 24);
2245 Read10Packet->TranLen1 = (UINT8)(SectorCount & 0xff);
2246 Read10Packet->TranLen0 = (UINT8)(SectorCount >> 8);
2248 ByteCount = (UINT32)(SectorCount * BlockSize);
2254 (UINT16 *)PtrBuffer,
2262 Lba32 += SectorCount;
2263 PtrBuffer = (UINT8 *)PtrBuffer + SectorCount * BlockSize;
2264 BlocksRemaining -= SectorCount;
2292 SensePtr = SenseData;
2294 for (Index = 0; Index < SenseCounts; Index++) {
2295 if ((SensePtr->sense_key == ATA_SK_NOT_READY) && (SensePtr->
addnl_sense_code == ATA_ASC_NO_MEDIA)) {
2327 SensePtr = SenseData;
2329 for (Index = 0; Index < SenseCounts; Index++) {
2330 if (SensePtr->sense_key == 0x06) {
2367 SensePtr = SenseData;
2369 for (Index = 0; Index < SenseCounts; Index++) {
2370 switch (SensePtr->sense_key) {
2371 case ATA_SK_MEDIUM_ERROR:
2373 case ATA_ASC_MEDIA_ERR1:
2377 case ATA_ASC_MEDIA_ERR2:
2381 case ATA_ASC_MEDIA_ERR3:
2385 case ATA_ASC_MEDIA_ERR4:
2395 case ATA_SK_NOT_READY:
2397 case ATA_ASC_MEDIA_UPSIDE_DOWN:
2432 OUT BOOLEAN *NeedRetry
2442 SensePtr = SenseData;
2444 for (Index = 0; Index < SenseCounts; Index++) {
2445 switch (SensePtr->sense_key) {
2446 case ATA_SK_NOT_READY:
2448 case ATA_ASC_NOT_READY:
2450 case ATA_ASCQ_IN_PROGRESS:
UINTN EFIAPI MicroSecondDelay(IN UINTN MicroSeconds)
CONST EFI_PEI_SERVICES **EFIAPI GetPeiServicesTablePointer(VOID)
#define PEI_ICH_IDE_SECONDARY
#define PEI_ICH_IDE_PRIMARY
#define ATA_CMD_TEST_UNIT_READY
defined from ATA-1
#define ATA_STSREG_BSY
Controller Busy defined from ATA-1.
#define ATA_ERRREG_ABRT
Aborted Command defined from ATA-1.
#define ATA_STSREG_DRQ
Data Request defined from ATA-1.
#define ATA_CMD_REQUEST_SENSE
defined from ATA-4
#define ATA_STSREG_DWF
Drive Write Fault defined from ATA-1, obsoleted from ATA-4.
#define ATA_CMD_READ_10
defined in ATAPI Removable Rewritable Media Devices
#define ATA_STSREG_ERR
Error defined from ATA-1.
#define ATA_CMD_READ_CAPACITY
defined in ATAPI Removable Rewritable Media Devices
#define ATA_CTLREG_SRST
Software Reset.
#define ATA_STSREG_CORR
Corrected Data defined from ATA-1, obsoleted from ATA-4.
#define ATA_STSREG_DRDY
Drive Ready defined from ATA-1.
#define ATA_CMD_READ_FORMAT_CAPACITY
defined in ATAPI Removable Rewritable Media Devices
#define ATA_CMD_IDENTIFY_DEVICE
defined from ATA-3
#define ATA_CMD_SOFT_RESET
defined from ATA-3
#define ATA_CMD_PACKET
defined from ATA-3
#define ATA_CMD_INQUIRY
defined in ATAPI Removable Rewritable Media Devices
EFI_STATUS EFIAPI AtapiReadBlocks(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN UINTN DeviceIndex, IN EFI_PEI_LBA StartLBA, IN UINTN BufferSize, OUT VOID *Buffer)
EFI_STATUS EFIAPI AtapiGetBlockDeviceMediaInfo(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN UINTN DeviceIndex, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo)
EFI_STATUS ReadCapacity(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2)
EFI_STATUS EFIAPI AtapiPeimEntry(IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices)
EFI_STATUS DRDYReady(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS DRQReady(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS TestUnitReady(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition)
VOID AtapiEnumerateDevices(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev)
EFI_STATUS CheckPowerMode(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN UINT8 AtaCommand)
BOOLEAN DiscoverAtapiDevice(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2)
EFI_STATUS EFIAPI AtapiGetNumberOfBlockDevices2(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, OUT UINTN *NumberBlockDevices)
EFI_STATUS AtapiPacketCommandIn(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN ATAPI_PACKET_COMMAND *Packet, IN UINT16 *Buffer, IN UINT32 ByteCount, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS DRQClear(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS ReadSectors(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN VOID *Buffer, IN EFI_PEI_LBA StartLba, IN UINTN NumberOfBlocks, IN UINTN BlockSize)
BOOLEAN DetectIDEController(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition)
EFI_STATUS ATAPIIdentify(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition)
EFI_STATUS RequestSense(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN ATAPI_REQUEST_SENSE_DATA *SenseBuffers, IN OUT UINT8 *SenseCounts)
EFI_STATUS WaitForBSYClear(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS CheckErrorStatus(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINT16 StatusReg)
EFI_STATUS DetectMedia(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2)
BOOLEAN IsNoMedia(IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN UINTN SenseCounts)
BOOLEAN IsDriveReady(IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN UINTN SenseCounts, OUT BOOLEAN *NeedRetry)
EFI_STATUS DRQReady2(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
BOOLEAN IsMediaError(IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN UINTN SenseCounts)
BOOLEAN IsDeviceStateUnclear(IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN UINTN SenseCounts)
EFI_STATUS EFIAPI AtapiReadBlocks2(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN UINTN DeviceIndex, IN EFI_PEI_LBA StartLBA, IN UINTN BufferSize, OUT VOID *Buffer)
EFI_STATUS EFIAPI AtapiGetBlockDeviceMediaInfo2(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN UINTN DeviceIndex, OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo)
EFI_STATUS ResetDevice(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, IN BOOLEAN Extensive)
EFI_STATUS DRQClear2(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN IDE_BASE_REGISTERS *IdeIoRegisters, IN UINTN TimeoutInMilliSeconds)
EFI_STATUS Inquiry(IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN UINTN DevicePosition, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2)
EFI_STATUS EFIAPI AtapiGetNumberOfBlockDevices(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, OUT UINTN *NumberBlockDevices)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_STATUS EFIAPI PeiServicesLocatePpi(IN CONST EFI_GUID *Guid, IN UINTN Instance, IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, IN OUT VOID **Ppi)
EFI_STATUS EFIAPI PeiServicesInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
EFI_STATUS EFIAPI PeiServicesRegisterForShadow(IN EFI_PEI_FILE_HANDLE FileHandle)
UINT8 EFIAPI IoWrite8(IN UINTN Port, IN UINT8 Value)
UINT8 EFIAPI IoRead8(IN UINTN Port)
UINT16 EFIAPI IoRead16(IN UINTN Port)
UINT16 EFIAPI IoWrite16(IN UINTN Port, IN UINT16 Value)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
@ IdeLS120
The recovery device is an IDE LS-120.
@ IdeCDROM
The recovery device is an IDE CD-ROM.
#define PcdGet16(TokenName)
VOID * EFI_PEI_FILE_HANDLE
VOID *EFIAPI AllocatePages(IN UINTN Pages)
#define EFI_SIZE_TO_PAGES(Size)
EFI_PEI_READ_BLOCKS2 ReadBlocks
EFI_PEI_GET_DEVICE_MEDIA_INFORMATION2 GetBlockDeviceMediaInfo
EFI_PEI_GET_NUMBER_BLOCK_DEVICES2 GetNumberOfBlockDevices
EFI_PEI_READ_BLOCKS ReadBlocks
EFI_PEI_GET_NUMBER_BLOCK_DEVICES GetNumberOfBlockDevices
EFI_PEI_GET_DEVICE_MEDIA_INFORMATION GetBlockDeviceMediaInfo
UINT8 page_code
defined in SFF8090i, V6
UINT8 addnl_sense_code
mandatory
UINT8 addnl_sense_code_qualifier
mandatory
EFI_PEI_BLOCK_DEVICE_TYPE DeviceType
UINT16 CommandBlockBaseAddr
UINT16 ControlBlockBaseAddr