/** @file
|
*
|
* Copyright (c) 2018, Hisilicon Limited. All rights reserved.
|
* Copyright (c) 2018, Linaro Limited. All rights reserved.
|
*
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
*
|
**/
|
|
#ifndef _ERST_H_
|
#define _ERST_H_
|
|
#include "Apei.h"
|
|
#define ERST_STATUS_SUCCESS EFI_ACPI_6_1_ERST_STATUS_SUCCESS
|
#define ERST_STATUS_NOT_ENOUGH_SPACE EFI_ACPI_6_1_ERST_STATUS_NOT_ENOUGH_SPACE
|
#define ERST_STATUS_HARDWARE_NOT_AVAILABLE EFI_ACPI_6_1_ERST_STATUS_HARDWARE_NOT_AVAILABLE
|
#define ERST_STATUS_FAILED EFI_ACPI_6_1_ERST_STATUS_FAILED
|
#define ERST_STATUS_RECORD_STORE_EMPTY EFI_ACPI_6_1_ERST_STATUS_RECORD_STORE_EMPTY
|
#define ERST_STATUS_RECORD_NOT_FOUND EFI_ACPI_6_1_ERST_STATUS_RECORD_NOT_FOUND
|
|
#define ERST_BEGIN_WRITE_VALUE 0x01
|
#define ERST_BEGIN_WRITE_MASK 0xFFFFFFFFFFFFFFFF
|
#define ERST_BEGIN_READ_VALUE 0x02
|
#define ERST_BEGIN_READ_MASK 0xFFFFFFFFFFFFFFFF
|
#define ERST_BEGIN_CLEAR_VALUE 0x03
|
#define ERST_BEGIN_CLEAR_MASK 0xFFFFFFFFFFFFFFFF
|
#define ERST_END_OPERATION_VALUE 0x04
|
#define ERST_END_OPERATION_MASK 0xFFFFFFFFFFFFFFFF
|
#define ERST_MASK 0xFFFFFFFFFFFFFFFF
|
|
#define ERST_BEGIN_WRITE_OPERATION EFI_ACPI_6_1_ERST_BEGIN_WRITE_OPERATION
|
#define ERST_BEGIN_READ_OPERATION EFI_ACPI_6_1_ERST_BEGIN_READ_OPERATION
|
#define ERST_BEGIN_CLEAR_OPERATION EFI_ACPI_6_1_ERST_BEGIN_CLEAR_OPERATION
|
#define ERST_END_OPERATION EFI_ACPI_6_1_ERST_END_OPERATION
|
#define ERST_BEGIN_DUMMY_WRITE_OPERATION EFI_ACPI_6_1_ERST_BEGIN_DUMMY_WRITE_OPERATION
|
|
#define ERST_ACTION_NO 16
|
|
#define ERST_RECORD_FREE 0x00
|
#define ERST_RECORD_INUSE 0x01
|
|
#define ERST_RECORD_STORE_IN_NVRAM 0
|
#define ERST_RECORD_STORE_IN_MEM 1
|
#define ERST_RECORD_STORE_IN_SPI_FLASH 2
|
|
#define ERST_LOG_ATTR_NVRAM 0x02
|
|
typedef struct {
|
UINT64 OperationId;
|
UINT64 RecordOffset;
|
UINT64 BusyStatus;
|
UINT64 CommandStatus;
|
UINT64 GetRecordId;
|
UINT64 SetRecordId;
|
UINT64 RecordCount;
|
UINT64 DummyWrite;
|
UINT64 Reserved;
|
UINT64 ErrorLogAddrRange;
|
UINT64 ErrorLogAddrRangeLength;
|
UINT64 ErrorLogAttributes;
|
UINT64 NvRamLogAddrNext;
|
UINT64 NvRamLogSizeRemain;
|
} ERST_DATA_STRUCTURE;
|
|
typedef struct {
|
UINT16 Signature;
|
UINT16 Data0;
|
UINT16 Data1;
|
UINT8 Data2;
|
UINT8 Attributes; //0: free
|
} ERST_ERROR_RECORD_INFO;
|
|
///
|
/// ERST Table
|
///
|
|
|
|
typedef struct _ERST_CONTEXT {
|
UINT64 Operation; // WRITE,READ,CLEAR,END,
|
UINT64 DummyWrite; //DUMMY_WRITE_OPEATION
|
UINT64 RecordOffset; // Offset form the buffer(error log adress range)
|
UINT32 BusyStatus;
|
UINT32 CommandStatus;
|
UINT64 KeyRecordId; //OS Set the Record ID To Read/Write/Search
|
UINT64 MaxTimeOfExecuteOperation;
|
UINT64 RecordCount; // Num of Record In NVRAM
|
UINT64 ErrorLogAddressRange; // Address Of Range Top
|
UINT64 ErrorLogAddressRangeLength; // Address Of Range Top
|
UINT64 ErrorLogAttributes;
|
VOID *NvRamLogAddrRange;
|
UINT64 NvRamLogAddrRangeLength;
|
UINT64 NvRamRecordOffset;
|
UINT64 NvRamNextVallidRecordId; //Get RecordId entry
|
UINT64 NvRamNextValidRecordOffset;
|
UINT64 NvRamAllRecordLength;
|
} ERST_RT_CONTEXT;
|
|
typedef struct _ERST_BOOT_CONTEXT {
|
EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER *ErstHeader;
|
EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY *ExecuteOperationEntry;
|
EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY *GetErrorLogAddrRangeAttributes;
|
ERST_RT_CONTEXT *Rt;
|
} ERST_BOOT_CONTEXT;
|
|
extern EFI_ACPI_TABLE_PROTOCOL *mAcpiTableProtocol;
|
extern APEI_TRUSTED_FIRMWARE_STRUCTURE *mApeiTrustedfirmwareData;
|
|
EFI_STATUS
|
ErstHeaderCreator(
|
ERST_BOOT_CONTEXT *Context,
|
UINT64 BufferSize,//ERST_DATASTORE_SIZE
|
VOID *NvRamAddrRange,
|
UINT64 NvRamAllRecordLength,
|
UINT64 NvRamAddrRangeLength
|
);
|
|
/***OEM***/
|
EFI_STATUS
|
OemInitErstTable (VOID);
|
|
EFI_STATUS
|
OemErstConfigExecuteOperationEntry (
|
ERST_BOOT_CONTEXT *Context
|
);
|
|
VOID
|
ErstSetAcpiTable (
|
ERST_BOOT_CONTEXT *Context
|
);
|
|
|
#endif // _ERST_H_
|