/** @file Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include "PciPlatform.h" #include #ifdef EFI_PCI_IOV_SUPPORT #include "PciIovPlatformPolicy.h" #endif PCI_PLATFORM_PRIVATE_DATA mPciPrivateData; BOOLEAN FirstCall = TRUE; UINT8 sSataRaidLoadEfiDriverOption; UINT8 SataRaidLoadEfiDriverOption; UINT8 BootNetworkOption; /** Set the PciPolicy as EFI_RESERVE_ISA_IO_NO_ALIAS | EFI_RESERVE_VGA_IO_NO_ALIAS. @param This - The pointer to the Protocol itself. PciPolicy - the returned Policy. @retval EFI_UNSUPPORTED - Function not supported. @retval EFI_INVALID_PARAMETER - Invalid PciPolicy value. **/ EFI_STATUS EFIAPI GetPlatformPolicy ( IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, OUT EFI_PCI_PLATFORM_POLICY *PciPolicy ) { if (PciPolicy == NULL) { return EFI_INVALID_PARAMETER; } return EFI_UNSUPPORTED; } /** Return a PCI ROM image for the onboard device represented by PciHandle. @param This - Protocol instance pointer. PciHandle - PCI device to return the ROM image for. RomImage - PCI Rom Image for onboard device. RomSize - Size of RomImage in bytes. @retval EFI_SUCCESS - RomImage is valid. @retval EFI_NOT_FOUND - No RomImage. **/ EFI_STATUS EFIAPI GetPciRom ( IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, IN EFI_HANDLE PciHandle, OUT VOID **RomImage, OUT UINTN *RomSize ) { return EFI_NOT_FOUND; } /** GC_TODO: Add function description @param This - GC_TODO: add argument description @param Function - GC_TODO: add argument description @param Phase - GC_TODO: add argument description @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value @retval EFI_INVALID_PARAMETER - GC_TODO: Add description for return value @retval EFI_UNSUPPORTED - GC_TODO: Add description for return value @retval EFI_SUCCESS - GC_TODO: Add description for return value **/ EFI_STATUS EFIAPI RegisterPciCallback ( IN EFI_PCI_CALLBACK_PROTOCOL *This, IN EFI_PCI_CALLBACK_FUNC Function, IN EFI_PCI_ENUMERATION_PHASE Phase ) { LIST_ENTRY *NodeEntry; PCI_CALLBACK_DATA *PciCallbackData; if (Function == NULL) { return EFI_INVALID_PARAMETER; } if ( (Phase & (EfiPciEnumerationDeviceScanning | EfiPciEnumerationBusNumberAssigned \ | EfiPciEnumerationResourceAssigned)) == 0) { return EFI_INVALID_PARAMETER; } // // Check if the node has been added // NodeEntry = GetFirstNode (&mPciPrivateData.PciCallbackList); while (!IsNull (&mPciPrivateData.PciCallbackList, NodeEntry)) { PciCallbackData = PCI_CALLBACK_DATA_FROM_LINK (NodeEntry); if (PciCallbackData->Function == Function) { return EFI_UNSUPPORTED; } NodeEntry = GetNextNode (&mPciPrivateData.PciCallbackList, NodeEntry); } PciCallbackData = NULL; PciCallbackData = AllocateZeroPool (sizeof (PCI_CALLBACK_DATA)); ASSERT (PciCallbackData != NULL); if(PciCallbackData != NULL){ PciCallbackData->Signature = PCI_CALLBACK_DATA_SIGNATURE; PciCallbackData->Function = Function; PciCallbackData->Phase = Phase; InsertTailList (&mPciPrivateData.PciCallbackList, &PciCallbackData->Link); return EFI_SUCCESS; } else { return EFI_UNSUPPORTED; } } /** Main Entry point of the Pci Platform Driver. @param ImageHandle - Handle to the image. @param SystemTable - Handle to System Table. @retval EFI_STATUS - Status of the function calling. **/ EFI_STATUS EFIAPI PciPlatformDriverEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; ZeroMem (&mPciPrivateData, sizeof (mPciPrivateData)); InitializeListHead (&mPciPrivateData.PciCallbackList); mPciPrivateData.PciPlatform.PlatformNotify = PhaseNotify; mPciPrivateData.PciPlatform.PlatformPrepController = PlatformPrepController; mPciPrivateData.PciPlatform.GetPlatformPolicy = GetPlatformPolicy; mPciPrivateData.PciPlatform.GetPciRom = GetPciRom; mPciPrivateData.PciCallback.RegisterPciCallback = RegisterPciCallback; #ifdef EFI_PCI_IOV_SUPPORT mPciPrivateData.PciIovPlatform.GetSystemLowestPageSize = GetSystemLowestPageSize; mPciPrivateData.PciIovPlatform.GetPlatformPolicy = GetIovPlatformPolicy; #endif // // Install on a new handle // Status = gBS->InstallMultipleProtocolInterfaces ( &mPciPrivateData.PciPlatformHandle, &gEfiPciPlatformProtocolGuid, &mPciPrivateData.PciPlatform, &gEfiPciCallbackProtocolGuid, &mPciPrivateData.PciCallback, #ifdef EFI_PCI_IOV_SUPPORT &gEfiPciIovPlatformProtocolGuid, &mPciPrivateData.PciIovPlatform, #endif NULL ); return Status; }