Commit 0e152cd7 authored by Borislav Petkov's avatar Borislav Petkov Committed by Ingo Molnar

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

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>
parent 8447b360
...@@ -627,7 +627,7 @@ config GART_IOMMU ...@@ -627,7 +627,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,
...@@ -2026,7 +2026,7 @@ endif # X86_32 ...@@ -2026,7 +2026,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);
...@@ -735,7 +735,7 @@ int __init gart_iommu_init(void) ...@@ -735,7 +735,7 @@ int __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 0; return 0;
#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" tristate "AMD Opteron/Athlon64 on-CPU GART support"
depends on AGP && X86 depends on AGP && X86 && K8_NB
help help
This option gives you AGP support for the GLX component of This option gives you AGP support for the GLX component of
X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs. X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs.
......
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