hp/pavilion_m6_1035dx: Shutdown when lid is closed on non-ACPI OS

This is handled by generating an SMI when GEVENT22 goes low. This pin
is driven by the EC when the lid opens or closes. This SMI is
disabled when switching to ACPI mode, so ACPI OSes are not affected.

Change-Id: I38193572bf0416fd642002dba94c19257f0f6f5b
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Reviewed-on: http://review.coreboot.org/171
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@gmail.com>
This commit is contained in:
Alexandru Gagniuc 2014-04-17 23:41:19 -05:00
parent 599d668cdd
commit 489ff7ef87
3 changed files with 14 additions and 0 deletions

View File

@ -7,6 +7,7 @@
#define _MAINBOARD_HP_PAVILION_M6_1035DX_EC_H
#define EC_SMI_GEVENT 23
#define EC_LID_GEVENT 22
#ifndef __SMM__
void pavilion_m6_1035dx_ec_init(void);

View File

@ -42,6 +42,7 @@ static void mainboard_enable(device_t dev)
pavilion_m6_1035dx_ec_init();
hudson_configure_gevent_smi(EC_SMI_GEVENT, SMI_MODE_SMI, SMI_LVL_HIGH);
hudson_configure_gevent_smi(EC_LID_GEVENT, SMI_MODE_SMI, SMI_LVL_LOW);
hudson_enable_smi_generation();
/*

View File

@ -12,6 +12,7 @@
#include <delay.h>
#include <ec/compal/ene932/ec.h>
#include <southbridge/amd/agesa/hudson/hudson.h>
#include <southbridge/amd/agesa/hudson/smi.h>
#define ACPI_PM1_CNT_SLEEP(state) ((1 << 13) | (state & 0x7) << 10)
@ -71,16 +72,25 @@ static void handle_ec_smi(void)
ec_process_smi(src);
}
static void handle_lid_smi(void)
{
/* Only triggered in non-ACPI mode on lid close. */
outl(ACPI_PM1_CNT_SLEEP(S4), ACPI_PM1_CNT_BLK);
}
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();
hudson_disable_gevent_smi(EC_LID_GEVENT);
break;
case ACPI_SMI_CMD_DISABLE:
printk(BIOS_DEBUG, "Disable ACPI mode\n");
ec_enter_apm_mode();
hudson_configure_gevent_smi(EC_LID_GEVENT, SMI_MODE_SMI,
SMI_LVL_LOW);
break;
default:
printk(BIOS_DEBUG, "Unhandled ACPI command: 0x%x\n", data);
@ -92,4 +102,6 @@ void mainboard_smi_gpi(uint32_t gpi_sts)
{
if (gpi_sts & (1 << EC_SMI_GEVENT))
handle_ec_smi();
if (gpi_sts & (1 << EC_LID_GEVENT))
handle_lid_smi();
}