blob: 05f14af226d057a99d7640ff725f1e26548bc320 [file] [log] [blame]
Angel Pons96d93d12020-04-05 13:22:23 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauera7198b32012-12-11 16:00:47 -08002
Stefan Reinauera7198b32012-12-11 16:00:47 -08003#include <console/console.h>
4#include <cpu/x86/smm.h>
Kyösti Mälkki661ad462020-12-29 06:26:21 +02005#include <soc/nvs.h>
Stefan Reinauera7198b32012-12-11 16:00:47 -08006#include <southbridge/intel/bd82x6x/pch.h>
7#include <southbridge/intel/bd82x6x/me.h>
Arthur Heymansa0508172018-01-25 11:30:22 +01008#include <southbridge/intel/common/pmutil.h>
Patrick Rudolphecb23992018-07-28 12:47:42 +02009#include <southbridge/intel/common/pmbase.h>
Stefan Reinauera7198b32012-12-11 16:00:47 -080010#include <northbridge/intel/sandybridge/sandybridge.h>
Stefan Reinauera7198b32012-12-11 16:00:47 -080011#include <ec/compal/ene932/ec.h>
12#include "ec.h"
13
Stefan Reinauera7198b32012-12-11 16:00:47 -080014static u8 mainboard_smi_ec(void)
15{
16 u8 src;
Stefan Reinauera7198b32012-12-11 16:00:47 -080017
18 ec_kbc_write_cmd(0x56);
19 src = ec_kbc_read_ob();
Felix Singer81ffd002021-01-07 02:46:17 +000020 printk(BIOS_DEBUG, "%s src: %x\n", __func__, src);
Stefan Reinauera7198b32012-12-11 16:00:47 -080021
22 switch (src) {
23 case EC_BATTERY_CRITICAL:
Stefan Reinauera7198b32012-12-11 16:00:47 -080024 break;
25 case EC_LID_CLOSE:
26 printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
27
Stefan Reinauera7198b32012-12-11 16:00:47 -080028 /* Go to S5 */
Patrick Rudolphecb23992018-07-28 12:47:42 +020029 write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | (0xf << 10));
Stefan Reinauera7198b32012-12-11 16:00:47 -080030 break;
31 }
32
33 return src;
34}
35
Duncan Laurie0edc2242013-04-29 15:04:30 -070036void mainboard_smi_gpi(u32 gpi_sts)
Stefan Reinauera7198b32012-12-11 16:00:47 -080037{
Stefan Reinauera7198b32012-12-11 16:00:47 -080038 if (gpi_sts & (1 << EC_SMI_GPI)) {
39 /* Process all pending events from EC */
Felix Singerfb777b52021-01-07 02:51:30 +000040 do {} while (mainboard_smi_ec() != EC_NO_EVENT);
Felix Singer57ef7c32021-01-07 02:49:46 +000041 } else if (gpi_sts & (1 << EC_LID_GPI)) {
Stefan Reinauera7198b32012-12-11 16:00:47 -080042 printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
43
Stefan Reinauera7198b32012-12-11 16:00:47 -080044 /* Go to S5 */
Patrick Rudolphecb23992018-07-28 12:47:42 +020045 write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | (0xf << 10));
Stefan Reinauera7198b32012-12-11 16:00:47 -080046 }
47}
48
49void mainboard_smi_sleep(u8 slp_typ)
50{
Stefan Reinauera7198b32012-12-11 16:00:47 -080051 /* Disable SCI and SMI events */
52
Stefan Reinauera7198b32012-12-11 16:00:47 -080053 /* Clear pending events that may trigger immediate wake */
54
Stefan Reinauera7198b32012-12-11 16:00:47 -080055 /* Enable wake events */
56
Stefan Reinauera7198b32012-12-11 16:00:47 -080057 /* Tell the EC to Disable USB power */
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030058 if (gnvs->s3u0 == 0 && gnvs->s3u1 == 0) {
Stefan Reinauera7198b32012-12-11 16:00:47 -080059 ec_kbc_write_cmd(0x45);
60 ec_kbc_write_ib(0xF2);
61 }
62}
63
Stefan Reinauera7198b32012-12-11 16:00:47 -080064int mainboard_smi_apmc(u8 apmc)
65{
Stefan Reinauera7198b32012-12-11 16:00:47 -080066 switch (apmc) {
Kyösti Mälkkid4174b52020-06-27 14:25:20 +030067 case APM_CNT_ACPI_ENABLE:
Stefan Reinauera7198b32012-12-11 16:00:47 -080068 /* Clear all pending events */
69 /* EC cmd:59 data:E8 */
70 ec_kbc_write_cmd(0x59);
71 ec_kbc_write_ib(0xE8);
72
73 /* Set LID GPI to generate SCIs */
Kyösti Mälkkib85a87b2014-12-29 11:32:27 +020074 gpi_route_interrupt(EC_LID_GPI, GPI_IS_SCI);
Stefan Reinauera7198b32012-12-11 16:00:47 -080075 break;
Kyösti Mälkkid4174b52020-06-27 14:25:20 +030076 case APM_CNT_ACPI_DISABLE:
Stefan Reinauera7198b32012-12-11 16:00:47 -080077 /* Clear all pending events */
78 /* EC cmd:59 data:e9 */
79 ec_kbc_write_cmd(0x59);
80 ec_kbc_write_ib(0xE9);
81
82 /* Set LID GPI to generate SMIs */
Kyösti Mälkkib85a87b2014-12-29 11:32:27 +020083 gpi_route_interrupt(EC_LID_GPI, GPI_IS_SMI);
Stefan Reinauera7198b32012-12-11 16:00:47 -080084 break;
85 }
86 return 0;
87}