Kernel: Reorder ACPI initialization method calls

This commit is contained in:
Bananymous 2024-12-19 01:45:26 +02:00
parent 53c356a940
commit 00b0dcd306
2 changed files with 32 additions and 26 deletions

View File

@ -624,16 +624,6 @@ acpi_release_global_lock:
{
ASSERT(!m_namespace);
TRY(AML::Namespace::prepare_root_namespace());
m_namespace = &AML::Namespace::root_namespace();
if (auto ret = load_aml_tables("DSDT"_sv, false); ret.is_error())
dwarnln("Could not load DSDT: {}", ret.error());
if (auto ret = load_aml_tables("SSDT"_sv, true); ret.is_error())
dwarnln("Could not load all SSDTs: {}", ret.error());
if (auto ret = load_aml_tables("PSDT"_sv, true); ret.is_error())
dwarnln("Could not load all PSDTs: {}", ret.error());
// https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/16_Waking_and_Sleeping/initialization.html#placing-the-system-in-acpi-mode
// If not hardware-reduced ACPI and SCI_EN is not set
@ -663,6 +653,18 @@ acpi_release_global_lock:
dprintln("Entered ACPI mode");
TRY(AML::Namespace::prepare_root_namespace());
m_namespace = &AML::Namespace::root_namespace();
if (auto ret = load_aml_tables("DSDT"_sv, false); ret.is_error())
dwarnln("Could not load DSDT: {}", ret.error());
if (auto ret = load_aml_tables("SSDT"_sv, true); ret.is_error())
dwarnln("Could not load all SSDTs: {}", ret.error());
if (auto ret = load_aml_tables("PSDT"_sv, true); ret.is_error())
dwarnln("Could not load all PSDTs: {}", ret.error());
dprintln("Loaded ACPI tables");
if (auto ret = m_namespace->post_load_initialize(); ret.is_error())
dwarnln("Failed to initialize ACPI namespace: {}", ret.error());

View File

@ -4,8 +4,8 @@
#include <kernel/ACPI/AML/Node.h>
#include <kernel/ACPI/Headers.h>
#define STA_PRESENT 0x01
#define STA_FUNCTION 0x08
#define STA_PRESENT 0x01
#define STA_FUNCTIONAL 0x08
#include <ctype.h>
@ -150,6 +150,10 @@ namespace Kernel::ACPI::AML
BAN::ErrorOr<void> Namespace::post_load_initialize()
{
auto [sb_path, sb_ref] = TRY(find_named_object({}, TRY(NameString::from_string("\\_SB_"_sv))));
if (sb_ref != nullptr)
TRY(evaluate_ini(sb_path));
BAN::Vector<Scope> to_init;
TRY(to_init.push_back({}));
@ -176,20 +180,6 @@ namespace Kernel::ACPI::AML
return BAN::Iteration::Continue;
}
auto sta_ret = evaluate_sta(child_path);
if (sta_ret.is_error())
return BAN::Iteration::Continue;
if (sta_ret.value() & STA_PRESENT)
(void)evaluate_ini(child_path);
if ((sta_ret.value() & STA_PRESENT) || (sta_ret.value() & STA_FUNCTION))
{
auto child_path_copy = child_path.copy();
if (!child_path_copy.is_error())
(void)to_init_next.push_back(child_path_copy.release_value());
}
(void)for_each_child(current,
[&](const Scope& opregion_path, Reference* opregion_ref) -> BAN::Iteration
{
@ -199,6 +189,20 @@ namespace Kernel::ACPI::AML
}
);
auto sta_ret = evaluate_sta(child_path);
if (sta_ret.is_error())
return BAN::Iteration::Continue;
if (sta_ret.value() & STA_PRESENT)
(void)evaluate_ini(child_path);
if ((sta_ret.value() & STA_PRESENT) || (sta_ret.value() & STA_FUNCTIONAL))
{
auto child_path_copy = child_path.copy();
if (!child_path_copy.is_error())
(void)to_init_next.push_back(child_path_copy.release_value());
}
return BAN::Iteration::Continue;
}
));