/** @file Header file for GpioLib. All function in this library is available for PEI, DXE, and SMM @note: When GPIO pads are owned by ME Firmware, BIOS/host should not attempt to access these GPIO Pads registers, registers value returned in this case will be 0xFF. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _GPIO_LIB_H_ #define _GPIO_LIB_H_ #include #define GPIO_NAME_LENGTH_MAX 32 typedef struct { GPIO_PAD GpioPad; GPIO_CONFIG GpioConfig; } GPIO_INIT_CONFIG; /** This procedure will initialize multiple GPIO pins. Use GPIO_INIT_CONFIG structure. Structure contains fields that can be used to configure each pad. Pad not configured using GPIO_INIT_CONFIG will be left with hardware default values. Separate fields could be set to hardware default if it does not matter, except GpioPad and PadMode. Function will work in most efficient way if pads which belong to the same group are placed in adjacent records of the table. Although function can enable pads for Native mode, such programming is done by reference code when enabling related silicon feature. @param[in] NumberofItem Number of GPIO pads to be updated @param[in] GpioInitTableAddress GPIO initialization table @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or pad number **/ EFI_STATUS GpioConfigurePads ( IN UINT32 NumberOfItems, IN GPIO_INIT_CONFIG *GpioInitTableAddress ); // // Functions for setting/getting multiple GpioPad settings // /** This procedure will read multiple GPIO settings @param[in] GpioPad GPIO Pad @param[out] GpioData GPIO data structure @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadConfig ( IN GPIO_PAD GpioPad, OUT GPIO_CONFIG *GpioData ); /** This procedure will configure multiple GPIO settings @param[in] GpioPad GPIO Pad @param[in] GpioData GPIO data structure @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetPadConfig ( IN GPIO_PAD GpioPad, IN GPIO_CONFIG *GpioData ); // // Functions for setting/getting single GpioPad properties // /** This procedure will set GPIO output level @param[in] GpioPad GPIO pad @param[in] Value Output value 0: OutputLow, 1: OutputHigh @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetOutputValue ( IN GPIO_PAD GpioPad, IN UINT32 Value ); /** This procedure will get GPIO output level @param[in] GpioPad GPIO pad @param[out] OutputVal GPIO Output value 0: OutputLow, 1: OutputHigh @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetOutputValue ( IN GPIO_PAD GpioPad, OUT UINT32 *OutputVal ); /** This procedure will get GPIO input level @param[in] GpioPad GPIO pad @param[out] InputVal GPIO Input value 0: InputLow, 1: InputHigh @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetInputValue ( IN GPIO_PAD GpioPad, OUT UINT32 *InputVal ); /** This procedure will get GPIO IOxAPIC interrupt number @param[in] GpioPad GPIO pad @param[out] IrqNum IRQ number @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadIoApicIrqNumber ( IN GPIO_PAD GpioPad, OUT UINT32 *IrqNum ); /** This procedure will configure GPIO input inversion @param[in] GpioPad GPIO pad @param[in] Value Value for GPIO input inversion 0: No input inversion, 1: Invert input @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetInputInversion ( IN GPIO_PAD GpioPad, IN UINT32 Value ); /** This procedure will get GPIO pad input inversion value @param[in] GpioPad GPIO pad @param[out] InvertState GPIO inversion state 0: No input inversion, 1: Inverted input @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetInputInversion ( IN GPIO_PAD GpioPad, OUT UINT32 *InvertState ); /** This procedure will set GPIO interrupt settings @param[in] GpioPad GPIO pad @param[in] Value Value of Level/Edge use GPIO_INT_CONFIG as argument @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetPadInterruptConfig ( IN GPIO_PAD GpioPad, IN GPIO_INT_CONFIG Value ); /** This procedure will set GPIO electrical settings @param[in] GpioPad GPIO pad @param[in] Value Value of termination use GPIO_ELECTRICAL_CONFIG as argument @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetPadElectricalConfig ( IN GPIO_PAD GpioPad, IN GPIO_ELECTRICAL_CONFIG Value ); /** This procedure will set GPIO Reset settings @param[in] GpioPad GPIO pad @param[in] Value Value for Pad Reset Configuration use GPIO_RESET_CONFIG as argument @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetPadResetConfig ( IN GPIO_PAD GpioPad, IN GPIO_RESET_CONFIG Value ); /** This procedure will get GPIO Reset settings @param[in] GpioPad GPIO pad @param[in] Value Value of Pad Reset Configuration based on GPIO_RESET_CONFIG @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadResetConfig ( IN GPIO_PAD GpioPad, IN GPIO_RESET_CONFIG *Value ); /** This procedure will get Gpio Pad Host Software Ownership @param[in] GpioPad GPIO pad @param[out] PadHostSwOwn Value of Host Software Pad Owner 0: ACPI Mode, 1: GPIO Driver mode @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetHostSwOwnershipForPad ( IN GPIO_PAD GpioPad, OUT UINT32 *PadHostSwOwn ); /** This procedure will set Gpio Pad Host Software Ownership @param[in] GpioPad GPIO pad @param[in] PadHostSwOwn Pad Host Software Owner 0: ACPI Mode, 1: GPIO Driver mode @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioSetHostSwOwnershipForPad ( IN GPIO_PAD GpioPad, IN UINT32 PadHostSwOwn ); /// /// Possible values of Pad Ownership /// If Pad is not under Host ownership then GPIO registers /// are not accessible by host (e.g. BIOS) and reading them /// will return 0xFFs. /// typedef enum { GpioPadOwnHost = 0x0, GpioPadOwnCsme = 0x1, GpioPadOwnIsh = 0x2, } GPIO_PAD_OWN; /** This procedure will get Gpio Pad Ownership @param[in] GpioPad GPIO pad @param[out] PadOwnVal Value of Pad Ownership @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadOwnership ( IN GPIO_PAD GpioPad, OUT GPIO_PAD_OWN *PadOwnVal ); /** This procedure will check state of Pad Config Lock for pads within one group @param[in] Group GPIO group @param[in] DwNum PadCfgLock register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[out] PadCfgLockRegVal Value of PadCfgLock register Bit position - PadNumber Bit value - 0: NotLocked, 1: Locked @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or DwNum parameter number **/ EFI_STATUS GpioGetPadCfgLockForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, OUT UINT32 *PadCfgLockRegVal ); /** This procedure will check state of Pad Config Lock for selected pad @param[in] GpioPad GPIO pad @param[out] PadCfgLock PadCfgLock for selected pad 0: NotLocked, 1: Locked @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadCfgLock ( IN GPIO_PAD GpioPad, OUT UINT32 *PadCfgLock ); /** This procedure will check state of Pad Config Tx Lock for pads within one group @param[in] Group GPIO group @param[in] DwNum PadCfgLockTx register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[out] PadCfgLockTxRegVal Value of PadCfgLockTx register Bit position - PadNumber Bit value - 0: NotLockedTx, 1: LockedTx @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or DwNum parameter number **/ EFI_STATUS GpioGetPadCfgLockTxForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, OUT UINT32 *PadCfgLockTxRegVal ); /** This procedure will check state of Pad Config Tx Lock for selected pad @param[in] GpioPad GPIO pad @param[out] PadCfgLock PadCfgLockTx for selected pad 0: NotLockedTx, 1: LockedTx @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetPadCfgLockTx ( IN GPIO_PAD GpioPad, OUT UINT32 *PadCfgLockTx ); /** This procedure will clear PadCfgLock for selected pads within one group. Unlocking a pad will cause an SMI (if enabled) @param[in] Group GPIO group @param[in] DwNum PadCfgLock register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[in] PadsToUnlock Bitmask for pads which are going to be unlocked, Bit position - PadNumber Bit value - 0: DoNotUnlock, 1: Unlock @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or pad number **/ EFI_STATUS GpioUnlockPadCfgForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, IN UINT32 PadsToUnlock ); /** This procedure will clear PadCfgLock for selected pad. Unlocking a pad will cause an SMI (if enabled) @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioUnlockPadCfg ( IN GPIO_PAD GpioPad ); /** This procedure will set PadCfgLock for selected pads within one group @param[in] Group GPIO group @param[in] DwNum PadCfgLock register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[in] PadsToLock Bitmask for pads which are going to be locked, Bit position - PadNumber Bit value - 0: DoNotLock, 1: Lock @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or DwNum parameter number **/ EFI_STATUS GpioLockPadCfgForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, IN UINT32 PadsToLock ); /** This procedure will set PadCfgLock for selected pad @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioLockPadCfg ( IN GPIO_PAD GpioPad ); /** This procedure will clear PadCfgLockTx for selected pads within one group. Unlocking a pad will cause an SMI (if enabled) @param[in] Group GPIO group @param[in] DwNum PadCfgLockTx register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[in] PadsToUnlockTx Bitmask for pads which are going to be unlocked, Bit position - PadNumber Bit value - 0: DoNotUnLockTx, 1: LockTx @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or pad number **/ EFI_STATUS GpioUnlockPadCfgTxForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, IN UINT32 PadsToUnlockTx ); /** This procedure will clear PadCfgLockTx for selected pad. Unlocking a pad will cause an SMI (if enabled) @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioUnlockPadCfgTx ( IN GPIO_PAD GpioPad ); /** This procedure will set PadCfgLockTx for selected pads within one group @param[in] Group GPIO group @param[in] DwNum PadCfgLock register number for current group. For group which has less then 32 pads per group DwNum must be 0. @param[in] PadsToLockTx Bitmask for pads which are going to be locked, Bit position - PadNumber Bit value - 0: DoNotLockTx, 1: LockTx @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or DwNum parameter number **/ EFI_STATUS GpioLockPadCfgTxForGroupDw ( IN GPIO_GROUP Group, IN UINT32 DwNum, IN UINT32 PadsToLockTx ); /** This procedure will set PadCfgLockTx for selected pad @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioLockPadCfgTx ( IN GPIO_PAD GpioPad ); /** This procedure will get Group to GPE mapping. It will assume that only first 32 pads can be mapped to GPE. To handle cases where groups have more than 32 pads and higher part of group can be mapped please refer to GpioGetGroupDwToGpeDwX() @param[out] GroupToGpeDw0 GPIO group to be mapped to GPE_DW0 @param[out] GroupToGpeDw1 GPIO group to be mapped to GPE_DW1 @param[out] GroupToGpeDw2 GPIO group to be mapped to GPE_DW2 @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or pad number **/ EFI_STATUS GpioGetGroupToGpeDwX ( IN GPIO_GROUP *GroupToGpeDw0, IN GPIO_GROUP *GroupToGpeDw1, IN GPIO_GROUP *GroupToGpeDw2 ); /** This procedure will get Group to GPE mapping. If group has more than 32 bits it is possible to map only single DW of pins (e.g. 0-31, 32-63) because ACPI GPE_DWx register is 32 bits large. @param[out] GroupToGpeDw0 GPIO group mapped to GPE_DW0 @param[out] GroupDwForGpeDw0 DW of pins mapped to GPE_DW0 @param[out] GroupToGpeDw1 GPIO group mapped to GPE_DW1 @param[out] GroupDwForGpeDw1 DW of pins mapped to GPE_DW1 @param[out] GroupToGpeDw2 GPIO group mapped to GPE_DW2 @param[out] GroupDwForGpeDw2 DW of pins mapped to GPE_DW2 @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid group or pad number **/ EFI_STATUS GpioGetGroupDwToGpeDwX ( OUT GPIO_GROUP *GroupToGpeDw0, OUT UINT32 *GroupDwForGpeDw0, OUT GPIO_GROUP *GroupToGpeDw1, OUT UINT32 *GroupDwForGpeDw1, OUT GPIO_GROUP *GroupToGpeDw2, OUT UINT32 *GroupDwForGpeDw2 ); /** This procedure will get GPE number for provided GpioPad. PCH allows to configure mapping between GPIO groups and related GPE (GpioSetGroupToGpeDwX()) what results in the fact that certain Pad can cause different General Purpose Event. Only three GPIO groups can be mapped to cause unique GPE (1-tier), all others groups will be under one common event (GPE_111 for 2-tier). 1-tier: Returned GpeNumber is in range <0,95>. GpioGetGpeNumber() can be used to determine what _LXX ACPI method would be called on event on selected GPIO pad 2-tier: Returned GpeNumber is 0x6F (111). All GPIO pads which are not mapped to 1-tier GPE will be under one master GPE_111 which is linked to _L6F ACPI method. If it is needed to determine what Pad from 2-tier has caused the event, _L6F method should check GPI_GPE_STS and GPI_GPE_EN registers for all GPIO groups not mapped to 1-tier GPE. @param[in] GpioPad GPIO pad @param[out] GpeNumber GPE number @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetGpeNumber ( IN GPIO_PAD GpioPad, OUT UINT32 *GpeNumber ); /** This procedure is used to clear SMI STS for a specified Pad @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioClearGpiSmiSts ( IN GPIO_PAD GpioPad ); /** This procedure is used by Smi Dispatcher and will clear all GPI SMI Status bits @retval EFI_SUCCESS The function completed successfully **/ EFI_STATUS GpioClearAllGpiSmiSts ( VOID ); /** This procedure is used to disable all GPI SMI @retval EFI_SUCCESS The function completed successfully **/ EFI_STATUS GpioDisableAllGpiSmi ( VOID ); /** This procedure is used to register GPI SMI dispatch function. @param[in] GpioPad GPIO pad @param[out] GpiNum GPI number @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetGpiSmiNum ( IN GPIO_PAD GpioPad, OUT UINTN *GpiNum ); /** This procedure is used to check GPIO inputs belongs to 2 tier or 1 tier architecture @param[in] GpioPad GPIO pad @retval Data 0 means 1-tier, 1 means 2-tier **/ BOOLEAN GpioCheckFor2Tier ( IN GPIO_PAD GpioPad ); /** This procedure is used to clear GPE STS for a specified GpioPad @param[in] GpioPad GPIO pad @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioClearGpiGpeSts ( IN GPIO_PAD GpioPad ); /** This procedure is used to read GPE STS for a specified Pad @param[in] GpioPad GPIO pad @param[out] GpeSts Gpe status for given pad The GpeSts is true if the status register is set for given Pad number @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetGpiGpeSts ( IN GPIO_PAD GpioPad, OUT BOOLEAN *GpeSts ); /** This procedure is used to get SMI STS for a specified Pad @param[in] GpioPad GPIO pad @param[out] SmiSts Smi status for given pad The SmiSts is true if the status register is set for given Pad number @retval EFI_SUCCESS The function completed successfully @retval EFI_INVALID_PARAMETER Invalid GpioPad **/ EFI_STATUS GpioGetGpiSmiSts ( IN GPIO_PAD GpioPad, OUT BOOLEAN *SmiSts ); /** Generates GPIO name from GpioPad @param[in] GpioPad GpioPad @param[out] GpioNameBuffer Caller allocated buffer for GPIO name of GPIO_NAME_LENGTH_MAX size @param[in] GpioNameBufferSize Size of the buffer @retval CHAR8* Pointer to the GPIO name **/ CHAR8* GpioGetPadName ( IN GPIO_PAD GpioPad, OUT CHAR8* GpioNameBuffer, IN UINT32 GpioNameBufferSize ); /** Generates GPIO group name from GroupIndex @param[in] GroupIndex Gpio GroupIndex @retval CHAR8* Pointer to the GPIO group name **/ CONST CHAR8* GpioGetGroupName ( IN UINT32 GroupIndex ); #endif // _GPIO_LIB_H_