payloads/edk2: Disable the CPU Timer Lib unless supported
[coreboot.git] / src / mainboard / google / link / smihandler.c
blob2f42b7da1813c3300ff62ff3f6712e2445503e33
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <acpi/acpi.h>
4 #include <console/console.h>
5 #include <cpu/x86/smm.h>
6 #include <soc/nvs.h>
7 #include <southbridge/intel/bd82x6x/pch.h>
8 #include <southbridge/intel/bd82x6x/me.h>
9 #include <southbridge/intel/common/pmbase.h>
10 #include <northbridge/intel/sandybridge/sandybridge.h>
11 #include <elog.h>
13 /* Include EC functions */
14 #include <ec/google/chromeec/ec.h>
15 #include "ec.h"
17 static u8 mainboard_smi_ec(void)
19 u8 cmd = google_chromeec_get_event();
21 /* Log this event */
22 if (cmd)
23 elog_gsmi_add_event_byte(ELOG_TYPE_EC_EVENT, cmd);
25 switch (cmd) {
26 case EC_HOST_EVENT_LID_CLOSED:
27 printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
29 /* Go to S5 */
30 write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | (0xf << 10));
31 break;
34 return cmd;
37 void mainboard_smi_gpi(u32 gpi_sts)
39 if (gpi_sts & (1 << EC_SMI_GPI)) {
40 /* Process all pending events */
41 while (mainboard_smi_ec() != 0);
45 void mainboard_smi_sleep(u8 slp_typ)
47 /* Disable USB charging if required */
48 switch (slp_typ) {
49 case ACPI_S3:
50 if (gnvs->s3u0 == 0)
51 google_chromeec_set_usb_charge_mode(
52 0, USB_CHARGE_MODE_DISABLED);
53 if (gnvs->s3u1 == 0)
54 google_chromeec_set_usb_charge_mode(
55 1, USB_CHARGE_MODE_DISABLED);
56 break;
57 case ACPI_S5:
58 if (gnvs->s5u0 == 0)
59 google_chromeec_set_usb_charge_mode(
60 0, USB_CHARGE_MODE_DISABLED);
61 if (gnvs->s5u1 == 0)
62 google_chromeec_set_usb_charge_mode(
63 1, USB_CHARGE_MODE_DISABLED);
64 break;
67 /* Disable SCI and SMI events */
68 google_chromeec_set_smi_mask(0);
69 google_chromeec_set_sci_mask(0);
71 /* Clear pending events that may trigger immediate wake */
72 while (google_chromeec_get_event() != EC_HOST_EVENT_NONE)
75 /* Enable wake events */
76 google_chromeec_set_wake_mask(LINK_EC_S3_WAKE_EVENTS);
79 int mainboard_smi_apmc(u8 apmc)
81 switch (apmc) {
82 case APM_CNT_ACPI_ENABLE:
83 google_chromeec_set_smi_mask(0);
84 /* Clear all pending events */
85 while (google_chromeec_get_event() != EC_HOST_EVENT_NONE)
87 google_chromeec_set_sci_mask(LINK_EC_SCI_EVENTS);
88 break;
89 case APM_CNT_ACPI_DISABLE:
90 google_chromeec_set_sci_mask(0);
91 /* Clear all pending events */
92 while (google_chromeec_get_event() != EC_HOST_EVENT_NONE)
94 google_chromeec_set_smi_mask(LINK_EC_SMI_EVENTS);
95 break;
97 return 0;