+++ /dev/null
-/** @file\r
-\r
- Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
- \r\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
- \r\r
-\r
-Module Name:\r
-\r
-\r
- PciPlatform.c\r
-\r
-Abstract:\r
---*/\r
-\r
-\r
-#include "PciPlatform.h"\r
-#include "PchRegs.h"\r
-#include "PchAccess.h"\r
-#include "VlvCommonDefinitions.h"\r
-#include "PlatformBootMode.h"\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Protocol/CpuIo.h>\r
-#include <Protocol/PciIo.h>\r
-#include <Guid/SetupVariable.h>\r
-#include <Protocol/PciRootBridgeIo.h>\r
-#include "SetupMode.h"\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Protocol/FirmwareVolume2.h>\r
-#include <Library/HobLib.h>\r
-#include <IndustryStandard/Pci22.h>\r
-\r
-extern PCI_OPTION_ROM_TABLE mPciOptionRomTable[];\r
-extern UINTN mSizeOptionRomTable;\r
-\r
-EFI_PCI_PLATFORM_PROTOCOL mPciPlatform = {\r
- PhaseNotify,\r
- PlatformPrepController,\r
- GetPlatformPolicy,\r
- GetPciRom\r
-};\r
-\r
-EFI_HANDLE mPciPlatformHandle = NULL;\r
-\r
-\r
-SYSTEM_CONFIGURATION mSystemConfiguration;\r
-\r
-EFI_STATUS\r
-GetRawImage (\r
- IN EFI_GUID *NameGuid,\r
- IN OUT VOID **Buffer,\r
- IN OUT UINTN *Size\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN HandleCount;\r
- UINTN Index;\r
- EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
- UINT32 AuthenticationStatus;\r
-\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiFirmwareVolume2ProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status) || HandleCount == 0) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Find desired image in all Fvs\r
- //\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol(\r
- HandleBuffer[Index],\r
- &gEfiFirmwareVolume2ProtocolGuid,\r
- (VOID **) &Fv\r
- );\r
-\r
- if ( EFI_ERROR ( Status ) ) {\r
- return EFI_LOAD_ERROR;\r
- }\r
-\r
- //\r
- // Try a raw file\r
- //\r
- *Buffer = NULL;\r
- *Size = 0;\r
- Status = Fv->ReadSection (\r
- Fv,\r
- NameGuid,\r
- EFI_SECTION_RAW,\r
- 0,\r
- Buffer,\r
- Size,\r
- &AuthenticationStatus\r
- );\r
-\r
- if ( !EFI_ERROR ( Status )) {\r
- break;\r
- }\r
- }\r
-\r
- if ( Index >= HandleCount ) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI \r
-PhaseNotify (\r
- IN EFI_PCI_PLATFORM_PROTOCOL *This,\r
- IN EFI_HANDLE HostBridge,\r
- IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE Phase,\r
- IN EFI_PCI_CHIPSET_EXECUTION_PHASE ChipsetPhase\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PlatformPrepController (\r
- IN EFI_PCI_PLATFORM_PROTOCOL *This,\r
- IN EFI_HANDLE HostBridge,\r
- IN EFI_HANDLE RootBridge,\r
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS PciAddress,\r
- IN EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE Phase,\r
- IN EFI_PCI_CHIPSET_EXECUTION_PHASE ChipsetPhase\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GetPlatformPolicy (\r
- IN CONST EFI_PCI_PLATFORM_PROTOCOL *This,\r
- OUT EFI_PCI_PLATFORM_POLICY *PciPolicy\r
- )\r
-{\r
- *PciPolicy = EFI_RESERVE_VGA_IO_ALIAS;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- GetPciRom from platform specific location for specific PCI device\r
-\r
- @param This Protocol instance\r
- @param PciHandle Identify the specific PCI devic\r
- @param RomImage Returns the ROM Image memory location\r
- @param RomSize Returns Rom Image size\r
-\r
- @retval EFI_SUCCESS\r
- @retval EFI_NOT_FOUND\r
- @retval EFI_OUT_OF_RESOURCES\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-GetPciRom (\r
- IN CONST EFI_PCI_PLATFORM_PROTOCOL *This,\r
- IN EFI_HANDLE PciHandle,\r
- OUT VOID **RomImage,\r
- OUT UINTN *RomSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
- UINTN Segment;\r
- UINTN Bus;\r
- UINTN Device;\r
- UINTN Function;\r
- UINT16 VendorId;\r
- UINT16 DeviceId;\r
- UINT16 DeviceClass;\r
- UINTN TableIndex;\r
- UINT8 Data8;\r
- BOOLEAN MfgMode;\r
- EFI_PLATFORM_SETUP_ID *BootModeBuffer;\r
-\r
- EFI_PEI_HOB_POINTERS GuidHob;\r
-\r
- MfgMode = FALSE;\r
-\r
-//\r
-// Check if system is in manufacturing mode.\r
-//\r
- GuidHob.Raw = GetHobList ();\r
- if (GuidHob.Raw == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformBootModeGuid, GuidHob.Raw)) != NULL) {\r
- BootModeBuffer = GET_GUID_HOB_DATA (GuidHob.Guid);\r
- if (!CompareMem (&BootModeBuffer->SetupName, MANUFACTURE_SETUP_NAME,\r
- StrSize (MANUFACTURE_SETUP_NAME)))\r
- {\r
- //\r
- // System is in manufacturing mode.\r
- //\r
- MfgMode = TRUE;\r
- }\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- PciHandle,\r
- &gEfiPciIoProtocolGuid,\r
- (void **)&PciIo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiPciRootBridgeIoProtocolGuid,\r
- NULL,\r
- (void **)&PciRootBridgeIo\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint16, 0x0A, 1, &DeviceClass);\r
-\r
- PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);\r
-\r
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint16, 0, 1, &VendorId);\r
-\r
- PciIo->Pci.Read (PciIo, EfiPciIoWidthUint16, 2, 1, &DeviceId);\r
-\r
- //\r
- // WA for PCIe SATA card (SYBA SY-PEX400-40)\r
- //\r
- if ((VendorId == 0x1B21) && (DeviceId == 0x0612)) {\r
- Data8 = 0x07;\r
- PciIo->Pci.Write (PciIo, EfiPciIoWidthUint8, 4, 1, &Data8);\r
- }\r
-\r
- //\r
- // Do not run RAID or AHCI Option ROM if IDE\r
- //\r
- if ( (DeviceClass == ((PCI_CLASS_MASS_STORAGE << 8 ) | PCI_CLASS_MASS_STORAGE_IDE)) ) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Run PXE ROM only if Boot network is enabled and not in MFG mode\r
- //\r
- if (DeviceClass == ((PCI_CLASS_NETWORK << 8 ) | PCI_CLASS_NETWORK_ETHERNET)) {\r
- if (((mSystemConfiguration.BootNetwork == 0) && (MfgMode == FALSE )) || (mSystemConfiguration.FastBoot == 1)) {\r
- return EFI_NOT_FOUND;\r
- }\r
- }\r
-\r
- //\r
- // Loop through table of Onboard option rom descriptions\r
- //\r
- for (TableIndex = 0; mPciOptionRomTable[TableIndex].VendorId != 0xffff; TableIndex++) {\r
-\r
- //\r
- // See if the PCI device specified by PciHandle matches at device in mPciOptionRomTable\r
- //\r
- if (VendorId != mPciOptionRomTable[TableIndex].VendorId ||\r
- DeviceId != mPciOptionRomTable[TableIndex].DeviceId ||\r
- ((DeviceClass == ((PCI_CLASS_NETWORK << 8 ) | PCI_CLASS_NETWORK_ETHERNET)) &&\r
- (mPciOptionRomTable[TableIndex].Flag != mSystemConfiguration.BootNetwork)) ) {\r
- continue;\r
- }\r
-\r
- Status = GetRawImage(\r
- &mPciOptionRomTable[TableIndex].FileName,\r
- RomImage,\r
- RomSize\r
- );\r
-\r
- if ((VendorId == IGD_VID) && (DeviceId == IGD_DID_VLV_A0)) {\r
- *(UINT16 *)(((UINTN) *RomImage) + OPROM_DID_OFFSET) = IGD_DID_VLV_A0;\r
- }\r
-\r
- if ((VendorId == IGD_VID) && (DeviceId == IGD_DID_II)) {\r
- *(UINT16 *)(((UINTN) *RomImage) + OPROM_DID_OFFSET) = IGD_DID_II;\r
- }\r
-\r
- if ((VendorId == IGD_VID) && (DeviceId == IGD_DID_0BE4)) {\r
- *(UINT16 *)(((UINTN) *RomImage) + OPROM_DID_OFFSET) = IGD_DID_0BE4;\r
- }\r
-\r
- if ((VendorId == IGD_VID) && (DeviceId == IGD_DID_QS)) {\r
- *(UINT16 *)(((UINTN) *RomImage) + OPROM_DID_OFFSET) = IGD_DID_QS;\r
- }\r
-\r
-\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- return EFI_SUCCESS;\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
-\r
- @param (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
-\r
- @retval EFI_STATUS\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciPlatformDriverEntry (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN VarSize;\r
-\r
- VarSize = sizeof(SYSTEM_CONFIGURATION);\r
- Status = gRT->GetVariable(\r
- L"Setup",\r
- &gEfiNormalSetupGuid,\r
- NULL,\r
- &VarSize,\r
- &mSystemConfiguration\r
- );\r
- if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
- //The setup variable is corrupted\r
- VarSize = sizeof(SYSTEM_CONFIGURATION);\r
- Status = gRT->GetVariable(\r
- L"SetupRecovery",\r
- &gEfiNormalSetupGuid,\r
- NULL,\r
- &VarSize,\r
- &mSystemConfiguration\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- } \r
-\r
- //\r
- // Install on a new handle\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &mPciPlatformHandle,\r
- &gEfiPciPlatformProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &mPciPlatform\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-\r