Adding soc related info into /proc/cpuinfo
Subsystems (5)
v3 cover Adding soc related info into /proc/cpuinfo
Hello all,
I'm resending this series with minor change in the subject prefix of patch 4/4. Removed the PM: prefix. Everything else is same. So, I kept the v3 prefix as well.
v3:
And now v3 of this series. Basically a minor change wrt string manipulation. No need to use strlen in so many places. Previous log for reference:
v2:
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:
v1:
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/[email protected]/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,
*** SUBJECT HERE ***
*** BLURB HERE ***
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: 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 | 15 ++++++---- arch/arm/mach-omap2/Kconfig | 10 +++++++ arch/arm/mach-omap2/id.c | 51 ++++++++++++++++++++++++++++++---- 6 files changed, 73 insertions(+), 12 deletions(-)
PATCH RESEND v3 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
@@ -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
@@ -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
PATCH RESEND v3 2/4 mach-omap2: Add SoC info data for OMAP2, 3, 4 into /proc/cpuinfo
In reply to Eduardo ValentinFrom: 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 | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/id.c +12 -6
@@ -104,7 +104,7 @@ static u16 tap_prod_id;void __init omap24xx_check_revision (void ) { -int i, j; +int i, j, sz;u32 idcode, prod_id;u16 hawkeye;u8 dev_type, rev;
@@ -152,10 +152,12 @@ void __init omap24xx_check_revision(void) j = i; } -pr_info ("OMAP%04x" ,omap_rev () >>16 ); + sz =snprintf (system_soc_info,SYSTEM_SOC_INFO_SIZE ,"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 + 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 +288,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 +360,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
PATCH RESEND v3 3/4 mach-omap1: Add SoC info data for OMAP1 into /proc/cpuinfo
In reply to Eduardo ValentinFrom: 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 | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-)
arch/arm/mach-omap1/id.c +9 -6
@@ -120,7 +120,7 @@ static u8 __init omap_get_die_rev(void)void __init omap_check_revision (void ) { -int i; +int i, sz;u16 jtag_id;u8 die_rev;u32 omap_id;
@@ -194,11 +194,14 @@ 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 ); + sz =snprintf (system_soc_info,SYSTEM_SOC_INFO_SIZE ,"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 + 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
PATCH RESEND v3 4/4 OMAP3: export chip IDCODE, Production ID and Die ID
In reply to Eduardo ValentinFrom: 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 | 37 +++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-)
Documentation/kernel-parameters.txt +2 -0
@@ -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
@@ -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 +35 -2
@@ -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
@@ -303,6 +307,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 ];
@@ -360,8 +365,8 @@ void __init omap3_cpuinfo(void) }/* Print verbose information */ -snprintf (system_soc_info,SYSTEM_SOC_INFO_SIZE ,"%s ES%s" , cpu_name, - cpu_rev); + sz =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);
@@ -372,7 +377,35 @@ void __init omap3_cpuinfo(void) OMAP3_SHOW_FEATURE(192mhz_clk);printk (")\n" ); + +/* Append OMAP3 IDCODE and Production ID to 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
v3 cover Adding soc related info into /proc/cpuinfo
In reply to Eduardo ValentinQuoted 2 lines · Eduardo Valentin
I'm resending this series with minor change in the subject prefix of patch 4/4. Removed the PM: prefix. Everything else is same. So, I kept the v3 prefix as well.
I'd much prefer to see a /proc/socinfo rather than extending /proc/cpuinfo to further include stuff which isn't CPU related.
v3 cover Adding soc related info into /proc/cpuinfo
Hello,
So, back to this track.
Quoted 6 lines · Russell King
Quoted 2 lines · Eduardo Valentin
I'm resending this series with minor change in the subject prefix of patch 4/4. Removed the PM: prefix. Everything else is same. So, I kept the v3 prefix as well.
I'd much prefer to see a
/proc/socinforather than extending/proc/cpuinfoto further include stuff which isn't CPU related.
Right. I agree that this is not CPU stuff. But I was trying to do not add new interfaces to export those bits.
But the socinfo is actually a nice idea. I will resend this series, but now it will create the socinfo and use it.
As it adds new stuff under /proc, I'll also cc lkml.
Thanks for the suggestion.
BR,
--
Eduardo Valentin