Update the board_fit_config_name_match() to choose the right
dtb based on the board name read from EEPROM. Update the
board_fit_config_name_match() to choose the right dtb based
on the board name read from EEPROM. Also restrict multiple
EEPROM reads by verifying if EEPROM is already read.

Signed-off-by: Nitin Yadav <n-ya...@ti.com>
---
 board/ti/am62x/evm.c | 148 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 148 insertions(+)

diff --git a/board/ti/am62x/evm.c b/board/ti/am62x/evm.c
index cc8e31824b..8b3a57c464 100644
--- a/board/ti/am62x/evm.c
+++ b/board/ti/am62x/evm.c
@@ -12,14 +12,24 @@
 #include <video.h>
 #include <splash.h>
 #include <k3-ddrss.h>
+#include <common.h>
 #include <fdt_support.h>
 #include <asm/io.h>
 #include <asm/arch/hardware.h>
+#include <asm/arch/sysfw-loader.h>
 #include <asm/arch/sys_proto.h>
+#include <dm.h>
+#include <dm/uclass-internal.h>
 #include <dm/uclass.h>
+#include <dm/root.h>
+
+#include "../common/board_detect.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define board_is_am62x_skevm()  board_ti_k3_is("AM62-SKEVM")
+#define board_is_am62x_lp_skevm()  board_ti_k3_is("AM62-LP-SKEVM")
+
 #ifdef CONFIG_SPLASH_SCREEN
 static struct splash_location default_splash_locations[] = {
        {
@@ -52,6 +62,26 @@ int dram_init_banksize(void)
        return fdtdec_setup_memory_banksize();
 }
 
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+       bool eeprom_read = board_ti_was_eeprom_read();
+
+       if (!eeprom_read)
+               return -1;
+
+       if (board_is_am62x_skevm()) {
+               if (!strcmp(name, "k3-am625-r5-sk") || !strcmp(name, 
"k3-am625-sk"))
+                       return 0;
+
+       } else if (board_is_am62x_lp_skevm()) {
+               if (!strcmp(name, "k3-am62-r5-lp-sk") || !strcmp(name, 
"k3-am62-lp-sk"))
+                       return 0;
+       }
+       return -1;
+}
+#endif
+
 #if defined(CONFIG_SPL_BUILD)
 #if defined(CONFIG_K3_AM64_DDRSS)
 static void fixup_ddr_driver_for_ecc(struct spl_image_info *spl_image)
@@ -103,11 +133,129 @@ void spl_perform_fixups(struct spl_image_info *spl_image)
 }
 #endif
 
+#ifdef CONFIG_TI_I2C_BOARD_DETECT
+int do_board_detect(void)
+{
+       int ret;
+
+       ret = ti_i2c_eeprom_am6_get_base(CONFIG_EEPROM_BUS_ADDRESS,
+                                        CONFIG_EEPROM_CHIP_ADDRESS);
+
+       if (ret) {
+               printf("EEPROM not available at %d, trying to read at %d\n",
+                      CONFIG_EEPROM_CHIP_ADDRESS, CONFIG_EEPROM_CHIP_ADDRESS + 
1);
+               ret = ti_i2c_eeprom_am6_get_base(CONFIG_EEPROM_BUS_ADDRESS,
+                                                CONFIG_EEPROM_CHIP_ADDRESS + 
1);
+               if (ret)
+                       pr_err("Reading on-board EEPROM at 0x%02x failed %d\n",
+                              CONFIG_EEPROM_CHIP_ADDRESS + 1, ret);
+       }
+       return ret;
+}
+
+int checkboard(void)
+{
+       struct ti_am6_eeprom *ep = TI_AM6_EEPROM_DATA;
+
+       if (!do_board_detect())
+               printf("Board: %s rev %s\n", ep->name, ep->version);
+
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_BOARD_LATE_INIT
+static void setup_board_eeprom_env(void)
+{
+       char *name = "am62x_skevm";
+
+       if (do_board_detect())
+               goto invalid_eeprom;
+
+       if (board_is_am62x_skevm())
+               name = "am62x_skevm";
+       else if (board_is_am62x_lp_skevm())
+               name = "am62x_lp_skevm";
+       else
+               printf("Unidentified board claims %s in eeprom header\n",
+                      board_ti_get_name());
+
+invalid_eeprom:
+       set_board_info_env_am6(name);
+}
+
+static void setup_serial(void)
+{
+       struct ti_am6_eeprom *ep = TI_AM6_EEPROM_DATA;
+       unsigned long board_serial;
+       char *endp;
+       char serial_string[17] = { 0 };
+
+       if (env_get("serial#"))
+               return;
+
+       board_serial = simple_strtoul(ep->serial, &endp, 16);
+       if (*endp != '\0') {
+               pr_err("Error: Can't set serial# to %s\n", ep->serial);
+               return;
+       }
+
+       snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial);
+       env_set("serial#", serial_string);
+}
+
+int board_late_init(void)
+{
+       if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
+               struct ti_am6_eeprom *ep = TI_AM6_EEPROM_DATA;
+
+               setup_board_eeprom_env();
+               setup_serial();
+               /*
+                * The first MAC address for ethernet a.k.a. ethernet0 comes 
from
+                * efuse populated via the am654 gigabit eth switch subsystem 
driver.
+                * All the other ones are populated via EEPROM, hence continue 
with
+                * an index of 1.
+                */
+               board_ti_am6_set_ethaddr(1, ep->mac_addr_cnt);
+       }
+
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_SPL_OF_LIST) && defined(CONFIG_TI_I2C_BOARD_DETECT)
+void do_dt_magic(void)
+{
+       int ret, rescan;
+
+       if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT))
+               do_board_detect();
+
+       /*
+        * Board detection has been done. Let us see if
+        * another dtb would be a better match for our
+        * board.
+        */
+       if (IS_ENABLED(CONFIG_CPU_V7R)) {
+               ret = fdtdec_resetup(&rescan);
+
+               if (!ret && rescan) {
+                       dm_uninit();
+                       dm_init_and_scan(true);
+               }
+       }
+}
+#endif
+
 #ifdef CONFIG_SPL_BUILD
 void board_init_f(ulong dummy)
 {
        k3_spl_init();
 
+#if defined(CONFIG_SPL_OF_LIST) && defined(CONFIG_TI_I2C_BOARD_DETECT)
+       do_dt_magic();
+#endif
        k3_spl_post_dt_magic();
 
        k3_mem_init();
-- 
2.25.1

Reply via email to