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