2 * Ported to Intel XE7501DEVKIT from Agami Aruma
3 * written by Stefan Reinauer <stepan@openbios.org>
4 * (C) 2005 Stefan Reinauer
5 * (C) 2005 Digital Design Corporation
8 #include <console/console.h>
10 #include <arch/acpi.h>
11 #include <arch/ioapic.h>
12 #include <device/pci.h>
13 #include <device/pci_ids.h>
18 unsigned long acpi_fill_mcfg(unsigned long current)
24 unsigned long acpi_fill_slit(unsigned long current)
30 unsigned long acpi_fill_srat(unsigned long current)
36 unsigned long acpi_fill_madt(unsigned long current)
38 unsigned int irq_start = 0;
40 struct resource* res = NULL;
43 // SJM: Hard-code CPU LAPIC entries for now
44 // Use SourcePoint numbering of processors
45 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 0, 6);
46 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 1, 7);
47 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 2, 0);
48 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 3, 1);
52 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_ICH3, IO_APIC_ADDR, irq_start);
53 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
55 // P64H2#2 Bus A IOAPIC
56 dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(30, 0));
58 BUG(); // Config.lb error?
59 res = find_resource(dev, PCI_BASE_ADDRESS_0);
60 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_2_BUS_A, res->base, irq_start);
61 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
63 // P64H2#2 Bus B IOAPIC
64 dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(28, 0));
66 BUG(); // Config.lb error?
67 res = find_resource(dev, PCI_BASE_ADDRESS_0);
68 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_2_BUS_B, res->base, irq_start);
69 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
72 // P64H2#1 Bus A IOAPIC
73 dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(30, 0));
75 BUG(); // Config.lb error?
76 res = find_resource(dev, PCI_BASE_ADDRESS_0);
77 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_1_BUS_A, res->base, irq_start);
78 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
80 // P64H2#1 Bus B IOAPIC
81 dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(28, 0));
83 BUG(); // Config.lb error?
84 res = find_resource(dev, PCI_BASE_ADDRESS_0);
85 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_1_BUS_B, res->base, irq_start);
86 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
88 // Map ISA IRQ 0 to IRQ 2
89 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 1, 0, 2, 0);
91 // IRQ9 differs from ISA standard - ours is active high, level-triggered
92 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 0, 9, 9, 0xD);
98 unsigned long write_acpi_tables(unsigned long start)
100 unsigned long current;
105 /* Align ACPI tables to 16byte */
106 start = ( start + 0x0f ) & -0x10;
109 printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
111 /* We need at least an RSDP and an RSDT Table */
112 rsdp = (acpi_rsdp_t *) current;
113 current += sizeof(acpi_rsdp_t);
114 rsdt = (acpi_rsdt_t *) current;
115 current += sizeof(acpi_rsdt_t);
117 /* clear all table memory */
118 memset((void *)start, 0, current - start);
120 acpi_write_rsdp(rsdp, rsdt, NULL);
121 acpi_write_rsdt(rsdt);
124 * We explicitly add these tables later on:
126 /* QNX wants an MADT */
127 printk(BIOS_DEBUG, "ACPI: * MADT\n");
129 madt = (acpi_madt_t *) current;
130 acpi_create_madt(madt);
131 current+=madt->header.length;
132 acpi_add_table(rsdp,madt);
134 printk(BIOS_INFO, "ACPI: done.\n");