]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Function AtaEnableLongPhysicalSector () added for Long physical sector process.
authorgikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 2 Apr 2009 01:50:07 +0000 (01:50 +0000)
committergikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 2 Apr 2009 01:50:07 +0000 (01:50 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8004 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/Ata.c
IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/Ide.c
IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/Ide.h

index 25ecedb78b1e6144c4b5c21d1eeb0487b2094c83..f4e2e5d6d7b27494e7f86251d445de41168f3b1e 100644 (file)
@@ -1903,6 +1903,70 @@ AtaSMARTSupport (
   return ;\r
 }\r
 \r
   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
 /**\r
   Send ATA Ext command into device with NON_DATA protocol\r
 \r
index c6902afe0164ae239c624dcb995062a38c1c3bcf..6ffc2fcf2be5823b921682eb4e1c7c06c3aef42c 100644 (file)
@@ -421,6 +421,7 @@ DiscoverIdeDevice (
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS  Status;\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
   //\r
   // If a channel has not been checked, check it now. Then set it to "checked" state\r
@@ -485,7 +486,12 @@ DiscoverIdeDevice (
   //\r
   // Init Block I/O interface\r
   //\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
   IdeDev->BlkIo.Reset               = IDEBlkIoReset;\r
   IdeDev->BlkIo.ReadBlocks          = IDEBlkIoReadBlocks;\r
   IdeDev->BlkIo.WriteBlocks         = IDEBlkIoWriteBlocks;\r
index f2cc9df4543e18d7e169f400c301cd1fd66075f4..bb2a4a75c3f536fb95ea4b048a1b684227ad287c 100644 (file)
@@ -1165,6 +1165,22 @@ AtaSMARTSupport (
   IN  IDE_BLK_IO_DEV  *IdeDev\r
   );\r
 \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
 /**\r
   TODO: Add function description\r
 \r