From: Reza Jelveh <reza.jel...@tuhh.de>

SataController reads host capabalities when the module is first loaded.

The Initialize method should only install the protocol. All host
specific information is read when ChannelInfo is accessed.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Reza Jelveh <reza.jel...@tuhh.de>
---
 .../Bus/Pci/SataControllerDxe/SataController.c     | 115 +++++++++++----------
 1 file changed, 58 insertions(+), 57 deletions(-)

diff --git a/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c 
b/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c
index 1807c88..944aba2 100644
--- a/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c
+++ b/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c
@@ -390,10 +390,7 @@ SataControllerStart (
 {
   EFI_STATUS                        Status;
   EFI_PCI_IO_PROTOCOL               *PciIo;
-  PCI_TYPE00                        PciData;
   EFI_SATA_CONTROLLER_PRIVATE_DATA  *SataPrivateData;
-  UINT32                            Data32;
-  UINTN                             ChannelDeviceCount;
 
   DEBUG ((EFI_D_INFO, "SataControllerStart START\n"));
 
@@ -437,50 +434,6 @@ SataControllerStart (
   SataPrivateData->IdeInit.SetTiming = IdeInitSetTiming;
   SataPrivateData->IdeInit.EnumAll = SATA_ENUMER_ALL;
 
-  Status = PciIo->Pci.Read (
-                        PciIo,
-                        EfiPciIoWidthUint8,
-                        PCI_CLASSCODE_OFFSET,
-                        sizeof (PciData.Hdr.ClassCode),
-                        PciData.Hdr.ClassCode
-                        );
-  ASSERT_EFI_ERROR (Status);
-
-  if (IS_PCI_IDE (&PciData)) {
-    SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;
-    SataPrivateData->DeviceCount = IDE_MAX_DEVICES;
-  } else if (IS_PCI_SATADPA (&PciData)) {
-    //
-    // Read Host Capability Register(CAP) to get Number of Ports(NPS) and 
Supports Port Multiplier(SPM)
-    //   NPS is 0's based value indicating the maximum number of ports 
supported by the HBA silicon.
-    //   A maximum of 32 ports can be supported. A value of '0h', indicating 
one port, is the minimum requirement.
-    //
-    Data32 = AhciReadReg (PciIo, R_AHCI_CAP);
-    SataPrivateData->IdeInit.ChannelCount = (UINT8) ((Data32 & B_AHCI_CAP_NPS) 
+ 1);
-    SataPrivateData->DeviceCount = AHCI_MAX_DEVICES;
-    if ((Data32 & B_AHCI_CAP_SPM) == B_AHCI_CAP_SPM) {
-      SataPrivateData->DeviceCount = AHCI_MULTI_MAX_DEVICES;
-    }
-  }
-
-  ChannelDeviceCount = (UINTN) (SataPrivateData->IdeInit.ChannelCount) * 
(UINTN) (SataPrivateData->DeviceCount);
-  SataPrivateData->DisqulifiedModes = AllocateZeroPool ((sizeof 
(EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);
-  if (SataPrivateData->DisqulifiedModes == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto Done;
-  }
-
-  SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof 
(EFI_IDENTIFY_DATA)) * ChannelDeviceCount);
-  if (SataPrivateData->IdentifyData == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto Done;
-  }
-
-  SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * 
ChannelDeviceCount);
-  if (SataPrivateData->IdentifyValid == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto Done;
-  }
 
   //
   // Install IDE Controller Init Protocol to this instance
@@ -502,15 +455,6 @@ Done:
           Controller
           );
     if (SataPrivateData != NULL) {
-      if (SataPrivateData->DisqulifiedModes != NULL) {
-        FreePool (SataPrivateData->DisqulifiedModes);
-      }
-      if (SataPrivateData->IdentifyData != NULL) {
-        FreePool (SataPrivateData->IdentifyData);
-      }
-      if (SataPrivateData->IdentifyValid != NULL) {
-        FreePool (SataPrivateData->IdentifyValid);
-      }
       FreePool (SataPrivateData);
     }
   }
@@ -648,18 +592,75 @@ IdeInitGetChannelInfo (
   OUT UINT8                             *MaxDevices
   )
 {
+  EFI_STATUS                        Status;
+  PCI_TYPE00                        PciData;
   EFI_SATA_CONTROLLER_PRIVATE_DATA  *SataPrivateData;
+  UINT32                            Data32;
+  UINTN                             ChannelDeviceCount;
+
   SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);
   ASSERT (SataPrivateData != NULL);
 
+  Status = SataPrivateData->PciIo->Pci.Read (
+                        SataPrivateData->PciIo,
+                        EfiPciIoWidthUint8,
+                        PCI_CLASSCODE_OFFSET,
+                        sizeof (PciData.Hdr.ClassCode),
+                        PciData.Hdr.ClassCode
+                        );
+  ASSERT_EFI_ERROR (Status);
+
+  if (IS_PCI_IDE (&PciData)) {
+    SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;
+    SataPrivateData->DeviceCount = IDE_MAX_DEVICES;
+  } else if (IS_PCI_SATADPA (&PciData)) {
+    //
+    // Read Host Capability Register(CAP) to get Number of Ports(NPS) and 
Supports Port Multiplier(SPM)
+    //   NPS is 0's based value indicating the maximum number of ports 
supported by the HBA silicon.
+    //   A maximum of 32 ports can be supported. A value of '0h', indicating 
one port, is the minimum requirement.
+    //
+    Data32 = AhciReadReg (SataPrivateData->PciIo, R_AHCI_CAP);
+    SataPrivateData->IdeInit.ChannelCount = (UINT8) ((Data32 & B_AHCI_CAP_NPS) 
+ 1);
+    SataPrivateData->DeviceCount = AHCI_MAX_DEVICES;
+    if ((Data32 & B_AHCI_CAP_SPM) == B_AHCI_CAP_SPM) {
+      SataPrivateData->DeviceCount = AHCI_MULTI_MAX_DEVICES;
+    }
+  }
+
+  ChannelDeviceCount = (UINTN) (SataPrivateData->IdeInit.ChannelCount) * 
(UINTN) (SataPrivateData->DeviceCount);
+  if (SataPrivateData->DisqulifiedModes == NULL) {
+    SataPrivateData->DisqulifiedModes = AllocateZeroPool ((sizeof 
(EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);
+    if (SataPrivateData->DisqulifiedModes == NULL) {
+      Status = EFI_OUT_OF_RESOURCES;
+      goto Done;
+    }
+  }
+  if (SataPrivateData->IdentifyData == NULL) {
+    SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof 
(EFI_IDENTIFY_DATA)) * ChannelDeviceCount);
+    if (SataPrivateData->IdentifyData == NULL) {
+      Status = EFI_OUT_OF_RESOURCES;
+      goto Done;
+    }
+  }
+  if (SataPrivateData->IdentifyValid == NULL) {
+    SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * 
ChannelDeviceCount);
+    if (SataPrivateData->IdentifyValid == NULL) {
+      Status = EFI_OUT_OF_RESOURCES;
+      goto Done;
+    }
+  }
+
   if (Channel < This->ChannelCount) {
     *Enabled = TRUE;
     *MaxDevices = SataPrivateData->DeviceCount;
     return EFI_SUCCESS;
   }
 
+  Status = EFI_INVALID_PARAMETER;
+
+Done:
   *Enabled = FALSE;
-  return EFI_INVALID_PARAMETER;
+  return Status;
 }
 
 /**
-- 
1.9.2


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to