2 * This file is part of the coreboot project.
4 * Copyright (C) 2010 Advanced Micro Devices, Inc.
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.
16 #include <console/console.h>
17 #include <arch/smp/mpspec.h>
18 #include <device/pci.h>
22 #include <cpu/amd/amdfam10_sysconf.h>
24 extern u8 bus_rs780
[11];
25 extern u8 bus_sb700
[2];
27 extern u32 apicid_sb700
;
29 extern u32 sbdn_rs780
;
30 extern u32 sbdn_sb700
;
32 static void *smp_write_config_table(void *v
)
34 struct mp_config_table
*mc
;
37 mc
= (void *)(((char *)v
) + SMP_FLOATING_TABLE_LEN
);
39 mptable_init(mc
, LOCAL_APIC_ADDR
);
41 smp_write_processors(mc
);
45 mptable_write_buses(mc
, NULL
, &bus_isa
);
47 /* I/O APICs: APIC ID Version State Address */
54 dev_find_slot(bus_sb700
[0],
55 PCI_DEVFN(sbdn_sb700
+ 0x14, 0));
57 dword
= pci_read_config32(dev
, 0x74) & 0xfffffff0;
58 smp_write_ioapic(mc
, apicid_sb700
,
61 /* Initialize interrupt mapping */
63 byte
= pci_read_config8(dev
, 0x63);
65 byte
|= 0; /* 0: INTA, ...., 7: INTH */
66 pci_write_config8(dev
, 0x63, byte
);
69 dword
= pci_read_config32(dev
, 0xac);
71 dword
|= 6 << 26; /* 0: INTA, ...., 7: INTH */
72 /* dword |= 1<<22; PIC and APIC co exists */
73 pci_write_config32(dev
, 0xac, dword
);
76 * 00:12.0: PROG SATA : INT F
84 * 00:14.2: Prog HDA : INT E
91 /* I/O Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN# */
92 #define IO_LOCAL_INT(type, intr, apicid, pin) \
93 smp_write_lintsrc(mc, (type), MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH, bus_isa, (intr), (apicid), (pin));
95 mptable_add_isa_interrupts(mc
, bus_isa
, apicid_sb700
, 0);
97 /*Local Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN# */
98 IO_LOCAL_INT(mp_ExtINT
, 0x0, MP_APIC_ALL
, 0x0);
99 IO_LOCAL_INT(mp_NMI
, 0x0, MP_APIC_ALL
, 0x1);
100 /* There is no extension information... */
102 /* Compute the checksums */
103 return mptable_finalize(mc
);
106 unsigned long write_smp_table(unsigned long addr
)
109 v
= smp_write_floating_table(addr
, 0);
110 return (unsigned long)smp_write_config_table(v
);