blob: ccfef0a7522dcec4611f9928c132a48badae9907 [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/acpi.h>
8#include <soc/nvs.h>
9#include <soc/southbridge.h>
10#include <types.h>
11
12static int get_index_bit(uint32_t value, uint16_t limit)
13{
14 uint16_t i;
15 uint32_t t;
16
Felix Held404aea82021-02-02 23:46:25 +010017 if (limit > TOTAL_BITS(uint32_t))
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020018 return -1;
19
20 /* get a mask of valid bits. Ex limit = 3, set bits 0-2 */
Felix Held373769f2021-02-10 18:57:04 +010021 t = (1ULL << limit) - 1;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020022 if ((value & t) == 0)
23 return -1;
24 t = 1;
25 for (i = 0; i < limit; i++) {
26 if (value & t)
27 break;
28 t <<= 1;
29 }
30 return i;
31}
32
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020033static void pm_fill_gnvs(struct global_nvs *gnvs, const struct acpi_pm_gpe_state *state)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020034{
35 int index;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020036
37 index = get_index_bit(state->pm1_sts & state->pm1_en, PM1_LIMIT);
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020038 if (index >= 0)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020039 gnvs->pm1i = index;
40
41 index = get_index_bit(state->gpe0_sts & state->gpe0_en, GPE0_LIMIT);
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020042 if (index >= 0)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020043 gnvs->gpei = index;
44}
45
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020046static void acpi_save_wake_source(void *unused)
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020047{
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020048 const struct chipset_power_state *ps;
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020049 struct global_nvs *gnvs;
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020050
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020051 if (acpi_reset_gnvs_for_wake(&gnvs) < 0)
52 return;
Fabio Aiutofdcf6982022-09-11 12:25:13 +020053 if (acpi_fetch_pm_state(&ps, PS_CLAIMER_WAKE) < 0)
Kyösti Mälkki08bd2072021-01-21 16:41:16 +020054 return;
55
56 pm_fill_gnvs(gnvs, &ps->gpe_state);
Kyösti Mälkkif1b09352020-12-22 06:34:02 +020057}
58
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020059BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_ENTRY, acpi_save_wake_source, NULL);