x86/agp: tighten check to update amd nb aperture
Impact: fix bug to make agp work with dri Jeffrey reported that dri does work with 64bit, but doesn't work with 32bit it turns out NB aperture is 32M, aperture on agp is 128M 64bit is using 64M for vaidation for 64 iommu/gart 32bit is only using 32M..., and will not update the nb aperture. So try to compare nb apterture and agp apterture before leaving not touch nb aperture. Reported-by: Jeffrey Trull <jetrull@sbcglobal.net> Tested-by: Jeffrey Trull <jetrull@sbcglobal.net> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Acked-by: Dave Airlie <airlied@linux.ie> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5a891ed5ad
commit
2f68891314
|
@ -271,15 +271,15 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
|
||||||
nb_order = (nb_order >> 1) & 7;
|
nb_order = (nb_order >> 1) & 7;
|
||||||
pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);
|
pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);
|
||||||
nb_aper = nb_base << 25;
|
nb_aper = nb_base << 25;
|
||||||
if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Northbridge seems to contain crap. Try the AGP bridge. */
|
/* Northbridge seems to contain crap. Try the AGP bridge. */
|
||||||
|
|
||||||
pci_read_config_word(agp, cap+0x14, &apsize);
|
pci_read_config_word(agp, cap+0x14, &apsize);
|
||||||
if (apsize == 0xffff)
|
if (apsize == 0xffff) {
|
||||||
|
if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
|
||||||
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
apsize &= 0xfff;
|
apsize &= 0xfff;
|
||||||
/* Some BIOS use weird encodings not in the AGPv3 table. */
|
/* Some BIOS use weird encodings not in the AGPv3 table. */
|
||||||
|
@ -301,6 +301,11 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
|
||||||
order = nb_order;
|
order = nb_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nb_order >= order) {
|
||||||
|
if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dev_info(&agp->dev, "aperture from AGP @ %Lx size %u MB\n",
|
dev_info(&agp->dev, "aperture from AGP @ %Lx size %u MB\n",
|
||||||
aper, 32 << order);
|
aper, 32 << order);
|
||||||
if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
|
if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
|
||||||
|
|
Loading…
Reference in New Issue