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

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Wed Oct 11 06:43:11 CEST 2023


On 11.10.23 04:54, Heinrich Schuchardt wrote:
> 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

The root cause seems to be in dw_i2c_calc_timing(). Probing of the 
i2c_designware device fails with:

dw_i2c: mode 0, ic_clk 1000000, speed 100000, period 10 rise 1 fall 1 
tlow 5 thigh 4 spk 0
dw_i2c: bad counts. hcnt = -4 lcnt = 4
device_probe: i2c at 12050000 failed to probe -22

When I change the hcnt timing calculation, by replacing the offset of 7 
to 1, the device is probed correctly and I get the correct memory size 
for my board.

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