1*86df34d4SBin Meng // SPDX-License-Identifier: GPL-2.0+ 2*86df34d4SBin Meng /* 3*86df34d4SBin Meng * EFI application ACPI tables support 4*86df34d4SBin Meng * 5*86df34d4SBin Meng * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com> 6*86df34d4SBin Meng */ 7*86df34d4SBin Meng 8*86df34d4SBin Meng #include <common.h> 9*86df34d4SBin Meng #include <efi_loader.h> 10*86df34d4SBin Meng #include <asm/acpi_table.h> 11*86df34d4SBin Meng 12*86df34d4SBin Meng static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID; 13*86df34d4SBin Meng 14*86df34d4SBin Meng /* 15*86df34d4SBin Meng * Install the ACPI table as a configuration table. 16*86df34d4SBin Meng * 17*86df34d4SBin Meng * @return status code 18*86df34d4SBin Meng */ efi_acpi_register(void)19*86df34d4SBin Mengefi_status_t efi_acpi_register(void) 20*86df34d4SBin Meng { 21*86df34d4SBin Meng /* Map within the low 32 bits, to allow for 32bit ACPI tables */ 22*86df34d4SBin Meng u64 acpi = U32_MAX; 23*86df34d4SBin Meng efi_status_t ret; 24*86df34d4SBin Meng 25*86df34d4SBin Meng /* Reserve 64kiB page for ACPI */ 26*86df34d4SBin Meng ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS, 27*86df34d4SBin Meng EFI_RUNTIME_SERVICES_DATA, 16, &acpi); 28*86df34d4SBin Meng if (ret != EFI_SUCCESS) 29*86df34d4SBin Meng return ret; 30*86df34d4SBin Meng 31*86df34d4SBin Meng /* 32*86df34d4SBin Meng * Generate ACPI tables - we know that efi_allocate_pages() returns 33*86df34d4SBin Meng * a 4k-aligned address, so it is safe to assume that 34*86df34d4SBin Meng * write_acpi_tables() will write the table at that address. 35*86df34d4SBin Meng */ 36*86df34d4SBin Meng assert(!(acpi & 0xf)); 37*86df34d4SBin Meng write_acpi_tables(acpi); 38*86df34d4SBin Meng 39*86df34d4SBin Meng /* And expose them to our EFI payload */ 40*86df34d4SBin Meng return efi_install_configuration_table(&acpi_guid, 41*86df34d4SBin Meng (void *)(uintptr_t)acpi); 42*86df34d4SBin Meng } 43