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