public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: [RFC] PCI extended conf space when MMCONFIG disabled because of e820
@ 2006-06-15  8:41 Chuck Ebbert
  2006-06-15 13:18 ` Arjan van de Ven
  0 siblings, 1 reply; 13+ messages in thread
From: Chuck Ebbert @ 2006-06-15  8:41 UTC (permalink / raw)
  To: Andi Kleen; +Cc: Brice Goglin, Arjan van de Ven, linux-kernel, Greg KH

In-Reply-To: <p73ac8fqjix.fsf@verdi.suse.de>

On 15 Jun 2006 03:45:10 +0200, Andi Kleen wrote:

> Anyways I would say that if the BIOS can't get MCFG right then 
> it's likely not been validated on that board and shouldn't be used.

According to Petr Vandrovec:

 ... "What is important (and checked) is address of MMCONFIG reported by MCFG
 table...  Unfortunately code does not bother with printing that address :-(
 
 "Another problem is that code has hardcoded that MMCONFIG area is 256MB large. 
 Unfortunately for the code PCI specification allows any power of two between 2MB 
 and 256MB if vendor knows that such amount of busses (from 2 to 128) will be 
 sufficient for system.  With notebook it is quite possible that not full 8 bits 
 are implemented for MMCONFIG bus number."


So here is a patch.  Unfortunately my system still fails the test because
it doesn't reserve any part of the MMCONFIG area, but this may fix others.

Booted on x86_64, only compiled on i386.  x86_64 still remaps the max area
(256MB) even though only 2MB is checked... but 2.6.16 had no check at all
so it is still better.


PCI: reduce size of x86 MMCONFIG reserved area check

1.  Print the address of the MMCONFIG area when the test for that area
    being reserved fails.

2.  Only check if the first 2MB is reserved, as that is the minimum.

Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com>

 arch/i386/pci/mmconfig.c   |    9 ++++++---
 arch/x86_64/pci/mmconfig.c |   13 +++++++++----
 2 files changed, 15 insertions(+), 7 deletions(-)

--- 2.6.17-rc6-64.orig/arch/i386/pci/mmconfig.c
+++ 2.6.17-rc6-64/arch/i386/pci/mmconfig.c
@@ -15,7 +15,9 @@
 #include <asm/e820.h>
 #include "pci.h"
 
-#define MMCONFIG_APER_SIZE (256*1024*1024)
+/* aperture is up to 256MB but BIOS may reserve less */
+#define MMCONFIG_APER_MIN	(2 * 1024*1024)
+#define MMCONFIG_APER_MAX	(256 * 1024*1024)
 
 /* Assume systems with more busses have correct MCFG */
 #define MAX_CHECK_BUS 16
@@ -197,9 +199,10 @@ void __init pci_mmcfg_init(void)
 		return;
 
 	if (!e820_all_mapped(pci_mmcfg_config[0].base_address,
-			pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE,
+			pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN,
 			E820_RESERVED)) {
-		printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n");
+		printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n",
+				pci_mmcfg_config[0].base_address);
 		printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
 		return;
 	}
--- 2.6.17-rc6-64.orig/arch/x86_64/pci/mmconfig.c
+++ 2.6.17-rc6-64/arch/x86_64/pci/mmconfig.c
@@ -13,7 +13,10 @@
 
 #include "pci.h"
 
-#define MMCONFIG_APER_SIZE (256*1024*1024)
+/* aperture is up to 256MB but BIOS may reserve less */
+#define MMCONFIG_APER_MIN	(2 * 1024*1024)
+#define MMCONFIG_APER_MAX	(256 * 1024*1024)
+
 /* Verify the first 16 busses. We assume that systems with more busses
    get MCFG right. */
 #define MAX_CHECK_BUS 16
@@ -175,9 +178,10 @@ void __init pci_mmcfg_init(void)
 		return;
 
 	if (!e820_all_mapped(pci_mmcfg_config[0].base_address,
-			pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE,
+			pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN,
 			E820_RESERVED)) {
-		printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n");
+		printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n",
+				pci_mmcfg_config[0].base_address);
 		printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
 		return;
 	}
@@ -190,7 +194,8 @@ void __init pci_mmcfg_init(void)
 	}
 	for (i = 0; i < pci_mmcfg_config_num; ++i) {
 		pci_mmcfg_virt[i].cfg = &pci_mmcfg_config[i];
-		pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address, MMCONFIG_APER_SIZE);
+		pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address,
+							 MMCONFIG_APER_MAX);
 		if (!pci_mmcfg_virt[i].virt) {
 			printk("PCI: Cannot map mmconfig aperture for segment %d\n",
 			       pci_mmcfg_config[i].pci_segment_group_number);
-- 
Chuck

^ permalink raw reply	[flat|nested] 13+ messages in thread
* [RFC] PCI extended conf space when MMCONFIG disabled because of e820
@ 2006-06-14 21:07 Brice Goglin
  2006-06-14 21:09 ` Arjan van de Ven
  0 siblings, 1 reply; 13+ messages in thread
From: Brice Goglin @ 2006-06-14 21:07 UTC (permalink / raw)
  To: arjan; +Cc: LKML

Hi Arjan,

We have some machines here where MMCONFIG is disabled in 2.6.17 because
their MCFG area is not e820-reserved. It makes the extended PCI config
space unavailable to pci_read/write_config_foo(). I don't know if lots
of people out there use the extended config space, but at least we do in
our myri10ge driver.

What would you think of a patch implementing the following strategy:
1) if MMCONFIG works, always use it (no change)
2) if MMCONFIG is disabled and we are accessing the regular config
space, use direct conf (no change, should ensure that any machine will
still boot fine)
3) if MMCONFIG is disabled but we are accessing the _extended_ config
space, try mmconfig anyway since there's no other way to do it.

Actually, this problem seems to target nVidia chipsets, and we actually
know how to check this chipset's registers to be sure whether MMCONFIG
works. So it might be good to improve the current MMCONFIG disabling
code by adding some chipset-specific hacks (having nVidia and Intel
chipsets there may cover most of the cases). I don't think there's any
way to do that with PCI quirks. We might end up having these hacks in
the MMCONFIG initialization code.

Thanks,
Brice


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

end of thread, other threads:[~2006-06-23  7:47 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-15  8:41 [RFC] PCI extended conf space when MMCONFIG disabled because of e820 Chuck Ebbert
2006-06-15 13:18 ` Arjan van de Ven
2006-06-15 14:32   ` Barry Scott
  -- strict thread matches above, loose matches on Subject: below --
2006-06-14 21:07 Brice Goglin
2006-06-14 21:09 ` Arjan van de Ven
2006-06-15  1:45   ` Andi Kleen
2006-06-15  1:57   ` Brice Goglin
2006-06-15  6:47     ` Arjan van de Ven
2006-06-21 22:19       ` Rajesh Shah
2006-06-21 22:32         ` Andi Kleen
2006-06-22  0:15           ` Rajesh Shah
2006-06-22  9:27             ` Arjan van de Ven
2006-06-23  7:41               ` Rajesh Shah

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox