blob: d11f3ca8fffa7f380f78451e5f6fe186c69fe26c [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#include <string.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053019
20/*
21 * List of supported C-states in this processor.
22 */
23enum {
24 C_STATE_C0, /* 0 */
25 C_STATE_C1, /* 1 */
26 C_STATE_C1E, /* 2 */
27 C_STATE_C6_SHORT_LAT, /* 3 */
28 C_STATE_C6_LONG_LAT, /* 4 */
29 C_STATE_C7_SHORT_LAT, /* 5 */
30 C_STATE_C7_LONG_LAT, /* 6 */
31 C_STATE_C7S_SHORT_LAT, /* 7 */
32 C_STATE_C7S_LONG_LAT, /* 8 */
33 C_STATE_C8, /* 9 */
34 C_STATE_C9, /* 10 */
35 C_STATE_C10, /* 11 */
36 NUM_C_STATES
37};
38
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053039static const acpi_cstate_t cstate_map[NUM_C_STATES] = {
40 [C_STATE_C0] = {},
41 [C_STATE_C1] = {
42 .latency = 0,
43 .power = C1_POWER,
44 .resource = MWAIT_RES(0, 0),
45 },
46 [C_STATE_C1E] = {
47 .latency = 0,
48 .power = C1_POWER,
49 .resource = MWAIT_RES(0, 1),
50 },
51 [C_STATE_C6_SHORT_LAT] = {
52 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
53 .power = C6_POWER,
54 .resource = MWAIT_RES(2, 0),
55 },
56 [C_STATE_C6_LONG_LAT] = {
57 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
58 .power = C6_POWER,
59 .resource = MWAIT_RES(2, 1),
60 },
61 [C_STATE_C7_SHORT_LAT] = {
62 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
63 .power = C7_POWER,
64 .resource = MWAIT_RES(3, 0),
65 },
66 [C_STATE_C7_LONG_LAT] = {
67 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
68 .power = C7_POWER,
69 .resource = MWAIT_RES(3, 1),
70 },
71 [C_STATE_C7S_SHORT_LAT] = {
72 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
73 .power = C7_POWER,
74 .resource = MWAIT_RES(3, 2),
75 },
76 [C_STATE_C7S_LONG_LAT] = {
77 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
78 .power = C7_POWER,
79 .resource = MWAIT_RES(3, 3),
80 },
81 [C_STATE_C8] = {
82 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
83 .power = C8_POWER,
84 .resource = MWAIT_RES(4, 0),
85 },
86 [C_STATE_C9] = {
87 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
88 .power = C9_POWER,
89 .resource = MWAIT_RES(5, 0),
90 },
91 [C_STATE_C10] = {
92 .latency = C_STATE_LATENCY_FROM_LAT_REG(0),
93 .power = C10_POWER,
94 .resource = MWAIT_RES(6, 0),
95 },
96};
97
Subrata Banik3f559d962019-01-30 18:44:09 +053098static int cstate_set_non_s0ix[] = {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053099 C_STATE_C1E,
100 C_STATE_C6_LONG_LAT,
101 C_STATE_C7S_LONG_LAT
102};
103
Subrata Banik3f559d962019-01-30 18:44:09 +0530104static int cstate_set_s0ix[] = {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530105 C_STATE_C1E,
106 C_STATE_C7S_LONG_LAT,
107 C_STATE_C10
108};
109
Angel Ponse9f10ff2021-10-17 13:28:23 +0200110const acpi_cstate_t *soc_get_cstate_map(size_t *entries)
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530111{
112 static acpi_cstate_t map[MAX(ARRAY_SIZE(cstate_set_s0ix),
113 ARRAY_SIZE(cstate_set_non_s0ix))];
114 int *set;
115 int i;
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300116
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300117 config_t *config = config_of_soc();
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300118
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530119 int is_s0ix_enable = config->s0ix_enable;
120
121 if (is_s0ix_enable) {
122 *entries = ARRAY_SIZE(cstate_set_s0ix);
123 set = cstate_set_s0ix;
124 } else {
125 *entries = ARRAY_SIZE(cstate_set_non_s0ix);
126 set = cstate_set_non_s0ix;
127 }
128
129 for (i = 0; i < *entries; i++) {
Angel Pons14643b32021-10-17 13:21:05 +0200130 map[i] = cstate_map[set[i]];
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530131 map[i].ctype = i + 1;
132 }
133 return map;
134}
135
136void soc_power_states_generation(int core_id, int cores_per_package)
137{
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300138 config_t *config = config_of_soc();
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300139
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530140 if (config->eist_enable)
141 /* Generate P-state tables */
142 generate_p_state_entries(core_id, cores_per_package);
143}
144
145void soc_fill_fadt(acpi_fadt_t *fadt)
146{
147 const uint16_t pmbase = ACPI_BASE_ADDRESS;
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300148
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300149 config_t *config = config_of_soc();
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530150
Meera Ravindranath48c78702019-12-12 10:37:49 +0530151 fadt->pm_tmr_blk = pmbase + PM1_TMR;
152 fadt->pm_tmr_len = 4;
Elyes HAOUAS04071f42020-07-20 17:05:24 +0200153 fadt->x_pm_tmr_blk.space_id = ACPI_ADDRESS_SPACE_IO;
Meera Ravindranath48c78702019-12-12 10:37:49 +0530154 fadt->x_pm_tmr_blk.bit_width = fadt->pm_tmr_len * 8;
155 fadt->x_pm_tmr_blk.bit_offset = 0;
Patrick Rudolphc02bda02020-02-28 10:19:41 +0100156 fadt->x_pm_tmr_blk.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
Meera Ravindranath48c78702019-12-12 10:37:49 +0530157 fadt->x_pm_tmr_blk.addrl = pmbase + PM1_TMR;
158 fadt->x_pm_tmr_blk.addrh = 0x0;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530159
160 if (config->s0ix_enable)
161 fadt->flags |= ACPI_FADT_LOW_PWR_IDLE_S0;
162}
163uint32_t soc_read_sci_irq_select(void)
164{
Angel Ponsf585c6e2021-06-25 10:09:35 +0200165 return read32p(soc_read_pmc_base() + IRQ_REG);
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530166}
167
Kyösti Mälkkic2b0a4f2020-06-28 22:39:59 +0300168void soc_fill_gnvs(struct global_nvs *gnvs)
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530169{
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300170 config_t *config = config_of_soc();
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530171
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530172 /* Enable DPTF based on mainboard configuration */
173 gnvs->dpte = config->dptf_enable;
174
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530175 /* Set USB2/USB3 wake enable bitmaps. */
176 gnvs->u2we = config->usb2_wake_enable_bitmap;
177 gnvs->u3we = config->usb3_wake_enable_bitmap;
Subrata Banikb6df6b02020-01-03 15:29:02 +0530178
179 /* Fill in Above 4GB MMIO resource */
180 sa_fill_gnvs(gnvs);
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530181}
182
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530183int soc_madt_sci_irq_polarity(int sci)
184{
185 return MP_IRQ_POLARITY_HIGH;
186}