mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-08 11:38:10 +00:00
acpica: adjust acpi device reports
If ACPI IRQs are received but no changes to the watched state for a specified count can be observed, than generate nonetheless a Genode report. Issue #2816
This commit is contained in:
parent
aa8b725457
commit
487e8ea934
@ -109,7 +109,10 @@ struct Acpica::Main
|
|||||||
Genode::Signal_handler<Acpica::Main> sci_irq;
|
Genode::Signal_handler<Acpica::Main> sci_irq;
|
||||||
Genode::Constructible<Genode::Irq_connection> sci_conn;
|
Genode::Constructible<Genode::Irq_connection> sci_conn;
|
||||||
|
|
||||||
Acpica::Reportstate * report = nullptr;
|
Acpica::Reportstate * report { nullptr };
|
||||||
|
|
||||||
|
unsigned unchanged_state_count { 0 };
|
||||||
|
unsigned unchanged_state_max;
|
||||||
|
|
||||||
static struct Irq_handler {
|
static struct Irq_handler {
|
||||||
UINT32 irq;
|
UINT32 irq;
|
||||||
@ -122,7 +125,8 @@ struct Acpica::Main
|
|||||||
Main(Genode::Env &env)
|
Main(Genode::Env &env)
|
||||||
:
|
:
|
||||||
env(env),
|
env(env),
|
||||||
sci_irq(env.ep(), *this, &Main::acpi_irq)
|
sci_irq(env.ep(), *this, &Main::acpi_irq),
|
||||||
|
unchanged_state_max(config.xml().attribute_value("update_unchanged", 20U))
|
||||||
{
|
{
|
||||||
bool const enable_reset = config.xml().attribute_value("reset", false);
|
bool const enable_reset = config.xml().attribute_value("reset", false);
|
||||||
bool const enable_poweroff = config.xml().attribute_value("poweroff", false);
|
bool const enable_poweroff = config.xml().attribute_value("poweroff", false);
|
||||||
@ -177,8 +181,24 @@ struct Acpica::Main
|
|||||||
|
|
||||||
AcpiOsWaitEventsComplete();
|
AcpiOsWaitEventsComplete();
|
||||||
|
|
||||||
if (report)
|
if (report) {
|
||||||
report->generate_report();
|
bool const changed = report->generate_report();
|
||||||
|
|
||||||
|
if (unchanged_state_max) {
|
||||||
|
if (changed)
|
||||||
|
unchanged_state_count = 0;
|
||||||
|
else
|
||||||
|
unchanged_state_count ++;
|
||||||
|
|
||||||
|
if (unchanged_state_count >= unchanged_state_max) {
|
||||||
|
Genode::log("generate report because of ",
|
||||||
|
unchanged_state_count, " irqs without state "
|
||||||
|
"changes");
|
||||||
|
report->generate_report(true);
|
||||||
|
unchanged_state_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (res == ACPI_INTERRUPT_HANDLED)
|
if (res == ACPI_INTERRUPT_HANDLED)
|
||||||
return;
|
return;
|
||||||
|
@ -71,9 +71,12 @@ class Acpica::Reportstate {
|
|||||||
void lid_event() { _changed_lid = true; }
|
void lid_event() { _changed_lid = true; }
|
||||||
void ac_event() { _changed_ac = true; battery_event(); }
|
void ac_event() { _changed_ac = true; battery_event(); }
|
||||||
|
|
||||||
void generate_report()
|
bool generate_report(bool force = false)
|
||||||
{
|
{
|
||||||
if (_changed_lid) {
|
bool const changed = _changed_sb || _changed_ec ||
|
||||||
|
_changed_fixed || _changed_lid || _changed_ac;
|
||||||
|
|
||||||
|
if (_changed_lid || force) {
|
||||||
_changed_lid = false;
|
_changed_lid = false;
|
||||||
if (_lid)
|
if (_lid)
|
||||||
Genode::Reporter::Xml_generator xml(_reporter_lid, [&] () {
|
Genode::Reporter::Xml_generator xml(_reporter_lid, [&] () {
|
||||||
@ -81,7 +84,7 @@ class Acpica::Reportstate {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_changed_ac) {
|
if (_changed_ac || force) {
|
||||||
_changed_ac = false;
|
_changed_ac = false;
|
||||||
Genode::Reporter::Xml_generator xml(_reporter_ac, [&] () {
|
Genode::Reporter::Xml_generator xml(_reporter_ac, [&] () {
|
||||||
for (Callback<Ac> * ac = _list_ac.first(); ac; ac = ac->next())
|
for (Callback<Ac> * ac = _list_ac.first(); ac; ac = ac->next())
|
||||||
@ -89,7 +92,7 @@ class Acpica::Reportstate {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_changed_ec) {
|
if (_changed_ec || force) {
|
||||||
_changed_ec = false;
|
_changed_ec = false;
|
||||||
Genode::Reporter::Xml_generator xml(_reporter_ec, [&] () {
|
Genode::Reporter::Xml_generator xml(_reporter_ec, [&] () {
|
||||||
for (Callback<Ec> * ec = _list_ec.first(); ec; ec = ec->next())
|
for (Callback<Ec> * ec = _list_ec.first(); ec; ec = ec->next())
|
||||||
@ -97,7 +100,7 @@ class Acpica::Reportstate {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_changed_sb) {
|
if (_changed_sb || force) {
|
||||||
_changed_sb = false;
|
_changed_sb = false;
|
||||||
Genode::Reporter::Xml_generator xml(_reporter_sb, [&] () {
|
Genode::Reporter::Xml_generator xml(_reporter_sb, [&] () {
|
||||||
for (Callback<Battery> * sb = _list_sb.first(); sb; sb = sb->next())
|
for (Callback<Battery> * sb = _list_sb.first(); sb; sb = sb->next())
|
||||||
@ -105,12 +108,14 @@ class Acpica::Reportstate {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_changed_fixed) {
|
if (_changed_fixed || force) {
|
||||||
_changed_fixed = false;
|
_changed_fixed = false;
|
||||||
if (_fixed)
|
if (_fixed)
|
||||||
Genode::Reporter::Xml_generator xml(_reporter_fix, [&] () {
|
Genode::Reporter::Xml_generator xml(_reporter_fix, [&] () {
|
||||||
_fixed->generate(xml);
|
_fixed->generate(xml);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user