summaryrefslogtreecommitdiff
path: root/board/sifive
diff options
context:
space:
mode:
authorZong Li <zong.li@sifive.com>2021-06-30 23:23:50 +0800
committerLeo Yu-Chi Liang <ycliang@andestech.com>2021-07-06 20:24:26 +0800
commit4b4159d0f31ca3e0174ccfdce9a24a1fe3671829 (patch)
tree62d2ac2c805629f26ab5f0709d7d4775020587ea /board/sifive
parentffe9a394df0cf4ec14331ce425938409289e5780 (diff)
downloadu-boot-4b4159d0f31ca3e0174ccfdce9a24a1fe3671829.tar.gz
u-boot-4b4159d0f31ca3e0174ccfdce9a24a1fe3671829.tar.bz2
u-boot-4b4159d0f31ca3e0174ccfdce9a24a1fe3671829.zip
board: sifive: support spl multi-dtb on unmatched board
There are two revisions of unmatched board with different DDR timing, we'd like to support multi-dtb mechanism in SPL, then it selects the right DTB at runtime according to PCB revision in I2C EEPROM. Signed-off-by: Zong Li <zong.li@sifive.com> Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Diffstat (limited to 'board/sifive')
-rw-r--r--board/sifive/unmatched/spl.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/board/sifive/unmatched/spl.c b/board/sifive/unmatched/spl.c
index 5e1333b09a..74134b03ee 100644
--- a/board/sifive/unmatched/spl.c
+++ b/board/sifive/unmatched/spl.c
@@ -10,11 +10,14 @@
#include <spl.h>
#include <misc.h>
#include <log.h>
+#include <fdtdec.h>
+#include <dm/root.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <asm/gpio.h>
#include <asm/arch/gpio.h>
#include <asm/arch/spl.h>
+#include <asm/arch/eeprom.h>
#define GEM_PHY_RESET SIFIVE_GENERIC_GPIO_NR(0, 12)
@@ -26,6 +29,16 @@ int spl_board_init_f(void)
{
int ret;
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_MULTI_DTB_FIT)
+ int rescan;
+
+ ret = fdtdec_resetup(&rescan);
+ if (!ret && rescan) {
+ dm_uninit();
+ dm_init_and_scan(true);
+ }
+#endif
+
ret = spl_soc_init();
if (ret) {
debug("HiFive Unmatched FU740 SPL init failed: %d\n", ret);
@@ -79,7 +92,18 @@ u32 spl_boot_device(void)
#ifdef CONFIG_SPL_LOAD_FIT
int board_fit_config_name_match(const char *name)
{
- /* boot using first FIT config */
- return 0;
+ /*
+ * Apply different DDR params on different board revision.
+ * Use PCB revision which is byte 0x7 in I2C platform EEPROM
+ * to distinguish that.
+ */
+ if (get_pcb_revision_from_eeprom() == PCB_REVISION_REV3 &&
+ !strcmp(name, "hifive-unmatched-a00"))
+ return 0;
+ else if (get_pcb_revision_from_eeprom() != PCB_REVISION_REV3 &&
+ !strcmp(name, "hifive-unmatched-a00-rev1"))
+ return 0;
+
+ return -1;
}
#endif