blob: 40a3fbd7ad2d1caa8fa84de28337d2fd60e66c89 [file] [log] [blame]
Kyösti Mälkki4a3f67a2020-06-18 13:44:29 +03001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <acpi/acpi.h>
Kyösti Mälkki27872372021-01-21 16:05:26 +02004#include <acpi/acpi_pm.h>
Fabio Aiutofdcf6982022-09-11 12:25:13 +02005#include <assert.h>
Kyösti Mälkki27872372021-01-21 16:05:26 +02006#include <cbmem.h>
7#include <console/console.h>
Kyösti Mälkkie0d38682020-06-07 12:01:58 +03008#include <smbios.h>
Kyösti Mälkki4a3f67a2020-06-18 13:44:29 +03009
Fabio Aiutofdcf6982022-09-11 12:25:13 +020010static const char *pm_fetch_failure_msg[PS_CLAIMER_MAX] = {
11 [PS_CLAIMER_ELOG] = "no event recorded in ELOG.",
12 [PS_CLAIMER_RTC] = "RTC init aborted.",
13 [PS_CLAIMER_WAKE] = "wake source unknown.",
14};
15
Kyösti Mälkki4a3f67a2020-06-18 13:44:29 +030016void __weak mainboard_suspend_resume(void)
17{
18}
Kyösti Mälkkie0d38682020-06-07 12:01:58 +030019
20/* Default mapping to ACPI FADT preferred_pm_profile field. */
21uint8_t acpi_get_preferred_pm_profile(void)
22{
23 switch (smbios_mainboard_enclosure_type()) {
24 case SMBIOS_ENCLOSURE_LAPTOP:
25 case SMBIOS_ENCLOSURE_CONVERTIBLE:
26 return PM_MOBILE;
27 case SMBIOS_ENCLOSURE_DETACHABLE:
28 case SMBIOS_ENCLOSURE_TABLET:
29 return PM_TABLET;
30 case SMBIOS_ENCLOSURE_DESKTOP:
31 return PM_DESKTOP;
32 case SMBIOS_ENCLOSURE_UNKNOWN:
33 default:
34 return PM_UNSPECIFIED;
35 }
36}
Kyösti Mälkki27872372021-01-21 16:05:26 +020037
38struct chipset_power_state *acpi_get_pm_state(void)
39{
40 static struct chipset_power_state *acpi_pm_state;
41 if (acpi_pm_state)
42 return acpi_pm_state;
43
44 acpi_pm_state = cbmem_find(CBMEM_ID_POWER_STATE);
45 return acpi_pm_state;
46}
47
Fabio Aiutofdcf6982022-09-11 12:25:13 +020048int acpi_fetch_pm_state(const struct chipset_power_state **ps,
49 enum power_state_claimer ps_claimer)
Kyösti Mälkki27872372021-01-21 16:05:26 +020050{
Fabio Aiutofdcf6982022-09-11 12:25:13 +020051 assert(ps_claimer < PS_CLAIMER_MAX);
Kyösti Mälkki27872372021-01-21 16:05:26 +020052 *ps = acpi_get_pm_state();
Kyösti Mälkki27872372021-01-21 16:05:26 +020053
Kyösti Mälkki27872372021-01-21 16:05:26 +020054 if (!*ps) {
Fabio Aiutofdcf6982022-09-11 12:25:13 +020055 printk(BIOS_ERR, "No CBMEM_ID_POWER_STATE entry, %s\n",
56 ps_claimer < PS_CLAIMER_MAX ?
57 pm_fetch_failure_msg[ps_claimer] : "unknown claimer.");
Kyösti Mälkki27872372021-01-21 16:05:26 +020058 return -1;
59 }
60 return 0;
61}