diff mbox series

[PING] Optionally: Set the serial# environment variable on the i.MX7.

Message ID alpine.DEB.2.21.2002191549260.5825@hooli
State Changes Requested
Delegated to: Stefano Babic
Headers show
Series [PING] Optionally: Set the serial# environment variable on the i.MX7. | expand

Commit Message

Mark G Feb. 19, 2020, 9:01 p.m. UTC
Enabling this new option allows the kernel to obtain the unique ID of the 
CPU when not using ATAGS.

Signed-off-by: Mark G <mark@novtech.com>
---

Comments

Stefano Babic May 11, 2020, 1:43 p.m. UTC | #1
Hi Mark,

patch was hidden in the flood of other patches and I am unsure if this
belongs to i.MX:

On 19.02.20 22:01, Mark G wrote:
> Enabling this new option allows the kernel to obtain the unique ID of
> the CPU when not using ATAGS.
> 
> Signed-off-by: Mark G <mark@novtech.com>
> ---
> diff --git a/arch/arm/include/asm/bootm.h b/arch/arm/include/asm/bootm.h
> index a2131ca07c..64ceb36ed8 100644
> --- a/arch/arm/include/asm/bootm.h
> +++ b/arch/arm/include/asm/bootm.h
> @@ -39,7 +39,7 @@ extern void udc_disconnect(void);
>  #endif
> 
>  struct tag_serialnr;
> -#ifdef CONFIG_SERIAL_TAG
> +#if defined(CONFIG_SERIAL_TAG) || defined(CONFIG_SET_SERIAL_ENV)
>   #define BOOTM_ENABLE_SERIAL_TAG    1
>  void get_board_serial(struct tag_serialnr *serialnr);
>  #else
> diff --git a/arch/arm/mach-imx/mx7/Kconfig b/arch/arm/mach-imx/mx7/Kconfig
> index 286d36589d..4cf14d43c0 100644
> --- a/arch/arm/mach-imx/mx7/Kconfig
> +++ b/arch/arm/mach-imx/mx7/Kconfig
> @@ -71,6 +71,13 @@ config TARGET_COLIBRI_IMX7
> 
>  endchoice
> 
> +config SET_SERIAL_ENV
> +    bool "Set serial number variable from the OCOTP"
> +    help
> +      Selecting this option will populate the serial# environment
> +      variable with a unique identifier from the i.MX7 CPU. The
> +      Linux kernel will use this as the serial number of the machine.
> +

I do not see the need of *another* CONFIG_ option. To make this
available, CONFIG_SERIAL_TAG should also be on, else you cannot call
get_board_serial() to get the serial from OCOTP. It think SET_SERIAL_ENV
is quite superflous.

>  config SYS_SOC
>      default "mx7"
> 
> diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
> index 4aafeed188..208400a4a7 100644
> --- a/arch/arm/mach-imx/mx7/soc.c
> +++ b/arch/arm/mach-imx/mx7/soc.c
> @@ -344,11 +344,24 @@ int arch_misc_init(void)
>      sec_init();
>  #endif
> 
> +#ifdef CONFIG_SET_SERIAL_ENV
> +    {
> +        struct tag_serialnr serialnr;
> +        char serialbuf[sizeof(serialnr) * 2 + 8];
> +
> +        get_board_serial(&serialnr);
> +        snprintf(serialbuf, sizeof(serialbuf),
> +             "%08lx%08lx",
> +             (ulong)serialnr.high, (ulong)serialnr.low);
> +        env_set("serial#", serialbuf);
> +    }

If this should be done global, local solution should be moved too. I
mean the warp board doing exactly this in board code.

So which is the idea of this ? To move warp code and making global, or
what ?

Regards,
Stefano Babic

> +#endif
> +
>      return 0;
>  }
>  #endif
> 
> -#ifdef CONFIG_SERIAL_TAG
> +#if defined(CONFIG_SERIAL_TAG) || defined(CONFIG_SET_SERIAL_ENV)
>  /*
>   * OCOTP_TESTER
>   * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016
Mark G May 20, 2020, 1:58 a.m. UTC | #2
On Mon, 11 May 2020, Stefano Babic wrote:

> patch was hidden in the flood of other patches and I am unsure if this
> belongs to i.MX:

No worries. To clarify the patch applies to all i.MX7 boards.

> On 19.02.20 22:01, Mark G wrote:
>> +      Linux kernel will use this as the serial number of the machine.
>> +
>
> I do not see the need of *another* CONFIG_ option. To make this
> available, CONFIG_SERIAL_TAG should also be on, else you cannot call
> get_board_serial() to get the serial from OCOTP. It think SET_SERIAL_ENV
> is quite superflous.

The intent here is to pass in the serial number via the environemnt 
(i.e. when not using ATAGS). My patch changes the preprocessor machinery 
so that get_board_serial() is callable if this option is set.

This then lets fdt_root() put it in the FDT passed to the kernel. It also 
means that it's easily changed for testing by being in the environment. 
The origins of this patch were for a customer switching to the Meerkat96 
board that utilized the CPU serial number in Linux for provisioning and 
testing.

> If this should be done global, local solution should be moved too. I
> mean the warp board doing exactly this in board code.

Ah. To be fair I never looked at the port for the Warp7 board as I do not 
have one. This really should be done globally; there isn't anything board 
specific for this behavior. It should apply to all i.MX7 boards, at a 
minimum.

Well - to clarify in theory there is nothing board specific. Could there 
be a board out there with an EEPROM that contains a different serial 
number that a customer would want to pass to the kernel? Possibly but 
unlikely.

> So which is the idea of this ? To move warp code and making global, or
> what ?

I would say this behavior should be global but the Warp7 port seems to add 
a board specific prefix to the CPU serial number. So I am hesitant to 
remove it. If you like I can #ifdef around it.

Additionally the Warp7 code isn't quite the same as it relies on ATAGS 
being enabled where as my patch does not.

Sincerely,
Mark G.
diff mbox series

Patch

diff --git a/arch/arm/include/asm/bootm.h b/arch/arm/include/asm/bootm.h
index a2131ca07c..64ceb36ed8 100644
--- a/arch/arm/include/asm/bootm.h
+++ b/arch/arm/include/asm/bootm.h
@@ -39,7 +39,7 @@  extern void udc_disconnect(void);
  #endif

  struct tag_serialnr;
-#ifdef CONFIG_SERIAL_TAG
+#if defined(CONFIG_SERIAL_TAG) || defined(CONFIG_SET_SERIAL_ENV)
   #define BOOTM_ENABLE_SERIAL_TAG	1
  void get_board_serial(struct tag_serialnr *serialnr);
  #else
diff --git a/arch/arm/mach-imx/mx7/Kconfig b/arch/arm/mach-imx/mx7/Kconfig
index 286d36589d..4cf14d43c0 100644
--- a/arch/arm/mach-imx/mx7/Kconfig
+++ b/arch/arm/mach-imx/mx7/Kconfig
@@ -71,6 +71,13 @@  config TARGET_COLIBRI_IMX7

  endchoice

+config SET_SERIAL_ENV
+	bool "Set serial number variable from the OCOTP"
+	help
+	  Selecting this option will populate the serial# environment
+	  variable with a unique identifier from the i.MX7 CPU. The
+	  Linux kernel will use this as the serial number of the machine.
+
  config SYS_SOC
  	default "mx7"

diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
index 4aafeed188..208400a4a7 100644
--- a/arch/arm/mach-imx/mx7/soc.c
+++ b/arch/arm/mach-imx/mx7/soc.c
@@ -344,11 +344,24 @@  int arch_misc_init(void)
  	sec_init();
  #endif

+#ifdef CONFIG_SET_SERIAL_ENV
+	{
+		struct tag_serialnr serialnr;
+		char serialbuf[sizeof(serialnr) * 2 + 8];
+
+		get_board_serial(&serialnr);
+		snprintf(serialbuf, sizeof(serialbuf),
+			 "%08lx%08lx",
+			 (ulong)serialnr.high, (ulong)serialnr.low);
+		env_set("serial#", serialbuf);
+	}
+#endif
+
  	return 0;
  }
  #endif

-#ifdef CONFIG_SERIAL_TAG
+#if defined(CONFIG_SERIAL_TAG) || defined(CONFIG_SET_SERIAL_ENV)
  /*
   * OCOTP_TESTER
   * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016