Sven Schnelle (svens@stackframe.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/603
-gerrit
commit f81d7bd250944c585a0cdcdf614f4ba4878b22db Author: Sven Schnelle svens@stackframe.org Date: Wed Feb 1 11:47:29 2012 +0100
i3100: configure pci irqs
without it, you can't boot from PCI devices like scsi controllers which require an interrupt set. So preconfigure all pci devices.
Change-Id: I2cd781227701e8363d83bd90e0e36994359fc194 Signed-off-by: Sven Schnelle svens@stackframe.org --- src/southbridge/intel/i3100/lpc.c | 46 +++++++++++++++++++++++++++++++++--- 1 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/src/southbridge/intel/i3100/lpc.c b/src/southbridge/intel/i3100/lpc.c index 1544ecd..2dcdb04 100644 --- a/src/southbridge/intel/i3100/lpc.c +++ b/src/southbridge/intel/i3100/lpc.c @@ -28,6 +28,7 @@ #include <device/pci_ops.h> #include <pc80/mc146818rtc.h> #include <pc80/isa-dma.h> +#include <pc80/i8259.h> #include <arch/io.h> #include <arch/ioapic.h> #include "i3100.h" @@ -196,17 +197,51 @@ static void set_i3100_gpio_inv(
static void i3100_pirq_init(device_t dev) { + device_t irq_dev; config_t *config;
/* Get the chip configuration */ config = dev->chip_info;
- if(config->pirq_a_d) { + if(config->pirq_a_d) pci_write_config32(dev, 0x60, config->pirq_a_d); - } - if(config->pirq_e_h) { + + if(config->pirq_e_h) pci_write_config32(dev, 0x68, config->pirq_e_h); - } + + for(irq_dev = all_devices; irq_dev; irq_dev = irq_dev->next) { + u8 int_pin=0, int_line=0; + + if (!irq_dev->enabled || irq_dev->path.type != DEVICE_PATH_PCI) + continue; + + int_pin = pci_read_config8(irq_dev, PCI_INTERRUPT_PIN); + switch (int_pin) { + case 1: /* INTA# */ + int_line = config->pirq_a_d & 0xff; + break; + + case 2: /* INTB# */ + int_line = (config->pirq_a_d >> 8) & 0xff; + break; + + case 3: /* INTC# */ + int_line = (config->pirq_a_d >> 16) & 0xff; + break; + + case 4: /* INTD# */ + int_line = (config->pirq_a_d >> 24) & 0xff; + break; + } + + if (!int_line) + continue; + + printk(BIOS_DEBUG, "%s: irq pin %d, irq line %d\n", dev_path(irq_dev), int_pin, int_line); + pci_write_config8(irq_dev, PCI_INTERRUPT_LINE, int_line); + } + + }
static void i3100_power_options(device_t dev) { @@ -343,6 +378,9 @@ static void lpc_init(struct device *dev)
/* Initialize isa dma */ isa_dma_init(); + + setup_i8259(); + i8259_configure_irq_trigger(9, 1); }
static void i3100_lpc_read_resources(device_t dev)