From: Reza Jelveh <reza.jel...@tuhh.de> SataController reads host capabalities when the module is first loaded.
SataControllerStart is called before AhciMode.c resets the bus and enables AE. If SataControllerStart would do this itself, it would break AhciMode. 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 | 98 ++++++++++++---------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c b/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c index 1807c88..0bfd9d7 100644 --- a/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c +++ b/PcAtChipsetPkg/Bus/Pci/SataControllerDxe/SataController.c @@ -392,8 +392,6 @@ SataControllerStart ( 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")); @@ -449,37 +447,6 @@ SataControllerStart ( 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; } // @@ -502,15 +469,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 +606,72 @@ 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_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 ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel