/** @file Header file for PCH Serial IO Lib implementation. Copyright (c) 2019 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _PCH_SERIAL_IO_LIB_H_ #define _PCH_SERIAL_IO_LIB_H_ typedef enum { PchSerialIoIndexI2C0, PchSerialIoIndexI2C1, PchSerialIoIndexI2C2, PchSerialIoIndexI2C3, PchSerialIoIndexI2C4, PchSerialIoIndexI2C5, PchSerialIoIndexSpi0, PchSerialIoIndexSpi1, PchSerialIoIndexSpi2, PchSerialIoIndexUart0, PchSerialIoIndexUart1, PchSerialIoIndexUart2, PchSerialIoIndexMax } PCH_SERIAL_IO_CONTROLLER; typedef enum { PchSerialIoDisabled, PchSerialIoPci, PchSerialIoAcpi, PchSerialIoHidden } PCH_SERIAL_IO_MODE; typedef enum { SERIAL_IO_UNKNOWN = 0, SERIAL_IO_I2C, SERIAL_IO_SPI, SERIAL_IO_UART } PCH_SERIAL_IO_CONTROLLER_TYPE; enum PCH_LP_SERIAL_IO_CS_POLARITY { PchSerialIoCsActiveLow = 0, PchSerialIoCsActiveHigh = 1 }; enum PCH_LP_SERIAL_IO_HW_FLOW_CTRL { PchSerialIoHwFlowCtrlDisabled = 0, PchSerialIoHwFlowControlEnabled = 1 }; #define SERIALIO_HID_LENGTH 8 // including null terminator #define SERIALIO_UID_LENGTH 1 #define SERIALIO_CID_LENGTH 1 #define SERIALIO_TOTAL_ID_LENGTH SERIALIO_HID_LENGTH+SERIALIO_UID_LENGTH+SERIALIO_CID_LENGTH /** Returns index of the last i2c controller @param[in] Number Number of SerialIo controller @retval Index of I2C controller **/ PCH_SERIAL_IO_CONTROLLER GetMaxI2cNumber ( VOID ); /** Returns string with AcpiHID assigned to selected SerialIo controller @param[in] Number Number of SerialIo controller @retval pointer to 8-byte string **/ CHAR8* GetSerialIoAcpiHid ( IN PCH_SERIAL_IO_CONTROLLER Number ); /** Checks if given Serial IO Controller Function equals 0 @param[in] SerialIoNumber Serial IO device @retval TRUE if SerialIO Function is equal to 0 FALSE if Function is higher then 0 **/ BOOLEAN IsSerialIoFunctionZero ( IN PCH_SERIAL_IO_CONTROLLER SerialIoNumber ); /** Checks if Device with given PciDeviceId is one of SerialIo controllers If yes, its number is returned through Number parameter, otherwise Number is not updated @param[in] PciDevId Device ID @param[out] Number Number of SerialIo controller @retval TRUE Yes it is a SerialIo controller @retval FALSE No it isn't a SerialIo controller **/ BOOLEAN IsSerialIoPciDevId ( IN UINT16 PciDevId, OUT PCH_SERIAL_IO_CONTROLLER *Number ); /** Checks if Device with given AcpiHID string is one of SerialIo controllers If yes, its number is returned through Number parameter, otherwise Number is not updated @param[in] AcpiHid String @param[out] Number Number of SerialIo controller @retval TRUE yes it is a SerialIo controller @retval FALSE no it isn't a SerialIo controller **/ BOOLEAN IsSerialIoAcpiHid ( IN CHAR8 *AcpiHid, OUT PCH_SERIAL_IO_CONTROLLER *Number ); /** Configures Serial IO Controller @param[in] Controller Serial IO controller number @param[in] DeviceMode Device operation mode @param[in] PsfDisable Disable device at PSF level @retval None **/ VOID ConfigureSerialIoController ( IN PCH_SERIAL_IO_CONTROLLER Controller, IN PCH_SERIAL_IO_MODE DeviceMode, IN BOOLEAN PsfDisable ); /** Returns Serial IO Controller Type I2C, SPI or UART @param[in] Number Number of SerialIo controller @retval I2C, SPI or UART @retval UNKNOWN - in case if undefined controller **/ PCH_SERIAL_IO_CONTROLLER_TYPE GetSerialIoControllerType ( IN PCH_SERIAL_IO_CONTROLLER Controller ); /** Finds PCI Device Number of SerialIo devices. SerialIo devices' BDF is configurable @param[in] SerialIoNumber Serial IO device @retval SerialIo device number **/ UINT8 GetSerialIoDeviceNumber ( IN PCH_SERIAL_IO_CONTROLLER SerialIoNumber ); /** Finds PCI Function Number of SerialIo devices. SerialIo devices' BDF is configurable @param[in] SerialIoNumber Serial IO device @retval SerialIo funciton number **/ UINT8 GetSerialIoFunctionNumber ( IN PCH_SERIAL_IO_CONTROLLER SerialIoNumber ); /** Finds BAR values of SerialIo devices. SerialIo devices can be configured to not appear on PCI so traditional method of reading BAR might not work. @param[in] SerialIoDevice Serial IO device @param[in] BarNumber 0=BAR0, 1=BAR1 @retval SerialIo Bar value **/ UINTN FindSerialIoBar ( IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice, IN UINT8 BarNumber ); /** Checks if given device corresponds to any of LPSS Devices @param[in] DeviceNumber device number @param[in] FunctionNumber function number @retval TRUE if SerialIO Device/Function Number is equal to any of LPSS devices FALSE Device/Function is not in Serial IO scope **/ BOOLEAN IsSerialIoDevice ( IN UINT8 DeviceNumber, IN UINT8 FunctionNumber ); /** Checks if given Serial IO Controller is enabled or not @param[in] DeviceNumber device number @param[in] FunctionNumber function number @retval TRUE TRUE if given serial io device is enabled. @retval FALSE FALSE if given serial io device is disabled. **/ BOOLEAN IsSerialIoDeviceEnabled ( IN UINT8 DeviceNumber, IN UINT8 FunctionNumber ); /** Gets Pci Config control offset @param[in] DeviceNumber device number @param[in] FunctionNumber function number @retval CfgCtrAddr Offset of Pci config control 0 if Device and Function do not correspond to Serial IO **/ UINT16 GetSerialIoConfigControlOffset ( IN UINT8 DeviceNumber, IN UINT8 FunctionNumber ); #endif // _PEI_DXE_SMM_PCH_SERIAL_IO_LIB_H_