blob: 978192786ba0959ab197eaf64a40a8d0caa192be [file] [log] [blame]
Angel Pons32abdd62020-04-05 15:47:03 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05302
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Kyösti Mälkki0c1dd9c2020-06-17 23:37:49 +03004#include <acpi/acpi_gnvs.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07005#include <acpi/acpigen.h>
Kyösti Mälkki13f66502019-03-03 08:01:05 +02006#include <device/mmio.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05307#include <arch/smp/mpspec.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05308#include <intelblocks/cpulib.h>
9#include <intelblocks/pmclib.h>
10#include <intelblocks/acpi.h>
11#include <soc/cpu.h>
12#include <soc/iomap.h>
13#include <soc/nvs.h>
14#include <soc/pci_devs.h>
15#include <soc/pm.h>
Subrata Banikdf29d232019-07-05 16:00:38 +053016#include <soc/soc_chip.h>
Subrata Banikb6df6b02020-01-03 15:29:02 +053017#include <soc/systemagent.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053018
19/*
20 * List of supported C-states in this processor.
21 */
22enum {
23 C_STATE_C0, /* 0 */
24 C_STATE_C1, /* 1 */
25 C_STATE_C1E, /* 2 */
26 C_STATE_C6_SHORT_LAT, /* 3 */
27 C_STATE_C6_LONG_LAT, /* 4 */
28 C_STATE_C7_SHORT_LAT, /* 5 */
29 C_STATE_C7_LONG_LAT, /* 6 */
30 C_STATE_C7S_SHORT_LAT, /* 7 */
31 C_STATE_C7S_LONG_LAT, /* 8 */
32 C_STATE_C8, /* 9 */
33 C_STATE_C9, /* 10 */
34 C_STATE_C10, /* 11 */
35 NUM_C_STATES
36};
37
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053038static const acpi_cstate_t cstate_map[NUM_C_STATES] = {
39 [C_STATE_C0] = {},
40 [C_STATE_C1] = {
41 .latency = 0,
42 .power = C1_POWER,
43 .resource = MWAIT_RES(0, 0),
44 },
45 [C_STATE_C1E] = {
46 .latency = 0,
47 .power = C1_POWER,
48 .resource = MWAIT_RES(0, 1),
49 },
50 [C_STATE_C6_SHORT_LAT] = {
51 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
52 .power = C6_POWER,
53 .resource = MWAIT_RES(2, 0),
54 },
55 [C_STATE_C6_LONG_LAT] = {
56 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
57 .power = C6_POWER,
58 .resource = MWAIT_RES(2, 1),
59 },
60 [C_STATE_C7_SHORT_LAT] = {
61 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
62 .power = C7_POWER,
63 .resource = MWAIT_RES(3, 0),
64 },
65 [C_STATE_C7_LONG_LAT] = {
66 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
67 .power = C7_POWER,
68 .resource = MWAIT_RES(3, 1),
69 },
70 [C_STATE_C7S_SHORT_LAT] = {
71 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
72 .power = C7_POWER,
73 .resource = MWAIT_RES(3, 2),
74 },
75 [C_STATE_C7S_LONG_LAT] = {
76 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
77 .power = C7_POWER,
78 .resource = MWAIT_RES(3, 3),
79 },
80 [C_STATE_C8] = {
81 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
82 .power = C8_POWER,
83 .resource = MWAIT_RES(4, 0),
84 },
85 [C_STATE_C9] = {
86 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
87 .power = C9_POWER,
88 .resource = MWAIT_RES(5, 0),
89 },
90 [C_STATE_C10] = {
91 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
92 .power = C10_POWER,
93 .resource = MWAIT_RES(6, 0),
94 },
95};
96
Subrata Banik3f559d962019-01-30 18:44:09 +053097static int cstate_set_non_s0ix[] = {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053098 C_STATE_C1E,
99 C_STATE_C6_LONG_LAT,
100 C_STATE_C7S_LONG_LAT
101};
102
Subrata Banik3f559d962019-01-30 18:44:09 +0530103static int cstate_set_s0ix[] = {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530104 C_STATE_C1E,
105 C_STATE_C7S_LONG_LAT,
106 C_STATE_C10
107};
108
Angel Ponse9f10ff2021-10-17 13:28:23 +0200109const acpi_cstate_t *soc_get_cstate_map(size_t *entries)
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530110{
111 static acpi_cstate_t map[MAX(ARRAY_SIZE(cstate_set_s0ix),
112 ARRAY_SIZE(cstate_set_non_s0ix))];
113 int *set;
114 int i;
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300115
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300116 config_t *config = config_of_soc();
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300117
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530118 int is_s0ix_enable = config->s0ix_enable;
119
120 if (is_s0ix_enable) {
121 *entries = ARRAY_SIZE(cstate_set_s0ix);
122 set = cstate_set_s0ix;
123 } else {
124 *entries = ARRAY_SIZE(cstate_set_non_s0ix);
125 set = cstate_set_non_s0ix;
126 }
127
128 for (i = 0; i < *entries; i++) {
Angel Pons14643b32021-10-17 13:21:05 +0200129 map[i] = cstate_map[set[i]];
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530130 map[i].ctype = i + 1;
131 }
132 return map;
133}
134
135void soc_power_states_generation(int core_id, int cores_per_package)
136{
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300137 config_t *config = config_of_soc();
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300138
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530139 if (config->eist_enable)
140 /* Generate P-state tables */
141 generate_p_state_entries(core_id, cores_per_package);
142}
143
144void soc_fill_fadt(acpi_fadt_t *fadt)
145{
146 const uint16_t pmbase = ACPI_BASE_ADDRESS;
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300147
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300148 config_t *config = config_of_soc();
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530149
Meera Ravindranath48c78702019-12-12 10:37:49 +0530150 fadt->pm_tmr_blk = pmbase + PM1_TMR;
151 fadt->pm_tmr_len = 4;
Elyes HAOUAS04071f42020-07-20 17:05:24 +0200152 fadt->x_pm_tmr_blk.space_id = ACPI_ADDRESS_SPACE_IO;
Meera Ravindranath48c78702019-12-12 10:37:49 +0530153 fadt->x_pm_tmr_blk.bit_width = fadt->pm_tmr_len * 8;
154 fadt->x_pm_tmr_blk.bit_offset = 0;
Patrick Rudolphc02bda02020-02-28 10:19:41 +0100155 fadt->x_pm_tmr_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
Elyes Haouas987f1f42022-10-11 13:56:30 +0200156 fadt->x_pm_tmr_blk.addrl = fadt->pm_tmr_blk;
Meera Ravindranath48c78702019-12-12 10:37:49 +0530157 fadt->x_pm_tmr_blk.addrh = 0x0;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530158
159 if (config->s0ix_enable)
160 fadt->flags |= ACPI_FADT_LOW_PWR_IDLE_S0;
161}
162uint32_t soc_read_sci_irq_select(void)
163{
Angel Ponsf585c6e2021-06-25 10:09:35 +0200164 return read32p(soc_read_pmc_base() + IRQ_REG);
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530165}
166
Kyösti Mälkkic2b0a4f2020-06-28 22:39:59 +0300167void soc_fill_gnvs(struct global_nvs *gnvs)
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530168{
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300169 config_t *config = config_of_soc();
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530170
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530171 /* Enable DPTF based on mainboard configuration */
172 gnvs->dpte = config->dptf_enable;
173
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530174 /* Set USB2/USB3 wake enable bitmaps. */
175 gnvs->u2we = config->usb2_wake_enable_bitmap;
176 gnvs->u3we = config->usb3_wake_enable_bitmap;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530177}
178
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530179int soc_madt_sci_irq_polarity(int sci)
180{
181 return MP_IRQ_POLARITY_HIGH;
182}