1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #define __SIMPLE_DEVICE__
7 #include <acpi/acpi_pm.h>
10 #include <console/console.h>
11 #include <device/device.h>
12 #include <device/mmio.h>
13 #include <device/pci.h>
14 #include <device/pci_ops.h>
17 #include <security/vboot/vbnv.h>
18 #include <soc/iomap.h>
20 #include <soc/pci_devs.h>
23 uint16_t get_pmbase(void)
25 return pci_read_config16(PCI_DEV(0, PCU_DEV
, 0), ABASE
) & 0xfff8;
28 static void print_num_status_bits(int num_bits
, uint32_t status
, const char *const bit_names
[])
35 for (i
= num_bits
- 1; i
>= 0; i
--) {
36 if (status
& (1 << i
)) {
38 printk(BIOS_DEBUG
, "%s ", bit_names
[i
]);
40 printk(BIOS_DEBUG
, "BIT%d ", i
);
45 static uint32_t print_smi_status(uint32_t smi_sts
)
47 static const char *const smi_sts_bits
[] = {
70 printk(BIOS_DEBUG
, "SMI_STS: ");
71 print_num_status_bits(30, smi_sts
, smi_sts_bits
);
72 printk(BIOS_DEBUG
, "\n");
77 static uint32_t reset_smi_status(void)
79 uint16_t pmbase
= get_pmbase();
80 uint32_t smi_sts
= inl(pmbase
+ SMI_STS
);
81 outl(smi_sts
, pmbase
+ SMI_STS
);
85 uint32_t clear_smi_status(void)
87 return print_smi_status(reset_smi_status());
90 void enable_smi(uint32_t mask
)
92 uint16_t pmbase
= get_pmbase();
93 uint32_t smi_en
= inl(pmbase
+ SMI_EN
);
95 outl(smi_en
, pmbase
+ SMI_EN
);
98 void disable_smi(uint32_t mask
)
100 uint16_t pmbase
= get_pmbase();
101 uint32_t smi_en
= inl(pmbase
+ SMI_EN
);
103 outl(smi_en
, pmbase
+ SMI_EN
);
106 void enable_pm1_control(uint32_t mask
)
108 uint16_t pmbase
= get_pmbase();
109 uint32_t pm1_cnt
= inl(pmbase
+ PM1_CNT
);
111 outl(pm1_cnt
, pmbase
+ PM1_CNT
);
114 void disable_pm1_control(uint32_t mask
)
116 uint16_t pmbase
= get_pmbase();
117 uint32_t pm1_cnt
= inl(pmbase
+ PM1_CNT
);
119 outl(pm1_cnt
, pmbase
+ PM1_CNT
);
122 static uint16_t reset_pm1_status(void)
124 uint16_t pmbase
= get_pmbase();
125 uint16_t pm1_sts
= inw(pmbase
+ PM1_STS
);
126 outw(pm1_sts
, pmbase
+ PM1_STS
);
130 static uint16_t print_pm1_status(uint16_t pm1_sts
)
132 static const char *const pm1_sts_bits
[] = {
146 printk(BIOS_SPEW
, "PM1_STS: ");
147 print_num_status_bits(16, pm1_sts
, pm1_sts_bits
);
148 printk(BIOS_SPEW
, "\n");
153 uint16_t clear_pm1_status(void)
155 return print_pm1_status(reset_pm1_status());
158 void enable_pm1(uint16_t events
)
160 outw(events
, get_pmbase() + PM1_EN
);
163 static uint32_t print_tco_status(uint32_t tco_sts
)
165 static const char *const tco_sts_bits
[] = {
173 printk(BIOS_DEBUG
, "TCO_STS: ");
174 print_num_status_bits(18, tco_sts
, tco_sts_bits
);
175 printk(BIOS_DEBUG
, "\n");
180 static uint32_t reset_tco_status(void)
182 uint16_t pmbase
= get_pmbase();
183 uint32_t tco_sts
= inl(pmbase
+ TCO_STS
);
184 uint32_t tco_en
= inl(pmbase
+ TCO1_CNT
);
186 outl(tco_sts
, pmbase
+ TCO_STS
);
187 return tco_sts
& tco_en
;
190 uint32_t clear_tco_status(void)
192 return print_tco_status(reset_tco_status());
195 void enable_gpe(uint32_t mask
)
197 uint16_t pmbase
= get_pmbase();
198 uint32_t gpe0_en
= inl(pmbase
+ GPE0_EN
);
200 outl(gpe0_en
, pmbase
+ GPE0_EN
);
203 void disable_gpe(uint32_t mask
)
205 uint16_t pmbase
= get_pmbase();
206 uint32_t gpe0_en
= inl(pmbase
+ GPE0_EN
);
208 outl(gpe0_en
, pmbase
+ GPE0_EN
);
211 void disable_all_gpe(void)
216 static uint32_t reset_gpe_status(void)
218 uint16_t pmbase
= get_pmbase();
219 uint32_t gpe_sts
= inl(pmbase
+ GPE0_STS
);
220 outl(gpe_sts
, pmbase
+ GPE0_STS
);
224 static uint32_t print_gpe_sts(uint32_t gpe_sts
)
226 static const char *const gpe_sts_bits
[] = {
246 [24] = "CORE_GPIO_0",
247 [25] = "CORE_GPIO_1",
248 [26] = "CORE_GPIO_2",
249 [27] = "CORE_GPIO_3",
250 [28] = "CORE_GPIO_4",
251 [29] = "CORE_GPIO_5",
252 [30] = "CORE_GPIO_6",
253 [31] = "CORE_GPIO_7",
259 printk(BIOS_DEBUG
, "GPE0a_STS: ");
260 print_num_status_bits(32, gpe_sts
, gpe_sts_bits
);
261 printk(BIOS_DEBUG
, "\n");
266 uint32_t clear_gpe_status(void)
268 return print_gpe_sts(reset_gpe_status());
271 static uint32_t reset_alt_status(void)
273 uint16_t pmbase
= get_pmbase();
274 uint32_t alt_gpio_smi
= inl(pmbase
+ ALT_GPIO_SMI
);
275 outl(alt_gpio_smi
, pmbase
+ ALT_GPIO_SMI
);
279 static uint32_t print_alt_sts(uint32_t alt_gpio_smi
)
281 uint32_t alt_gpio_sts
;
282 static const char *const alt_gpio_smi_sts_bits
[] = {
293 [10] = "CORE_GPIO_2",
294 [11] = "CORE_GPIO_3",
295 [12] = "CORE_GPIO_4",
296 [13] = "CORE_GPIO_5",
297 [14] = "CORE_GPIO_6",
298 [15] = "CORE_GPIO_7",
301 /* Status bits are in the upper 16 bits. */
302 alt_gpio_sts
= alt_gpio_smi
>> 16;
306 printk(BIOS_DEBUG
, "ALT_GPIO_SMI: ");
307 print_num_status_bits(16, alt_gpio_sts
, alt_gpio_smi_sts_bits
);
308 printk(BIOS_DEBUG
, "\n");
313 uint32_t clear_alt_status(void)
315 return print_alt_sts(reset_alt_status());
318 void clear_pmc_status(void)
323 prsts
= read32p(PMC_BASE_ADDRESS
+ PRSTS
);
324 gen_pmcon1
= read32p(PMC_BASE_ADDRESS
+ GEN_PMCON1
);
326 /* Clear the status bits. The RPS field is cleared on a 0 write. */
327 write32p(PMC_BASE_ADDRESS
+ GEN_PMCON1
, gen_pmcon1
& ~RPS
);
328 write32p(PMC_BASE_ADDRESS
+ PRSTS
, prsts
);
331 int rtc_failure(void)
335 struct chipset_power_state
*ps
= acpi_get_pm_state();
338 gen_pmcon1
= ps
->gen_pmcon1
;
340 gen_pmcon1
= read32((u32
*)(PMC_BASE_ADDRESS
+ GEN_PMCON1
));
342 rtc_fail
= !!(gen_pmcon1
& RPS
);
344 printk(BIOS_DEBUG
, "RTC failure.\n");
349 int vbnv_cmos_failed(void)
351 return rtc_failure();
354 int platform_is_resuming(void)
356 if (!(inw(ACPI_BASE_ADDRESS
+ PM1_STS
) & WAK_STS
))
359 return acpi_sleep_from_pm1(inl(ACPI_BASE_ADDRESS
+ PM1_CNT
)) == ACPI_S3
;
367 pm1_cnt
= inl(ACPI_BASE_ADDRESS
+ PM1_CNT
);
368 pm1_cnt
|= (0xf << 10);
369 outl(pm1_cnt
, ACPI_BASE_ADDRESS
+ PM1_CNT
);