blob: f02ee403f51919fbf1ba6781ec0a6776ca9335c0 [file] [log] [blame]
Angel Ponsd28443e2020-04-05 13:22:44 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Matt DeVillierc12e5ae2016-11-27 02:19:02 -06002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Matt DeVillierc12e5ae2016-11-27 02:19:02 -06004#include <arch/io.h>
5#include <console/console.h>
6#include <cpu/x86/smm.h>
Kyösti Mälkki661ad462020-12-29 06:26:21 +02007#include <soc/nvs.h>
Matt DeVillierc12e5ae2016-11-27 02:19:02 -06008#include <southbridge/intel/lynxpoint/pch.h>
9#include <southbridge/intel/common/gpio.h>
10#include <southbridge/intel/lynxpoint/me.h>
11#include <northbridge/intel/haswell/haswell.h>
12#include <cpu/intel/haswell/haswell.h>
13#include <elog.h>
14
15/* Include EC functions */
16#include <ec/google/chromeec/ec.h>
Kyösti Mälkki923b8ec2022-11-29 07:36:44 +020017#include <ec/google/chromeec/smm.h>
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060018#include "ec.h"
19
20/* Codec enable: GPIO45 */
21#define GPIO_PP3300_CODEC_EN 45
22/* GPIO46 controls the WLAN_DISABLE_L signal. */
23#define GPIO_WLAN_DISABLE_L 46
24#define GPIO_LTE_DISABLE_L 59
25
26static u8 mainboard_smi_ec(void)
27{
28 u8 cmd = google_chromeec_get_event();
29 u32 pm1_cnt;
30
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060031 /* Log this event */
32 if (cmd)
Kyösti Mälkki9dd1a122019-11-06 11:04:27 +020033 elog_gsmi_add_event_byte(ELOG_TYPE_EC_EVENT, cmd);
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060034
35 switch (cmd) {
36 case EC_HOST_EVENT_LID_CLOSED:
37 printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
38
39 /* Go to S5 */
40 pm1_cnt = inl(get_pmbase() + PM1_CNT);
41 pm1_cnt |= (0xf << 10);
42 outl(pm1_cnt, get_pmbase() + PM1_CNT);
43 break;
44 }
45
46 return cmd;
47}
48
49/* gpi_sts is GPIO 47:32 */
50void mainboard_smi_gpi(u32 gpi_sts)
51{
52 if (gpi_sts & (1 << (EC_SMI_GPI - 32))) {
53 /* Process all pending events */
54 while (mainboard_smi_ec() != 0);
55 }
56}
57
58void mainboard_smi_sleep(u8 slp_typ)
59{
60 /* Disable USB charging if required */
61 switch (slp_typ) {
62 case ACPI_S3:
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030063 if (gnvs->s3u0 == 0)
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060064 google_chromeec_set_usb_charge_mode(
65 0, USB_CHARGE_MODE_DISABLED);
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030066 if (gnvs->s3u1 == 0)
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060067 google_chromeec_set_usb_charge_mode(
68 1, USB_CHARGE_MODE_DISABLED);
69
70 /* Prevent leak from standby rail to WLAN rail in S3. */
71 set_gpio(GPIO_WLAN_DISABLE_L, 0);
72 set_gpio(GPIO_PP3300_CODEC_EN, 0);
73 /* Disable LTE */
74 set_gpio(GPIO_LTE_DISABLE_L, 0);
75
76 /* Enable wake events */
77 google_chromeec_set_wake_mask(MAINBOARD_EC_S3_WAKE_EVENTS);
78 break;
79 case ACPI_S4:
80 case ACPI_S5:
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030081 if (gnvs->s5u0 == 0)
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060082 google_chromeec_set_usb_charge_mode(
83 0, USB_CHARGE_MODE_DISABLED);
Kyösti Mälkki239abaf2020-06-28 12:12:01 +030084 if (gnvs->s5u1 == 0)
Matt DeVillierc12e5ae2016-11-27 02:19:02 -060085 google_chromeec_set_usb_charge_mode(
86 1, USB_CHARGE_MODE_DISABLED);
87
88 /* Prevent leak from standby rail to WLAN rail in S5. */
89 set_gpio(GPIO_WLAN_DISABLE_L, 0);
90 set_gpio(GPIO_PP3300_CODEC_EN, 0);
91 /* Disable LTE */
92 set_gpio(GPIO_LTE_DISABLE_L, 0);
93
94 /* Enable wake events */
95 google_chromeec_set_wake_mask(MAINBOARD_EC_S5_WAKE_EVENTS);
96 break;
97 }
98
99 /* Disable SCI and SMI events */
100 google_chromeec_set_smi_mask(0);
101 google_chromeec_set_sci_mask(0);
102
103 /* Clear pending events that may trigger immediate wake */
Rob Barnesf1ade482021-06-14 10:22:21 -0600104 while (google_chromeec_get_event() != EC_HOST_EVENT_NONE)
105 ;
Matt DeVillierc12e5ae2016-11-27 02:19:02 -0600106}
107
Matt DeVillierc12e5ae2016-11-27 02:19:02 -0600108int mainboard_smi_apmc(u8 apmc)
109{
Kyösti Mälkki923b8ec2022-11-29 07:36:44 +0200110 chromeec_smi_apmc(apmc, MAINBOARD_EC_SCI_EVENTS, MAINBOARD_EC_SMI_EVENTS);
Matt DeVillierc12e5ae2016-11-27 02:19:02 -0600111 return 0;
112}