blob: 778455a1ffec2df7c48f7005087ecaf73212b1e4 [file] [log] [blame]
Angel Pons236c6372020-04-03 01:21:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
3
Kyösti Mälkki91162702011-11-03 15:22:01 +02004/*
Kyösti Mälkki91162702011-11-03 15:22:01 +02005 * Ported to Intel XE7501DEVKIT by Agami Aruma
6 * Ported to AOpen DXPL Plus-U by Kyösti Mälkki
Kyösti Mälkki91162702011-11-03 15:22:01 +02007 */
8
Furquan Shaikh76cedd22020-05-02 10:24:23 -07009#include <acpi/acpi.h>
Elyes HAOUASed69de32019-12-19 17:36:53 +010010#include <device/pci_def.h>
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030011
12#define IOAPIC_ICH4 2
13#define IOAPIC_P64H2_BUS_B 3 /* IOAPIC 3 at 02:1c.0 */
14#define IOAPIC_P64H2_BUS_A 4 /* IOAPIC 4 at 02:1e.0 */
15
16#define INTEL_IOAPIC_NUM_INTERRUPTS 24 /* Both ICH-4 and P64-H2 */
Kyösti Mälkki91162702011-11-03 15:22:01 +020017
Kyösti Mälkki91162702011-11-03 15:22:01 +020018unsigned long acpi_fill_madt(unsigned long current)
19{
20 unsigned int irq_start = 0;
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030021 struct device *bdev, *dev = NULL;
Kyösti Mälkki91162702011-11-03 15:22:01 +020022 struct resource* res = NULL;
23
Elyes HAOUAS46829862016-10-07 17:35:50 +020024 /* SJM: Hard-code CPU LAPIC entries for now */
Kyösti Mälkki91162702011-11-03 15:22:01 +020025 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 0, 0);
26 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 1, 6);
27 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 2, 1);
28 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 3, 7);
29
Elyes HAOUAS46829862016-10-07 17:35:50 +020030 /* Southbridge IOAPIC */
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030031 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_ICH4,
32 0xfec00000, irq_start);
Kyösti Mälkki91162702011-11-03 15:22:01 +020033 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
34
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030035 bdev = pcidev_on_root(2, 0);
Elyes HAOUAS46829862016-10-07 17:35:50 +020036 /* P64H2 Bus B IOAPIC */
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030037 if (bdev)
38 dev = pcidev_path_behind(bdev->link_list, PCI_DEVFN(28, 0));
39 if (dev) {
40 res = find_resource(dev, PCI_BASE_ADDRESS_0);
41 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current,
42 IOAPIC_P64H2_BUS_B, res->base, irq_start);
43 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
44 }
Kyösti Mälkki91162702011-11-03 15:22:01 +020045
Elyes HAOUAS46829862016-10-07 17:35:50 +020046 /* P64H2 Bus A IOAPIC */
Kyösti Mälkki5e4a26a2019-07-03 07:50:45 +030047 if (bdev)
48 dev = pcidev_path_behind(bdev->link_list, PCI_DEVFN(28, 0));
49 if (dev) {
50 res = find_resource(dev, PCI_BASE_ADDRESS_0);
51 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current,
52 IOAPIC_P64H2_BUS_A, res->base, irq_start);
53 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
54 }
Kyösti Mälkki91162702011-11-03 15:22:01 +020055
Elyes HAOUAS46829862016-10-07 17:35:50 +020056 /* Map ISA IRQ 0 to IRQ 2 */
Kyösti Mälkki91162702011-11-03 15:22:01 +020057 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 1, 0, 2, 0);
58
Elyes HAOUAS46829862016-10-07 17:35:50 +020059 /* IRQ9 differs from ISA standard - ours is active high, level-triggered */
Kyösti Mälkki91162702011-11-03 15:22:01 +020060 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 0, 9, 9, 0xD);
61
62 return current;
63}