2 * This file is part of the coreboot project.
4 * Copyright (C) 2007 Rudolf Marek <r.marek@assembler.cz>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
18 #include <arch/smp/mpspec.h>
19 #include <arch/ioapic.h>
20 #include "southbridge/via/vt8237r/vt8237r.h"
21 #include "southbridge/via/k8t890/k8t890.h"
23 static void *smp_write_config_table(void *v
)
25 struct mp_config_table
*mc
;
28 mc
= (void *)(((char *)v
) + SMP_FLOATING_TABLE_LEN
);
30 mptable_init(mc
, LOCAL_APIC_ADDR
);
32 smp_write_processors(mc
);
34 mptable_write_buses(mc
, NULL
, &bus_isa
);
36 /* I/O APICs: APIC ID Version State Address */
37 smp_write_ioapic(mc
, VT8237R_APIC_ID
, 0x20, VIO_APIC_VADDR
);
38 smp_write_ioapic(mc
, K8T890_APIC_ID
, 0x20, (void *)K8T890_APIC_BASE
);
40 mptable_add_isa_interrupts(mc
, bus_isa
, VT8237R_APIC_ID
, 0);
42 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xb << 2) | 0, VT8237R_APIC_ID
, 0x10); //IRQ16
43 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xb << 2) | 1, VT8237R_APIC_ID
, 0x11); //IRQ17
44 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xb << 2) | 2, VT8237R_APIC_ID
, 0x12); //IRQ18
45 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xb << 2) | 3, VT8237R_APIC_ID
, 0x13); //IRQ19
47 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xc << 2) | 0, VT8237R_APIC_ID
, 0x11); //IRQ17
48 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xc << 2) | 1, VT8237R_APIC_ID
, 0x12); //IRQ18
49 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xc << 2) | 2, VT8237R_APIC_ID
, 0x13); //IRQ19
50 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xc << 2) | 3, VT8237R_APIC_ID
, 0x10); //IRQ16
52 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xd << 2) | 0, VT8237R_APIC_ID
, 0x12); //IRQ18
53 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xd << 2) | 1, VT8237R_APIC_ID
, 0x13); //IRQ19
54 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xd << 2) | 2, VT8237R_APIC_ID
, 0x10); //IRQ16
55 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xd << 2) | 3, VT8237R_APIC_ID
, 0x11); //IRQ17
57 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xf << 2) | 0, VT8237R_APIC_ID
, 0x14);
58 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0xf << 2) | 1, VT8237R_APIC_ID
, 0x14);
59 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x10 << 2) | 0, VT8237R_APIC_ID
, 0x15);
60 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x10 << 2) | 1, VT8237R_APIC_ID
, 0x15);
61 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x10 << 2) | 2, VT8237R_APIC_ID
, 0x15);
62 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x11 << 2) | 2, VT8237R_APIC_ID
, 0x16);
64 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x2 << 2) | 0, K8T890_APIC_ID
, 0x3);
65 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x2 << 2) | 1, K8T890_APIC_ID
, 0x3);
66 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x2 << 2) | 2, K8T890_APIC_ID
, 0x3);
67 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x2 << 2) | 3, K8T890_APIC_ID
, 0x3);
69 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x3 << 2) | 0, K8T890_APIC_ID
, 0x7);
70 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x3 << 2) | 1, K8T890_APIC_ID
, 0xb);
71 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x3 << 2) | 2, K8T890_APIC_ID
, 0xf);
72 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x0, (0x3 << 2) | 3, K8T890_APIC_ID
, 0x13);
74 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x2, (0x00 << 2) | 0, K8T890_APIC_ID
, 0x0);
75 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x2, (0x00 << 2) | 1, K8T890_APIC_ID
, 0x1);
76 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x2, (0x00 << 2) | 2, K8T890_APIC_ID
, 0x2);
77 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x2, (0x00 << 2) | 3, K8T890_APIC_ID
, 0x3);
79 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x3, (0x00 << 2) | 0, K8T890_APIC_ID
, 0x4);
80 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x3, (0x00 << 2) | 1, K8T890_APIC_ID
, 0x5);
81 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x3, (0x00 << 2) | 2, K8T890_APIC_ID
, 0x6);
82 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x3, (0x00 << 2) | 3, K8T890_APIC_ID
, 0x7);
84 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x4, (0x00 << 2) | 0, K8T890_APIC_ID
, 0x8);
85 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x4, (0x00 << 2) | 1, K8T890_APIC_ID
, 0x9);
86 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x4, (0x00 << 2) | 2, K8T890_APIC_ID
, 0xa);
87 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x4, (0x00 << 2) | 3, K8T890_APIC_ID
, 0xb);
89 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x5, (0x00 << 2) | 0, K8T890_APIC_ID
, 0xc);
90 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x5, (0x00 << 2) | 1, K8T890_APIC_ID
, 0xd);
91 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x5, (0x00 << 2) | 2, K8T890_APIC_ID
, 0xe);
92 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x5, (0x00 << 2) | 3, K8T890_APIC_ID
, 0xf);
94 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x6, (0x00 << 2) | 0, K8T890_APIC_ID
, 0x10);
95 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x6, (0x00 << 2) | 1, K8T890_APIC_ID
, 0x11);
96 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x6, (0x00 << 2) | 2, K8T890_APIC_ID
, 0x12);
97 smp_write_intsrc(mc
, mp_INT
, MP_IRQ_TRIGGER_LEVEL
|MP_IRQ_POLARITY_LOW
, 0x6, (0x00 << 2) | 3, K8T890_APIC_ID
, 0x13);
99 /* Local Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN# */
100 mptable_lintsrc(mc
, bus_isa
);
101 /* There is no extension information... */
103 /* Compute the checksums. */
104 return mptable_finalize(mc
);
107 unsigned long write_smp_table(unsigned long addr
)
110 v
= smp_write_floating_table(addr
, 0);
111 return (unsigned long)smp_write_config_table(v
);