Unify Local APIC address definitions
[coreboot.git] / src / mainboard / sunw / ultra40 / 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_ck804_0; //1
9 extern  unsigned char bus_ck804_1; //2
10 extern  unsigned char bus_ck804_2; //3
11 extern  unsigned char bus_ck804_3; //4
12 extern  unsigned char bus_ck804_4; //5
13 extern  unsigned char bus_ck804_5; //6
14 extern  unsigned char bus_8131_0;  //7
15 extern  unsigned char bus_8131_1;  //8
16 extern  unsigned char bus_8131_2;  //9
17 extern  unsigned char bus_ck804b_0;//a
18 extern  unsigned char bus_ck804b_1;//b
19 extern  unsigned char bus_ck804b_2;//c
20 extern  unsigned char bus_ck804b_3;//d
21 extern  unsigned char bus_ck804b_4;//e
22 extern  unsigned char bus_ck804b_5;//f
23 extern  unsigned apicid_ck804;
24 extern  unsigned apicid_8131_1;
25 extern  unsigned apicid_8131_2;
26 extern  unsigned apicid_ck804b;
27
28 extern unsigned pci1234[];
29
30 extern  unsigned sbdn;
31 extern  unsigned hcdn[];
32 extern  unsigned sbdn3;
33 extern  unsigned sbdnb;
34
35 static void *smp_write_config_table(void *v)
36 {
37         struct mp_config_table *mc;
38         int i, bus_isa;
39
40         mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
41
42         mptable_init(mc, LOCAL_APIC_ADDR);
43
44         smp_write_processors(mc);
45
46         get_bus_conf();
47
48         mptable_write_buses(mc, NULL, &bus_isa);
49
50 /*I/O APICs:    APIC ID Version State           Address*/
51         {
52                 device_t dev;
53                 struct resource *res;
54                 uint32_t dword;
55
56                 dev = dev_find_slot(bus_ck804_0, PCI_DEVFN(sbdn+ 0x1,0));
57                 if (dev) {
58                         res = find_resource(dev, PCI_BASE_ADDRESS_1);
59                         if (res) {
60                                 smp_write_ioapic(mc, apicid_ck804, 0x11, res->base);
61                         }
62
63         /* Initialize interrupt mapping*/
64
65                         dword = 0x0120d218;
66                         pci_write_config32(dev, 0x7c, dword);
67
68                         dword = 0x12008a00;
69                         pci_write_config32(dev, 0x80, dword);
70
71                         dword = 0x00080d7d;
72                         pci_write_config32(dev, 0x84, dword);
73
74                 }
75
76                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3,1));
77                 if (dev) {
78                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
79                         if (res) {
80                                 smp_write_ioapic(mc, apicid_8131_1, 0x11, res->base);
81                         }
82                 }
83                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3+1,1));
84                 if (dev) {
85                         res = find_resource(dev, PCI_BASE_ADDRESS_0);
86                         if (res) {
87                                 smp_write_ioapic(mc, apicid_8131_2, 0x11, res->base);
88                         }
89                 }
90
91             if(pci1234[2] & 0xf) {
92                 dev = dev_find_slot(bus_ck804b_0, PCI_DEVFN(sbdnb + 0x1,0));
93                 if (dev) {
94                         res = find_resource(dev, PCI_BASE_ADDRESS_1);
95                         if (res) {
96                                 smp_write_ioapic(mc, apicid_ck804b, 0x11, res->base);
97                         }
98
99                         dword = 0x0000d218;
100                         pci_write_config32(dev, 0x7c, dword);
101
102                         dword = 0x00000000;
103                         pci_write_config32(dev, 0x80, dword);
104
105                         dword = 0x00000d00;
106                         pci_write_config32(dev, 0x84, dword);
107
108                 }
109             }
110
111         }
112
113         mptable_add_isa_interrupts(mc, bus_isa, apicid_ck804, 1);
114
115 // Onboard ck804 smbus
116         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn+1)<<2)|1, apicid_ck804, 0xa);
117 // 10
118
119 // Onboard ck804 USB 1.1
120         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
121
122 // Onboard ck804 USB 2
123         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
124
125 // Onboard ck804 Audio
126         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn+4)<<2)|0, apicid_ck804, 0x14); // 20
127
128 // Onboard ck804 SATA 0
129         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
130
131 // Onboard ck804 SATA 1
132         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
133
134 // Onboard ck804 NIC
135         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_0, ((sbdn +0x0a)<<2)|0, apicid_ck804, 0x15); // 21
136
137 //Slot 1 PCIE x16
138         for(i=0;i<4;i++) {
139                 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);
140         }
141
142 //Onboard Firewire
143         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804_1, (0x05<<2)|0, apicid_ck804, 0x13); // 19
144
145 //Slot 2 PCI 32
146         for(i=0;i<4;i++) {
147                 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);
148         }
149
150         if(pci1234[2] & 0xf) {
151 //Onboard ck804b NIC
152         smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804b_0, ((sbdnb+0x0a)<<2)|0, apicid_ck804b, 0x15);//24+4+4+21=53
153
154 //Slot 3 PCIE x16
155         for(i=0;i<4;i++) {
156                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_ck804b_5, (0x00<<2)|i, apicid_ck804b, 0x10 + (2+i+4-sbdnb%4)%4);
157         }
158         }
159
160 //Channel B of 8131
161
162 //Slot 4 PCI-X 100/66
163         for(i=0;i<4;i++) {
164                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (4<<2)|i, apicid_8131_2, (0+i)%4);
165         }
166
167 //Slot 5 PCIX 100/66
168         for(i=0;i<4;i++) {
169                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (9<<2)|i, apicid_8131_2, (1+i)%4); // 29
170         }
171
172 //OnBoard LSI SCSI
173         for(i=0;i<2;i++) {
174                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (6<<2)|i, apicid_8131_2, (2+i)%4); //30
175         }
176
177 //Channel A of 8131
178
179 //Slot 6 PCIX 133/100/66
180         for(i=0;i<4;i++) {
181                 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (4<<2)|i, apicid_8131_1, (0+i)%4); //24
182         }
183
184 /*Local Ints:   Type    Polarity    Trigger     Bus ID   IRQ    APIC ID PIN#*/
185         mptable_lintsrc(mc, bus_isa);
186         /* There is no extension information... */
187
188         /* Compute the checksums */
189         return mptable_finalize(mc);
190 }
191
192 unsigned long write_smp_table(unsigned long addr)
193 {
194         void *v;
195         v = smp_write_floating_table(addr, 0);
196         return (unsigned long)smp_write_config_table(v);
197 }