coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mcax_bert.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/mca.h>
4 #include <amdblocks/msr_zen.h>
5 #include <cpu/x86/msr.h>
6 #include <acpi/acpi.h>
7 #include <console/console.h>
8 #include <arch/bert_storage.h>
9 #include <cper.h>
10 #include <types.h>
11 #include "mca_common_defs.h"
12 
13 /* MISC4 is the last used register in the MCAX banks of Picasso */
14 #define MCAX_USED_REGISTERS_PER_BANK (MCAX_MISC4_OFFSET + 1)
15 
16 static inline size_t mca_report_size_reqd(void)
17 {
18  size_t size;
19 
20  size = sizeof(acpi_generic_error_status_t);
21 
22  size += sizeof(acpi_hest_generic_data_v300_t);
23  size += sizeof(cper_proc_generic_error_section_t);
24 
25  size += sizeof(acpi_hest_generic_data_v300_t);
26  size += sizeof(cper_ia32x64_proc_error_section_t);
27 
28  /* Check Error */
29  size += cper_ia32x64_check_sz();
30 
31  /* Context of MCG_CAP, MCG_STAT, MCG_CTL */
33 
34  /* Context of CTL, STATUS, ADDR, MISC0, CONFIG, IPID, SYND, RESERVED, DESTAT, DEADDR,
35  MISC1, MISC2, MISC3, MISC4 */
37 
38  /* Context of CTL_MASK */
40 
41  return size;
42 }
43 
44 /* Convert an error reported by an MCA bank into BERT information to be reported
45  * by the OS. The ACPI driver doesn't recognize/parse the IA32/X64 structure,
46  * which is the best method to report MSR context. As a result, add two
47  * structures: A "processor generic error" that is parsed, and an IA32/X64 one
48  * to capture complete information.
49  */
51 {
59 
61  goto failed;
62 
64  if (!status)
65  goto failed;
66 
67  gen_entry = acpi_hest_generic_data3(status);
68  gen_sec = section_of_acpientry(gen_sec, gen_entry);
69 
70  fill_generic_section(gen_sec, mci);
71 
72  x86_entry = bert_append_ia32x64(status);
73  x86_sec = section_of_acpientry(x86_sec, x86_entry);
74 
75  chk = new_cper_ia32x64_check(status, x86_sec, error_to_chktype(mci));
76  if (!chk)
77  goto failed;
78 
79  ctx = cper_new_ia32x64_context_msr(status, x86_sec, IA32_MCG_CAP, 3);
80  if (!ctx)
81  goto failed;
82  ctx = cper_new_ia32x64_context_msr(status, x86_sec, MCAX_CTL_MSR(mci->bank),
84  if (!ctx)
85  goto failed;
86  ctx = cper_new_ia32x64_context_msr(status, x86_sec, MCA_CTL_MASK_MSR(mci->bank), 1);
87  if (!ctx)
88  goto failed;
89 
90  return;
91 
92 failed:
93  /* We're here because of a hardware error, don't break something else */
94  printk(BIOS_ERR, "Not enough room in BERT region for Machine Check error\n");
95 }
size_t bert_storage_remaining(void)
cper_ia32x64_context_t * cper_new_ia32x64_context_msr(acpi_generic_error_status_t *status, cper_ia32x64_proc_error_section_t *x86err, u32 addr, int num)
cper_ia32x64_proc_error_info_t * new_cper_ia32x64_check(acpi_generic_error_status_t *status, cper_ia32x64_proc_error_section_t *x86err, enum cper_x86_check_type type)
acpi_generic_error_status_t * bert_new_event(guid_t *guid)
acpi_hest_generic_data_v300_t * bert_append_ia32x64(acpi_generic_error_status_t *status)
#define section_of_acpientry(A, B)
Definition: bert_storage.h:91
static acpi_hest_generic_data_v300_t * acpi_hest_generic_data3(acpi_generic_error_status_t *status)
Definition: bert_storage.h:83
#define printk(level,...)
Definition: stdlib.h:16
struct cper_proc_generic_error_section cper_proc_generic_error_section_t
static size_t cper_ia32x64_ctx_sz_bytype(int type, int arr_num)
Definition: cper.h:430
static size_t cper_ia32x64_check_sz(void)
Definition: cper.h:451
struct cper_ia32x64_proc_error_section cper_ia32x64_proc_error_section_t
#define CPER_SEC_PROC_GENERIC_GUID
Definition: cper.h:45
#define CPER_IA32X64_CTX_MSR
Definition: cper.h:297
struct acpi_generic_error_status acpi_generic_error_status_t
struct acpi_hest_generic_data_v300 acpi_hest_generic_data_v300_t
#define IA32_MCG_CAP
Definition: msr.h:39
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
void fill_generic_section(cper_proc_generic_error_section_t *sec, struct mca_bank_status *mci)
enum cper_x86_check_type error_to_chktype(struct mca_bank_status *mci)
void build_bert_mca_error(struct mca_bank_status *mci)
Definition: mcax_bert.c:50
static size_t mca_report_size_reqd(void)
Definition: mcax_bert.c:16
#define MCAX_USED_REGISTERS_PER_BANK
Definition: mcax_bert.c:14
#define MCA_CTL_MASK_MSR(bank)
Definition: msr_zen.h:47
#define MCAX_CTL_MSR(bank)
Definition: msr_zen.h:28
unsigned int bank
Definition: mca.h:10