coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
bmcinfo.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <console/uart.h>
5 #include <types.h>
6 
7 #include "bmcinfo.h"
8 
9 typedef struct {
10  u32 magic0; // "BMCI"
11  u32 magic1; // "nfo0"
14  u8 uuid[16];
15  u8 bmcSerial[9]; // as null terminated string
21  u8 hwRev; // Note: Initial implementation ended here
23  u8 endMarker; // Insert new fields before
25 
26 #define BIOSBMCINFO_MAGIC0 0x49434d42
27 #define BIOSBMCINFO_MAGIC1 0x306f666e
28 
29 #define BMC_INFO ((biosBmcInfo_t *)CONFIG_BMC_INFO_LOC)
30 
37 };
38 static bool bmcinfo_is_valid(size_t minsize)
39 {
40  static enum biosBmcInfoValidFlag_e biosBmcInfoValidFlag;
41  const biosBmcInfo_t *bmc_info = BMC_INFO;
42  if (biosBmcInfoValidFlag == BMCINFO_UNTESTED) {
43  biosBmcInfoValidFlag = BMCINFO_INVALID;
44  if ((bmc_info->magic0 == BIOSBMCINFO_MAGIC0)
45  && (bmc_info->magic1 == BIOSBMCINFO_MAGIC1)
46  && (bmc_info->length >= offsetof(biosBmcInfo_t, hwRev))
47  && (bmc_info->length <= 0x1000)) {
48  u16 chksum = 0 - (bmc_info->chksum & 0xff)
49  - (bmc_info->chksum >> 8);
50  int i;
51  for (i = 0; i < bmc_info->length ; i++)
52  chksum += ((u8 *)bmc_info)[i];
53  if (bmc_info->chksum == chksum) {
54  if (bmc_info->length >= offsetof(biosBmcInfo_t,
55  endMarker))
56  biosBmcInfoValidFlag = BMCINFO_VALID;
57  else
58  biosBmcInfoValidFlag = BMCINFO_VALID_NEED_WARN;
59  }
60  }
61  }
62  if (ENV_RAMSTAGE && biosBmcInfoValidFlag == BMCINFO_INVALID) {
63  int length = offsetof(biosBmcInfo_t, endMarker);
64  printk(BIOS_CRIT, "WARNING bmcInfo struct"
65  "is not available please update your BMC.\n");
66  biosBmcInfoValidFlag = BMCINFO_INVALID_WARNED;
67  printk(BIOS_CRIT, "bmcInfo magic = \"%x-%x\"\n",
68  bmc_info->magic0, bmc_info->magic1);
69  printk(BIOS_CRIT, "bmcInfo length = %d expected = %d\"\n",
70  bmc_info->length, length);
71  u16 chksum = 0 - (bmc_info->chksum & 0xff)
72  - (bmc_info->chksum >> 8);
73  int i;
74  for (i = 0; i < bmc_info->length; i++)
75  chksum += ((u8 *)bmc_info)[i];
76  printk(BIOS_CRIT, "bmcInfo chksum = 0x%x expected = 0x%x\"\n",
77  bmc_info->chksum, chksum);
78  }
79  if (ENV_RAMSTAGE && biosBmcInfoValidFlag == BMCINFO_VALID_NEED_WARN) {
80  printk(BIOS_CRIT, "WARNING bmcInfo struct"
81  " is incomplete please update your BMC.\n");
82 
83  biosBmcInfoValidFlag = BMCINFO_VALID;
84  }
85  if (biosBmcInfoValidFlag < BMCINFO_VALID_NEED_WARN)
86  return false;
87  return (bmc_info->length >= minsize);
88 }
89 
90 #define IS_BMC_INFO_FIELD_VALID(field) \
91  (bmcinfo_is_valid(offsetof(biosBmcInfo_t, field) \
92  + sizeof(((biosBmcInfo_t *)0)->field)))
93 
94 char *bmcinfo_serial(void)
95 {
96  if (IS_BMC_INFO_FIELD_VALID(bmcSerial))
97  return (char *) BMC_INFO->bmcSerial;
98  return NULL;
99 }
100 
102 {
103  if (IS_BMC_INFO_FIELD_VALID(uuid))
104  return BMC_INFO->uuid;
105  return NULL;
106 }
107 
108 int bmcinfo_slot(void)
109 {
110  if (IS_BMC_INFO_FIELD_VALID(slot))
111  return BMC_INFO->slot;
112  return -1;
113 }
114 
115 int bmcinfo_hwrev(void)
116 {
117  if (IS_BMC_INFO_FIELD_VALID(hwRev))
118  return BMC_INFO->hwRev;
119  return -1;
120 }
121 
123 {
124  if (IS_BMC_INFO_FIELD_VALID(baudrate))
125  return BMC_INFO->baudrate;
126  return 0;
127 }
128 
130 {
131  if (IS_BMC_INFO_FIELD_VALID(corebootVerbosityLevel))
132  return BMC_INFO->corebootVerbosityLevel & 0xf;
133  return BIOS_CRIT;
134 }
135 
137 {
138  if (IS_BMC_INFO_FIELD_VALID(corebootVerbosityLevel))
139  return BMC_INFO->corebootVerbosityLevel >> 4;
140  return 0;
141 }
142 
144 {
145  if (IS_BMC_INFO_FIELD_VALID(relaxSecurity))
146  return BMC_INFO->relaxSecurity;
147  return 0;
148 }
149 
151 {
152  if (IS_BMC_INFO_FIELD_VALID(bootOption))
153  return BMC_INFO->bootOption;
154  return 0;
155 }
156 
158 {
159  if (IS_BMC_INFO_FIELD_VALID(disableNic1))
160  return BMC_INFO->disableNic1;
161  return 0;
162 }
163 
164 /* Add override functions below */
165 
166 /* Override default uart baudrate */
167 unsigned int get_uart_baudrate(void)
168 {
169  int baudrate = bmcinfo_baudrate();
170  if (baudrate)
171  return baudrate;
172  return 115200;
173 }
174 
175 #if __CONSOLE_ENABLE__
176 /* Override default console loglevel */
177 int get_console_loglevel(void)
178 {
180 }
181 #endif
u32 bmcinfo_baudrate(void)
Definition: bmcinfo.c:122
u8 * bmcinfo_uuid(void)
Definition: bmcinfo.c:101
int bmcinfo_fsp_verbosity_level(void)
Definition: bmcinfo.c:136
int bmcinfo_boot_option(void)
Definition: bmcinfo.c:150
int bmcinfo_relax_security(void)
Definition: bmcinfo.c:143
#define BIOSBMCINFO_MAGIC0
Definition: bmcinfo.c:26
#define IS_BMC_INFO_FIELD_VALID(field)
Definition: bmcinfo.c:90
#define BMC_INFO
Definition: bmcinfo.c:29
char * bmcinfo_serial(void)
Definition: bmcinfo.c:94
int bmcinfo_slot(void)
Definition: bmcinfo.c:108
static bool bmcinfo_is_valid(size_t minsize)
Definition: bmcinfo.c:38
unsigned int get_uart_baudrate(void)
Definition: bmcinfo.c:167
#define BIOSBMCINFO_MAGIC1
Definition: bmcinfo.c:27
int bmcinfo_hwrev(void)
Definition: bmcinfo.c:115
biosBmcInfoValidFlag_e
Definition: bmcinfo.c:31
@ BMCINFO_INVALID
Definition: bmcinfo.c:33
@ BMCINFO_VALID_NEED_WARN
Definition: bmcinfo.c:35
@ BMCINFO_VALID
Definition: bmcinfo.c:36
@ BMCINFO_UNTESTED
Definition: bmcinfo.c:32
@ BMCINFO_INVALID_WARNED
Definition: bmcinfo.c:34
int bmcinfo_disable_nic1(void)
Definition: bmcinfo.c:157
int bmcinfo_coreboot_verbosity_level(void)
Definition: bmcinfo.c:129
#define offsetof(TYPE, MEMBER)
Definition: helpers.h:84
#define printk(level,...)
Definition: stdlib.h:16
uint64_t length
Definition: fw_cfg_if.h:1
#define BIOS_CRIT
BIOS_CRIT - Recovery unlikely.
Definition: loglevel.h:56
int get_console_loglevel(void)
Definition: loglevel_vpd.c:8
#define ENV_RAMSTAGE
Definition: rules.h:150
#define NULL
Definition: stddef.h:19
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
u16 chksum
Definition: bmcinfo.c:13
u32 baudrate
Definition: bmcinfo.c:19
u8 bootOption
Definition: bmcinfo.c:20
u8 corebootVerbosityLevel
Definition: bmcinfo.c:17
u16 length
Definition: bmcinfo.c:12
u8 disableNic1
Definition: bmcinfo.c:22
u32 magic1
Definition: bmcinfo.c:11
u32 magic0
Definition: bmcinfo.c:10
u8 endMarker
Definition: bmcinfo.c:23
u8 relaxSecurity
Definition: bmcinfo.c:18