blob: 25abfd507fd09eedc5218b0c53d31eec3a2bb83a [file] [log] [blame]
Felix Held4a8cd722020-04-18 22:26:39 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Marshall Dawson69486ca2019-05-02 12:03:45 -06002
Felix Held14e34322020-11-14 00:30:21 +01003#ifndef AMD_BLOCK_ACPIMMIO_H
4#define AMD_BLOCK_ACPIMMIO_H
Marshall Dawson69486ca2019-05-02 12:03:45 -06005
Kyösti Mälkki1804b152019-11-25 20:03:27 +02006#include <device/mmio.h>
Kyösti Mälkki1804b152019-11-25 20:03:27 +02007#include <types.h>
Kyösti Mälkki5b672d52019-11-25 21:23:37 +02008
9/* IO index/data for accessing PMIO prior to enabling MMIO decode */
10#define PM_INDEX 0xcd6
11#define PM_DATA 0xcd7
Marshall Dawson23959172019-05-21 18:45:07 -060012
Marshall Dawson08462ce2019-05-21 17:11:30 -060013/*
Felix Held6b519b22020-12-07 23:28:29 +010014 * Power management registers: 0xfed80300 or index/data at IO 0xcd6/cd7. Valid for Mullins and
15 * newer SoCs, but not for the generations with separate FCH or Kabini.
16 */
17#define PM_DECODE_EN 0x00
Felix Held34fc29a2021-02-11 02:43:07 +010018#define HPET_MSI_EN (1 << 29)
19#define HPET_WIDTH_SEL (1 << 28) /* 0=32bit, 1=64bit */
Felix Held240f99c2020-12-07 23:30:04 +010020#define SMBUS_ASF_IO_BASE_SHIFT 8
21#define SMBUS_ASF_IO_BASE_MASK (0xff << SMBUS_ASF_IO_BASE_SHIFT)
Felix Held34fc29a2021-02-11 02:43:07 +010022#define HPET_EN (1 << 6) /* decode HPET MMIO at 0xfed00000 */
Felix Held1b332052021-02-11 03:01:18 +010023#define FCH_IOAPIC_EN (1 << 5)
Felix Held6b519b22020-12-07 23:28:29 +010024#define SMBUS_ASF_IO_EN (1 << 4)
Raul E Rangel69ff4282021-02-24 16:17:54 -070025#define LEGACY_DMA_IO_80_EN (1 << 3) /* pass 0x80-0x83 to legacy DMA IO range */
26#define LEGACY_DMA_IO_EN (1 << 2)
Felix Held6b519b22020-12-07 23:28:29 +010027#define CF9_IO_EN (1 << 1)
28#define LEGACY_IO_EN (1 << 0)
Raul E Rangel2ff76be2021-04-06 15:41:22 -060029#define PM_ESPI_INTR_CTRL 0x40
30#define PM_ESPI_DEV_INTR_MASK 0x00FFFFFF
Felix Heldc1042ba22021-03-25 00:50:34 +010031#define PM_RST_CTRL1 0xbe
32#define SLPTYPE_CONTROL_EN (1 << 5)
33#define KBRSTEN (1 << 4)
Felix Held37609852020-12-08 02:07:18 +010034#define PM_RST_STATUS 0xc0
Felix Held6b519b22020-12-07 23:28:29 +010035
Felix Held6b519b22020-12-07 23:28:29 +010036/*
Kyösti Mälkki5b672d52019-11-25 21:23:37 +020037 * Earlier devices enable the ACPIMMIO bank decodes in PMx24. All discrete FCHs
38 * and the Kabini SoC fall into this category. Kabini's successor, Mullins, uses
39 * this newer method of enable in PMx04.
Marshall Dawson08462ce2019-05-21 17:11:30 -060040 */
41
Felix Heldeb04fcb2020-12-07 19:36:35 +010042#define ACPIMMIO_DECODE_REGISTER_24 0x24
Kyösti Mälkki5b672d52019-11-25 21:23:37 +020043#define PM_24_ACPIMMIO_DECODE_EN BIT(0)
44
Felix Heldeb04fcb2020-12-07 19:36:35 +010045#define ACPIMMIO_DECODE_REGISTER_04 0x04
Kyösti Mälkki5b672d52019-11-25 21:23:37 +020046#define PM_04_BIOSRAM_DECODE_EN BIT(0)
47#define PM_04_ACPIMMIO_DECODE_EN BIT(1)
48
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030049/* For x86 base is constant, while PSP does mapping runtime. */
50#define CONSTANT_ACPIMMIO_BASE_ADDRESS ENV_X86
51
52#if CONSTANT_ACPIMMIO_BASE_ADDRESS
53#define MAYBE_CONST const
54#else
55#define MAYBE_CONST
56#endif
57
58extern uint8_t *MAYBE_CONST acpimmio_gpio_100;
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030059extern uint8_t *MAYBE_CONST acpimmio_smi;
60extern uint8_t *MAYBE_CONST acpimmio_pmio;
61extern uint8_t *MAYBE_CONST acpimmio_pmio2;
62extern uint8_t *MAYBE_CONST acpimmio_biosram;
63extern uint8_t *MAYBE_CONST acpimmio_cmosram;
64extern uint8_t *MAYBE_CONST acpimmio_cmos;
65extern uint8_t *MAYBE_CONST acpimmio_acpi;
66extern uint8_t *MAYBE_CONST acpimmio_asf;
67extern uint8_t *MAYBE_CONST acpimmio_smbus;
68extern uint8_t *MAYBE_CONST acpimmio_wdt;
69extern uint8_t *MAYBE_CONST acpimmio_hpet;
70extern uint8_t *MAYBE_CONST acpimmio_iomux;
71extern uint8_t *MAYBE_CONST acpimmio_misc;
Felix Held467eb562021-07-28 14:08:07 +020072extern uint8_t *MAYBE_CONST acpimmio_remote_gpio;
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030073extern uint8_t *MAYBE_CONST acpimmio_dpvga;
74extern uint8_t *MAYBE_CONST acpimmio_gpio0;
Kyösti Mälkkibe1ff7e2020-06-04 13:36:53 +030075extern uint8_t *MAYBE_CONST acpimmio_xhci_pm;
76extern uint8_t *MAYBE_CONST acpimmio_acdc_tmr;
77extern uint8_t *MAYBE_CONST acpimmio_aoac;
78
79#undef MAYBE_CONST
Michał Żygowski73a544d2019-11-24 14:16:34 +010080
Michał Żygowski73a544d2019-11-24 14:16:34 +010081/* For newer integrated FCHs */
82void enable_acpimmio_decode_pm04(void);
Felix Held26935d12020-12-08 00:40:04 +010083void fch_enable_cf9_io(void);
84void fch_enable_legacy_io(void);
Raul E Rangel69ff4282021-02-24 16:17:54 -070085void fch_disable_legacy_dma_io(void);
Felix Held26935d12020-12-08 00:40:04 +010086void fch_io_enable_legacy_io(void);
Felix Held1b332052021-02-11 03:01:18 +010087void fch_enable_ioapic_decode(void);
Felix Held34fc29a2021-02-11 02:43:07 +010088void fch_configure_hpet(void);
Felix Heldf4e90e82021-03-25 00:51:39 +010089void fch_disable_kb_rst(void);
Marshall Dawson08462ce2019-05-21 17:11:30 -060090
91/* Access PM registers using IO cycles */
Marshall Dawson69486ca2019-05-02 12:03:45 -060092uint8_t pm_io_read8(uint8_t reg);
93uint16_t pm_io_read16(uint8_t reg);
94uint32_t pm_io_read32(uint8_t reg);
95void pm_io_write8(uint8_t reg, uint8_t value);
96void pm_io_write16(uint8_t reg, uint16_t value);
97void pm_io_write32(uint8_t reg, uint32_t value);
Marshall Dawson08462ce2019-05-21 17:11:30 -060098
Felix Held37609852020-12-08 02:07:18 +010099/* Print source of last reset */
100void fch_print_pmxc0_status(void);
101
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200102static inline uint8_t smi_read8(uint8_t reg)
103{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200104 return read8(acpimmio_smi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200105}
Marshall Dawson08462ce2019-05-21 17:11:30 -0600106
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200107static inline uint16_t smi_read16(uint8_t reg)
108{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200109 return read16(acpimmio_smi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200110}
111
112static inline uint32_t smi_read32(uint8_t reg)
113{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200114 return read32(acpimmio_smi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200115}
116
117static inline void smi_write8(uint8_t reg, uint8_t value)
118{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200119 write8(acpimmio_smi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200120}
121
122static inline void smi_write16(uint8_t reg, uint16_t value)
123{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200124 write16(acpimmio_smi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200125}
126
127static inline void smi_write32(uint8_t reg, uint32_t value)
128{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200129 write32(acpimmio_smi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200130}
131
132static inline uint8_t pm_read8(uint8_t reg)
133{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200134 return read8(acpimmio_pmio + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200135}
136
137static inline uint16_t pm_read16(uint8_t reg)
138{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200139 return read16(acpimmio_pmio + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200140}
141
142static inline uint32_t pm_read32(uint8_t reg)
143{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200144 return read32(acpimmio_pmio + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200145}
146
147static inline void pm_write8(uint8_t reg, uint8_t value)
148{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200149 write8(acpimmio_pmio + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200150}
151
152static inline void pm_write16(uint8_t reg, uint16_t value)
153{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200154 write16(acpimmio_pmio + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200155}
156
157static inline void pm_write32(uint8_t reg, uint32_t value)
158{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200159 write32(acpimmio_pmio + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200160}
161
Michał Żygowski2469a9e2019-12-18 14:02:23 +0100162static inline uint8_t pm2_read8(uint8_t reg)
163{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200164 return read8(acpimmio_pmio2 + reg);
Michał Żygowski2469a9e2019-12-18 14:02:23 +0100165}
166
Michał Żygowski2469a9e2019-12-18 14:02:23 +0100167static inline void pm2_write8(uint8_t reg, uint8_t value)
168{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200169 write8(acpimmio_pmio2 + reg, value);
Michał Żygowski2469a9e2019-12-18 14:02:23 +0100170}
171
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200172static inline uint8_t acpi_read8(uint8_t reg)
173{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200174 return read8(acpimmio_acpi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200175}
176
177static inline uint16_t acpi_read16(uint8_t reg)
178{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200179 return read16(acpimmio_acpi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200180}
181
182static inline uint32_t acpi_read32(uint8_t reg)
183{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200184 return read32(acpimmio_acpi + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200185}
186
187static inline void acpi_write8(uint8_t reg, uint8_t value)
188{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200189 write8(acpimmio_acpi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200190}
191
192static inline void acpi_write16(uint8_t reg, uint16_t value)
193{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200194 write16(acpimmio_acpi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200195}
196
197static inline void acpi_write32(uint8_t reg, uint32_t value)
198{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200199 write32(acpimmio_acpi + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200200}
201
202static inline uint8_t asf_read8(uint8_t reg)
203{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200204 return read8(acpimmio_asf + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200205}
206
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200207static inline void asf_write8(uint8_t reg, uint8_t value)
208{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200209 write8(acpimmio_asf + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200210}
211
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200212static inline uint8_t smbus_read8(uint8_t reg)
213{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200214 return read8(acpimmio_smbus + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200215}
216
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200217static inline void smbus_write8(uint8_t reg, uint8_t value)
218{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200219 write8(acpimmio_smbus + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200220}
221
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200222static inline uint8_t misc_read8(uint8_t reg)
223{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200224 return read8(acpimmio_misc + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200225}
226
227static inline uint16_t misc_read16(uint8_t reg)
228{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200229 return read16(acpimmio_misc + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200230}
231
232static inline uint32_t misc_read32(uint8_t reg)
233{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200234 return read32(acpimmio_misc + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200235}
236
237static inline void misc_write8(uint8_t reg, uint8_t value)
238{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200239 write8(acpimmio_misc + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200240}
241
242static inline void misc_write16(uint8_t reg, uint16_t value)
243{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200244 write16(acpimmio_misc + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200245}
246
247static inline void misc_write32(uint8_t reg, uint32_t value)
248{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200249 write32(acpimmio_misc + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200250}
251
252static inline uint8_t xhci_pm_read8(uint8_t reg)
253{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200254 return read8(acpimmio_xhci_pm + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200255}
256
257static inline uint16_t xhci_pm_read16(uint8_t reg)
258{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200259 return read16(acpimmio_xhci_pm + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200260}
261
262static inline uint32_t xhci_pm_read32(uint8_t reg)
263{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200264 return read32(acpimmio_xhci_pm + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200265}
266
267static inline void xhci_pm_write8(uint8_t reg, uint8_t value)
268{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200269 write8(acpimmio_xhci_pm + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200270}
271
272static inline void xhci_pm_write16(uint8_t reg, uint16_t value)
273{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200274 write16(acpimmio_xhci_pm + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200275}
276
277static inline void xhci_pm_write32(uint8_t reg, uint32_t value)
278{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200279 write32(acpimmio_xhci_pm + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200280}
281
282static inline uint8_t aoac_read8(uint8_t reg)
283{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200284 return read8(acpimmio_aoac + reg);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200285}
286
287static inline void aoac_write8(uint8_t reg, uint8_t value)
288{
Kyösti Mälkki5b672d52019-11-25 21:23:37 +0200289 write8(acpimmio_aoac + reg, value);
Kyösti Mälkki1804b152019-11-25 20:03:27 +0200290}
Marshall Dawson69486ca2019-05-02 12:03:45 -0600291
Felix Held14e34322020-11-14 00:30:21 +0100292#endif /* AMD_BLOCK_ACPIMMIO_H */