[patch 39/71] x86/pci: insert ioapic resource before assigning unassigned resources



2.6.30-stable review patch. If anyone has any objections, please let us know.

------------------

From: Yinghai Lu <yinghai@xxxxxxxxxx>

commit 857fdc53a0a90c3ba7fcf5b1fb4c7a62ae03cf82 upstream.

Stephen reported that his DL585 G2 needed noapic after 2.6.22 (?)

Dann bisected it down to:
commit 30a18d6c3f1e774de656ebd8ff219d53e2ba4029
Date: Tue Feb 19 03:21:20 2008 -0800

x86: multi pci root bus with different io resource range, on
64-bit

It turns out that:
1. that AMD-based systems have two HT chains.
2. BIOS doesn't allocate resources for BAR 6 of devices under 8132 etc
3. that multi-peer-root patch will try to split root resources to peer
root resources according to PCI conf of NB
4. PCI core assigns unassigned resources, but they overlap with BARs
that are used by ioapic addr of io4 and 8132.

The reason: at that point ioapic address are not inserted yet. Solution
is to insert ioapic resources into the tree a bit earlier.

Reported-by: Stephen Frost <sfrost@xxxxxxxxxxx>
Reported-and-Tested-by: dann frazier <dannf@xxxxxx>
Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
Signed-off-by: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

---
arch/x86/include/asm/io_apic.h | 2 ++
arch/x86/kernel/apic/io_apic.c | 14 +++-----------
arch/x86/pci/i386.c | 7 +++++++
3 files changed, 12 insertions(+), 11 deletions(-)

--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -160,6 +160,7 @@ extern int io_apic_set_pci_routing(int i

extern int (*ioapic_renumber_irq)(int ioapic, int irq);
extern void ioapic_init_mappings(void);
+extern void ioapic_insert_resources(void);

#ifdef CONFIG_X86_64
extern struct IO_APIC_route_entry **alloc_ioapic_entries(void);
@@ -183,6 +184,7 @@ extern void ioapic_write_entry(int apic,
#define io_apic_assign_pci_irqs 0
static const int timer_through_8259 = 0;
static inline void ioapic_init_mappings(void) { }
+static inline void ioapic_insert_resources(void) { }

static inline void probe_nr_irqs_gsi(void) { }
#endif
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -4182,28 +4182,20 @@ fake_ioapic_page:
}
}

-static int __init ioapic_insert_resources(void)
+void __init ioapic_insert_resources(void)
{
int i;
struct resource *r = ioapic_resources;

if (!r) {
- if (nr_ioapics > 0) {
+ if (nr_ioapics > 0)
printk(KERN_ERR
"IO APIC resources couldn't be allocated.\n");
- return -1;
- }
- return 0;
+ return;
}

for (i = 0; i < nr_ioapics; i++) {
insert_resource(&iomem_resource, r);
r++;
}
-
- return 0;
}
-
-/* Insert the IO APIC resources after PCI initialization has occured to handle
- * IO APICS that are mapped in on a BAR in PCI space. */
-late_initcall(ioapic_insert_resources);
--- a/arch/x86/pci/i386.c
+++ b/arch/x86/pci/i386.c
@@ -35,6 +35,7 @@
#include <asm/pat.h>
#include <asm/e820.h>
#include <asm/pci_x86.h>
+#include <asm/io_apic.h>


static int
@@ -230,6 +231,12 @@ void __init pcibios_resource_survey(void
pcibios_allocate_resources(1);

e820_reserve_resources_late();
+ /*
+ * Insert the IO APIC resources after PCI initialization has
+ * occured to handle IO APICS that are mapped in on a BAR in
+ * PCI space, but before trying to assign unassigned pci res.
+ */
+ ioapic_insert_resources();
}

/**


--
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/



Relevant Pages

  • Re: 2.6.9-rc2-mm1
    ... Fails to boot on my Altix. ... diff between 2.6.9-rc1-mm4 and 2.6.9-rc2 indicates some kind of PCI, ... Mounted root readonly. ... -doneshowconsole: Warning: the ioctl TIOCGDEV is not known by the kernel ...
    (Linux-Kernel)
  • [PATCH 6/6] PCI Express Advanced Error Reporting Driver
    ... to be applied) of PCI Express Advanced Error Reporting driver. ... +#define DRIVER_DESC "Root Port Advanced Error Reporting Driver" ... * PCI Express bus's AER Root service driver data structure ... * @r: pointer struct pt_regs ...
    (Linux-Kernel)
  • Re: Dual Opteron system will not run SMP
    ... unknown: can't assign resources (memory) ... vendor = 'Advanced Micro Devices ' ... FreeBSD detects and attaches these through ACPI and not through the PCI bus. ...
    (freebsd-stable)
  • Re: [PATCH] pci: increase alignment to make more space for hidden code
    ... ACPI FADT declares the system doesn't support PCIe ASPM, ... PCI: Not using MMCONFIG. ... MCFG area at e0000000 reserved in ACPI motherboard resources ... struct pci_controller *controller; ...
    (Linux-Kernel)
  • Re: a7839e96 (PNP: increase max resources) breaks my ALSA intel8x0 sound card
    ... THAT is the thing that actually registers the PCI resurces we've found ... ACPI & PNP drivers, i.e., at 3 below: ... 2a) register ACPI PCI root bridge driver, ... 2b) register PNP system driver and reserve resources (this is ...
    (Linux-Kernel)