1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <console/console.h>
5 #include <cpu/x86/smm.h>
6 #include <ec/acpi/ec.h>
7 #include <mainboard/ec.h>
10 #define EC_STATUS 0x50
11 #define EC_RUNNING (1 << 1)
12 #define EC_DEVICE_CONTROL_1 0x80
13 #define EC_DEVICE_CONTROL_1_PROGAS_ON (1 << 0)
14 #define EC_DEVICE_CONTROL_1_BOOMER_ON (1 << 1)
15 #define EC_DEVICE_CONTROL_1_BT_RF_ON (1 << 2)
16 #define EC_DEVICE_CONTROL_1_TP_ON (1 << 3)
17 #define EC_DEVICE_CONTROL_1_LAN2_RST (1 << 6)
18 #define EC_DEVICE_CONTROL_2 0x81
19 #define EC_DEVICE_CONTROL_2_LAN_1_ON (1 << 0)
20 #define EC_DEVICE_CONTROL_2_LAN_2_ON (1 << 1)
21 #define EC_DEVICE_CONTROL_2_WLAN_ON (1 << 2)
22 #define EC_DEVICE_CONTROL_2_USB_ON (1 << 3)
23 #define EC_DEVICE_CONTROL_2_IDE1_ON (1 << 4)
24 #define EC_DEVICE_CONTROL_2_IDE2_ON (1 << 5)
25 #define EC_DEVICE_CONTROL_2_COM1_ON (1 << 6)
26 #define EC_DEVICE_CONTROL_2_MPI_ON (1 << 7)
28 #define RUNNING_TIMEOUT_MS 3333
30 static bool ec_running(void)
35 stopwatch_init_msecs_expire(&sw
, RUNNING_TIMEOUT_MS
);
37 ec_status
= ec_read(EC_STATUS
);
38 while (!(ec_status
& EC_RUNNING
) && !stopwatch_expired(&sw
));
40 if (!(ec_status
& EC_RUNNING
))
41 printk(BIOS_WARNING
, "EC not ready after %dms\n", RUNNING_TIMEOUT_MS
);
43 return !!(ec_status
& EC_RUNNING
);
46 void ec_enable_devices(bool enable_usb
)
48 uint8_t control_1
, control_2
;
53 control_1
= ec_read(EC_DEVICE_CONTROL_1
);
54 control_2
= ec_read(EC_DEVICE_CONTROL_2
);
56 printk(BIOS_INFO
, "EC previous EDC1: 0x%02x\n", control_1
);
57 printk(BIOS_INFO
, "EC previous EDC2: 0x%02x\n", control_2
);
59 control_1
&= ~(EC_DEVICE_CONTROL_1_BT_RF_ON
);
60 control_1
|= EC_DEVICE_CONTROL_1_BOOMER_ON
;
62 control_2
&= ~(EC_DEVICE_CONTROL_2_WLAN_ON
| EC_DEVICE_CONTROL_2_USB_ON
);
63 control_2
|= EC_DEVICE_CONTROL_2_MPI_ON
;
65 control_2
|= EC_DEVICE_CONTROL_2_USB_ON
;
67 ec_write(EC_DEVICE_CONTROL_1
, control_1
);
68 ec_write(EC_DEVICE_CONTROL_2
, control_2
);
70 printk(BIOS_INFO
, "EC current EDC1: 0x%02x\n", ec_read(EC_DEVICE_CONTROL_1
));
71 printk(BIOS_INFO
, "EC current EDC2: 0x%02x\n", ec_read(EC_DEVICE_CONTROL_2
));
74 void mainboard_smi_sleep(const uint8_t slp_typ
)
76 uint8_t control_1
, control_2
;
78 if (slp_typ
!= ACPI_S5
)
84 control_1
= ec_read(EC_DEVICE_CONTROL_1
);
85 control_2
= ec_read(EC_DEVICE_CONTROL_2
);
87 printk(BIOS_INFO
, "EC previous EDC1: 0x%02x\n", control_1
);
88 printk(BIOS_INFO
, "EC previous EDC2: 0x%02x\n", control_2
);
90 control_1
&= ~(EC_DEVICE_CONTROL_1_BOOMER_ON
);
91 control_2
&= ~(EC_DEVICE_CONTROL_2_USB_ON
| EC_DEVICE_CONTROL_2_MPI_ON
);
93 ec_write(EC_DEVICE_CONTROL_1
, control_1
);
94 ec_write(EC_DEVICE_CONTROL_2
, control_2
);
96 printk(BIOS_INFO
, "EC current EDC1: 0x%02x\n", ec_read(EC_DEVICE_CONTROL_1
));
97 printk(BIOS_INFO
, "EC current EDC2: 0x%02x\n", ec_read(EC_DEVICE_CONTROL_2
));