[PATCH v5 10/11] ram: starfive: Read memory size information from EEPROM

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Wed Oct 11 04:54:59 CEST 2023


On 15.06.23 11:36, Yanhong Wang wrote:
> StarFive VisionFive 2 has two versions, 1.2A and 1.3B, each version of
> DDR capacity includes 2G/4G/8G, a DT can not support multiple
> capacities, so the capacity size information is recorded to EEPROM, when
> DDR initialization required capacity size information is read from
> EEPROM.
> 
> If there is no information in EEPROM, it is initialized with the default
> size defined in DT.
> 
> Signed-off-by: Yanhong Wang <yanhong.wang at starfivetech.com>
> Reviewed-by: Leo Yu-Chi Liang <ycliang at andestech.com>
> ---
>   arch/riscv/cpu/jh7110/spl.c         | 32 ++++++++++++++++++++++++++++-
>   drivers/ram/starfive/starfive_ddr.c |  2 --
>   2 files changed, 31 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/riscv/cpu/jh7110/spl.c b/arch/riscv/cpu/jh7110/spl.c
> index 104f0fe949..72adcefa0e 100644
> --- a/arch/riscv/cpu/jh7110/spl.c
> +++ b/arch/riscv/cpu/jh7110/spl.c
> @@ -3,19 +3,49 @@
>    * Copyright (C) 2022 StarFive Technology Co., Ltd.
>    * Author: Yanhong Wang<yanhong.wang at starfivetech.com>
>    */
> -
> +#include <common.h>
> +#include <asm/arch/eeprom.h>
>   #include <asm/csr.h>
>   #include <asm/sections.h>
>   #include <dm.h>
> +#include <linux/sizes.h>
>   #include <log.h>
> +#include <init.h>
>   
>   #define CSR_U74_FEATURE_DISABLE	0x7c1
>   #define L2_LIM_MEM_END	0x81FFFFFUL
>   
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static bool check_ddr_size(phys_size_t size)
> +{
> +	switch (size) {
> +	case SZ_2:
> +	case SZ_4:
> +	case SZ_8:
> +	case SZ_16:
> +		return true;
> +	default:
> +		return false;
> +	}
> +}
> +
>   int spl_soc_init(void)
>   {
>   	int ret;
>   	struct udevice *dev;
> +	phys_size_t size;
> +
> +	ret = fdtdec_setup_mem_size_base();
> +	if (ret)
> +		return ret;
> +
> +	/* Read the definition of the DDR size from eeprom, and if not,
> +	 * use the definition in DT
> +	 */
> +	size = (get_ddr_size_from_eeprom() >> 16) & 0xFF;

On origin/master for a 4 GiB board with a serial number 
VF7110B1-2253-D004E000-4000xxxx this always fails. This results in 
memory reported as 8 GiB and Linux crashing.

i2c_get_chip_for_busnum() returns -EINVAL in read_eeprom() 
[board/starfive/visionfive2/visionfive2-i2c-eeprom.c:335].

Is the driver model really expected to be fully initialized before 
setting up memory?

Best regards

Heinrich

> +	if (check_ddr_size(size))
> +		gd->ram_size = size << 30;
>   
>   	/* DDR init */
>   	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
> diff --git a/drivers/ram/starfive/starfive_ddr.c b/drivers/ram/starfive/starfive_ddr.c
> index 553f2ce6f4..a0a3d6b33d 100644
> --- a/drivers/ram/starfive/starfive_ddr.c
> +++ b/drivers/ram/starfive/starfive_ddr.c
> @@ -72,8 +72,6 @@ static int starfive_ddr_probe(struct udevice *dev)
>   	u64 rate;
>   	int ret;
>   
> -	/* Read memory base and size from DT */
> -	fdtdec_setup_mem_size_base();
>   	priv->info.base = gd->ram_base;
>   	priv->info.size = gd->ram_size;
>   



More information about the U-Boot mailing list