From 58ff53ec526a4f9da9be099025de08d1f5221a4f Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 21 Sep 2022 15:47:15 +0200 Subject: [PATCH] acpica: report S0-S5 sleep state support Issue #4669 --- repos/libports/src/app/acpica/os.cc | 7 +++++ repos/libports/src/app/acpica/report.cc | 41 +++++++++++++++++++++++++ repos/libports/src/app/acpica/target.mk | 2 +- repos/libports/src/app/acpica/util.h | 4 +-- 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 repos/libports/src/app/acpica/report.cc diff --git a/repos/libports/src/app/acpica/os.cc b/repos/libports/src/app/acpica/os.cc index 869966a8d2..5ac4a79cf5 100644 --- a/repos/libports/src/app/acpica/os.cc +++ b/repos/libports/src/app/acpica/os.cc @@ -129,6 +129,8 @@ struct Acpica::Main void *context; } irq_handler; + Expanding_reporter report_sleep_states { env, "sleep_states", "sleep_states" }; + void init_acpica(); Main(Env &env) @@ -415,6 +417,11 @@ void Acpica::Main::init_acpica() error("AcpiGetDevices (FUJ02E3) failed, status=", status); return; } + + /* report S0-S5 support and the SLP_TYPa/b values to be used by kernel(s) */ + report_sleep_states.generate([&] (auto &xml) { + Acpica::generate_suspend_report(xml); + }); } diff --git a/repos/libports/src/app/acpica/report.cc b/repos/libports/src/app/acpica/report.cc new file mode 100644 index 0000000000..1972a57b22 --- /dev/null +++ b/repos/libports/src/app/acpica/report.cc @@ -0,0 +1,41 @@ +/* + * \brief Generate XML report + * \author Alexander Boettcher + */ + +/* + * Copyright (C) 2018-2022 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#include +#include + +#include "util.h" + +using namespace Acpica; + +using Genode::Reporter; + +void Acpica::generate_suspend_report(Reporter::Xml_generator &xml) +{ + for (unsigned sleep_state = 1; sleep_state < ACPI_S_STATE_COUNT; sleep_state ++) { + UINT8 slp_typa {}; + UINT8 slp_typb {}; + + ACPI_STATUS const result = AcpiGetSleepTypeData (sleep_state, + &slp_typa, + &slp_typb); + + Genode::String<4> const state_name("S", sleep_state); + xml.node(state_name.string(), [&] () { + xml.attribute("supported", result == AE_OK); + if (result == AE_OK) { + xml.attribute("SLP_TYPa", slp_typa); + xml.attribute("SLP_TYPb", slp_typb); + } + }); + } +} diff --git a/repos/libports/src/app/acpica/target.mk b/repos/libports/src/app/acpica/target.mk index 1a09936831..0db7d0f48c 100644 --- a/repos/libports/src/app/acpica/target.mk +++ b/repos/libports/src/app/acpica/target.mk @@ -1,5 +1,5 @@ TARGET := acpica -SRC_CC := os.cc printf.cc +SRC_CC := os.cc printf.cc report.cc REQUIRES := x86 LIBS += base acpica diff --git a/repos/libports/src/app/acpica/util.h b/repos/libports/src/app/acpica/util.h index 40643e68c9..a37d81f5e1 100644 --- a/repos/libports/src/app/acpica/util.h +++ b/repos/libports/src/app/acpica/util.h @@ -17,15 +17,15 @@ extern "C" { #include "acpi.h" } -class Bridge; namespace Acpica { template class Buffer; template class Callback; - void generate_report(Genode::Env &, Bridge *); template void for_each_element(H const head, S *, F const &fn, FSIZE const &fn_size); + + void generate_suspend_report(Genode::Reporter::Xml_generator &); } template