From: Andi Kleen <ak@suse.de>
To: "Aaron Durbin" <adurbin@google.com>,
patches@x86-64.org, linux-kernel@vger.kernel.org
Subject: [PATCH for 2.6.19] [6/9] x86_64: Update MMCONFIG resource insertion to check against e820 map.
Date: Tue, 14 Nov 2006 17:08:56 +0100 (CET) [thread overview]
Message-ID: <20061114160856.D02D113C69@wotan.suse.de> (raw)
In-Reply-To: <20061114508.445749000@suse.de>
From: "Aaron Durbin" <adurbin@google.com>
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.
Signed-off-by: Andi Kleen <ak@suse.de>
---
This patch is against 2.6.19-rc4.
arch/x86_64/pci/mmconfig.c | 76 ++++++++++++++++++++++++++++++++++++++-------
1 files changed, 65 insertions(+), 11 deletions(-)
Index: linux/arch/x86_64/pci/mmconfig.c
===================================================================
--- linux.orig/arch/x86_64/pci/mmconfig.c
+++ linux/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;
}
}
next prev parent reply other threads:[~2006-11-14 16:09 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-14 16:08 [PATCH for 2.6.19] [1/9] x86_64: Fix partial page check to ensure unusable memory is not being marked usable Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [2/9] x86_64: Fix PTRACE_[SG]ET_THREAD_AREA regression with ia32 emulation Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [3/9] x86_64: shorten the x86_64 boot setup GDT to what the comment says Andi Kleen
2006-11-15 10:00 ` Ingo Molnar
2006-11-14 16:08 ` [PATCH for 2.6.19] [4/9] x86_64: Handle reserve_bootmem_generic beyond end_pfn Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [5/9] x86_64: setup saved_max_pfn correctly (kdump) Andi Kleen
2006-11-14 16:08 ` Andi Kleen [this message]
2006-11-14 18:38 ` [PATCH for 2.6.19] [6/9] x86_64: Update MMCONFIG resource insertion to check against e820 map Andi Kleen
2006-11-14 18:47 ` Aaron Durbin
2006-11-14 18:58 ` Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [7/9] x86: Add acpi_user_timer_override option for Asus boards Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [8/9] x86_64: Fix vgetcpu when CONFIG_HOTPLUG_CPU is disabled Andi Kleen
2006-11-14 16:08 ` [PATCH for 2.6.19] [9/9] x86_64: Fix race in exit_idle Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061114160856.D02D113C69@wotan.suse.de \
--to=ak@suse.de \
--cc=adurbin@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=patches@x86-64.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome