Skip to contentSkip to conversation

mx6: Read silicon revision from register

PATCH Superseded Fabio Estevam 2 participants 2 messages Mar 16, 2012 – Mar 19, 2012

Subsystems (2)

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Fabio Estevam

author reviewer
#0 lore raw

PATCH v4 1/1 mx6: Read silicon revision from register

Instead of hardcoding the mx6 silicon revision, read it in run-time.

Also, besides the silicon version print the mx6 variant type: quad,dual/solo or solo-lite.

Tested on a mx6qsabrelite, where it shows:

CPU: Freescale i.MX6Q rev1.0 at 792 MHz

---
Changes since v3:
- Provide a complete struct for anatop registers Changes since v2:
- Read both chip variant and chip silicon version from anatop
- Create a struct for accessing the anatop registers Changes since v1:
- Fix typo on Subject

 arch/arm/cpu/armv7/imx-common/cpu.c      |   19 ++++-
 arch/arm/cpu/armv7/mx6/soc.c             |    8 ++-
 arch/arm/include/asm/arch-mx6/imx-regs.h |  142 ++++++++++++++++++++++++++++++
 3 files changed, 166 insertions(+), 3 deletions(-)
arch/arm/cpu/armv7/imx-common/cpu.c +17 -2
index 1e30ae5..35724df 100644
@@ -63,13 +63,28 @@ static char *get_reset_cause(void)
 }
 
 #if defined(CONFIG_DISPLAY_CPUINFO)
+
+static char *get_mx6_type(u32 mx6type)
+{
+	switch (mx6type) {
+	case 0x63:
+		return "Q";	/* Quad-core version of the mx6 */
+	case 0x61:
+		return "DS";	/* Dual/Solo version of the mx6 */
+	case 0x60:
+		return "SL";	/* Solo-Lite version of the mx6 */
+	default:
+		return "unknown";
+	}
+}
+
 int print_cpuinfo(void)
 {
 	u32 cpurev;
 
 	cpurev = get_cpu_rev();
-	printf("CPU:   Freescale i.MX%x family rev%d.%d at %d MHz\n",
-		(cpurev & 0xFF000) >> 12,
+	printf("CPU:   Freescale i.MX6%s rev%d.%d at %d MHz\n",
+		get_mx6_type((cpurev & 0xFF000) >> 12),
 		(cpurev & 0x000F0) >> 4,
 		(cpurev & 0x0000F) >> 0,
 		mxc_get_clock(MXC_ARM_CLK) / 1000000);
arch/arm/cpu/armv7/mx6/soc.c +7 -1
index 2ac74b5..a81e2bc 100644
@@ -32,7 +32,13 @@
 
 u32 get_cpu_rev(void)
 {
-	int system_rev = 0x61000 | CHIP_REV_1_0;
+	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
+	int reg = readl(&anatop->digprog);
+
+	/* Read mx6 variant: quad, dual or solo */
+	int system_rev = (reg >> 4) & 0xFF000;
+	/* Read mx6 silicon revision */
+	system_rev |= (reg & 0xFF) + 0x10;
 
 	return system_rev;
 }
arch/arm/include/asm/arch-mx6/imx-regs.h +142 -0

147 lines not on this page · raw message

Signature · 1 line
1.7.1
#1 lore raw

PATCH v4 1/1 mx6: Read silicon revision from register

Quoted 11 lines · Fabio Estevam

Instead of hardcoding the mx6 silicon revision, read it in run-time.

Also, besides the silicon version print the mx6 variant type: quad,dual/solo or solo-lite.

Tested on a mx6qsabrelite, where it shows:

CPU: Freescale i.MX6Q rev1.0 at 792 MHz

---

Hi Fabio,

Quoted 34 lines

Changes since v3:
- Provide a complete struct for anatop registers Changes since v2:
- Read both chip variant and chip silicon version from anatop
- Create a struct for accessing the anatop registers Changes since v1:
- Fix typo on Subject

 arch/arm/cpu/armv7/imx-common/cpu.c      |   19 ++++-
 arch/arm/cpu/armv7/mx6/soc.c             |    8 ++-
 arch/arm/include/asm/arch-mx6/imx-regs.h |  142 ++++++++++++++++++++++++++++++
 3 files changed, 166 insertions(+), 3 deletions(-)
arch/arm/cpu/armv7/imx-common/cpu.c +14 -0
index 1e30ae5..35724df 100644
@@ -63,13 +63,28 @@ static char *get_reset_cause(void)
 }
 
 #if defined(CONFIG_DISPLAY_CPUINFO)
+
+static char *get_mx6_type(u32 mx6type)
+{
+	switch (mx6type) {
+	case 0x63:
+		return "Q";	/* Quad-core version of the mx6 */
+	case 0x61:
+		return "DS";	/* Dual/Solo version of the mx6 */
+	case 0x60:
+		return "SL";	/* Solo-Lite version of the mx6 */
+	default:
+		return "unknown";
+	}
+}

arch/arm/cpu/armv7/imx-common/cpu.c static char *get_reset_cause(void) · line 87

Quoted 10 lines
arch/arm/cpu/armv7/imx-common/cpu.c +3 -2
+
 int print_cpuinfo(void)
 {
 	u32 cpurev;
 
 	cpurev = get_cpu_rev();
-	printf("CPU:   Freescale i.MX%x family rev%d.%d at %d MHz\n",
-		(cpurev & 0xFF000) >> 12,
+	printf("CPU:   Freescale i.MX6%s rev%d.%d at %d MHz\n",
+		get_mx6_type((cpurev & 0xFF000) >> 12),

I admit I have not yet tested, but does this statement generate a "unknown" on all MX5 boards ?

Stefano

Signature · 5 lines
=====================================================================
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
=====================================================================