blob: cfe877952a12b2fcac44484da2beadfd4816d6f1 [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_sm_pci, SM_PCI);
25DECLARE_ACPIMMIO(acpimmio_gpio_100, GPIO_100);
26DECLARE_ACPIMMIO(acpimmio_smi, SMI);
27DECLARE_ACPIMMIO(acpimmio_pmio, PMIO);
28DECLARE_ACPIMMIO(acpimmio_pmio2, PMIO2);
29DECLARE_ACPIMMIO(acpimmio_biosram, BIOSRAM);
30DECLARE_ACPIMMIO(acpimmio_cmosram, CMOSRAM);
31DECLARE_ACPIMMIO(acpimmio_cmos, CMOS);
32DECLARE_ACPIMMIO(acpimmio_acpi, ACPI);
33DECLARE_ACPIMMIO(acpimmio_asf, ASF);
34DECLARE_ACPIMMIO(acpimmio_smbus, SMBUS);
35DECLARE_ACPIMMIO(acpimmio_wdt, WDT);
36DECLARE_ACPIMMIO(acpimmio_hpet, HPET);
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_pm24(void)
Marshall Dawson69486ca2019-05-02 12:03:45 -060045{
46 uint32_t dw;
47
Michał Żygowski73a544d2019-11-24 14:16:34 +010048 dw = pm_io_read32(ACPIMMIO_DECODE_REGISTER_24);
49 dw |= PM_24_ACPIMMIO_DECODE_EN;
50 pm_io_write32(ACPIMMIO_DECODE_REGISTER_24, dw);
51}
52
53void enable_acpimmio_decode_pm04(void)
54{
55 uint32_t dw;
56
57 dw = pm_io_read32(ACPIMMIO_DECODE_REGISTER_04);
58 dw |= PM_04_ACPIMMIO_DECODE_EN;
59 pm_io_write32(ACPIMMIO_DECODE_REGISTER_04, dw);
Marshall Dawson69486ca2019-05-02 12:03:45 -060060}
61
Felix Held26935d12020-12-08 00:40:04 +010062void fch_enable_cf9_io(void)
63{
64 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | CF9_IO_EN);
65}
66
67void fch_enable_legacy_io(void)
68{
69 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | LEGACY_IO_EN);
70}
71
Raul E Rangel69ff4282021-02-24 16:17:54 -070072void fch_disable_legacy_dma_io(void)
73{
74 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) &
75 ~(LEGACY_DMA_IO_EN | LEGACY_DMA_IO_80_EN));
76}
77
Felix Held26935d12020-12-08 00:40:04 +010078void fch_io_enable_legacy_io(void)
79{
80 pm_io_write32(PM_DECODE_EN, pm_io_read32(PM_DECODE_EN) | LEGACY_IO_EN);
81}
82
Felix Held1b332052021-02-11 03:01:18 +010083void fch_enable_ioapic_decode(void)
84{
85 pm_write32(PM_DECODE_EN, pm_read32(PM_DECODE_EN) | FCH_IOAPIC_EN);
86}
87
Felix Held34fc29a2021-02-11 02:43:07 +010088void fch_configure_hpet(void)
89{
90 uint32_t reg = pm_read32(PM_DECODE_EN);
91 reg |= HPET_EN | HPET_MSI_EN;
92 reg &= ~HPET_WIDTH_SEL; /* 32 bit HPET */
93 pm_write32(PM_DECODE_EN, reg);
94}
95
Marshall Dawson69486ca2019-05-02 12:03:45 -060096/* PM registers are accessed a byte at a time via CD6/CD7 */
97uint8_t pm_io_read8(uint8_t reg)
98{
99 outb(reg, PM_INDEX);
100 return inb(PM_DATA);
101}
102
103uint16_t pm_io_read16(uint8_t reg)
104{
105 return (pm_io_read8(reg + sizeof(uint8_t)) << 8) | pm_io_read8(reg);
106}
107
108uint32_t pm_io_read32(uint8_t reg)
109{
110 return (pm_io_read16(reg + sizeof(uint16_t)) << 16) | pm_io_read16(reg);
111}
112
113void pm_io_write8(uint8_t reg, uint8_t value)
114{
115 outb(reg, PM_INDEX);
116 outb(value, PM_DATA);
117}
118
119void pm_io_write16(uint8_t reg, uint16_t value)
120{
121 pm_io_write8(reg, value & 0xff);
122 value >>= 8;
123 pm_io_write8(reg + sizeof(uint8_t), value & 0xff);
124}
125
126void pm_io_write32(uint8_t reg, uint32_t value)
127{
128 pm_io_write16(reg, value & 0xffff);
129 value >>= 16;
130 pm_io_write16(reg + sizeof(uint16_t), value & 0xffff);
131}