stm32mp1: display board information
authorPatrick Delaunay <patrick.delaunay@st.com>
Tue, 12 Feb 2019 10:44:41 +0000 (11:44 +0100)
committerPatrick Delaunay <patrick.delaunay@st.com>
Fri, 12 Apr 2019 14:09:13 +0000 (16:09 +0200)
Implement checkboard() function to display
- the boot chain used: basic or trusted
- the board compatible in device tree
- the board identifier and revision, saved in OTP59 for ST boards

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
arch/arm/mach-stm32mp/include/mach/stm32.h
board/st/stm32mp1/stm32mp1.c

index 5d0bdca1787d6c7c853ced6cbf13d06ec9fa08f7..85d783cccb8a2bc29374f7ee8e71b975aec7335c 100644 (file)
@@ -98,7 +98,11 @@ enum boot_device {
 
 /* offset used for BSEC driver: misc_read and misc_write */
 #define STM32_BSEC_SHADOW_OFFSET       0x0
+#define STM32_BSEC_SHADOW(id)          (STM32_BSEC_SHADOW_OFFSET + (id) * 4)
 #define STM32_BSEC_OTP_OFFSET          0x80000000
+#define STM32_BSEC_OTP(id)             (STM32_BSEC_OTP_OFFSET + (id) * 4)
+
+#define BSEC_OTP_BOARD 59
 
 #endif /* __ASSEMBLY__*/
 #endif /* _MACH_STM32_H_ */
index 54feca0ecff5c3e9189824e316de0a2526fe1ab3..07d1addb2a83aa16628bd19d5647dddaa1be7c65 100644 (file)
@@ -3,11 +3,12 @@
  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
  */
 #include <config.h>
-#include <common.h>
-#include <led.h>
 #include <clk.h>
+#include <common.h>
 #include <dm.h>
 #include <generic-phy.h>
+#include <led.h>
+#include <misc.h>
 #include <phy.h>
 #include <reset.h>
 #include <usb.h>
@@ -26,6 +27,45 @@ DECLARE_GLOBAL_DATA_PTR;
 #define STM32MP_GGPIO 0x38
 #define STM32MP_GGPIO_VBUS_SENSING BIT(21)
 
+int checkboard(void)
+{
+       int ret;
+       char *mode;
+       u32 otp;
+       struct udevice *dev;
+       const char *fdt_compat;
+       int fdt_compat_len;
+
+       if (IS_ENABLED(CONFIG_STM32MP1_TRUSTED))
+               mode = "trusted";
+       else
+               mode = "basic";
+
+       printf("Board: stm32mp1 in %s mode", mode);
+       fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible",
+                                &fdt_compat_len);
+       if (fdt_compat && fdt_compat_len)
+               printf(" (%s)", fdt_compat);
+       puts("\n");
+
+       ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                         DM_GET_DRIVER(stm32mp_bsec),
+                                         &dev);
+
+       if (!ret)
+               ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
+                               &otp, sizeof(otp));
+       if (!ret && otp) {
+               printf("Board: MB%04x Var%d Rev.%c-%02d\n",
+                      otp >> 16,
+                      (otp >> 12) & 0xF,
+                      ((otp >> 8) & 0xF) - 1 + 'A',
+                      otp & 0xF);
+       }
+
+       return 0;
+}
+
 static struct dwc2_plat_otg_data stm32mp_otg_data = {
        .usb_gusbcfg = STM32MP_GUSBCFG,
 };