All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Update MMCONFIG resource insertion to check against e820 map.
@ 2006-11-07 20:49 Aaron Durbin
  2006-11-07 21:03 ` Matthew Wilcox
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Aaron Durbin @ 2006-11-07 20:49 UTC (permalink / raw)
  To: Andi Kleen; +Cc: linux-kernel, Matthew Wilcox, Jeff Chua, discuss

Check to see if MMCONFIG region is marked as reserved in the e820 map before
inserting the MMCONFIG region into the resource map. If the region is not
entirely marked as reserved in the e820 map attempt to find a region that is.
Only insert the MMCONFIG region into the resource map if there was a region
found marked as reserved in the e820 map.  This should fix a known regression
in 2.6.19 by not reserving all of the I/O space on misconfigured systems.

---

This patch is against 2.6.19-rc4.

 arch/x86_64/pci/mmconfig.c |   76 ++++++++++++++++++++++++++++++++++++++------
 1 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c
index e61093b..c39ec4d 100644
--- a/arch/x86_64/pci/mmconfig.c
+++ b/arch/x86_64/pci/mmconfig.c
@@ -163,33 +163,87 @@ static __init void unreachable_devices(v
 	}
 }

+#define PCI_MMCFG_RESOURCE_NAME_LEN 19
+/* Check the given mcfg_entry to see if its reported address range is marked
+ * as reserved in the e820 map. If it is not entirely marked as reserved it
+ * attempts to find a given bus range that is marked as reserved. If no range
+ * is determined, do not insert the MCFG resource into the resource map. */
+static __init void pci_mmcfg_check_and_insert_resource(int mcfg_entry,
+						      struct resource *res)
+{
+	struct acpi_table_mcfg_config *mcfg;
+	unsigned start_bus_num, end_bus_num;
+	unsigned num_buses;
+
+	mcfg = &pci_mmcfg_config[mcfg_entry];
+
+	start_bus_num = mcfg->start_bus_number;
+	end_bus_num = mcfg->end_bus_number;
+
+	if (end_bus_num < start_bus_num) {
+		printk(KERN_ERR "PCI: BIOS Bug: MCFG region %u has "
+				"misconfigured bus entries [%u,%u].\n",
+				mcfg_entry, mcfg->start_bus_number,
+				mcfg->end_bus_number);
+		return;
+	}
+
+	while (end_bus_num >= start_bus_num) {
+		num_buses = end_bus_num - start_bus_num + 1;
+		if (e820_all_mapped(mcfg->base_address,
+				mcfg->base_address + (num_buses << 20) -1,
+				E820_RESERVED))
+			break;
+		end_bus_num--;
+	}
+
+	if (mcfg->end_bus_number != end_bus_num) {
+		unsigned long end_addr;
+		unsigned long start_addr;
+		start_addr = mcfg->base_address;
+		num_buses = mcfg->end_bus_number - mcfg->start_bus_number + 1;
+		end_addr =  mcfg->base_address + (num_buses << 20) - 1;
+		printk(KERN_ERR "PCI: BIOS Bug: MCFG region %u not entirely "
+				"marked as e280-reserved (%016lx-%016lx).\n",
+			mcfg_entry, start_addr, end_addr);
+	}
+
+	/* If we could not find a region reserved in the e820 then we should
+	 * not reserve the resource. We will hope for the best that there
+	 * are no collisions. */
+	if (end_bus_num < start_bus_num)
+		return;
+
+	/* Fixup the resource limits for allocation without affecting the
+	 * reported bus number limits in the MCFG table. */
+	num_buses = end_bus_num - start_bus_num + 1;
+	res->start = mcfg->base_address;
+	res->end = res->start + (num_buses << 20) - 1;
+
+	snprintf((char *)res->name, PCI_MMCFG_RESOURCE_NAME_LEN,
+		 "PCI MMCONFIG %u", mcfg->pci_segment_group_number);
+	res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+	insert_resource(&iomem_resource, res);
+}
+
 static __init void pci_mmcfg_insert_resources(void)
 {
-#define PCI_MMCFG_RESOURCE_NAME_LEN 19
 	int i;
 	struct resource *res;
 	char *names;
-	unsigned num_buses;

 	res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res),
 			pci_mmcfg_config_num, GFP_KERNEL);

 	if (!res) {
-		printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n");
+		printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources.\n");
 		return;
 	}

 	names = (void *)&res[pci_mmcfg_config_num];
 	for (i = 0; i < pci_mmcfg_config_num; i++, res++) {
-		num_buses = pci_mmcfg_config[i].end_bus_number -
-		    pci_mmcfg_config[i].start_bus_number + 1;
 		res->name = names;
-		snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u",
-			pci_mmcfg_config[i].pci_segment_group_number);
-		res->start = pci_mmcfg_config[i].base_address;
-		res->end = res->start + (num_buses << 20) - 1;
-		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-		insert_resource(&iomem_resource, res);
+		pci_mmcfg_check_and_insert_resource(i, res);
 		names += PCI_MMCFG_RESOURCE_NAME_LEN;
 	}
 }
-- 
1.4.2.1.g4daf

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] Update MMCONFIG resource insertion to check against e820 map.
  2006-11-07 20:49 [PATCH] Update MMCONFIG resource insertion to check against e820 map Aaron Durbin
@ 2006-11-07 21:03 ` Matthew Wilcox
  2006-11-08 11:54 ` Andi Kleen
  2006-11-08 15:25 ` Andi Kleen
  2 siblings, 0 replies; 5+ messages in thread
From: Matthew Wilcox @ 2006-11-07 21:03 UTC (permalink / raw)
  To: Aaron Durbin; +Cc: Andi Kleen, linux-kernel, Jeff Chua, discuss

On Tue, Nov 07, 2006 at 12:49:53PM -0800, Aaron Durbin wrote:
> Check to see if MMCONFIG region is marked as reserved in the e820 map before
> arch/x86_64/pci/mmconfig.c |   76 
> ++++++++++++++++++++++++++++++++++++++------
> 1 files changed, 65 insertions(+), 11 deletions(-)

We'll need this for arch/i386 too ...

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Update MMCONFIG resource insertion to check against e820 map.
  2006-11-07 20:49 [PATCH] Update MMCONFIG resource insertion to check against e820 map Aaron Durbin
  2006-11-07 21:03 ` Matthew Wilcox
@ 2006-11-08 11:54 ` Andi Kleen
  2006-11-08 14:51   ` Jeff Chua
  2006-11-08 15:25 ` Andi Kleen
  2 siblings, 1 reply; 5+ messages in thread
From: Andi Kleen @ 2006-11-08 11:54 UTC (permalink / raw)
  To: Aaron Durbin; +Cc: linux-kernel, Matthew Wilcox, Jeff Chua, discuss

On Tuesday 07 November 2006 21:49, Aaron Durbin wrote:
> Check to see if MMCONFIG region is marked as reserved in the e820 map
> before inserting the MMCONFIG region into the resource map. If the region
> is not entirely marked as reserved in the e820 map attempt to find a region
> that is. Only insert the MMCONFIG region into the resource map if there was
> a region found marked as reserved in the e820 map.  This should fix a known
> regression in 2.6.19 by not reserving all of the I/O space on misconfigured
> systems.

Jeff, did this fix your problem?

-Andi

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Update MMCONFIG resource insertion to check against e820 map.
  2006-11-08 11:54 ` Andi Kleen
@ 2006-11-08 14:51   ` Jeff Chua
  0 siblings, 0 replies; 5+ messages in thread
From: Jeff Chua @ 2006-11-08 14:51 UTC (permalink / raw)
  To: Andi Kleen; +Cc: Aaron Durbin, linux-kernel, Matthew Wilcox, discuss

On 11/8/06, Andi Kleen <ak@suse.de> wrote:
> On Tuesday 07 November 2006 21:49, Aaron Durbin wrote:
> > Check to see if MMCONFIG region is marked as reserved in the e820 map
> > before inserting the MMCONFIG region into the resource map. If the region
> > is not entirely marked as reserved in the e820 map attempt to find a region
> > that is. Only insert the MMCONFIG region into the resource map if there was
> > a region found marked as reserved in the e820 map.  This should fix a known
> > regression in 2.6.19 by not reserving all of the I/O space on misconfigured
> > systems.
>
> Jeff, did this fix your problem?

Yes, it did. I can only verify that x86 32-bit tg3 is working nicely now.

Thanks to all who helped!

Jeff.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Update MMCONFIG resource insertion to check against e820 map.
  2006-11-07 20:49 [PATCH] Update MMCONFIG resource insertion to check against e820 map Aaron Durbin
  2006-11-07 21:03 ` Matthew Wilcox
  2006-11-08 11:54 ` Andi Kleen
@ 2006-11-08 15:25 ` Andi Kleen
  2 siblings, 0 replies; 5+ messages in thread
From: Andi Kleen @ 2006-11-08 15:25 UTC (permalink / raw)
  To: Aaron Durbin; +Cc: linux-kernel, Matthew Wilcox, Jeff Chua, discuss

On Tuesday 07 November 2006 21:49, Aaron Durbin wrote:
> Check to see if MMCONFIG region is marked as reserved in the e820 map
> before inserting the MMCONFIG region into the resource map. If the region
> is not entirely marked as reserved in the e820 map attempt to find a region
> that is. Only insert the MMCONFIG region into the resource map if there was
> a region found marked as reserved in the e820 map.  This should fix a known
> regression in 2.6.19 by not reserving all of the I/O space on misconfigured
> systems.

I added the patch. Thanks

-Andi

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2006-11-08 15:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-07 20:49 [PATCH] Update MMCONFIG resource insertion to check against e820 map Aaron Durbin
2006-11-07 21:03 ` Matthew Wilcox
2006-11-08 11:54 ` Andi Kleen
2006-11-08 14:51   ` Jeff Chua
2006-11-08 15:25 ` Andi Kleen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.