/** @file PCH Serial IO Lib implementation Cannon Lake specific. All function in this library is available for PEI, DXE, and SMM, But do not support UEFI RUNTIME environment call. Copyright (c) 2019 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PchSerialIoLibInternal.h" GLOBAL_REMOVE_IF_UNREFERENCED CHAR8 mCnlAcpiHid[PCH_MAX_SERIALIO_CONTROLLERS][SERIALIO_HID_LENGTH] = { "INT34B2", "INT34B3", "INT34B4", "INT34B5", "INT34B6", "INT34B7", "INT34B0", "INT34B1", "INT34BC", "INT34B8", "INT34B9", "INT34BA" }; GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mCnlPchLpSerialIoId [PCH_MAX_SERIALIO_CONTROLLERS] = { V_CNL_PCH_LP_SERIAL_IO_CFG_I2C0_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_I2C1_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_I2C2_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_I2C3_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_I2C4_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_I2C5_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_SPI0_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_SPI1_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_UART0_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_UART1_DEVICE_ID, V_CNL_PCH_LP_SERIAL_IO_CFG_UART2_DEVICE_ID }; GLOBAL_REMOVE_IF_UNREFERENCED UINT16 mCnlPchHSerialIoId [PCH_MAX_SERIALIO_CONTROLLERS] = { V_CNL_PCH_H_SERIAL_IO_CFG_I2C0_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_I2C1_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_I2C2_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_I2C3_DEVICE_ID, 0, 0, V_CNL_PCH_H_SERIAL_IO_CFG_SPI0_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_SPI1_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_UART0_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_UART1_DEVICE_ID, V_CNL_PCH_H_SERIAL_IO_CFG_UART2_DEVICE_ID }; GLOBAL_REMOVE_IF_UNREFERENCED SERIAL_IO_BDF_NUMBERS mSerialIoBdf [PCH_MAX_SERIALIO_CONTROLLERS] = { {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C0, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C0}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C1, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C1}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C2, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C2}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C3, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C3}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C4, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C4}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C5, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C5}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI0, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI0}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI1, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI1}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART0, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART0}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART1, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART1}, {PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART2, PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART2} }; /** 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 ) { if (IsPchH ()) { return PchSerialIoIndexI2C3; } else { return PchSerialIoIndexI2C5; } } /** 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 ) { PCH_SERIAL_IO_CONTROLLER Controller; for (Controller = 0; Controller < GetPchMaxSerialIoControllersNum (); Controller++) { if ((IsPchLp () && (PciDevId == mCnlPchLpSerialIoId[Controller])) || (IsPchH () && (PciDevId == mCnlPchHSerialIoId[Controller]))) { *Number = Controller; return TRUE; } } return FALSE; } /** Finds PCI Device Number of SerialIo devices. @param[in] SerialIoNumber Serial IO device @retval SerialIo device number **/ UINT8 GetSerialIoDeviceNumber ( IN PCH_SERIAL_IO_CONTROLLER SerialIoNumber ) { return mSerialIoBdf[SerialIoNumber].DevNum; } /** Finds PCI Function Number of SerialIo devices. @param[in] SerialIoNumber Serial IO device @retval SerialIo funciton number **/ UINT8 GetSerialIoFunctionNumber ( IN PCH_SERIAL_IO_CONTROLLER SerialIoNumber ) { return mSerialIoBdf[SerialIoNumber].FuncNum; } /** 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 ) { return mCnlAcpiHid[Number]; }