board: sifive: Add an interface to get PCB revision

There are different DDR parameter settings for different board
revisions. Add a new interface to get the PCB revision to determine
which DT should be selected at runtime.

Signed-off-by: Zong Li <zong.li@sifive.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
This commit is contained in:
Zong Li 2021-06-30 23:23:48 +08:00 committed by Leo Yu-Chi Liang
parent 564d630e26
commit 05e254862f
2 changed files with 47 additions and 0 deletions

View File

@ -0,0 +1,15 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2021 SiFive, Inc.
*
* Zong Li <zong.li@sifve.com>
*/
#ifndef _ASM_RISCV_EEPROM_H
#define _ASM_RISCV_EEPROM_H
#define PCB_REVISION_REV3 0x3
u8 get_pcb_revision_from_eeprom(void);
#endif /* _ASM_RISCV_EEPROM_H */

View File

@ -540,3 +540,35 @@ int mac_read_from_eeprom(void)
return 0;
}
/**
* get_pcb_revision_from_eeprom - get the PCB revision
*
* Read the EEPROM to determine the board revision.
*
* This function is called before relocation, so we need to read a private
* copy of the EEPROM into a local variable on the stack.
*/
u8 get_pcb_revision_from_eeprom(void)
{
struct __attribute__ ((__packed__)) board_eeprom {
u8 magic[MAGIC_NUMBER_BYTES];
u8 format_ver;
u16 product_id;
u8 pcb_revision;
} be;
int ret;
struct udevice *dev;
ret = i2c_get_chip_for_busnum(CONFIG_SYS_EEPROM_BUS_NUM,
CONFIG_SYS_I2C_EEPROM_ADDR,
1,
&dev);
if (!ret)
dm_i2c_read(dev, 0, (void *)&be,
sizeof(struct board_eeprom));
return be.pcb_revision;
}