blob: ff305a6b13ef8e19679103cac679980fea604a9a [file] [log] [blame]
Bin Meng2cfbdae2018-06-27 20:38:03 -07001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * EFI application ACPI tables support
4 *
5 * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
6 */
7
Bin Meng2cfbdae2018-06-27 20:38:03 -07008#include <efi_loader.h>
Simon Glass0f2af882020-05-10 11:40:05 -06009#include <log.h>
Simon Glass367f00d2021-12-01 09:02:42 -070010#include <mapmem.h>
Simon Glass858fed12020-04-08 16:57:36 -060011#include <acpi/acpi_table.h>
Simon Glass8965f292023-07-15 21:39:17 -060012#include <asm/global_data.h>
13
14DECLARE_GLOBAL_DATA_PTR;
Bin Meng2cfbdae2018-06-27 20:38:03 -070015
16static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
17
18/*
19 * Install the ACPI table as a configuration table.
20 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010021 * Return: status code
Bin Meng2cfbdae2018-06-27 20:38:03 -070022 */
23efi_status_t efi_acpi_register(void)
24{
Simon Glass8965f292023-07-15 21:39:17 -060025 ulong addr, start, end;
Bin Meng2cfbdae2018-06-27 20:38:03 -070026 efi_status_t ret;
27
Simon Glassd7d7a032025-01-10 17:00:25 -070028 /*
29 * The bloblist is already marked reserved. For now, we don't bother
30 * marking it with EFI_ACPI_RECLAIM_MEMORY since we would need to cut a
31 * hole in the EFI_BOOT_SERVICES_CODE region added by
32 * add_u_boot_and_runtime(). At some point that function could create a
33 * more detailed map.
34 */
35 if (IS_ENABLED(CONFIG_BLOBLIST_TABLES))
36 return EFI_SUCCESS;
37
Simon Glass8965f292023-07-15 21:39:17 -060038 /* Mark space used for tables */
39 start = ALIGN_DOWN(gd->arch.table_start, EFI_PAGE_MASK);
40 end = ALIGN(gd->arch.table_end, EFI_PAGE_MASK);
41 ret = efi_add_memory_map(start, end - start, EFI_ACPI_RECLAIM_MEMORY);
Bin Meng2cfbdae2018-06-27 20:38:03 -070042 if (ret != EFI_SUCCESS)
43 return ret;
Simon Glass8965f292023-07-15 21:39:17 -060044 if (gd->arch.table_start_high) {
45 start = ALIGN_DOWN(gd->arch.table_start_high, EFI_PAGE_MASK);
46 end = ALIGN(gd->arch.table_end_high, EFI_PAGE_MASK);
47 ret = efi_add_memory_map(start, end - start,
48 EFI_ACPI_RECLAIM_MEMORY);
49 if (ret != EFI_SUCCESS)
50 return ret;
51 }
Bin Meng2cfbdae2018-06-27 20:38:03 -070052
Simon Glass8965f292023-07-15 21:39:17 -060053 addr = gd_acpi_start();
Heinrich Schuchardt3b56ffd2024-04-09 22:48:24 +020054 log_debug("EFI using ACPI tables at %lx\n", addr);
Bin Meng2cfbdae2018-06-27 20:38:03 -070055
56 /* And expose them to our EFI payload */
57 return efi_install_configuration_table(&acpi_guid,
Simon Glass8965f292023-07-15 21:39:17 -060058 (void *)(ulong)addr);
Bin Meng2cfbdae2018-06-27 20:38:03 -070059}