/** @file Header file for PCH Serial IO Lib implementation. Copyright (c) 2017, 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, PchSerialIoIndexUart0, PchSerialIoIndexUart1, PchSerialIoIndexUart2, PchSerialIoIndexMax } PCH_SERIAL_IO_CONTROLLER; typedef enum { PchSerialIoDisabled, PchSerialIoAcpi, PchSerialIoPci, PchSerialIoAcpiHidden, PchSerialIoLegacyUart, PchSerialIoSkipInit } PCH_SERIAL_IO_MODE; enum PCH_LP_SERIAL_IO_VOLTAGE_SEL { PchSerialIoIs33V = 0, PchSerialIoIs18V }; 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 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 @param[in] DeviceMode @retval None **/ VOID ConfigureSerialIoController ( IN PCH_SERIAL_IO_CONTROLLER Controller, IN PCH_SERIAL_IO_MODE DeviceMode ); /** Initializes GPIO pins used by SerialIo I2C devices @param[in] Controller @param[in] DeviceMode @param[in] I2cVoltage @retval None **/ VOID SerialIoI2cGpioInit ( IN PCH_SERIAL_IO_CONTROLLER Controller, IN PCH_SERIAL_IO_MODE DeviceMode, IN UINT32 I2cVoltage ); /** Initializes GPIO pins used by SerialIo SPI devices @param[in] Controller @param[in] DeviceMode @param[in] SpiCsPolarity @retval None **/ VOID SerialIoSpiGpioInit ( IN PCH_SERIAL_IO_CONTROLLER Controller, IN PCH_SERIAL_IO_MODE DeviceMode, IN UINT32 SpiCsPolarity ); /** Initializes GPIO pins used by SerialIo devices @param[in] Controller @param[in] DeviceMode @param[in] HardwareFlowControl @retval None **/ VOID SerialIoUartGpioInit ( IN PCH_SERIAL_IO_CONTROLLER Controller, IN PCH_SERIAL_IO_MODE DeviceMode, IN BOOLEAN HardwareFlowControl ); /** Finds PCI Device Number of SerialIo devices. SerialIo devices' BDF is configurable @param[in] SerialIoNumber 0=I2C0, ..., 11=UART2 @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 0=I2C0, ..., 11=UART2 @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 0=I2C0, ..., 11=UART2 @param[in] BarNumber 0=BAR0, 1=BAR1 @retval SerialIo Bar value **/ UINTN FindSerialIoBar ( IN PCH_SERIAL_IO_CONTROLLER SerialIoDevice, IN UINT8 BarNumber ); #endif // _PEI_DXE_SMM_PCH_SERIAL_IO_LIB_H_