We need to call smp_write_lintsrc() instead of smp_write_intsrc() for
[coreboot.git] / src / mainboard / tyan / s2892 / mptable.c
1 #include <console/console.h>
2 #include <arch/smp/mpspec.h>
3 #include <device/pci.h>
4 #include <string.h>
5 #include <stdint.h>
6 #include <cpu/amd/amdk8_sysconf.h>
7
8 extern  unsigned char bus_isa;
9 extern  unsigned char bus_ck804_0; //1
10 extern  unsigned char bus_ck804_1; //2
11 extern  unsigned char bus_ck804_2; //3
12 extern  unsigned char bus_ck804_3; //4
13 extern  unsigned char bus_ck804_4; //5
14 extern  unsigned char bus_ck804_5; //6
15 extern  unsigned char bus_8131_0;  //7
16 extern  unsigned char bus_8131_1;  //8
17 extern  unsigned char bus_8131_2;  //9
18 extern  unsigned apicid_ck804;
19 extern  unsigned apicid_8131_1;
20 extern  unsigned apicid_8131_2;
21
22 extern  unsigned sbdn3;
23
24 static void *smp_write_config_table(void *v)
25 {
26         struct mp_config_table *mc;
27         unsigned sbdn;
28         unsigned char bus_num;
29         int i;
30
31         mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
32
33         mptable_init(mc, "S2892       ", LAPIC_ADDR);
34
35         smp_write_processors(mc);
36
37         get_bus_conf();
38         sbdn = sysconf.sbdn;
39
40 /*Bus:          Bus ID  Type*/
41        /* define bus and isa numbers */
42         for(bus_num = 0; bus_num < bus_isa; bus_num++) {
43                 smp_write_bus(mc, bus_num, "PCI   ");
44         }
45         smp_write_bus(mc, bus_isa, "ISA   ");
46
47 /*I/O APICs:    APIC ID Version State           Address*/
48         {
49                 device_t dev;
50                 struct resource *res;
51                 uint32_t dword;
52
53                 dev = dev_find_slot(bus_ck804_0, PCI_DEVFN(sbdn+ 0x1,0));
54                 if (dev) {
55                         res = find_resource(dev, PCI_BASE_ADDRESS_1);
56                         if (res) {
57                                 smp_write_ioapic(mc, apicid_ck804, 0x11, res->base);
58                         }
59
60         /* Initialize interrupt mapping*/
61
62                         dword = 0x0120d218;
63                         pci_write_config32(dev, 0x7c, dword);
64
65                         dword = 0x12008a00;
66                         pci_write_config32(dev, 0x80, dword);
67
68                         dword = 0x0000007d;
69                         pci_write_config32(dev, 0x84, dword);
70
71                 }
72
73                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3,1));
74                 if (dev) {
75                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
76                         if (res) {
77                                 smp_write_ioapic(mc, apicid_8131_1, 0x11, res->base);
78                         }
79                 }
80                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3+1,1));
81                 if (dev) {
82                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
83                         if (res) {
84                                 smp_write_ioapic(mc, apicid_8131_2, 0x11, res->base);
85                         }
86                 }
87
88         }
89
90         mptable_add_isa_interrupts(mc, bus_isa, apicid_ck804, 1);
91
92 /*I/O Ints:     Type    Polarity    Trigger     Bus ID   IRQ    APIC ID PIN# */
93 // Onboard ck804 smbus
94         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn+1)<<2)|1, apicid_ck804, 0xa); // 10
95
96 // Onboard ck804 USB 1.1
97         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn+2)<<2)|0, apicid_ck804, 0x15); // 21
98
99 // Onboard ck804 USB 2
100         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn+2)<<2)|1, apicid_ck804, 0x14); // 20
101
102 // Onboard ck804 SATA 0
103         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn +7)<<2)|0, apicid_ck804, 0x17); // 23
104
105 // Onboard ck804 SATA 1
106         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn +8)<<2)|0, apicid_ck804, 0x16); // 22
107
108 //Slot PCIE x16
109         for(i=0;i<4;i++) {
110                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_5, (0x00<<2)|i, apicid_ck804, 0x10 + (2+i+4-sbdn%4)%4);
111         }
112
113 //Slot  PCIE x4
114         for(i=0;i<4;i++) {
115                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_4, (0x00<<2)|i, apicid_ck804, 0x10 + (1+i+4-sbdn%4)%4);
116         }
117
118
119 //Slot 2 PCI 32
120         for(i=0;i<4;i++) {
121                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_1, (0x04<<2)|i, apicid_ck804, 0x10 + (0+i)%4); //16
122         }
123
124
125 //Onboard ati
126         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_1, (6<<2)|0, apicid_ck804, 0x12); // 18
127 //Onboard intel 10/100
128         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_1, (8<<2)|0, apicid_ck804, 0x12); // 18
129
130 //Channel B of 8131
131
132
133 //Onboard Broadcom NIC
134         for(i=0;i<2;i++) {
135                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (9<<2)|i, apicid_8131_2, (0+i)%4); //28
136         }
137
138 //SO DIMM PCI-X
139         for(i=0;i<2;i++) {
140                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (7<<2)|i, apicid_8131_2, (0+i)%4); //28
141         }
142
143 //Slot 4 PCIX 133/100/66
144         for(i=0;i<4;i++) {
145                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (3<<2)|i, apicid_8131_2, (2+i)%4); //30
146         }
147
148
149 //Channel A of 8131
150
151 //Slot 5 PCIX 133/100/66
152         for(i=0;i<4;i++) {
153                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (3<<2)|i, apicid_8131_1, (3+i)%4); //27
154         }
155
156
157 //Slot 6 PCIX 133/100/66
158         for(i=0;i<4;i++) {
159                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (2<<2)|i, apicid_8131_1, (2+i)%4); //26
160         }
161
162 /*Local Ints:   Type    Polarity    Trigger     Bus ID   IRQ    APIC ID PIN#*/
163         smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x0);
164         smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x1);
165         /* There is no extension information... */
166
167         /* Compute the checksums */
168         mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);
169         mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);
170         printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n",
171                 mc, smp_next_mpe_entry(mc));
172         return smp_next_mpe_entry(mc);
173 }
174
175 unsigned long write_smp_table(unsigned long addr)
176 {
177         void *v;
178         v = smp_write_floating_table(addr);
179         return (unsigned long)smp_write_config_table(v);
180 }