return ;\r
}\r
\r
+/**\r
+ Enable Long Physical Sector Feature for ATA device.\r
+\r
+ @param IdeDev The IDE device data\r
+\r
+ @retval EFI_SUCCESS The ATA device supports Long Physical Sector feature\r
+ and corresponding fields in BlockIo structure is updated.\r
+ @retval EFI_UNSUPPORTED The device is not ATA device or Long Physical Sector\r
+ feature is not supported.\r
+**/\r
+EFI_STATUS\r
+AtaEnableLongPhysicalSector (\r
+ IN IDE_BLK_IO_DEV *IdeDev\r
+ )\r
+{\r
+ EFI_ATA_IDENTIFY_DATA *AtaIdentifyData;\r
+ UINT16 PhyLogicSectorSupport;\r
+\r
+ ASSERT (IdeDev->pIdData != NULL);\r
+ //\r
+ // Only valid for ATA device\r
+ //\r
+ AtaIdentifyData = (EFI_ATA_IDENTIFY_DATA *) &IdeDev->pIdData->AtaData;\r
+ if (AtaIdentifyData->config & 0x8000) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ PhyLogicSectorSupport = AtaIdentifyData->phy_logic_sector_support;\r
+ //\r
+ // Check whether Long Physical Sector Feature is supported\r
+ //\r
+ if ((PhyLogicSectorSupport & 0xc000) == 0x4000) {\r
+ IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock = 1;\r
+ IdeDev->BlkIo.Media->LowestAlignedLba = 0;\r
+ //\r
+ // Check whether one physical block contains multiple physical blocks\r
+ //\r
+ if (PhyLogicSectorSupport & 0x2000) {\r
+ IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock =\r
+ (UINT32) (1 << (PhyLogicSectorSupport & 0x000f));\r
+ //\r
+ // Check lowest alignment of logical blocks within physical block\r
+ //\r
+ if ((AtaIdentifyData->alignment_logic_in_phy_blocks & 0xc000) == 0x4000) {\r
+ IdeDev->BlkIo.Media->LowestAlignedLba =\r
+ (EFI_LBA) (AtaIdentifyData->alignment_logic_in_phy_blocks & 0x3fff);\r
+ }\r
+ }\r
+ //\r
+ // Check logical block size\r
+ //\r
+ IdeDev->BlkIo.Media->BlockSize = 0x200;\r
+ if (PhyLogicSectorSupport & 0x1000) {\r
+ IdeDev->BlkIo.Media->BlockSize = (UINT32) (\r
+ ((AtaIdentifyData->logic_sector_size_hi << 16) |\r
+ AtaIdentifyData->logic_sector_size_lo) * sizeof (UINT16)\r
+ );\r
+ }\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+}\r
+\r
+\r
/**\r
Send ATA Ext command into device with NON_DATA protocol\r
\r
// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
+ EFI_STATUS LongPhyStatus;\r
\r
//\r
// If a channel has not been checked, check it now. Then set it to "checked" state\r
//\r
// Init Block I/O interface\r
//\r
- IdeDev->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;\r
+ LongPhyStatus = AtaEnableLongPhysicalSector (IdeDev);\r
+ if (!EFI_ERROR (LongPhyStatus)) {\r
+ IdeDev->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;\r
+ } else {\r
+ IdeDev->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;\r
+ }\r
IdeDev->BlkIo.Reset = IDEBlkIoReset;\r
IdeDev->BlkIo.ReadBlocks = IDEBlkIoReadBlocks;\r
IdeDev->BlkIo.WriteBlocks = IDEBlkIoWriteBlocks;\r
IN IDE_BLK_IO_DEV *IdeDev\r
);\r
\r
+\r
+/**\r
+ Enable Long Physical Sector Feature for ATA device.\r
+\r
+ @param IdeDev The IDE device data\r
+\r
+ @retval EFI_SUCCESS The ATA device supports Long Physical Sector feature\r
+ and corresponding fields in BlockIo structure is updated.\r
+ @retval EFI_UNSUPPORTED The device is not ATA device or Long Physical Sector\r
+ feature is not supported.\r
+**/\r
+EFI_STATUS\r
+AtaEnableLongPhysicalSector (\r
+ IN IDE_BLK_IO_DEV *IdeDev\r
+ );\r
+\r
/**\r
TODO: Add function description\r
\r