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

de957628ce 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: Borislav 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: Ingo Molnar <mingo@elte.hu>
Tested-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
Borislav Petkov
2010-03-12 15:43:03 +01:00
committed by Ingo Molnar
parent 8447b360a3
commit 0e152cd7c1
4 changed files with 18 additions and 4 deletions

View File

@@ -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
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"

View File

@@ -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);

View File

@@ -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

View File

@@ -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.