blob: 719076b3f8d359e2c7def19d65ab8469e1f06754 [file] [log] [blame]
Angel Ponsfeedf232020-04-05 13:22:01 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauer49428d82013-02-21 15:48:37 -08002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Stefan Reinauer49428d82013-02-21 15:48:37 -08004#include <console/console.h>
5#include <cpu/x86/smm.h>
Kyösti Mälkki661ad462020-12-29 06:26:21 +02006#include <soc/nvs.h>
Stefan Reinauer49428d82013-02-21 15:48:37 -08007#include <southbridge/intel/bd82x6x/pch.h>
8#include <southbridge/intel/bd82x6x/me.h>
Patrick Rudolphbaea5992018-06-28 14:10:27 +02009#include <southbridge/intel/common/pmbase.h>
Stefan Reinauer49428d82013-02-21 15:48:37 -080010#include <northbridge/intel/sandybridge/sandybridge.h>
Stefan Reinauer49428d82013-02-21 15:48:37 -080011#include <elog.h>
12
Stefan Reinauer49428d82013-02-21 15:48:37 -080013/* Include EC functions */
14#include <ec/google/chromeec/ec.h>
15#include "ec.h"
16
Stefan Reinauer49428d82013-02-21 15:48:37 -080017static u8 mainboard_smi_ec(void)
18{
19 u8 cmd = google_chromeec_get_event();
Stefan Reinauer49428d82013-02-21 15:48:37 -080020
Stefan Reinauer49428d82013-02-21 15:48:37 -080021 /* Log this event */
22 if (cmd)
Kyösti Mälkki9dd1a122019-11-06 11:04:27 +020023 elog_gsmi_add_event_byte(ELOG_TYPE_EC_EVENT, cmd);
Stefan Reinauer49428d82013-02-21 15:48:37 -080024
25 switch (cmd) {
26 case EC_HOST_EVENT_LID_CLOSED:
27 printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
28
29 /* Go to S5 */
Patrick Rudolphbaea5992018-06-28 14:10:27 +020030 write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | (0xf << 10));
Stefan Reinauer49428d82013-02-21 15:48:37 -080031 break;
32 }
33
34 return cmd;
35}
36
Duncan Laurie0edc2242013-04-29 15:04:30 -070037void mainboard_smi_gpi(u32 gpi_sts)
Stefan Reinauer49428d82013-02-21 15:48:37 -080038{
39 if (gpi_sts & (1 << EC_SMI_GPI)) {
40 /* Process all pending events */
41 while (mainboard_smi_ec() != 0);
42 }
43}
44
45void mainboard_smi_sleep(u8 slp_typ)
46{
47 /* Disable USB charging if required */
48 switch (slp_typ) {
Aaron Durbin30b0c7a2016-07-13 13:01:13 -050049 case ACPI_S3:
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030050 if (gnvs->s3u0 == 0)
Stefan Reinauer49428d82013-02-21 15:48:37 -080051 google_chromeec_set_usb_charge_mode(
52 0, USB_CHARGE_MODE_DISABLED);
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030053 if (gnvs->s3u1 == 0)
Stefan Reinauer49428d82013-02-21 15:48:37 -080054 google_chromeec_set_usb_charge_mode(
55 1, USB_CHARGE_MODE_DISABLED);
56 break;
Aaron Durbin30b0c7a2016-07-13 13:01:13 -050057 case ACPI_S5:
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030058 if (gnvs->s5u0 == 0)
Stefan Reinauer49428d82013-02-21 15:48:37 -080059 google_chromeec_set_usb_charge_mode(
60 0, USB_CHARGE_MODE_DISABLED);
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030061 if (gnvs->s5u1 == 0)
Stefan Reinauer49428d82013-02-21 15:48:37 -080062 google_chromeec_set_usb_charge_mode(
63 1, USB_CHARGE_MODE_DISABLED);
64 break;
65 }
66
67 /* Disable SCI and SMI events */
68 google_chromeec_set_smi_mask(0);
69 google_chromeec_set_sci_mask(0);
70
71 /* Clear pending events that may trigger immediate wake */
72 while (google_chromeec_get_event() != 0);
73
74 /* Enable wake events */
75 google_chromeec_set_wake_mask(LINK_EC_S3_WAKE_EVENTS);
76}
77
Stefan Reinauer49428d82013-02-21 15:48:37 -080078int mainboard_smi_apmc(u8 apmc)
79{
80 switch (apmc) {
Kyösti Mälkkid4174b52020-06-27 14:25:20 +030081 case APM_CNT_ACPI_ENABLE:
Stefan Reinauer49428d82013-02-21 15:48:37 -080082 google_chromeec_set_smi_mask(0);
83 /* Clear all pending events */
84 while (google_chromeec_get_event() != 0);
85 google_chromeec_set_sci_mask(LINK_EC_SCI_EVENTS);
86 break;
Kyösti Mälkkid4174b52020-06-27 14:25:20 +030087 case APM_CNT_ACPI_DISABLE:
Stefan Reinauer49428d82013-02-21 15:48:37 -080088 google_chromeec_set_sci_mask(0);
89 /* Clear all pending events */
90 while (google_chromeec_get_event() != 0);
Idwer Volleringd26da9c2013-12-22 21:38:18 +000091 google_chromeec_set_smi_mask(LINK_EC_SMI_EVENTS);
Stefan Reinauer49428d82013-02-21 15:48:37 -080092 break;
93 }
94 return 0;
95}