i82801gx: read RTC status register to prevent IRQ storm
authorSven Schnelle <svens@stackframe.org>
Wed, 29 Jun 2011 13:05:28 +0000 (15:05 +0200)
committerPatrick Georgi <patrick@georgi-clan.de>
Wed, 29 Jun 2011 14:54:14 +0000 (16:54 +0200)
My Thinkpad appeared dead. After investigation, it turned out
that the RTC Alarm was triggering an RTC PM1 SMI, but the SMI
handler didn't read the status register, so it was triggered again.

This is a really nasty situation, as it means you have to dissemble
your Notebook just to unplug the RTC battery.

Change-Id: I5ac611e8a72deb5f38c86486dbe0693804935723
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/67
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
src/southbridge/intel/i82801gx/smihandler.c

index 434bfebc18826565e90931159f0e4cb858970628..48375e451d63bbcaef1f1054ad2ef94aa0590c38 100644 (file)
@@ -26,6 +26,7 @@
 #include <cpu/x86/cache.h>
 #include <cpu/x86/smm.h>
 #include <device/pci_def.h>
+#include <pc80/mc146818rtc.h>
 #include "i82801gx.h"
 
 /* I945 */
@@ -410,6 +411,7 @@ static void southbridge_smi_apmc(unsigned int node, smm_state_save_area_t *state
 static void southbridge_smi_pm1(unsigned int node, smm_state_save_area_t *state_save)
 {
        u16 pm1_sts;
+       volatile u8 cmos_status;
 
        pm1_sts = reset_pm1_status();
        dump_pm1_status(pm1_sts);
@@ -423,6 +425,12 @@ static void southbridge_smi_pm1(unsigned int node, smm_state_save_area_t *state_
                reg32 = (7 << 10) | (1 << 13);
                outl(reg32, pmbase + PM1_CNT);
        }
+
+       if (pm1_sts & RTC_STS) {
+               /* read RTC status register to disable the interrupt */
+               cmos_status = cmos_read(RTC_REG_C);
+               printk(BIOS_DEBUG, "RTC IRQ status: %02X\n", cmos_status);
+       }
 }
 
 static void southbridge_smi_gpe0(unsigned int node, smm_state_save_area_t *state_save)