hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/** @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_