/** @file Protocol to describe overrides required to support non-standard SDHCI implementations Copyright (c) 2017 - 2018, Linaro, Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __SD_MMC_OVERRIDE_H__ #define __SD_MMC_OVERRIDE_H__ #include #define EDKII_SD_MMC_OVERRIDE_PROTOCOL_GUID \ { 0xeaf9e3c1, 0xc9cd, 0x46db, { 0xa5, 0xe5, 0x5a, 0x12, 0x4c, 0x83, 0x23, 0x23 } } #define EDKII_SD_MMC_OVERRIDE_PROTOCOL_VERSION 0x3 typedef struct _EDKII_SD_MMC_OVERRIDE EDKII_SD_MMC_OVERRIDE; #define EDKII_SD_MMC_BUS_WIDTH_IGNORE MAX_UINT8 #define EDKII_SD_MMC_CLOCK_FREQ_IGNORE MAX_UINT32 #define EDKII_SD_MMC_DRIVER_STRENGTH_IGNORE MAX_UINT8 typedef enum { SdDriverStrengthTypeB = 0, SdDriverStrengthTypeA, SdDriverStrengthTypeC, SdDriverStrengthTypeD, SdDriverStrengthIgnore = EDKII_SD_MMC_DRIVER_STRENGTH_IGNORE } SD_DRIVER_STRENGTH_TYPE; typedef enum { EmmcDriverStrengthType0 = 0, EmmcDriverStrengthType1, EmmcDriverStrengthType2, EmmcDriverStrengthType3, EmmcDriverStrengthType4, EmmcDriverStrengthIgnore = EDKII_SD_MMC_DRIVER_STRENGTH_IGNORE } EMMC_DRIVER_STRENGTH_TYPE; typedef union { SD_DRIVER_STRENGTH_TYPE Sd; EMMC_DRIVER_STRENGTH_TYPE Emmc; } EDKII_SD_MMC_DRIVER_STRENGTH; typedef struct { // // The target width of the bus. If user tells driver to ignore it // or specifies unsupported width driver will choose highest supported // bus width for a given mode. // UINT8 BusWidth; // // The target clock frequency of the bus in MHz. If user tells driver to ignore // it or specifies unsupported frequency driver will choose highest supported // clock frequency for a given mode. // UINT32 ClockFreq; // // The target driver strength of the bus. If user tells driver to // ignore it or specifies unsupported driver strength, driver will // default to Type0 for eMMC cards and TypeB for SD cards. Driver strength // setting is only considered if chosen bus timing supports them. // EDKII_SD_MMC_DRIVER_STRENGTH DriverStrength; } EDKII_SD_MMC_OPERATING_PARAMETERS; typedef enum { SdMmcSdDs, SdMmcSdHs, SdMmcUhsSdr12, SdMmcUhsSdr25, SdMmcUhsSdr50, SdMmcUhsDdr50, SdMmcUhsSdr104, SdMmcMmcLegacy, SdMmcMmcHsSdr, SdMmcMmcHsDdr, SdMmcMmcHs200, SdMmcMmcHs400, } SD_MMC_BUS_MODE; typedef enum { EdkiiSdMmcResetPre, EdkiiSdMmcResetPost, EdkiiSdMmcInitHostPre, EdkiiSdMmcInitHostPost, EdkiiSdMmcUhsSignaling, EdkiiSdMmcSwitchClockFreqPost, EdkiiSdMmcGetOperatingParam } EDKII_SD_MMC_PHASE_TYPE; /** Override function for SDHCI capability bits @param[in] ControllerHandle The EFI_HANDLE of the controller. @param[in] Slot The 0 based slot index. @param[in,out] SdMmcHcSlotCapability The SDHCI capability structure. @param[in,out] BaseClkFreq The base clock frequency value that optionally can be updated. @retval EFI_SUCCESS The override function completed successfully. @retval EFI_NOT_FOUND The specified controller or slot does not exist. @retval EFI_INVALID_PARAMETER SdMmcHcSlotCapability is NULL **/ typedef EFI_STATUS (EFIAPI * EDKII_SD_MMC_CAPABILITY) ( IN EFI_HANDLE ControllerHandle, IN UINT8 Slot, IN OUT VOID *SdMmcHcSlotCapability, IN OUT UINT32 *BaseClkFreq ); /** Override function for SDHCI controller operations @param[in] ControllerHandle The EFI_HANDLE of the controller. @param[in] Slot The 0 based slot index. @param[in] PhaseType The type of operation and whether the hook is invoked right before (pre) or right after (post) @param[in,out] PhaseData The pointer to a phase-specific data. @retval EFI_SUCCESS The override function completed successfully. @retval EFI_NOT_FOUND The specified controller or slot does not exist. @retval EFI_INVALID_PARAMETER PhaseType is invalid **/ typedef EFI_STATUS (EFIAPI * EDKII_SD_MMC_NOTIFY_PHASE) ( IN EFI_HANDLE ControllerHandle, IN UINT8 Slot, IN EDKII_SD_MMC_PHASE_TYPE PhaseType, IN OUT VOID *PhaseData ); struct _EDKII_SD_MMC_OVERRIDE { // // Protocol version of this implementation // UINTN Version; // // Callback to override SD/MMC host controller capability bits // EDKII_SD_MMC_CAPABILITY Capability; // // Callback to invoke SD/MMC override hooks // EDKII_SD_MMC_NOTIFY_PHASE NotifyPhase; }; extern EFI_GUID gEdkiiSdMmcOverrideProtocolGuid; #endif