/** @file Copyright (c) 2018, 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 extern EFI_GUID gPeiSpiPpiGuid; /** Check whether GbE region is valid Check SPI region directly since GbE might be disabled in SW. @retval TRUE Gbe Region is valid @retval FALSE Gbe Region is invalid **/ BOOLEAN PchIsGbeRegionValid ( VOID ) { UINT32 SpiBar; SpiBar = MmioRead32 (MmPciBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SPI, PCI_FUNCTION_NUMBER_PCH_SPI) + R_PCH_SPI_BAR0) & ~B_PCH_SPI_BAR0_MASK; ASSERT (SpiBar != 0); if (MmioRead32 (SpiBar + R_PCH_SPI_FREG3_GBE) != B_PCH_SPI_FREGX_BASE_MASK) { return TRUE; } return FALSE; } /** Returns GbE over PCIe port number based on a soft strap. @return Root port number (1-based) @retval 0 GbE over PCIe disabled **/ UINT32 PchGetGbePortNumber ( VOID ) { UINT32 GbePortSel; UINT32 PcieStrapFuse; PchPcrRead32 (PID_FIAWM26, R_PCH_PCR_FIA_STRPFUSECFG1_REG_BASE, &PcieStrapFuse); if ((PcieStrapFuse & B_PCH_PCR_FIA_STRPFUSECFG1_GBE_PCIE_PEN) == 0) { return 0; // GbE disabled } GbePortSel = (PcieStrapFuse & B_PCH_PCR_FIA_STRPFUSECFG1_GBE_PCIEPORTSEL) >> N_PCH_PCR_FIA_STRPFUSECFG1_GBE_PCIEPORTSEL; switch (GbePortSel) { case 0: return 3 + 1; case 1: return 4 + 1; case 2: return 5 + 1; case 3: return 8 + 1; case 4: return 11 + 1; } DEBUG((DEBUG_ERROR, "Invalid GbE port\n")); ASSERT (FALSE); return 0; } /** Check whether LAN controller is enabled in the platform. @retval TRUE GbE is enabled @retval FALSE GbE is disabled **/ BOOLEAN PchIsGbePresent ( VOID ) { UINT32 SoftstrapVal; EFI_SPI_PROTOCOL *SpiProtocol = NULL; EFI_STATUS Status; UINTN GbePciBase; if (PchIsDwrFlow() == TRUE) { return FALSE; } GbePciBase = MmPciBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LAN, PCI_FUNCTION_NUMBER_PCH_LAN ); // // Check GBE disable strap // Status = PeiServicesLocatePpi ( &gPeiSpiPpiGuid, 0, NULL, (VOID **) &SpiProtocol ); ASSERT_EFI_ERROR (Status); Status = SpiProtocol->ReadPchSoftStrap(SpiProtocol, 0x1DC, 4, &SoftstrapVal); if (!EFI_ERROR(Status)) { if ((SoftstrapVal & BIT14) == BIT14) { return FALSE; } } // // Check FIA strap/fuse // if (PchGetGbePortNumber () == 0) { return FALSE; } // // Check GbE NVM // if (PchIsGbeRegionValid () == FALSE) { return FALSE; } if (MmioRead32 (GbePciBase) == 0xFFFFFFFF) { return FALSE; } return TRUE; } /** Check whether LAN controller is enabled in the platform. @deprecated Use PchIsGbePresent instead. @retval TRUE GbE is enabled @retval FALSE GbE is disabled **/ BOOLEAN PchIsGbeAvailable ( VOID ) { return PchIsGbePresent (); }