Bug fixes: read all 16 bits of DMA configuration; set up NMI/SERR handling in I/O space not PCI space. Comment out posted-memory-write code that looks to have been mis-inherited.

git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2045 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Steven J. Magnani 2005-09-21 13:53:44 +00:00
parent b140d56f63
commit ef79223156
1 changed files with 18 additions and 10 deletions

View File

@ -8,9 +8,11 @@
#include <device/pci_ids.h> #include <device/pci_ids.h>
#include <device/pci_ops.h> #include <device/pci_ops.h>
#include <pc80/mc146818rtc.h> #include <pc80/mc146818rtc.h>
#include <pc80/isa-dma.h>
#include <arch/io.h>
#include "i82801dbm.h" #include "i82801dbm.h"
void isa_dma_init(void); /* from /pc80/isa-dma.c */
#define NMI_OFF 0 #define NMI_OFF 0
@ -52,7 +54,7 @@ void i82801dbm_lpc_route_dma( struct device *dev, uint8_t mask)
{ {
uint16_t word; uint16_t word;
int i; int i;
word = pci_read_config8(dev, PCI_DMA_CFG); word = pci_read_config16(dev, PCI_DMA_CFG);
word &= ((1 << 10) - (1 << 8)); word &= ((1 << 10) - (1 << 8));
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
if (i == 4) if (i == 4)
@ -124,9 +126,15 @@ static void lpc_init(struct device *dev)
i82801dbm_enable_serial_irqs(dev); i82801dbm_enable_serial_irqs(dev);
#ifdef SUSPICIOUS_LOOKING_CODE
// The ICH-4 datasheet does not mention this configuration register.
// This code may have been inherited (incorrectly) from code for the AMD 766 southbridge,
// which *does* support this functionality.
/* posted memory write enable */ /* posted memory write enable */
byte = pci_read_config8(dev, 0x46); byte = pci_read_config8(dev, 0x46);
pci_write_config8(dev, 0x46, byte | (1<<0)); pci_write_config8(dev, 0x46, byte | (1<<0));
#endif
/* power after power fail */ /* power after power fail */
/* FIXME this doesn't work! */ /* FIXME this doesn't work! */
@ -145,16 +153,16 @@ static void lpc_init(struct device *dev)
#endif #endif
/* Set up NMI on errors */ /* Set up NMI on errors */
byte = pci_read_config8(dev, 0x61); byte = inb(0x61);
byte |= (1 << 3); /* IOCHK# NMI Enable */ byte &= ~(1 << 3); /* IOCHK# NMI Enable */
byte |= (1 << 6); /* PCI SERR# Enable */ byte &= ~(1 << 2); /* PCI SERR# Enable */
pci_write_config8(dev, 0x61, byte); outb(byte, 0x61);
byte = pci_read_config8(dev, 0x70); byte = inb(0x70);
nmi_option = NMI_OFF; nmi_option = NMI_OFF;
get_option(&nmi_option, "nmi"); get_option(&nmi_option, "nmi");
if (nmi_option) { if (nmi_option) {
byte |= (1 << 7); /* set NMI */ byte &= ~(1 << 7); /* set NMI */
pci_write_config8(dev, 0x70, byte); outb(byte, 0x70);
} }
/* Initialize the real time clock */ /* Initialize the real time clock */