/** @file PCH PCIe Bus Device Function Library. All functions from this library are available in PEI, DXE, and SMM, But do not support UEFI RUNTIME environment call. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include /** Check if a Device is present for PCH FRU If the data is defined for PCH RFU return it If the data is not defined (Device is NOT present) assert. @param[in] DataToCheck Device or Function number to check @retval Device or Function number value if defined for PCH FRU 0xFF if not present in PCH FRU **/ UINT8 CheckAndReturn ( UINT8 DataToCheck ) { if (DataToCheck == NOT_PRESENT) { ASSERT (FALSE); } return DataToCheck; } /** Get eSPI controller address that can be passed to the PCI Segment Library functions. @retval eSPI controller address in PCI Segment Library representation **/ UINT64 EspiPciCfgBase ( VOID ) { ASSERT (PCI_DEVICE_NUMBER_PCH_ESPI != NOT_PRESENT); return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_ESPI, PCI_FUNCTION_NUMBER_PCH_ESPI, 0 ); } /** Returns Gigabit Ethernet PCI Device Number @retval GbE device number **/ UINT8 GbeDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_GBE); } /** Returns Gigabit Ethernet PCI Function Number @retval GbE function number **/ UINT8 GbeFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_GBE); } /** Get GbE controller address that can be passed to the PCI Segment Library functions. @retval GbE controller address in PCI Segment Library representation **/ UINT64 GbePciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, GbeDevNumber (), GbeFuncNumber (), 0 ); } /** Get HDA PCI device number @retval PCI dev number **/ UINT8 HdaDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_HDA); } /** Get HDA PCI function number @retval PCI fun number **/ UINT8 HdaFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_HDA); } /** Get HDA controller address that can be passed to the PCI Segment Library functions. @retval HDA controller address in PCI Segment Library representation **/ UINT64 HdaPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, HdaDevNumber (), HdaFuncNumber (), 0 ); } /** Get P2SB PCI device number @retval PCI dev number **/ UINT8 P2sbDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_P2SB); } /** Get P2SB PCI function number @retval PCI fun number **/ UINT8 P2sbFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_P2SB); } /** Get P2SB controller address that can be passed to the PCI Segment Library functions. @retval P2SB controller address in PCI Segment Library representation **/ UINT64 P2sbPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, P2sbDevNumber (), P2sbFuncNumber (), 0 ); } /** Returns PCH SPI Device number @retval UINT8 PCH SPI Device number **/ UINT8 SpiDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SPI); } /** Returns PCH SPI Function number @retval UINT8 PCH SPI Function number **/ UINT8 SpiFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SPI); } /** Returns PCH SPI PCI Config Space base address @retval UINT64 PCH SPI Config Space base address **/ UINT64 SpiPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SpiDevNumber (), SpiFuncNumber (), 0 ); } /** Get XHCI controller PCIe Device Number @retval XHCI controller PCIe Device Number **/ UINT8 PchXhciDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_XHCI); } /** Get XHCI controller PCIe Function Number @retval XHCI controller PCIe Function Number **/ UINT8 PchXhciFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_XHCI); } /** Get XHCI controller address that can be passed to the PCI Segment Library functions. @retval XHCI controller address in PCI Segment Library representation **/ UINT64 PchXhciPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PchXhciDevNumber (), PchXhciFuncNumber (), 0 ); } /** Get XDCI controller PCIe Device Number @retval XDCI controller PCIe Device Number **/ UINT8 PchXdciDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_XDCI); } /** Get XDCI controller PCIe Function Number @retval XDCI controller PCIe Function Number **/ UINT8 PchXdciFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_XDCI); } /** Get XDCI controller address that can be passed to the PCI Segment Library functions. @retval XDCI controller address in PCI Segment Library representation **/ UINT64 PchXdciPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PchXdciDevNumber (), PchXdciFuncNumber (), 0 ); } /** Return Smbus Device Number @retval Smbus Device Number **/ UINT8 SmbusDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SMBUS); } /** Return Smbus Function Number @retval Smbus Function Number **/ UINT8 SmbusFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SMBUS); } /** Get SMBUS controller address that can be passed to the PCI Segment Library functions. @retval SMBUS controller address in PCI Segment Library representation **/ UINT64 SmbusPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SmbusDevNumber (), SmbusFuncNumber (), 0 ); } /** Return DMA Smbus Device Number @retval DMA Smbus Device Number **/ UINT8 SmbusDmaDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_DMA_SMBUS); } /** Return DMA Smbus Function Number @retval DMA Smbus Function Number **/ UINT8 SmbusDmaFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_DMA_SMBUS); } /** Get DMA SMBUS controller address that can be passed to the PCI Segment Library functions. @retval DMA SMBUS controller address in PCI Segment Library representation **/ UINT64 SmbusDmaPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SmbusDmaDevNumber (), SmbusDmaFuncNumber (), 0 ); } /** Get SATA controller PCIe Device Number @param[in] SataCtrlIndex SATA controller index @retval SATA controller PCIe Device Number **/ UINT8 SataDevNumber ( IN UINT32 SataCtrlIndex ) { ASSERT (SataCtrlIndex < MAX_SATA_CONTROLLER); if (SataCtrlIndex == 0) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SATA_1); } else if (SataCtrlIndex == 1) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SATA_2); } else if (SataCtrlIndex == 2) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SATA_3); } else { ASSERT (FALSE); return 0xFF; } } /** Get SATA controller PCIe Function Number @param[in] SataCtrlIndex SATA controller index @retval SATA controller PCIe Function Number **/ UINT8 SataFuncNumber ( IN UINT32 SataCtrlIndex ) { ASSERT (SataCtrlIndex < MAX_SATA_CONTROLLER); if (SataCtrlIndex == 0) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SATA_1); } else if (SataCtrlIndex == 1) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SATA_2); } else if (SataCtrlIndex == 2) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SATA_3); } else { ASSERT (FALSE); return 0xFF; } } /** Get SATA controller address that can be passed to the PCI Segment Library functions. @param[in] SataCtrlIndex SATA controller index @retval SATA controller address in PCI Segment Library representation **/ UINT64 SataPciCfgBase ( IN UINT32 SataCtrlIndex ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SataDevNumber (SataCtrlIndex), SataFuncNumber (SataCtrlIndex), 0 ); } /** Get LPC controller PCIe Device Number @retval LPC controller PCIe Device Number **/ UINT8 LpcDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_LPC); } /** Get LPC controller PCIe Function Number @retval LPC controller PCIe Function Number **/ UINT8 LpcFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_LPC); } /** Returns PCH LPC device PCI base address. @retval PCH LPC PCI base address. **/ UINT64 LpcPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, LpcDevNumber (), LpcFuncNumber (), 0 ); } /** Get Thermal Device PCIe Device Number @retval Thermal Device PCIe Device Number **/ UINT8 ThermalDevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_THERMAL); } /** Get Thermal Device PCIe Function Number @retval Thermal Device PCIe Function Number **/ UINT8 ThermalFuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_THERMAL); } /** Returns Thermal Device PCI base address. @retval Thermal Device PCI base address. **/ UINT64 ThermalPciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, ThermalDevNumber (), ThermalFuncNumber (), 0 ); } /** Get Serial IO I2C controller PCIe Device Number @param[in] I2cNumber Serial IO I2C controller index @retval Serial IO I2C controller PCIe Device Number **/ UINT8 SerialIoI2cDevNumber ( IN UINT8 I2cNumber ) { if (GetPchMaxSerialIoI2cControllersNum () <= I2cNumber) { ASSERT (FALSE); return 0xFF; } switch (I2cNumber) { case 0: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C0); case 1: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C1); case 2: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C2); case 3: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C3); case 4: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C4); case 5: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C5); case 6: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C6); case 7: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_I2C7); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO I2C controller PCIe Function Number @param[in] I2cNumber Serial IO I2C controller index @retval Serial IO I2C controller PCIe Function Number **/ UINT8 SerialIoI2cFuncNumber ( IN UINT8 I2cNumber ) { if (GetPchMaxSerialIoI2cControllersNum () <= I2cNumber) { ASSERT (FALSE); return 0xFF; } switch (I2cNumber) { case 0: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C0); case 1: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C1); case 2: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C2); case 3: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C3); case 4: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C4); case 5: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C5); case 6: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C6); case 7: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_I2C7); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO I2C controller address that can be passed to the PCI Segment Library functions. @param[in] I2cNumber Serial IO I2C controller index @retval Serial IO I2C controller address in PCI Segment Library representation **/ UINT64 SerialIoI2cPciCfgBase ( IN UINT8 I2cNumber ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SerialIoI2cDevNumber (I2cNumber), SerialIoI2cFuncNumber (I2cNumber), 0 ); } /** Get Serial IO SPI controller PCIe Device Number @param[in] I2cNumber Serial IO SPI controller index @retval Serial IO SPI controller PCIe Device Number **/ UINT8 SerialIoSpiDevNumber ( IN UINT8 SpiNumber ) { if (GetPchMaxSerialIoSpiControllersNum () <= SpiNumber) { ASSERT (FALSE); return 0xFF; } switch (SpiNumber) { case 0: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI0); case 1: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI1); case 2: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI2); case 3: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI3); case 4: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI4); case 5: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI5); case 6: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_SPI6); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO SPI controller PCIe Function Number @param[in] SpiNumber Serial IO SPI controller index @retval Serial IO SPI controller PCIe Function Number **/ UINT8 SerialIoSpiFuncNumber ( IN UINT8 SpiNumber ) { if (GetPchMaxSerialIoSpiControllersNum () <= SpiNumber) { ASSERT (FALSE); return 0xFF; } switch (SpiNumber) { case 0: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI0); case 1: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI1); case 2: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI2); case 3: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI3); case 4: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI4); case 5: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI5); case 6: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_SPI6); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO SPI controller address that can be passed to the PCI Segment Library functions. @param[in] SpiNumber Serial IO SPI controller index @retval Serial IO SPI controller address in PCI Segment Library representation **/ UINT64 SerialIoSpiPciCfgBase ( IN UINT8 SpiNumber ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SerialIoSpiDevNumber (SpiNumber), SerialIoSpiFuncNumber (SpiNumber), 0 ); } /** Get Serial IO UART controller PCIe Device Number @param[in] UartNumber Serial IO UART controller index @retval Serial IO UART controller PCIe Device Number **/ UINT8 SerialIoUartDevNumber ( IN UINT8 UartNumber ) { if (GetPchMaxSerialIoUartControllersNum () <= UartNumber) { ASSERT (FALSE); return 0xFF; } switch (UartNumber) { case 0: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART0); case 1: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART1); case 2: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART2); case 3: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART3); case 4: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART4); case 5: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART5); case 6: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_SERIAL_IO_UART6); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO UART controller PCIe Function Number @param[in] UartNumber Serial IO UART controller index @retval Serial IO UART controller PCIe Function Number **/ UINT8 SerialIoUartFuncNumber ( IN UINT8 UartNumber ) { if (GetPchMaxSerialIoUartControllersNum () <= UartNumber) { ASSERT (FALSE); return 0xFF; } switch (UartNumber) { case 0: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART0); case 1: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART1); case 2: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART2); case 3: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART3); case 4: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART4); case 5: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART5); case 6: return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_SERIAL_IO_UART6); default: ASSERT (FALSE); return 0xFF; } } /** Get Serial IO UART controller address that can be passed to the PCI Segment Library functions. @param[in] UartNumber Serial IO UART controller index @retval Serial IO UART controller address in PCI Segment Library representation **/ UINT64 SerialIoUartPciCfgBase ( IN UINT8 UartNumber ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, SerialIoUartDevNumber (UartNumber), SerialIoUartFuncNumber (UartNumber), 0 ); } /** Get PCH PCIe controller PCIe Device Number @param[in] RpIndex Root port physical number. (0-based) @retval PCH PCIe controller PCIe Device Number **/ UINT8 PchPcieRpDevNumber ( IN UINTN RpIndex ) { if (RpIndex >= GetPchMaxPciePortNum ()) { ASSERT (FALSE); return 0xFF; } switch (RpIndex) { case 0: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_1); case 1: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_2); case 2: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_3); case 3: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_4); case 4: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_5); case 5: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_6); case 6: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_7); case 7: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_8); case 8: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_9); case 9: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_10); case 10: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_11); case 11: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_12); case 12: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_13); case 13: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_14); case 14: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_15); case 15: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_16); case 16: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_17); case 17: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_18); case 18: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_19); case 19: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_20); case 20: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_21); case 21: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_22); case 22: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_23); case 23: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_24); case 24: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_25); case 25: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_26); case 26: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_27); case 27: return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_PCIE_ROOT_PORT_28); default: ASSERT (FALSE); return 0xFF; } } /** Get PCH PCIe controller PCIe Function Number Note: For Client PCH generations Function Number can be various depending on "Root Port Function Swapping". For such cases Function Number MUST be obtain from proper register. For Server PCHs we have no "Root Port Function Swapping" and we can return fixed Function Number. To address this difference in this, PCH generation independent, library we should call specific function in PchPcieRpLib. @param[in] RpIndex Root port physical number. (0-based) @retval PCH PCIe controller PCIe Function Number **/ UINT8 PchPcieRpFuncNumber ( IN UINTN RpIndex ) { UINTN Device; UINTN Function; GetPchPcieRpDevFun (RpIndex, &Device, &Function); return (UINT8)Function; } /** Get PCH PCIe controller address that can be passed to the PCI Segment Library functions. @param[in] RpIndex PCH PCIe Root Port physical number. (0-based) @retval PCH PCIe controller address in PCI Segment Library representation **/ UINT64 PchPcieRpPciCfgBase ( IN UINT32 RpIndex ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PchPcieRpDevNumber (RpIndex), PchPcieRpFuncNumber (RpIndex), 0 ); } /** Get HECI1 PCI device number @retval PCI dev number **/ UINT8 PchHeci1DevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_HECI1); } /** Get HECI1 PCI function number @retval PCI fun number **/ UINT8 PchHeci1FuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_HECI1); } /** Get HECI1 controller address that can be passed to the PCI Segment Library functions. @retval HECI1 controller address in PCI Segment Library representation **/ UINT64 PchHeci1PciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PchHeci1DevNumber (), PchHeci1FuncNumber (), 0 ); } /** Get HECI3 PCI device number @retval PCI dev number **/ UINT8 PchHeci3DevNumber ( VOID ) { return CheckAndReturn (PCI_DEVICE_NUMBER_PCH_HECI3); } /** Get HECI3 PCI function number @retval PCI fun number **/ UINT8 PchHeci3FuncNumber ( VOID ) { return CheckAndReturn (PCI_FUNCTION_NUMBER_PCH_HECI3); } /** Get HECI3 controller address that can be passed to the PCI Segment Library functions. @retval HECI3 controller address in PCI Segment Library representation **/ UINT64 PchHeci3PciCfgBase ( VOID ) { return PCI_SEGMENT_LIB_ADDRESS ( DEFAULT_PCI_SEGMENT_NUMBER_PCH, DEFAULT_PCI_BUS_NUMBER_PCH, PchHeci3DevNumber (), PchHeci3FuncNumber (), 0 ); }