From patchwork Sat Dec 23 01:03:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1879822 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=gmx.de header.i=xypron.glpk@gmx.de header.a=rsa-sha256 header.s=s31663417 header.b=i9oWsd7o; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SxmCH6qXBz20R1 for ; Sat, 23 Dec 2023 12:04:11 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id B6FD68753D; Sat, 23 Dec 2023 02:04:00 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; secure) header.d=gmx.de header.i=xypron.glpk@gmx.de header.b="i9oWsd7o"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 001D78646E; Sat, 23 Dec 2023 02:03:58 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 121A086FF7 for ; Sat, 23 Dec 2023 02:03:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1703293431; x=1703898231; i=xypron.glpk@gmx.de; bh=V16r3y5KMEKEFTjNS0xX9/jD6U8jBVmSsoIgU0S0yWE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=i9oWsd7ofi3zG06qQ8z22o2EoJ+86x80pPqqNzWmfI8BB536CND6VLOjOQwTQJRc gdSBs0Ht7a9Ql0ITvTBOZIZWkxEYf3h1ff8ih12KEFd0dqoXY5fIAM8ZCJJMeywGU nTdFaBxv5aifhFH8gGHEmv95PKG5l5IBlSDUKixpyHPPmmGJDkOCIAdNBrElGb57T ShwQJ6YUm+iT0Z6iPNcz9uKNW3VZNQBmvTS+n8Q8z/znVXBp4siE1OjoVBp6bpMeh mzwNYBmzHcvvDpg5/2LOahOZL5ZJXA5tXYjOkQIhRlxYPXG1xoQ9a0IJN7080W2vd eAkpvkG8ErslCISqkQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from x13s.fritz.box ([178.202.40.247]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MmDEm-1qqY5O2xeK-00iAol; Sat, 23 Dec 2023 02:03:50 +0100 From: Heinrich Schuchardt To: Tom Rini Cc: Simon Glass , Bin Meng , Ilias Apalodimas , u-boot@lists.denx.de, Rick Chen , Leo , Tuomas Tynkkynen , Heinrich Schuchardt Subject: [PATCH v2 1/2] smbios: SMBIOS 3.0 (64-bit) Entry Point structure Date: Sat, 23 Dec 2023 02:03:33 +0100 Message-ID: <20231223010334.248291-2-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231223010334.248291-1-xypron.glpk@gmx.de> References: <20231223010334.248291-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:/w5LlgzDvG5EAFM/mHBBwHMJuLEh+oQGJSJK5n0VrAXdBaLuL48 4ggko662lBBACNE1OZS5+k+vK3mI0cD3mnCiglqUuUiuHz6FAD71Nw6UNL+8u1HkpLKcwFS K88rI/ICRBLBjiIPL17l7ZDReZeePXGunj5nQrClgT3O487SO96rwV4NIdCojdWEHbl6Wy5 BWP4vEQKQSvKiJZsUorZw== UI-OutboundReport: notjunk:1;M01:P0:3J9xeHdieD0=;JbuVssrIlAMecpX43UZyun6yrhl BmAhwmw0h225LePq1+xBK4TeCGff/BHtBglzH+GKdy31e5bI7MIpQXl8rsIhF2hG+J22sJn58 ym8ZIELKpFHoXe6T0+lM0vfP94xIHAl0//Sqr0KLBUtJrmj+lFTydDxdZ8QAmWiQQW/JcksvW zi1nvPAwhVkW56L/aklHpUcp3rF66SfQKyRqoK8Xdihq2PGe3ubWuTyZGxfTjA8PpoOo5GPzu OGExQoXWRsIswS57G7+P7CaTe5hJS0DQDQiX6kXfgjOkf1Yfna3udAsDxeWe3UmRyeiFA5miH Mb7TTCbVIgWpkWSqBGYT0twoYGAlZBoPsRT3D/Zi5F2cD00GN+XYQuhogq8KFJSEl0VyTFNAk uCwOycRJlutswsbmgnvB97iMl+u0g9/AZg60e9tRj+jR/HoRtF+PvWBslg9b3uE6WWvdYIVOY 376bf7hEIv3E2fxK8wVIEOKYp/40IYZCG8MWl+WSG2hGjBpCT0nnIl73bFoHhPHjWR/DDQLKP GG4BD2RGlA84Y9eyHfGsok/YmcRJFeKNpO/eqz3Khc/tAk6W9xrXCw+9pRARYZunnzkw8u9I2 s6uMhriBuUKFE77fVSVToqSLTzgtUhLk5x8KaOLPmnU8fawsnoIBjfzFQT3FaFrB/UYLIntl+ +K4+50UPoGc7wQH2mSfgFGiOGabi4S43YCplsG1SeXMCr+S3kGULMFGHR+AbR9TF3zjuog/+8 nJkO4cNnEAo2hqJiX9f4eDeniF3CV9GN6I/VCNU4/6CXcjP+qdc1f2DrBeesQT0Bu1fTKTHJ2 oh0CbQ56LO7X7QmPNr8sO0H1aC7fH2Z9iVzan7qjcOtHoPDP8B/4RtjxZvBsJpYrbDf6Ewv7g KsUkZJ0FZSGH1hjsZEun6XBYyssPB8FbgTZRZRHoJECqfaR1y+3mg2mVNI77UH2Qq1Cpz0YPQ lULR+5V1osmUkcujH0NL3qhXSOQ= X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean From: Heinrich Schuchardt Add definition of the SMBIOS 3.0 (64-bit) Entry Point structure. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass Reviewed-by: Ilias Apalodimas --- v2: no change --- include/smbios.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) -- 2.43.0 diff --git a/include/smbios.h b/include/smbios.h index c9df2706f5..e601283d29 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -54,6 +54,32 @@ struct __packed smbios_entry { u8 bcd_rev; }; +/** + * struct smbios3_entry - SMBIOS 3.0 (64-bit) Entry Point structure + */ +struct __packed smbios3_entry { + /** @anchor: anchor string */ + u8 anchor[5]; + /** @checksum: checksum of the entry point structure */ + u8 checksum; + /** @length: length of the entry point structure */ + u8 length; + /** @major_ver: major version of the SMBIOS specification */ + u8 major_ver; + /** @minor_ver: minor version of the SMBIOS specification */ + u8 minor_ver; + /** @docrev: revision of the SMBIOS specification */ + u8 doc_rev; + /** @entry_point_rev: revision of the entry point structure */ + u8 entry_point_rev; + /** @reserved: reserved */ + u8 reserved; + /** maximum size of SMBIOS table */ + u32 max_struct_size; + /** @struct_table_address: 64-bit physical starting address */ + u64 struct_table_address; +}; + /* BIOS characteristics */ #define BIOS_CHARACTERISTICS_PCI_SUPPORTED (1 << 7) #define BIOS_CHARACTERISTICS_UPGRADEABLE (1 << 11) From patchwork Sat Dec 23 01:03:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1879823 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=gmx.de header.i=xypron.glpk@gmx.de header.a=rsa-sha256 header.s=s31663417 header.b=q7EJcier; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SxmCT3TJ6z20R1 for ; Sat, 23 Dec 2023 12:04:21 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 58A7187640; Sat, 23 Dec 2023 02:04:03 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; secure) header.d=gmx.de header.i=xypron.glpk@gmx.de header.b="q7EJcier"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 715B4874AC; Sat, 23 Dec 2023 02:04:00 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 4C097874AC for ; Sat, 23 Dec 2023 02:03:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1703293431; x=1703898231; i=xypron.glpk@gmx.de; bh=sLSlAziIHs8/2dmnyyM5SSxCR7JSUbqf+Q36TRTz3rg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=q7EJcierLYjTOtCSqAt9+NDMVZULUsJ0nuRhfk9Fv5z89G+f2mV3+sQ56hl189IG OYPEvGo1Jc56S7N0KMo4bfuycaPKRScZ5jFweXyh+cOzS7Jt52ciSe+S9jmkmnAYp RV+9FThryCDgoK1LNyEkMpubKieuhVV3R/3s/mLolxrnnjsmSl3nSgolnYD799gCg rJCqtaaRKON3PZLx2I5pi5Dzw23Oc+qSQqgeZRrDRmK4cN9pbLcQhE6wvX7nOZ7SS QQg2o6/qoVQSEwypckK37aWOW9r7dEZbRob2qKd1uAY8Y3i5naVeL9nTt6aclEXd/ HrjrK/6Zc1KcHEdQfQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from x13s.fritz.box ([178.202.40.247]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M7JzQ-1rML8d16rs-007j4x; Sat, 23 Dec 2023 02:03:51 +0100 From: Heinrich Schuchardt To: Tom Rini Cc: Simon Glass , Bin Meng , Ilias Apalodimas , u-boot@lists.denx.de, Rick Chen , Leo , Tuomas Tynkkynen , Heinrich Schuchardt Subject: [PATCH v2 2/2] smbios: copy QEMU tables Date: Sat, 23 Dec 2023 02:03:34 +0100 Message-ID: <20231223010334.248291-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231223010334.248291-1-xypron.glpk@gmx.de> References: <20231223010334.248291-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:bJ7mTccEOWtFjmNvRauke1ZT5H+aE5al+GZpeR9Zbm6fKVXpzay cVE2F24rah0gdaEnhP3JtQvfCBmBgrytTY3hCwpnC5hqjTpVY60VWq2XxWULCwLQfIx2V48 F64QGtcj6tOT27W/KlOXjATNGQ+46UBnn+ENT2tDNNs5VCdyMwUWlyNcs3dZyEJF01XSoN0 ID5zF+J64OWhrJxry8cog== UI-OutboundReport: notjunk:1;M01:P0:c8o3iiwCGvw=;xKiciQbWU3q/NjuYqSifhTgyAns dYTG6fBijksAriWlQinqG/w5AMmrvVm4cPftVkCsrytM7V5FfNzlTitka9nQR4kOoB0sjzHRu ghrvd9lsHiehuFbM3TzPXt1E1mACZzke5Ajr0DwAaSDqIqAMih8r6iHKLOr9LEtIT6hYZij0r F5wwbkWlUJqK7+cKhrkzQto1KBS3ukVFzdGp7HiAdXTVnG0VmHaY5wgi8ur25vydVrtJoygOW wqCR5c2j2FzJhXfmr8yHNPKbkf1fj/8L4W0wnVp9F+ODYv0w+cl1nXIGEuptYobF+rqEervOc 5s66vnU6D6iTWedZtJQpq3xkDC05APHhDaYr4OwEGE6UTynK9wvqWw+syKC6v+Tg+gkLV2M49 hxoZUoO6D3q9LeYRI34ucpwIkgA3X4qP8NmTJ9wuB6RjEdq5eiAmOQ89OQaMaQMGPEykr4wjT KTi0LHJ9qJ+s7tHpnFwk0wFEU1gkpTmAWyH+qQrUgWRJ35MU1sCmW1ofJFbVBo9/TticgMlQi G8DN/8xEmwX2XUbqeYxSukIJO2t97589vbtLz9Q1QxmE5QKvTTrUfelAw9LGP8BRGHHV9aljL TqYquhpFHHhwTs85sh6dRrEEeetHuDq248yRio7GFv4zmdoKXpqM2jGdjFQU0SH3TOfBCJxkM hxcWaHHlex3Ct+AImx6ew7IdmB2IpjllObDvt7PCN7VLhsVXgxL7GEV7rFlVxNgyT2L+Vldqt pZAzHyIN4eBA1kzlwre1v3lqGGshbQLEg6DtOH8fiwszGHax7Bu6vkMt/C8Koa5/fO5b/2oAI 3/Cmu3JGk8aUlp4kr1jrc32PrrC644JnQ2ZlJM+ffue9DO9JU0e0ReBZD2OzwEG2h4rMFlQj6 vPAj67nrOzo1zLvuLcg6+b6NKgwZZzhcaznfW6I4PICxyrDiz7LBOfkZ/YB9m7STwsUcgNgIh p7zbTqQ2GOfp948phycMO9bajBU= X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean From: Heinrich Schuchardt QEMU provides SMBIOS tables with detailed information. We should not try to replicate them in U-Boot. If we want to inform about U-Boot, we can add a Firmware Inventory Information (type 45) table in future. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- v2: fix parsing of SMBIOS anchor enable copying on x86 and 32bit ARM/RISC-V --- arch/x86/lib/tables.c | 2 +- drivers/misc/Kconfig | 7 ++ drivers/misc/Makefile | 1 + drivers/misc/qfw_smbios.c | 197 ++++++++++++++++++++++++++++++++++++ lib/efi_loader/efi_smbios.c | 4 +- 5 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 drivers/misc/qfw_smbios.c -- 2.43.0 diff --git a/arch/x86/lib/tables.c b/arch/x86/lib/tables.c index 5b5070f7ca..914d9de0cb 100644 --- a/arch/x86/lib/tables.c +++ b/arch/x86/lib/tables.c @@ -61,7 +61,7 @@ static struct table_info table_list[] = { #ifdef CONFIG_GENERATE_ACPI_TABLE { "acpi", write_acpi_tables, BLOBLISTT_ACPI_TABLES, 0x10000, 0x1000}, #endif -#ifdef CONFIG_GENERATE_SMBIOS_TABLE +#if defined(CONFIG_GENERATE_SMBIOS_TABLE) && !defined(CONFIG_QFW_SMBIOS) { "smbios", write_smbios_table, BLOBLISTT_SMBIOS_TABLES, 0x1000, 0x100}, #endif }; diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index e8e4400516..d2536c54e0 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -561,6 +561,13 @@ config QFW_MMIO Hidden option to enable MMIO QEMU fw_cfg interface. This will be selected by the appropriate QEMU board. +config QFW_SMBIOS + bool + default y + depends on QFW && SMBIOS && !SANDBOX + help + Hidden option to read SMBIOS tables from QEMU. + config I2C_EEPROM bool "Enable driver for generic I2C-attached EEPROMs" depends on MISC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index cda701d38e..64bea92f51 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -66,6 +66,7 @@ obj-y += qfw.o obj-$(CONFIG_QFW_ACPI) += qfw_acpi.o obj-$(CONFIG_QFW_PIO) += qfw_pio.o obj-$(CONFIG_QFW_MMIO) += qfw_mmio.o +obj-$(CONFIG_QFW_SMBIOS) += qfw_smbios.o obj-$(CONFIG_SANDBOX) += qfw_sandbox.o endif obj-$(CONFIG_ROCKCHIP_EFUSE) += rockchip-efuse.o diff --git a/drivers/misc/qfw_smbios.c b/drivers/misc/qfw_smbios.c new file mode 100644 index 0000000000..9019345783 --- /dev/null +++ b/drivers/misc/qfw_smbios.c @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright 2023 Heinrich Schuchardt + */ + +#define LOG_CATEGORY UCLASS_QFW + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/** + * qfw_load_smbios_table() - load a QEMU firmware file + * + * @dev: QEMU firmware device + * @size: parameter to return the size of the loaded table + * @name: name of the table to load + * Return: address of the loaded table, NULL on error + */ +static void *qfw_load_smbios_table(struct udevice *dev, uint32_t *size, + char *name) +{ + struct fw_file *file; + struct bios_linker_entry *table; + + file = qfw_find_file(dev, name); + if (!file) { + log_debug("Can't find %s\n", name); + return NULL; + } + + *size = be32_to_cpu(file->cfg.size); + + table = malloc(*size); + if (!table) { + log_err("Out of memory\n"); + return NULL; + } + + qfw_read_entry(dev, be16_to_cpu(file->cfg.select), *size, table); + + return table; +} + +/** + * qfw_parse_smbios_anchor() - parse QEMU's SMBIOS anchor + * + * @dev: QEMU firmware device + * @entry: SMBIOS 3 structure to be filled from QEMU's anchor + * Return: 0 for success, -ve on error + */ +static int qfw_parse_smbios_anchor(struct udevice *dev, + struct smbios3_entry *entry) +{ + void *table; + uint32_t size; + struct smbios_entry *entry2; + struct smbios3_entry *entry3; + const char smbios_sig[] = "_SM_"; + const char smbios3_sig[] = "_SM3_"; + int ret = 0; + + table = qfw_load_smbios_table(dev, &size, "etc/smbios/smbios-anchor"); + if (!table) + return -ENOMEM; + if (!memcmp(table, smbios3_sig, sizeof(smbios3_sig) - 1)) { + entry3 = table; + if (entry3->length != sizeof(struct smbios3_entry)) { + ret = -ENOENT; + goto out; + } + memcpy(entry, entry3, sizeof(struct smbios3_entry)); + } else if (!memcmp(table, smbios_sig, sizeof(smbios_sig) - 1)) { + entry2 = table; + if (entry2->length != sizeof(struct smbios_entry)) { + ret = -ENOENT; + goto out; + } + memset(entry, 0, sizeof(struct smbios3_entry)); + memcpy(entry, smbios3_sig, sizeof(smbios3_sig)); + entry->length = sizeof(struct smbios3_entry); + entry->major_ver = entry2->major_ver; + entry->minor_ver = entry2->minor_ver; + entry->max_struct_size = entry2->max_struct_size; + } else { + ret = -ENOENT; + goto out; + } + ret = 0; +out: + free(table); + + return ret; +} + +/** + * qfw_write_smbios_tables() - copy SMBIOS tables from QEMU + * + * @addr: target buffer + * @size: size of target buffer + * Return: 0 for success, -ve on error + */ +static int qfw_write_smbios_tables(u8 *addr, uint32_t size) +{ + int ret; + struct udevice *dev; + struct smbios3_entry *entry = (void *)addr; + void *table; + uint32_t table_size; + + ret = qfw_get_dev(&dev); + if (ret) { + log_err("No QEMU firmware device\n"); + return ret; + } + + ret = qfw_read_firmware_list(dev); + if (ret) { + log_err("Can't read firmware file list\n"); + return ret; + } + + ret = qfw_parse_smbios_anchor(dev, entry); + if (ret) { + log_debug("Can't parse anchor\n"); + return ret; + } + + addr += entry->length; + entry->struct_table_address = (uintptr_t)addr; + entry->checksum = 0; + entry->checksum = table_compute_checksum(entry, + sizeof(struct smbios3_entry)); + + table = qfw_load_smbios_table(dev, &table_size, + "etc/smbios/smbios-tables"); + if (table_size + sizeof(struct smbios3_entry) > size) { + free(table); + return -ENOMEM; + } + memcpy(addr, table, table_size); + free(table); + + return 0; +} + +/** + * qfw_evt_write_smbios_tables() - event handler for copying QEMU SMBIOS tables + * + * Return: 0 on success, -ve on error (only out of memory) + */ +static int qfw_evt_write_smbios_tables(void) +{ + phys_addr_t addr; + void *ptr; + int ret; + /* + * TODO: + * This size is currently hard coded in lib/efi_loader/efi_smbios.c. + * We need a field in global data for the size. + */ + uint32_t size = SZ_4K; + + /* Reserve 64K for SMBIOS tables, aligned to a 4K boundary */ + ptr = memalign(SZ_4K, size); + if (!ptr) { + log_err("Out of memory\n"); + return -ENOMEM; + } + addr = map_to_sysmem(ptr); + + /* Generate SMBIOS tables */ + ret = qfw_write_smbios_tables(ptr, size); + if (ret) { + if (CONFIG_IS_ENABLED(GENERATE_SMBIOS_TABLE)) { + log_info("Falling back to U-Boot generated SMBIOS tables\n"); + write_smbios_table(addr); + } + } else { + log_debug("SMBIOS tables copied from QEMU\n"); + } + + gd_set_smbios_start(addr); + + return 0; +} + +EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, qfw_evt_write_smbios_tables); diff --git a/lib/efi_loader/efi_smbios.c b/lib/efi_loader/efi_smbios.c index bbb8421ce1..c4837da969 100644 --- a/lib/efi_loader/efi_smbios.c +++ b/lib/efi_loader/efi_smbios.c @@ -51,7 +51,9 @@ static int install_smbios_table(void) u64 addr; efi_status_t ret; - if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || IS_ENABLED(CONFIG_X86)) + if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || + IS_ENABLED(CONFIG_X86) || + IS_ENABLED(CONFIG_QFW_SMBIOS)) return 0; addr = SZ_4G;