Kyösti Mälkki | 4a3f67a | 2020-06-18 13:44:29 +0300 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | |
| 3 | #include <acpi/acpi.h> |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 4 | #include <acpi/acpi_pm.h> |
Fabio Aiuto | fdcf698 | 2022-09-11 12:25:13 +0200 | [diff] [blame] | 5 | #include <assert.h> |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 6 | #include <cbmem.h> |
| 7 | #include <console/console.h> |
Kyösti Mälkki | e0d3868 | 2020-06-07 12:01:58 +0300 | [diff] [blame] | 8 | #include <smbios.h> |
Kyösti Mälkki | 4a3f67a | 2020-06-18 13:44:29 +0300 | [diff] [blame] | 9 | |
Fabio Aiuto | fdcf698 | 2022-09-11 12:25:13 +0200 | [diff] [blame] | 10 | static 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älkki | 4a3f67a | 2020-06-18 13:44:29 +0300 | [diff] [blame] | 16 | void __weak mainboard_suspend_resume(void) |
| 17 | { |
| 18 | } |
Kyösti Mälkki | e0d3868 | 2020-06-07 12:01:58 +0300 | [diff] [blame] | 19 | |
| 20 | /* Default mapping to ACPI FADT preferred_pm_profile field. */ |
| 21 | uint8_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älkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 37 | |
| 38 | struct 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 Aiuto | fdcf698 | 2022-09-11 12:25:13 +0200 | [diff] [blame] | 48 | int acpi_fetch_pm_state(const struct chipset_power_state **ps, |
| 49 | enum power_state_claimer ps_claimer) |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 50 | { |
Fabio Aiuto | fdcf698 | 2022-09-11 12:25:13 +0200 | [diff] [blame] | 51 | assert(ps_claimer < PS_CLAIMER_MAX); |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 52 | *ps = acpi_get_pm_state(); |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 53 | |
Kyösti Mälkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 54 | if (!*ps) { |
Fabio Aiuto | fdcf698 | 2022-09-11 12:25:13 +0200 | [diff] [blame] | 55 | 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älkki | 2787237 | 2021-01-21 16:05:26 +0200 | [diff] [blame] | 58 | return -1; |
| 59 | } |
| 60 | return 0; |
| 61 | } |