]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/Ata.c
Code scrub for IdeBusDxe driver and PeiS3Lib.(undergoing)
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / IdeBusDxe / Ata.c
index a315953e3cf2b07efb71716b537b49fa5110ee47..87d466f9d07c8340952c8a446951e00113b8251b 100644 (file)
@@ -1,5 +1,5 @@
 /** @file\r
-  Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
+  Copyright (c) 2006 - 2008, Intel Corporation.<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -21,7 +21,7 @@
 \r
 **/\r
 \r
-#include "idebus.h"\r
+#include "IdeBus.h"\r
 \r
 /**\r
   Sends out an ATA Identify Command to the specified device.\r
@@ -63,6 +63,9 @@ ATAIdentify (
   //  the ATA Identify command\r
   //\r
   AtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));\r
+  if (AtaIdentifyPointer == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
 \r
   //\r
   //  use ATA PIO Data In protocol to send ATA Identify command\r
@@ -93,7 +96,7 @@ ATAIdentify (
     //\r
     if (!EFI_ERROR (Status)) {\r
 \r
-      IdeDev->pIdData = AtaIdentifyPointer;\r
+      IdeDev->IdData = AtaIdentifyPointer;\r
 \r
       //\r
       // Print ATA Module Name\r
@@ -170,7 +173,7 @@ ATAIdentify (
   //\r
   // Make sure the pIdData will not be freed again.\r
   //\r
-  IdeDev->pIdData = NULL;\r
+  IdeDev->IdData = NULL;\r
 \r
   return EFI_DEVICE_ERROR;\r
 }\r
@@ -209,11 +212,11 @@ AtaAtapi6Identify (
   EFI_LBA           Capacity;\r
   EFI_IDENTIFY_DATA *Atapi6IdentifyStruct;\r
 \r
-  if (IdeDev->pIdData == NULL) {\r
+  if (IdeDev->IdData == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Atapi6IdentifyStruct = IdeDev->pIdData;\r
+  Atapi6IdentifyStruct = IdeDev->IdData;\r
 \r
   if ((Atapi6IdentifyStruct->AtapiData.cmd_set_support_83 & (BIT15 | BIT14)) != 0x4000) {\r
     //\r
@@ -279,11 +282,11 @@ PrintAtaModuleName (
   IN  IDE_BLK_IO_DEV  *IdeDev\r
   )\r
 {\r
-  if (IdeDev->pIdData == NULL) {\r
+  if (IdeDev->IdData == NULL) {\r
     return ;\r
   }\r
 \r
-  SwapStringChars (IdeDev->ModelName, IdeDev->pIdData->AtaData.ModelName, 40);\r
+  SwapStringChars (IdeDev->ModelName, IdeDev->IdData->AtaData.ModelName, 40);\r
   IdeDev->ModelName[40] = 0x00;\r
 }\r
 \r
@@ -630,7 +633,7 @@ CheckErrorStatus (
 \r
   DEBUG_CODE_BEGIN ();\r
 \r
-    if (StatusRegister & ATA_STSREG_DWF) {\r
+    if ((StatusRegister & ATA_STSREG_DWF) != 0) {\r
       DEBUG (\r
         (EFI_D_BLKIO,\r
         "CheckErrorStatus()-- %02x : Error : Write Fault\n",\r
@@ -638,7 +641,7 @@ CheckErrorStatus (
         );\r
     }\r
 \r
-    if (StatusRegister & ATA_STSREG_CORR) {\r
+    if ((StatusRegister & ATA_STSREG_CORR) != 0) {\r
       DEBUG (\r
         (EFI_D_BLKIO,\r
         "CheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
@@ -646,10 +649,10 @@ CheckErrorStatus (
         );\r
     }\r
 \r
-    if (StatusRegister & ATA_STSREG_ERR) {\r
+    if ((StatusRegister & ATA_STSREG_ERR) != 0) {\r
       ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);\r
 \r
-      if (ErrorRegister & ATA_ERRREG_BBK) {\r
+      if ((ErrorRegister & ATA_ERRREG_BBK) != 0) {\r
       DEBUG (\r
         (EFI_D_BLKIO,\r
         "CheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
@@ -657,7 +660,7 @@ CheckErrorStatus (
         );\r
       }\r
 \r
-      if (ErrorRegister & ATA_ERRREG_UNC) {\r
+      if ((ErrorRegister & ATA_ERRREG_UNC) != 0) {\r
         DEBUG (\r
           (EFI_D_BLKIO,\r
           "CheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
@@ -665,7 +668,7 @@ CheckErrorStatus (
           );\r
       }\r
 \r
-      if (ErrorRegister & ATA_ERRREG_MC) {\r
+      if ((ErrorRegister & ATA_ERRREG_MC) != 0) {\r
         DEBUG (\r
           (EFI_D_BLKIO,\r
           "CheckErrorStatus()-- %02x : Error : Media Change\n",\r
@@ -673,7 +676,7 @@ CheckErrorStatus (
           );\r
       }\r
 \r
-      if (ErrorRegister & ATA_ERRREG_ABRT) {\r
+      if ((ErrorRegister & ATA_ERRREG_ABRT) != 0) {\r
         DEBUG (\r
           (EFI_D_BLKIO,\r
           "CheckErrorStatus()-- %02x : Error : Abort\n",\r
@@ -681,7 +684,7 @@ CheckErrorStatus (
           );\r
       }\r
 \r
-      if (ErrorRegister & ATA_ERRREG_TK0NF) {\r
+      if ((ErrorRegister & ATA_ERRREG_TK0NF) != 0) {\r
         DEBUG (\r
           (EFI_D_BLKIO,\r
           "CheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
@@ -689,7 +692,7 @@ CheckErrorStatus (
           );\r
       }\r
 \r
-      if (ErrorRegister & ATA_ERRREG_AMNF) {\r
+      if ((ErrorRegister & ATA_ERRREG_AMNF) != 0) {\r
         DEBUG (\r
           (EFI_D_BLKIO,\r
           "CheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
@@ -1348,7 +1351,7 @@ AtaReadSectorsExt (
   @param[in] *DataBuffer\r
   A pointer to the source buffer for the data.\r
 \r
-  @param[in] Lba\r
+  @param[in] StartLba\r
   The starting logical block address to write onto\r
   the device media.\r
 \r
@@ -1439,7 +1442,7 @@ AtaWriteSectorsExt (
   @param[in] *IdeDev pointer pointing to IDE_BLK_IO_DEV data structure, used\r
   to record all the information of the IDE device.\r
 \r
-  @param[in,out] *Buffer  buffer contained data transferred from device to host.\r
+  @param[in, out] *Buffer  buffer contained data transferred from device to host.\r
   @param[in] ByteCount    data size in byte unit of the buffer.\r
   @param[in] AtaCommand   value of the Command Register\r
   @param[in] StartLba     the start LBA of this transaction\r
@@ -1776,13 +1779,13 @@ AtaSMARTSupport (
   //\r
   // Detect if the device supports S.M.A.R.T.\r
   //\r
-  if ((IdeDev->pIdData->AtaData.command_set_supported_83 & 0xc000) != 0x4000) {\r
+  if ((IdeDev->IdData->AtaData.command_set_supported_83 & 0xc000) != 0x4000) {\r
     //\r
     // Data in word 82 is not valid (bit15 shall be zero and bit14 shall be to one)\r
     //\r
     return ;\r
   } else {\r
-    if ((IdeDev->pIdData->AtaData.command_set_supported_82 & 0x0001) != 0x0001) {\r
+    if ((IdeDev->IdData->AtaData.command_set_supported_82 & 0x0001) != 0x0001) {\r
       //\r
       // S.M.A.R.T is not supported by the device\r
       //\r
@@ -1824,6 +1827,9 @@ AtaSMARTSupport (
     // Detect if this feature is enabled\r
     //\r
     TmpAtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));\r
+    if (TmpAtaIdentifyPointer == NULL) {\r
+      return;\r
+    }\r
 \r
     DeviceSelect          = (UINT8) ((IdeDev->Device) << 4);\r
     Status = AtaPioDataIn (\r
@@ -1897,6 +1903,70 @@ AtaSMARTSupport (
   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->IdData != NULL);\r
+  //\r
+  // Only valid for ATA device\r
+  //\r
+  AtaIdentifyData       = (EFI_ATA_IDENTIFY_DATA *) &IdeDev->IdData->AtaData;\r
+  if ((AtaIdentifyData->config & 0x8000) != 0) {\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) != 0) {\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) != 0) {\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
@@ -1908,7 +1978,7 @@ AtaSMARTSupport (
   @param  LbaAddress The LBA address in 48-bit mode\r
 \r
   @retval  EFI_SUCCESS Reading succeed\r
-  @retval  EFI_DEVICE_ERROR Error executing commands on this device\r
+  @retval  EFI_DEVICE_ERROR Error executing commands on this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2020,7 +2090,7 @@ AtaCommandIssueExt (
   @param  LbaAddress The LBA address in 48-bit mode\r
 \r
   @retval  EFI_SUCCESS Reading succeed\r
-  @retval  EFI_DEVICE_ERROR Error executing commands on this device\r
+  @retval  EFI_DEVICE_ERROR Error executing commands on this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2493,9 +2563,9 @@ DoAtaUdma (
                         );\r
 \r
     if (UdmaOp == AtaUdmaReadExtOp || UdmaOp == AtaUdmaReadOp) {\r
-      RegisterValue |= BMIC_nREAD;\r
+      RegisterValue |= BMIC_NREAD;\r
     } else {\r
-      RegisterValue &= ~((UINT8) BMIC_nREAD);\r
+      RegisterValue &= ~((UINT8) BMIC_NREAD);\r
     }\r
 \r
     IdeDev->PciIo->Io.Write (\r
@@ -2574,8 +2644,8 @@ DoAtaUdma (
                           1,\r
                           &RegisterValue\r
                           );\r
-      if ((RegisterValue & (BMIS_INTERRUPT | BMIS_ERROR)) || (Count == 0)) {\r
-        if ((RegisterValue & BMIS_ERROR) || (Count == 0)) {\r
+      if (((RegisterValue & (BMIS_INTERRUPT | BMIS_ERROR)) != 0) || (Count == 0)) {\r
+        if (((RegisterValue & BMIS_ERROR) != 0) || (Count == 0)) {\r
                  Status = EFI_DEVICE_ERROR;\r
                  break;\r
         }\r
@@ -2637,7 +2707,7 @@ DoAtaUdma (
                         &RegisterValue\r
                         );\r
 \r
-    if (RegisterValue & BMIS_ERROR) {\r
+    if ((RegisterValue & BMIS_ERROR) != 0) {\r
       return EFI_DEVICE_ERROR;\r
     }\r
 \r