blob: 23a7d45d8ee5eb929bcbf14813c0b716b723e7cb [file] [log] [blame]
Kyösti Mälkkif1b09352020-12-22 06:34:02 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <acpi/acpi_gnvs.h>
Kyösti Mälkki27872372021-01-21 16:05:26 +02004#include <acpi/acpi_pm.h>
Felix Held4fbae5c2021-02-03 17:27:22 +01005#include <amdblocks/acpi.h>
Kyösti Mälkkif1b09352020-12-22 06:34:02 +02006#include <bootstate.h>
Kyösti Mälkkif1b09352020-12-22 06:34:02 +02007#include <soc/nvs.h>
8#include <soc/southbridge.h>
9#include <types.h>
10
11static int get_index_bit(uint32_t value, uint16_t limit)
12{
13 uint16_t i;
14 uint32_t t;
15
Felix Held404aea82021-02-02 23:46:25 +010016 if (limit > TOTAL_BITS(uint32_t))
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020017 return -1;
18
19 /* get a mask of valid bits. Ex limit = 3, set bits 0-2 */
Felix Held373769f2021-02-10 18:57:04 +010020 t = (1ULL << limit) - 1;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020021 if ((value & t) == 0)
22 return -1;
23 t = 1;
24 for (i = 0; i < limit; i++) {
25 if (value & t)
26 break;
27 t <<= 1;
28 }
29 return i;
30}
31
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020032static void pm_fill_gnvs(struct global_nvs *gnvs, const struct acpi_pm_gpe_state *state)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020033{
34 int index;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020035
36 index = get_index_bit(state->pm1_sts & state->pm1_en, PM1_LIMIT);
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020037 if (index >= 0)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020038 gnvs->pm1i = index;
39
40 index = get_index_bit(state->gpe0_sts & state->gpe0_en, GPE0_LIMIT);
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020041 if (index >= 0)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020042 gnvs->gpei = index;
43}
44
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020045static void acpi_save_wake_source(void *unused)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020046{
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020047 const struct chipset_power_state *ps;
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020048 struct global_nvs *gnvs;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020049
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020050 if (acpi_reset_gnvs_for_wake(&gnvs) < 0)
51 return;
Fabio Aiutofdcf6982022-09-11 12:25:13 +020052 if (acpi_fetch_pm_state(&ps, PS_CLAIMER_WAKE) < 0)
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020053 return;
54
55 pm_fill_gnvs(gnvs, &ps->gpe_state);
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020056}
57
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020058BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_ENTRY, acpi_save_wake_source, NULL);