17f21db6cSLawrence Tang /**
27f21db6cSLawrence Tang  * Describes functions for converting memory error CPER sections from binary and JSON format
37f21db6cSLawrence Tang  * into an intermediate format.
47f21db6cSLawrence Tang  *
57f21db6cSLawrence Tang  * Author: Lawrence.Tang@arm.com
67f21db6cSLawrence Tang  **/
77f21db6cSLawrence Tang #include <stdio.h>
87f21db6cSLawrence Tang #include "json.h"
97f21db6cSLawrence Tang #include "../edk/Cper.h"
107f21db6cSLawrence Tang #include "../cper-utils.h"
117f21db6cSLawrence Tang #include "cper-section-memory.h"
127f21db6cSLawrence Tang 
137f21db6cSLawrence Tang //Converts a single memory error CPER section into JSON IR.
14a0865e38SLawrence Tang json_object* cper_section_platform_memory_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
157f21db6cSLawrence Tang {
167f21db6cSLawrence Tang     EFI_PLATFORM_MEMORY_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY_ERROR_DATA*)section;
177f21db6cSLawrence Tang     json_object* section_ir = json_object_new_object();
187f21db6cSLawrence Tang 
197f21db6cSLawrence Tang     //Validation bitfield.
207f21db6cSLawrence Tang     json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_VALID_BITFIELD_NAMES);
217f21db6cSLawrence Tang     json_object_object_add(section_ir, "validationBits", validation);
227f21db6cSLawrence Tang 
237f21db6cSLawrence Tang     //Error status.
24a0865e38SLawrence Tang     json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
25a0865e38SLawrence Tang     json_object_object_add(section_ir, "errorStatus", error_status);
26a0865e38SLawrence Tang 
27a0865e38SLawrence Tang     //Bank.
28a0865e38SLawrence Tang     json_object* bank = json_object_new_object();
29*583cdeeeSLawrence Tang     if ((memory_error->ValidFields >> 5) & 0x1)
30*583cdeeeSLawrence Tang     {
31*583cdeeeSLawrence Tang         //Entire bank address mode.
32*583cdeeeSLawrence Tang         json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank));
33*583cdeeeSLawrence Tang     }
34*583cdeeeSLawrence Tang     else
35*583cdeeeSLawrence Tang     {
36*583cdeeeSLawrence Tang         //Address/group address mode.
37a0865e38SLawrence Tang         json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF));
38a0865e38SLawrence Tang         json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8));
39*583cdeeeSLawrence Tang     }
40a0865e38SLawrence Tang     json_object_object_add(section_ir, "bank", bank);
41a0865e38SLawrence Tang 
42a0865e38SLawrence Tang     //Memory error type.
43a0865e38SLawrence Tang     json_object* memory_error_type = integer_to_readable_pair(memory_error->ErrorType, 16,
44a0865e38SLawrence Tang         MEMORY_ERROR_TYPES_KEYS,
45a0865e38SLawrence Tang         MEMORY_ERROR_TYPES_VALUES,
46a0865e38SLawrence Tang         "Unknown (Reserved)");
47a0865e38SLawrence Tang     json_object_object_add(section_ir, "memoryErrorType", memory_error_type);
48a0865e38SLawrence Tang 
49a0865e38SLawrence Tang     //"Extended" row/column indication field + misc.
50a0865e38SLawrence Tang     json_object* extended = json_object_new_object();
51a0865e38SLawrence Tang     json_object_object_add(extended, "rowBit16", json_object_new_boolean(memory_error->Extended & 0b1));
52a0865e38SLawrence Tang     json_object_object_add(extended, "rowBit17", json_object_new_boolean((memory_error->Extended >> 1) & 0b1));
53a0865e38SLawrence Tang     json_object_object_add(extended, "chipIdentification", json_object_new_int(memory_error->Extended >> 5));
54a0865e38SLawrence Tang     json_object_object_add(section_ir, "extended", extended);
55a0865e38SLawrence Tang 
5654da4414SLawrence Tang     //Miscellaneous numeric fields.
5754da4414SLawrence Tang     json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress));
5854da4414SLawrence Tang     json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask));
5954da4414SLawrence Tang     json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node));
6054da4414SLawrence Tang     json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card));
6154da4414SLawrence Tang     json_object_object_add(section_ir, "moduleRank", json_object_new_uint64(memory_error->ModuleRank));
6254da4414SLawrence Tang     json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device));
6354da4414SLawrence Tang     json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row));
6454da4414SLawrence Tang     json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column));
6554da4414SLawrence Tang     json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition));
6654da4414SLawrence Tang     json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId));
6754da4414SLawrence Tang     json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId));
6854da4414SLawrence Tang     json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId));
6954da4414SLawrence Tang     json_object_object_add(section_ir, "rankNumber", json_object_new_uint64(memory_error->RankNum));
7054da4414SLawrence Tang     json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle));
7154da4414SLawrence Tang     json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle));
7254da4414SLawrence Tang 
73a0865e38SLawrence Tang     return section_ir;
74a0865e38SLawrence Tang }
75a0865e38SLawrence Tang 
76a0865e38SLawrence Tang //Converts a single memory error 2 CPER section into JSON IR.
77a0865e38SLawrence Tang json_object* cper_section_platform_memory2_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
78a0865e38SLawrence Tang {
79a0865e38SLawrence Tang     EFI_PLATFORM_MEMORY2_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY2_ERROR_DATA*)section;
80a0865e38SLawrence Tang     json_object* section_ir = json_object_new_object();
81a0865e38SLawrence Tang 
8254da4414SLawrence Tang     //Validation bits.
8354da4414SLawrence Tang     json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_2_VALID_BITFIELD_NAMES);
8454da4414SLawrence Tang     json_object_object_add(section_ir, "validationBits", validation);
8554da4414SLawrence Tang 
8654da4414SLawrence Tang     //Error status.
8754da4414SLawrence Tang     json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
8854da4414SLawrence Tang     json_object_object_add(section_ir, "errorStatus", error_status);
8954da4414SLawrence Tang 
9054da4414SLawrence Tang     //Bank.
9154da4414SLawrence Tang     json_object* bank = json_object_new_object();
92*583cdeeeSLawrence Tang     if ((memory_error->ValidFields >> 5) & 0x1)
93*583cdeeeSLawrence Tang     {
94*583cdeeeSLawrence Tang         //Entire bank address mode.
95*583cdeeeSLawrence Tang         json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank));
96*583cdeeeSLawrence Tang     }
97*583cdeeeSLawrence Tang     else
98*583cdeeeSLawrence Tang     {
99*583cdeeeSLawrence Tang         //Address/group address mode.
10054da4414SLawrence Tang         json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF));
10154da4414SLawrence Tang         json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8));
102*583cdeeeSLawrence Tang     }
10354da4414SLawrence Tang     json_object_object_add(section_ir, "bank", bank);
10454da4414SLawrence Tang 
10554da4414SLawrence Tang     //Memory error type.
10654da4414SLawrence Tang     json_object* memory_error_type = integer_to_readable_pair(memory_error->MemErrorType, 16,
10754da4414SLawrence Tang         MEMORY_ERROR_TYPES_KEYS,
10854da4414SLawrence Tang         MEMORY_ERROR_TYPES_VALUES,
10954da4414SLawrence Tang         "Unknown (Reserved)");
11054da4414SLawrence Tang     json_object_object_add(section_ir, "memoryErrorType", memory_error_type);
11154da4414SLawrence Tang 
11254da4414SLawrence Tang     //Status.
11354da4414SLawrence Tang     json_object* status = json_object_new_object();
11454da4414SLawrence Tang     json_object_object_add(status, "value", json_object_new_int(memory_error->Status));
11554da4414SLawrence Tang     json_object_object_add(status, "state", json_object_new_string(memory_error->Status & 0b1 == 0 ? "Corrected" : "Uncorrected"));
11654da4414SLawrence Tang     json_object_object_add(section_ir, "status", status);
11754da4414SLawrence Tang 
11854da4414SLawrence Tang     //Miscellaneous numeric fields.
11954da4414SLawrence Tang     json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress));
12054da4414SLawrence Tang     json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask));
12154da4414SLawrence Tang     json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node));
12254da4414SLawrence Tang     json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card));
12354da4414SLawrence Tang     json_object_object_add(section_ir, "module", json_object_new_uint64(memory_error->Module));
12454da4414SLawrence Tang     json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device));
12554da4414SLawrence Tang     json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row));
12654da4414SLawrence Tang     json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column));
12754da4414SLawrence Tang     json_object_object_add(section_ir, "rank", json_object_new_uint64(memory_error->Rank));
12854da4414SLawrence Tang     json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition));
12954da4414SLawrence Tang     json_object_object_add(section_ir, "chipID", json_object_new_uint64(memory_error->ChipId));
13054da4414SLawrence Tang     json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId));
13154da4414SLawrence Tang     json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId));
13254da4414SLawrence Tang     json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId));
13354da4414SLawrence Tang     json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle));
13454da4414SLawrence Tang     json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle));
135a0865e38SLawrence Tang 
136a0865e38SLawrence Tang     return section_ir;
1377f21db6cSLawrence Tang }