2007-11-30 03:08:26 +01:00
|
|
|
/*
|
2008-01-18 11:35:56 +01:00
|
|
|
* This file is part of the coreboot project.
|
2007-11-30 03:08:26 +01:00
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <console/console.h>
|
|
|
|
#include <device/device.h>
|
|
|
|
#include <device/pci.h>
|
|
|
|
#include <device/pci_ids.h>
|
|
|
|
#include <pc80/isa-dma.h>
|
|
|
|
#include <pc80/mc146818rtc.h>
|
2010-10-12 19:34:08 +02:00
|
|
|
#include <arch/ioapic.h>
|
2007-11-30 03:08:26 +01:00
|
|
|
#include "i82371eb.h"
|
|
|
|
|
2010-10-28 16:22:20 +02:00
|
|
|
#if CONFIG_IOAPIC
|
Add IOAPIC support for Intel 82371EB and fixup SMP on ASUS P2B-D.
- Add enable_intel_82093aa_ioapic() which enables IOAPIC usage in the
Intel 82371EB southbridge (sets the proper chip-select) and sets an
IOAPIC ID.
- We only call enable_intel_82093aa_ioapic() if a board does "select IOAPIC"
as on 82371EB-based boards the IOAPIC is an external chip (not integrated
in the southbridge) and it's only populated on multi-CPU boards.
That is, we cannot unconditionally enable it, only on SMP-capable boards.
- Due to the reason explained above, remove "select IOAPIC" from
src/southbridge/intel/i82371eb/Kconfig, and add it to
src/mainboard/asus/p2b-d/Kconfig.
- Also set CONFIG_MAX_PHYSICAL_CPUS to 2 on ASUS P2B-D. There are two
CPU sockets (Slot 1) and each CPU can only have one core, multi-core CPUs
didn't exist in that era (CONFIG_MAX_CPUS was set to 2 already).
- Drop useless/duplicated enable_lapic() call from ASUS P2B-D's romstage.c,
that function is always called if either CONFIG_SMP and/or CONFIG_IOAPIC
are set.
- Rework ASUS P2B-D mptable.c to fix a number of things:
- Convert it to use mptable_write_buses() as all mptable.c files should do.
- Fix incorrect IOAPICID (it's 0x11 for the external 82093AA IOAPIC).
- Fix a bunch of hardcoded bus IDs, remove incorrect entries, etc.
This is build-tested on ASUS P2B-D, and also boot-tested successfully there.
On Linux I now get two entries in /proc/cpuinfo (where only one appeared
before this patch), i.e. both populated CPUs are found.
Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5998 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
2010-10-28 10:19:22 +02:00
|
|
|
static void enable_intel_82093aa_ioapic(void)
|
|
|
|
{
|
|
|
|
u16 reg16;
|
|
|
|
u32 reg32;
|
|
|
|
u8 ioapic_id = 2;
|
|
|
|
volatile u32 *ioapic_index = (volatile u32 *)(IO_APIC_ADDR);
|
|
|
|
volatile u32 *ioapic_data = (volatile u32 *)(IO_APIC_ADDR + 0x10);
|
|
|
|
device_t dev;
|
|
|
|
|
|
|
|
dev = dev_find_device(PCI_VENDOR_ID_INTEL,
|
|
|
|
PCI_DEVICE_ID_INTEL_82371AB_ISA, 0);
|
|
|
|
|
|
|
|
/* Enable IOAPIC. */
|
|
|
|
reg16 = pci_read_config16(dev, XBCS);
|
|
|
|
reg16 |= (1 << 8); /* APIC Chip Select */
|
|
|
|
pci_write_config16(dev, XBCS, reg16);
|
|
|
|
|
|
|
|
/* Set the IOAPIC ID. */
|
|
|
|
*ioapic_index = 0;
|
|
|
|
*ioapic_data = ioapic_id << 24;
|
|
|
|
|
|
|
|
/* Read back and verify the IOAPIC ID. */
|
|
|
|
*ioapic_index = 0;
|
|
|
|
reg32 = (*ioapic_data >> 24) & 0x0f;
|
|
|
|
printk(BIOS_DEBUG, "IOAPIC ID = %x\n", reg32);
|
|
|
|
if (reg32 != ioapic_id)
|
|
|
|
die("IOAPIC error!\n");
|
|
|
|
}
|
2010-10-28 16:22:20 +02:00
|
|
|
#endif
|
Add IOAPIC support for Intel 82371EB and fixup SMP on ASUS P2B-D.
- Add enable_intel_82093aa_ioapic() which enables IOAPIC usage in the
Intel 82371EB southbridge (sets the proper chip-select) and sets an
IOAPIC ID.
- We only call enable_intel_82093aa_ioapic() if a board does "select IOAPIC"
as on 82371EB-based boards the IOAPIC is an external chip (not integrated
in the southbridge) and it's only populated on multi-CPU boards.
That is, we cannot unconditionally enable it, only on SMP-capable boards.
- Due to the reason explained above, remove "select IOAPIC" from
src/southbridge/intel/i82371eb/Kconfig, and add it to
src/mainboard/asus/p2b-d/Kconfig.
- Also set CONFIG_MAX_PHYSICAL_CPUS to 2 on ASUS P2B-D. There are two
CPU sockets (Slot 1) and each CPU can only have one core, multi-core CPUs
didn't exist in that era (CONFIG_MAX_CPUS was set to 2 already).
- Drop useless/duplicated enable_lapic() call from ASUS P2B-D's romstage.c,
that function is always called if either CONFIG_SMP and/or CONFIG_IOAPIC
are set.
- Rework ASUS P2B-D mptable.c to fix a number of things:
- Convert it to use mptable_write_buses() as all mptable.c files should do.
- Fix incorrect IOAPICID (it's 0x11 for the external 82093AA IOAPIC).
- Fix a bunch of hardcoded bus IDs, remove incorrect entries, etc.
This is build-tested on ASUS P2B-D, and also boot-tested successfully there.
On Linux I now get two entries in /proc/cpuinfo (where only one appeared
before this patch), i.e. both populated CPUs are found.
Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5998 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
2010-10-28 10:19:22 +02:00
|
|
|
|
2007-11-30 03:08:26 +01:00
|
|
|
static void isa_init(struct device *dev)
|
|
|
|
{
|
|
|
|
u32 reg32;
|
|
|
|
|
|
|
|
/* Initialize the real time clock (RTC). */
|
|
|
|
rtc_init(0);
|
|
|
|
|
2010-11-27 10:40:16 +01:00
|
|
|
/*
|
|
|
|
* Enable special cycles, needed for soft poweroff.
|
|
|
|
*/
|
|
|
|
reg32 = pci_read_config16(dev, PCI_COMMAND);
|
|
|
|
reg32 |= PCI_COMMAND_SPECIAL;
|
|
|
|
pci_write_config16(dev, PCI_COMMAND, reg32);
|
|
|
|
|
2007-11-30 03:08:26 +01:00
|
|
|
/*
|
|
|
|
* The PIIX4 can support the full ISA bus, or the Extended I/O (EIO)
|
|
|
|
* bus, which is a subset of ISA. We select the full ISA bus here.
|
|
|
|
*/
|
|
|
|
reg32 = pci_read_config32(dev, GENCFG);
|
|
|
|
reg32 |= ISA; /* Select ISA, not EIO. */
|
|
|
|
pci_write_config16(dev, GENCFG, reg32);
|
|
|
|
|
|
|
|
/* Initialize ISA DMA. */
|
|
|
|
isa_dma_init();
|
Add IOAPIC support for Intel 82371EB and fixup SMP on ASUS P2B-D.
- Add enable_intel_82093aa_ioapic() which enables IOAPIC usage in the
Intel 82371EB southbridge (sets the proper chip-select) and sets an
IOAPIC ID.
- We only call enable_intel_82093aa_ioapic() if a board does "select IOAPIC"
as on 82371EB-based boards the IOAPIC is an external chip (not integrated
in the southbridge) and it's only populated on multi-CPU boards.
That is, we cannot unconditionally enable it, only on SMP-capable boards.
- Due to the reason explained above, remove "select IOAPIC" from
src/southbridge/intel/i82371eb/Kconfig, and add it to
src/mainboard/asus/p2b-d/Kconfig.
- Also set CONFIG_MAX_PHYSICAL_CPUS to 2 on ASUS P2B-D. There are two
CPU sockets (Slot 1) and each CPU can only have one core, multi-core CPUs
didn't exist in that era (CONFIG_MAX_CPUS was set to 2 already).
- Drop useless/duplicated enable_lapic() call from ASUS P2B-D's romstage.c,
that function is always called if either CONFIG_SMP and/or CONFIG_IOAPIC
are set.
- Rework ASUS P2B-D mptable.c to fix a number of things:
- Convert it to use mptable_write_buses() as all mptable.c files should do.
- Fix incorrect IOAPICID (it's 0x11 for the external 82093AA IOAPIC).
- Fix a bunch of hardcoded bus IDs, remove incorrect entries, etc.
This is build-tested on ASUS P2B-D, and also boot-tested successfully there.
On Linux I now get two entries in /proc/cpuinfo (where only one appeared
before this patch), i.e. both populated CPUs are found.
Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5998 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
2010-10-28 10:19:22 +02:00
|
|
|
|
|
|
|
#if CONFIG_IOAPIC
|
|
|
|
/*
|
|
|
|
* Unlike most other southbridges the 82371EB doesn't have a built-in
|
|
|
|
* IOAPIC. Instead, 82371EB-based boards that support multiple CPUs
|
|
|
|
* have a discrete IOAPIC (Intel 82093AA) soldered onto the board.
|
|
|
|
*
|
|
|
|
* Thus, we can/must only enable the IOAPIC if it actually exists,
|
|
|
|
* i.e. the respective mainboard does "select IOAPIC".
|
|
|
|
*/
|
|
|
|
enable_intel_82093aa_ioapic();
|
|
|
|
#endif
|
2007-11-30 03:08:26 +01:00
|
|
|
}
|
|
|
|
|
2009-07-02 20:56:24 +02:00
|
|
|
static void sb_read_resources(struct device *dev)
|
|
|
|
{
|
|
|
|
struct resource *res;
|
|
|
|
|
|
|
|
pci_dev_read_resources(dev);
|
|
|
|
|
|
|
|
res = new_resource(dev, 1);
|
|
|
|
res->base = 0x0UL;
|
|
|
|
res->size = 0x1000UL;
|
|
|
|
res->limit = 0xffffUL;
|
|
|
|
res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
|
|
|
|
|
|
|
|
res = new_resource(dev, 2);
|
|
|
|
res->base = 0xff800000UL;
|
|
|
|
res->size = 0x00800000UL; /* 8 MB for flash */
|
2010-11-27 10:40:16 +01:00
|
|
|
res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED |
|
|
|
|
IORESOURCE_RESERVE;
|
2009-07-02 20:56:24 +02:00
|
|
|
|
2010-11-27 10:40:16 +01:00
|
|
|
#if CONFIG_IOAPIC
|
2009-07-02 20:56:24 +02:00
|
|
|
res = new_resource(dev, 3); /* IOAPIC */
|
2010-10-12 19:34:08 +02:00
|
|
|
res->base = IO_APIC_ADDR;
|
2009-07-02 20:56:24 +02:00
|
|
|
res->size = 0x00001000;
|
2010-11-27 10:40:16 +01:00
|
|
|
res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED |
|
|
|
|
IORESOURCE_RESERVE;
|
|
|
|
#endif
|
2009-07-02 20:56:24 +02:00
|
|
|
}
|
|
|
|
|
2009-10-27 22:49:33 +01:00
|
|
|
static const struct device_operations isa_ops = {
|
2009-07-02 20:56:24 +02:00
|
|
|
.read_resources = sb_read_resources,
|
2007-11-30 03:08:26 +01:00
|
|
|
.set_resources = pci_dev_set_resources,
|
|
|
|
.enable_resources = pci_dev_enable_resources,
|
|
|
|
.init = isa_init,
|
|
|
|
.scan_bus = scan_static_bus, /* TODO: Needed? */
|
|
|
|
.enable = 0,
|
|
|
|
.ops_pci = 0, /* No subsystem IDs on 82371EB! */
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct pci_driver isa_driver __pci_driver = {
|
|
|
|
.ops = &isa_ops,
|
|
|
|
.vendor = PCI_VENDOR_ID_INTEL,
|
|
|
|
.device = PCI_DEVICE_ID_INTEL_82371AB_ISA,
|
|
|
|
};
|
2009-05-12 00:44:14 +02:00
|
|
|
|
|
|
|
static const struct pci_driver isa_SB_driver __pci_driver = {
|
|
|
|
.ops = &isa_ops,
|
|
|
|
.vendor = PCI_VENDOR_ID_INTEL,
|
|
|
|
.device = PCI_DEVICE_ID_INTEL_82371SB_ISA,
|
|
|
|
};
|