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