From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v1] PPC405EX CHIP_21 erratum
Date: Wed, 4 May 2011 10:36:19 +0200 [thread overview]
Message-ID: <201105041036.20193.sr@denx.de> (raw)
In-Reply-To: <4DC03454.4070304@harris.com>
Hi Steve,
On Tuesday 03 May 2011 18:59:00 Steven A. Falco wrote:
> APM errata CHIP_21 for the 405EX/EXr (from the rev 1.09 document dated
> 4/27/11) states that rev D processors may wake up with the wrong feature
> set. I've personally seen that happen. This patch implements the
> APM-proposed workaround.
>
> Note that you cannot blindly use this workaround. You must add/customize
> the following three defines to match your hardware. If you get this
> wrong, the processor will go into an infinite reset loop, and JTAG will be
> required to recover.
>
> #define CONFIG_405EX_CHIP21_PVR_REV_C 0x1291147d /* EX without
security */
> #define CONFIG_405EX_CHIP21_PVR_REV_D 0x12911473 /* EX without
security */
> #define CONFIG_405EX_CHIP21_ECID3_REV_D 0x1 /* EX
without security */
>
> Signed-off-by: Steve Falco <sfalco@harris.com>
Thanks for the quick patch. Please find some comments below.
> ---
>
> diff --git a/arch/powerpc/cpu/ppc4xx/cpu_init.c
> b/arch/powerpc/cpu/ppc4xx/cpu_init.c index bf208ad..89a577b 100644
> --- a/arch/powerpc/cpu/ppc4xx/cpu_init.c
> +++ b/arch/powerpc/cpu/ppc4xx/cpu_init.c
> @@ -221,6 +221,69 @@ void reconfigure_pll(u32 new_cpu_freq)
> #endif
> }
>
> +#if defined(CONFIG_405EX_CHIP21_PVR_REV_C) && \
> + defined(CONFIG_405EX_CHIP21_PVR_REV_D) && \
> + defined(CONFIG_405EX_CHIP21_ECID3_REV_D)
> +void
> +chip_21_errata (void)
> +{
> + /*
> + * See rev 1.09 of the 405EX/405EXr errata. CHIP_21 says that
> + * sometimes reading the PVR and/or SDR0_ECID results in incorrect
> + * values. Since the rev-D chip uses the SDR0_ECID bits to control
> + * internal features, that means the second PCIe or ethernet of an EX
> + * variant could fail to work. Also, security features of both EX and
> + * EXr might be incorrectly disabled.
> + *
> + * The suggested workaround is as follows (covering rev-C and rev-D):
> + *
> + * 1.Read the PVR and SDR0_ECID3.
> + *
> + * 2.If the PVR matches an expected Revision C PVR value AND if
> + * SDR0_ECID3[12:15] is different from PVR[28:31], then ? processor is
> + * Revision C: continue executing the initialization code (no reset
> + * required). else ? go to step 3.
> + *
> + * 3.If the PVR matches an expected Revision D PVR value AND if
> + * SDR0_ECID3[10:11] matches its expected value, then ? continue
> + * executing initialization code, no reset required. else ? write
> + * DBCR0[RST] = 0b11 to generate a SysReset.
> + */
> +
> + u32 pvr;
> + u32 pvr_28_31;
> + u32 ecid3;
> + u32 ecid3_10_11;
> + u32 ecid3_12_15;
> +
> + // Step 1:
Incorrect comment style, please use:
+ /* Step 1: */
And please fix this globally.
> + pvr = get_pvr();
> + mfsdr(SDR0_ECID3, ecid3);
> +
> + // Step 2:
> + pvr_28_31 = pvr & 0xf;
> + ecid3_10_11 = (ecid3 >> 20) & 0x3;
> + ecid3_12_15 = (ecid3 >> 16) & 0xf;
> + if((pvr == CONFIG_405EX_CHIP21_PVR_REV_C) &&
Space after "if". Please fix globally.
> + (pvr_28_31 != ecid3_12_15)) {
> + // No reset required.
> + return;
> + }
> +
> + // Step 3:
> + if((pvr == CONFIG_405EX_CHIP21_PVR_REV_D) &&
> + (ecid3_10_11 == CONFIG_405EX_CHIP21_ECID3_REV_D)) {
> + // No reset required.
> + return;
> + }
> +
> + // Reset required.
> + __asm__ __volatile__ ("sync; isync");
> + mtspr(SPRN_DBCR0, 0x30000000);
> +
Empty line should be removed.
> +}
> +#endif
> +
> /*
> * Breath some life into the CPU...
> *
> @@ -235,6 +298,12 @@ cpu_init_f (void)
> u32 val;
> #endif
>
> +#if defined(CONFIG_405EX_CHIP21_PVR_REV_C) && \
> + defined(CONFIG_405EX_CHIP21_PVR_REV_D) && \
> + defined(CONFIG_405EX_CHIP21_ECID3_REV_D)
> + chip_21_errata();
> +#endif
> +
Hmmm. I don't really like this "#if" here. How about something like this:
#ifdef CONFIG_SYS_4xx_CHIP_21_ERRATA
chip_21_errata();
#endif
And then define CONFIG_SYS_4xx_CHIP_21_ERRATA in your board config header.
What do you think?
> reconfigure_pll(CONFIG_SYS_PLL_RECONFIG);
>
> #if (defined(CONFIG_405EP) || defined (CONFIG_405EX)) && \
> diff --git a/arch/powerpc/include/asm/ppc405ex.h
> b/arch/powerpc/include/asm/ppc405ex.h index 36d3149..8070385 100644
> --- a/arch/powerpc/include/asm/ppc405ex.h
> +++ b/arch/powerpc/include/asm/ppc405ex.h
> @@ -43,6 +43,11 @@
> #define SDR0_PFC1 0x4101
> #define SDR0_MFR 0x4300 /* SDR0_MFR reg */
>
> +#define SDR0_ECID0 0x0080
> +#define SDR0_ECID1 0x0081
> +#define SDR0_ECID2 0x0082
> +#define SDR0_ECID3 0x0083
> +
> #define SDR0_SDCS_SDD (0x80000000 >> 31)
>
> #define SDR0_SRST_DMC (0x80000000 >> 10)
> diff --git a/include/configs/kilauea.h b/include/configs/kilauea.h
> index 031f8fb..2d3efba 100644
> --- a/include/configs/kilauea.h
> +++ b/include/configs/kilauea.h
> @@ -44,6 +44,17 @@
> #endif
>
> /*
> + * CHIP_21 errata
> + */
> +//#define CONFIG_405EX_CHIP21_PVR_REV_C 0x1291147f /* EX with
security */
> +//#define CONFIG_405EX_CHIP21_PVR_REV_D 0x12911475 /* EX with
security */
> +//#define CONFIG_405EX_CHIP21_ECID3_REV_D 0x0 /* EX with
security */
> +
> +#define CONFIG_405EX_CHIP21_PVR_REV_C 0x1291147d /* EX
without security
> */ +#define CONFIG_405EX_CHIP21_PVR_REV_D 0x12911473 /* EX
without
> security */ +#define CONFIG_405EX_CHIP21_ECID3_REV_D 0x1 /*
EX without
> security */
As Dirk already mentioned, these defines should not be placed in the board
config header. We already have those PVR defines in
arch/powerpc/include/asm/processor.h. Please use those defines instead.
Cheers,
Stefan
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office at denx.de
next prev parent reply other threads:[~2011-05-04 8:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <4DBF1F33.4040101@harris.com>
2011-05-02 21:44 ` [U-Boot] PPC405EX CHIP_21 erratum Steven A. Falco
2011-05-03 13:07 ` Stefan Roese
2011-05-03 16:59 ` [U-Boot] [PATCH v1] " Steven A. Falco
2011-05-04 8:03 ` Eibach, Dirk
2011-05-04 8:36 ` Stefan Roese [this message]
2011-05-04 14:26 ` Steven A. Falco
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201105041036.20193.sr@denx.de \
--to=sr@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox