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

Rick Chen rickchen36 at gmail.com
Wed Jun 21 04:11:57 CEST 2023


> From: Yanhong Wang <yanhong.wang at starfivetech.com>
> Sent: Thursday, June 15, 2023 5:37 PM
> To: u-boot at lists.denx.de; Rick Jian-Zhi Chen(陳建志) <rick at andestech.com>; Leo Yu-Chi Liang(梁育齊) <ycliang at andestech.com>; Joe Hershberger <joe.hershberger at ni.com>; Ramon Fried <rfried.dev at gmail.com>
> Cc: Yanhong Wang <yanhong.wang at starfivetech.com>; Torsten Duwe <duwe at lst.de>; Leyfoon Tan <leyfoon.tan at starfivetech.com>; samin . guo <samin.guo at starfivetech.com>; Walker Chen <walker.chen at starfivetech.com>; Hal Feng <hal.feng at starfivetech.com>
> Subject: [PATCH v5 10/11] ram: starfive: Read memory size information from EEPROM
>
> 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>
> ---
>  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:

In commit message, it describes that "DDR capacity includes 2G/4G/8G".
Is it mismatch here ?

> +               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;

It maybe unnecessary to add return above. If it fail to parse memory
node from DT, then there
has no chance to get ddr size from eeprom.

Thanks,
Rick

> +
> +       /* 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;
> +       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;
>
> --
> 2.17.1


More information about the U-Boot mailing list