public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Steven A. Falco <sfalco@harris.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v1] PPC405EX CHIP_21 erratum
Date: Tue, 03 May 2011 12:59:00 -0400	[thread overview]
Message-ID: <4DC03454.4070304@harris.com> (raw)
In-Reply-To: <201105031507.41274.sr@denx.de>

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>

---

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:
+	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 +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
+
 	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 */
+
+/*
  * Include common defines/options for all AMCC eval boards
  */
 #define CONFIG_HOSTNAME		kilauea

  reply	other threads:[~2011-05-03 16:59 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     ` Steven A. Falco [this message]
2011-05-04  8:03       ` [U-Boot] [PATCH v1] " Eibach, Dirk
2011-05-04  8:36       ` Stefan Roese
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=4DC03454.4070304@harris.com \
    --to=sfalco@harris.com \
    --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