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  <sfa...@harris.com>
> CONFIG_SYS_4xx_CHIP_21_405EX_SECURITY     <eib...@gdsys.de>
> 
> Signed-off-by: Steve Falco <sfa...@harris.com>
> Acked-by: Dirk Eibach <eib...@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?
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to