Commit 4515b172 authored by Borislav Petkov's avatar Borislav Petkov Committed by Greg Kroah-Hartman

x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems

commit 0e152cd7 upstream.

de957628 changed setting of the
x86_init.iommu.iommu_init function ptr only when GART IOMMU is
found.

One side effect of it is that num_k8_northbridges
is not initialized anymore if not explicitly
called. This resulted in uninitialized pointers in
<arch/x86/kernel/cpu/intel_cacheinfo.c:amd_calc_l3_indices()>,
for example, which uses the num_k8_northbridges thing through
node_to_k8_nb_misc().

Fix that through an initcall that runs right after the PCI
subsystem and does all the scanning. Then, remove initialization
in gart_iommu_init() which is a rootfs_initcall and we're
running before that.

What is more, since num_k8_northbridges is being used in other
places beside GART IOMMU, include it whenever we add AMD CPU
support. The previous dependency chain in kconfig contained

K8_NB depends on AGP_AMD64|GART_IOMMU

which was clearly incorrect. The more natural way in terms of
hardware dependency should be

AGP_AMD64|GART_IOMMU depends on K8_NB depends on CPU_SUP_AMD &&
PCI. Make it so Number One!
Signed-off-by: default avatarBorislav Petkov <borislav.petkov@amd.com>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Joerg Roedel <joerg.roedel@amd.com>
LKML-Reference: <20100312144303.GA29262@aftab>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Tested-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 35d5aaca
...@@ -622,7 +622,7 @@ config GART_IOMMU ...@@ -622,7 +622,7 @@ config GART_IOMMU
bool "GART IOMMU support" if EMBEDDED bool "GART IOMMU support" if EMBEDDED
default y default y
select SWIOTLB select SWIOTLB
depends on X86_64 && PCI depends on X86_64 && PCI && K8_NB
---help--- ---help---
Support for full DMA access of devices with 32bit memory access only Support for full DMA access of devices with 32bit memory access only
on systems with more than 3GB. This is usually needed for USB, on systems with more than 3GB. This is usually needed for USB,
...@@ -2027,7 +2027,7 @@ endif # X86_32 ...@@ -2027,7 +2027,7 @@ endif # X86_32
config K8_NB config K8_NB
def_bool y def_bool y
depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA))) depends on CPU_SUP_AMD && PCI
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
......
...@@ -121,3 +121,17 @@ void k8_flush_garts(void) ...@@ -121,3 +121,17 @@ void k8_flush_garts(void)
} }
EXPORT_SYMBOL_GPL(k8_flush_garts); EXPORT_SYMBOL_GPL(k8_flush_garts);
static __init int init_k8_nbs(void)
{
int err = 0;
err = cache_k8_northbridges();
if (err < 0)
printk(KERN_NOTICE "K8 NB: Cannot enumerate AMD northbridges.\n");
return err;
}
/* This has to go after the PCI subsystem */
fs_initcall(init_k8_nbs);
...@@ -720,7 +720,7 @@ void __init gart_iommu_init(void) ...@@ -720,7 +720,7 @@ void __init gart_iommu_init(void)
unsigned long scratch; unsigned long scratch;
long i; long i;
if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) if (num_k8_northbridges == 0)
return; return;
#ifndef CONFIG_AGP_AMD64 #ifndef CONFIG_AGP_AMD64
......
...@@ -57,7 +57,7 @@ config AGP_AMD ...@@ -57,7 +57,7 @@ config AGP_AMD
config AGP_AMD64 config AGP_AMD64
tristate "AMD Opteron/Athlon64 on-CPU GART support" if !GART_IOMMU tristate "AMD Opteron/Athlon64 on-CPU GART support" if !GART_IOMMU
depends on AGP && X86 depends on AGP && X86 && K8_NB
default y if GART_IOMMU default y if GART_IOMMU
help help
This option gives you AGP support for the GLX component of This option gives you AGP support for the GLX component of
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment