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