Factor out common mptable code to mptable_init().
[coreboot.git] / src / mainboard / tyan / s2891 / 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, "S2891       ", 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 // Onboard ck804 smbus
93         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
94
95 // Onboard ck804 USB 1.1
96         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
97
98 // Onboard ck804 USB 2
99         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
100
101 // Onboard ck804 SATA 0
102         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
103
104 // Onboard ck804 SATA 1
105         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
106
107 //Slot PCIE x16
108         for(i=0;i<4;i++) {
109                 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);
110         }
111
112 //Slot  PCIE x4
113         for(i=0;i<4;i++) {
114                 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);
115         }
116
117 //Onboard ati
118         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_1, (7<<2)|0, apicid_ck804, 0x13); // 19
119
120 //Channel B of 8131
121
122
123 //Onboard Broadcom NIC
124         for(i=0;i<2;i++) {
125                 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
126         }
127
128 //Channel A of 8131
129
130 //Slot 4 PCIX 133/100/66
131         for(i=0;i<4;i++) {
132                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (8<<2)|i, apicid_8131_1, (0+i)%4); //24
133         }
134
135 //Slot 3 PCIX 133/100/66 SoDIMM PCI
136         for(i=0;i<4;i++) {
137                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (0xa<<2)|i, apicid_8131_1, (2+i)%4); //26
138         }
139
140 /*Local Ints:   Type    Polarity    Trigger     Bus ID   IRQ    APIC ID PIN#*/
141         smp_write_intsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x0);
142         smp_write_intsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x1);
143         /* There is no extension information... */
144
145         /* Compute the checksums */
146         mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);
147         mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);
148         printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n",
149                 mc, smp_next_mpe_entry(mc));
150         return smp_next_mpe_entry(mc);
151 }
152
153 unsigned long write_smp_table(unsigned long addr)
154 {
155         void *v;
156         v = smp_write_floating_table(addr);
157         return (unsigned long)smp_write_config_table(v);
158 }