1 #include <console/console.h>
2 #include <arch/smp/mpspec.h>
3 #include <arch/ioapic.h>
4 #include <device/pci.h>
8 static void *smp_write_config_table(void *v)
10 struct mp_config_table *mc;
12 unsigned char bus_8131_1;
13 unsigned char bus_8131_2;
14 unsigned char bus_8111_1;
16 mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
18 mptable_init(mc, LAPIC_ADDR);
20 smp_write_processors(mc);
26 dev = dev_find_slot(1, PCI_DEVFN(0x03,0));
28 bus_8111_1 = pci_read_config8(dev, PCI_SECONDARY_BUS);
31 printk(BIOS_DEBUG, "ERROR - could not find PCI 1:03.0, using defaults\n");
35 dev = dev_find_slot(1, PCI_DEVFN(0x01,0));
37 bus_8131_1 = pci_read_config8(dev, PCI_SECONDARY_BUS);
40 printk(BIOS_DEBUG, "ERROR - could not find PCI 1:01.0, using defaults\n");
44 dev = dev_find_slot(1, PCI_DEVFN(0x02,0));
46 bus_8131_2 = pci_read_config8(dev, PCI_SECONDARY_BUS);
49 printk(BIOS_DEBUG, "ERROR - could not find PCI 1:02.0, using defaults\n");
54 mptable_write_buses(mc, NULL, &bus_isa);
58 smp_write_ioapic(mc, 2, 0x11, IO_APIC_ADDR);
63 dev = dev_find_slot(1, PCI_DEVFN(0x01,1));
65 res = find_resource(dev, PCI_BASE_ADDRESS_0);
67 smp_write_ioapic(mc, 0x03, 0x11, res->base);
71 dev = dev_find_slot(1, PCI_DEVFN(0x02,1));
73 res = find_resource(dev, PCI_BASE_ADDRESS_0);
75 smp_write_ioapic(mc, 0x04, 0x11, res->base);
80 mptable_add_isa_interrupts(mc, bus_isa, 0x2, 0);
82 /* Standard local interrupt assignments */
83 mptable_lintsrc(mc, bus_isa);
87 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
88 bus_8131_2, (1<<2)|0, 0x02, 0x11);
89 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
90 bus_8131_2, (1<<2)|1, 0x02, 0x12);
91 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
92 bus_8131_2, (1<<2)|2, 0x02, 0x13);
93 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
94 bus_8131_2, (1<<2)|3, 0x02, 0x10);
97 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
98 bus_8131_2, (2<<2)|0, 0x02, 0x12);
99 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
100 bus_8131_2, (2<<2)|1, 0x02, 0x13);
101 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
102 bus_8131_2, (2<<2)|2, 0x02, 0x10);
103 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
104 bus_8131_2, (2<<2)|3, 0x02, 0x11);
107 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
108 bus_8131_1, (1<<2)|0, 0x02, 0x11);
109 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
110 bus_8131_1, (1<<2)|1, 0x02, 0x12);
111 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
112 bus_8131_1, (1<<2)|2, 0x02, 0x13);
113 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
114 bus_8131_1, (1<<2)|3, 0x02, 0x10);
117 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
118 bus_8131_1, (2<<2)|0, 0x02, 0x12);
119 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
120 bus_8131_1, (2<<2)|1, 0x02, 0x13);
121 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
122 bus_8131_1, (2<<2)|2, 0x02, 0x10);
123 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
124 bus_8131_1, (2<<2)|3, 0x02, 0x11);
127 // FIXME get the irqs right, it's just hacked to work for now
128 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
129 bus_8111_1, (5<<2)|0, 0x02, 0x11);
130 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
131 bus_8111_1, (5<<2)|1, 0x02, 0x12);
132 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
133 bus_8111_1, (5<<2)|2, 0x02, 0x13);
134 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
135 bus_8111_1, (5<<2)|3, 0x02, 0x10);
138 // FIXME get the irqs right, it's just hacked to work for now
139 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
140 bus_8111_1, (4<<2)|0, 0x02, 0x10);
141 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
142 bus_8111_1, (4<<2)|1, 0x02, 0x11);
143 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
144 bus_8111_1, (4<<2)|2, 0x02, 0x12);
145 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
146 bus_8111_1, (4<<2)|3, 0x02, 0x13);
149 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
150 bus_8131_1, (3<<2)|0, 0x02, 0x13);
151 smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
152 bus_8131_1, (4<<2)|0, 0x02, 0x13);
154 /* There is no extension information... */
156 /* Compute the checksums */
157 return mptable_finalize(mc);
160 unsigned long write_smp_table(unsigned long addr)
163 v = smp_write_floating_table(addr, 0);
164 return (unsigned long)smp_write_config_table(v);