From 68776e7d42a6898241e2e87b5931e0746d25536a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 5 Sep 2008 01:52:31 +0000 Subject: [PATCH] Sanitized version of my ATI IXP fix. This one checks for host bridge PCI ID so it shouldn't harm other machines. Works for me (cold boots ok). This should fix bug #2342. Please test. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27333 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/bus_managers/pci/pci_fixup.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/add-ons/kernel/bus_managers/pci/pci_fixup.cpp b/src/add-ons/kernel/bus_managers/pci/pci_fixup.cpp index e2a4641052..ac1365a6be 100644 --- a/src/add-ons/kernel/bus_managers/pci/pci_fixup.cpp +++ b/src/add-ons/kernel/bus_managers/pci/pci_fixup.cpp @@ -6,6 +6,8 @@ #include "pci.h" #include "pci_fixup.h" +#include + #include @@ -153,6 +155,37 @@ intel_fixup_ahci(PCI *pci, int domain, uint8 bus, uint8 device, uint8 function, } +static void +ati_fixup_ixp(PCI *pci, int domain, uint8 bus, uint8 device, uint8 function, uint16 deviceId) +{ +#ifdef __INTEL__ + /* ATI Technologies Inc, IXP chipset: + * This chipset seems broken, at least on my laptop I must force + * the timer IRQ trigger mode, else no interrupt comes in. + * mmu_man. + */ + // XXX: should I use host or isa bridges for detection ?? + switch (deviceId) { + // Host bridges + case 0x5950: // RS480 Host Bridge + case 0x5830: + break; + // ISA bridges + case 0x4377: // IXP SB400 PCI-ISA Bridge + default: + return; + } + dprintf("ati_fixup_ixp: domain %u, bus %u, device %u, function %u, deviceId 0x%04x\n", + domain, bus, device, function, deviceId); + + dprintf("ati_fixup_ixp: found IXP chipset, forcing IRQ 0 as level triggered.\n"); + // XXX: maybe use pic_*() ? + arch_int_configure_io_interrupt(0, B_LEVEL_TRIGGERED); + +#endif +} + + void pci_fixup_device(PCI *pci, int domain, uint8 bus, uint8 device, uint8 function) { @@ -172,6 +205,10 @@ pci_fixup_device(PCI *pci, int domain, uint8 bus, uint8 device, uint8 function) case 0x8086: intel_fixup_ahci(pci, domain, bus, device, function, deviceId); break; + + case 0x1002: + ati_fixup_ixp(pci, domain, bus, device, function, deviceId); + break; } }