xref: /openbmc/qemu/hw/uefi/hardware-info.c (revision 50aa3d0984d8a4a9c39d34e2f81e8a70674462e4)
1*8d127aa8SGerd Hoffmann /*
2*8d127aa8SGerd Hoffmann  * SPDX-License-Identifier: GPL-2.0-or-later
3*8d127aa8SGerd Hoffmann  *
4*8d127aa8SGerd Hoffmann  * pass hardware information to uefi
5*8d127aa8SGerd Hoffmann  *
6*8d127aa8SGerd Hoffmann  * see OvmfPkg/Library/HardwareInfoLib/ in edk2
7*8d127aa8SGerd Hoffmann  */
8*8d127aa8SGerd Hoffmann 
9*8d127aa8SGerd Hoffmann #include "qemu/osdep.h"
10*8d127aa8SGerd Hoffmann 
11*8d127aa8SGerd Hoffmann #include "hw/nvram/fw_cfg.h"
12*8d127aa8SGerd Hoffmann #include "hw/uefi/hardware-info.h"
13*8d127aa8SGerd Hoffmann 
14*8d127aa8SGerd Hoffmann static void      *blob;
15*8d127aa8SGerd Hoffmann static uint64_t  blobsize;
16*8d127aa8SGerd Hoffmann 
hardware_info_register(HARDWARE_INFO_TYPE type,void * info,uint64_t infosize)17*8d127aa8SGerd Hoffmann void hardware_info_register(HARDWARE_INFO_TYPE type, void *info, uint64_t infosize)
18*8d127aa8SGerd Hoffmann {
19*8d127aa8SGerd Hoffmann     HARDWARE_INFO_HEADER hdr = {
20*8d127aa8SGerd Hoffmann         .type.value = cpu_to_le64(type),
21*8d127aa8SGerd Hoffmann         .size       = cpu_to_le64(infosize),
22*8d127aa8SGerd Hoffmann     };
23*8d127aa8SGerd Hoffmann 
24*8d127aa8SGerd Hoffmann     blob = g_realloc(blob, blobsize + sizeof(hdr) + infosize);
25*8d127aa8SGerd Hoffmann     memcpy(blob + blobsize, &hdr, sizeof(hdr));
26*8d127aa8SGerd Hoffmann     blobsize += sizeof(hdr);
27*8d127aa8SGerd Hoffmann     memcpy(blob + blobsize, info, infosize);
28*8d127aa8SGerd Hoffmann     blobsize += infosize;
29*8d127aa8SGerd Hoffmann 
30*8d127aa8SGerd Hoffmann     fw_cfg_modify_file(fw_cfg_find(), "etc/hardware-info", blob, blobsize);
31*8d127aa8SGerd Hoffmann }
32