diff mbox

[v3,2/2] arch: arm: Show the serial number from devicetree in cpuinfo

Message ID 1429351135-11842-2-git-send-email-contact@paulk.fr (mailing list archive)
State New, archived
Headers show

Commit Message

Paul Kocialkowski April 18, 2015, 9:58 a.m. UTC
This grabs the serial number shown in cpuinfo from the serial-number devicetree
property in priority. When booting with ATAGs (and without device-tree), the
provided number is still shown instead.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 arch/arm/include/asm/system_info.h |  1 +
 arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

Comments

Paul Kocialkowski April 27, 2015, 8:27 a.m. UTC | #1
Le samedi 18 avril 2015 à 11:58 +0200, Paul Kocialkowski a écrit :
> This grabs the serial number shown in cpuinfo from the serial-number devicetree
> property in priority. When booting with ATAGs (and without device-tree), the
> provided number is still shown instead.

Any further comment on this?

> Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
> ---
>  arch/arm/include/asm/system_info.h |  1 +
>  arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
>  2 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
> index 720ea03..3860cbd40 100644
> --- a/arch/arm/include/asm/system_info.h
> +++ b/arch/arm/include/asm/system_info.h
> @@ -17,6 +17,7 @@
>  
>  /* information about the system we're running on */
>  extern unsigned int system_rev;
> +extern const char *system_serial;
>  extern unsigned int system_serial_low;
>  extern unsigned int system_serial_high;
>  extern unsigned int mem_fclk_21285;
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 1d60beb..349790f 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -93,6 +93,9 @@ unsigned int __atags_pointer __initdata;
>  unsigned int system_rev;
>  EXPORT_SYMBOL(system_rev);
>  
> +const char *system_serial;
> +EXPORT_SYMBOL(system_serial);
> +
>  unsigned int system_serial_low;
>  EXPORT_SYMBOL(system_serial_low);
>  
> @@ -821,8 +824,29 @@ arch_initcall(customize_machine);
>  
>  static int __init init_machine_late(void)
>  {
> +#ifdef CONFIG_OF
> +	struct device_node *root;
> +	int ret;
> +#endif
> +
>  	if (machine_desc->init_late)
>  		machine_desc->init_late();
> +
> +#ifdef CONFIG_OF
> +	root = of_find_node_by_path("/");
> +	if (root) {
> +		ret = of_property_read_string(root, "serial-number",
> +					      &system_serial);
> +		if (ret)
> +			system_serial = NULL;
> +	}
> +#endif
> +
> +	if (!system_serial)
> +		system_serial = kasprintf(GFP_KERNEL, "%08x%08x",
> +					  system_serial_high,
> +					  system_serial_low);
> +
>  	return 0;
>  }
>  late_initcall(init_machine_late);
> @@ -1091,8 +1115,7 @@ static int c_show(struct seq_file *m, void *v)
>  
>  	seq_printf(m, "Hardware\t: %s\n", machine_name);
>  	seq_printf(m, "Revision\t: %04x\n", system_rev);
> -	seq_printf(m, "Serial\t\t: %08x%08x\n",
> -		   system_serial_high, system_serial_low);
> +	seq_printf(m, "Serial\t\t: %s\n", system_serial);
>  
>  	return 0;
>  }
Rob Herring April 27, 2015, 1:48 p.m. UTC | #2
On Sat, Apr 18, 2015 at 4:58 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
> This grabs the serial number shown in cpuinfo from the serial-number devicetree
> property in priority. When booting with ATAGs (and without device-tree), the
> provided number is still shown instead.
>
> Signed-off-by: Paul Kocialkowski <contact@paulk.fr>

One comment below, otherwise:

Acked-by: Rob Herring <robh@kernel.org>

> ---
>  arch/arm/include/asm/system_info.h |  1 +
>  arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
>  2 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
> index 720ea03..3860cbd40 100644
> --- a/arch/arm/include/asm/system_info.h
> +++ b/arch/arm/include/asm/system_info.h
> @@ -17,6 +17,7 @@
>
>  /* information about the system we're running on */
>  extern unsigned int system_rev;
> +extern const char *system_serial;
>  extern unsigned int system_serial_low;
>  extern unsigned int system_serial_high;
>  extern unsigned int mem_fclk_21285;
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 1d60beb..349790f 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -93,6 +93,9 @@ unsigned int __atags_pointer __initdata;
>  unsigned int system_rev;
>  EXPORT_SYMBOL(system_rev);
>
> +const char *system_serial;
> +EXPORT_SYMBOL(system_serial);
> +
>  unsigned int system_serial_low;
>  EXPORT_SYMBOL(system_serial_low);
>
> @@ -821,8 +824,29 @@ arch_initcall(customize_machine);
>
>  static int __init init_machine_late(void)
>  {
> +#ifdef CONFIG_OF
> +       struct device_node *root;
> +       int ret;
> +#endif
> +
>         if (machine_desc->init_late)
>                 machine_desc->init_late();
> +
> +#ifdef CONFIG_OF

These ifdefs should not be necessary, but please double check.

Rob

> +       root = of_find_node_by_path("/");
> +       if (root) {
> +               ret = of_property_read_string(root, "serial-number",
> +                                             &system_serial);
> +               if (ret)
> +                       system_serial = NULL;
> +       }
> +#endif
> +
> +       if (!system_serial)
> +               system_serial = kasprintf(GFP_KERNEL, "%08x%08x",
> +                                         system_serial_high,
> +                                         system_serial_low);
> +
>         return 0;
>  }
>  late_initcall(init_machine_late);
> @@ -1091,8 +1115,7 @@ static int c_show(struct seq_file *m, void *v)
>
>         seq_printf(m, "Hardware\t: %s\n", machine_name);
>         seq_printf(m, "Revision\t: %04x\n", system_rev);
> -       seq_printf(m, "Serial\t\t: %08x%08x\n",
> -                  system_serial_high, system_serial_low);
> +       seq_printf(m, "Serial\t\t: %s\n", system_serial);
>
>         return 0;
>  }
> --
> 1.9.1
>
Paul Kocialkowski April 27, 2015, 2:42 p.m. UTC | #3
Le lundi 27 avril 2015 à 08:48 -0500, Rob Herring a écrit :
> On Sat, Apr 18, 2015 at 4:58 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
> > This grabs the serial number shown in cpuinfo from the serial-number devicetree
> > property in priority. When booting with ATAGs (and without device-tree), the
> > provided number is still shown instead.
> >
> > Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
> 
> One comment below, otherwise:
> 
> Acked-by: Rob Herring <robh@kernel.org>
> 
> > ---
> >  arch/arm/include/asm/system_info.h |  1 +
> >  arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
> >  2 files changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
> > index 720ea03..3860cbd40 100644
> > --- a/arch/arm/include/asm/system_info.h
> > +++ b/arch/arm/include/asm/system_info.h
> > @@ -17,6 +17,7 @@
> >
> >  /* information about the system we're running on */
> >  extern unsigned int system_rev;
> > +extern const char *system_serial;
> >  extern unsigned int system_serial_low;
> >  extern unsigned int system_serial_high;
> >  extern unsigned int mem_fclk_21285;
> > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> > index 1d60beb..349790f 100644
> > --- a/arch/arm/kernel/setup.c
> > +++ b/arch/arm/kernel/setup.c
> > @@ -93,6 +93,9 @@ unsigned int __atags_pointer __initdata;
> >  unsigned int system_rev;
> >  EXPORT_SYMBOL(system_rev);
> >
> > +const char *system_serial;
> > +EXPORT_SYMBOL(system_serial);
> > +
> >  unsigned int system_serial_low;
> >  EXPORT_SYMBOL(system_serial_low);
> >
> > @@ -821,8 +824,29 @@ arch_initcall(customize_machine);
> >
> >  static int __init init_machine_late(void)
> >  {
> > +#ifdef CONFIG_OF
> > +       struct device_node *root;
> > +       int ret;
> > +#endif
> > +
> >         if (machine_desc->init_late)
> >                 machine_desc->init_late();
> > +
> > +#ifdef CONFIG_OF
> 
> These ifdefs should not be necessary, but please double check.

Well, of_property_read_string is only defined when CONFIG_OF is set
(base.c is always built in drivers/of but the directory is only included
when CONFIG_OF is set).

Of course, on ARM, we now expect that it is the case, but it seems like
good practice to check for it, since it could theoretically be disabled.

This is also being done a few lines above in customize_machine.

> > +       root = of_find_node_by_path("/");
> > +       if (root) {
> > +               ret = of_property_read_string(root, "serial-number",
> > +                                             &system_serial);
> > +               if (ret)
> > +                       system_serial = NULL;
> > +       }
> > +#endif
> > +
> > +       if (!system_serial)
> > +               system_serial = kasprintf(GFP_KERNEL, "%08x%08x",
> > +                                         system_serial_high,
> > +                                         system_serial_low);
> > +
> >         return 0;
> >  }
> >  late_initcall(init_machine_late);
> > @@ -1091,8 +1115,7 @@ static int c_show(struct seq_file *m, void *v)
> >
> >         seq_printf(m, "Hardware\t: %s\n", machine_name);
> >         seq_printf(m, "Revision\t: %04x\n", system_rev);
> > -       seq_printf(m, "Serial\t\t: %08x%08x\n",
> > -                  system_serial_high, system_serial_low);
> > +       seq_printf(m, "Serial\t\t: %s\n", system_serial);
> >
> >         return 0;
> >  }
> > --
> > 1.9.1
> >
Rob Herring April 27, 2015, 3:20 p.m. UTC | #4
On Mon, Apr 27, 2015 at 9:42 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
> Le lundi 27 avril 2015 à 08:48 -0500, Rob Herring a écrit :
>> On Sat, Apr 18, 2015 at 4:58 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
>> > This grabs the serial number shown in cpuinfo from the serial-number devicetree
>> > property in priority. When booting with ATAGs (and without device-tree), the
>> > provided number is still shown instead.
>> >
>> > Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
>>
>> One comment below, otherwise:
>>
>> Acked-by: Rob Herring <robh@kernel.org>
>>
>> > ---
>> >  arch/arm/include/asm/system_info.h |  1 +
>> >  arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
>> >  2 files changed, 26 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
>> > index 720ea03..3860cbd40 100644
>> > --- a/arch/arm/include/asm/system_info.h
>> > +++ b/arch/arm/include/asm/system_info.h
>> > @@ -17,6 +17,7 @@
>> >
>> >  /* information about the system we're running on */
>> >  extern unsigned int system_rev;
>> > +extern const char *system_serial;
>> >  extern unsigned int system_serial_low;
>> >  extern unsigned int system_serial_high;
>> >  extern unsigned int mem_fclk_21285;
>> > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
>> > index 1d60beb..349790f 100644
>> > --- a/arch/arm/kernel/setup.c
>> > +++ b/arch/arm/kernel/setup.c
>> > @@ -93,6 +93,9 @@ unsigned int __atags_pointer __initdata;
>> >  unsigned int system_rev;
>> >  EXPORT_SYMBOL(system_rev);
>> >
>> > +const char *system_serial;
>> > +EXPORT_SYMBOL(system_serial);
>> > +
>> >  unsigned int system_serial_low;
>> >  EXPORT_SYMBOL(system_serial_low);
>> >
>> > @@ -821,8 +824,29 @@ arch_initcall(customize_machine);
>> >
>> >  static int __init init_machine_late(void)
>> >  {
>> > +#ifdef CONFIG_OF
>> > +       struct device_node *root;
>> > +       int ret;
>> > +#endif
>> > +
>> >         if (machine_desc->init_late)
>> >                 machine_desc->init_late();
>> > +
>> > +#ifdef CONFIG_OF
>>
>> These ifdefs should not be necessary, but please double check.
>
> Well, of_property_read_string is only defined when CONFIG_OF is set
> (base.c is always built in drivers/of but the directory is only included
> when CONFIG_OF is set).

Look at include/linux/of.h. There are an empty versions of both functions.

> Of course, on ARM, we now expect that it is the case, but it seems like
> good practice to check for it, since it could theoretically be disabled.

We still (and will continue to) have non-OF platforms.

> This is also being done a few lines above in customize_machine.

True, but that doesn't mean we want more.

Rob
Paul Kocialkowski April 27, 2015, 6:45 p.m. UTC | #5
Le lundi 27 avril 2015 à 10:20 -0500, Rob Herring a écrit :
> On Mon, Apr 27, 2015 at 9:42 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
> > Le lundi 27 avril 2015 à 08:48 -0500, Rob Herring a écrit :
> >> On Sat, Apr 18, 2015 at 4:58 AM, Paul Kocialkowski <contact@paulk.fr> wrote:
> >> > This grabs the serial number shown in cpuinfo from the serial-number devicetree
> >> > property in priority. When booting with ATAGs (and without device-tree), the
> >> > provided number is still shown instead.
> >> >
> >> > Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
> >>
> >> One comment below, otherwise:
> >>
> >> Acked-by: Rob Herring <robh@kernel.org>
> >>
> >> > ---
> >> >  arch/arm/include/asm/system_info.h |  1 +
> >> >  arch/arm/kernel/setup.c            | 27 +++++++++++++++++++++++++--
> >> >  2 files changed, 26 insertions(+), 2 deletions(-)
> >> >
> >> > diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
> >> > index 720ea03..3860cbd40 100644
> >> > --- a/arch/arm/include/asm/system_info.h
> >> > +++ b/arch/arm/include/asm/system_info.h
> >> > @@ -17,6 +17,7 @@
> >> >
> >> >  /* information about the system we're running on */
> >> >  extern unsigned int system_rev;
> >> > +extern const char *system_serial;
> >> >  extern unsigned int system_serial_low;
> >> >  extern unsigned int system_serial_high;
> >> >  extern unsigned int mem_fclk_21285;
> >> > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> >> > index 1d60beb..349790f 100644
> >> > --- a/arch/arm/kernel/setup.c
> >> > +++ b/arch/arm/kernel/setup.c
> >> > @@ -93,6 +93,9 @@ unsigned int __atags_pointer __initdata;
> >> >  unsigned int system_rev;
> >> >  EXPORT_SYMBOL(system_rev);
> >> >
> >> > +const char *system_serial;
> >> > +EXPORT_SYMBOL(system_serial);
> >> > +
> >> >  unsigned int system_serial_low;
> >> >  EXPORT_SYMBOL(system_serial_low);
> >> >
> >> > @@ -821,8 +824,29 @@ arch_initcall(customize_machine);
> >> >
> >> >  static int __init init_machine_late(void)
> >> >  {
> >> > +#ifdef CONFIG_OF
> >> > +       struct device_node *root;
> >> > +       int ret;
> >> > +#endif
> >> > +
> >> >         if (machine_desc->init_late)
> >> >                 machine_desc->init_late();
> >> > +
> >> > +#ifdef CONFIG_OF
> >>
> >> These ifdefs should not be necessary, but please double check.
> >
> > Well, of_property_read_string is only defined when CONFIG_OF is set
> > (base.c is always built in drivers/of but the directory is only included
> > when CONFIG_OF is set).
> 
> Look at include/linux/of.h. There are an empty versions of both functions.

Oh, you're right, I didn't know it was the case. I'll submit another
version with those changes then!

> > Of course, on ARM, we now expect that it is the case, but it seems like
> > good practice to check for it, since it could theoretically be disabled.
> 
> We still (and will continue to) have non-OF platforms.
> 
> > This is also being done a few lines above in customize_machine.
> 
> True, but that doesn't mean we want more.

Ack.
Russell King - ARM Linux April 28, 2015, 4:09 p.m. UTC | #6
On Mon, Apr 27, 2015 at 04:42:27PM +0200, Paul Kocialkowski wrote:
> Well, of_property_read_string is only defined when CONFIG_OF is set
> (base.c is always built in drivers/of but the directory is only included
> when CONFIG_OF is set).
> 
> Of course, on ARM, we now expect that it is the case, but it seems like
> good practice to check for it, since it could theoretically be disabled.

That is _not_ "is the case" - there are a number of non-OF platforms...
including some which will probably never be converted.
Paul Kocialkowski May 2, 2015, 3:46 p.m. UTC | #7
Le mardi 28 avril 2015 à 17:09 +0100, Russell King - ARM Linux a écrit :
> On Mon, Apr 27, 2015 at 04:42:27PM +0200, Paul Kocialkowski wrote:
> > Well, of_property_read_string is only defined when CONFIG_OF is set
> > (base.c is always built in drivers/of but the directory is only included
> > when CONFIG_OF is set).
> > 
> > Of course, on ARM, we now expect that it is the case, but it seems like
> > good practice to check for it, since it could theoretically be disabled.
> 
> That is _not_ "is the case" - there are a number of non-OF platforms...
> including some which will probably never be converted.

Right, so I think v4 should be fine too, given the empty functions in
case CONFIG_OF is not set.
Russell King - ARM Linux May 6, 2015, 9:01 a.m. UTC | #8
On Sat, May 02, 2015 at 05:46:22PM +0200, Paul Kocialkowski wrote:
> Le mardi 28 avril 2015 à 17:09 +0100, Russell King - ARM Linux a écrit :
> > On Mon, Apr 27, 2015 at 04:42:27PM +0200, Paul Kocialkowski wrote:
> > > Well, of_property_read_string is only defined when CONFIG_OF is set
> > > (base.c is always built in drivers/of but the directory is only included
> > > when CONFIG_OF is set).
> > > 
> > > Of course, on ARM, we now expect that it is the case, but it seems like
> > > good practice to check for it, since it could theoretically be disabled.
> > 
> > That is _not_ "is the case" - there are a number of non-OF platforms...
> > including some which will probably never be converted.
> 
> Right, so I think v4 should be fine too, given the empty functions in
> case CONFIG_OF is not set.

Yes, can you please put them in my patch system so we can get this
applied?

Rob - does your ack apply to the v4 patch?

Thanks.
Paul Kocialkowski May 6, 2015, 9:37 a.m. UTC | #9
Le mercredi 06 mai 2015 à 10:01 +0100, Russell King - ARM Linux a
écrit :
> On Sat, May 02, 2015 at 05:46:22PM +0200, Paul Kocialkowski wrote:
> > Le mardi 28 avril 2015 à 17:09 +0100, Russell King - ARM Linux a écrit :
> > > On Mon, Apr 27, 2015 at 04:42:27PM +0200, Paul Kocialkowski wrote:
> > > > Well, of_property_read_string is only defined when CONFIG_OF is set
> > > > (base.c is always built in drivers/of but the directory is only included
> > > > when CONFIG_OF is set).
> > > > 
> > > > Of course, on ARM, we now expect that it is the case, but it seems like
> > > > good practice to check for it, since it could theoretically be disabled.
> > > 
> > > That is _not_ "is the case" - there are a number of non-OF platforms...
> > > including some which will probably never be converted.
> > 
> > Right, so I think v4 should be fine too, given the empty functions in
> > case CONFIG_OF is not set.
> 
> Yes, can you please put them in my patch system so we can get this
> applied?

What exactly do you mean? 

I sent v4 to linux-arm-kernel@lists.infradead.org and
devicetree@vger.kernel.org with you and Rob in the CC list, on the 28th
of April.

> Rob - does your ack apply to the v4 patch?
> 
> Thanks.
>
diff mbox

Patch

diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h
index 720ea03..3860cbd40 100644
--- a/arch/arm/include/asm/system_info.h
+++ b/arch/arm/include/asm/system_info.h
@@ -17,6 +17,7 @@ 
 
 /* information about the system we're running on */
 extern unsigned int system_rev;
+extern const char *system_serial;
 extern unsigned int system_serial_low;
 extern unsigned int system_serial_high;
 extern unsigned int mem_fclk_21285;
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 1d60beb..349790f 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -93,6 +93,9 @@  unsigned int __atags_pointer __initdata;
 unsigned int system_rev;
 EXPORT_SYMBOL(system_rev);
 
+const char *system_serial;
+EXPORT_SYMBOL(system_serial);
+
 unsigned int system_serial_low;
 EXPORT_SYMBOL(system_serial_low);
 
@@ -821,8 +824,29 @@  arch_initcall(customize_machine);
 
 static int __init init_machine_late(void)
 {
+#ifdef CONFIG_OF
+	struct device_node *root;
+	int ret;
+#endif
+
 	if (machine_desc->init_late)
 		machine_desc->init_late();
+
+#ifdef CONFIG_OF
+	root = of_find_node_by_path("/");
+	if (root) {
+		ret = of_property_read_string(root, "serial-number",
+					      &system_serial);
+		if (ret)
+			system_serial = NULL;
+	}
+#endif
+
+	if (!system_serial)
+		system_serial = kasprintf(GFP_KERNEL, "%08x%08x",
+					  system_serial_high,
+					  system_serial_low);
+
 	return 0;
 }
 late_initcall(init_machine_late);
@@ -1091,8 +1115,7 @@  static int c_show(struct seq_file *m, void *v)
 
 	seq_printf(m, "Hardware\t: %s\n", machine_name);
 	seq_printf(m, "Revision\t: %04x\n", system_rev);
-	seq_printf(m, "Serial\t\t: %08x%08x\n",
-		   system_serial_high, system_serial_low);
+	seq_printf(m, "Serial\t\t: %s\n", system_serial);
 
 	return 0;
 }