From: "Nate DeSimone" <nathaniel.l.desimone@intel.com>
To: "Luo, Heng" <heng.luo@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Chaganty, Rangasai V" <rangasai.v.chaganty@intel.com>
Subject: Re: [PATCH 27/40] TigerlakeSiliconPkg/IpBlock: Add SerialIo component
Date: Thu, 4 Feb 2021 03:56:23 +0000 [thread overview]
Message-ID: <BN6PR1101MB2147A95D97DE82214E22740BCDB39@BN6PR1101MB2147.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210201013657.1833-27-heng.luo@intel.com>
Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
> -----Original Message-----
> From: Luo, Heng <heng.luo@intel.com>
> Sent: Sunday, January 31, 2021 5:37 PM
> To: devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Desimone,
> Nathaniel L <nathaniel.l.desimone@intel.com>
> Subject: [PATCH 27/40] TigerlakeSiliconPkg/IpBlock: Add SerialIo component
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3171
>
> Adds the following files:
> * IpBlock/SerialIo/IncludePrivate
> * IpBlock/SerialIo/Library
> * IpBlock/SerialIo/LibraryPrivate
>
> Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
>
> Signed-off-by: Heng Luo <heng.luo@intel.com>
> ---
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Library/Seri
> alIoPrivateLib.h | 377
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Register/Ser
> ialIoRegsVer2.h | 108
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerialIo
> AccessLib/PeiDxeSmmSerialIoAccessLib.inf | 35
> +++++++++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerialIo
> AccessLib/SerialIoAccessLib.c | 266
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/PeiDxeSmmSerialIoPrivateLibVer2.inf | 34
> ++++++++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLib.c | 156
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibI2c.c | 122
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibI2cVer2.c | 70
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibInternal.h | 20
> ++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibSpi.c | 122
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibSpiVer2.c | 82
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibUart.c | 136
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++
>
> Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSmm
> SerialIoPrivateLib/SerialIoPrivateLibUartVer2.c | 82
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++
> 13 files changed, 1610 insertions(+)
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Library/Se
> rialIoPrivateLib.h
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Library/Se
> rialIoPrivateLib.h
> new file mode 100644
> index 0000000000..47057cd2ef
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Library/Se
> rialIoPrivateLib.h
> @@ -0,0 +1,377 @@
> +/** @file
>
> + Header file for Serial IO Private Lib implementation.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +#ifndef _SERIAL_IO_PRIVATE_LIB_H_
>
> +#define _SERIAL_IO_PRIVATE_LIB_H_
>
> +
>
> +#include <SerialIoDevices.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +
>
> +/**
>
> + Serial Io Pci Device State structure.
>
> + Used to preserve current information about the device when it is
> configured in Pci mode prior to Pch Initialization.
>
> +**/
>
> +typedef struct {
>
> + UINT64 PciCfgBar0; ///< Pci Config Space Base Address Register
>
> + UINT8 PciCfgCommand; ///< Pci Config Space Command Register
>
> + UINT8 PciCfgPmeCtrlSts; ///< Pci Config Space Pme Control Status
>
> + UINT8 PprReset; ///< MMIO Proprietary Reset Register
>
> +} SERIAL_IO_PCI_DEVICE_STATE;
>
> +
>
> +/**
>
> + Checks if higher functions are enabled.
>
> + Used for Function 0 Serial Io Device disabling
>
> +
>
> + @param[in] DeviceNum Device Number
>
> +
>
> + @retval TRUE At least one higher function device is enabled
>
> + FALSE Higher functions are disabled
>
> +**/
>
> +BOOLEAN
>
> +SerialIoHigherFunctionsEnabled (
>
> + IN UINT8 DeviceNum
>
> + );
>
> +
>
> +/**
>
> + Places SerialIo device in D3
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSetD3 (
>
> + IN UINT64 PciCfgBase
>
> + );
>
> +
>
> +/**
>
> + Places SerialIo device in D0
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSetD0 (
>
> + IN UINT64 PciCfgBase
>
> + );
>
> +
>
> +/**
>
> + Allows Memory Access
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> + @param[in] Hidden Mode that determines access type
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoEnableMse (
>
> + IN UINT64 PciCfgBase,
>
> + IN BOOLEAN Hidden
>
> + );
>
> +
>
> +/**
>
> + Disable SerialIo memory access
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoDisableMse (
>
> + IN UINT64 PciCfgBase
>
> + );
>
> +
>
> +/**
>
> + Disable SerialIo memory encoding
>
> + Designated for Pci modes
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> + @param[in] RemoveTempBar Remove temporary mem base address or
> not
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoMmioDisable (
>
> + IN UINT64 PciCfgBase,
>
> + IN BOOLEAN RemoveBar
>
> + );
>
> +
>
> +/**
>
> + Gets Fixed Base Address used for BAR0
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Config control offset
>
> +**/
>
> +UINT32
>
> +GetSerialIoSpiFixedMmioAddress (
>
> + IN UINT8 SpiNumber
>
> + );
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoSpiFixedPciCfgAddress (
>
> + IN UINT8 SpiNumber
>
> + );
>
> +
>
> +/**
>
> + Gets Spi Device Id
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoSpiDeviceId (
>
> + IN UINT8 SpiNumber
>
> + );
>
> +
>
> +/**
>
> + Checks if SPI is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] SpiNumber Selects Serial IO SPI device
>
> +
>
> + @retval TRUE SPI is in hidden mode
>
> + @retval FALSE SPI is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoSpiHidden (
>
> + IN UINT8 SpiNumber
>
> + );
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] SpiNumber SPI Number
>
> + @param[in] SpiDeviceConfig SerialIo SPI Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSpiBootHandler (
>
> + IN UINT8 SpiNumber,
>
> + IN SERIAL_IO_SPI_CONFIG *SpiDeviceConfig
>
> + );
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] SpiNumber SPI Number
>
> + @param[in] SpiDeviceConfig SerialIo SPI Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSpiS3Handler (
>
> + IN UINT8 SpiNumber,
>
> + IN SERIAL_IO_SPI_CONFIG *SpiDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + );
>
> +
>
> +/**
>
> + Gets Pci Config control offset
>
> +
>
> + @param[in] UartNumber Serial IO device UART number
>
> +
>
> + @retval Config control offset
>
> +**/
>
> +UINT16
>
> +GetSerialIoUartConfigControlOffset (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Gets Fixed Base Address used for BAR0
>
> +
>
> + @param[in] UartNumber Serial IO device UART number
>
> +
>
> + @retval Config control offset
>
> +**/
>
> +UINT32
>
> +GetSerialIoUartFixedMmioAddress (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] UartNumber Serial IO device UART number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoUartFixedPciCfgAddress (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Returns UART S3 boot script PCI address
>
> +
>
> + @param[in] UartNumber UART Number
>
> +
>
> + @retval UART S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoUartS3PciBase (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Returns SPI S3 boot script PCI address
>
> +
>
> + @param[in] UartNumber UART Number
>
> +
>
> + @retval SPI S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoSpiS3PciBase (
>
> + IN UINT8 SpiNumber
>
> + );
>
> +
>
> +/**
>
> + Returns I2C S3 boot script PCI address
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> +
>
> + @retval I2C S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoI2cS3PciBase (
>
> + IN UINT8 I2cNumber
>
> + );
>
> +
>
> +/**
>
> + Gets Uarts Device Id
>
> +
>
> + @param[in] UartNumbe Serial IO device UART number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoUartDeviceId (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Checks if UART is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] UartNumber Selects Serial IO UART device
>
> +
>
> + @retval TRUE UART is in hidden mode
>
> + @retval FALSE UART is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoUartHidden (
>
> + IN UINT8 UartNumber
>
> + );
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] UartNumber UART Number
>
> + @param[in] UartDeviceConfig SerialIo UART Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoUartBootHandler (
>
> + IN UINT8 UartNumber,
>
> + IN SERIAL_IO_UART_CONFIG *UartDeviceConfig
>
> + );
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] UartNumber UART Number
>
> + @param[in] UartDeviceConfig SerialIo UART Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoUartS3Handler (
>
> + IN UINT8 UartNumber,
>
> + IN SERIAL_IO_UART_CONFIG *UartDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + );
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] I2cNumber Serial IO device I2C number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoI2cFixedPciCfgAddress (
>
> + IN UINT8 I2cNumber
>
> + );
>
> +
>
> +/**
>
> + Gets I2C Device Id
>
> +
>
> + @param[in] I2cNumber Serial IO device I2C number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoI2cDeviceId (
>
> + IN UINT8 I2cNumber
>
> + );
>
> +
>
> +/**
>
> + Checks if I2C is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] 2cNumber Selects Serial IO I2C device
>
> +
>
> + @retval TRUE I2C is in hidden mode
>
> + @retval FALSE I2C is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoI2cHidden (
>
> + IN UINT8 I2cNumber
>
> + );
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> + @param[in] I2cDeviceConfig SerialIo I2C Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoI2cBootHandler (
>
> + IN UINT8 I2cNumber,
>
> + IN SERIAL_IO_I2C_CONFIG *I2cDeviceConfig
>
> + );
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> + @param[in] I2cDeviceConfig SerialIo I2C Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoI2cS3Handler (
>
> + IN UINT8 I2cNumber,
>
> + IN SERIAL_IO_I2C_CONFIG *I2cDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + );
>
> +
>
> +#endif // _SERIAL_IO_PRIVATE_LIB_H_
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Register/S
> erialIoRegsVer2.h
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Register/
> SerialIoRegsVer2.h
> new file mode 100644
> index 0000000000..01840b14c9
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/IncludePrivate/Register/
> SerialIoRegsVer2.h
> @@ -0,0 +1,108 @@
> +/** @file
>
> + Device IDs for Serial IO Controllers for TGL PCH
>
> +
>
> + Conventions:
>
> +
>
> + - Register definition format:
>
> +
> Prefix_[GenerationName]_[ComponentName]_SubsystemName_RegisterS
> pace_RegisterName
>
> + - Prefix:
>
> + Definitions beginning with "R_" are registers
>
> + Definitions beginning with "B_" are bits within registers
>
> + Definitions beginning with "V_" are meaningful values within the bits
>
> + Definitions beginning with "S_" are register size
>
> + Definitions beginning with "N_" are the bit position
>
> + - [GenerationName]:
>
> + Three letter acronym of the generation is used (e.g. SKL,KBL,CNL etc.).
>
> + Register name without GenerationName applies to all generations.
>
> + - [ComponentName]:
>
> + This field indicates the component name that the register belongs to (e.g.
> PCH, SA etc.)
>
> + Register name without ComponentName applies to all components.
>
> +
>
> + Register that is specific to -LP denoted by "_PCH_LP_" in component
> name.
>
> + - SubsystemName:
>
> + This field indicates the subsystem name of the component that the
> register belongs to
>
> + (e.g. PCIE, USB, SATA, GPIO, PMC etc.).
>
> + - RegisterSpace:
>
> + MEM - MMIO space register of subsystem.
>
> + IO - IO space register of subsystem.
>
> + PCR - Private configuration register of subsystem.
>
> + CFG - PCI configuration space register of subsystem.
>
> + - RegisterName:
>
> + Full register name.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +#ifndef _SERIAL_IO_REGS_VER2_H_
>
> +#define _SERIAL_IO_REGS_VER2_H_
>
> +//
>
> +// Serial IO I2C0 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C0_DEVICE_ID 0xA0E8
>
> +
>
> +//
>
> +// Serial IO I2C1 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C1_DEVICE_ID 0xA0E9
>
> +
>
> +//
>
> +// Serial IO I2C2 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C2_DEVICE_ID 0xA0EA
>
> +
>
> +//
>
> +// Serial IO I2C3 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C3_DEVICE_ID 0xA0EB
>
> +
>
> +//
>
> +// Serial IO I2C4 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C4_DEVICE_ID 0xA0C5
>
> +
>
> +//
>
> +// Serial IO I2C5 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_I2C5_DEVICE_ID 0xA0C6
>
> +
>
> +//
>
> +// Serial IO SPI0 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_SPI0_DEVICE_ID 0xA0AA
>
> +
>
> +//
>
> +// Serial IO SPI1 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_SPI1_DEVICE_ID 0xA0AB
>
> +
>
> +//
>
> +// Serial IO SPI2 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_SPI2_DEVICE_ID 0xA0FB
>
> +
>
> +//
>
> +// Serial IO SPI3 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_SPI3_DEVICE_ID 0xA0FD
>
> +
>
> +//
>
> +// Serial IO UART0 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_UART0_DEVICE_ID 0xA0A8
>
> +
>
> +//
>
> +// Serial IO UART1 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_UART1_DEVICE_ID 0xA0A9
>
> +
>
> +//
>
> +// Serial IO UART2 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_UART2_DEVICE_ID 0xA0C7
>
> +
>
> +//
>
> +// Serial IO UART3 Controller Registers
>
> +//
>
> +#define V_VER2_PCH_LP_SERIAL_IO_CFG_UART3_DEVICE_ID 0xA0DA
>
> +
>
> +#endif //_SERIAL_IO_REGS_VER2_H_
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/PeiDxeSmmSerialIoAccessLib.inf
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/PeiDxeSmmSerialIoAccessLib.inf
> new file mode 100644
> index 0000000000..9178840ca8
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/PeiDxeSmmSerialIoAccessLib.inf
> @@ -0,0 +1,35 @@
> +## @file
>
> +# Component description file for PEI/DXE/SMM Serial Io Access Lib.
>
> +#
>
> +# All function in this library is available for PEI, DXE, and SMM,
>
> +# But do not support UEFI RUNTIME environment call.
>
> +#
>
> +# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010017
>
> + BASE_NAME = PeiDxeSmmSerialIoAccessLib
>
> + FILE_GUID = F1A20692-26CA-4CA4-A775-695BBD6D3EC7
>
> + VERSION_STRING = 1.0
>
> + MODULE_TYPE = BASE
>
> + LIBRARY_CLASS = SerialIoAccessLib
>
> +
>
> +[LibraryClasses]
>
> + BaseLib
>
> + IoLib
>
> + DebugLib
>
> + PcdLib
>
> + PciSegmentLib
>
> + PchPcrLib
>
> + SerialIoPrivateLib
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> + TigerlakeSiliconPkg/SiPkg.dec
>
> +
>
> +[Sources]
>
> + SerialIoAccessLib.c
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/SerialIoAccessLib.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/SerialIoAccessLib.c
> new file mode 100644
> index 0000000000..2b3a3dca5a
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/Library/PeiDxeSmmSerial
> IoAccessLib/SerialIoAccessLib.c
> @@ -0,0 +1,266 @@
> +/** @file
>
> + Serial Io Common Lib implementation.
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Include/PcieRegs.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <Register/PchRegs.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Library/SerialIoPrivateLib.h>
>
> +#include <Library/PciSegmentLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Library/S3BootScriptLib.h>
>
> +#include <Library/DebugLib.h>
>
> +#include <PchLimits.h>
>
> +#include <PchReservedResources.h>
>
> +#include <Library/PchPciBdfLib.h>
>
> +
>
> +/**
>
> + Returns BAR0
>
> +
>
> + @param[in] PciCfgBase Pci Config Base
>
> +
>
> + @retval 64bit MMIO BAR Address
>
> +**/
>
> +UINT64
>
> +GetSerialIoBar (
>
> + IN UINT64 PciCfgBase
>
> + )
>
> +{
>
> + if (PciCfgBase < PCH_SERIAL_IO_BASE_ADDRESS) {
>
> + return (UINT64) ((PciSegmentRead32 ((UINTN) (PciCfgBase +
> PCI_BASE_ADDRESSREG_OFFSET)) & 0xFFFFF000) + LShiftU64
> (PciSegmentRead32 ((UINTN) (PciCfgBase + PCI_BASE_ADDRESSREG_OFFSET
> + 4)), 32));
>
> + }
>
> + return (UINT64) ((MmioRead32 ((UINTN) (PciCfgBase +
> PCI_BASE_ADDRESSREG_OFFSET)) & 0xFFFFF000) + LShiftU64 (MmioRead32
> ((UINTN) (PciCfgBase + PCI_BASE_ADDRESSREG_OFFSET + 4)), 32));
>
> +}
>
> +
>
> +/**
>
> + Returns I2C Pci Config Space
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> +
>
> + @retval I2C Pci Config Space Address
>
> +**/
>
> +UINT64
>
> +GetSerialIoI2cPciCfg (
>
> + IN UINT8 I2cNumber
>
> + )
>
> +{
>
> + if (IsSerialIoI2cHidden (I2cNumber)) {
>
> + return (UINTN) GetSerialIoI2cFixedPciCfgAddress (I2cNumber);
>
> + }
>
> + return SerialIoI2cPciCfgBase (I2cNumber);
>
> +}
>
> +
>
> +/**
>
> + Returns SPI Pci Config Space
>
> +
>
> + @param[in] SpiNumber SPI Number
>
> +
>
> + @retval SPI Pci Config Space Address
>
> +**/
>
> +UINT64
>
> +GetSerialIoSpiPciCfg (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + if (IsSerialIoSpiHidden (SpiNumber)) {
>
> + return (UINTN) GetSerialIoSpiFixedPciCfgAddress (SpiNumber);
>
> + }
>
> + return SerialIoSpiPciCfgBase (SpiNumber);
>
> +}
>
> +
>
> +/**
>
> + Returns UART Pci Config Space
>
> +
>
> + @param[in] UartNumber UART Number
>
> +
>
> + @retval UART Pci Config Space Address
>
> +**/
>
> +UINT64
>
> +GetSerialIoUartPciCfg (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + if (IsSerialIoUartHidden (UartNumber)) {
>
> + return GetSerialIoUartFixedPciCfgAddress (UartNumber);
>
> + }
>
> + return SerialIoUartPciCfgBase (UartNumber);
>
> +}
>
> +
>
> +/**
>
> + Returns SPI S3 boot script PCI address
>
> +
>
> + @param[in] UartNumber UART Number
>
> +
>
> + @retval SPI S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoSpiS3PciBase (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + if (IsSerialIoSpiHidden (SpiNumber)) {
>
> + //
>
> + // It's not expected to return Spi S3 Boot Script PCI address for non PCI
> mode.
>
> + //
>
> + ASSERT (TRUE);
>
> + }
>
> + return S3_BOOT_SCRIPT_LIB_PCI_ADDRESS (
>
> + DEFAULT_PCI_BUS_NUMBER_PCH,
>
> + SerialIoSpiDevNumber (SpiNumber),
>
> + SerialIoSpiFuncNumber (SpiNumber),
>
> + 0
>
> + );
>
> +}
>
> +
>
> +/**
>
> + Returns UART S3 boot script PCI address
>
> +
>
> + @param[in] UartNumber UART Number
>
> +
>
> + @retval UART S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoUartS3PciBase (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + if (IsSerialIoUartHidden (UartNumber)) {
>
> + //
>
> + // It's not expected to return Uart S3 Boot Script PCI address for non PCI
> mode.
>
> + //
>
> + ASSERT (TRUE);
>
> + }
>
> + return S3_BOOT_SCRIPT_LIB_PCI_ADDRESS (
>
> + DEFAULT_PCI_BUS_NUMBER_PCH,
>
> + SerialIoUartDevNumber (UartNumber),
>
> + SerialIoUartFuncNumber (UartNumber),
>
> + 0
>
> + );
>
> +}
>
> +
>
> +/**
>
> + Returns I2C S3 boot script PCI address
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> +
>
> + @retval I2C S3 boot script PCI address
>
> +**/
>
> +UINT64
>
> +GetSerialIoI2cS3PciBase (
>
> + IN UINT8 I2cNumber
>
> + )
>
> +{
>
> + if (IsSerialIoI2cHidden (I2cNumber)) {
>
> + //
>
> + // It's not expected to return I2c S3 Boot Script PCI address for non PCI
> mode.
>
> + //
>
> + ASSERT (TRUE);
>
> + }
>
> + return S3_BOOT_SCRIPT_LIB_PCI_ADDRESS (
>
> + DEFAULT_PCI_BUS_NUMBER_PCH,
>
> + SerialIoI2cDevNumber (I2cNumber),
>
> + SerialIoI2cFuncNumber (I2cNumber),
>
> + 0
>
> + );
>
> +}
>
> +
>
> +/**
>
> + Checks if Device with given PciDeviceId is one of SerialIo I2C controllers
>
> + If yes, its number is returned through I2cIndex parameter, otherwise
> I2cIndex is not updated
>
> +
>
> + @param[in] PciDevId Device ID
>
> + @param[out] I2cNumber Number of SerialIo I2C controller
>
> +
>
> + @retval TRUE yes it is a SerialIo I2C controller
>
> + @retval FALSE no it isn't a SerialIo I2C controller
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoI2cDeviceId (
>
> + IN UINT16 PciDevId,
>
> + OUT UINT8 *I2cNumber
>
> + )
>
> +{
>
> + UINT8 Index;
>
> +
>
> + for (Index = 0; Index < GetPchMaxSerialIoI2cControllersNum (); Index++) {
>
> + if (PciDevId == GetSerialIoI2cDeviceId (Index)) {
>
> + *I2cNumber = Index;
>
> + return TRUE;
>
> + }
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Checks if I2c is Function 0 Enabled
>
> +
>
> + @param[in] I2cIndex Number of the SerialIo I2C controller
>
> +
>
> + @retval TRUE Enabled
>
> + @retval FALSE Disabled
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoI2cFunction0Enabled (
>
> + IN UINT8 I2cIndex
>
> + )
>
> +{
>
> + if (SerialIoI2cFuncNumber (I2cIndex) == 0) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoI2cDevNumber (I2cIndex))) {
>
> + return TRUE;
>
> + }
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Checks if Uart is Function 0 Enabled
>
> +
>
> + @param[in] UartIndex Number of the SerialIo Uart controller
>
> +
>
> + @retval TRUE Enabled
>
> + @retval FALSE Disabled
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoUartFunction0Enabled (
>
> + IN UINT8 UartIndex
>
> + )
>
> +{
>
> + if (SerialIoUartFuncNumber (UartIndex) == 0) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoUartDevNumber (UartIndex)))
> {
>
> + return TRUE;
>
> + }
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Checks if Spi is Function 0 Enabled
>
> +
>
> + @param[in] SpiIndex Number of the SerialIo Spi controller
>
> +
>
> + @retval TRUE Enabled
>
> + @retval FALSE Disabled
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoSpiFunction0Enabled (
>
> + IN UINT8 SpiIndex
>
> + )
>
> +{
>
> + if (SerialIoSpiFuncNumber (SpiIndex) == 0) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoSpiDevNumber (SpiIndex))) {
>
> + return TRUE;
>
> + }
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/PeiDxeSmmSerialIoPrivateLibVer2.inf
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/PeiDxeSmmSerialIoPrivateLibVer2.inf
> new file mode 100644
> index 0000000000..8981be2496
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/PeiDxeSmmSerialIoPrivateLibVer2.inf
> @@ -0,0 +1,34 @@
> +## @file
>
> +# Serial Io Private Lib Ver 2
>
> +#
>
> +# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010017
>
> + BASE_NAME = PeiDxeSmmSerialIoLibVer2
>
> + FILE_GUID = 9D9F99CD-C072-48C2-BF78-ABA3D664C0FA
>
> + VERSION_STRING = 1.0
>
> + MODULE_TYPE = BASE
>
> + LIBRARY_CLASS = SerialIoPrivateLib
>
> +
>
> +[LibraryClasses]
>
> + BaseLib
>
> + IoLib
>
> + PciSegmentLib
>
> + SerialIoAccessLib
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> + TigerlakeSiliconPkg/SiPkg.dec
>
> +
>
> +[Sources]
>
> + SerialIoPrivateLib.c
>
> + SerialIoPrivateLibI2c.c
>
> + SerialIoPrivateLibI2cVer2.c
>
> + SerialIoPrivateLibSpi.c
>
> + SerialIoPrivateLibSpiVer2.c
>
> + SerialIoPrivateLibUart.c
>
> + SerialIoPrivateLibUartVer2.c
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLib.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLib.c
> new file mode 100644
> index 0000000000..9b84c2dda6
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLib.c
> @@ -0,0 +1,156 @@
> +/** @file
>
> + Serial IO Private Lib implementation.
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Library/SerialIoPrivateLib.h>
>
> +#include <Library/PciSegmentLib.h>
>
> +#include <Register/PchRegs.h>
>
> +#include <Register/SerialIoRegs.h>
>
> +#include <Include/PcieRegs.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <PchReservedResources.h>
>
> +
>
> +/**
>
> + Checks if higher functions are enabled.
>
> + Used for Function 0 Serial Io Device disabling
>
> +
>
> + @param[in] DeviceNum Device Number
>
> +
>
> + @retval TRUE At least one higher function device is enabled
>
> + FALSE Higher functions are disabled
>
> +**/
>
> +BOOLEAN
>
> +SerialIoHigherFunctionsEnabled (
>
> + IN UINT8 DeviceNum
>
> + )
>
> +{
>
> + UINT8 FuncNum;
>
> + //
>
> + // Check all other func devs(1 to 7) status except func 0.
>
> + //
>
> + for (FuncNum = 1; FuncNum <= PCI_MAX_FUNC; FuncNum++) {
>
> + if (PciSegmentRead16 (PCI_SEGMENT_LIB_ADDRESS
> (DEFAULT_PCI_SEGMENT_NUMBER_PCH,
>
> + DEFAULT_PCI_BUS_NUMBER_PCH,
>
> + DeviceNum,
>
> + FuncNum,
>
> + PCI_DEVICE_ID_OFFSET)
>
> + ) != 0xFFFF) {
>
> + return TRUE;
>
> + }
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Places SerialIo device in D3
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSetD3 (
>
> + IN UINT64 PciCfgBase
>
> + )
>
> +{
>
> + if (PciCfgBase < PCH_SERIAL_IO_BASE_ADDRESS) {
>
> + PciSegmentOr32 (PciCfgBase + R_SERIAL_IO_CFG_PME_CTRL_STS, BIT1 |
> BIT0);
>
> + } else {
>
> + MmioOr8 ((UINTN) PciCfgBase + R_SERIAL_IO_CFG_PME_CTRL_STS, BIT1
> | BIT0);
>
> + //
>
> + // Reading back value after write to ensure bridge observes the BAR1
> write access
>
> + //
>
> + MmioRead8 ((UINTN) PciCfgBase + R_SERIAL_IO_CFG_PME_CTRL_STS);
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Places SerialIo device in D0
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSetD0 (
>
> + IN UINT64 PciCfgBase
>
> + )
>
> +{
>
> + if (PciCfgBase < PCH_SERIAL_IO_BASE_ADDRESS) {
>
> + PciSegmentAnd32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_PME_CTRL_STS, (UINT32) ~(BIT1 | BIT0));
>
> + } else {
>
> + MmioAnd32 ((UINTN) PciCfgBase + R_SERIAL_IO_CFG_PME_CTRL_STS,
> (UINT32) ~(BIT1 | BIT0));
>
> + //
>
> + // Reading back value after write to ensure bridge observes the BAR1
> write access
>
> + //
>
> + MmioRead32 ((UINTN) PciCfgBase + R_SERIAL_IO_CFG_PME_CTRL_STS);
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Allows memory access
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> + @param[in] Hidden Mode that determines access type
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoEnableMse (
>
> + IN UINT64 PciCfgBase,
>
> + IN BOOLEAN Hidden
>
> + )
>
> +{
>
> + if (Hidden) {
>
> + MmioOr16 ((UINTN) PciCfgBase + PCI_COMMAND_OFFSET,
> EFI_PCI_COMMAND_MEMORY_SPACE);
>
> + //
>
> + // Reading back value after write to ensure bridge observes the BAR1
> write access
>
> + //
>
> + MmioRead16 ((UINTN) PciCfgBase + PCI_COMMAND_OFFSET);
>
> + } else {
>
> + PciSegmentOr16 ((UINTN) PciCfgBase + PCI_COMMAND_OFFSET,
> EFI_PCI_COMMAND_MEMORY_SPACE);
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Disable SerialIo memory access
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoDisableMse (
>
> + IN UINT64 PciCfgBase
>
> + )
>
> +{
>
> + PciSegmentAnd16 ((UINTN) PciCfgBase + PCI_COMMAND_OFFSET,
> (UINT16) ~EFI_PCI_COMMAND_MEMORY_SPACE);
>
> +}
>
> +
>
> +/**
>
> + Disable SerialIo memory encoding
>
> + Designated for Pci modes
>
> +
>
> + @param[in] PciCfgBase Pci Config Offset
>
> + @param[in] RemoveTempBar Remove temporary mem base address or
> not
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoMmioDisable (
>
> + IN UINT64 PciCfgBase,
>
> + IN BOOLEAN RemoveBar
>
> + )
>
> +{
>
> + SerialIoDisableMse (PciCfgBase);
>
> +
>
> + if (RemoveBar == TRUE) {
>
> + PciSegmentWrite32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_BAR0_LOW, 0x0);
>
> + PciSegmentWrite32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_BAR0_HIGH, 0x0);
>
> + }
>
> +}
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2c.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2c.c
> new file mode 100644
> index 0000000000..7601081cfa
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2c.c
> @@ -0,0 +1,122 @@
> +/** @file
>
> + Common Serial IO Private Lib implementation - I2C part
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Library/PciSegmentLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Library/SerialIoPrivateLib.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <Register/PchRegs.h>
>
> +#include <Register/SerialIoRegs.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchLimits.h>
>
> +#include <Library/PchPciBdfLib.h>
>
> +
>
> +/**
>
> + Checks if I2C is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] I2cNumber Selects Serial IO I2C device
>
> +
>
> + @retval TRUE I2C is in hidden mode
>
> + @retval FALSE I2C is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoI2cHidden (
>
> + IN UINT8 I2cNumber
>
> + )
>
> +{
>
> + if (MmioRead16 (GetSerialIoI2cFixedPciCfgAddress (I2cNumber) +
> PCI_DEVICE_ID_OFFSET) == GetSerialIoI2cDeviceId (I2cNumber)) {
>
> + return TRUE;
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> + @param[in] I2cDeviceConfig SerialIo I2C Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoI2cBootHandler (
>
> + IN UINT8 I2cNumber,
>
> + IN SERIAL_IO_I2C_CONFIG *I2cDeviceConfig
>
> + )
>
> +{
>
> + UINT64 PciCfgBase;
>
> + BOOLEAN TurnOff;
>
> +
>
> + TurnOff = FALSE;
>
> +
>
> + if (I2cDeviceConfig->Mode == SerialIoI2cPci) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + if ((I2cDeviceConfig->Mode == SerialIoI2cDisabled) &&
> (SerialIoI2cFuncNumber (I2cNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoI2cDevNumber (I2cNumber)))
> {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + PciCfgBase = GetSerialIoI2cPciCfg (I2cNumber);
>
> + SerialIoSetD3 (PciCfgBase);
>
> + SerialIoMmioDisable (PciCfgBase, TRUE);
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] I2cNumber I2C Number
>
> + @param[in] I2cDeviceConfig SerialIo I2C Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoI2cS3Handler (
>
> + IN UINT8 I2cNumber,
>
> + IN SERIAL_IO_I2C_CONFIG *I2cDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + )
>
> +{
>
> + BOOLEAN TurnOff;
>
> + UINT64 PciCfgBase;
>
> +
>
> + *S3PciCfgBase = 0;
>
> + TurnOff = FALSE;
>
> +
>
> + if (I2cDeviceConfig->Mode == SerialIoI2cPci) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + if ((I2cDeviceConfig->Mode == SerialIoI2cDisabled) &&
> (SerialIoI2cFuncNumber (I2cNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoI2cDevNumber (I2cNumber)))
> {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + *S3PciCfgBase = GetSerialIoI2cS3PciBase (I2cNumber);
>
> + PciCfgBase = GetSerialIoI2cPciCfg (I2cNumber);
>
> + *Pme = PciSegmentRead32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_PME_CTRL_STS);
>
> + *Pme = *Pme | BIT0 | BIT1;
>
> + *Command = PciSegmentRead32 ((UINTN) PciCfgBase +
> PCI_COMMAND_OFFSET);
>
> + *Command = *Command &
> (UINT32)~(EFI_PCI_COMMAND_MEMORY_SPACE |
> EFI_PCI_COMMAND_BUS_MASTER);
>
> + }
>
> +}
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2cVer2.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2cVer2.c
> new file mode 100644
> index 0000000000..fd684ca2a9
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibI2cVer2.c
> @@ -0,0 +1,70 @@
> +/** @file
>
> + Serial IO I2C Private Lib implementation TigerLake specific.
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Register/SerialIoRegsVer2.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchReservedResources.h>
>
> +#include <PchLimits.h>
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mPchLpSerialIoI2cDevId [] =
> {
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C0_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C1_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C2_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C3_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C4_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_I2C5_DEVICE_ID
>
> +};
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED
> SERIAL_IO_CONTROLLER_DESCRIPTOR mSerialIoI2cFixedAddress [] = {
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x0000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x1000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x2000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x3000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x4000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x5000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x6000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x7000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x8000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x9000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0xA000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0xB000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0xC000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0xD000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0xE000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0xF000}
>
> +};
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] I2cNumber Serial IO device I2C number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoI2cFixedPciCfgAddress (
>
> + IN UINT8 I2cNumber
>
> + )
>
> +{
>
> + return mSerialIoI2cFixedAddress[I2cNumber].Bar1;
>
> +}
>
> +
>
> +
>
> +/**
>
> + Gets I2C Device Id
>
> +
>
> + @param[in] I2cNumber Serial IO device I2C number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoI2cDeviceId (
>
> + IN UINT8 I2cNumber
>
> + )
>
> +{
>
> + return mPchLpSerialIoI2cDevId[I2cNumber];
>
> +}
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibInternal.h
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibInternal.h
> new file mode 100644
> index 0000000000..b5e8aba9ac
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibInternal.h
> @@ -0,0 +1,20 @@
> +/** @file
>
> + Header file for SerialIoPrivateLibInternal.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +#ifndef _SERIAL_IO_PRIVATE_LIB_INTERNAL_H_
>
> +#define _SERIAL_IO_PRIVATE_LIB_INTERNAL_H_
>
> +
>
> +typedef struct {
>
> + UINT32 Bar0;
>
> + UINT32 Bar1;
>
> +} SERIAL_IO_CONTROLLER_DESCRIPTOR;
>
> +
>
> +typedef struct {
>
> + UINT8 DevNum;
>
> + UINT8 FuncNum;
>
> +} SERIAL_IO_BDF_NUMBERS;
>
> +
>
> +#endif
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpi.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpi.c
> new file mode 100644
> index 0000000000..a926941baf
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpi.c
> @@ -0,0 +1,122 @@
> +/** @file
>
> + Common Serial IO Private Lib implementation - SPI part
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Library/PciSegmentLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Library/SerialIoPrivateLib.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <Register/PchRegs.h>
>
> +#include <Register/SerialIoRegs.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchLimits.h>
>
> +#include <Library/PchPciBdfLib.h>
>
> +
>
> +/**
>
> + Checks if SPI is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] SpiNumber Selects Serial IO SPI device
>
> +
>
> + @retval TRUE SPI is in hidden mode
>
> + @retval FALSE SPI is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoSpiHidden (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + if (MmioRead16 (GetSerialIoSpiFixedPciCfgAddress (SpiNumber) +
> PCI_DEVICE_ID_OFFSET) == GetSerialIoSpiDeviceId (SpiNumber)) {
>
> + return TRUE;
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] SpiNumber SPI Number
>
> + @param[in] SpiDeviceConfig SerialIo SPI Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSpiBootHandler (
>
> + IN UINT8 SpiNumber,
>
> + IN SERIAL_IO_SPI_CONFIG *SpiDeviceConfig
>
> + )
>
> +{
>
> + UINT64 PciCfgBase;
>
> + BOOLEAN TurnOff;
>
> +
>
> + TurnOff = FALSE;
>
> +
>
> + if (SpiDeviceConfig->Mode == SerialIoSpiPci) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + if ((SpiDeviceConfig->Mode == SerialIoSpiDisabled) &&
> (SerialIoSpiFuncNumber (SpiNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoSpiDevNumber (SpiNumber)))
> {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + PciCfgBase = GetSerialIoSpiPciCfg (SpiNumber);
>
> + SerialIoSetD3 (PciCfgBase);
>
> + SerialIoMmioDisable (PciCfgBase, TRUE);
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] SpiNumber SPI Number
>
> + @param[in] SpiDeviceConfig SerialIo SPI Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoSpiS3Handler (
>
> + IN UINT8 SpiNumber,
>
> + IN SERIAL_IO_SPI_CONFIG *SpiDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + )
>
> +{
>
> + BOOLEAN TurnOff;
>
> + UINT64 PciCfgBase;
>
> +
>
> + *S3PciCfgBase = 0;
>
> + TurnOff = FALSE;
>
> +
>
> + if (SpiDeviceConfig->Mode == SerialIoSpiPci) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + if ((SpiDeviceConfig->Mode == SerialIoSpiDisabled) &&
> (SerialIoSpiFuncNumber (SpiNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoSpiDevNumber (SpiNumber)))
> {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + *S3PciCfgBase = GetSerialIoSpiS3PciBase (SpiNumber);
>
> + PciCfgBase = GetSerialIoSpiPciCfg (SpiNumber);
>
> + *Pme = PciSegmentRead32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_PME_CTRL_STS);
>
> + *Pme = *Pme | BIT0 | BIT1;
>
> + *Command = PciSegmentRead32 ((UINTN) PciCfgBase +
> PCI_COMMAND_OFFSET);
>
> + *Command = *Command &
> (UINT32)~(EFI_PCI_COMMAND_MEMORY_SPACE |
> EFI_PCI_COMMAND_BUS_MASTER);
>
> + }
>
> +}
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpiVer2.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpiVer2.c
> new file mode 100644
> index 0000000000..abda359202
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibSpiVer2.c
> @@ -0,0 +1,82 @@
> +/** @file
>
> + Serial IO Spi Private Lib implementation TigerLake specific.
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Register/SerialIoRegsVer2.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchReservedResources.h>
>
> +#include <PchLimits.h>
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mPchLpSerialIoSpiDevId [] =
> {
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_SPI0_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_SPI1_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_SPI2_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_SPI3_DEVICE_ID
>
> +};
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED
> SERIAL_IO_CONTROLLER_DESCRIPTOR mSerialIoSpiFixedAddress [] = {
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x10000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x11000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x12000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x13000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x14000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x15000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x16000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x17000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x18000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x19000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x1A000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x1B000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x1C000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x1D000}
>
> +};
>
> +
>
> +/**
>
> + Gets Fixed Base Address used for BAR0
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Config control offset
>
> +**/
>
> +UINT32
>
> +GetSerialIoSpiFixedMmioAddress (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + return mSerialIoSpiFixedAddress[SpiNumber].Bar0;
>
> +}
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoSpiFixedPciCfgAddress (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + return mSerialIoSpiFixedAddress[SpiNumber].Bar1;
>
> +}
>
> +
>
> +/**
>
> + Gets Spi Device Id
>
> +
>
> + @param[in] SpiNumber Serial IO device SPI number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoSpiDeviceId (
>
> + IN UINT8 SpiNumber
>
> + )
>
> +{
>
> + return mPchLpSerialIoSpiDevId[SpiNumber];
>
> +}
>
> +
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUart.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUart.c
> new file mode 100644
> index 0000000000..0f7d6513ce
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUart.c
> @@ -0,0 +1,136 @@
> +/** @file
>
> + Serial IO Private Lib implementation - UART part
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Library/PciSegmentLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Library/SerialIoPrivateLib.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <Register/PchRegs.h>
>
> +#include <Register/SerialIoRegs.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchLimits.h>
>
> +#include <Library/PchPciBdfLib.h>
>
> +
>
> +/**
>
> + Checks if UART is Hidden, and it's Pci Config space available
>
> +
>
> + @param[in] UartNumber Selects Serial IO UART device
>
> +
>
> + @retval TRUE UART is in hidden mode
>
> + @retval FALSE UART is not in hidden mode
>
> +**/
>
> +BOOLEAN
>
> +IsSerialIoUartHidden (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + if (MmioRead16 (GetSerialIoUartFixedPciCfgAddress (UartNumber) +
> PCI_DEVICE_ID_OFFSET) == GetSerialIoUartDeviceId (UartNumber)) {
>
> + return TRUE;
>
> + }
>
> + return FALSE;
>
> +}
>
> +
>
> +/**
>
> + Configures Serial IO Controller before control is passd to the OS
>
> +
>
> + @param[in] UartNumber UART Number
>
> + @param[in] UartDeviceConfig SerialIo UART Config
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoUartBootHandler (
>
> + IN UINT8 UartNumber,
>
> + IN SERIAL_IO_UART_CONFIG *UartDeviceConfig
>
> + )
>
> +{
>
> + UINT64 PciCfgBase;
>
> + BOOLEAN TurnOff;
>
> +
>
> + TurnOff = FALSE;
>
> +
>
> + //
>
> + // Even if Uart is Hidden and in D3 SerialIoUartLib is capable of setting D0
> during each write/read.
>
> + // In case it is required for Os Debug DBG2 must be set to TRUE.
>
> + //
>
> + if (UartDeviceConfig->Mode == SerialIoUartPci || UartDeviceConfig-
> >Mode == SerialIoUartHidden) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + //
>
> + // Uart in Com mode will be placed in D3 depending on PG configuration
> through ACPI _PS3
>
> + //
>
> +
>
> + if ((UartDeviceConfig->Mode == SerialIoUartDisabled) &&
> (SerialIoUartFuncNumber (UartNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoUartDevNumber
> (UartNumber))) {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (UartDeviceConfig->DBG2 == TRUE) {
>
> + TurnOff = FALSE;
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + PciCfgBase = GetSerialIoUartPciCfg (UartNumber);
>
> + SerialIoSetD3 (PciCfgBase);
>
> + if ((UartDeviceConfig->Mode == SerialIoUartPci) || (UartDeviceConfig-
> >Mode == SerialIoUartDisabled)) {
>
> + SerialIoMmioDisable (PciCfgBase, TRUE);
>
> + }
>
> + }
>
> +}
>
> +
>
> +/**
>
> + Sets Pme Control Status and Command register values required for S3 Boot
> Script
>
> +
>
> + @param[in] UartNumber UART Number
>
> + @param[in] UartDeviceConfig SerialIo UART Config
>
> + @param[in/out] S3PciCfgBase S3 Boot Script Pci Config Base
>
> + @param[in/out] Command Pci Command register data to save
>
> + @param[in/out] Pme Pci Pme Control register data to save
>
> +
>
> +**/
>
> +VOID
>
> +SerialIoUartS3Handler (
>
> + IN UINT8 UartNumber,
>
> + IN SERIAL_IO_UART_CONFIG *UartDeviceConfig,
>
> + IN OUT UINT64 *S3PciCfgBase,
>
> + IN OUT UINT32 *Command,
>
> + IN OUT UINT32 *Pme
>
> + )
>
> +{
>
> + BOOLEAN TurnOff;
>
> + UINT64 PciCfgBase;
>
> +
>
> + *S3PciCfgBase = 0;
>
> + TurnOff = FALSE;
>
> +
>
> + if (UartDeviceConfig->Mode == SerialIoUartPci) {
>
> + TurnOff = TRUE;
>
> + }
>
> +
>
> + if ((UartDeviceConfig->Mode == SerialIoUartDisabled) &&
> (SerialIoUartFuncNumber (UartNumber) == 0x0)) {
>
> + if (SerialIoHigherFunctionsEnabled (SerialIoUartDevNumber
> (UartNumber))) {
>
> + TurnOff = TRUE;
>
> + }
>
> + }
>
> +
>
> + if (TurnOff) {
>
> + *S3PciCfgBase = GetSerialIoUartS3PciBase (UartNumber);
>
> + PciCfgBase = GetSerialIoUartPciCfg (UartNumber);
>
> + *Pme = PciSegmentRead32 ((UINTN) PciCfgBase +
> R_SERIAL_IO_CFG_PME_CTRL_STS);
>
> + *Pme = *Pme | BIT0 | BIT1;
>
> + *Command = PciSegmentRead32 ((UINTN) PciCfgBase +
> PCI_COMMAND_OFFSET);
>
> + *Command = *Command &
> (UINT32)~(EFI_PCI_COMMAND_MEMORY_SPACE |
> EFI_PCI_COMMAND_BUS_MASTER);
>
> + }
>
> +}
>
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUartVer2.c
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUartVer2.c
> new file mode 100644
> index 0000000000..91280f8e90
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/IpBlock/SerialIo/LibraryPrivate/PeiDxeSm
> mSerialIoPrivateLib/SerialIoPrivateLibUartVer2.c
> @@ -0,0 +1,82 @@
> +/** @file
>
> + Serial IO Private Uart Lib implementation TigerLake specific.
>
> + All function in this library is available for PEI, DXE, and SMM,
>
> + But do not support UEFI RUNTIME environment call.
>
> +
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi/UefiBaseType.h>
>
> +#include <Library/IoLib.h>
>
> +#include <Library/BaseLib.h>
>
> +#include <Library/PchInfoLib.h>
>
> +#include <Library/SerialIoAccessLib.h>
>
> +#include <Register/SerialIoRegsVer2.h>
>
> +#include <IndustryStandard/Pci30.h>
>
> +#include <SerialIoPrivateLibInternal.h>
>
> +#include <PchReservedResources.h>
>
> +#include <PchLimits.h>
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mPchLpSerialIoUartDevId []
> = {
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_UART0_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_UART1_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_UART2_DEVICE_ID,
>
> + V_VER2_PCH_LP_SERIAL_IO_CFG_UART3_DEVICE_ID
>
> +};
>
> +
>
> +GLOBAL_REMOVE_IF_UNREFERENCED
> SERIAL_IO_CONTROLLER_DESCRIPTOR mSerialIoUartFixedAddress [] = {
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x1E000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x1F000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x20000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x21000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x22000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x23000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x24000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x25000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x26000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x27000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x28000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x29000},
>
> + {PCH_SERIAL_IO_BASE_ADDRESS + 0x2A000,
> PCH_SERIAL_IO_BASE_ADDRESS + 0x2B000}
>
> +};
>
> +
>
> +/**
>
> + Gets Fixed Base Address used for BAR0
>
> +
>
> + @param[in] UartNumber Serial IO device UART number
>
> +
>
> + @retval Config control offset
>
> +**/
>
> +UINT32
>
> +GetSerialIoUartFixedMmioAddress (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + return mSerialIoUartFixedAddress[UartNumber].Bar0;
>
> +}
>
> +
>
> +/**
>
> + Gets Fixed Address used for Pci Config Space manipulation
>
> +
>
> + @param[in] UartNumber Serial IO device UART number
>
> +
>
> + @retval Pci Config Address
>
> +**/
>
> +UINT32
>
> +GetSerialIoUartFixedPciCfgAddress (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + return mSerialIoUartFixedAddress[UartNumber].Bar1;
>
> +}
>
> +
>
> +/**
>
> + Gets Uarts Device Id
>
> +
>
> + @param[in] UartNumbe Serial IO device UART number
>
> +
>
> + @retval Device Id
>
> +**/
>
> +UINT16
>
> +GetSerialIoUartDeviceId (
>
> + IN UINT8 UartNumber
>
> + )
>
> +{
>
> + return mPchLpSerialIoUartDevId[UartNumber];
>
> +}
>
> --
> 2.24.0.windows.2
next prev parent reply other threads:[~2021-02-04 3:56 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-01 1:36 [PATCH 01/40] TigerlakeSiliconPkg: Add package and Include/ConfigBlock headers Heng Luo
2021-02-01 1:36 ` [PATCH 02/40] TigerlakeSiliconPkg/Include: Add Library, PPI and Protocol include headers Heng Luo
2021-02-04 3:51 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 03/40] TigerlakeSiliconPkg/Include: Add Pins, Register and other " Heng Luo
2021-02-04 3:52 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 04/40] TigerlakeSiliconPkg/Cpu: Add Include headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 05/40] TigerlakeSiliconPkg/Pch: Add include headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 06/40] TigerlakeSiliconPkg/Pch: Add IncludePrivate headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 07/40] TigerlakeSiliconPkg/SystemAgent: Add include headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 08/40] TigerlakeSiliconPkg/SystemAgent: Add IncludePrivate headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 09/40] TigerlakeSiliconPkg/Fru: Add TglCpu/Include headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 10/40] TigerlakeSiliconPkg/Fru: Add TglCpu/IncludePrivate headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 11/40] TigerlakeSiliconPkg/Fru: Add TglPch/Include headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 12/40] TigerlakeSiliconPkg/Fru: Add TglPch/IncludePrivate headers Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 13/40] TigerlakeSiliconPkg/IpBlock: Add Cnvi component Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 14/40] TigerlakeSiliconPkg/IpBlock: Add CpuPcieRp component Heng Luo
2021-02-04 3:53 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 15/40] TigerlakeSiliconPkg/IpBlock: Add Espi component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 16/40] TigerlakeSiliconPkg/IpBlock: Add Gbe component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 17/40] TigerlakeSiliconPkg/IpBlock: Add Gpio component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 18/40] TigerlakeSiliconPkg/IpBlock: Add Graphics component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 19/40] TigerlakeSiliconPkg/IpBlock: Add Hda component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 20/40] TigerlakeSiliconPkg/IpBlock: Add HostBridge component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 21/40] TigerlakeSiliconPkg/IpBlock: Add P2sb component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 22/40] TigerlakeSiliconPkg/IpBlock: Add PchDmi component Heng Luo
2021-02-04 3:54 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 23/40] TigerlakeSiliconPkg/IpBlock: Add PcieRp component Heng Luo
2021-02-04 3:55 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 24/40] TigerlakeSiliconPkg/IpBlock: Add Pmc component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 25/40] TigerlakeSiliconPkg/IpBlock: Add Psf component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 26/40] TigerlakeSiliconPkg/IpBlock: Add Sata component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 27/40] TigerlakeSiliconPkg/IpBlock: Add SerialIo component Heng Luo
2021-02-04 3:56 ` Nate DeSimone [this message]
2021-02-01 1:36 ` [PATCH 28/40] TigerlakeSiliconPkg/IpBlock: Add Smbus component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 29/40] TigerlakeSiliconPkg/IpBlock: Add Spi component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 30/40] TigerlakeSiliconPkg/IpBlock: Add Vtd component Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 31/40] TigerlakeSiliconPkg/Library: Add package common library instances Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 32/40] TigerlakeSiliconPkg/Pch: Add Pch " Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 33/40] TigerlakeSiliconPkg/Pch: Add Pch private " Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 34/40] TigerlakeSiliconPkg/SystemAgent: Add Acpi Tables and " Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 35/40] TigerlakeSiliconPkg/Fru/TglCpu: Add CpuPcieRp and Vtd " Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 36/40] TigerlakeSiliconPkg/Pch: Add Pch modules Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 37/40] TigerlakeSiliconPkg/SystemAgent: Add SystemAgent modules Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 38/40] TigerlakeSiliconPkg/Fru: Add Fru DSC files Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 39/40] TigerlakeSiliconPkg: Add package " Heng Luo
2021-02-04 3:56 ` Nate DeSimone
2021-02-01 1:36 ` [PATCH 40/40] Maintainers.txt: Add TigerlakeSiliconPkg maintainers Heng Luo
2021-02-04 3:51 ` Nate DeSimone
2021-02-04 8:24 ` Heng Luo
2021-02-04 3:51 ` [PATCH 01/40] TigerlakeSiliconPkg: Add package and Include/ConfigBlock headers Nate DeSimone
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BN6PR1101MB2147A95D97DE82214E22740BCDB39@BN6PR1101MB2147.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox