Prepare v2024.10
[platform/kernel/u-boot.git] / lib / efi_loader / efi_smbios.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  *  EFI application tables support
4  *
5  *  Copyright (c) 2016 Alexander Graf
6  */
7
8 #define LOG_CATEGORY LOGC_EFI
9
10 #include <efi_loader.h>
11 #include <log.h>
12 #include <malloc.h>
13 #include <mapmem.h>
14 #include <smbios.h>
15 #include <linux/sizes.h>
16 #include <asm/global_data.h>
17
18 DECLARE_GLOBAL_DATA_PTR;
19
20 const efi_guid_t smbios3_guid = SMBIOS3_TABLE_GUID;
21
22 enum {
23         TABLE_SIZE      = SZ_4K,
24 };
25
26 /*
27  * Install the SMBIOS table as a configuration table.
28  *
29  * Return:      status code
30  */
31 efi_status_t efi_smbios_register(void)
32 {
33         ulong addr;
34         efi_status_t ret;
35         void *buf;
36
37         addr = gd_smbios_start();
38         if (!addr) {
39                 log_err("No SMBIOS tables to install\n");
40                 return EFI_NOT_FOUND;
41         }
42
43         /* Mark space used for tables */
44         ret = efi_add_memory_map(addr, TABLE_SIZE, EFI_RUNTIME_SERVICES_DATA);
45         if (ret)
46                 return ret;
47
48         log_debug("EFI using SMBIOS tables at %lx\n", addr);
49
50         /* Install SMBIOS information as configuration table */
51         buf = map_sysmem(addr, 0);
52         ret = efi_install_configuration_table(&smbios3_guid, buf);
53         unmap_sysmem(buf);
54
55         return ret;
56 }
57
58 static int install_smbios_table(void)
59 {
60         ulong addr;
61         void *buf;
62
63         if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) ||
64             IS_ENABLED(CONFIG_X86) ||
65             IS_ENABLED(CONFIG_QFW_SMBIOS))
66                 return 0;
67
68         /* Align the table to a 4KB boundary to keep EFI happy */
69         buf = memalign(SZ_4K, TABLE_SIZE);
70         if (!buf)
71                 return log_msg_ret("mem", -ENOMEM);
72
73         addr = map_to_sysmem(buf);
74         if (!write_smbios_table(addr)) {
75                 log_err("Failed to write SMBIOS table\n");
76                 return log_msg_ret("smbios", -EINVAL);
77         }
78
79         /* Make a note of where we put it */
80         log_debug("SMBIOS tables written to %lx\n", addr);
81         gd->arch.smbios_start = addr;
82
83         return 0;
84 }
85 EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, install_smbios_table);