1188467f20d294aaa44ca6a634e1e5967ca827ba
[coreboot.git] / src / mainboard / intel / xe7501devkit / acpi_tables.c
1 /*
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
6  */
7
8 #include <console/console.h>
9 #include <string.h>
10 #include <arch/acpi.h>
11 #include <device/pci.h>
12 #include <device/pci_ids.h>
13 #include <assert.h>
14 #include "bus.h"
15 #include "ioapic.h"
16
17 unsigned long acpi_fill_mcfg(unsigned long current)
18 {
19         /* Just a dummy */
20         return current;
21 }
22
23 unsigned long acpi_fill_slit(unsigned long current)
24 {
25         // Not implemented
26         return current;
27 }
28
29 unsigned long acpi_fill_srat(unsigned long current)
30 {
31         // Not implemented
32         return current;
33 }
34
35 unsigned long acpi_fill_madt(unsigned long current)
36 {
37         unsigned int irq_start = 0;
38         device_t dev = 0;
39     struct resource* res = NULL;
40
41
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);
48
49
50         // Southbridge IOAPIC
51         current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, IOAPIC_ICH3, 0xfec00000, irq_start);
52         irq_start += INTEL_IOAPIC_NUM_INTERRUPTS;
53
54         // P64H2#2 Bus A IOAPIC
55         dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(30, 0));
56         if (!dev)
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;
61
62         // P64H2#2 Bus B IOAPIC
63         dev = dev_find_slot(PCI_BUS_E7501_HI_B, PCI_DEVFN(28, 0));
64         if (!dev)
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;
69
70
71         // P64H2#1 Bus A IOAPIC
72         dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(30, 0));
73         if (!dev)
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;
78
79         // P64H2#1 Bus B IOAPIC
80         dev = dev_find_slot(PCI_BUS_E7501_HI_D, PCI_DEVFN(28, 0));
81         if (!dev)
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;
86
87         // Map ISA IRQ 0 to IRQ 2
88         current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)current, 1, 0, 2, 0);
89
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);
92
93         return current;
94 }
95
96
97 unsigned long write_acpi_tables(unsigned long start)
98 {
99         unsigned long current;
100         acpi_rsdp_t *rsdp;
101         acpi_rsdt_t *rsdt;
102         acpi_madt_t *madt;
103
104         /* Align ACPI tables to 16byte */
105         start   = ( start + 0x0f ) & -0x10;
106         current = start;
107
108         printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
109
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);
115
116         /* clear all table memory */
117         memset((void *)start, 0, current - start);
118
119         acpi_write_rsdp(rsdp, rsdt, NULL);
120         acpi_write_rsdt(rsdt);
121
122         /*
123          * We explicitly add these tables later on:
124          */
125         /* QNX wants an MADT */
126         printk(BIOS_DEBUG, "ACPI:    * MADT\n");
127
128         madt = (acpi_madt_t *) current;
129         acpi_create_madt(madt);
130         current+=madt->header.length;
131         acpi_add_table(rsdp,madt);
132
133         printk(BIOS_INFO, "ACPI: done.\n");
134         return current;
135 }
136