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