]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: dart6ul: read and print SoM info from eeprom on startup
authorMarc Ferland <ferlandm@amotus.ca>
Tue, 22 Dec 2020 19:24:12 +0000 (14:24 -0500)
committerStefano Babic <sbabic@denx.de>
Sat, 26 Dec 2020 13:56:09 +0000 (14:56 +0100)
The dart6ul has an i2c eeprom at 0x50 which contains, among other
things, the manufacturing/revision/options info of the SoM. This patch
replaces the current checkboard() implementation with a more
exhaustive one based on the content of the eeprom.

Since this code uses the new driver model, some changes were also
required in the DTS to make the nodes related to i2c available before
relocation.

This code was inspired from the supported u-boot code from Variscite
which can be found here:

https://github.com/varigit/uboot-imx/tree/imx_v2018.03_4.14.78_1.0.0_ga_var02

New output example:

Board: PN: VSM-6UL-705B, Assy: AS1812142257, Date: 2019 Feb 17
       Storage: eMMC, Wifi: yes, DDR: 1024 MiB, Rev: 2.4G

Signed-off-by: Marc Ferland <ferlandm@amotus.ca>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
arch/arm/dts/imx6ull-dart-6ul.dtsi
board/variscite/dart_6ul/dart_6ul.c
configs/variscite_dart6ul_defconfig

index fed40b01093a03b060a36d4718e252d3bed2434c..805a382da9a5eba0490bb0e4ffe08ba41424b097 100644 (file)
        };
 };
 
+&gpio1 {
+       u-boot,dm-pre-reloc;
+};
+
 &gpmi {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_gpmi_nand>;
        scl-gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
        sda-gpios = <&gpio1 31 GPIO_ACTIVE_HIGH>;
        status = "okay";
+       u-boot,dm-pre-reloc;
 
        eeprom_som: eeprom@50 {
+               u-boot,dm-pre-reloc;
                compatible = "atmel,24c04";
                reg = <0x50>;
                status = "okay";
        };
 
        pinctrl_i2c2: i2cgrp {
+               u-boot,dm-pre-reloc;
                fsl,pins = <
                        MX6UL_PAD_UART5_TX_DATA__I2C2_SCL       0x4001b8b0
                        MX6UL_PAD_UART5_RX_DATA__I2C2_SDA       0x4001b8b0
        };
 
        pinctrl_i2c2_gpio: i2c2grp_gpio {
+               u-boot,dm-pre-reloc;
                fsl,pins = <
                        MX6UL_PAD_UART5_TX_DATA__GPIO1_IO30     0x1b8b0
                        MX6UL_PAD_UART5_RX_DATA__GPIO1_IO31     0x1b8b0
index d8e383d323e8f4553afb290f3e4ba87e3daa012f..360be758bb2e71469a0f7bbb98ef3894061095e7 100644 (file)
 #include <asm/arch/sys_proto.h>
 #include <asm/mach-imx/iomux-v3.h>
 #include <asm/mach-imx/mxc_i2c.h>
+#include <dm.h>
 #include <fsl_esdhc_imx.h>
+#include <i2c_eeprom.h>
 #include <linux/bitops.h>
+#include <malloc.h>
 #include <miiphy.h>
 #include <netdev.h>
 #include <usb.h>
@@ -222,9 +225,108 @@ int board_init(void)
        return 0;
 }
 
+/* length of strings stored in the eeprom */
+#define DART6UL_PN_LEN   16
+#define DART6UL_ASSY_LEN 16
+#define DART6UL_DATE_LEN 12
+
+/* eeprom content, 512 bytes */
+struct dart6ul_info {
+       u32 magic;
+       u8 partnumber[DART6UL_PN_LEN];
+       u8 assy[DART6UL_ASSY_LEN];
+       u8 date[DART6UL_DATE_LEN];
+       u32 custom_addr_val[32];
+       struct cmd {
+               u8 addr;
+               u8 index;
+       } custom_cmd[150];
+       u8 res[33];
+       u8 som_info;
+       u8 ddr_size;
+       u8 crc;
+} __attribute__ ((__packed__));
+
+#define DART6UL_INFO_STORAGE_GET(n) ((n) & 0x3)
+#define DART6UL_INFO_WIFI_GET(n)    ((n) >> 2 & 0x1)
+#define DART6UL_INFO_REV_GET(n)     ((n) >> 3 & 0x3)
+#define DART6UL_DDRSIZE_IN_MIB(n)   ((n) << 8)
+#define DART6UL_INFO_MAGIC          0x32524156
+
+static const char *som_info_storage_to_str(u8 som_info)
+{
+       switch (DART6UL_INFO_STORAGE_GET(som_info)) {
+       case 0x0: return "none (SD only)";
+       case 0x1: return "NAND";
+       case 0x2: return "eMMC";
+       default: return "unknown";
+       }
+}
+
+static const char *som_info_rev_to_str(u8 som_info)
+{
+       switch (DART6UL_INFO_REV_GET(som_info)) {
+       case 0x0: return "2.4G";
+       case 0x1: return "5G";
+       default: return "unknown";
+       }
+}
+
 int checkboard(void)
 {
-       puts("Board: Variscite DART-6UL Evaluation Kit\n");
+       const char *path = "eeprom0";
+       struct dart6ul_info *info;
+       struct udevice *dev;
+       int ret, off;
+
+       off = fdt_path_offset(gd->fdt_blob, path);
+       if (off < 0) {
+               printf("%s: fdt_path_offset() failed: %d\n", __func__, off);
+               return off;
+       }
+
+       ret = uclass_get_device_by_of_offset(UCLASS_I2C_EEPROM, off, &dev);
+       if (ret) {
+               printf("%s: uclass_get_device_by_of_offset() failed: %d\n", __func__, ret);
+               return ret;
+       }
+
+       info = malloc(sizeof(struct dart6ul_info));
+       if (!info)
+               return -ENOMEM;
+
+       ret = i2c_eeprom_read(dev, 0, (uint8_t *)info,
+                             sizeof(struct dart6ul_info));
+       if (ret) {
+               printf("%s: i2c_eeprom_read() failed: %d\n", __func__, ret);
+               free(info);
+               return ret;
+       }
+
+       if (info->magic != DART6UL_INFO_MAGIC) {
+               printf("Board: Invalid board info magic: 0x%08x, expected 0x%08x\n",
+                      info->magic, DART6UL_INFO_MAGIC);
+               /* do not fail if the content is invalid */
+               free(info);
+               return 0;
+       }
+
+       /* make sure strings are null terminated */
+       info->partnumber[DART6UL_PN_LEN - 1] = '\0';
+       info->assy[DART6UL_ASSY_LEN - 1] = '\0';
+       info->date[DART6UL_DATE_LEN - 1] = '\0';
+
+       printf("Board: PN: %s, Assy: %s, Date: %s\n"
+              "       Storage: %s, Wifi: %s, DDR: %d MiB, Rev: %s\n",
+              info->partnumber,
+              info->assy,
+              info->date,
+              som_info_storage_to_str(info->som_info),
+              DART6UL_INFO_WIFI_GET(info->som_info) ? "yes" : "no",
+              DART6UL_DDRSIZE_IN_MIB(info->ddr_size),
+              som_info_rev_to_str(info->som_info));
+
+       free(info);
 
        return 0;
 }
index 5f94cea5ddcb5ae655c614ba53bd7c8f16319c0e..721882567de65fb8d74bd15e4d279c88d58d26a0 100644 (file)
@@ -36,6 +36,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_I2C_GPIO=y
 CONFIG_SYS_I2C_MXC=y
+CONFIG_MISC=y
+CONFIG_I2C_EEPROM=y
 CONFIG_FSL_USDHC=y
 CONFIG_MTD=y
 CONFIG_PHYLIB=y