# Flashing coreboot using SMC IPMI (BMC) firmware

## Metadata

In order to flash anything to the “BIOS” IC, it needs to contain a valid BIOSINFO struct.

The BIOSINFO struct contains a `$FID` marker at the beginning and is 128 bytes in total. Besides the BoardID it contains the firmware version and build date. The BMC verifies that the BoardID is correct and refuses to flash if it’s not.

The struct has no checksum or cryptographic protection.

## The smcinfobios tool

The smcbiosinfo tool can be found in `util/supermicro/smcbiosinfo`.

It parses the `build/build.h` header to get the current coreboot version and build timestamp. The board ID is passed as command line argument.

It will place a file in CBFS called `smcbiosinfo.bin`, which is then found by the vendor tools. The file contains the struct described above.

## Flashing using SMCIPMItool

You can use the SMCIPMITool to remotely flash the BIOS:

`SMCIPMITool <remote BMC IP> <user> <password> bios update build/coreboot.rom`

Make sure that the ME isn’t in recovery mode, otherwise you get an error message on updating the BIOS.

## Flashing with disabled ME

If ME is disabled via `me_cleaner` or the ME recovery jumper, it is still possible to flash remotely with the `Supermicro Update Manager` (`SUM`).

    ./sum -i <remote BMC IP> -u <user> -p <password> -c UpdateBios --reboot \
      --force_update --file build/coreboot.rom