blob: 2de2f2e3a0c845aa835123c3252cbfb1c43a3689 [file] [log] [blame]
Angel Ponsb04c2f82020-04-03 01:23:20 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +01002
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +01003#include <console/console.h>
Julien Viard de Galbertae6210e2018-02-22 14:22:15 +01004#include <console/uart.h>
Felix Held5f12b7b2021-09-16 22:00:24 +02005#include <types.h>
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +01006
7#include "bmcinfo.h"
8
9typedef struct {
10 u32 magic0; // "BMCI"
11 u32 magic1; // "nfo0"
12 u16 length;
13 u16 chksum;
14 u8 uuid[16];
15 u8 bmcSerial[9]; // as null terminated string
16 u8 slot;
17 u8 corebootVerbosityLevel;
18 u8 relaxSecurity;
19 u32 baudrate;
20 u8 bootOption;
21 u8 hwRev; // Note: Initial implementation ended here
22 u8 disableNic1;
23 u8 endMarker; // Insert new fields before
24} biosBmcInfo_t;
25
26#define BIOSBMCINFO_MAGIC0 0x49434d42
27#define BIOSBMCINFO_MAGIC1 0x306f666e
28
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010029#define BMC_INFO ((biosBmcInfo_t *)CONFIG_BMC_INFO_LOC)
30
31enum biosBmcInfoValidFlag_e {
32 BMCINFO_UNTESTED = 0,
33 BMCINFO_INVALID,
34 BMCINFO_INVALID_WARNED,
35 BMCINFO_VALID_NEED_WARN,
36 BMCINFO_VALID,
37};
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010038static bool bmcinfo_is_valid(size_t minsize)
39{
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030040 static enum biosBmcInfoValidFlag_e biosBmcInfoValidFlag;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010041 const biosBmcInfo_t *bmc_info = BMC_INFO;
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030042 if (biosBmcInfoValidFlag == BMCINFO_UNTESTED) {
43 biosBmcInfoValidFlag = BMCINFO_INVALID;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010044 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))
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030056 biosBmcInfoValidFlag = BMCINFO_VALID;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010057 else
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030058 biosBmcInfoValidFlag = BMCINFO_VALID_NEED_WARN;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010059 }
60 }
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010061 }
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030062 if (ENV_RAMSTAGE && biosBmcInfoValidFlag == BMCINFO_INVALID) {
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010063 int length = offsetof(biosBmcInfo_t, endMarker);
64 printk(BIOS_CRIT, "WARNING bmcInfo struct"
65 "is not available please update your BMC.\n");
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030066 biosBmcInfoValidFlag = BMCINFO_INVALID_WARNED;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010067 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 }
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030079 if (ENV_RAMSTAGE && biosBmcInfoValidFlag == BMCINFO_VALID_NEED_WARN) {
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010080 printk(BIOS_CRIT, "WARNING bmcInfo struct"
81 " is incomplete please update your BMC.\n");
82
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030083 biosBmcInfoValidFlag = BMCINFO_VALID;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010084 }
Kyösti Mälkki2f944f42019-08-18 22:10:51 +030085 if (biosBmcInfoValidFlag < BMCINFO_VALID_NEED_WARN)
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010086 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
94char *bmcinfo_serial(void)
95{
96 if (IS_BMC_INFO_FIELD_VALID(bmcSerial))
Elyes Haouas486240f2022-11-18 15:21:03 +010097 return (char *)BMC_INFO->bmcSerial;
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +010098 return NULL;
99}
100
101u8 *bmcinfo_uuid(void)
102{
103 if (IS_BMC_INFO_FIELD_VALID(uuid))
104 return BMC_INFO->uuid;
105 return NULL;
106}
107
Julien Viard de Galbert0e755d42018-03-07 15:48:54 +0100108int bmcinfo_slot(void)
109{
110 if (IS_BMC_INFO_FIELD_VALID(slot))
111 return BMC_INFO->slot;
112 return -1;
113}
114
115int bmcinfo_hwrev(void)
116{
117 if (IS_BMC_INFO_FIELD_VALID(hwRev))
118 return BMC_INFO->hwRev;
119 return -1;
120}
121
122u32 bmcinfo_baudrate(void)
123{
124 if (IS_BMC_INFO_FIELD_VALID(baudrate))
125 return BMC_INFO->baudrate;
126 return 0;
127}
128
129int bmcinfo_coreboot_verbosity_level(void)
130{
131 if (IS_BMC_INFO_FIELD_VALID(corebootVerbosityLevel))
132 return BMC_INFO->corebootVerbosityLevel & 0xf;
133 return BIOS_CRIT;
134}
135
136int bmcinfo_fsp_verbosity_level(void)
137{
138 if (IS_BMC_INFO_FIELD_VALID(corebootVerbosityLevel))
139 return BMC_INFO->corebootVerbosityLevel >> 4;
140 return 0;
141}
142
143int bmcinfo_relax_security(void)
144{
145 if (IS_BMC_INFO_FIELD_VALID(relaxSecurity))
146 return BMC_INFO->relaxSecurity;
147 return 0;
148}
149
150int bmcinfo_boot_option(void)
151{
152 if (IS_BMC_INFO_FIELD_VALID(bootOption))
153 return BMC_INFO->bootOption;
154 return 0;
155}
156
157int bmcinfo_disable_nic1(void)
158{
159 if (IS_BMC_INFO_FIELD_VALID(disableNic1))
160 return BMC_INFO->disableNic1;
161 return 0;
162}
163
164/* Add override functions below */
Julien Viard de Galbertfad5c442018-03-07 15:50:22 +0100165
Julien Viard de Galbertae6210e2018-02-22 14:22:15 +0100166/* Override default uart baudrate */
167unsigned int get_uart_baudrate(void)
168{
169 int baudrate = bmcinfo_baudrate();
170 if (baudrate)
171 return baudrate;
172 return 115200;
173}
174
Julien Viard de Galbertfad5c442018-03-07 15:50:22 +0100175#if __CONSOLE_ENABLE__
176/* Override default console loglevel */
177int get_console_loglevel(void)
178{
179 return bmcinfo_coreboot_verbosity_level();
180}
181#endif