Messages in this thread Patches in this message | | | Date | Sun, 18 May 2008 20:43:09 -0700 | From | "Yinghai Lu" <> | Subject | Re: kernel boot hangs after x86: insert_resorce for lapic addr after e820_reserve_resources |
| |
On Sun, May 18, 2008 at 3:23 PM, Ciaran McCreesh <ciaran.mccreesh@googlemail.com> wrote: > On Sun, 18 May 2008 14:00:16 -0700 > "Yinghai Lu" <yhlu.kernel@gmail.com> wrote: >> >> wonder if init_apic_mapping need some delay with that strange >> >> chipset. >> > >> > I don't see any additional information with apic=verbose with the >> > broken kernel (although I only have a screen's worth of text that I >> > can see -- the kernel doesn't get far enough to let me grab it). >> > I've attached dmesg from a working kernel with apic=verbose in case >> > that helps. >> >> or try to boot with initcall_debug to see where did it hang. > > The last initcall_debug messages are: > > calling atiixp_ide_init+0x0/0x20 > initcall atiixp_ide_init+0x0/0x20 returned 0 after 0 msecs > calling piix_ide_init+0x0/0xc0 > initcall piix_ide_init+0x0/0xc0 returned 0 after 0 msecs > calling ide_scan_pcibus+0x0/0x100 > > ide_scan_pcibus doesn't return. I tried shoving some printks in there, > but as soon as I did it instead locked up in pci_init. Is it worth > continuing this approach or will doing so not give useful results > anyway?
could be pci iomem conflicts... please enable CONFIG_PCI_DEBUG=y and apply the following two debug patches
YH Index: linux-2.6/drivers/pci/probe.c =================================================================== --- linux-2.6.orig/drivers/pci/probe.c +++ linux-2.6/drivers/pci/probe.c @@ -275,6 +275,7 @@ static void pci_read_bases(struct pci_de } res->start = l64 & PCI_BASE_ADDRESS_MEM_MASK; res->end = res->start + sz64; + printk(KERN_INFO "PCI: %s reg %x 64bit mmio: [%llx, %llx]\n", pci_name(dev), reg, res->start, res->end); #else if (sz64 > 0x100000000ULL) { printk(KERN_ERR "PCI: Unable to handle 64-bit " @@ -290,6 +291,8 @@ static void pci_read_bases(struct pci_de res->end = sz; } #endif + } else { + printk(KERN_INFO "PCI: %s reg %x %s: [%llx, %llx]\n", pci_name(dev), reg, (res->flags & IORESOURCE_IO)? "io port":"32bit mmio", res->start, res->end); } } if (rom) { @@ -357,6 +360,7 @@ void __devinit pci_read_bridge_bases(str res->start = base; if (!res->end) res->end = limit + 0xfff; + printk(KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n", pci_name(dev), res->start, res->end); } res = child->resource[1]; @@ -368,6 +372,7 @@ void __devinit pci_read_bridge_bases(str res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; res->start = base; res->end = limit + 0xfffff; + printk(KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", pci_name(dev), res->start, res->end); } res = child->resource[2]; @@ -402,6 +407,7 @@ void __devinit pci_read_bridge_bases(str res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; res->start = base; res->end = limit + 0xfffff; + printk(KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",res->start, res->end); } } Index: linux-2.6/drivers/pci/setup-bus.c =================================================================== --- linux-2.6.orig/drivers/pci/setup-bus.c +++ linux-2.6/drivers/pci/setup-bus.c @@ -537,6 +537,36 @@ void __ref pci_bus_assign_resources(stru } EXPORT_SYMBOL(pci_bus_assign_resources); +static void pci_bus_dump_res(struct pci_bus *bus) +{ + int i; + + for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { + struct resource *res = bus->resource[i]; + if (!res) + continue; + + printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", bus->number, i, (res->flags & IORESOURCE_IO)? "io port":"mmio", res->start, res->end); + } +} + +static void pci_bus_dump_resources(struct pci_bus *bus) +{ + struct pci_bus *b; + struct pci_dev *dev; + + + pci_bus_dump_res(bus); + + list_for_each_entry(dev, &bus->devices, bus_list) { + b = dev->subordinate; + if (!b) + continue; + + pci_bus_dump_resources(b); + } +} + void __init pci_assign_unassigned_resources(void) { @@ -552,4 +582,9 @@ pci_assign_unassigned_resources(void) pci_bus_assign_resources(bus); pci_enable_bridges(bus); } + + /* dump the resource on buses */ + list_for_each_entry(bus, &pci_root_buses, node) { + pci_bus_dump_resources(bus); + } } | |