]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ram: starfive: Read memory size information from EEPROM
authorYanhong Wang <yanhong.wang@starfivetech.com>
Thu, 15 Jun 2023 09:36:51 +0000 (17:36 +0800)
committerLeo Yu-Chi Liang <ycliang@andestech.com>
Wed, 12 Jul 2023 05:21:40 +0000 (13:21 +0800)
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@starfivetech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
arch/riscv/cpu/jh7110/spl.c
drivers/ram/starfive/starfive_ddr.c

index 104f0fe9497e8fb8d4585902fd1aee5da03c90a4..72adcefa0e9d3154c5cd5bb33d5b2fa9eb392d8a 100644 (file)
@@ -3,19 +3,49 @@
  * Copyright (C) 2022 StarFive Technology Co., Ltd.
  * Author: Yanhong Wang<yanhong.wang@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;
+       if (check_ddr_size(size))
+               gd->ram_size = size << 30;
 
        /* DDR init */
        ret = uclass_get_device(UCLASS_RAM, 0, &dev);
index 553f2ce6f441904346c83ad529dbc47b1bf01c30..a0a3d6b33dc236a596013a677656f9a29c336ae7 100644 (file)
@@ -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;