summaryrefslogtreecommitdiff
path: root/src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c
diff options
context:
space:
mode:
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>2014-04-09 12:24:39 -0500
committerAlexandru Gagniuc <mr.nuke.me@gmail.com>2014-04-17 16:48:57 +0200
commit73639e27170355a2bb9a54a340f5bcd2f3dac161 (patch)
treee06c0142a6e79eea25fa51fb70068ad584978576 /src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c
parent62abbe909d27c7351107b0466acc9ea07b490930 (diff)
downloadcoreboot-73639e27170355a2bb9a54a340f5bcd2f3dac161.tar.xz
hp/pavilion_m6_1035dx: Add SMI handler and handle EC requests
The EC may disable some functionality, such as Caps Lock LED and battery charging if it never receives a command to go in APM mode. If we start it in APM mode, then immediately switch to ACPI mode, it will not get its SCIs serviced until an ACPI OS boots. If its SCIs are not serviced, it may assume the OS has hung. The way we solve this is to initalize the EC in APM mode, and only switch it to ACPI when an ACPI-capable OS issues the ACPI_ENABLE command. The switch has to be handled in SMM. Although we aren't yet processing SMIs from the EC, we are reading the status in order to satisfy the EC that the event is handled. Change-Id: Iffaeb9a6f57841f456c4bce8337dc09b287f8758 Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Reviewed-on: http://review.coreboot.org/5512 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Aaron Durbin <adurbin@gmail.com>
Diffstat (limited to 'src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c')
-rw-r--r--src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c b/src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c
new file mode 100644
index 0000000000..bb9cc2e0a2
--- /dev/null
+++ b/src/mainboard/hp/pavilion_m6_1035dx/mainboard_smi.c
@@ -0,0 +1,77 @@
+/*
+ * SMI handler -- mostly takes care of SMIs from the EC
+ *
+ * Copyright (C) 2014 Alexandru Gagniuc <mr.nuke.me@gmail.com>
+ * Subject to the GNU GPL v2, or (at your option) any later version.
+ */
+#include "ec.h"
+
+#include <console/console.h>
+#include <cpu/x86/smm.h>
+#include <delay.h>
+#include <ec/compal/ene932/ec.h>
+#include <southbridge/amd/agesa/hudson/hudson.h>
+
+enum ec_smi_event {
+ EC_SMI_EVENT_IDLE = 0x80,
+};
+
+/* Tell EC to operate in APM mode. Events generate SMIs instead of SCIs */
+static void ec_enter_apm_mode(void)
+{
+ ec_kbc_write_cmd(0x59);
+ ec_kbc_write_ib(0xE9);
+}
+/* Tell EC to operate in ACPI mode, thus generating SCIs on events, not SMIs */
+static void ec_enter_acpi_mode(void)
+{
+ ec_kbc_write_cmd(0x59);
+ ec_kbc_write_ib(0xE8);
+}
+
+static uint8_t ec_get_smi_event(void)
+{
+ ec_kbc_write_cmd(0x56);
+ return ec_kbc_read_ob();
+}
+
+static void ec_process_smi(uint8_t src)
+{
+ /*
+ * Stub: We aren't processing any events yet, but reading the SMI source
+ * satisfies the EC in terms of responding to the event.
+ */
+
+ printk(BIOS_DEBUG, "EC_SMI event 0x%x\n", src);
+}
+
+static void handle_ec_smi(void)
+{
+ uint8_t src;
+
+ while ((src = ec_get_smi_event()) != EC_SMI_EVENT_IDLE)
+ ec_process_smi(src);
+}
+
+int mainboard_smi_apmc(uint8_t data)
+{
+ switch (data) {
+ case ACPI_SMI_CMD_ENABLE:
+ printk(BIOS_DEBUG, "Enable ACPI mode\n");
+ ec_enter_acpi_mode();
+ break;
+ case ACPI_SMI_CMD_DISABLE:
+ printk(BIOS_DEBUG, "Disable ACPI mode\n");
+ ec_enter_apm_mode();
+ break;
+ default:
+ printk(BIOS_DEBUG, "Unhandled ACPI command: 0x%x\n", data);
+ }
+ return 0;
+}
+
+void mainboard_smi_gpi(uint32_t gpi_sts)
+{
+ if (gpi_sts & (1 << EC_SMI_GEVENT))
+ handle_ec_smi();
+}