Re: [U-Boot] [PATCH v1] PPC405EX CHIP_21 erratum

2011-05-04 Thread Eibach, Dirk

Thanks, I can confirm this fixes the issue for me (405EX Rev. D with
security).

Still checkpatch finds some whitespace issues:
.dotest/patch:13: space before tab in indent.
defined(CONFIG_405EX_CHIP21_PVR_REV_D) && \
.dotest/patch:27: trailing whitespace.
 * 
warning: 2 lines add whitespace errors.

> 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_D0x0 
>/* 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 */

I don't like defining expected PVR values in the board config file.
Maybe something like CONFIG_405EX_CHIP21_SECURITY and
CONFIG_405EX_CHIP21_NO_SECURITY would be more pleasant.

Then you could place

#ifdef CONFIG_405EX_CHIP21_SECURITY
#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 */
#endif

#ifdef CONFIG_405EX_CHIP21_NO_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 */
#endif

in a more appropriate place.

Cheers
Dirk


___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v1] PPC405EX CHIP_21 erratum

2011-05-04 Thread Stefan Roese
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 

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, 0x3000);
> +

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_PFC10x4101
>  #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(0x8000 >> 31)
> 
>  #define SDR0_SRST_DMC(0x8000 >> 10)
> diff --git a/include/configs/kilauea.h b/include/configs/kilauea.h
> index 031f8fb..2d3efba 10

Re: [U-Boot] [PATCH v1] PPC405EX CHIP_21 erratum

2011-05-04 Thread Steven A. Falco
On 05/04/2011 04:36 AM, Stefan Roese wrote:
> 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_C0x1291147d /* EX 
>> without 
> security */
>> #define CONFIG_405EX_CHIP21_PVR_REV_D0x12911473 /* EX 
>> without 
> security */
>> #define CONFIG_405EX_CHIP21_ECID3_REV_D  0x1/* EX 
> without security */
>>
>> Signed-off-by: Steve Falco 
> 
> Thanks for the quick patch. Please find some comments below.

Thanks to both of you for the comments.  New version will be posted soon.

Steve

>  
>> ---
>>
>> 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, 0x3000);
>> +
> 
> 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_MFR0x4300  /* SDR0_MFR reg */
>>
>> +#define SDR0_ECID0  0x0080
>> +#define SDR0_ECID1  0x0081
>> +#define SDR0_ECID2  0x0082