[U-Boot] [PATCH v3] PPC405EX CHIP_21 erratum

Steven A. Falco sfalco at harris.com
Thu May 12 15:52:01 CEST 2011


On 05/05/2011 10:08 AM, 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.  This patch implements the APM-proposed workaround.

I have not seen any further comments on this patch.  Is it acceptable, or
are additional changes required?

	Steve

> 
> To enable this patch for your board, add the appropriate define for your
> CPU to your board header file.  See kilauea.h for more information.  The
> following variants are supported:
> 
> #define CONFIG_SYS_4xx_CHIP_21_405EX_NO_SECURITY
> #define CONFIG_SYS_4xx_CHIP_21_405EX_SECURITY
> #define CONFIG_SYS_4xx_CHIP_21_405EXr_NO_SECURITY
> #define CONFIG_SYS_4xx_CHIP_21_405EXr_SECURITY
> 
> Please note that if you select the wrong define, your board will not
> boot, and JTAG will be required to recover.
> 
> Tested on custom boards using:
> 
> CONFIG_SYS_4xx_CHIP_21_405EX_NO_SECURITY  <sfalco at harris.com>
> CONFIG_SYS_4xx_CHIP_21_405EX_SECURITY     <eibach at gdsys.de>
> 
> Signed-off-by: Steve Falco <sfalco at harris.com>
> Acked-by: Dirk Eibach <eibach at gdsys.de> 
> 
> ---
> 
> v3:
> Remove enable of workaround for Kilauea/Haleakala.  Instead, all
> variants are listed with a detailed comment explaining proper usage.
> This is necessary because the same u-boot binary is used on boards
> with different processors.  Since there is currently no known way
> to distinguish those processors, there is no way to universally work
> around the errata.  Each Kilauea/Haleakala owner must build a unique
> version of u-boot tailored to their particular board.
> 
> v2:
> Correct checkpatch errors/warnings re: whitespace, comment style, etc.
> Move PVR logic out of board config file.
> Simplify ifdef structure.
> 
> diff --git a/arch/powerpc/cpu/ppc4xx/cpu_init.c b/arch/powerpc/cpu/ppc4xx/cpu_init.c
> index bf208ad..2f3a802 100644
> --- a/arch/powerpc/cpu/ppc4xx/cpu_init.c
> +++ b/arch/powerpc/cpu/ppc4xx/cpu_init.c
> @@ -221,6 +221,66 @@ void reconfigure_pll(u32 new_cpu_freq)
>  #endif
>  }
>  
> +#ifdef CONFIG_SYS_4xx_CHIP_21_ERRATA
> +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: */
> +	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) &&
> +			(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);
> +}
> +#endif
> +
>  /*
>   * Breath some life into the CPU...
>   *
> @@ -235,6 +295,10 @@ cpu_init_f (void)
>  	u32 val;
>  #endif
>  
> +#ifdef CONFIG_SYS_4xx_CHIP_21_ERRATA
> +	chip_21_errata();
> +#endif
> +
>  	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/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> index f5bf4dd..c5b03b4 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -974,6 +974,37 @@
>  #define PVR_5200B	0x80822014
>  
>  /*
> + * 405EX/EXr CHIP_21 Errata
> + */
> +#ifdef CONFIG_SYS_4xx_CHIP_21_405EX_SECURITY
> +#define CONFIG_SYS_4xx_CHIP_21_ERRATA
> +#define CONFIG_405EX_CHIP21_PVR_REV_C	PVR_405EX1_RC
> +#define CONFIG_405EX_CHIP21_PVR_REV_D	PVR_405EX1_RD
> +#define CONFIG_405EX_CHIP21_ECID3_REV_D	0x0
> +#endif
> +
> +#ifdef CONFIG_SYS_4xx_CHIP_21_405EX_NO_SECURITY
> +#define CONFIG_SYS_4xx_CHIP_21_ERRATA
> +#define CONFIG_405EX_CHIP21_PVR_REV_C	PVR_405EX2_RC
> +#define CONFIG_405EX_CHIP21_PVR_REV_D	PVR_405EX2_RD
> +#define CONFIG_405EX_CHIP21_ECID3_REV_D	0x1
> +#endif
> +
> +#ifdef CONFIG_SYS_4xx_CHIP_21_405EXr_SECURITY
> +#define CONFIG_SYS_4xx_CHIP_21_ERRATA
> +#define CONFIG_405EX_CHIP21_PVR_REV_C	PVR_405EXR1_RC
> +#define CONFIG_405EX_CHIP21_PVR_REV_D	PVR_405EXR1_RD
> +#define CONFIG_405EX_CHIP21_ECID3_REV_D	0x2
> +#endif
> +
> +#ifdef CONFIG_SYS_4xx_CHIP_21_405EXr_NO_SECURITY
> +#define CONFIG_SYS_4xx_CHIP_21_ERRATA
> +#define CONFIG_405EX_CHIP21_PVR_REV_C	PVR_405EXR2_RC
> +#define CONFIG_405EX_CHIP21_PVR_REV_D	PVR_405EXR2_RD
> +#define CONFIG_405EX_CHIP21_ECID3_REV_D	0x3
> +#endif
> +
> +/*
>   * System Version Register
>   */
>  
> diff --git a/include/configs/kilauea.h b/include/configs/kilauea.h
> index 031f8fb..e66aadf 100644
> --- a/include/configs/kilauea.h
> +++ b/include/configs/kilauea.h
> @@ -44,6 +44,20 @@
>  #endif
>  
>  /*
> + * CHIP_21 errata - you must set this to match your exact CPU, else your
> + * board will not boot.  DO NOT enable this unless you have JTAG available
> + * for recovery, in the event you get it wrong.
> + *
> + * Kilauea uses the 405EX, while Haleakala uses the 405EXr.  Either board
> + * may be equipped for security or not.  You must look at the CPU part
> + * number to be sure what you have.
> + */
> +/* #define CONFIG_SYS_4xx_CHIP_21_405EX_NO_SECURITY */
> +/* #define CONFIG_SYS_4xx_CHIP_21_405EX_SECURITY */
> +/* #define CONFIG_SYS_4xx_CHIP_21_405EXr_NO_SECURITY */
> +/* #define CONFIG_SYS_4xx_CHIP_21_405EXr_SECURITY */
> +
> +/*
>   * Include common defines/options for all AMCC eval boards
>   */
>  #define CONFIG_HOSTNAME		kilauea
> 


-- 
A: Because it makes the logic of the discussion difficult to follow.
Q: Why shouldn't I top post?
A: No.
Q: Should I top post?


More information about the U-Boot mailing list