blob: fd53bd7b999aca9f1ff69a6e97dc0abcb6255d2d [file] [log] [blame]
Yinghai Luc34e3ab2006-10-12 00:58:20 +00001#include <console/console.h>
2#include <arch/smp/mpspec.h>
Uwe Hermann74d1a6e2010-10-12 17:34:08 +00003#include <arch/ioapic.h>
Yinghai Luc34e3ab2006-10-12 00:58:20 +00004#include <device/pci.h>
5#include <string.h>
6#include <stdint.h>
7#if CONFIG_LOGICAL_CPUS==1
Stefan Reinauer9a16e3e2010-03-29 14:45:36 +00008#include <cpu/amd/multicore.h>
Yinghai Luc34e3ab2006-10-12 00:58:20 +00009#endif
Yinghai Luc34e3ab2006-10-12 00:58:20 +000010#include <cpu/amd/amdk8_sysconf.h>
11#include "mb_sysconf.h"
12
Stefan Reinauer50776fa2010-03-17 04:40:15 +000013static void *smp_write_config_table(void *v)
Yinghai Luc34e3ab2006-10-12 00:58:20 +000014{
Yinghai Luc34e3ab2006-10-12 00:58:20 +000015 struct mp_config_table *mc;
Patrick Georgi5244e1b2010-11-21 14:41:07 +000016 int i, j, bus_isa;
Yinghai Luc34e3ab2006-10-12 00:58:20 +000017 struct mb_sysconf_t *m;
18
19 mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
Yinghai Luc34e3ab2006-10-12 00:58:20 +000020
Uwe Hermannc36d5062010-12-16 19:51:38 +000021 mptable_init(mc, LAPIC_ADDR);
Yinghai Luc34e3ab2006-10-12 00:58:20 +000022
23 smp_write_processors(mc);
24
25 get_bus_conf();
26
27 m = sysconf.mb;
28
Patrick Georgi5244e1b2010-11-21 14:41:07 +000029 mptable_write_buses(mc, NULL, &bus_isa);
Yinghai Luc34e3ab2006-10-12 00:58:20 +000030
31/*I/O APICs: APIC ID Version State Address*/
Uwe Hermann74d1a6e2010-10-12 17:34:08 +000032 smp_write_ioapic(mc, m->apicid_8111, 0x11, IO_APIC_ADDR); //8111
Yinghai Luc34e3ab2006-10-12 00:58:20 +000033 {
34 device_t dev;
35 struct resource *res;
36 dev = dev_find_slot(m->bus_8132_0, PCI_DEVFN(m->sbdn3, 1));
37 if (dev) {
38 res = find_resource(dev, PCI_BASE_ADDRESS_0);
39 if (res) {
40 smp_write_ioapic(mc, m->apicid_8132_1, 0x11, res->base);
41 }
42 }
43 dev = dev_find_slot(m->bus_8132_0, PCI_DEVFN(m->sbdn3+1, 1));
44 if (dev) {
45 res = find_resource(dev, PCI_BASE_ADDRESS_0);
46 if (res) {
47 smp_write_ioapic(mc, m->apicid_8132_2, 0x11, res->base);
48 }
49 }
50
51 j = 0;
52
53 for(i=1; i< sysconf.hc_possible_num; i++) {
54 if(!(sysconf.pci1234[i] & 0x1) ) continue;
55
56 switch(sysconf.hcid[i]) {
57 case 1: // 8132
58 case 3: // 8131
59 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j], 1));
60 if (dev) {
61 res = find_resource(dev, PCI_BASE_ADDRESS_0);
62 if (res) {
63 smp_write_ioapic(mc, m->apicid_8132a[j][0], 0x11, res->base);
64 }
65 }
66 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j]+1, 1));
67 if (dev) {
68 res = find_resource(dev, PCI_BASE_ADDRESS_0);
69 if (res) {
70 smp_write_ioapic(mc, m->apicid_8132a[j][1], 0x11, res->base);
71 }
72 }
73 break;
74 }
75 j++;
76 }
77
78 }
Stefan Reinauer14e22772010-04-27 06:56:47 +000079
Patrick Georgi5244e1b2010-11-21 14:41:07 +000080 mptable_add_isa_interrupts(mc, bus_isa, m->apicid_8111, 0);
Patrick Georgic5b87c82010-05-20 15:28:19 +000081
Yinghai Luc34e3ab2006-10-12 00:58:20 +000082//??? What
83 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8111_0, ((sysconf.sbdn+1)<<2)|3, m->apicid_8111, 0x13);
84
85// Onboard AMD USB
86 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8111_1, (0<<2)|3, m->apicid_8111, 0x13);
87
88// Onboard VGA
89 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8111_1, (6<<2)|0, m->apicid_8111, 0x12);
90
91//Slot 5 PCI 32
92 for(i=0;i<4;i++) {
93 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8111_1, (5<<2)|i, m->apicid_8111, 0x10 + (1+i)%4); //16
94 }
95
96//Slot 6 PCI 32
97 for(i=0;i<4;i++) {
98 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8111_1, (4<<2)|i, m->apicid_8111, 0x10 + (0+i)%4); //16
99 }
100//Slot 1: HTX
101
102//Slot 2 PCI-X 133/100/66
103 for(i=0;i<4;i++) {
104 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_2, (2<<2)|i, m->apicid_8132_2, (2+i)%4); //30
105 }
106
107//Slot 3 PCI-X 133/100/66
108 for(i=0;i<4;i++) {
109 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_1, (1<<2)|i, m->apicid_8132_1, (1+i)%4); //25
110 }
111
112//Slot 4 PCI-X 133/100/66
113 for(i=0;i<4;i++) {
Stefan Reinauer14e22772010-04-27 06:56:47 +0000114 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_1, (2<<2)|i, m->apicid_8132_1, (2+i)%4); //26
Yinghai Luc34e3ab2006-10-12 00:58:20 +0000115 }
116
117//Onboard NICS
118 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_1, (3<<2)|0, m->apicid_8132_1, 3); //27
119 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_1, (4<<2)|0, m->apicid_8132_1, 0); //24
120
Stefan Reinauer14e22772010-04-27 06:56:47 +0000121//Onboard SATA
Yinghai Luc34e3ab2006-10-12 00:58:20 +0000122 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132_1, (5<<2)|0, m->apicid_8132_1, 1); //25
123
124 j = 0;
125
126 for(i=1; i< sysconf.hc_possible_num; i++) {
127 if(!(sysconf.pci1234[i] & 0x1) ) continue;
128 int ii;
129 device_t dev;
130 struct resource *res;
131 switch(sysconf.hcid[i]) {
132 case 1:
133 case 3:
134 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j], 1));
135 if (dev) {
136 res = find_resource(dev, PCI_BASE_ADDRESS_0);
137 if (res) {
138 //Slot 1 PCI-X 133/100/66
139 for(ii=0;ii<4;ii++) {
140 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132a[j][1], (0<<2)|ii, m->apicid_8132a[j][0], (0+ii)%4); //
141 }
142 }
143 }
144
145 dev = dev_find_slot(m->bus_8132a[j][0], PCI_DEVFN(m->sbdn3a[j]+1, 1));
146 if (dev) {
147 res = find_resource(dev, PCI_BASE_ADDRESS_0);
148 if (res) {
149 //Slot 2 PCI-X 133/100/66
150 for(ii=0;ii<4;ii++) {
151 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8132a[j][2], (0<<2)|ii, m->apicid_8132a[j][1], (0+ii)%4); //25
152 }
153 }
154 }
155
156 break;
157 case 2:
158
159 // Slot AGP
160 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, m->bus_8151[j][1], 0x0, m->apicid_8111, 0x11);
161 break;
162 }
163
164 j++;
165 }
166
167
168
169/*Local Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN#*/
Patrick Georgi6eb7a532011-10-07 21:42:52 +0200170 mptable_lintsrc(mc, bus_isa);
Yinghai Luc34e3ab2006-10-12 00:58:20 +0000171 /* There is no extension information... */
172
173 /* Compute the checksums */
Patrick Georgib0a9c5c2011-10-07 23:01:55 +0200174 return mptable_finalize(mc);
Yinghai Luc34e3ab2006-10-12 00:58:20 +0000175}
176
177unsigned long write_smp_table(unsigned long addr)
178{
179 void *v;
Patrick Georgic75c79b2011-10-07 22:41:07 +0200180 v = smp_write_floating_table(addr, 0);
Yinghai Luc34e3ab2006-10-12 00:58:20 +0000181 return (unsigned long)smp_write_config_table(v);
182}