blob: 59532efe6fdc7e0851f5e4880c7a0f328715f08c [file] [log] [blame]
Angel Ponsae593872020-04-04 18:50:57 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Marshall Dawson69486ca2019-05-02 12:03:45 -06002
3#include <types.h>
4#include <arch/io.h>
Marshall Dawson69486ca2019-05-02 12:03:45 -06005#include <amdblocks/acpimmio.h>
6
Kyösti Mälkki8c1e6032020-06-22 18:16:39 +03007#if ENV_X86
8#include <amdblocks/acpimmio_map.h>
9#endif
10
11#if ENV_X86 && CONSTANT_ACPIMMIO_BASE_ADDRESS
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030012#define DECLARE_ACPIMMIO(ptr, bank) \
Kyösti Mälkki5f2f44a2020-06-29 23:56:50 +030013 uint8_t *const ptr = (void *)(uintptr_t)ACPIMMIO_BASE(bank)
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030014#else
15#define DECLARE_ACPIMMIO(ptr, bank) uint8_t *ptr
16#endif
17
Kyösti Mälkki8c1e6032020-06-22 18:16:39 +030018DECLARE_ACPIMMIO(acpimmio_aoac, AOAC);
19DECLARE_ACPIMMIO(acpimmio_iomux, IOMUX);
20DECLARE_ACPIMMIO(acpimmio_gpio0, GPIO0);
21DECLARE_ACPIMMIO(acpimmio_misc, MISC);
22
23#if ENV_X86
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030024DECLARE_ACPIMMIO(acpimmio_gpio_100, GPIO_100);
25DECLARE_ACPIMMIO(acpimmio_smi, SMI);
26DECLARE_ACPIMMIO(acpimmio_pmio, PMIO);
27DECLARE_ACPIMMIO(acpimmio_pmio2, PMIO2);
28DECLARE_ACPIMMIO(acpimmio_biosram, BIOSRAM);
29DECLARE_ACPIMMIO(acpimmio_cmosram, CMOSRAM);
30DECLARE_ACPIMMIO(acpimmio_cmos, CMOS);
31DECLARE_ACPIMMIO(acpimmio_acpi, ACPI);
32DECLARE_ACPIMMIO(acpimmio_asf, ASF);
33DECLARE_ACPIMMIO(acpimmio_smbus, SMBUS);
34DECLARE_ACPIMMIO(acpimmio_wdt, WDT);
35DECLARE_ACPIMMIO(acpimmio_hpet, HPET);
Felix Held467eb562021-07-28 14:08:07 +020036DECLARE_ACPIMMIO(acpimmio_remote_gpio, REMOTE_GPIO);
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030037DECLARE_ACPIMMIO(acpimmio_dpvga, DPVGA);
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030038DECLARE_ACPIMMIO(acpimmio_xhci_pm, XHCIPM);
39DECLARE_ACPIMMIO(acpimmio_acdc_tmr, ACDCTMR);
Kyösti Mälkki8c1e6032020-06-22 18:16:39 +030040#endif
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030041
42#undef DECLARE_ACPIMMIO
Kyösti Mälkki5b672d52019-11-25 21:23:37 +020043
Michał Żygowski73a544d2019-11-24 14:16:34 +010044void enable_acpimmio_decode_pm04(void)
45{
46 uint32_t dw;
47
48 dw = pm_io_read32(ACPIMMIO_DECODE_REGISTER_04);
49 dw |= PM_04_ACPIMMIO_DECODE_EN;
50 pm_io_write32(ACPIMMIO_DECODE_REGISTER_04, dw);
Marshall Dawson69486ca2019-05-02 12:03:45 -060051}
52
Felix Held26935d12020-12-08 00:40:04 +010053void fch_enable_cf9_io(void)
54{
55 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | CF9_IO_EN);
56}
57
58void fch_enable_legacy_io(void)
59{
60 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | LEGACY_IO_EN);
61}
62
Raul E Rangel69ff4282021-02-24 16:17:54 -070063void fch_disable_legacy_dma_io(void)
64{
65 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) &
66 ~(LEGACY_DMA_IO_EN | LEGACY_DMA_IO_80_EN));
67}
68
Felix Held26935d12020-12-08 00:40:04 +010069void fch_io_enable_legacy_io(void)
70{
71 pm_io_write32(PM_DECODE_EN, pm_io_read32(PM_DECODE_EN) | LEGACY_IO_EN);
72}
73
Felix Held1b332052021-02-11 03:01:18 +010074void fch_enable_ioapic_decode(void)
75{
76 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | FCH_IOAPIC_EN);
77}
78
Felix Held34fc29a2021-02-11 02:43:07 +010079void fch_configure_hpet(void)
80{
81 uint32_t reg = pm_read32(PM_DECODE_EN);
82 reg |= HPET_EN | HPET_MSI_EN;
83 reg &= ~HPET_WIDTH_SEL; /* 32 bit HPET */
84 pm_write32(PM_DECODE_EN, reg);
85}
86
Felix Heldf4e90e82021-03-25 00:51:39 +010087void fch_disable_kb_rst(void)
88{
89 pm_write8(PM_RST_CTRL1, pm_read8(PM_RST_CTRL1) & ~KBRSTEN);
90}
91
Marshall Dawson69486ca2019-05-02 12:03:45 -060092/* PM registers are accessed a byte at a time via CD6/CD7 */
93uint8_t pm_io_read8(uint8_t reg)
94{
95 outb(reg, PM_INDEX);
96 return inb(PM_DATA);
97}
98
99uint16_t pm_io_read16(uint8_t reg)
100{
101 return (pm_io_read8(reg + sizeof(uint8_t)) << 8) | pm_io_read8(reg);
102}
103
104uint32_t pm_io_read32(uint8_t reg)
105{
106 return (pm_io_read16(reg + sizeof(uint16_t)) << 16) | pm_io_read16(reg);
107}
108
109void pm_io_write8(uint8_t reg, uint8_t value)
110{
111 outb(reg, PM_INDEX);
112 outb(value, PM_DATA);
113}
114
115void pm_io_write16(uint8_t reg, uint16_t value)
116{
117 pm_io_write8(reg, value & 0xff);
118 value >>= 8;
119 pm_io_write8(reg + sizeof(uint8_t), value & 0xff);
120}
121
122void pm_io_write32(uint8_t reg, uint32_t value)
123{
124 pm_io_write16(reg, value & 0xffff);
125 value >>= 16;
126 pm_io_write16(reg + sizeof(uint16_t), value & 0xffff);
127}