We define IO_APIC_ADDR in <arch/ioapic.h>, let's use it.
[coreboot.git] / src / mainboard / iwill / dk8_htx / acpi_tables.c
1 /*
2  * Island Aruma ACPI support
3  * written by Stefan Reinauer <stepan@openbios.org>
4  *  (C) 2005 Stefan Reinauer
5  *
6  *
7  *  Copyright 2005 AMD
8  *  2005.9 yhlu modify that to more dynamic for AMD Opteron Based MB
9  */
10
11 #include <console/console.h>
12 #include <string.h>
13 #include <arch/acpi.h>
14 #include <arch/ioapic.h>
15 #include <device/pci.h>
16 #include <device/pci_ids.h>
17 #include <cpu/x86/msr.h>
18 #include <cpu/amd/mtrr.h>
19 #include <cpu/amd/amdk8_sysconf.h>
20 #include "northbridge/amd/amdk8/amdk8_acpi.h"
21 #include "mb_sysconf.h"
22
23 #define DUMP_ACPI_TABLES 0
24
25 #if DUMP_ACPI_TABLES == 1
26 static void dump_mem(unsigned start, unsigned end)
27 {
28
29         unsigned i;
30         print_debug("dump_mem:");
31         for(i=start;i<end;i++) {
32                 if((i & 0xf)==0) {
33                         printk(BIOS_DEBUG, "\n%08x:", i);
34                 }
35                 printk(BIOS_DEBUG, " %02x", (unsigned char)*((unsigned char *)i));
36         }
37         print_debug("\n");
38  }
39 #endif
40
41 extern const unsigned char AmlCode[];
42
43 #if CONFIG_ACPI_SSDTX_NUM >= 1
44 extern const unsigned char AmlCode_ssdt2[];
45 extern const unsigned char AmlCode_ssdt3[];
46 extern const unsigned char AmlCode_ssdt4[];
47 extern const unsigned char AmlCode_ssdt5[];
48 #endif
49
50 unsigned long acpi_fill_mcfg(unsigned long current)
51 {
52         /* Just a dummy */
53         return current;
54 }
55
56
57 unsigned long acpi_fill_madt(unsigned long current)
58 {
59         unsigned int gsi_base=0x18;
60
61         struct mb_sysconf_t *m;
62
63         m = sysconf.mb;
64
65         /* create all subtables for processors */
66         current = acpi_create_madt_lapics(current);
67
68         /* Write 8111 IOAPIC */
69         current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, m->apicid_8111,
70                         IO_APIC_ADDR, 0);
71
72         /* Write all 8131 IOAPICs */
73         {
74                 device_t dev;
75                 struct resource *res;
76                 dev = dev_find_slot(m->bus_8132_0, PCI_DEVFN((sysconf.hcdn[0]&0xff), 1));
77                 if (dev) {
78                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
79                         if (res) {
80                                 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, m->apicid_8132_1,
81                                         res->base, gsi_base );
82                                 gsi_base+=4;
83
84                         }
85                 }
86                 dev = dev_find_slot(m->bus_8132_0, PCI_DEVFN((sysconf.hcdn[0] & 0xff)+1, 1));
87                 if (dev) {
88                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
89                         if (res) {
90                                 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, m->apicid_8132_2,
91                                         res->base, gsi_base );
92                                 gsi_base+=4;
93                         }
94                 }
95
96                 int i;
97                 int j = 0;
98
99                 for(i=1; i< sysconf.hc_possible_num; i++) {
100                         unsigned d = 0;
101                         if(!(sysconf.pci1234[i] & 0x1) ) continue;
102                         // 8131 need to use +4
103
104                         switch (sysconf.hcid[i]) {
105                         case 1:
106                                 d = 7;
107                                 break;
108                         case 3:
109                                 d = 4;
110                                 break;
111                         }
112                         switch (sysconf.hcid[i]) {
113                         case 1:
114                         case 3:
115                                 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j], 1));
116                                 if (dev) {
117                                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
118                                         if (res) {
119                                                 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, m->apicid_8132a[j][0],
120                                                         res->base, gsi_base );
121                                                 gsi_base+=d;
122                                         }
123                                 }
124                                 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j]+1, 1));
125                                 if (dev) {
126                                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
127                                         if (res) {
128                                                 current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, m->apicid_8132a[j][1],
129                                                         res->base, gsi_base );
130                                                 gsi_base+=d;
131
132                                         }
133                                 }
134                                 break;
135                         }
136
137                         j++;
138                 }
139
140         }
141
142         current += acpi_create_madt_irqoverride( (acpi_madt_irqoverride_t *)
143                         current, 0, 0, 2, 5 );
144                 /* 0: mean bus 0--->ISA */
145                 /* 0: PIC 0 */
146                 /* 2: APIC 2 */
147                 /* 5 mean: 0101 --> Edige-triggered, Active high*/
148
149
150                 /* create all subtables for processors */
151         current = acpi_create_madt_lapic_nmis(current, 5, 1);
152                 /* 1: LINT1 connect to NMI */
153
154
155         return current;
156 }
157
158 unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id) {
159         k8acpi_write_vars();
160         return (unsigned long) (acpigen_get_current());
161 }
162
163 unsigned long write_acpi_tables(unsigned long start)
164 {
165         unsigned long current;
166         acpi_rsdp_t *rsdp;
167         acpi_rsdt_t *rsdt;
168         acpi_hpet_t *hpet;
169         acpi_madt_t *madt;
170         acpi_srat_t *srat;
171         acpi_slit_t *slit;
172         acpi_fadt_t *fadt;
173         acpi_facs_t *facs;
174         acpi_header_t *dsdt;
175         acpi_header_t *ssdt;
176         acpi_header_t *ssdtx;
177         void *p;
178
179         int i;
180
181         get_bus_conf(); //it will get sblk, pci1234, hcdn, and sbdn
182
183         /* Align ACPI tables to 16byte */
184         start   = ( start + 0x0f ) & -0x10;
185         current = start;
186
187         printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);
188
189         /* We need at least an RSDP and an RSDT Table */
190         rsdp = (acpi_rsdp_t *) current;
191         current += sizeof(acpi_rsdp_t);
192         rsdt = (acpi_rsdt_t *) current;
193         current += sizeof(acpi_rsdt_t);
194
195         /* clear all table memory */
196         memset((void *)start, 0, current - start);
197
198         acpi_write_rsdp(rsdp, rsdt, NULL);
199         acpi_write_rsdt(rsdt);
200
201         /*
202          * We explicitly add these tables later on:
203          */
204         printk(BIOS_DEBUG, "ACPI:    * HPET\n");
205         hpet = (acpi_hpet_t *) current;
206         current += sizeof(acpi_hpet_t);
207         acpi_create_hpet(hpet);
208         acpi_add_table(rsdp,hpet);
209
210         /* If we want to use HPET Timers Linux wants an MADT */
211         printk(BIOS_DEBUG, "ACPI:    * MADT\n");
212         madt = (acpi_madt_t *) current;
213         acpi_create_madt(madt);
214         current+=madt->header.length;
215         acpi_add_table(rsdp,madt);
216
217
218         /* SRAT */
219         printk(BIOS_DEBUG, "ACPI:    * SRAT\n");
220         srat = (acpi_srat_t *) current;
221         acpi_create_srat(srat);
222         current+=srat->header.length;
223         acpi_add_table(rsdp,srat);
224
225         /* SLIT */
226         printk(BIOS_DEBUG, "ACPI:    * SLIT\n");
227         slit = (acpi_slit_t *) current;
228         acpi_create_slit(slit);
229         current+=slit->header.length;
230         acpi_add_table(rsdp,slit);
231
232         /* SSDT */
233         printk(BIOS_DEBUG, "ACPI:    * SSDT\n");
234         ssdt = (acpi_header_t *)current;
235
236         acpi_create_ssdt_generator(ssdt, "DYNADATA");
237         current += ssdt->length;
238         acpi_add_table(rsdp, ssdt);
239
240 #if CONFIG_ACPI_SSDTX_NUM >= 1
241
242         //same htio, but different position? We may have to copy, change HCIN, and recalculate the checknum and add_table
243
244         for(i=1;i<sysconf.hc_possible_num;i++) {  // 0: is hc sblink
245                 if((sysconf.pci1234[i] & 1) != 1 ) continue;
246                 uint8_t c;
247                 if(i<7) {
248                         c  = (uint8_t) ('4' + i - 1);
249                 }
250                 else {
251                         c  = (uint8_t) ('A' + i - 1 - 6);
252                 }
253                 printk(BIOS_DEBUG, "ACPI:    * SSDT for PCI%c Aka hcid = %d\n", c, sysconf.hcid[i]); //pci0 and pci1 are in dsdt
254                 current   = ( current + 0x07) & -0x08;
255                 ssdtx = (acpi_header_t *)current;
256                 switch(sysconf.hcid[i]) {
257                 case 1: //8132
258                         p = &AmlCode_ssdt2;
259                         break;
260                 case 2: //8151
261                         p = &AmlCode_ssdt3;
262                         break;
263                 case 3: //8131
264                         p = &AmlCode_ssdt4;
265                         break;
266                 default:
267                         //HTX no io apic
268                         p = &AmlCode_ssdt5;
269                         break;
270                 }
271                 memcpy(ssdtx, p, sizeof(acpi_header_t));
272                 current += ssdtx->length;
273                 memcpy(ssdtx, p, ssdtx->length);
274                 update_ssdtx((void *)ssdtx, i);
275                 ssdtx->checksum = 0;
276                 ssdtx->checksum = acpi_checksum((unsigned char *)ssdtx,ssdtx->length);
277                 acpi_add_table(rsdp,ssdtx);
278         }
279 #endif
280
281         /* FACS */
282         printk(BIOS_DEBUG, "ACPI:    * FACS\n");
283         facs = (acpi_facs_t *) current;
284         current += sizeof(acpi_facs_t);
285         acpi_create_facs(facs);
286
287         /* DSDT */
288         printk(BIOS_DEBUG, "ACPI:    * DSDT\n");
289         dsdt = (acpi_header_t *)current;
290         memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
291         current += dsdt->length;
292         memcpy(dsdt, &AmlCode, dsdt->length);
293         printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);
294
295         /* FDAT */
296         printk(BIOS_DEBUG, "ACPI:    * FADT\n");
297         fadt = (acpi_fadt_t *) current;
298         current += sizeof(acpi_fadt_t);
299
300         acpi_create_fadt(fadt,facs,dsdt);
301         acpi_add_table(rsdp,fadt);
302
303 #if DUMP_ACPI_TABLES == 1
304         printk(BIOS_DEBUG, "rsdp\n");
305         dump_mem(rsdp, ((void *)rsdp) + sizeof(acpi_rsdp_t));
306
307         printk(BIOS_DEBUG, "rsdt\n");
308         dump_mem(rsdt, ((void *)rsdt) + sizeof(acpi_rsdt_t));
309
310         printk(BIOS_DEBUG, "madt\n");
311         dump_mem(madt, ((void *)madt) + madt->header.length);
312
313         printk(BIOS_DEBUG, "srat\n");
314         dump_mem(srat, ((void *)srat) + srat->header.length);
315
316         printk(BIOS_DEBUG, "slit\n");
317         dump_mem(slit, ((void *)slit) + slit->header.length);
318
319         printk(BIOS_DEBUG, "ssdt\n");
320         dump_mem(ssdt, ((void *)ssdt) + ssdt->length);
321
322         printk(BIOS_DEBUG, "fadt\n");
323         dump_mem(fadt, ((void *)fadt) + fadt->header.length);
324 #endif
325
326         printk(BIOS_INFO, "ACPI: done.\n");
327         return current;
328 }
329