From: Tomasz Michalec <t...@semihalf.com> Some SD Host Controlers need to do additional opperations after clock frequency switch.
This patch add new callback to SdMmcOverride protocol. The SwitchClockFreqPost callback is called after EmmcSwitchClockFreq and SdMmcHcClockSupply. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Marcin Wojtas <m...@semihalf.com> --- MdeModulePkg/Include/Protocol/SdMmcOverride.h | 33 ++++++++++-- MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c | 57 ++++++++++++++++++++ MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c | 17 ++++++ 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Include/Protocol/SdMmcOverride.h b/MdeModulePkg/Include/Protocol/SdMmcOverride.h index a7a57e8..6ba1c43 100644 --- a/MdeModulePkg/Include/Protocol/SdMmcOverride.h +++ b/MdeModulePkg/Include/Protocol/SdMmcOverride.h @@ -99,23 +99,48 @@ EFI_STATUS IN SD_MMC_UHS_TIMING Timing ); +/** + + Additional operations specific for host controller + + @param[in] ControllerHandle The EFI_HANDLE of the controller. + @param[in] Slot The 0 based slot index. + @param[in] Timing The timing which should be set by + host controller. + + @retval EFI_SUCCESS The override function completed successfully. + @retval EFI_NOT_FOUND The specified controller or slot does not exist. + +**/ +typedef +EFI_STATUS +(EFIAPI * EDKII_SD_MMC_POST_CLOCK_FREQ_SWITCH) ( + IN EFI_HANDLE ControllerHandle, + IN UINT8 Slot, + IN SD_MMC_UHS_TIMING Timing + ); + struct _EDKII_SD_MMC_OVERRIDE { // // Protocol version of this implementation // - UINTN Version; + UINTN Version; // // Callback to override SD/MMC host controller capability bits // - EDKII_SD_MMC_CAPABILITY Capability; + EDKII_SD_MMC_CAPABILITY Capability; // // Callback to invoke SD/MMC override hooks // - EDKII_SD_MMC_NOTIFY_PHASE NotifyPhase; + EDKII_SD_MMC_NOTIFY_PHASE NotifyPhase; // // Callback to override SD/MMC host controller uhs signaling // - EDKII_SD_MMC_UHS_SIGNALING UhsSignaling; + EDKII_SD_MMC_UHS_SIGNALING UhsSignaling; + // + // Callback to add host controller specific operations after SwitchClockFreq + // + EDKII_SD_MMC_POST_CLOCK_FREQ_SWITCH SwitchClockFreqPost; }; extern EFI_GUID gEdkiiSdMmcOverrideProtocolGuid; diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c index d285249..78ee3a5 100755 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c @@ -795,6 +795,26 @@ EmmcSwitchToHighSpeed ( HsTiming = 1; Status = EmmcSwitchClockFreq (PciIo, PassThru, Slot, Rca, HsTiming, ClockFreq); + if (EFI_ERROR (Status)) { + return Status; + } + + if (mOverride != NULL && mOverride->SwitchClockFreqPost != NULL) { + Status = mOverride->SwitchClockFreqPost ( + Private->ControllerHandle, + Slot, + Timing + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: SD/MMC switch clock freq post notifier callback failed - %r\n", + __FUNCTION__, + Status + )); + return Status; + } + } return Status; } @@ -881,6 +901,23 @@ EmmcSwitchToHS200 ( return Status; } + if (mOverride != NULL && mOverride->SwitchClockFreqPost != NULL) { + Status = mOverride->SwitchClockFreqPost ( + Private->ControllerHandle, + Slot, + Timing + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: SD/MMC switch clock freq post notifier callback failed - %r\n", + __FUNCTION__, + Status + )); + return Status; + } + } + Status = EmmcTuningClkForHs200 (PciIo, PassThru, Slot, BusWidth); return Status; @@ -964,6 +1001,26 @@ EmmcSwitchToHS400 ( HsTiming = 3; Status = EmmcSwitchClockFreq (PciIo, PassThru, Slot, Rca, HsTiming, ClockFreq); + if (EFI_ERROR (Status)) { + return Status; + } + + if (mOverride != NULL && mOverride->SwitchClockFreqPost != NULL) { + Status = mOverride->SwitchClockFreqPost ( + Private->ControllerHandle, + Slot, + Timing + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: SD/MMC switch clock freq post notifier callback failed - %r\n", + __FUNCTION__, + Status + )); + return Status; + } + } return Status; } diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c index f45a367..777cf08 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c @@ -886,6 +886,23 @@ SdCardSetBusMode ( return Status; } + if (mOverride != NULL && mOverride->SwitchClockFreqPost != NULL) { + Status = mOverride->SwitchClockFreqPost ( + Private->ControllerHandle, + Slot, + Timing + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: SD/MMC switch clock freq post notifier callback failed - %r\n", + __FUNCTION__, + Status + )); + return Status; + } + } + if ((AccessMode == 3) || ((AccessMode == 2) && (Capability->TuningSDR50 != 0))) { Status = SdCardTuningClock (PciIo, PassThru, Slot); if (EFI_ERROR (Status)) { -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel