Re: x86 git tree broken (bisected)

From: Yinghai Lu
Date: Sun Apr 13 2008 - 18:00:37 EST


On Sun, Apr 13, 2008 at 9:12 AM, Rafael J. Wysocki <rjw@xxxxxxx> wrote:
...
> > can you try to apply the patch i sent to you about agp bridge order
> > reading for buggy silicon?
> >
> > Please boot kernel with "debug"...
> >
> > I want to verify if you can get
> >
> > "
> > Aperture conflicts with PCI mapping.
> > "
> >
> > in your boot log...
>
> It's not present in there:
>
> rafael@albercik:~> grep Aperture failing-with-patch-dmesg.log
> Aperture too small (32 MB)
> Aperture from AGP @ de000000 size 4096 MB (APSIZE 0)
> Aperture too small (0 MB)
> agpgart: Aperture pointing to RAM
> agpgart: Aperture from AGP @ de000000 size 4096 MB
> agpgart: Aperture too small (0 MB)
>
> Full dmesg output attached.

please check attached debug patch. and check if you can change GART
size in your BIOS setup to 64M instead of 32M

Thanks

YH
[PATCH] x86_64: checking aperture size order...

diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
index 2e93b31..e86689a 100644
--- a/arch/x86/kernel/aperture_64.c
+++ b/arch/x86/kernel/aperture_64.c
@@ -96,7 +96,7 @@ static int __init aperture_valid(u64 aper_base, u32 aper_size)
printk(KERN_ERR "Aperture pointing to e820 RAM. Ignoring.\n");
return 0;
}
- if (aper_size < 64*1024*1024) {
+ if (aper_size < 32*1024*1024) {
printk(KERN_ERR "Aperture too small (%d MB)\n", aper_size>>20);
return 0;
}
@@ -167,7 +167,9 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
* On some sick chips, APSIZE is 0. It means it wants 4G
* so let double check that order, and lets trust AMD NB settings:
*/
- if (aper + (32UL<<(20 + *order)) > 0x100000000UL) {
+ printk(KERN_INFO "Aperture from AGP @ %Lx old size %u MB\n",
+ aper, 32 << old_order);
+ if (aper + (32ULL<<(20 + *order)) > 0x100000000ULL) {
printk(KERN_INFO "Aperture size %u MB (APSIZE %x) is not right, using settings from NB\n",
32 << *order, apsizereg);
*order = old_order;
@@ -302,8 +304,8 @@ void __init early_gart_iommu_check(void)
fix = 1;

if (gart_fix_e820 && !fix && aper_enabled) {
- if (e820_any_mapped(aper_base, aper_base + aper_size,
- E820_RAM)) {
+ if (!e820_all_mapped(aper_base, aper_base + aper_size,
+ E820_RESERVED)) {
/* reserved it, so we can resuse it in second kernel */
printk(KERN_INFO "update e820 for GART\n");
add_memory_region(aper_base, aper_size, E820_RESERVED);
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index 8fc05c8..97d4821 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -245,11 +245,7 @@ static int __devinit aperture_valid(u64 aper, u32 size)
printk(KERN_ERR PFX "No aperture\n");
return 0;
}
- if (size < 32*1024*1024) {
- printk(KERN_ERR PFX "Aperture too small (%d MB)\n", size>>20);
- return 0;
- }
- if ((u64)aper + size > 0x100000000ULL) {
+ if ((u64)aper + size > 0x100000000ULL) {
printk(KERN_ERR PFX "Aperture out of bounds\n");
return 0;
}
@@ -257,6 +253,10 @@ static int __devinit aperture_valid(u64 aper, u32 size)
printk(KERN_ERR PFX "Aperture pointing to RAM\n");
return 0;
}
+ if (size < 32*1024*1024) {
+ printk(KERN_ERR PFX "Aperture too small (%d MB)\n", size>>20);
+ return 0;
+ }

/* Request the Aperture. This catches cases when someone else
already put a mapping in there - happens with some very broken BIOS
@@ -317,7 +317,7 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
* On some sick chips APSIZE is 0. This means it wants 4G
* so let double check that order, and lets trust the AMD NB settings
*/
- if (aper + (32ULL<<(20 + order)) > 0x100000000ULL) {
+ if (order >=0 && aper + (32ULL<<(20 + order)) > 0x100000000ULL) {
printk(KERN_INFO "Aperture size %u MB is not right, using settings from NB\n",
32 << order);
order = nb_order;