summaryrefslogtreecommitdiff
path: root/board/ti/j721s2/evm.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/ti/j721s2/evm.c')
-rw-r--r--board/ti/j721s2/evm.c123
1 files changed, 108 insertions, 15 deletions
diff --git a/board/ti/j721s2/evm.c b/board/ti/j721s2/evm.c
index 4d28582311b..c86715fa211 100644
--- a/board/ti/j721s2/evm.c
+++ b/board/ti/j721s2/evm.c
@@ -23,11 +23,10 @@
#include <asm/arch/sys_proto.h>
#include <dm.h>
#include <dm/uclass-internal.h>
+#include <dm/root.h>
#include "../common/board_detect.h"
-#define board_is_j721s2_som() board_ti_k3_is("J721S2X-PM1-SOM")
-
DECLARE_GLOBAL_DATA_PTR;
int board_init(void)
@@ -74,16 +73,6 @@ int dram_init_banksize(void)
return 0;
}
-#ifdef CONFIG_SPL_LOAD_FIT
-int board_fit_config_name_match(const char *name)
-{
- if (!strcmp(name, "k3-j721s2-common-proc-board"))
- return 0;
-
- return -1;
-}
-#endif
-
#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
int ft_board_setup(void *blob, struct bd_info *bd)
{
@@ -101,15 +90,32 @@ int ft_board_setup(void *blob, struct bd_info *bd)
#endif
#ifdef CONFIG_TI_I2C_BOARD_DETECT
+/*
+ * Functions specific to EVM and SK designs of J721S2/AM68 family.
+ */
+
+#define board_is_j721s2_som() board_ti_k3_is("J721S2X-PM1-SOM")
+
+#define board_is_am68_sk_som() board_ti_k3_is("AM68-SK-SOM")
+
int do_board_detect(void)
{
int ret;
+ if (board_ti_was_eeprom_read())
+ return 0;
+
ret = ti_i2c_eeprom_am6_get_base(CONFIG_EEPROM_BUS_ADDRESS,
CONFIG_EEPROM_CHIP_ADDRESS);
- if (ret)
- pr_err("Reading on-board EEPROM at 0x%02x failed %d\n",
- CONFIG_EEPROM_CHIP_ADDRESS, ret);
+ if (ret) {
+ printf("EEPROM not available at 0x%02x, trying to read at 0x%02x\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;
}
@@ -136,6 +142,8 @@ static void setup_board_eeprom_env(void)
if (board_is_j721s2_som())
name = "j721s2";
+ else if (board_is_am68_sk_som())
+ name = "am68-sk";
else
printf("Unidentified board claims %s in eeprom header\n",
board_ti_get_name());
@@ -165,6 +173,28 @@ static void setup_serial(void)
}
#endif
+/*
+ * This function chooses the right dtb based on the board name read from
+ * EEPROM if the EEPROM is programmed. Also, by default the boot chooses
+ * the EVM DTB if there is no EEPROM is programmed or not detected.
+ */
+#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 || board_is_j721s2_som()) {
+ if (!strcmp(name, "k3-j721s2-common-proc-board"))
+ return 0;
+ } else if (!eeprom_read || board_is_am68_sk_som()) {
+ if (!strcmp(name, "k3-am68-sk-base-board"))
+ return 0;
+ }
+
+ return -1;
+}
+#endif
+
int board_late_init(void)
{
if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
@@ -178,3 +208,66 @@ int board_late_init(void)
void spl_board_init(void)
{
}
+
+/* Support for the various EVM / SK families */
+#if defined(CONFIG_SPL_OF_LIST) && defined(CONFIG_TI_I2C_BOARD_DETECT)
+void do_dt_magic(void)
+{
+ int ret, rescan, mmc_dev = -1;
+ static struct mmc *mmc;
+
+ do_board_detect();
+
+ /*
+ * Board detection has been done.
+ * Let us see if another dtb wouldn't 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);
+ }
+ }
+
+ /*
+ * Because of multi DTB configuration, the MMC device has
+ * to be re-initialized after reconfiguring FDT inorder to
+ * boot from MMC. Do this when boot mode is MMC and ROM has
+ * not loaded SYSFW.
+ */
+ switch (spl_boot_device()) {
+ case BOOT_DEVICE_MMC1:
+ mmc_dev = 0;
+ break;
+ case BOOT_DEVICE_MMC2:
+ case BOOT_DEVICE_MMC2_2:
+ mmc_dev = 1;
+ break;
+ }
+
+ if (mmc_dev > 0 && !check_rom_loaded_sysfw()) {
+ ret = mmc_init_device(mmc_dev);
+ if (!ret) {
+ mmc = find_mmc_device(mmc_dev);
+ if (mmc) {
+ ret = mmc_init(mmc);
+ if (ret)
+ printf("mmc init failed with error: %d\n", ret);
+ }
+ }
+ }
+}
+#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_mem_init();
+}
+#endif