blob: bbb8421ce149229a7395e797aa60e631af6a76c0 [file] [log] [blame]
Tom Rini70df9d62018-05-07 17:02:21 -04001// SPDX-License-Identifier: GPL-2.0+
Alexander Graf66f96e12016-08-19 01:23:29 +02002/*
3 * EFI application tables support
4 *
5 * Copyright (c) 2016 Alexander Graf
Alexander Graf66f96e12016-08-19 01:23:29 +02006 */
7
Heinrich Schuchardt21da91f2021-05-15 18:07:47 +02008#define LOG_CATEGORY LOGC_EFI
9
Alexander Graf66f96e12016-08-19 01:23:29 +020010#include <efi_loader.h>
Simon Glass0f2af882020-05-10 11:40:05 -060011#include <log.h>
Simon Glassaadec122023-09-20 07:29:51 -060012#include <malloc.h>
Simon Glass2d93add2018-11-22 13:46:37 -070013#include <mapmem.h>
Alexander Graf66f96e12016-08-19 01:23:29 +020014#include <smbios.h>
Simon Glassaadec122023-09-20 07:29:51 -060015#include <linux/sizes.h>
16
17enum {
18 TABLE_SIZE = SZ_4K,
19};
Alexander Graf66f96e12016-08-19 01:23:29 +020020
Heinrich Schuchardt7a369c42018-03-03 15:28:54 +010021/*
22 * Install the SMBIOS table as a configuration table.
23 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010024 * Return: status code
Heinrich Schuchardt7a369c42018-03-03 15:28:54 +010025 */
26efi_status_t efi_smbios_register(void)
Alexander Graf66f96e12016-08-19 01:23:29 +020027{
Simon Glassaadec122023-09-20 07:29:51 -060028 ulong addr;
Heinrich Schuchardt7a369c42018-03-03 15:28:54 +010029 efi_status_t ret;
Simon Glassaadec122023-09-20 07:29:51 -060030
31 addr = gd->arch.smbios_start;
32 if (!addr) {
33 log_err("No SMBIOS tables to install\n");
34 return EFI_NOT_FOUND;
35 }
36
37 /* Mark space used for tables */
38 ret = efi_add_memory_map(addr, TABLE_SIZE, EFI_RUNTIME_SERVICES_DATA);
39 if (ret)
40 return ret;
41
42 log_debug("EFI using SMBIOS tables at %lx\n", addr);
Alexander Graf66f96e12016-08-19 01:23:29 +020043
Simon Glassaadec122023-09-20 07:29:51 -060044 /* Install SMBIOS information as configuration table */
45 return efi_install_configuration_table(&smbios_guid,
46 map_sysmem(addr, 0));
47}
48
49static int install_smbios_table(void)
50{
Heinrich Schuchardt9c84c6c2023-11-20 23:25:58 +010051 u64 addr;
52 efi_status_t ret;
Alexander Graf17990072018-06-18 17:23:00 +020053
Simon Glassaadec122023-09-20 07:29:51 -060054 if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || IS_ENABLED(CONFIG_X86))
55 return 0;
Alexander Graf17990072018-06-18 17:23:00 +020056
Heinrich Schuchardt9c84c6c2023-11-20 23:25:58 +010057 addr = SZ_4G;
58 ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
59 EFI_RUNTIME_SERVICES_DATA,
60 efi_size_in_pages(TABLE_SIZE), &addr);
61 if (ret != EFI_SUCCESS)
Simon Glassaadec122023-09-20 07:29:51 -060062 return log_msg_ret("mem", -ENOMEM);
63
Heinrich Schuchardt9c84c6c2023-11-20 23:25:58 +010064 addr = map_to_sysmem((void *)(uintptr_t)addr);
Simon Glassaadec122023-09-20 07:29:51 -060065 if (!write_smbios_table(addr)) {
66 log_err("Failed to write SMBIOS table\n");
67 return log_msg_ret("smbios", -EINVAL);
Alexander Graf17990072018-06-18 17:23:00 +020068 }
Alexander Graf66f96e12016-08-19 01:23:29 +020069
Simon Glassaadec122023-09-20 07:29:51 -060070 /* Make a note of where we put it */
Heinrich Schuchardt9c84c6c2023-11-20 23:25:58 +010071 log_debug("SMBIOS tables written to %llx\n", addr);
Simon Glassaadec122023-09-20 07:29:51 -060072 gd->arch.smbios_start = addr;
73
74 return 0;
Alexander Graf66f96e12016-08-19 01:23:29 +020075}
Simon Glassaadec122023-09-20 07:29:51 -060076EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, install_smbios_table);