summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichał Żygowski <michal.zygowski@3mdeb.com>2023-10-13 16:23:01 +0200
committerMichał Żygowski <michal.zygowski@3mdeb.com>2023-10-19 07:45:02 +0000
commitfa78ecacec2694753068a9e769a3d68d5dad2b62 (patch)
tree085dd6d4c94087b53b30778d47765cb644ce28d2 /src
parent55606625bbf734432657c93017417cd853a1b2b7 (diff)
superio/smsc/sch5545/acpi/superio.asl: Clear PME status bits on SCI
The SCI handler for the GPE associated with the Super I/O did not clear the respective PME status bits resulting in the SCI reoccurring endlessly. The /proc/interrupts reported millions of ACPI interrupts generated in just a few minutes of uptime. The flood of interrupts caused some units to be unusable in extreme cases once attempted to boot Qubes OS for example. On systems like Qubes OS it had a huge impact on performance due to many IPCs the SCIs caused under Xen. Clear the PME bits of devices that report a PME event. Then clear the global PME status bit at the end of SCI handler to prevent the SCI from asserting again until a new event occurrs. With this change the number of ACPI interrupts generated in the first minutes of uptime settles at a few thousands. TEST=Boot Qubes OS R4.1.2 on Dell OptiPlex 9010 SFF and check /proc/interrupts in dom0 if the number of ACPI interrupts is only a few thousands. Change-Id: I64e03d268138a62b46084be41343ef7fb089dfc3 Signed-off-by: Michał Żygowski <michal.zygowski@3mdeb.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78351 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Krystian Hebel <krystian.hebel@3mdeb.com>
Diffstat (limited to 'src')
-rw-r--r--src/superio/smsc/sch5545/acpi/superio.asl29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/superio/smsc/sch5545/acpi/superio.asl b/src/superio/smsc/sch5545/acpi/superio.asl
index 7ef8fcf728..06ef7b018b 100644
--- a/src/superio/smsc/sch5545/acpi/superio.asl
+++ b/src/superio/smsc/sch5545/acpi/superio.asl
@@ -56,7 +56,6 @@ Device(SIO1) {
Name (IOST, 0x0001) /* IO decoding status */
Name (MSFG, 1) /* Mouse wake config */
Name (KBFG, 1) /* Keyboard wake config */
- Name (PMFG, 0) /* Wake config */
/* SuperIO configuration ports */
OperationRegion (CREG, SystemIO, SUPERIO_PNP_BASE, 0x02)
@@ -338,7 +337,6 @@ Device(SIO1) {
/* SIO wake method */
Method (SIOW, 1, NotSerialized)
{
- PMFG = PMS1
If (Arg0 == 1)
{
GPKM ()
@@ -362,15 +360,38 @@ Device(SIO1) {
Method (SIOH, 0, NotSerialized)
{
- If (PMFG & 0x08)
+ Local0 = PMS1
+
+ If (Local0 & 0x08)
{
+ PMS1 = 0x08
Notify (PS2K, 0x02) // Device Wake
}
- If (PMFG & 0x10)
+ If (Local0 & 0x10)
{
+ PMS1 = 0x10
Notify (PS2M, 0x02) // Device Wake
}
+
+ If (Local0 & 0x04)
+ {
+ PMS1 = 0x04
+#ifdef SCH5545_SHOW_UARTA
+ Notify (UAR1, 0x02) // Device Wake
+#endif
+ }
+
+ If (Local0 & 0x02)
+ {
+ PMS1 = 0x02
+#ifdef SCH5545_SHOW_UARTB
+ Notify (UAR2, 0x02) // Device Wake
+#endif
+ }
+
+ Local0 = PMES
+ PMES = (Local0 & 1)
}
#endif // SCH5545_RUNTIME_BASE
#endif // SCH5545_SHOW_KBC