xref: /aosp_15_r20/external/coreboot/src/ec/google/chromeec/switches.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootmode.h>
4 #include <ec/google/chromeec/ec.h>
5 #include <elog.h>
6 
7 #if CONFIG(EC_GOOGLE_CHROMEEC_LPC)
get_lid_switch(void)8 int get_lid_switch(void)
9 {
10 	if (!CONFIG(VBOOT_LID_SWITCH))
11 		return -1;
12 
13 	return !!(google_chromeec_get_switches() & EC_SWITCH_LID_OPEN);
14 }
15 #endif
16 
get_recovery_mode_switch(void)17 int get_recovery_mode_switch(void)
18 {
19 	/* Check for dedicated recovery switch first. */
20 	if (CONFIG(EC_GOOGLE_CHROMEEC_LPC) &&
21 	    (google_chromeec_get_switches() & EC_SWITCH_DEDICATED_RECOVERY))
22 		return 1;
23 
24 	/* Check if the EC has posted the keyboard recovery event. */
25 	return !!(google_chromeec_get_events_b() &
26 		  EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY));
27 }
28 
get_recovery_mode_retrain_switch(void)29 int get_recovery_mode_retrain_switch(void)
30 {
31 	/*
32 	 * Check if the EC has posted the keyboard recovery event with memory
33 	 * retrain.
34 	 */
35 	return !!(google_chromeec_get_events_b() &
36 		  EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT));
37 }
38 
elog_add_recovery_mode_switch_event(void)39 static void elog_add_recovery_mode_switch_event(void)
40 {
41 	uint64_t events = google_chromeec_get_events_b();
42 	uint8_t event_byte = EC_HOST_EVENT_KEYBOARD_RECOVERY;
43 
44 	if (!(events & EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY)))
45 		return;
46 
47 	if (events & EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT))
48 		event_byte = EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT;
49 
50 	elog_add_event_byte(ELOG_TYPE_EC_EVENT, event_byte);
51 }
52 
clear_recovery_mode_switch(void)53 int clear_recovery_mode_switch(void)
54 {
55 	/* Log elog event before clearing */
56 	elog_add_recovery_mode_switch_event();
57 
58 	/* Clear all host event bits requesting recovery mode. */
59 	return google_chromeec_clear_events_b(
60 		EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY) |
61 		EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT));
62 }
63