123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /** @file
- ACPI Platform Utilities
- @copyright
- Copyright 2017 - 2018 Intel Corporation. <BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "AcpiPlatformUtils.h"
- #include <IndustryStandard/Acpi.h>
- #include <Protocol/AcpiSystemDescriptionTable.h>
- #include <Protocol/FirmwareVolume2.h>
- #include <Library/BaseLib.h>
- #include <Library/UefiBootServicesTableLib.h>
- #include <Library/UefiRuntimeServicesTableLib.h>
- #include <Library/DebugLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/HobLib.h>
- #include <Library/UefiLib.h>
- #include <Acpi/Mcfg.h>
- #include <Acpi/Hpet.h>
- #include <Acpi/Srat.h>
- #include <Acpi/Slit.h>
- #include <Acpi/Migt.h>
- #include <Acpi/Msct.h>
- #include <Acpi/Bdat.h>
- /**
- Locate the first instance of a protocol. If the protocol requested is an
- FV protocol, then it will return the first FV that contains the ACPI table
- storage file.
- @param[in] Protocol - The protocol to find.
- @param[in] EfiAcpiStorageGuid - EFI ACPI tables storage guid
- @param[out] Instance - Return pointer to the first instance of the protocol.
- @param[in] Type - The type of protocol to locate.
- @retval EFI_SUCCESS - The function completed successfully.
- @retval EFI_NOT_FOUND - The protocol could not be located.
- @retval EFI_OUT_OF_RESOURCES - There are not enough resources to find the protocol.
- **/
- EFI_STATUS
- LocateSupportProtocol (
- IN EFI_GUID *Protocol,
- IN EFI_GUID EfiAcpiStorageGuid,
- OUT VOID **Instance,
- IN UINT32 Type
- )
- {
- EFI_STATUS Status;
- EFI_HANDLE *HandleBuffer;
- UINTN NumberOfHandles;
- EFI_FV_FILETYPE FileType;
- UINT32 FvStatus;
- EFI_FV_FILE_ATTRIBUTES Attributes;
- UINTN Size;
- UINTN Index;
- FvStatus = 0;
- //
- // Locate protocol.
- //
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- Protocol,
- NULL,
- &NumberOfHandles,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- //
- // Defined errors at this time are not found and out of resources.
- //
- return Status;
- }
- //
- // Looking for FV with ACPI storage file
- //
- for (Index = 0; Index < NumberOfHandles; Index++) {
- //
- // Get the protocol on this handle
- // This should not fail because of LocateHandleBuffer
- //
- Status = gBS->HandleProtocol (
- HandleBuffer[Index],
- Protocol,
- Instance
- );
- ASSERT (!EFI_ERROR (Status));
- if (!Type) {
- //
- // Not looking for the FV protocol, so find the first instance of the
- // protocol. There should not be any errors because our handle buffer
- // should always contain at least one or LocateHandleBuffer would have
- // returned not found.
- //
- break;
- }
- //
- // See if it has the ACPI storage file
- //
- Status = ((EFI_FIRMWARE_VOLUME2_PROTOCOL *) (*Instance))->ReadFile (
- *Instance,
- &EfiAcpiStorageGuid,
- NULL,
- &Size,
- &FileType,
- &Attributes,
- &FvStatus
- );
- //
- // If we found it, then we are done
- //
- if (!EFI_ERROR (Status)) {
- break;
- }
- }
- //
- // Our exit status is determined by the success of the previous operations
- // If the protocol was found, Instance already points to it.
- //
- //
- // Free any allocated buffers
- //
- gBS->FreePool (HandleBuffer);
- return Status;
- }
|