Re: 2.6.13-rc2 hangs at boot

From: Ivan Kokshaysky
Date: Thu Jul 07 2005 - 07:39:21 EST


On Thu, Jul 07, 2005 at 01:33:46PM +0300, Tero Roponen wrote:
> 00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) (rev 02)
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
> Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort+ >SERR- <PERR+
> Latency: 64
> Region 0: Memory at <unassigned> (32-bit, prefetchable)
^^^^^^^^^^^^
I'd bet this is the cause of your problem.
The pci_assign_unassigned_resources() is not aware of potential
problems with i386 host bridges and just reassigns this region.
Which effectively turns the DMA off on your machine, I guess.

The patch here (against clean 2.6.13-rc2) should fix that.

Ivan.

--- 2.6.13-rc2/arch/i386/pci/i386.c Thu Jul 7 15:38:54 2005
+++ linux/arch/i386/pci/i386.c Thu Jul 7 15:40:26 2005
@@ -176,10 +176,6 @@ static int __init pcibios_assign_resourc
for_each_pci_dev(dev) {
int class = dev->class >> 8;

- /* Don't touch classless devices and host bridges */
- if (!class || class == PCI_CLASS_BRIDGE_HOST)
- continue;
-
for(idx=0; idx<6; idx++) {
r = &dev->resource[idx];

@@ -195,8 +191,15 @@ static int __init pcibios_assign_resourc
* the BIOS forgot to do so or because we have decided the old
* address was unusable for some reason.
*/
- if (!r->start && r->end)
- pci_assign_resource(dev, idx);
+ if (!r->start && r->end) {
+ /* Don't touch classless devices and host
+ bridges and also hide their unassigned
+ resources from the rest of PCI subsystem. */
+ if (!class || class == PCI_CLASS_BRIDGE_HOST)
+ r->flags = 0;
+ else
+ pci_assign_resource(dev, idx);
+ }
}

if (pci_probe & PCI_ASSIGN_ROMS) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/