blob: 3d4d11971540e6c2821b5da2518d54748e09553e [file] [log] [blame]
Patrick Georgi406313d2015-07-20 22:01:32 +02001/*
2 * This file is part of the coreboot project.
3 *
Patrick Georgi406313d2015-07-20 22:01:32 +02004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
Patrick Georgi406313d2015-07-20 22:01:32 +020013 */
14
Aaron Durbin30b0c7a2016-07-13 13:01:13 -050015#include <arch/acpi.h>
Matt DeVillier0b9cfe62018-06-26 13:07:32 -050016#include <baseboard/variant.h>
Patrick Georgi406313d2015-07-20 22:01:32 +020017#include <console/console.h>
18#include <cpu/x86/smm.h>
Aaron Durbin3969df82016-07-14 01:09:34 -050019#include <ec/google/chromeec/smm.h>
Aaron Durbince6c3562015-11-11 16:46:27 -060020#include <gpio.h>
Patrick Georgi406313d2015-07-20 22:01:32 +020021#include <soc/iomap.h>
22#include <soc/nvs.h>
23#include <soc/pm.h>
Kyösti Mälkki89d7fd82019-08-13 07:57:34 +030024#include <intelblocks/smihandler.h>
Patrick Georgi406313d2015-07-20 22:01:32 +020025#include "ec.h"
Matt DeVillier0b9cfe62018-06-26 13:07:32 -050026#include <variant/gpio.h>
Patrick Georgi406313d2015-07-20 22:01:32 +020027
28int mainboard_io_trap_handler(int smif)
29{
30 switch (smif) {
31 case 0x99:
32 printk(BIOS_DEBUG, "Sample\n");
33 smm_get_gnvs()->smif = 0;
34 break;
35 default:
36 return 0;
37 }
38
39 /* On success, the IO Trap Handler returns 0
40 * On failure, the IO Trap Handler returns a value != 0
41 *
42 * For now, we force the return value to 0 and log all traps to
43 * see what's going on.
44 */
45 return 1;
46}
47
Aaron Durbin50ed38f2015-08-08 01:25:21 -050048void mainboard_smi_gpi_handler(const struct gpi_status *sts)
Patrick Georgi406313d2015-07-20 22:01:32 +020049{
Aaron Durbin3969df82016-07-14 01:09:34 -050050 if (gpi_status_get(sts, EC_SMI_GPI))
51 chromeec_smi_process_events();
Aaron Durbince6c3562015-11-11 16:46:27 -060052}
53
Matt DeVillier0b9cfe62018-06-26 13:07:32 -050054__weak void mainboard_gpio_smi_sleep(void)
Aaron Durbince6c3562015-11-11 16:46:27 -060055{
Aaron Durbince6c3562015-11-11 16:46:27 -060056}
57
58void mainboard_smi_sleep(u8 slp_typ)
59{
Julius Wernercd49cce2019-03-05 16:53:33 -080060 if (CONFIG(EC_GOOGLE_CHROMEEC))
Aaron Durbin3969df82016-07-14 01:09:34 -050061 chromeec_smi_sleep(slp_typ, MAINBOARD_EC_S3_WAKE_EVENTS,
62 MAINBOARD_EC_S5_WAKE_EVENTS);
Aaron Durbince6c3562015-11-11 16:46:27 -060063
Matt DeVillier0b9cfe62018-06-26 13:07:32 -050064 mainboard_gpio_smi_sleep();
Patrick Georgi406313d2015-07-20 22:01:32 +020065}
66
67int mainboard_smi_apmc(u8 apmc)
68{
Julius Wernercd49cce2019-03-05 16:53:33 -080069 if (CONFIG(EC_GOOGLE_CHROMEEC))
Aaron Durbin3969df82016-07-14 01:09:34 -050070 chromeec_smi_apmc(apmc, MAINBOARD_EC_SCI_EVENTS,
71 MAINBOARD_EC_SMI_EVENTS);
Patrick Georgi406313d2015-07-20 22:01:32 +020072 return 0;
73}