/** @file Header file for GpioConfig structure used by GPIO library. @copyright Copyright 2014 - 2021 Intel Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _GPIO_CONFIG_H_ #define _GPIO_CONFIG_H_ #pragma pack(push, 1) /// /// For any GpioPad usage in code use GPIO_PAD type /// typedef UINT32 GPIO_PAD; /// /// For any GpioGroup usage in code use GPIO_GROUP type /// typedef UINT32 GPIO_GROUP; /** GPIO configuration structure used for pin programming. Structure contains fields that can be used to configure pad. **/ typedef struct { /** Pad Mode Pad can be set as GPIO or one of its native functions. When in native mode setting Direction (except Inversion), OutputState, InterruptConfig and Host Software Pad Ownership are unnecessary. Refer to definition of GPIO_PAD_MODE. Refer to EDS for each native mode according to the pad. **/ UINT32 PadMode : 4; /** Host Software Pad Ownership Set pad to ACPI mode or GPIO Driver Mode. Refer to definition of GPIO_HOSTSW_OWN. **/ UINT32 HostSoftPadOwn : 2; /** GPIO Direction Can choose between In, In with inversion Out, both In and Out, both In with inversion and out or disabling both. Refer to definition of GPIO_DIRECTION for supported settings. **/ UINT32 Direction : 5; /** Output State Set Pad output value. Refer to definition of GPIO_OUTPUT_STATE for supported settings. This setting takes place when output is enabled. **/ UINT32 OutputState : 2; /** GPIO Interrupt Configuration Set Pad to cause one of interrupts (IOxAPIC/SCI/SMI/NMI). This setting is applicable only if GPIO is in input mode. If GPIO is set to cause an SCI then also Gpe is enabled for this pad. Refer to definition of GPIO_INT_CONFIG for supported settings. **/ UINT32 InterruptConfig : 8; /** GPIO Power Configuration. This setting controls Pad Reset Configuration. Refer to definition of GPIO_RESET_CONFIG for supported settings. **/ UINT32 PowerConfig : 4; /** GPIO Electrical Configuration This setting controls pads termination and voltage tolerance. Refer to definition of GPIO_ELECTRICAL_CONFIG for supported settings. **/ UINT32 ElectricalConfig : 7; /** GPIO Lock Configuration This setting controls pads lock. Refer to definition of GPIO_LOCK_CONFIG for supported settings. **/ UINT32 LockConfig : 3; /** Additional GPIO configuration Refer to definition of GPIO_OTHER_CONFIG for supported settings. **/ UINT32 OtherSettings : 2; UINT32 RsvdBits : 27; ///< Reserved bits for future extension UINT32 RsvdBits1; ///< Reserved bits for future extension } GPIO_CONFIG; typedef enum { GpioHardwareDefault = 0x0 } GPIO_HARDWARE_DEFAULT; /// /// GPIO Pad Mode /// typedef enum { GpioPadModeGpio = 0x1, GpioPadModeNative1 = 0x3, GpioPadModeNative2 = 0x5, GpioPadModeNative3 = 0x7, GpioPadModeNative4 = 0x9 } GPIO_PAD_MODE; /// /// Host Software Pad Ownership modes /// typedef enum { GpioHostOwnDefault = 0x0, ///< Leave ownership value unmodified GpioHostOwnAcpi = 0x1, ///< Set HOST ownership to ACPI GpioHostOwnGpio = 0x3 ///< Set HOST ownership to GPIO } GPIO_HOSTSW_OWN; /// /// GPIO Direction /// typedef enum { GpioDirDefault = 0x0, ///< Leave pad direction setting unmodified GpioDirInOut = (0x1 | (0x1 << 3)), ///< Set pad for both output and input GpioDirInInvOut = (0x1 | (0x3 << 3)), ///< Set pad for both output and input with inversion GpioDirIn = (0x3 | (0x1 << 3)), ///< Set pad for input only GpioDirInInv = (0x3 | (0x3 << 3)), ///< Set pad for input with inversion GpioDirOut = 0x5, ///< Set pad for output only GpioDirNone = 0x7 ///< Disable both output and input } GPIO_DIRECTION; /// /// GPIO Output State /// typedef enum { GpioOutDefault = 0x0, ///< Leave output value unmodified GpioOutLow = 0x1, ///< Set output to low GpioOutHigh = 0x3 ///< Set output to high } GPIO_OUTPUT_STATE; /// /// GPIO interrupt configuration /// This setting is applicable only if GPIO is in input mode. /// GPIO_INT_CONFIG allows to choose which interrupt is generated (IOxAPIC/SCI/SMI/NMI) /// and how it is triggered (edge or level). /// Field from GpioIntNmi to GpioIntApic can be OR'ed with GpioIntLevel to GpioIntBothEdgecan /// to describe an interrupt e.g. GpioIntApic | GpioIntLevel /// If GPIO is set to cause an SCI then also Gpe is enabled for this pad. /// Not all GPIO are capable of generating an SMI or NMI interrupt /// typedef enum { GpioIntDefault = 0x0, ///< Leave value of interrupt routing unmodified GpioIntDis = 0x1, ///< Disable IOxAPIC/SCI/SMI/NMI interrupt generation GpioIntNmi = 0x3, ///< Enable NMI interrupt only GpioIntSmi = 0x5, ///< Enable SMI interrupt only GpioIntSci = 0x9, ///< Enable SCI interrupt only GpioIntApic = 0x11, ///< Enable IOxAPIC interrupt only GpioIntLevel = (0x1 << 5), ///< Set interrupt as level triggered GpioIntEdge = (0x3 << 5), ///< Set interrupt as edge triggered (type of edge depends on input inversion) GpioIntLvlEdgDis = (0x5 << 5), ///< Disable interrupt trigger GpioIntBothEdge = (0x7 << 5) ///< Set interrupt as both edge triggered } GPIO_INT_CONFIG; #define GPIO_INT_CONFIG_INT_SOURCE_MASK 0x1F ///< Mask for GPIO_INT_CONFIG for interrupt source #define GPIO_INT_CONFIG_INT_TYPE_MASK 0xE0 ///< Mask for GPIO_INT_CONFIG for interrupt type /** GPIO Power Configuration GPIO_RESET_CONFIG allows to set GPIO Reset type (PADCFG_DW0.PadRstCfg) which will be used to reset certain GPIO settings. Refer to EDS for settings that are controllable by PadRstCfg. **/ typedef enum { GpioResetDefault = 0x00, ///< Leave value of pad reset unmodified /// /// LBG configuration /// GpioResetPwrGood = 0x09, ///< GPP: RSMRST; GPD: DSW_PWROK; (PadRstCfg = 00b = "Powergood") GpioResetDeep = 0x0B, ///< Deep GPIO Reset (PadRstCfg = 01b = "Deep GPIO Reset") GpioResetNormal = 0x0D, ///< GPIO Reset (PadRstCfg = 10b = "GPIO Reset" ) GpioResetResume = 0x0F, ///< GPP: Reserved; GPD: RSMRST; (PadRstCfg = 11b = "Resume Reset") /// /// New GPIO reset configuration options /// /** Resume Reset (RSMRST) GPP: PadRstCfg = 00b = "Powergood" GPD: PadRstCfg = 11b = "Resume Reset" Pad setting will reset on: - DeepSx transition - G3 Pad settings will not reset on: - S3/S4/S5 transition - Warm/Cold/Global reset **/ GpioResumeReset = 0x01, /** Host Deep Reset PadRstCfg = 01b = "Deep GPIO Reset" Pad settings will reset on: - Warm/Cold/Global reset - DeepSx transition - G3 Pad settings will not reset on: - S3/S4/S5 transition **/ GpioHostDeepReset = 0x03, /** Platform Reset (PLTRST) PadRstCfg = 10b = "GPIO Reset" Pad settings will reset on: - S3/S4/S5 transition - Warm/Cold/Global reset - DeepSx transition - G3 **/ GpioPlatformReset = 0x05, /** Deep Sleep Well Reset (DSW_PWROK) GPP: not applicable GPD: PadRstCfg = 00b = "Powergood" Pad settings will reset on: - G3 Pad settings will not reset on: - S3/S4/S5 transition - Warm/Cold/Global reset - DeepSx transition **/ GpioDswReset = 0x07 } GPIO_RESET_CONFIG; /// /// GPIO Electrical Configuration /// Set GPIO termination and Pad Tolerance (applicable only for some pads) /// Field from GpioTermDefault to GpioTermNative can be OR'ed with GpioTolerance1v8. /// typedef enum { GpioTermDefault = 0x0, ///< Leave termination setting unmodified GpioTermNone = 0x1, ///< none GpioTermWpd5K = 0x5, ///< 5kOhm weak pull-down GpioTermWpd20K = 0x9, ///< 20kOhm weak pull-down GpioTermWpu1K = 0x13, ///< 1kOhm weak pull-up GpioTermWpu2K = 0x17, ///< 2kOhm weak pull-up GpioTermWpu5K = 0x15, ///< 5kOhm weak pull-up GpioTermWpu20K = 0x19, ///< 20kOhm weak pull-up GpioTermWpu1K2K = 0x1B, ///< 1kOhm & 2kOhm weak pull-up GpioTermNative = 0x1F, ///< Native function controls pads termination GpioNoTolerance1v8 = (0x1 << 5), ///< Disable 1.8V pad tolerance GpioTolerance1v8 = (0x3 << 5) ///< Enable 1.8V pad tolerance } GPIO_ELECTRICAL_CONFIG; #define GPIO_ELECTRICAL_CONFIG_TERMINATION_MASK 0x1F ///< Mask for GPIO_ELECTRICAL_CONFIG for termination value #define GPIO_ELECTRICAL_CONFIG_1V8_TOLERANCE_MASK 0x60 ///< Mask for GPIO_ELECTRICAL_CONFIG for 1v8 tolerance setting /// /// GPIO LockConfiguration /// Set GPIO configuration lock and output state lock /// GpioLockPadConfig and GpioLockOutputState can be OR'ed /// typedef enum { GpioLockDefault = 0x0, ///< Leave lock setting unmodified GpioPadConfigLock = 0x3, ///< Lock Pad Configuration GpioOutputStateLock = 0x5 ///< Lock GPIO pad output value } GPIO_LOCK_CONFIG; /// /// Other GPIO Configuration /// GPIO_OTHER_CONFIG is used for less often settings and for future extensions /// Supported settings: /// - RX raw override to '1' - allows to override input value to '1' /// This setting is applicable only if in input mode (both in GPIO and native usage). /// The override takes place at the internal pad state directly from buffer and before the RXINV. /// typedef enum { GpioRxRaw1Default = 0x0, ///< Use default input override value GpioRxRaw1Dis = 0x1, ///< Don't override input GpioRxRaw1En = 0x3 ///< Override input to '1' } GPIO_OTHER_CONFIG; #pragma pack(pop) #endif //_GPIO_CONFIG_H_