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

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. + 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

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

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.
participants (2)
-
Mark G
-
Stefano Babic