1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <arch/ioapic.h>
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pci.h>
8 #include <device/pnp.h>
9 #include <device/pci_ops.h>
10 #include <pc80/mc146818rtc.h>
11 #include <pc80/isa-dma.h>
12 #include <pc80/i8254.h>
13 #include <pc80/i8259.h>
14 #include <amdblocks/acpi.h>
15 #include <amdblocks/acpimmio.h>
16 #include <amdblocks/espi.h>
17 #include <amdblocks/ioapic.h>
18 #include <amdblocks/iomap.h>
19 #include <amdblocks/lpc.h>
20 #include <soc/iomap.h>
22 #include <soc/southbridge.h>
24 static void setup_serirq(void)
28 /* Set up SERIRQ, enable continuous mode */
29 byte
= PM_SERIRQ_NUM_BITS_21
;
30 if (!CONFIG(SOC_AMD_COMMON_BLOCK_USE_ESPI
))
31 byte
|= PM_SERIRQ_ENABLE
;
32 if (!CONFIG(SERIRQ_CONTINUOUS_MODE
))
33 byte
|= PM_SERIRQ_MODE
;
35 pm_write8(PM_SERIRQ_CONF
, byte
);
38 void ioapic_get_sci_pin(u8
*gsi
, u8
*irq
, u8
*flags
)
42 *flags
= MP_IRQ_TRIGGER_LEVEL
| MP_IRQ_POLARITY_LOW
;
45 static void fch_ioapic_init(void)
47 fch_enable_ioapic_decode();
48 register_new_ioapic_gsi0(IO_APIC_ADDR
);
51 static void lpc_init(struct device
*dev
)
55 /* Initialize isa dma */
58 /* Enable DMA transaction on the LPC bus */
59 byte
= pci_read_config8(dev
, LPC_PCI_CONTROL
);
60 byte
|= LEGACY_DMA_EN
;
61 pci_write_config8(dev
, LPC_PCI_CONTROL
, byte
);
63 /* Disable the timeout mechanism on LPC */
64 byte
= pci_read_config8(dev
, LPC_IO_OR_MEM_DECODE_ENABLE
);
65 byte
&= ~LPC_SYNC_TIMEOUT_COUNT_ENABLE
;
66 pci_write_config8(dev
, LPC_IO_OR_MEM_DECODE_ENABLE
, byte
);
68 /* Disable LPC MSI Capability */
69 byte
= pci_read_config8(dev
, LPC_MISC_CONTROL_BITS
);
70 /* BIT 1 is not defined in public datasheet. */
73 pci_write_config8(dev
, LPC_MISC_CONTROL_BITS
, byte
);
76 * Enable hand-instance of the pulse generator and SPI prefetch from
77 * host (earlier is recommended for boot speed).
79 byte
= pci_read_config8(dev
, LPC_HOST_CONTROL
);
80 byte
|= PREFETCH_EN_SPI_FROM_HOST
| T_START_ENH
;
81 pci_write_config8(dev
, LPC_HOST_CONTROL
, byte
);
83 cmos_check_update_date();
86 * Initialize the real time clock.
87 * The 0 argument tells cmos_init not to
88 * update CMOS unless it is invalid.
89 * 1 tells cmos_init to always initialize the CMOS.
93 /* Initialize i8259 pic */
96 /* Initialize i8254 timers */
102 fch_configure_hpet();
105 static void lpc_read_resources(struct device
*dev
)
107 unsigned long idx
= 0;
109 /* Get the normal pci resources of this device */
110 pci_dev_read_resources(dev
);
112 /* Add an extra subtractive resource for I/O. */
113 fixed_io_range_flags(dev
, IOINDEX_SUBTRACTIVE(0, 0), 0, 0x1000,
114 IORESOURCE_SUBTRACTIVE
);
116 /* Only up to 16 MByte of the SPI flash can be mapped right below 4 GB */
117 mmio_range(dev
, idx
++, FLASH_BELOW_4GB_MAPPING_REGION_BASE
,
118 FLASH_BELOW_4GB_MAPPING_REGION_SIZE
);
120 /* Add a memory resource for the SPI BAR. */
121 mmio_range(dev
, idx
++, SPI_BASE_ADDRESS
, 4 * KiB
);
123 /* Add a memory resource for the eSPI MMIO */
124 mmio_range(dev
, idx
++, SPI_BASE_ADDRESS
+ ESPI_OFFSET_FROM_BAR
, 4 * KiB
);
127 mmio_range(dev
, idx
++, IO_APIC_ADDR
, 4 * KiB
);
130 mmio_range(dev
, idx
++, HPET_BASE_ADDRESS
, 4 * KiB
);
132 compact_resources(dev
);
135 static void configure_child_lpc_windows(struct device
*dev
, struct device
*child
)
137 struct resource
*res
;
139 u32 rsize
= 0, set
= 0, set_x
= 0;
143 reg
= pci_read_config32(dev
, LPC_IO_PORT_DECODE_ENABLE
);
144 reg_x
= pci_read_config32(dev
, LPC_IO_OR_MEM_DECODE_ENABLE
);
147 * Be a bit relaxed, tolerate that LPC region might be bigger than
148 * resource we try to fit, do it like this for all regions < 16 bytes.
149 * If there is a resource > 16 bytes it must be 512 bytes to be able
150 * to allocate the fresh LPC window.
152 * AGESA and early initialization can set a wide IO port. This code
153 * will verify if required region was previously set and will avoid
154 * setting a new wide IO resource if one is already set.
157 for (res
= child
->resource_list
; res
; res
= res
->next
) {
158 if (!(res
->flags
& IORESOURCE_IO
))
161 end
= resource_end(res
);
163 "Southbridge LPC decode:%s, base=0x%08x, end=0x%08x\n",
164 dev_path(child
), base
, end
);
165 /* find a resource size */
169 set
|= DECODE_ENABLE_KBC_PORT
;
172 case 0x3f8: /* COM1 */
173 set
|= DECODE_ENABLE_SERIAL_PORT0
;
176 case 0x2f8: /* COM2 */
177 set
|= DECODE_ENABLE_SERIAL_PORT1
;
180 case 0x378: /* Parallel 1 */
181 set
|= DECODE_ENABLE_PARALLEL_PORT0
;
182 /* enable 0x778 for ECP mode */
183 set
|= DECODE_ENABLE_PARALLEL_PORT1
;
186 case 0x3f0: /* FD0 */
187 set
|= DECODE_ENABLE_FDC_PORT0
;
190 case 0x220: /* 0x220 - 0x227 */
191 set
|= DECODE_ENABLE_SERIAL_PORT2
;
194 case 0x228: /* 0x228 - 0x22f */
195 set
|= DECODE_ENABLE_SERIAL_PORT3
;
198 case 0x238: /* 0x238 - 0x23f */
199 set
|= DECODE_ENABLE_SERIAL_PORT4
;
202 case 0x300: /* 0x300 - 0x301 */
203 set
|= DECODE_ENABLE_MIDI_PORT0
;
207 set_x
|= DECODE_IO_PORT_ENABLE0
;
211 set_x
|= DECODE_IO_PORT_ENABLE1
;
215 set_x
|= DECODE_IO_PORT_ENABLE2
;
219 set_x
|= DECODE_IO_PORT_ENABLE3
;
223 set_x
|= DECODE_IO_PORT_ENABLE5
;
227 set_x
|= DECODE_IO_PORT_ENABLE6
;
232 wideio_index
= lpc_find_wideio_range(base
, res
->size
);
233 if (wideio_index
!= WIDEIO_RANGE_ERROR
) {
234 rsize
= lpc_wideio_size(wideio_index
);
235 printk(BIOS_DEBUG
, "Covered by wideIO");
236 printk(BIOS_DEBUG
, " %d\n", wideio_index
);
239 /* check if region found and matches the enable */
240 if (res
->size
<= rsize
) {
243 /* check if we can fit resource in variable range */
245 wideio_index
= lpc_set_wideio_range(base
, res
->size
);
246 if (wideio_index
!= WIDEIO_RANGE_ERROR
) {
247 /* preserve wide IO related bits. */
248 reg_x
= pci_read_config32(dev
,
249 LPC_IO_OR_MEM_DECODE_ENABLE
);
251 "Range assigned to wide IO %d\n",
255 "cannot fit LPC decode region:");
257 "%s, base = 0x%08x, end = 0x%08x\n",
258 dev_path(child
), base
, end
);
263 pci_write_config32(dev
, LPC_IO_PORT_DECODE_ENABLE
, reg
);
264 pci_write_config32(dev
, LPC_IO_OR_MEM_DECODE_ENABLE
, reg_x
);
267 static void configure_child_espi_windows(struct device
*child
)
269 struct resource
*res
;
271 for (res
= child
->resource_list
; res
; res
= res
->next
) {
272 if (res
->flags
& IORESOURCE_IO
)
273 espi_open_io_window(res
->base
, res
->size
);
274 else if (res
->flags
& IORESOURCE_MEM
)
275 espi_open_mmio_window(res
->base
, res
->size
);
279 static void lpc_enable_children_resources(struct device
*dev
)
281 struct device
*child
;
283 if (!dev
->downstream
)
286 for (child
= dev
->downstream
->children
; child
; child
= child
->sibling
) {
289 if (child
->path
.type
!= DEVICE_PATH_PNP
)
291 if (CONFIG(SOC_AMD_COMMON_BLOCK_USE_ESPI
))
292 configure_child_espi_windows(child
);
294 configure_child_lpc_windows(dev
, child
);
298 static void lpc_enable_resources(struct device
*dev
)
300 pci_dev_enable_resources(dev
);
301 lpc_enable_children_resources(dev
);
304 #if CONFIG(HAVE_ACPI_TABLES)
305 static const char *lpc_acpi_name(const struct device
*dev
)
311 struct device_operations amd_lpc_ops
= {
312 .read_resources
= lpc_read_resources
,
313 .set_resources
= pci_dev_set_resources
,
314 .enable_resources
= lpc_enable_resources
,
315 #if CONFIG(HAVE_ACPI_TABLES)
316 .acpi_name
= lpc_acpi_name
,
317 .write_acpi_tables
= southbridge_write_acpi_tables
,
320 .scan_bus
= scan_static_bus
,
321 .ops_pci
= &pci_dev_ops_pci
,