* Sequoia kernel crash workaround.
@ 2007-09-19 18:39 Valentine Barshak
2007-09-19 19:12 ` Josh Boyer
2007-09-19 19:19 ` Stefan Roese
0 siblings, 2 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-19 18:39 UTC (permalink / raw)
To: linuxppc-dev; +Cc: David Gibson
I've observed kernel crashes on Sequoia board several times.
Kernel often crashes with high network/memory loads.
This is due to 440EPx h/w issue.
According to the errata:
CHIP_8: Incorrect Write to DDR SDRAM.
Category: 3
Overview:
The write address can be corrupted during writes to DDR SDRAM when write
pipelining is enabled on PLB0. The probability of encountering the
problem increases with the amount of back-pressure applied by the SDRAM.
Impact: Data can be written to the wrong address in SDRAM.
Workaround:
Disable write pipelining to DDR SDRAM by setting PLB4A0_ACR[WRP] = 0.
Only primary write transfers are broadcast and the write address
corruption is avoided.
Disabling write pipelining really helps.
Josh, David, what is the right place to put this workaround to?
Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
or
should this be done in
arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
with dcr_map, dcr_read/write stuff?
Thanks,
Valentine.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-19 18:39 Sequoia kernel crash workaround Valentine Barshak
@ 2007-09-19 19:12 ` Josh Boyer
2007-09-19 19:19 ` Stefan Roese
1 sibling, 0 replies; 22+ messages in thread
From: Josh Boyer @ 2007-09-19 19:12 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, David Gibson
On Wed, 19 Sep 2007 22:39:05 +0400
Valentine Barshak <vbarshak@ru.mvista.com> wrote:
> I've observed kernel crashes on Sequoia board several times.
> Kernel often crashes with high network/memory loads.
> This is due to 440EPx h/w issue.
>
> According to the errata:
> CHIP_8: Incorrect Write to DDR SDRAM.
> Category: 3
> Overview:
> The write address can be corrupted during writes to DDR SDRAM when write
> pipelining is enabled on PLB0. The probability of encountering the
> problem increases with the amount of back-pressure applied by the SDRAM.
> Impact: Data can be written to the wrong address in SDRAM.
> Workaround:
> Disable write pipelining to DDR SDRAM by setting PLB4A0_ACR[WRP] = 0.
> Only primary write transfers are broadcast and the write address
> corruption is avoided.
Ew. That sounds nasty.
> Disabling write pipelining really helps.
> Josh, David, what is the right place to put this workaround to?
>
> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
> or
> should this be done in
> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
> with dcr_map, dcr_read/write stuff?
Hm, do you happen to know if AMCC is going to release a newer revision
of 440EPx with that fixed? If so, we should probably do it
conditionally based off of PVR.
As for where to do it, I'd rather it be in sequoia_setup_arch() than
the bootwrapper. Eventually bootloaders like U-Boot will take a raw
vmlinux so the wrapper won't even be there anymore.
I don't see any reason to use the dcr_map stuff either. Just check the
PVR, check if the PLB is already set up correctly, and if not set it
with the regular mfdcr/mtdcr functions. And a comment about why that's
being done would be good.
That's my $0.02 anyway.
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-19 18:39 Sequoia kernel crash workaround Valentine Barshak
2007-09-19 19:12 ` Josh Boyer
@ 2007-09-19 19:19 ` Stefan Roese
2007-09-19 19:30 ` Olof Johansson
1 sibling, 1 reply; 22+ messages in thread
From: Stefan Roese @ 2007-09-19 19:19 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Josh Boyer, David Gibson
Hi Valentine,
On Wednesday 19 September 2007, Valentine Barshak wrote:
> Disabling write pipelining really helps.
> Josh, David, what is the right place to put this workaround to?
>
> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
> or
> should this be done in
> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
> with dcr_map, dcr_read/write stuff?
I vote for putting it into sequoia.c, since it's very likely to happen that
Sequoia will at one point be booted without the bootwrapper. Or perhaps it
should go into some common code checking the PVR and disabling it when this
440EPx/GRx is detected, since all those boards are affected.
Best regards,
Stefan
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-19 19:19 ` Stefan Roese
@ 2007-09-19 19:30 ` Olof Johansson
2007-09-19 20:08 ` Josh Boyer
0 siblings, 1 reply; 22+ messages in thread
From: Olof Johansson @ 2007-09-19 19:30 UTC (permalink / raw)
To: Stefan Roese; +Cc: linuxppc-dev, Josh Boyer, David Gibson
On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
> Hi Valentine,
>
> On Wednesday 19 September 2007, Valentine Barshak wrote:
> > Disabling write pipelining really helps.
> > Josh, David, what is the right place to put this workaround to?
> >
> > Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
> > arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
> > or
> > should this be done in
> > arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
> > with dcr_map, dcr_read/write stuff?
>
> I vote for putting it into sequoia.c, since it's very likely to happen that
> Sequoia will at one point be booted without the bootwrapper. Or perhaps it
> should go into some common code checking the PVR and disabling it when this
> 440EPx/GRx is detected, since all those boards are affected.
This is what we have setup_cpu functions in the cpu table for. Please
put it there instead of in board code.
-Olof
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-19 19:30 ` Olof Johansson
@ 2007-09-19 20:08 ` Josh Boyer
2007-09-20 16:56 ` Valentine Barshak
0 siblings, 1 reply; 22+ messages in thread
From: Josh Boyer @ 2007-09-19 20:08 UTC (permalink / raw)
To: Olof Johansson; +Cc: linuxppc-dev, Josh Boyer, Stefan Roese, David Gibson
On Wed, 19 Sep 2007 14:30:24 -0500
Olof Johansson <olof@lixom.net> wrote:
> On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
> > Hi Valentine,
> >
> > On Wednesday 19 September 2007, Valentine Barshak wrote:
> > > Disabling write pipelining really helps.
> > > Josh, David, what is the right place to put this workaround to?
> > >
> > > Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
> > > arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
> > > or
> > > should this be done in
> > > arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
> > > with dcr_map, dcr_read/write stuff?
> >
> > I vote for putting it into sequoia.c, since it's very likely to happen that
> > Sequoia will at one point be booted without the bootwrapper. Or perhaps it
> > should go into some common code checking the PVR and disabling it when this
> > 440EPx/GRx is detected, since all those boards are affected.
>
> This is what we have setup_cpu functions in the cpu table for. Please
> put it there instead of in board code.
Yes, agreed.
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-19 20:08 ` Josh Boyer
@ 2007-09-20 16:56 ` Valentine Barshak
2007-09-20 17:25 ` Olof Johansson
2007-09-20 17:32 ` Milton Miller
0 siblings, 2 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-20 16:56 UTC (permalink / raw)
To: Josh Boyer
Cc: Olof Johansson, linuxppc-dev, Josh Boyer, Stefan Roese,
David Gibson
Josh Boyer wrote:
> On Wed, 19 Sep 2007 14:30:24 -0500
> Olof Johansson <olof@lixom.net> wrote:
>
>> On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
>>> Hi Valentine,
>>>
>>> On Wednesday 19 September 2007, Valentine Barshak wrote:
>>>> Disabling write pipelining really helps.
>>>> Josh, David, what is the right place to put this workaround to?
>>>>
>>>> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
>>>> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
>>>> or
>>>> should this be done in
>>>> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
>>>> with dcr_map, dcr_read/write stuff?
>>> I vote for putting it into sequoia.c, since it's very likely to happen that
>>> Sequoia will at one point be booted without the bootwrapper. Or perhaps it
>>> should go into some common code checking the PVR and disabling it when this
>>> 440EPx/GRx is detected, since all those boards are affected.
>> This is what we have setup_cpu functions in the cpu table for. Please
>> put it there instead of in board code.
>
> Yes, agreed.
I was thinking about it. Looks like it's the best place, but the code
that actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
cpu_setup functions are defined for ppc32 processors.
Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
Thanks,
Valentine.
>
> josh
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 16:56 ` Valentine Barshak
@ 2007-09-20 17:25 ` Olof Johansson
2007-09-20 17:29 ` Josh Boyer
2007-09-20 18:03 ` Olof Johansson
2007-09-20 17:32 ` Milton Miller
1 sibling, 2 replies; 22+ messages in thread
From: Olof Johansson @ 2007-09-20 17:25 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, Josh Boyer, Stefan Roese, David Gibson
On Thu, Sep 20, 2007 at 08:56:32PM +0400, Valentine Barshak wrote:
>
> I was thinking about it. Looks like it's the best place, but the code that
> actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> cpu_setup functions are defined for ppc32 processors.
> Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
Sounds like something that went wrong at the merge of ppc and ppc64.
Take out the ifdef, even if there's fallout we should deal with it
instead of adding more complex ifdefs.
-Olof
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 17:25 ` Olof Johansson
@ 2007-09-20 17:29 ` Josh Boyer
2007-09-23 8:21 ` Benjamin Herrenschmidt
2007-09-20 18:03 ` Olof Johansson
1 sibling, 1 reply; 22+ messages in thread
From: Josh Boyer @ 2007-09-20 17:29 UTC (permalink / raw)
To: Olof Johansson, benh; +Cc: linuxppc-dev, Josh Boyer, Stefan Roese, David Gibson
On Thu, 20 Sep 2007 12:25:06 -0500
Olof Johansson <olof@lixom.net> wrote:
> On Thu, Sep 20, 2007 at 08:56:32PM +0400, Valentine Barshak wrote:
> >
> > I was thinking about it. Looks like it's the best place, but the code that
> > actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> > cpu_setup functions are defined for ppc32 processors.
> > Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
>
> Sounds like something that went wrong at the merge of ppc and ppc64.
>
> Take out the ifdef, even if there's fallout we should deal with it
> instead of adding more complex ifdefs.
Yeah. Looks like BenH did this in commit:
42c4aaadb737e0e672b3fb86b2c41ff59f0fb8bc
Ben, any reason you ifdef'd it for ppc64?
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 16:56 ` Valentine Barshak
2007-09-20 17:25 ` Olof Johansson
@ 2007-09-20 17:32 ` Milton Miller
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
2007-09-20 18:02 ` Sequoia kernel crash workaround Josh Boyer
1 sibling, 2 replies; 22+ messages in thread
From: Milton Miller @ 2007-09-20 17:32 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev
On Fri Sep 21 02:56:32 EST 2007, Valentine Barshak wrote:
> Josh Boyer wrote:
>> On Wed, 19 Sep 2007 14:30:24 -0500
>> Olof Johansson <olof at lixom.net> wrote:
>>
>>> On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
>>>> Hi Valentine,
>>>>
>>>> On Wednesday 19 September 2007, Valentine Barshak wrote:
>>>>> Disabling write pipelining really helps.
>>>>> Josh, David, what is the right place to put this workaround to?
>>>>>
>>>>> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
>>>>> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
>>>>> or
>>>>> should this be done in
>>>>> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
>>>>> with dcr_map, dcr_read/write stuff?
>>>> I vote for putting it into sequoia.c, since it's very likely to happen that
>>>> Sequoia will at one point be booted without the bootwrapper. Or perhaps it
>>>> should go into some common code checking the PVR and disabling it when this
>>>> 440EPx/GRx is detected, since all those boards are affected.
>>> This is what we have setup_cpu functions in the cpu table for. Please
>>> put it there instead of in board code.
>>
>> Yes, agreed.
>
> I was thinking about it. Looks like it's the best place, but the code
> that actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> cpu_setup functions are defined for ppc32 processors.
> Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
head_32.S calls call_setup_cpu in misc_32.S to call the cpu setup functon.
Note that these functions are called before the kernel is copied down to
0, so on ppc32 you will need the PTRRELOC type stuff. Also the callsite
implies that the cpu number is available in r24, which may or may not be
true when called from C.
Its probably easier to just call call_setup_cpu in the other 32 bit
head_xxx files.
milton
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 17:32 ` Milton Miller
@ 2007-09-20 17:55 ` Valentine Barshak
2007-09-20 18:13 ` Josh Boyer
` (2 more replies)
2007-09-20 18:02 ` Sequoia kernel crash workaround Josh Boyer
1 sibling, 3 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-20 17:55 UTC (permalink / raw)
To: linuxppc-dev; +Cc: miltonm, david
This adds cpu_setup functionality to PowerPC 44x platform.
The cpu_setup callback is invoked by head_32 code and
the identify_cpu() function at early init and is used to
initialize FPU on 440EP(x) processors. The FPU initialization
was previously done in head_44x.S. Also a workaround for
the incorrect write to DDR SDRAM 440EPx/440GRx errata added.
Data can be written to wrong address in SDRAM when write
pipelining is enabled on plb0. The setup_cpu function
for these processors disables write pipelining.
Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>
---
arch/powerpc/kernel/Makefile | 1
arch/powerpc/kernel/cpu_setup_44x.S | 54 ++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/cputable.c | 25 ++++++++++------
arch/powerpc/kernel/head_44x.S | 10 ------
4 files changed, 70 insertions(+), 20 deletions(-)
diff -ruN linux-2.6.orig/arch/powerpc/kernel/cpu_setup_44x.S linux-2.6/arch/powerpc/kernel/cpu_setup_44x.S
--- linux-2.6.orig/arch/powerpc/kernel/cpu_setup_44x.S 1970-01-01 03:00:00.000000000 +0300
+++ linux-2.6/arch/powerpc/kernel/cpu_setup_44x.S 2007-09-20 21:05:44.000000000 +0400
@@ -0,0 +1,54 @@
+/*
+ * This file contains low level CPU setup functions.
+ * Valentine Barshak <vbarshak@ru.mvista.com>
+ * MontaVista Software, Inc (c) 2007
+ *
+ * Based on cpu_setup_6xx code by
+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include <asm/processor.h>
+#include <asm/cputable.h>
+#include <asm/ppc_asm.h>
+
+_GLOBAL(__setup_cpu_440ep)
+ b __init_fpu_44x
+_GLOBAL(__setup_cpu_440epx)
+ mflr r4
+ bl __init_fpu_44x
+_GLOBAL(__setup_cpu_440grx)
+ bl __plb_disable_wrp
+ mtlr r4
+ blr
+
+/* enable APU between CPU and FPU */
+_GLOBAL(__init_fpu_44x)
+ mfspr r3,SPRN_CCR0
+ /* Clear DAPUIB flag in CCR0 */
+ rlwinm r3,r3,0,12,10
+ mtspr SPRN_CCR0,r3
+ isync
+ blr
+
+/*
+ * Workaround for the incorrect write to DDR SDRAM errata.
+ * The write address can be corrupted during writes to
+ * DDR SDRAM when write pipelining is enabled on PLB0.
+ * Disable write pipelining here.
+ */
+#define DCRN_PLB4A0_ACR 0x81
+
+_GLOBAL(__plb_disable_wrp)
+ mfdcr r3,DCRN_PLB4A0_ACR
+ /* clear WRP bit in PLB4A0_ACR */
+ rlwinm r3,r3,0,8,6
+ mtdcr DCRN_PLB4A0_ACR,r3
+ isync
+ blr
+
diff -ruN linux-2.6.orig/arch/powerpc/kernel/cputable.c linux-2.6/arch/powerpc/kernel/cputable.c
--- linux-2.6.orig/arch/powerpc/kernel/cputable.c 2007-09-20 19:30:47.000000000 +0400
+++ linux-2.6/arch/powerpc/kernel/cputable.c 2007-09-20 21:27:35.000000000 +0400
@@ -31,6 +31,9 @@
* and ppc64
*/
#ifdef CONFIG_PPC32
+extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
@@ -1111,6 +1114,7 @@
.cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
.icache_bsize = 32,
.dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440ep,
.platform = "ppc440",
},
{
@@ -1121,6 +1125,7 @@
.cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
.icache_bsize = 32,
.dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440ep,
.platform = "ppc440",
},
{ /* 440EPX */
@@ -1131,6 +1136,8 @@
.cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
.icache_bsize = 32,
.dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440epx,
+ .platform = "ppc440",
},
{ /* 440GRX */
.pvr_mask = 0xf0000ffb,
@@ -1140,6 +1147,8 @@
.cpu_user_features = COMMON_USER_BOOKE,
.icache_bsize = 32,
.dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440grx,
+ .platform = "ppc440",
},
{ /* 440GP Rev. B */
.pvr_mask = 0xf0000fff,
@@ -1318,18 +1327,14 @@
for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
if ((pvr & s->pvr_mask) == s->pvr_value) {
+ cpu_setup_t setup_func = PTRRELOC(s->cpu_setup);
+
*cur = cpu_specs + i;
-#ifdef CONFIG_PPC64
- /* ppc64 expects identify_cpu to also call setup_cpu
- * for that processor. I will consolidate that at a
- * later time, for now, just use our friend #ifdef.
- * we also don't need to PTRRELOC the function pointer
- * on ppc64 as we are running at 0 in real mode.
+ /* ppc expects identify_cpu to also call setup_cpu
+ * for that processor.
*/
- if (s->cpu_setup) {
- s->cpu_setup(offset, s);
- }
-#endif /* CONFIG_PPC64 */
+ if (setup_func)
+ setup_func(offset, s);
return s;
}
BUG();
diff -ruN linux-2.6.orig/arch/powerpc/kernel/head_44x.S linux-2.6/arch/powerpc/kernel/head_44x.S
--- linux-2.6.orig/arch/powerpc/kernel/head_44x.S 2007-09-20 19:30:47.000000000 +0400
+++ linux-2.6/arch/powerpc/kernel/head_44x.S 2007-09-20 20:04:39.000000000 +0400
@@ -217,16 +217,6 @@
lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */
mtspr SPRN_IVPR,r4
-#if defined(CONFIG_440EP) || defined(CONFIG_440EPX)
- /* Clear DAPUIB flag in CCR0 (enable APU between CPU and FPU) */
- mfspr r2,SPRN_CCR0
- lis r3,0xffef
- ori r3,r3,0xffff
- and r2,r2,r3
- mtspr SPRN_CCR0,r2
- isync
-#endif
-
/*
* This is where the main kernel code starts.
*/
diff -ruN linux-2.6.orig/arch/powerpc/kernel/Makefile linux-2.6/arch/powerpc/kernel/Makefile
--- linux-2.6.orig/arch/powerpc/kernel/Makefile 2007-09-20 19:30:47.000000000 +0400
+++ linux-2.6/arch/powerpc/kernel/Makefile 2007-09-20 19:52:21.000000000 +0400
@@ -56,6 +56,7 @@
udbg.o misc.o io.o
obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o
obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o
+obj-$(CONFIG_44x) += cpu_setup_44x.o
obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
obj-$(CONFIG_MODULES) += ppc_ksyms.o
obj-$(CONFIG_BOOTX_TEXT) += btext.o
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 17:32 ` Milton Miller
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
@ 2007-09-20 18:02 ` Josh Boyer
2007-09-20 18:13 ` Valentine Barshak
1 sibling, 1 reply; 22+ messages in thread
From: Josh Boyer @ 2007-09-20 18:02 UTC (permalink / raw)
To: Milton Miller; +Cc: linuxppc-dev
On Thu, 20 Sep 2007 12:32:56 -0500 (CDT)
Milton Miller <miltonm@bga.com> wrote:
> On Fri Sep 21 02:56:32 EST 2007, Valentine Barshak wrote:
> > Josh Boyer wrote:
> >> On Wed, 19 Sep 2007 14:30:24 -0500
> >> Olof Johansson <olof at lixom.net> wrote:
> >>
> >>> On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
> >>>> Hi Valentine,
> >>>>
> >>>> On Wednesday 19 September 2007, Valentine Barshak wrote:
> >>>>> Disabling write pipelining really helps.
> >>>>> Josh, David, what is the right place to put this workaround to?
> >>>>>
> >>>>> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
> >>>>> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
> >>>>> or
> >>>>> should this be done in
> >>>>> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
> >>>>> with dcr_map, dcr_read/write stuff?
> >>>> I vote for putting it into sequoia.c, since it's very likely to happen that
> >>>> Sequoia will at one point be booted without the bootwrapper. Or perhaps it
> >>>> should go into some common code checking the PVR and disabling it when this
> >>>> 440EPx/GRx is detected, since all those boards are affected.
> >>> This is what we have setup_cpu functions in the cpu table for. Please
> >>> put it there instead of in board code.
> >>
> >> Yes, agreed.
> >
> > I was thinking about it. Looks like it's the best place, but the code
> > that actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> > cpu_setup functions are defined for ppc32 processors.
> > Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
>
> head_32.S calls call_setup_cpu in misc_32.S to call the cpu setup functon.
>
> Note that these functions are called before the kernel is copied down to
> 0, so on ppc32 you will need the PTRRELOC type stuff. Also the callsite
> implies that the cpu number is available in r24, which may or may not be
> true when called from C.
>
> Its probably easier to just call call_setup_cpu in the other 32 bit
> head_xxx files.
Hm. I'll have to see how well that would work for 4xx. Seems 8xx and
FSL BookE are in a similar situation.
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 17:25 ` Olof Johansson
2007-09-20 17:29 ` Josh Boyer
@ 2007-09-20 18:03 ` Olof Johansson
1 sibling, 0 replies; 22+ messages in thread
From: Olof Johansson @ 2007-09-20 18:03 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, Josh Boyer, Stefan Roese, David Gibson
On Thu, Sep 20, 2007 at 12:25:06PM -0500, Olof Johansson wrote:
> On Thu, Sep 20, 2007 at 08:56:32PM +0400, Valentine Barshak wrote:
> >
> > I was thinking about it. Looks like it's the best place, but the code that
> > actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> > cpu_setup functions are defined for ppc32 processors.
> > Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
>
> Sounds like something that went wrong at the merge of ppc and ppc64.
>
> Take out the ifdef, even if there's fallout we should deal with it
> instead of adding more complex ifdefs.
See comment from Milton, my bad. It's just called from head_32.S right now.
It'll need to be added to the 4xx head as well, or an ifdef added. One or
the other, I'll leave it to Josh to pick.
-Olof
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 18:02 ` Sequoia kernel crash workaround Josh Boyer
@ 2007-09-20 18:13 ` Valentine Barshak
0 siblings, 0 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-20 18:13 UTC (permalink / raw)
To: Josh Boyer; +Cc: linuxppc-dev, Milton Miller
Josh Boyer wrote:
> On Thu, 20 Sep 2007 12:32:56 -0500 (CDT)
> Milton Miller <miltonm@bga.com> wrote:
>
>> On Fri Sep 21 02:56:32 EST 2007, Valentine Barshak wrote:
>>> Josh Boyer wrote:
>>>> On Wed, 19 Sep 2007 14:30:24 -0500
>>>> Olof Johansson <olof at lixom.net> wrote:
>>>>
>>>>> On Wed, Sep 19, 2007 at 09:19:47PM +0200, Stefan Roese wrote:
>>>>>> Hi Valentine,
>>>>>>
>>>>>> On Wednesday 19 September 2007, Valentine Barshak wrote:
>>>>>>> Disabling write pipelining really helps.
>>>>>>> Josh, David, what is the right place to put this workaround to?
>>>>>>>
>>>>>>> Is it OK to do mtdcr(PLB4A0_ACR, mfdcr(PLB4A0_ACR) & ~PLB4_WRP); in
>>>>>>> arch/powerpc/boot/cuboot-sequoia.c:sequoia_fixups()?
>>>>>>> or
>>>>>>> should this be done in
>>>>>>> arch/powerpc/platforms/44x/sequoia.c:sequoia_setup_arch()
>>>>>>> with dcr_map, dcr_read/write stuff?
>>>>>> I vote for putting it into sequoia.c, since it's very likely to happen that
>>>>>> Sequoia will at one point be booted without the bootwrapper. Or perhaps it
>>>>>> should go into some common code checking the PVR and disabling it when this
>>>>>> 440EPx/GRx is detected, since all those boards are affected.
>>>>> This is what we have setup_cpu functions in the cpu table for. Please
>>>>> put it there instead of in board code.
>>>> Yes, agreed.
>>> I was thinking about it. Looks like it's the best place, but the code
>>> that actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
>>> cpu_setup functions are defined for ppc32 processors.
>>> Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
>> head_32.S calls call_setup_cpu in misc_32.S to call the cpu setup functon.
>>
>> Note that these functions are called before the kernel is copied down to
>> 0, so on ppc32 you will need the PTRRELOC type stuff. Also the callsite
>> implies that the cpu number is available in r24, which may or may not be
>> true when called from C.
>>
>> Its probably easier to just call call_setup_cpu in the other 32 bit
>> head_xxx files.
>
> Hm. I'll have to see how well that would work for 4xx. Seems 8xx and
> FSL BookE are in a similar situation.
I started preparing the patch after Olof's "take out the ifdef" :)
I've tested it on 4xx. seems to work fine. FPU works OK and EPX/GRX
workaround is fine also, but it has to be tested on 8xx and fsl.
Adding call_setup_cpu to head_44x is no problem.
>
> josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
@ 2007-09-20 18:13 ` Josh Boyer
2007-09-20 18:15 ` Valentine Barshak
2007-09-20 18:54 ` Kumar Gala
2007-09-21 1:34 ` Paul Mackerras
2 siblings, 1 reply; 22+ messages in thread
From: Josh Boyer @ 2007-09-20 18:13 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, miltonm, david
On Thu, 20 Sep 2007 21:55:58 +0400
Valentine Barshak <vbarshak@ru.mvista.com> wrote:
> This adds cpu_setup functionality to PowerPC 44x platform.
> The cpu_setup callback is invoked by head_32 code and
> the identify_cpu() function at early init and is used to
> initialize FPU on 440EP(x) processors. The FPU initialization
> was previously done in head_44x.S. Also a workaround for
> the incorrect write to DDR SDRAM 440EPx/440GRx errata added.
> Data can be written to wrong address in SDRAM when write
> pipelining is enabled on plb0. The setup_cpu function
> for these processors disables write pipelining.
Wow, you're fast ;)
I'd like to see this split up a bit so there's not so much in one
patch. Essentially, introduce cpu_setup_44x.S, move the FPU init to
use it, and then add the PLB workaround.
I still need to look at the code too :)
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 18:13 ` Josh Boyer
@ 2007-09-20 18:15 ` Valentine Barshak
0 siblings, 0 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-20 18:15 UTC (permalink / raw)
To: Josh Boyer; +Cc: linuxppc-dev, miltonm, david
Josh Boyer wrote:
> On Thu, 20 Sep 2007 21:55:58 +0400
> Valentine Barshak <vbarshak@ru.mvista.com> wrote:
>
>> This adds cpu_setup functionality to PowerPC 44x platform.
>> The cpu_setup callback is invoked by head_32 code and
>> the identify_cpu() function at early init and is used to
>> initialize FPU on 440EP(x) processors. The FPU initialization
>> was previously done in head_44x.S. Also a workaround for
>> the incorrect write to DDR SDRAM 440EPx/440GRx errata added.
>> Data can be written to wrong address in SDRAM when write
>> pipelining is enabled on plb0. The setup_cpu function
>> for these processors disables write pipelining.
>
> Wow, you're fast ;)
>
> I'd like to see this split up a bit so there's not so much in one
> patch. Essentially, introduce cpu_setup_44x.S, move the FPU init to
> use it, and then add the PLB workaround.
OK
>
> I still need to look at the code too :)
sure :)
>
> josh
Thanks,
Valentine.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
2007-09-20 18:13 ` Josh Boyer
@ 2007-09-20 18:54 ` Kumar Gala
2007-09-20 18:55 ` Valentine Barshak
2007-09-21 1:34 ` Paul Mackerras
2 siblings, 1 reply; 22+ messages in thread
From: Kumar Gala @ 2007-09-20 18:54 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, miltonm, david
> diff -ruN linux-2.6.orig/arch/powerpc/kernel/cputable.c linux-2.6/
> arch/powerpc/kernel/cputable.c
> --- linux-2.6.orig/arch/powerpc/kernel/cputable.c 2007-09-20
> 19:30:47.000000000 +0400
> +++ linux-2.6/arch/powerpc/kernel/cputable.c 2007-09-20
> 21:27:35.000000000 +0400
[snip]
> @@ -1318,18 +1327,14 @@
>
> for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
> if ((pvr & s->pvr_mask) == s->pvr_value) {
> + cpu_setup_t setup_func = PTRRELOC(s->cpu_setup);
> +
> *cur = cpu_specs + i;
> -#ifdef CONFIG_PPC64
> - /* ppc64 expects identify_cpu to also call setup_cpu
> - * for that processor. I will consolidate that at a
> - * later time, for now, just use our friend #ifdef.
> - * we also don't need to PTRRELOC the function pointer
> - * on ppc64 as we are running at 0 in real mode.
> + /* ppc expects identify_cpu to also call setup_cpu
> + * for that processor.
> */
> - if (s->cpu_setup) {
> - s->cpu_setup(offset, s);
> - }
> -#endif /* CONFIG_PPC64 */
> + if (setup_func)
> + setup_func(offset, s);
> return s;
> }
This should just be something like:
#if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
if (s->cpu_setup)
...
#endif
we know reloc_offset is always 0 in book-e, plus fixup the comment.
- k
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 18:54 ` Kumar Gala
@ 2007-09-20 18:55 ` Valentine Barshak
0 siblings, 0 replies; 22+ messages in thread
From: Valentine Barshak @ 2007-09-20 18:55 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev, miltonm, david
Kumar Gala wrote:
>
>> diff -ruN linux-2.6.orig/arch/powerpc/kernel/cputable.c
>> linux-2.6/arch/powerpc/kernel/cputable.c
>> --- linux-2.6.orig/arch/powerpc/kernel/cputable.c 2007-09-20
>> 19:30:47.000000000 +0400
>> +++ linux-2.6/arch/powerpc/kernel/cputable.c 2007-09-20
>> 21:27:35.000000000 +0400
>
> [snip]
>
>> @@ -1318,18 +1327,14 @@
>>
>> for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
>> if ((pvr & s->pvr_mask) == s->pvr_value) {
>> + cpu_setup_t setup_func = PTRRELOC(s->cpu_setup);
>> +
>> *cur = cpu_specs + i;
>> -#ifdef CONFIG_PPC64
>> - /* ppc64 expects identify_cpu to also call setup_cpu
>> - * for that processor. I will consolidate that at a
>> - * later time, for now, just use our friend #ifdef.
>> - * we also don't need to PTRRELOC the function pointer
>> - * on ppc64 as we are running at 0 in real mode.
>> + /* ppc expects identify_cpu to also call setup_cpu
>> + * for that processor.
>> */
>> - if (s->cpu_setup) {
>> - s->cpu_setup(offset, s);
>> - }
>> -#endif /* CONFIG_PPC64 */
>> + if (setup_func)
>> + setup_func(offset, s);
>> return s;
>> }
>
> This should just be something like:
>
> #if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
> if (s->cpu_setup)
> ...
> #endif
>
> we know reloc_offset is always 0 in book-e, plus fixup the comment.
>
> - k
OK,
thanks,
Valentine.
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
2007-09-20 18:13 ` Josh Boyer
2007-09-20 18:54 ` Kumar Gala
@ 2007-09-21 1:34 ` Paul Mackerras
2 siblings, 0 replies; 22+ messages in thread
From: Paul Mackerras @ 2007-09-21 1:34 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev, miltonm, david
Valentine Barshak writes:
> +_GLOBAL(__setup_cpu_440epx)
> + mflr r4
> + bl __init_fpu_44x
> +_GLOBAL(__setup_cpu_440grx)
> + bl __plb_disable_wrp
> + mtlr r4
> + blr
If we enter at __setup_cpu_440grx we'll return to some bogus
address...
Paul.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-20 17:29 ` Josh Boyer
@ 2007-09-23 8:21 ` Benjamin Herrenschmidt
2007-09-24 10:35 ` Valentine Barshak
0 siblings, 1 reply; 22+ messages in thread
From: Benjamin Herrenschmidt @ 2007-09-23 8:21 UTC (permalink / raw)
To: Josh Boyer
Cc: linuxppc-dev, Olof Johansson, Josh Boyer, Stefan Roese,
David Gibson
On Thu, 2007-09-20 at 12:29 -0500, Josh Boyer wrote:
> On Thu, 20 Sep 2007 12:25:06 -0500
> Olof Johansson <olof@lixom.net> wrote:
>
> > On Thu, Sep 20, 2007 at 08:56:32PM +0400, Valentine Barshak wrote:
> > >
> > > I was thinking about it. Looks like it's the best place, but the code that
> > > actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
> > > cpu_setup functions are defined for ppc32 processors.
> > > Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
> >
> > Sounds like something that went wrong at the merge of ppc and ppc64.
> >
> > Take out the ifdef, even if there's fallout we should deal with it
> > instead of adding more complex ifdefs.
>
> Yeah. Looks like BenH did this in commit:
>
> 42c4aaadb737e0e672b3fb86b2c41ff59f0fb8bc
>
> Ben, any reason you ifdef'd it for ppc64?
I'll have to check on monday what's up there, but isn't setup_cpu called
from a different place on 32 bits? There are some subtle difference with
the way the cpu feature stuff is initialized /done between 32 and 64
bits that we haven't fully reconciled yet.
Ben.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-23 8:21 ` Benjamin Herrenschmidt
@ 2007-09-24 10:35 ` Valentine Barshak
2007-09-24 20:55 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 22+ messages in thread
From: Valentine Barshak @ 2007-09-24 10:35 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: linuxppc-dev, Olof Johansson, Josh Boyer, Stefan Roese,
David Gibson
Benjamin Herrenschmidt wrote:
> On Thu, 2007-09-20 at 12:29 -0500, Josh Boyer wrote:
>> On Thu, 20 Sep 2007 12:25:06 -0500
>> Olof Johansson <olof@lixom.net> wrote:
>>
>>> On Thu, Sep 20, 2007 at 08:56:32PM +0400, Valentine Barshak wrote:
>>>> I was thinking about it. Looks like it's the best place, but the code that
>>>> actually calls setup_cpu is under ifdef CONFIG_PPC64, while lots of
>>>> cpu_setup functions are defined for ppc32 processors.
>>>> Is it OK to remove this ifdef, or should I do CONFIG_PPC64 || CONFIG_44x?
>>> Sounds like something that went wrong at the merge of ppc and ppc64.
>>>
>>> Take out the ifdef, even if there's fallout we should deal with it
>>> instead of adding more complex ifdefs.
>> Yeah. Looks like BenH did this in commit:
>>
>> 42c4aaadb737e0e672b3fb86b2c41ff59f0fb8bc
>>
>> Ben, any reason you ifdef'd it for ppc64?
>
> I'll have to check on monday what's up there, but isn't setup_cpu called
> from a different place on 32 bits? There are some subtle difference with
> the way the cpu feature stuff is initialized /done between 32 and 64
> bits that we haven't fully reconciled yet.
>
> Ben.
>
From what I've seen, setup_cpu is never called for BOOKE.
Currently It's called from cputable.c for PPC64 and from head_32.S for 6xx.
Thanks,
Valentine.
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-24 10:35 ` Valentine Barshak
@ 2007-09-24 20:55 ` Benjamin Herrenschmidt
2007-09-24 21:01 ` Josh Boyer
0 siblings, 1 reply; 22+ messages in thread
From: Benjamin Herrenschmidt @ 2007-09-24 20:55 UTC (permalink / raw)
To: Valentine Barshak
Cc: linuxppc-dev, Olof Johansson, Josh Boyer, Stefan Roese,
David Gibson
On Mon, 2007-09-24 at 14:35 +0400, Valentine Barshak wrote:
>
> From what I've seen, setup_cpu is never called for BOOKE.
> Currently It's called from cputable.c for PPC64 and from head_32.S for
> 6xx.
> Thanks,
Right. We need to fix/converge some of these but it's not totally
trivial.
Ben.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Sequoia kernel crash workaround.
2007-09-24 20:55 ` Benjamin Herrenschmidt
@ 2007-09-24 21:01 ` Josh Boyer
0 siblings, 0 replies; 22+ messages in thread
From: Josh Boyer @ 2007-09-24 21:01 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: linuxppc-dev, Olof Johansson, Josh Boyer, Stefan Roese,
David Gibson
On Tue, 25 Sep 2007 06:55:50 +1000
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
>
> On Mon, 2007-09-24 at 14:35 +0400, Valentine Barshak wrote:
> >
> > From what I've seen, setup_cpu is never called for BOOKE.
> > Currently It's called from cputable.c for PPC64 and from head_32.S for
> > 6xx.
> > Thanks,
>
> Right. We need to fix/converge some of these but it's not totally
> trivial.
Valentine has patches for adding this for BookE on the list.
josh
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2007-09-24 21:02 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-19 18:39 Sequoia kernel crash workaround Valentine Barshak
2007-09-19 19:12 ` Josh Boyer
2007-09-19 19:19 ` Stefan Roese
2007-09-19 19:30 ` Olof Johansson
2007-09-19 20:08 ` Josh Boyer
2007-09-20 16:56 ` Valentine Barshak
2007-09-20 17:25 ` Olof Johansson
2007-09-20 17:29 ` Josh Boyer
2007-09-23 8:21 ` Benjamin Herrenschmidt
2007-09-24 10:35 ` Valentine Barshak
2007-09-24 20:55 ` Benjamin Herrenschmidt
2007-09-24 21:01 ` Josh Boyer
2007-09-20 18:03 ` Olof Johansson
2007-09-20 17:32 ` Milton Miller
2007-09-20 17:55 ` [PATCH] PowerPC: add setup_cpu for 44x for processor-specific init Valentine Barshak
2007-09-20 18:13 ` Josh Boyer
2007-09-20 18:15 ` Valentine Barshak
2007-09-20 18:54 ` Kumar Gala
2007-09-20 18:55 ` Valentine Barshak
2007-09-21 1:34 ` Paul Mackerras
2007-09-20 18:02 ` Sequoia kernel crash workaround Josh Boyer
2007-09-20 18:13 ` Valentine Barshak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).