Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 1 | #include <console/console.h> |
| 2 | #include <arch/smp/mpspec.h> |
Uwe Hermann | 74d1a6e | 2010-10-12 17:34:08 +0000 | [diff] [blame] | 3 | #include <arch/ioapic.h> |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 4 | #include <device/pci.h> |
| 5 | #include <string.h> |
| 6 | #include <stdint.h> |
Yinghai Lu | 6d74d76 | 2006-10-04 23:57:49 +0000 | [diff] [blame] | 7 | #include <cpu/amd/amdk8_sysconf.h> |
| 8 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 9 | extern unsigned char bus_isa; |
| 10 | extern unsigned char bus_8131_0; |
| 11 | extern unsigned char bus_8131_1; |
| 12 | extern unsigned char bus_8131_2; |
| 13 | extern unsigned char bus_8111_0; |
| 14 | extern unsigned char bus_8111_1; |
| 15 | extern unsigned apicid_8111; |
| 16 | extern unsigned apicid_8131_1; |
| 17 | extern unsigned apicid_8131_2; |
| 18 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 19 | extern unsigned sbdn3; |
| 20 | |
Myles Watson | 08e0fb8 | 2010-03-22 16:33:25 +0000 | [diff] [blame] | 21 | static void *smp_write_config_table(void *v) |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 22 | { |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 23 | struct mp_config_table *mc; |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 24 | unsigned char bus_num; |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 25 | int i; |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 26 | |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 27 | mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 28 | |
Uwe Hermann | 55dc223 | 2010-10-25 15:32:07 +0000 | [diff] [blame] | 29 | mptable_init(mc, "S2881 ", LAPIC_ADDR); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 30 | |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 31 | smp_write_processors(mc); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 32 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 33 | get_bus_conf(); |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 34 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 35 | /*Bus: Bus ID Type*/ |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 36 | /* define bus and isa numbers */ |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 37 | for(bus_num = 0; bus_num < bus_isa; bus_num++) { |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 38 | smp_write_bus(mc, bus_num, "PCI "); |
| 39 | } |
| 40 | smp_write_bus(mc, bus_isa, "ISA "); |
| 41 | |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 42 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 43 | /*I/O APICs: APIC ID Version State Address*/ |
Uwe Hermann | 74d1a6e | 2010-10-12 17:34:08 +0000 | [diff] [blame] | 44 | smp_write_ioapic(mc, apicid_8111, 0x11, IO_APIC_ADDR); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 45 | { |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 46 | device_t dev; |
| 47 | struct resource *res; |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 48 | dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3,1)); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 49 | if (dev) { |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 50 | res = find_resource(dev, PCI_BASE_ADDRESS_0); |
| 51 | if (res) { |
arch import user (historical) | ef03afa | 2005-07-06 17:15:30 +0000 | [diff] [blame] | 52 | smp_write_ioapic(mc, apicid_8131_1, 0x11, res->base); |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 53 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 54 | } |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 55 | dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3+1,1)); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 56 | if (dev) { |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 57 | res = find_resource(dev, PCI_BASE_ADDRESS_0); |
| 58 | if (res) { |
arch import user (historical) | ef03afa | 2005-07-06 17:15:30 +0000 | [diff] [blame] | 59 | smp_write_ioapic(mc, apicid_8131_2, 0x11, res->base); |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 60 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 61 | } |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 62 | |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 63 | } |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 64 | |
Patrick Georgi | c5b87c8 | 2010-05-20 15:28:19 +0000 | [diff] [blame] | 65 | mptable_add_isa_interrupts(mc, bus_isa, apicid_8111, 0); |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 66 | |
Patrick Georgi | c5b87c8 | 2010-05-20 15:28:19 +0000 | [diff] [blame] | 67 | /*I/O Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN# */ |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 68 | //8111 LPC ???? |
Yinghai Lu | 6d74d76 | 2006-10-04 23:57:49 +0000 | [diff] [blame] | 69 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8111_0, ((sysconf.sbdn+1)<<2)|0, apicid_8111, 0x13); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 70 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 71 | //On Board AMD USB ??? |
| 72 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8111_1, (0<<2)|3, apicid_8111, 0x13); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 73 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 74 | //On Board ATI Display Adapter |
| 75 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8111_1, (6<<2)|0, apicid_8111, 0x12); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 76 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 77 | //On Board SI Serial ATA |
| 78 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8111_1, (5<<2)|0, apicid_8111, 0x11); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 79 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 80 | //Slot 3 PCIX 100/66 |
| 81 | for(i=0;i<4;i++) { |
| 82 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (8<<2)|i, apicid_8131_1, (3+i)%4); //27 |
| 83 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 84 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 85 | //On Board NIC and adaptec scsi |
| 86 | for(i=0;i<2;i++) { |
| 87 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (9<<2)|i, apicid_8131_1, (0+i)%4); //24 |
| 88 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_1, (0xa<<2)|i, apicid_8131_1, (0+i)%4); //24 |
| 89 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 90 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 91 | //Slot 1 PCI-X 133/100/66 or Side 1 on raiser card |
| 92 | for(i=0;i<4;i++) { |
| 93 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (3<<2)|i, apicid_8131_2, (0+i)%4); //28 |
| 94 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 95 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 96 | //Slot 1 PCI-X 133/100/66, Side 2 on raiser card |
| 97 | //Fix ME, IRQ Pins? |
| 98 | for(i=0;i<4;i++) { |
| 99 | smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_8131_2, (4<<2)|i, apicid_8131_2, (1+i)%4); //28 |
| 100 | } |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 101 | |
| 102 | |
Yinghai Lu | 968bbe8 | 2005-12-06 23:34:09 +0000 | [diff] [blame] | 103 | |
| 104 | /*Local Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN#*/ |
Tobias Diedrich | b907d32 | 2010-10-26 22:40:16 +0000 | [diff] [blame^] | 105 | smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x0); |
| 106 | smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x1); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 107 | /* There is no extension information... */ |
| 108 | |
| 109 | /* Compute the checksums */ |
| 110 | mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length); |
| 111 | mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length); |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 112 | printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n", |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 113 | mc, smp_next_mpe_entry(mc)); |
| 114 | return smp_next_mpe_entry(mc); |
| 115 | } |
| 116 | |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 117 | unsigned long write_smp_table(unsigned long addr) |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 118 | { |
| 119 | void *v; |
| 120 | v = smp_write_floating_table(addr); |
Yinghai Lu | 6a61d6a | 2004-10-20 05:07:16 +0000 | [diff] [blame] | 121 | return (unsigned long)smp_write_config_table(v); |
Li-Ta Lo | f072156 | 2004-01-12 20:00:43 +0000 | [diff] [blame] | 122 | } |