/** @file | |
Protocol to describe overrides required to support non-standard SDHCI | |
implementations | |
Copyright (c) 2017 - 2018, Linaro, Ltd. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __SD_MMC_OVERRIDE_H__ | |
#define __SD_MMC_OVERRIDE_H__ | |
#include <Protocol/SdMmcPassThru.h> | |
#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 |