coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
supermicro_oem.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <types.h>
4 
5 #include <console/console.h>
7 #include <string.h>
8 #include <build.h>
9 #include "ipmi_supermicro_oem.h"
10 
11 #define IPMI_NETFN_OEM 0x30
12 #define IPMI_LUN0_AC_SET_BIOS_VER 0x100
13 #define IPMI_LUN0_AC_SET_BIOS_DATE 0x101
14 #define IPMI_LUN0_SET_BIOS_STRING 0xac
15 
18  char str[16]; // NULL terminated string
20 
21 static void set_coreboot_ver(const uint16_t kcs_port)
22 {
23  const char *coreboot_ver = COREBOOT_VERSION;
24  struct ipmi_oem_set_bios_str bios_ver;
25  struct ipmi_rsp rsp;
26  int ret;
27  size_t i;
28 
29  /* Only 8 characters are visible in UI. Cut of on first dash */
30  for (i = 0; i < 15; i++) {
31  if (coreboot_ver[i] == '-')
32  break;
33  bios_ver.str[i] = coreboot_ver[i];
34  }
35  bios_ver.str[i] = 0;
36  bios_ver.ver = IPMI_LUN0_AC_SET_BIOS_VER;
37 
39  (const unsigned char *) &bios_ver, sizeof(bios_ver),
40  (unsigned char *) &rsp, sizeof(rsp));
41  if (ret < sizeof(rsp) || rsp.completion_code) {
42  printk(BIOS_ERR, "BMC_IPMI: %s command failed (ret=%d resp=0x%x)\n",
43  __func__, ret, rsp.completion_code);
44  }
45 }
46 
47 static void set_coreboot_date(const uint16_t kcs_port)
48 {
49  struct ipmi_oem_set_bios_str bios_ver;
50  struct ipmi_rsp rsp;
51  int ret;
52 
53  strncpy(bios_ver.str, COREBOOT_DMI_DATE, 15);
54  bios_ver.str[15] = 0;
56 
58  (const unsigned char *) &bios_ver, sizeof(bios_ver),
59  (unsigned char *) &rsp, sizeof(rsp));
60  if (ret < sizeof(rsp) || rsp.completion_code) {
61  printk(BIOS_ERR, "BMC_IPMI: %s command failed (ret=%d resp=0x%x)\n",
62  __func__, ret, rsp.completion_code);
63  }
64 }
65 
66 void supermicro_ipmi_oem(const uint16_t kcs_port)
67 {
68  set_coreboot_ver(kcs_port);
69  set_coreboot_date(kcs_port);
70 }
#define printk(level,...)
Definition: stdlib.h:16
int ipmi_kcs_message(int port, int netfn, int lun, int cmd, const unsigned char *inmsg, int inlen, unsigned char *outmsg, int outlen)
Definition: ipmi_kcs.c:222
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
unsigned short uint16_t
Definition: stdint.h:11
char * strncpy(char *to, const char *from, int count)
Definition: string.c:72
uint8_t completion_code
Definition: ipmi_kcs.h:41
#define IPMI_LUN0_AC_SET_BIOS_VER
static void set_coreboot_date(const uint16_t kcs_port)
void supermicro_ipmi_oem(const uint16_t kcs_port)
struct ipmi_oem_set_bios_str __packed
#define IPMI_LUN0_AC_SET_BIOS_DATE
static void set_coreboot_ver(const uint16_t kcs_port)
#define IPMI_LUN0_SET_BIOS_STRING
#define IPMI_NETFN_OEM