/** @file
|
*
|
* Copyright (c) 2018, Hisilicon Limited. All rights reserved.
|
* Copyright (c) 2018, Linaro Limited. All rights reserved.
|
*
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
*
|
**/
|
#include <Library/ArmSmcLib.h>
|
#include <Library/BaseMemoryLib.h>
|
#include <Library/DebugLib.h>
|
#include <Library/IoLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
#include <Library/OemConfigData.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiLib.h>
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
#include "Apei.h"
|
#include <PlatformArch.h>
|
#include "Bert.h"
|
#include "Einj.h"
|
#include "Erst.h"
|
#include "Hest.h"
|
|
EFI_ACPI_TABLE_PROTOCOL *mAcpiTableProtocol = NULL;
|
EFI_ACPI_SDT_PROTOCOL *mAcpiSdtProtocol = NULL;
|
APEI_TRUSTED_FIRMWARE_STRUCTURE *mApeiTrustedfirmwareData;
|
|
EFI_STATUS
|
EFIAPI
|
ApeiEntryPoint (
|
IN EFI_HANDLE ImageHandle,
|
IN EFI_SYSTEM_TABLE *SystemTable
|
)
|
{
|
EFI_STATUS Status;
|
ARM_SMC_ARGS SmcRegs = {0};
|
UINTN Size = sizeof (OEM_CONFIG_DATA);
|
OEM_CONFIG_DATA SetupData;
|
|
Status = gRT->GetVariable (
|
OEM_CONFIG_NAME,
|
&gOemConfigGuid,
|
NULL,
|
&Size,
|
&SetupData
|
);
|
if (EFI_ERROR (Status)) {
|
SetupData.EnRasSupport = 1;
|
DEBUG ((DEBUG_ERROR, "[%a]GetVariable %r.Get default variable value\n",
|
__FUNCTION__, Status));
|
}
|
if (!SetupData.EnRasSupport) {
|
return EFI_ABORTED;
|
}
|
if (PcdGet64 (PcdTrustedFirmwareEnable) == 0) {
|
return EFI_ABORTED;
|
}
|
Status = gBS->LocateProtocol (
|
&gEfiAcpiTableProtocolGuid,
|
NULL,
|
(VOID**)&mAcpiTableProtocol);
|
if (EFI_ERROR (Status)) {
|
return Status;
|
}
|
Status = gBS->LocateProtocol (
|
&gEfiAcpiSdtProtocolGuid,
|
NULL,
|
(VOID**)&mAcpiSdtProtocol);
|
if (EFI_ERROR (Status)) {
|
return Status;
|
}
|
Status = gBS->AllocatePool (
|
EfiReservedMemoryType,
|
sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
|
(VOID**)&mApeiTrustedfirmwareData
|
);
|
if (EFI_ERROR (Status)) {
|
return Status;
|
}
|
gBS->SetMem (
|
mApeiTrustedfirmwareData,
|
sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
|
0
|
);
|
Status = EFI_SUCCESS;
|
Status |= OemInitBertTable (ImageHandle);
|
Status |= OemInitHestTable (ImageHandle);
|
Status |= OemInitErstTable ();
|
Status |= OemInitEinjTable ();
|
// smc call
|
DEBUG ((DEBUG_INFO, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
|
if (Status == EFI_SUCCESS) {
|
SmcRegs.Arg0 = PRIVATE_ARM_SMC_ID_APEI;
|
SmcRegs.Arg1 = (UINTN)mApeiTrustedfirmwareData;
|
ArmCallSmc (&SmcRegs);
|
}
|
DEBUG ((DEBUG_INFO, "Acpi Apei init done.\n"));
|
return EFI_SUCCESS;
|
}
|
|
|