2007-10-29 22:00:14 +01:00
|
|
|
/*
|
2008-01-18 11:35:56 +01:00
|
|
|
* This file is part of the coreboot project.
|
2007-10-29 22:00:14 +01:00
|
|
|
*
|
|
|
|
* Copyright (C) 2007 AMD
|
|
|
|
* Written by Yinghai Lu <yinghailu@amd.com> for AMD.
|
|
|
|
* Copyright (C) 2007 Silicon Integrated Systems Corp. (SiS)
|
|
|
|
* Written by Morgan Tsai <my_tsai@sis.com> for SiS.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2013-02-23 18:37:27 +01:00
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2007-10-29 22:00:14 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <console/console.h>
|
|
|
|
#include <arch/smp/mpspec.h>
|
|
|
|
#include <device/pci.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <cpu/amd/amdk8_sysconf.h>
|
Factor out common mptable code to mptable_init().
- Drop sig[], oem[], and productid[] fields in all mptable.c files, no
longer needed. The sig[] is always the same ("PCMP"), the oem[] is
currently also always the same ("COREBOOT"), and productid is being
passed into mptable_init() directly as string now.
- LAPIC_ADDR is passed in as parameter, too. While at the moment it's
always the same value that is passed in, the LAPIC base address could
also be relocated theoretically, so keep it as parameter for now.
- Fix a few productid entries, they were (partially) incorrect:
- DK8S2 (was "DK8X", copypaste)
- 939A785GMH (was "MAHOGANY", copypaste)
- X6DHE-G (was "X6DHE", incomplete board name)
- H8DME-2 (was "H8DMR", copypaste)
- H8QME-2+ (was "H8QME", incomplete board name)
- X6DHE-G2 (was "X6DHE", incomplete board name)
- X6DHR-iG2 (was "X6DHR-iG", incomplete board name)
- GA-M57SLI-S4 (was "M57SLI", incomplete board name)
- KINO-780AM2 (was "KINO", incomplete board name)
- DL145 G1 (was "DL145G1", small fix as per vendor website)
- DL145 G3 (was "TREX", wrong board name)
- DL165 G6 (was "HP DL165 G6", drop vendor)
- S2912 (was "S2895", copypaste)
- VT8454c (was "VIA VT8454C", drop vendor, lower-case "c")
- EPIA-N (was "P4DPE", copypaste)
- pc2500e (was "PC2500", incorrect name)
- S1850 (was "S2850", copy-paste)
- MS-7135 (was "MS7135")
- MS-9282 (was "MS9282")
- MS-9185 (was "MS9185")
- MS-9652 (was "K9ND MS-9652")
- Ultra 40 (was "ultra40")
- E326 (was "E325", copypaste)
- M4A785-M (was "TILAPIA", copypaste)
- P2B-D (was "ASUS P2B-D", drop vendor)
- P2B-DS (was "ASUS P2B-DS", drop vendor)
- Adapt the mptable utility to use mptable_init() too.
Abuild-tested.
Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5987 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
2010-10-25 17:32:07 +02:00
|
|
|
|
2007-10-29 22:00:14 +01:00
|
|
|
extern unsigned char bus_sis966[8]; //1
|
|
|
|
|
|
|
|
extern unsigned apicid_sis966;
|
|
|
|
|
2010-03-22 17:33:25 +01:00
|
|
|
static void *smp_write_config_table(void *v)
|
2007-10-29 22:00:14 +01:00
|
|
|
{
|
|
|
|
struct mp_config_table *mc;
|
|
|
|
unsigned sbdn;
|
2010-11-21 15:41:07 +01:00
|
|
|
int i, j, bus_isa;
|
2007-10-29 22:00:14 +01:00
|
|
|
|
|
|
|
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
|
|
|
|
|
2012-02-16 18:43:25 +01:00
|
|
|
mptable_init(mc, LOCAL_APIC_ADDR);
|
2007-10-29 22:00:14 +01:00
|
|
|
|
|
|
|
smp_write_processors(mc);
|
|
|
|
|
|
|
|
get_bus_conf();
|
|
|
|
sbdn = sysconf.sbdn;
|
|
|
|
|
2010-11-21 15:41:07 +01:00
|
|
|
mptable_write_buses(mc, NULL, &bus_isa);
|
2007-10-29 22:00:14 +01:00
|
|
|
|
|
|
|
/*I/O APICs: APIC ID Version State Address*/
|
|
|
|
{
|
|
|
|
device_t dev;
|
|
|
|
struct resource *res;
|
|
|
|
uint32_t dword;
|
2007-11-02 17:09:58 +01:00
|
|
|
|
2007-10-29 22:00:14 +01:00
|
|
|
dev = dev_find_slot(bus_sis966[0], PCI_DEVFN(sbdn+ 0x1,0));
|
|
|
|
if (dev) {
|
|
|
|
res = find_resource(dev, PCI_BASE_ADDRESS_1);
|
|
|
|
if (res) {
|
2014-12-25 03:43:20 +01:00
|
|
|
smp_write_ioapic(mc, apicid_sis966, 0x11,
|
|
|
|
res2mmio(res, 0, 0));
|
2007-10-29 22:00:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
dword = 0x43c6c643;
|
|
|
|
pci_write_config32(dev, 0x7c, dword);
|
|
|
|
|
|
|
|
dword = 0x81001a00;
|
|
|
|
pci_write_config32(dev, 0x80, dword);
|
|
|
|
|
|
|
|
dword = 0xd0001202;
|
|
|
|
pci_write_config32(dev, 0x84, dword);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2007-11-02 17:09:58 +01:00
|
|
|
|
2010-05-20 17:28:19 +02:00
|
|
|
mptable_add_isa_interrupts(mc, bus_isa, apicid_sis966, 0);
|
2008-01-09 12:37:58 +01:00
|
|
|
|
|
|
|
/* PCI interrupts are level triggered, and are
|
|
|
|
* associated with a specific bus/device/function tuple.
|
|
|
|
*/
|
|
|
|
#define PCI_INT(bus, dev, fn, pin) \
|
|
|
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, bus_sis966[bus], (((dev)<<2)|(fn)), apicid_sis966, (pin))
|
|
|
|
|
|
|
|
PCI_INT(0, sbdn+1, 1, 0xa);
|
|
|
|
PCI_INT(0, sbdn+2, 0, 0x16); // 22
|
|
|
|
PCI_INT(0, sbdn+2, 1, 0x17); // 23
|
|
|
|
PCI_INT(0, sbdn+6, 1, 0x17); // 23
|
|
|
|
PCI_INT(0, sbdn+5, 0, 0x14); // 20
|
|
|
|
PCI_INT(0, sbdn+5, 1, 0x17); // 23
|
|
|
|
PCI_INT(0, sbdn+5, 2, 0x15); // 21
|
|
|
|
PCI_INT(0, sbdn+8, 0, 0x16); // 22
|
2007-10-29 22:00:14 +01:00
|
|
|
|
|
|
|
for(j=7; j>=2; j--) {
|
|
|
|
if(!bus_sis966[j]) continue;
|
|
|
|
for(i=0;i<4;i++) {
|
2008-01-09 12:37:58 +01:00
|
|
|
PCI_INT(j, 0x00, i, 0x10 + (2+j+i+4-sbdn%4)%4);
|
2007-10-29 22:00:14 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-02 17:09:58 +01:00
|
|
|
for(j=0; j<2; j++)
|
2007-10-29 22:00:14 +01:00
|
|
|
for(i=0;i<4;i++) {
|
2008-01-09 12:37:58 +01:00
|
|
|
PCI_INT(1, 0x06+j, i, 0x10 + (2+i+j)%4);
|
2007-10-29 22:00:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*Local Ints: Type Polarity Trigger Bus ID IRQ APIC ID PIN#*/
|
mptable: Refactor lintsrc generation
We copied pretty much the same code for generating mptable entries for
local interrupts (with some notable exceptions).
This change moves these lines into a generic function "mptable_lintsrc"
and makes use of it in many places.
The remaining uses of smp_write_lintsrc should be reviewed and replaced
by mptable_lintsrc calls where possible, and smp_write_lintsrc made static.
This patch was generated using Coccinelle:
@@
expression mc;
expression isa_bus;
@@
-smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, isa_bus, 0x0, MP_APIC_ALL, 0x0);
-smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, isa_bus, 0x0, MP_APIC_ALL, 0x1);
+mptable_lintsrc(mc, isa_bus);
@@
expression mc;
expression isa_bus;
@@
-smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, isa_bus, 0x0, MP_APIC_ALL, 0x0);
-smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, isa_bus, 0x0, MP_APIC_ALL, 0x1);
+mptable_lintsrc(mc, isa_bus);
@m@
identifier mc;
expression BUS;
@@
-#define IO_LOCAL_INT(type, intr, apicid, pin) smp_write_lintsrc(mc, (type), MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH, BUS, (intr), (apicid), (pin));
...
-IO_LOCAL_INT(mp_ExtINT, 0x0, MP_APIC_ALL, 0x0);
-IO_LOCAL_INT(mp_NMI, 0x0, MP_APIC_ALL, 0x1);
+mptable_lintsrc(mc, BUS);
Change-Id: I97421f820cd039f5fd753cb0da5c1cca68819bb4
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: http://review.coreboot.org/244
Tested-by: build bot (Jenkins)
Reviewed-by: Marc Jones <marcj303@gmail.com>
2011-10-07 21:42:52 +02:00
|
|
|
mptable_lintsrc(mc, bus_isa);
|
2007-10-29 22:00:14 +01:00
|
|
|
/* There is no extension information... */
|
|
|
|
|
|
|
|
/* Compute the checksums */
|
2011-10-07 23:01:55 +02:00
|
|
|
return mptable_finalize(mc);
|
2007-10-29 22:00:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
unsigned long write_smp_table(unsigned long addr)
|
|
|
|
{
|
|
|
|
void *v;
|
2011-10-07 22:41:07 +02:00
|
|
|
v = smp_write_floating_table(addr, 0);
|
2007-10-29 22:00:14 +01:00
|
|
|
return (unsigned long)smp_write_config_table(v);
|
|
|
|
}
|