跳转至

兼容DDR不同size的COMPAT功能说明文档


REVISION HISTORY

Revision No.
Description
Date
  • Initial release
  • 10/29/2025

    1. 功能简介

    1.1 功能背景

    对于相同ddr type、频率、封装,不同dram size、厂商的ddr来说,脚本上可以支持除了trfc设定外,其余设定都使用同一份,因此软件上适配了两种flow用于兼容不同dram size、厂商的DDR。一种是类OTT flow,使用默认设定init后,将dram size信息存储在ENV分区和DRAMINFO分区,两个分区的dram size信息互为备份,后续开机都会使用和板子上DDR容量适配的trfc设定启动。另一种为二次init flow,在第一次ddr init后,根据计算的dram size加载对应的trfc设定,而后再次进行ddr init,每次开机都会执行两次ddr init。

    Compat功能只适用于AC timing一致的不同型号DDR。

    2. 功能实现

    2.1 类OTT flow

    g_get_size_flag含义:

    • = 0: 从ENV/DRAMINFO分区load到的dram size信息是无效的,比如和实际的dram size不符合、checksum fail;
    • = 1: 从ENV分区 load到的dram size信息是有效的(与实际的dram size符合 or checksum pass);
    • = 2: 从DRAMINFO分区 load到的dram size信息是有效的(与实际的dram size符合 or checksum pass);
    • = 3: 从ENV/DRAMINFO分区load到的dram size信息都是有效的(与实际的dram size符合 or checksum pass);

    2.2 二次init flow

    2.3 两种flow的差异

    类OTT flow:

    1. 支持str,resume script前会从ENV/DRAMINFO分区load正确的trfc设定;
    2. 理想状态下(分区内没有任何的数据错误),除了重烧image后第一次开机,后续开机都可以用正确的trfc设定,不会有少量bw损耗,第一次开机的bw损耗只有两次init间隔的时间;
    3. 流程复杂,需要新增分区;

    二次init flow:

    1. 不支持str,因为ddr已经可以正常访问后,再次加载trfc设定的话一定要重新执行ddr init,二次init flow resume时只重新跑了resume script,有风险;
    2. 每次开机都会有两次init间隔时间的少量bw损耗
    3. 流程简单;

    3.使用说明

    3.1 支持兼容不同size、厂商的DDR

    目前支持兼容不同size、厂商的DDR脚本:
    
        DDR4_3200_COMPAT_BGA2
        DDR3_2133_COMPAT_BGA2
        DDR3_1866_COMPAT_BGA2
    

    如名称所示,厂商和容量都由COMPAT替换,表示不关心这两方面,另外三项dram type、dram freq、package必须一致。

    3.2 选择flow

    如果不想新增分区,又不用str,就选择二次init flow,否则使用类ott flow。关闭SUSPEND或者ENV/DRAMINFO分区访问失败时走二次init flow。

    3.3 如何新增分区

    env和emmc不需要像flash一样配置新增分区,emmc会固定保留一块block,env则是会存储变量dram_size,DDR size = 2^dram_size MB。

    3.3.1 env

    3.3.2 emmc

    emmc reserved的block,offset为0x478,大小为512 bytes。

    3.3.3 flash

    flash新增分区需要修改partition.config,draminfo分区一般跟在ddrtrain后,大小为128 bytes,具体可参考: