Now coreboot performs IRQ routing for some boards.
You can see this by executing commands like this: grep -r pci_assign_irqs coreboot/src/* This basically AMD/LX based boards: pcengines/alix1c, digitallogic/msm800sev, artecgroup/dbe61, amd/norwich, amd/db800. Also for AMD/GX1 based boards need a patch [http://www.pengutronix.de/software/ptxdist/temporary-src/references/geode-5530.patch] for the right IRQ setup. AMD/GX1 based boards is: advantech/pcm-5820, asi/mb_5blmp, axus/tc320, bcom/winnet100, eaglelion/5bcm, iei/nova4899r, iei/juki-511p. I have two ideas. 1. Delete duplicate code from AMD/LX based boards. 2. Add IRQ routing for AMD/GX1 boards in coreboot. The pirq.patch for IRQ routing logically consist from of two parts: First part of pirq.patch independent from type chipsets and assign IRQ for ever PCI device. It part based on AMD/LX write_pirq_routing_table() function. Second part of pirq.patch depends of type chipset and set PIRQx lines in interrupt router. This part supports only CS5530/5536 interrupt routers. IRQ routing functionality is included through PIRQ_ROUTE in Config.lb. Tested on iei/juki-511p(cs5530a), iei/pcisa-lx(cs5536) and also on TeleVideo TC7020, see http://www.coreboot.org/pipermail/coreboot/2007-December/027973.html. Signed-off-by: Nikolay Petukhov <nikolay.petukhov@gmail.com> Acked-by: Uwe Hermann <uwe@hermann-uwe.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3196 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
committed by
Uwe Hermann
parent
0e122af465
commit
9c2255c66c
@@ -106,46 +106,5 @@ const struct irq_routing_table intel_irq_routing_table = {
|
||||
|
||||
unsigned long write_pirq_routing_table(unsigned long addr)
|
||||
{
|
||||
int i, j, k, num_entries;
|
||||
unsigned char pirq[4];
|
||||
uint16_t chipset_irq_map;
|
||||
uint32_t pciAddr, pirtable_end;
|
||||
struct irq_routing_table *pirq_tbl;
|
||||
|
||||
pirtable_end = copy_pirq_routing_table(addr);
|
||||
|
||||
/* Set up chipset IRQ steering. */
|
||||
pciAddr = 0x80000000 | (CHIPSET_DEV_NUM << 11) | 0x5C;
|
||||
chipset_irq_map = (PIRQD << 12 | PIRQC << 8 | PIRQB << 4 | PIRQA);
|
||||
printk_debug("%s(%08X, %04X)\n", __FUNCTION__, pciAddr,
|
||||
chipset_irq_map);
|
||||
outl(pciAddr & ~3, 0xCF8);
|
||||
outl(chipset_irq_map, 0xCFC);
|
||||
|
||||
pirq_tbl = (struct irq_routing_table *) (addr);
|
||||
num_entries = (pirq_tbl->size - 32) / 16;
|
||||
|
||||
/* Set PCI IRQs. */
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
printk_debug("PIR Entry %d Dev/Fn: %X Slot: %d\n", i,
|
||||
pirq_tbl->slots[i].devfn, pirq_tbl->slots[i].slot);
|
||||
for (j = 0; j < 4; j++) {
|
||||
printk_debug("INT: %c bitmap: %x ", 'A' + j,
|
||||
pirq_tbl->slots[i].irq[j].bitmap);
|
||||
/* Finds lsb in bitmap to IRQ#. */
|
||||
for (k = 0;
|
||||
(!((pirq_tbl->slots[i].irq[j].bitmap >> k) & 1))
|
||||
&& (pirq_tbl->slots[i].irq[j].bitmap != 0);
|
||||
k++);
|
||||
pirq[j] = k;
|
||||
printk_debug("PIRQ: %d\n", k);
|
||||
}
|
||||
|
||||
/* Bus, device, slots IRQs for {A,B,C,D}. */
|
||||
pci_assign_irqs(pirq_tbl->slots[i].bus,
|
||||
pirq_tbl->slots[i].devfn >> 3, pirq);
|
||||
}
|
||||
|
||||
/* Put the PIR table in memory and checksum. */
|
||||
return pirtable_end;
|
||||
return copy_pirq_routing_table(addr);
|
||||
}
|
||||
|
Reference in New Issue
Block a user