Skip to contentSkip to conversation

Adding soc related info into /proc/cpuinfo

PATCH Superseded Eduardo Valentin 2 participants 7 messages Apr 27, 2010 – Apr 28, 2010

Subsystems (5)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

v2 cover Adding soc related info into /proc/cpuinfo

Hello all,

Here is the version 2 of this series. Now die id is protected using same x86 protection mechanism to hide x86 product number. Besides, a compilation Kconfig option has been added for DIE ID as well.

Here is previous PATCH 0/4 message:

This series is to continue what has been discussed several weeks ago wrt IDCODE patch. Original patch was made by Peter and discussion is here:
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg17553.html

So, the conclusion was that IDCODE info is useful even in production systems, and for that debugfs is not a good choice to export it. One suggestion was to add it under /proc/cpuinfo. However this entry nowadays exports only ARM related information.

So this series does the trick by extending the ARM /proc/cpuinfo to include soc info data. There are a few ways to add a hook for soc specific data. But I've decided to implement it via the simplest way I found. Basically it is same thing which is done for system_rev, system_serial_low and system_serial_high. Then, now we have system_soc_info, which is printed only if there is something useful there.

As usual, comments are welcome.

BR,

--
Eduardo Valentin (4):
ARM: Introduce SoC Info into /proc/cpuinfo
mach-omap2: Add SoC info data for OMAP2,3,4 into /proc/cpuinfo
mach-omap1: Add SoC info data for OMAP1 into /proc/cpuinfo
OMAP3: PM: export chip IDCODE, Production ID and Die ID

 Documentation/kernel-parameters.txt |    2 +
 arch/arm/include/asm/system.h       |    2 +
 arch/arm/kernel/setup.c             |    5 +++
 arch/arm/mach-omap1/id.c            |   18 +++++++----
 arch/arm/mach-omap2/Kconfig         |   10 ++++++
 arch/arm/mach-omap2/id.c            |   55 +++++++++++++++++++++++++++++++----
 6 files changed, 80 insertions(+), 12 deletions(-)
#1 lore raw

PATCH v2 1/4 ARM: Introduce SoC Info into /proc/cpuinfo

From: Eduardo Valentin <[email protected]>

This patch extends the ARM /proc/cpuinfo to include soc info data. It is implemented via the same way which is done for system_rev, system_serial_low and system_serial_high. Then, now we have system_soc_info, which is printed only if there is something useful there.

---
 arch/arm/include/asm/system.h |    2 ++
 arch/arm/kernel/setup.c       |    5 +++++
 2 files changed, 7 insertions(+), 0 deletions(-)
arch/arm/include/asm/system.h +2 -0
index 4ace45e..53a9645 100644
@@ -71,6 +71,8 @@ struct task_struct;
 extern unsigned int system_rev;
 extern unsigned int system_serial_low;
 extern unsigned int system_serial_high;
+#define SYSTEM_SOC_INFO_SIZE			128
+extern char system_soc_info[SYSTEM_SOC_INFO_SIZE];
 extern unsigned int mem_fclk_21285;
 
 struct pt_regs;
arch/arm/kernel/setup.c +5 -0
index c91c77b..025d795 100644
@@ -85,6 +85,9 @@ EXPORT_SYMBOL(system_serial_low);
 unsigned int system_serial_high;
 EXPORT_SYMBOL(system_serial_high);
 
+char system_soc_info[SYSTEM_SOC_INFO_SIZE];
+EXPORT_SYMBOL(system_soc_info);
+
 unsigned int elf_hwcap;
 EXPORT_SYMBOL(elf_hwcap);
 
@@ -847,6 +850,8 @@ static int c_show(struct seq_file *m, void *v)
 	seq_printf(m, "Revision\t: %04x\n", system_rev);
 	seq_printf(m, "Serial\t\t: %08x%08x\n",
 		   system_serial_high, system_serial_low);
+	if (strlen(system_soc_info))
+		seq_printf(m, "SoC Info\t: %s\n",  system_soc_info);
 
 	return 0;
 }
Signature · 1 line
1.7.0.4.361.g8b5fe.dirty
#2 lore raw

PATCH v2 2/4 mach-omap2: Add SoC info data for OMAP2, 3, 4 into /proc/cpuinfo

In reply to Eduardo Valentin

From: Eduardo Valentin <[email protected]>

Report OMAP2,3,4 data into system_soc_info. Now we get omap information under /proc/cpuinfo.

---
 arch/arm/mach-omap2/id.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/id.c +15 -6
index 37b8a1a..75e36a5 100644
@@ -152,10 +152,15 @@ void __init omap24xx_check_revision(void)
 		j = i;
 	}
 
-	pr_info("OMAP%04x", omap_rev() >> 16);
-	if ((omap_rev() >> 8) & 0x0f)
-		pr_info("ES%x", (omap_rev() >> 12) & 0xf);
-	pr_info("\n");
+	snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",
+							omap_rev() >> 16);
+	if ((omap_rev() >> 8) & 0x0f) {
+		int sz = strlen(system_soc_info);
+
+		snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
+				"ES%x",	(omap_rev() >> 12) & 0xf);
+	}
+	pr_info("%s\n", system_soc_info);
 }
 
 #define OMAP3_CHECK_FEATURE(status,feat)				\
@@ -286,7 +291,9 @@ void __init omap4_check_revision(void)
 	if ((hawkeye == 0xb852) && (rev == 0x0)) {
 		omap_revision = OMAP4430_REV_ES1_0;
 		omap_chip.oc |= CHIP_IS_OMAP4430ES1;
-		pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
+		snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x %s\n",
+				omap_rev() >> 16, rev_name);
+		pr_info("%s\n", system_soc_info);
 		return;
 	}
 
@@ -356,7 +363,9 @@ void __init omap3_cpuinfo(void)
 	}
 
 	/* Print verbose information */
-	pr_info("%s ES%s (", cpu_name, cpu_rev);
+	snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "%s ES%s", cpu_name,
+			cpu_rev);
+	pr_info("%s (", system_soc_info);
 
 	OMAP3_SHOW_FEATURE(l2cache);
 	OMAP3_SHOW_FEATURE(iva);
Signature · 1 line
1.7.0.4.361.g8b5fe.dirty
#3 lore raw

PATCH v2 2/4 mach-omap2: Add SoC info data for OMAP2,3,4 into /proc/cpuinfo

Quoted 16 lines · Valentin Eduardo (Nokia-D/Helsinki)

From: Eduardo Valentin <[email protected]>

Report OMAP2,3,4 data into system_soc_info. Now we get omap information under /proc/cpuinfo.

---
arch/arm/mach-omap2/id.c | 21 +++++++++++++++------

1 files changed, 15 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/id.c +0 -0
index 37b8a1a..75e36a5 100644
@@ -152,10 +152,15 @@ void __init omap24xx_check_revision(void)
 		j = i;

arch/arm/mach-omap2/id.c void __init omap24xx_check_revision(void) · line 158

Quoted 10 lines
arch/arm/mach-omap2/id.c +4 -4
 	}
 
-	pr_info("OMAP%04x", omap_rev() >> 16);
-	if ((omap_rev() >> 8) & 0x0f)
-		pr_info("ES%x", (omap_rev() >> 12) & 0xf);
-	pr_info("\n");
+	snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",
+							omap_rev() >> 16);
+	if ((omap_rev() >> 8) & 0x0f) {
+		int sz = strlen(system_soc_info);

how about you use the return of the first snprintf instead of asking strlen() here ? I mean:

int sz = snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",

		omap_rev() >> 16);

if ((omap_rev() >> 8) & 0x0f)

	snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
			"ES%x", (omap_rev() >> 12) & 0x0f);

would that work ???

Signature · 3 lines
balbi

DefectiveByDesign.org
#4 lore raw

PATCH v2 2/4 mach-omap2: Add SoC info data for OMAP2,3,4 into /proc/cpuinfo

Quoted 19 lines · Balbi Felipe (Nokia-D/Helsinki)
Quoted 18 lines · Valentin Eduardo (Nokia-D/Helsinki)

From: Eduardo Valentin <[email protected]>

Report OMAP2,3,4 data into system_soc_info. Now we get omap information under /proc/cpuinfo.

---
arch/arm/mach-omap2/id.c | 21 +++++++++++++++------

1 files changed, 15 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/id.c +0 -0
index 37b8a1a..75e36a5 100644
@@ -152,10 +152,15 @@ void __init omap24xx_check_revision(void)
 		j = i;
 	}
 
Quoted 11 lines

arch/arm/mach-omap2/id.c void __init omap24xx_check_revision(void) · line 158

Quoted 8 lines
arch/arm/mach-omap2/id.c +4 -4
-	pr_info("OMAP%04x", omap_rev() >> 16);
-	if ((omap_rev() >> 8) & 0x0f)
-		pr_info("ES%x", (omap_rev() >> 12) & 0xf);
-	pr_info("\n");
+	snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",
+							omap_rev() >> 16);
+	if ((omap_rev() >> 8) & 0x0f) {
+		int sz = strlen(system_soc_info);

how about you use the return of the first snprintf instead of asking strlen() here ? I mean:

Yeah,

Quoted 9 lines

int sz = snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",

		omap_rev() >> 16);

if ((omap_rev() >> 8) & 0x0f)

	snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
			"ES%x", (omap_rev() >> 12) & 0x0f);

would that work ???

I think so, yeah. No need to recompute the string length twice. Will resend soon.

Quoted 9 lines
Signature · 8 lines
-- 
balbi

DefectiveByDesign.org
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#5 lore raw

PATCH v2 3/4 mach-omap1: Add SoC info data for OMAP1 into /proc/cpuinfo

In reply to Eduardo Valentin

From: Eduardo Valentin <[email protected]>

Report OMAP data into system_soc_info. Now we get omap information under /proc/cpuinfo.

---
 arch/arm/mach-omap1/id.c |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)
arch/arm/mach-omap1/id.c +12 -6
index a0e3560..9622e9f 100644
@@ -194,11 +194,17 @@ void __init omap_check_revision(void)
 		printk(KERN_INFO "Unknown OMAP cpu type: 0x%02x\n", cpu_type);
 	}
 
-	printk(KERN_INFO "OMAP%04x", omap_revision >> 16);
-	if ((omap_revision >> 8) & 0xff)
-		printk(KERN_INFO "%x", (omap_revision >> 8) & 0xff);
-	printk(KERN_INFO " revision %i handled as %02xxx id: %08x%08x\n",
-	       die_rev, omap_revision & 0xff, system_serial_low,
-	       system_serial_high);
+	snprintf(system_soc_info, SYSTEM_SOC_INFO_SIZE, "OMAP%04x",
+							 omap_revision >> 16);
+	if ((omap_revision >> 8) & 0xff) {
+		int sz = strlen(system_soc_info);
+
+		snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
+				"%x", (omap_revision >> 8) & 0xff);
+	}
+	pr_info("%s revision %i handled as %02xxx id: %08x%08x\n",
+		system_soc_info, die_rev, omap_revision & 0xff,
+		system_serial_low, system_serial_high);
+
 }
 
Signature · 1 line
1.7.0.4.361.g8b5fe.dirty
#6 lore raw

PATCH v2 4/4 OMAP3: PM: export chip IDCODE, Production ID and Die ID

In reply to Eduardo Valentin

From: Eduardo Valentin <[email protected]>

This patch exports the OMAP3 IDCODE and Production ID to userspace via /proc/cpuinfo using the system_soc_info.

Die ID is also exported depending on what users pass as kernel parameter. It is same protection mechanism made for x86 product number. So, if user passes "omap3_die_id" parameter, it will append die id code into /proc/cpuinfo as well. A Kconfig option has been added as well, so it can be configurable during compilation time.

This can be used to track down silicon specific issues. The info is exported via /proc/cpuinfo because then it can be possible to include this in corematic dumps.

This is based on Peter De Schrijver patch, which export same info via sysfs.

---
 Documentation/kernel-parameters.txt |    2 ++
 arch/arm/mach-omap2/Kconfig         |   10 ++++++++++
 arch/arm/mach-omap2/id.c            |   34 ++++++++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 0 deletions(-)
Documentation/kernel-parameters.txt +2 -0
index 839b21b..6a84e6c 100644
@@ -1809,6 +1809,8 @@ and is between 256 and 4096 characters. It is defined in the file
 			waiting for the ACK, so if this is set too high
 			interrupts *may* be lost!
 
+	omap3_die_id	[OMAP] Append DIE ID info under /proc/cpuinfo
+
 	omap_mux=	[OMAP] Override bootloader pin multiplexing.
 			Format: <mux_mode0.mode_name=value>...
 			For example, to override I2C bus2:
arch/arm/mach-omap2/Kconfig +10 -0
index 2455dcc..462c23a 100644
@@ -169,3 +169,13 @@ config OMAP3_SDRC_AC_TIMING
 	  wish to say no.  Selecting yes without understanding what is
 	  going on could result in system crashes;
 
+config OMAP3_EXPORT_DIE_ID
+	bool "Export DIE ID code under /proc/cpuinfo"
+	depends on ARCH_OMAP3
+	default n
+	help
+	  Say Y here if you need DIE ID code to be exported via /proc/cpuinfo
+	  in production systems. You will need also to explicitly flag it by
+	  appending the "omap3_die_id" parameter to your boot command line.
+
+
arch/arm/mach-omap2/id.c +34 -0
index 75e36a5..14c1fa8 100644
@@ -76,6 +76,10 @@ EXPORT_SYMBOL(omap_type);
 /*----------------------------------------------------------------------------*/
 
 #define OMAP_TAP_IDCODE		0x0204
+#define OMAP_TAP_PROD_ID_0      0x0208
+#define OMAP_TAP_PROD_ID_1      0x020c
+#define OMAP_TAP_PROD_ID_2      0x0210
+#define OMAP_TAP_PROD_ID_3      0x0214
 #define OMAP_TAP_DIE_ID_0	0x0218
 #define OMAP_TAP_DIE_ID_1	0x021C
 #define OMAP_TAP_DIE_ID_2	0x0220
@@ -306,6 +310,7 @@ void __init omap4_check_revision(void)
 
 void __init omap3_cpuinfo(void)
 {
+	int sz;
 	u8 rev = GET_OMAP_REVISION();
 	char cpu_name[16], cpu_rev[16];
 
@@ -375,7 +380,36 @@ void __init omap3_cpuinfo(void)
 	OMAP3_SHOW_FEATURE(192mhz_clk);
 
 	printk(")\n");
+
+	/* Append OMAP3 IDCODE, Production ID system_soc_info */
+	sz = strlen(system_soc_info);
+	snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
+			"\n\tIDCODE\t: %08x\n\tPr. ID\t: %08x %08x %08x %08x",
+			read_tap_reg(OMAP_TAP_IDCODE),
+			read_tap_reg(OMAP_TAP_PROD_ID_0),
+			read_tap_reg(OMAP_TAP_PROD_ID_1),
+			read_tap_reg(OMAP_TAP_PROD_ID_2),
+			read_tap_reg(OMAP_TAP_PROD_ID_3));
+
+}
+
+#ifdef CONFIG_OMAP3_EXPORT_DIE_ID
+static int __init omap3_die_id_setup(char *s)
+{
+	int sz;
+
+	sz = strlen(system_soc_info);
+	snprintf(system_soc_info + sz, SYSTEM_SOC_INFO_SIZE - sz,
+			"\n\tDie ID\t: %08x %08x %08x %08x",
+			read_tap_reg(OMAP_TAP_DIE_ID_0),
+			read_tap_reg(OMAP_TAP_DIE_ID_1),
+			read_tap_reg(OMAP_TAP_DIE_ID_2),
+			read_tap_reg(OMAP_TAP_DIE_ID_3));
+
+	return 1;
 }
+__setup("omap3_die_id", omap3_die_id_setup);
+#endif
 
 /*
  * Try to detect the exact revision of the omap we're running on
Signature · 1 line
1.7.0.4.361.g8b5fe.dirty