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 <device/pci.h>
12 #include <device/pci_ids.h>
17 unsigned long acpi_fill_mcfg(unsigned long current)
23 unsigned long acpi_fill_slit(unsigned long current)
29 unsigned long acpi_fill_srat(unsigned long current)
35 unsigned long acpi_fill_madt(unsigned long current)
37 unsigned int irq_start = 0;
39 struct resource* res = NULL;
42 // SJM: Hard-code CPU LAPIC entries for now
43 // Use SourcePoint numbering of processors
44 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 0, 6);
45 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 1, 7);
46 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 2, 0);
47 current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 3, 1);
51 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_ICH3, 0xfec00000, irq_start);
52 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
54 // P64H2#2 Bus A IOAPIC
55 dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(30, 0));
57 BUG(); // Config.lb error?
58 res = find_resource(dev, PCI_BASE_ADDRESS_0);
59 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_2_BUS_A, res->base, irq_start);
60 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
62 // P64H2#2 Bus B IOAPIC
63 dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(28, 0));
65 BUG(); // Config.lb error?
66 res = find_resource(dev, PCI_BASE_ADDRESS_0);
67 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_2_BUS_B, res->base, irq_start);
68 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
71 // P64H2#1 Bus A IOAPIC
72 dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(30, 0));
74 BUG(); // Config.lb error?
75 res = find_resource(dev, PCI_BASE_ADDRESS_0);
76 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_1_BUS_A, res->base, irq_start);
77 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
79 // P64H2#1 Bus B IOAPIC
80 dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(28, 0));
82 BUG(); // Config.lb error?
83 res = find_resource(dev, PCI_BASE_ADDRESS_0);
84 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_P64H2_1_BUS_B, res->base, irq_start);
85 irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
87 // Map ISA IRQ 0 to IRQ 2
88 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 1, 0, 2, 0);
90 // IRQ9 differs from ISA standard - ours is active high, level-triggered
91 current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 0, 9, 9, 0xD);
97 unsigned long write_acpi_tables(unsigned long start)
99 unsigned long current;
104 /* Align ACPI tables to 16byte */
105 start = ( start + 0x0f ) & -0x10;
108 printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
110 /* We need at least an RSDP and an RSDT Table */
111 rsdp = (acpi_rsdp_t *) current;
112 current += sizeof(acpi_rsdp_t);
113 rsdt = (acpi_rsdt_t *) current;
114 current += sizeof(acpi_rsdt_t);
116 /* clear all table memory */
117 memset((void *)start, 0, current - start);
119 acpi_write_rsdp(rsdp, rsdt, NULL);
120 acpi_write_rsdt(rsdt);
123 * We explicitly add these tables later on:
125 /* QNX wants an MADT */
126 printk(BIOS_DEBUG, "ACPI: * MADT\n");
128 madt = (acpi_madt_t *) current;
129 acpi_create_madt(madt);
130 current+=madt->header.length;
131 acpi_add_table(rsdp,madt);
133 printk(BIOS_INFO, "ACPI: done.\n");