All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
@ 2010-03-08 17:06 Borislav Petkov
  2010-03-09  1:32 ` FUJITA Tomonori
  2010-03-11 13:22 ` Ingo Molnar
  0 siblings, 2 replies; 6+ messages in thread
From: Borislav Petkov @ 2010-03-08 17:06 UTC (permalink / raw)
  To: Ingo Molnar, H. Peter Anvin, Thomas Gleixner; +Cc: FUJITA Tomonori, x86, LKML

Hi,

we're getting the following oopsie with current -git. Proposed patch is below:

[    5.582656] BUG: unable to handle kernel NULL pointer dereference at 0000000000000038
[    5.583643] IP: [<ffffffff81645859>] cpuid4_cache_lookup_regs+0x22c/0x31d
[    5.583643] PGD 0 
[    5.583643] Oops: 0000 [#1] SMP 
[    5.583643] last sysfs file: 
[    5.583643] CPU 0 
[    5.583643] Modules linked in:
[    5.583643] 
[    5.583643] Pid: 0, comm: swapper Not tainted 2.6.33 #1
[    5.583643] RIP: 0010:[<ffffffff81645859>]  [<ffffffff81645859>] cpuid4_cache_lookup_regs+0x22c/0x31d
[    5.583643] RSP: 0018:ffff880002a03e78  EFLAGS: 00010046
[    5.583643] RAX: 0000000000000000 RBX: 0000000042004200 RCX: 00000000000006aa
[    5.583643] RDX: 0000000000000000 RSI: 0000000000500000 RDI: 0000000000000003
[    5.583643] RBP: ffff880002a03ee8 R08: 0000000000000030 R09: 0000000000000001
[    5.583643] R10: 0000000000000040 R11: ffff880002a12f00 R12: 000000000bc0003f
[    5.583643] R13: 00000000000006a9 R14: ffff8808357be6a8 R15: 000000002c000163
[    5.583643] FS:  0000000000000000(0000) GS:ffff880002a00000(0000) knlGS:0000000000000000
[    5.583643] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[    5.583643] CR2: 0000000000000038 CR3: 0000000001cdf000 CR4: 00000000000006f0
[    5.583643] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    5.583643] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[    5.583643] Process swapper (pid: 0, threadinfo ffffffff81c00000, task ffffffff81ce7020)
[    5.583643] Stack:
[    5.583643]  000140000000e8b0 7fffffffffffffff ffff880002a03eb8 000000008104f595
[    5.583643] <0> ffffffff40020140 00000001000002c0 0000000040020140 0000000000000046
[    5.583643] <0> ffffffff81ce7020 0000000000000001 ffff880002a12500 0000000000000003
[    5.583643] Call Trace:
[    5.583643]  <IRQ> 
[    5.583643]  [<ffffffff81646289>] get_cpu_leaves+0x6a/0x235
[    5.583643]  [<ffffffff81062326>] generic_smp_call_function_single_interrupt+0xdf/0x11b
[    5.583643]  [<ffffffff810171d1>] smp_call_function_single_interrupt+0x22/0x31
[    5.583643]  [<ffffffff810035b3>] call_function_single_interrupt+0x13/0x20
[    5.583643]  <EOI> 
[    5.583643]  [<ffffffff8102bdd4>] ? cpuacct_charge+0x1c/0x97
[    5.583643]  [<ffffffff8100986c>] ? default_idle+0x27/0x41
[    5.583643]  [<ffffffff8100986a>] ? default_idle+0x25/0x41
[    5.583643]  [<ffffffff810099fe>] c1e_idle+0xe9/0xf0
[    5.583643]  [<ffffffff81652991>] ? atomic_notifier_call_chain+0xf/0x11
[    5.583643]  [<ffffffff81001d7a>] cpu_idle+0x5a/0x92
[    5.583643]  [<ffffffff8162928a>] rest_init+0xbe/0xc2
[    5.583643]  [<ffffffff816291cc>] ? rest_init+0x0/0xc2
[    5.583643]  [<ffffffff81dedd05>] start_kernel+0x3ac/0x3b8
[    5.583643]  [<ffffffff81ded295>] x86_64_start_reservations+0xa5/0xa9
[    5.583643]  [<ffffffff81ded37a>] x86_64_start_kernel+0xe1/0xe8
[    5.583643] Code: 98 48 8b 04 c5 60 12 dd 81 8b 14 02 31 c0 3b 15 06 be 86 00 7d 0e 48 8b 05 f5 bd 86 00 48 63 d2 48 8b 04 d0 c7 45 ac 00 00 00 00 <8b> 70 38 48 8d 4d ac 48 8b 78 10 ba c4 01 00 00 e8 b6 c2 bb ff 
[    5.583643] RIP  [<ffffffff81645859>] cpuid4_cache_lookup_regs+0x22c/0x31d
[    5.583643]  RSP <ffff880002a03e78>
[    5.583643] CR2: 0000000000000038
[    5.583643] ---[ end trace a7919e7f17c0a725 ]---
[    5.583643] Kernel panic - not syncing: Fatal exception in interrupt
[    5.583643] Pid: 0, comm: swapper Tainted: G      D    2.6.33 #1
[    5.583643] Call Trace:
[    5.583643]  <IRQ>  [<ffffffff8164cd8d>] panic+0x9e/0x11d
[    5.583643]  [<ffffffff810386be>] ? kmsg_dump+0xa8/0x14d
[    5.583643]  [<ffffffff8105abde>] ? trace_hardirqs_off+0xd/0xf
[    5.583643]  [<ffffffff8164f670>] ? _raw_spin_unlock_irqrestore+0x38/0x47
[    5.583643]  [<ffffffff81038749>] ? kmsg_dump+0x133/0x14d
[    5.583643]  [<ffffffff81650781>] oops_end+0xaa/0xba
[    5.583643]  [<ffffffff81023f71>] no_context+0x1f3/0x202
[    5.583643]  [<ffffffff8105b410>] ? mark_lock+0x22/0x22f
[    5.583643]  [<ffffffff81024148>] __bad_area_nosemaphore+0x1c8/0x1ee
[    5.583643]  [<ffffffff8105b410>] ? mark_lock+0x22/0x22f
[    5.583643]  [<ffffffff8105b410>] ? mark_lock+0x22/0x22f
[    5.583643]  [<ffffffff8105d123>] ? __lock_acquire+0xd7d/0xd8c
[    5.583643]  [<ffffffff8102417c>] bad_area_nosemaphore+0xe/0x10
[    5.583643]  [<ffffffff81652751>] do_page_fault+0x190/0x2e0
[    5.583643]  [<ffffffff8164fb7f>] page_fault+0x1f/0x30
[    5.583643]  [<ffffffff81645859>] ? cpuid4_cache_lookup_regs+0x22c/0x31d
[    5.583643]  [<ffffffff8164f670>] ? _raw_spin_unlock_irqrestore+0x38/0x47
[    5.583643]  [<ffffffff81646289>] get_cpu_leaves+0x6a/0x235
[    5.583643]  [<ffffffff81062326>] generic_smp_call_function_single_interrupt+0xdf/0x11b
[    5.583643]  [<ffffffff810171d1>] smp_call_function_single_interrupt+0x22/0x31
[    5.583643]  [<ffffffff810035b3>] call_function_single_interrupt+0x13/0x20
[    5.583643]  <EOI>  [<ffffffff8102bdd4>] ? cpuacct_charge+0x1c/0x97
[    5.583643]  [<ffffffff8100986c>] ? default_idle+0x27/0x41
[    5.583643]  [<ffffffff8100986a>] ? default_idle+0x25/0x41
[    5.583643]  [<ffffffff810099fe>] c1e_idle+0xe9/0xf0
[    5.583643]  [<ffffffff81652991>] ? atomic_notifier_call_chain+0xf/0x11
[    5.583643]  [<ffffffff81001d7a>] cpu_idle+0x5a/0x92
[    5.583643]  [<ffffffff8162928a>] rest_init+0xbe/0xc2
[    5.583643]  [<ffffffff816291cc>] ? rest_init+0x0/0xc2
[    5.583643]  [<ffffffff81dedd05>] start_kernel+0x3ac/0x3b8
[    5.583643]  [<ffffffff81ded295>] x86_64_start_reservations+0xa5/0xa9
[    5.583643]  [<ffffffff81ded37a>] x86_64_start_kernel+0xe1/0xe8
---

Fix:

---
From: Borislav Petkov <borislav.petkov@amd.com>
Date: Mon, 8 Mar 2010 14:27:01 +0100
Subject: [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD

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

Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Tested-by: Joerg Roedel <joerg.roedel@amd.com>
---
 arch/x86/Kconfig              |    2 +-
 arch/x86/kernel/k8.c          |   14 ++++++++++++++
 arch/x86/kernel/pci-gart_64.c |    2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index e984403..2f3ab91 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2058,7 +2058,7 @@ endif # X86_32
 
 config K8_NB
 	def_bool y
-	depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA)))
+	depends on CPU_SUP_AMD && PCI
 
 source "drivers/pcmcia/Kconfig"
 
diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c
index cbc4332..9b89546 100644
--- a/arch/x86/kernel/k8.c
+++ b/arch/x86/kernel/k8.c
@@ -121,3 +121,17 @@ void k8_flush_garts(void)
 }
 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);
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
index 34de53b..f3af115 100644
--- a/arch/x86/kernel/pci-gart_64.c
+++ b/arch/x86/kernel/pci-gart_64.c
@@ -735,7 +735,7 @@ int __init gart_iommu_init(void)
 	unsigned long scratch;
 	long i;
 
-	if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0)
+	if (num_k8_northbridges == 0)
 		return 0;
 
 #ifndef CONFIG_AGP_AMD64
-- 
1.6.6.1


-- 
Regards/Gruss,
Boris.

-
Advanced Micro Devices, Inc.
Operating Systems Research Center

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
  2010-03-08 17:06 [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD Borislav Petkov
@ 2010-03-09  1:32 ` FUJITA Tomonori
  2010-03-11 13:22 ` Ingo Molnar
  1 sibling, 0 replies; 6+ messages in thread
From: FUJITA Tomonori @ 2010-03-09  1:32 UTC (permalink / raw)
  To: bp; +Cc: mingo, hpa, tglx, fujita.tomonori, x86, linux-kernel

On Mon, 8 Mar 2010 18:06:37 +0100
Borislav Petkov <bp@amd64.org> wrote:

> From: Borislav Petkov <borislav.petkov@amd.com>
> Date: Mon, 8 Mar 2010 14:27:01 +0100
> Subject: [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
> 
> de957628ce7c84764ff41331111036b3ae5bad0f 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.
> 
> Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
> Tested-by: Joerg Roedel <joerg.roedel@amd.com>
> ---
>  arch/x86/Kconfig              |    2 +-
>  arch/x86/kernel/k8.c          |   14 ++++++++++++++
>  arch/x86/kernel/pci-gart_64.c |    2 +-
>  3 files changed, 16 insertions(+), 2 deletions(-)

Thanks a lot!

Looks correct to me.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
  2010-03-08 17:06 [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD Borislav Petkov
  2010-03-09  1:32 ` FUJITA Tomonori
@ 2010-03-11 13:22 ` Ingo Molnar
  2010-03-11 14:17   ` Borislav Petkov
  2010-03-12 14:43   ` [PATCH -v2] " Borislav Petkov
  1 sibling, 2 replies; 6+ messages in thread
From: Ingo Molnar @ 2010-03-11 13:22 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: H. Peter Anvin, Thomas Gleixner, FUJITA Tomonori, x86, LKML


* Borislav Petkov <bp@amd64.org> wrote:

> Hi,
> 
> we're getting the following oopsie with current -git. Proposed patch is below:

alas, your patch doesnt always build:

drivers/built-in.o: In function `agp_amd64_probe':
amd64-agp.c:(.devinit.text+0x81d2): undefined reference to `cache_k8_northbridges'
amd64-agp.c:(.devinit.text+0x8207): undefined reference to `k8_northbridges'
amd64-agp.c:(.devinit.text+0x8409): undefined reference to `num_k8_northbridges'
amd64-agp.c:(.devinit.text+0x8500): undefined reference to `k8_northbridges'

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
  2010-03-11 13:22 ` Ingo Molnar
@ 2010-03-11 14:17   ` Borislav Petkov
  2010-03-12 14:43   ` [PATCH -v2] " Borislav Petkov
  1 sibling, 0 replies; 6+ messages in thread
From: Borislav Petkov @ 2010-03-11 14:17 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: H. Peter Anvin, Thomas Gleixner, FUJITA Tomonori, x86, LKML

From: Ingo Molnar <mingo@elte.hu>
Date: Thu, Mar 11, 2010 at 02:22:02PM +0100

> > we're getting the following oopsie with current -git. Proposed patch is below:
> 
> alas, your patch doesnt always build:
> 
> drivers/built-in.o: In function `agp_amd64_probe':
> amd64-agp.c:(.devinit.text+0x81d2): undefined reference to `cache_k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8207): undefined reference to `k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8409): undefined reference to `num_k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8500): undefined reference to `k8_northbridges'

Ah, yep, this patch removes the dependency on K8_NB and it could be that
your config has CONFIG_K8_NB disabled but with CONFIG_AGP_AMD64 enabled.
Can you send me your .config pls?

-- 
Regards/Gruss,
Boris.

--
Advanced Micro Devices, Inc.
Operating Systems Research Center

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH -v2] x86, k8 nb: Enable k8_northbridges unconditionally on AMD
  2010-03-11 13:22 ` Ingo Molnar
  2010-03-11 14:17   ` Borislav Petkov
@ 2010-03-12 14:43   ` Borislav Petkov
  2010-03-13 12:26     ` [tip:x86/urgent] x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems tip-bot for Borislav Petkov
  1 sibling, 1 reply; 6+ messages in thread
From: Borislav Petkov @ 2010-03-12 14:43 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: H. Peter Anvin, Thomas Gleixner, FUJITA Tomonori, x86, LKML,
	Jörg Rödel

From: Ingo Molnar <mingo@elte.hu>
Date: Thu, Mar 11, 2010 at 02:22:02PM +0100

> alas, your patch doesnt always build:
> 
> drivers/built-in.o: In function `agp_amd64_probe':
> amd64-agp.c:(.devinit.text+0x81d2): undefined reference to `cache_k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8207): undefined reference to `k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8409): undefined reference to `num_k8_northbridges'
> amd64-agp.c:(.devinit.text+0x8500): undefined reference to `k8_northbridges'

Ok, this is because this patch inverts dependencies and I need AGP_AMD64
and GART_IOMMU to depend explicitly on K8_NB, which is the more natural
thing to do. Here's a better version, it survived a couple of hundred
randconfig builds last night:

--
From: Borislav Petkov <borislav.petkov@amd.com>
Date: Mon, 8 Mar 2010 14:27:01 +0100
Subject: [PATCH -v2] x86, k8 nb: Enable k8_northbridges unconditionally on AMD

de957628ce7c84764ff41331111036b3ae5bad0f 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>
Tested-by: Joerg Roedel <joerg.roedel@amd.com>
---
 arch/x86/Kconfig              |    4 ++--
 arch/x86/kernel/k8.c          |   14 ++++++++++++++
 arch/x86/kernel/pci-gart_64.c |    2 +-
 drivers/char/agp/Kconfig      |    2 +-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index e984403..736b1b6 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -659,7 +659,7 @@ config GART_IOMMU
 	bool "GART IOMMU support" if EMBEDDED
 	default y
 	select SWIOTLB
-	depends on X86_64 && PCI
+	depends on X86_64 && PCI && K8_NB
 	---help---
 	  Support for full DMA access of devices with 32bit memory access only
 	  on systems with more than 3GB. This is usually needed for USB,
@@ -2058,7 +2058,7 @@ endif # X86_32
 
 config K8_NB
 	def_bool y
-	depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA)))
+	depends on CPU_SUP_AMD && PCI
 
 source "drivers/pcmcia/Kconfig"
 
diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c
index cbc4332..9b89546 100644
--- a/arch/x86/kernel/k8.c
+++ b/arch/x86/kernel/k8.c
@@ -121,3 +121,17 @@ void k8_flush_garts(void)
 }
 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);
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
index 34de53b..f3af115 100644
--- a/arch/x86/kernel/pci-gart_64.c
+++ b/arch/x86/kernel/pci-gart_64.c
@@ -735,7 +735,7 @@ int __init gart_iommu_init(void)
 	unsigned long scratch;
 	long i;
 
-	if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0)
+	if (num_k8_northbridges == 0)
 		return 0;
 
 #ifndef CONFIG_AGP_AMD64
diff --git a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig
index 2fb3a48..4b66c69 100644
--- a/drivers/char/agp/Kconfig
+++ b/drivers/char/agp/Kconfig
@@ -57,7 +57,7 @@ config AGP_AMD
 
 config AGP_AMD64
 	tristate "AMD Opteron/Athlon64 on-CPU GART support"
-	depends on AGP && X86
+	depends on AGP && X86 && K8_NB
 	help
 	  This option gives you AGP support for the GLX component of
 	  X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs.
-- 
1.7.0.2


-- 
Regards/Gruss,
Boris.

-
Advanced Micro Devices, Inc.
Operating Systems Research Center

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [tip:x86/urgent] x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems
  2010-03-12 14:43   ` [PATCH -v2] " Borislav Petkov
@ 2010-03-13 12:26     ` tip-bot for Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot for Borislav Petkov @ 2010-03-13 12:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, joerg.roedel, fujita.tomonori, bp,
	tglx, mingo, borislav.petkov

Commit-ID:  0e152cd7c16832bd5cadee0c2e41d9959bc9b6f9
Gitweb:     http://git.kernel.org/tip/0e152cd7c16832bd5cadee0c2e41d9959bc9b6f9
Author:     Borislav Petkov <bp@amd64.org>
AuthorDate: Fri, 12 Mar 2010 15:43:03 +0100
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Sat, 13 Mar 2010 08:36:16 +0100

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

de957628ce7c84764ff41331111036b3ae5bad0f 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>
---
 arch/x86/Kconfig              |    4 ++--
 arch/x86/kernel/k8.c          |   14 ++++++++++++++
 arch/x86/kernel/pci-gart_64.c |    2 +-
 drivers/char/agp/Kconfig      |    2 +-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index eb40925..ddb52b8 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -627,7 +627,7 @@ config GART_IOMMU
 	bool "GART IOMMU support" if EMBEDDED
 	default y
 	select SWIOTLB
-	depends on X86_64 && PCI
+	depends on X86_64 && PCI && K8_NB
 	---help---
 	  Support for full DMA access of devices with 32bit memory access only
 	  on systems with more than 3GB. This is usually needed for USB,
@@ -2026,7 +2026,7 @@ endif # X86_32
 
 config K8_NB
 	def_bool y
-	depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA)))
+	depends on CPU_SUP_AMD && PCI
 
 source "drivers/pcmcia/Kconfig"
 
diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c
index cbc4332..9b89546 100644
--- a/arch/x86/kernel/k8.c
+++ b/arch/x86/kernel/k8.c
@@ -121,3 +121,17 @@ void k8_flush_garts(void)
 }
 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);
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
index 34de53b..f3af115 100644
--- a/arch/x86/kernel/pci-gart_64.c
+++ b/arch/x86/kernel/pci-gart_64.c
@@ -735,7 +735,7 @@ int __init gart_iommu_init(void)
 	unsigned long scratch;
 	long i;
 
-	if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0)
+	if (num_k8_northbridges == 0)
 		return 0;
 
 #ifndef CONFIG_AGP_AMD64
diff --git a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig
index 2fb3a48..4b66c69 100644
--- a/drivers/char/agp/Kconfig
+++ b/drivers/char/agp/Kconfig
@@ -57,7 +57,7 @@ config AGP_AMD
 
 config AGP_AMD64
 	tristate "AMD Opteron/Athlon64 on-CPU GART support"
-	depends on AGP && X86
+	depends on AGP && X86 && K8_NB
 	help
 	  This option gives you AGP support for the GLX component of
 	  X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs.

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-03-13 12:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-08 17:06 [PATCH] x86, k8 nb: Enable k8_northbridges unconditionally on AMD Borislav Petkov
2010-03-09  1:32 ` FUJITA Tomonori
2010-03-11 13:22 ` Ingo Molnar
2010-03-11 14:17   ` Borislav Petkov
2010-03-12 14:43   ` [PATCH -v2] " Borislav Petkov
2010-03-13 12:26     ` [tip:x86/urgent] x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems tip-bot for Borislav Petkov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.