x86, GART: Disable GART table walk probes
Current code tramples over bit F3x90[6] which can be used to disable GART table walk probes. However, this bit should be set for performance reasons (speed up GART table walks). We are allowed to do that since we put GART tables in UC memory later anyway. Make it so. Signed-off-by: Borislav Petkov <borislav.petkov@amd.com> Cc: Dave Airlie <airlied@redhat.com> Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> LKML-Reference: <1283531981-7495-3-git-send-email-bp@amd64.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
57ab43e331
commit
260133ab65
@ -17,6 +17,7 @@ extern int fix_aperture;
|
|||||||
#define GARTEN (1<<0)
|
#define GARTEN (1<<0)
|
||||||
#define DISGARTCPU (1<<4)
|
#define DISGARTCPU (1<<4)
|
||||||
#define DISGARTIO (1<<5)
|
#define DISGARTIO (1<<5)
|
||||||
|
#define DISTLBWALKPRB (1<<6)
|
||||||
|
|
||||||
/* GART cache control register bits. */
|
/* GART cache control register bits. */
|
||||||
#define INVGART (1<<0)
|
#define INVGART (1<<0)
|
||||||
@ -56,6 +57,19 @@ static inline void gart_iommu_hole_init(void)
|
|||||||
|
|
||||||
extern int agp_amd64_init(void);
|
extern int agp_amd64_init(void);
|
||||||
|
|
||||||
|
static inline void gart_set_size_and_enable(struct pci_dev *dev, u32 order)
|
||||||
|
{
|
||||||
|
u32 ctl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't enable translation but enable GART IO and CPU accesses.
|
||||||
|
* Also, set DISTLBWALKPRB since GART tables memory is UC.
|
||||||
|
*/
|
||||||
|
ctl = DISTLBWALKPRB | order << 1;
|
||||||
|
|
||||||
|
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void enable_gart_translation(struct pci_dev *dev, u64 addr)
|
static inline void enable_gart_translation(struct pci_dev *dev, u64 addr)
|
||||||
{
|
{
|
||||||
u32 tmp, ctl;
|
u32 tmp, ctl;
|
||||||
|
@ -505,8 +505,13 @@ void __init gart_iommu_hole_init(void)
|
|||||||
|
|
||||||
/* Fix up the north bridges */
|
/* Fix up the north bridges */
|
||||||
for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
|
for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
|
||||||
int bus;
|
int bus, dev_base, dev_limit;
|
||||||
int dev_base, dev_limit;
|
|
||||||
|
/*
|
||||||
|
* Don't enable translation yet but enable GART IO and CPU
|
||||||
|
* accesses and set DISTLBWALKPRB since GART table memory is UC.
|
||||||
|
*/
|
||||||
|
u32 ctl = DISTLBWALKPRB | aper_order << 1;
|
||||||
|
|
||||||
bus = bus_dev_ranges[i].bus;
|
bus = bus_dev_ranges[i].bus;
|
||||||
dev_base = bus_dev_ranges[i].dev_base;
|
dev_base = bus_dev_ranges[i].dev_base;
|
||||||
@ -515,10 +520,7 @@ void __init gart_iommu_hole_init(void)
|
|||||||
if (!early_is_k8_nb(read_pci_config(bus, slot, 3, 0x00)))
|
if (!early_is_k8_nb(read_pci_config(bus, slot, 3, 0x00)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Don't enable translation yet. That is done later.
|
write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl);
|
||||||
Assume this BIOS didn't initialise the GART so
|
|
||||||
just overwrite all previous bits */
|
|
||||||
write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, aper_order << 1);
|
|
||||||
write_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE, aper_alloc >> 25);
|
write_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE, aper_alloc >> 25);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -601,7 +601,7 @@ static void gart_fixup_northbridges(struct sys_device *dev)
|
|||||||
* Don't enable translations just yet. That is the next
|
* Don't enable translations just yet. That is the next
|
||||||
* step. Restore the pre-suspend aperture settings.
|
* step. Restore the pre-suspend aperture settings.
|
||||||
*/
|
*/
|
||||||
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, aperture_order << 1);
|
gart_set_size_and_enable(dev, aperture_order);
|
||||||
pci_write_config_dword(dev, AMD64_GARTAPERTUREBASE, aperture_alloc >> 25);
|
pci_write_config_dword(dev, AMD64_GARTAPERTUREBASE, aperture_alloc >> 25);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -313,7 +313,7 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
|
|||||||
if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
|
if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pci_write_config_dword(nb, AMD64_GARTAPERTURECTL, order << 1);
|
gart_set_size_and_enable(nb, order);
|
||||||
pci_write_config_dword(nb, AMD64_GARTAPERTUREBASE, aper >> 25);
|
pci_write_config_dword(nb, AMD64_GARTAPERTUREBASE, aper >> 25);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user