blob: 48446f654d9bc3cf318d81115e6faf9e0ff37af3 [file] [log] [blame]
Tom Rinif739fcd2018-05-07 17:02:21 -04001// SPDX-License-Identifier: GPL-2.0+
Alexander Grafe663b352016-08-19 01:23:29 +02002/*
3 * EFI application tables support
4 *
5 * Copyright (c) 2016 Alexander Graf
Alexander Grafe663b352016-08-19 01:23:29 +02006 */
7
Heinrich Schuchardtc193d9b2021-05-15 18:07:47 +02008#define LOG_CATEGORY LOGC_EFI
9
Alexander Grafe663b352016-08-19 01:23:29 +020010#include <common.h>
11#include <efi_loader.h>
Simon Glassf7ae49f2020-05-10 11:40:05 -060012#include <log.h>
Simon Glass53fab132023-09-20 07:29:51 -060013#include <malloc.h>
Simon Glassa2505fc2018-11-22 13:46:37 -070014#include <mapmem.h>
Alexander Grafe663b352016-08-19 01:23:29 +020015#include <smbios.h>
Simon Glass53fab132023-09-20 07:29:51 -060016#include <linux/sizes.h>
17
18enum {
19 TABLE_SIZE = SZ_4K,
20};
Alexander Grafe663b352016-08-19 01:23:29 +020021
Heinrich Schuchardt76571522018-03-03 15:28:54 +010022/*
23 * Install the SMBIOS table as a configuration table.
24 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010025 * Return: status code
Heinrich Schuchardt76571522018-03-03 15:28:54 +010026 */
27efi_status_t efi_smbios_register(void)
Alexander Grafe663b352016-08-19 01:23:29 +020028{
Simon Glass53fab132023-09-20 07:29:51 -060029 ulong addr;
Heinrich Schuchardt76571522018-03-03 15:28:54 +010030 efi_status_t ret;
Alexander Grafe663b352016-08-19 01:23:29 +020031
Simon Glass53fab132023-09-20 07:29:51 -060032 addr = gd->arch.smbios_start;
33 if (!addr) {
34 log_err("No SMBIOS tables to install\n");
35 return EFI_NOT_FOUND;
Alexander Graf62f37572018-06-18 17:23:00 +020036 }
Alexander Grafe663b352016-08-19 01:23:29 +020037
Simon Glass53fab132023-09-20 07:29:51 -060038 /* Mark space used for tables */
39 ret = efi_add_memory_map(addr, TABLE_SIZE, EFI_RUNTIME_SERVICES_DATA);
40 if (ret)
41 return ret;
42
43 log_debug("EFI using SMBIOS tables at %lx\n", addr);
44
45 /* Install SMBIOS information as configuration table */
46 return efi_install_configuration_table(&smbios_guid,
47 map_sysmem(addr, 0));
Alexander Grafe663b352016-08-19 01:23:29 +020048}
Simon Glass53fab132023-09-20 07:29:51 -060049
50static int install_smbios_table(void)
51{
52 ulong addr;
53 void *buf;
54
55 if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || IS_ENABLED(CONFIG_X86))
56 return 0;
57
58 /* Align the table to a 4KB boundary to keep EFI happy */
59 buf = memalign(SZ_4K, TABLE_SIZE);
60 if (!buf)
61 return log_msg_ret("mem", -ENOMEM);
62
63 addr = map_to_sysmem(buf);
64 if (!write_smbios_table(addr)) {
65 log_err("Failed to write SMBIOS table\n");
66 return log_msg_ret("smbios", -EINVAL);
67 }
68
69 /* Make a note of where we put it */
70 log_debug("SMBIOS tables written to %lx\n", addr);
71 gd->arch.smbios_start = addr;
72
73 return 0;
74}
75EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, install_smbios_table);