/** @file
Acpi Gnvs Init Library.
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
/**
@brief
Global NVS initialize.
@param[in] GlobalNvs - Pointer of Global NVS area
@retval EFI_SUCCESS - Allocate Global NVS completed.
@retval EFI_OUT_OF_RESOURCES - Failed to allocate required page for GNVS.
**/
EFI_STATUS
EFIAPI
AcpiGnvsInit (
IN OUT VOID **GlobalNvs
)
{
UINTN Pages;
EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status;
EFI_GLOBAL_NVS_AREA_PROTOCOL *GNVS;
EFI_MP_SERVICES_PROTOCOL *MpService;
UINTN NumberOfCPUs;
UINTN NumberOfEnabledCPUs;
Pages = EFI_SIZE_TO_PAGES (sizeof (EFI_GLOBAL_NVS_AREA));
Address = 0xffffffff; // allocate address below 4G.
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiACPIMemoryNVS,
Pages,
&Address
);
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR(Status)) {
return Status;
}
//
// Locate the MP services protocol
// Find the MP Protocol. This is an MP platform, so MP protocol must be there.
//
Status = gBS->LocateProtocol (
&gEfiMpServiceProtocolGuid,
NULL,
(VOID **) &MpService
);
ASSERT_EFI_ERROR (Status);
//
// Determine the number of processors
//
MpService->GetNumberOfProcessors (
MpService,
&NumberOfCPUs,
&NumberOfEnabledCPUs
);
*GlobalNvs = (VOID *) (UINTN) Address;
SetMem (*GlobalNvs, sizeof (EFI_GLOBAL_NVS_AREA), 0);
//
// GNVS default value init here...
//
GNVS = (EFI_GLOBAL_NVS_AREA_PROTOCOL *) &Address;
GNVS->Area->ThreadCount = (UINT8)NumberOfEnabledCPUs;
//
// Miscellaneous
//
GNVS->Area->PL1LimitCS = 0;
GNVS->Area->PL1LimitCSValue = 4500;
return EFI_SUCCESS;
}