This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:BIST 初始化 DRAM &'无法正常工作

Guru**** 2330830 points
Other Parts Discussed in Thread: TDA4VM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally

器件型号:TDA4VM
Thread 中讨论的其他器件: TDA4VH

工具/软件:

尊敬的专家:  

与 R5 u-boot 中的 CPU 写入相比、我尝试在 ECC 受保护的 DRAM 区域收集 BIST 写入延迟。

  • 参考板: J721E/TDA4参考板
  • SDK:TI-PROCESSOR-SDK-LINUX-ADAS-j721e-EVM-10_01_00_04

在第一次测试中、 在 R5 u-boot 中写入"k3_ddrss_preload_ecc_mem_region ()"函数、

使用 u64 PATTEN 0x1234-5678-DEAD-BALL 在0xC000-0000 ~ 0xD000-0000上写入 CPU 循环

我在 u-boot 提示符下检查 DRAM 内容,它运行良好。

=> MD.l 0xC0000000 0x10
c0000000:死牛肉12345678死牛肉12345678...xV4… XV4。
c0000010:死牛肉12345678死牛肉12345678...xV4… XV4。
c0000020:死牛肉12345678死牛肉12345678...xV4 XV4。
c0000030:死牛肉12345678死牛肉12345678...xV4… XV4
=> MD.l 0xcfffe0 0x10
cfffffe0:死牛肉12345678死牛肉12345678...xV4… XV4。
cffffff0:死牛肉12345678死牛肉12345678...xV4… XV4。
d0000000:008a81c1 c00090f4 1c100002 01809008…
d0000010:82884431 cca20202 8010a8 65924309一维.......... C.E.
=>

在第二个测试中、 在 CPU 写入0xC000-0000 ~ 0xD000-0000之后 、 R5 u-boot 中带有模式0x1234-5678-dead-beef

然后我调用 u-boot 函数" K3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0x11223344) "

u32图形0x1122-3344初始写入0xD000-0000 ~ 0xE000-0000

但执行以下操作会导致 u-boot 提示符

=> MD.l 0xC0000000 0x10
c0000000:死牛肉12345678死牛肉12345678...xV4… XV4。
c0000010:死牛肉12345678死牛肉12345678...xV4… XV4。
c0000020:死牛肉12345678死牛肉12345678...xV4 XV4。
c0000030:死牛肉12345678死牛肉12345678...xV4… XV4。
=> MD.l 0xc71e0 0x10
c71c71e0:死牛肉12345678死牛肉12345678...xV4… XV4。
c71c71f0:死牛肉12345678死牛肉12345678...xV4… XV4
c71c7200:11223344 11223344 00000000 D3".d3"……
c71c7210:11223344 11223344 00000000 D3".D3"……
=> MD.l 0xd5555560
d55560:11223344 11223344 00000000 D3".d3"……
d5555570: 11223344 11223344 00000000 D3".d3"……
d5555580:c8108008 14042783 091d0400 141289c4… "....
d55590:0b894888 411488ac 410a9198 8201d814 .h A...A....
=>

BIST 写入似乎遇到2个问题:

  1.    不期望 DRAM 范围 c71c7200 ~ d55580。
  2. 某些区域不会用零而不是图形初始化。

下面是我在第二次测试中的 u-boot 代码、您能帮助检查出什么问题吗?

文件: TI-PROCESSOR-SDK-LINUX-ADAS-j721e-evm-10_01_00_04/board-support/ti-u-boot-2024.04+git/drivers/ram/k3-ddrss/k3-ddrss.c
静态 void k3_ddrss_preload_ecc_mem_region (u64 * addr、u64大小、u64模式)

  u64 i = 0;
  对于(I = 0;I <(SIZE / 8);I++)
    Addr[i]=模式;
}

静态 void k3_ddrss_lpddr4_ecc_init (struct k3_ddrss_desc *ddrss)

  // 跳过

    DONE = GET_TIMER (0);
   k3_ddrss_preload_ecc_mem_region ((u64 *) 0xC0000000、0x10000000、0x12345678deadbeef);
   printf ("ecc:启动 DDR 区域0xC000-0000、使用 CPU 大小0x1000-0000、在%lu msec\n"、get_timer (done));

   DONE = get_timer (0); // BIST 需要总线地址? 我是对的吗? (0xD000-0000 - 0x8000-0000)= 0x5000-0000
   K3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0x11223344);
   printf ("ECC:启动 DDR 区域0xD000-0000、使用 BIST 大小0x1000-0000、在%Lu msec\n"、get_timer (done));   

  //跳过

}

非常感谢您的支持!

此致、  
Leon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Leon、

    默认情况下、SDK 支持:

    /*使用的 BIST 引擎以0预加载整个内存
    * LPDDR4控制器。
    */
    k3_ddrss_lpddr4_preload_full_mem (ddrss、ddrss->DDR_ram_size、0);

    您能否尝试使用0并确保所有目标内存正确归零?

    如果使用 BIST 时效果良好、那么我们会将0写入与 CPU 与 BIST 进行比较?

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    感谢您的快速答复。  

    我按如下方式修改 u-boot 代码、并利用 BIST 初始写入(零):

    // CPU 使用模式0x1234-5678-dead-bee牛肉 写入0xC000-0000 ~ 0xF000-0000

    k3_ddrss_preload_ecc_mem_region ((u64 *) 0xC0000000、0x30000000、0x12345678deadbeef);

    // BIST 写入0xD000-0000 ~ 0xE000-0000、图形零

    K3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0x0);

     

    但不幸的是、结果仍不符合预期:

    按任意键停止自动引导:0
    => MD.l 0xC0000000 0x10
    c0000000:死牛肉12345678死牛肉12345678...xV4… XV4。
    c0000010:死牛肉12345678死牛肉12345678...xV4… XV4。
    c0000020:死牛肉12345678死牛肉12345678...xV4 XV4。
    c0000030:死牛肉12345678死牛肉12345678...xV4… XV4
    => MD.l 0xc71e0 0x10
    c71c71e0:死牛肉12345678死牛肉12345678...xV4… XV4。
    c71c71f0:死牛肉12345678死牛肉12345678...xV4… XV4。
    c71c7200:00000000 00000000 00000000 ............
    c71c7210:00000000 00000000…
    => MD.l 0xd5555560
    d55560:00000000 00000000 00000000 ............
    d55570:00000000 00000000 00000000 ............
    d5555580:死牛肉12345678死牛肉12345678...xV4… XV4。
    d55590:死牛肉12345678死牛肉12345678...xV4… XV4。
    =>

     

    我担心在调用以下函数时可能出现问题:  

    K3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x100000000x0);   //对于 BIST 写入0xD000-0000 ~ 0xE000-0000、图形零

    • Addr:应该是 DRAM 总线地址、即0xD000-0000 - 0x8000-0000 = 0x5000-0000、 我是对吗?
    • len:0x1000-0000、长度(以字节为单位)。  
    • 模式:0如您所建议。

    您能帮助检查我的上述代码吗?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 我将尝试在我结束时重现此内容、并在明天之前回复您。  

    谢谢、  

    Keerthy  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    对不起推你,有任何更新吗?

    BTW、以下是在 R5 u-boot dts 文件中启用内联 ECC 和 BIST 模块的一些提示。

    文件: TI-PROCESSOR-SDK-LINUX-ADAS-j721e-evm-10_01_00_04/board-support/ti-u-boot-2024.04+git/arch/arm/dts/k3-j721e-ddr.dtsi

    内存控制器@0298e000 {

    兼容="ti、j721e-ddrss";

    REG =<0x0 0x02990000 0x0 0x4000>、
    0x0 0x0114000 0x0 0x100>、
    <0x0 0x02980000 0x0 0x200>;
    reg-names ="cfg"、"Ctrl_MMR_lp4"、 "ss_cfg" 

    TI、ECC-ENABLE ="true";

     

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。 我会在明天晚上回来的。  

    此致、  

    Keerthy  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Leon、

    我们的内部团队正在调查此问题。 我们将在明天之前让您随时发布更新信息。

    感谢您的耐心等待、
    Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    对不起推你,有任何更新吗?

    或者、是否可以参考任何其他技术手册或示例代码来了解 BIST 模块的使用情况?  

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Leon、

    我们还没有重现这个问题。 您是否可以使用 BIST 只对存储器运行一次?

    假设您只写一次0x0?

    仅使用 BIST 一次而不使用其他值写入0、然后查看即使在第一个实例中这是否仍然无法写入0。

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    感谢您的反馈。

    根据您的建议修改 u-boot、这次我删除了 CPU 初始写入、只有 BIST 写入 0xD000-0000 ~ 0xE000-0000、图形零

    然后获得与之前相同的意外结果:

    按任意键停止自动引导:0
    => MD.l 0xC0000000 0x10
    c0000000:108b5319 91510749 12311909 16d80e10 .S.I.Q..1
    c0000010: 51cdd3b4 a5dc6c14 099d8181 8043b91f ... c.
    c0000020:d59501c6 6d144c20 8d501199 5555551881... l.m.P..uu
    c0000030:0d089891 26541941 560d4110 5430fa81...A.T&.A.V.0T
    => MD.l 0xc71e0 0x10
    c71c71e0:734458ce 1251119c ba4f014e e2a7a6F1 .XDS..Q.N.O.
    c71c71f0:ec280980 31a30945 90092d07 708ee113 ..(.E.1...... P
    c71c7200:00000000 00000000 00000000 ............
    c71c7210:00000000 00000000…
    => MD.l 0xd55560 0x10
    d55560:00000000 00000000 00000000 ............
    d55570:00000000 00000000 00000000 ............
    d5555580:c810803a 1446279b 0b190680 3c12e9d4:……… <
    d55590: 0be98d8d 4d14e8ac 410a91b8 9315d81c…… M.A....
    =>

    我仍然担心 BIST 可能使用错误。   

    请检查我的代码:  

    K3_LPDDR4_BIST_init_mem_region (ddrss、  0x50000000  0x10000000 0x0);    //对于 BIST 写入0xD000-0000 ~ 0xE000-0000、图形零

    • Addr:应该是 DRAM 总线地址、即0xD000-0000 - 0x8000-0000 = 0x5000-0000、 我是对吗?
    • len:0x1000-0000、长度(以字节为单位)。  
    • 模式:0如您所建议。

    下面是我对 k3-ddrss.c 的修改、希望这有助于重现问题。

    diff --git a/drivers/ram/k3-ddrss/k3-ddrss.c b/drivers/ram/k3-ddrss/k3-ddrss.c
    index eaf31cd4..db06139f 100644
    --- a/drivers/ram/k3-ddrss/k3-ddrss.c
    +++ b/drivers/ram/k3-ddrss/k3-ddrss.c
    @@ -807,9 +807,17 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	u64 ecc_range = ddrss->ecc_regions[0].range;
     	u32 base = (u32)ddrss->ddrss_ss_cfg;
     	u32 val;
    +	u32 done = 0;
     
    +#if 0 
     	/* Only Program region 0 which covers full ddr space */
     	k3_ddrss_set_ecc_range_r0(base, ecc_region_start, ecc_range);
    +#else
    +	// leonwang modify, enable ecc region 0 to cover partial area on low mem
    +	//printf("---> leonwang add %s %d ECC protected cpu phy addr: 0xC000_0000 ~ 0xD001_ffff \n", __FILE__, __LINE__);
    +	//printf("---> leonwang add %s %d ECC protected ram bus addr: 0x4000_0000 ~ 0x5001_ffff \n", __FILE__, __LINE__);
    +	//k3_ddrss_set_ecc_range_r0(base, 0x40000000, 0x10020000);
    +#endif
     
     	/* Enable ECC, RMW, WR_ALLOC */
     	writel(DDRSS_ECC_CTRL_REG_ECC_EN | DDRSS_ECC_CTRL_REG_RMW_EN |
    @@ -818,7 +826,25 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	/* Preload the full memory with 0's using the BIST engine of
     	 * the LPDDR4 controller.
     	 */
    +#if 0	
     	k3_ddrss_lpddr4_preload_full_mem(ddrss, ddrss->ddr_ram_size, 0);
    +#else
    +	// leonwang modify, cpu vs BIST initial write on ecc protected area
    +	/* cpu initial write ecc area on low mem */
    +	//printf("---> leonwang add %s %d \"CPU\" init write to cpu addr: 0xC000_0000 ~ 0xD000_0000\n", __FILE__, __LINE__);
    +	//done = get_timer(0);
    +	//k3_ddrss_preload_ecc_mem_region( (u64 *)0xC0000000, 0x10000000, 0x12345678deadbeef);
    +	//printf("ECC: priming DDR with CPU, completed in %lu msec\n", get_timer(done));
    +
    +	/* bist initial write */
    +	printf("---> leonwang add %s %d \"BIST\" initial write on cpu phy addr: 0xD000_0000 + 0x1000_0000\n", __FILE__, __LINE__);
    +	printf("---> leonwang add %s %d \"BIST\" initial write on ram bus addr: 0x5000_0000 + 0x1000_0000\n", __FILE__, __LINE__);
    +	done = get_timer(0);
    +	//k3_lpddr4_bist_init_mem_region(ddrss, 0x50000000, 0x10000000, 0x11223344);
    +	k3_lpddr4_bist_init_mem_region(ddrss, 0x50000000, 0x10000000, 0);
    +	printf("ECC: priming DDR with BIST, completed in %lu msec\n", get_timer(done));
    +#endif
     
     	/* Clear Error Count Register */
     	writel(0x1, base + DDRSS_ECC_1B_ERR_CNT_REG);
    @@ -826,12 +852,31 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	writel(DDRSS_V2A_INT_SET_REG_ECC1BERR_EN | DDRSS_V2A_INT_SET_REG_ECC2BERR_EN |
     		   DDRSS_V2A_INT_SET_REG_ECCM1BERR_EN, base + DDRSS_V2A_INT_SET_REG);
     
    +#if 0	// leonwang del for test
     	/* Enable ECC Check */
     	val = readl(base + DDRSS_ECC_CTRL_REG);
     	val |= DDRSS_ECC_CTRL_REG_ECC_CK;
     	writel(val, base + DDRSS_ECC_CTRL_REG);
    +#endif
     }

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="448873" url="~/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally/5817722 #5817722"]

    K3_LPDDR4_BIST_init_mem_region (ddrss、  0x50000000  0x10000000 0x0);    //对于 BIST 写入0xD000-0000 ~ 0xE000-0000、图形零

    • Addr:应该是 DRAM 总线地址、即0xD000-0000 - 0x8000-0000 = 0x5000-0000、 我是对吗?
    [/报价]

    正确。

    [引述 userid="448873" url="~/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally/5817722 #5817722"]

    下面是我对 k3-ddrss.c 的修改、希望这有助于重现问题。

    [/报价]

    特征值。 明天我会回来更新。

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    很抱歉再次推你,有任何更新吗?

    复制时是否遇到任何问题? 也许我可以提供帮助。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Wang:

    感谢您的检查。

    我目前面临以下问题:

    U-Boot SPL 2024.04-ti-dirty (May 20 2025 - 11:37:59 +0530)
    SYSFW ABI: 4.0 (firmware rev 0x000a '10.1.6--v10.01.06 (Fiery Fox)')
    read error from device: 41c863bc register: x!
    ECC is enabled, priming DDR which will take several seconds.
    ERROR: Timeout while priming the memory.
    ### ERROR ### Please RESET the board ###
    

    我所做的更改:

    diff --git a/arch/arm/dts/k3-j721e-ddr.dtsi b/arch/arm/dts/k3-j721e-ddr.dtsi
    index 7d2ccd95..b59673bc 100644
    --- a/arch/arm/dts/k3-j721e-ddr.dtsi
    +++ b/arch/arm/dts/k3-j721e-ddr.dtsi
    @@ -7,8 +7,10 @@
            memorycontroller: memorycontroller@0298e000 {
                    compatible = "ti,j721e-ddrss";
                    reg = <0x0 0x02990000 0x0 0x4000>,
    -                     <0x0 0x0114000 0x0 0x100>;
    -               reg-names = "cfg", "ctrl_mmr_lp4";
    +                     <0x0 0x0114000 0x0 0x100>,
    +                     <0x0 0x02980000 0x0 0x200>;
    +               reg-names = "cfg", "ctrl_mmr_lp4", "ss_cfg";
    +               ti,ecc-enable = "true";
                    power-domains = <&k3_pds 47 TI_SCI_PD_SHARED>,
                            <&k3_pds 90 TI_SCI_PD_SHARED>;
                    clocks = <&k3_clks 47 2>, <&k3_clks 30 9>;
    

    我正在内部检查出现此错误的原因。

    您最终是否遇到了问题?

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    您似乎遇到了两个问题

    1、"从器件读取错误:41c863bc 寄存器:x! "

    我以前没有遇到过。

    我搜索 u-boot 源代码、似乎它与 PMIC 驱动程序有关。

    如果它不会阻止我们的测试、那么也许我们可以暂时忽略它。   

    2. 错误:内存启动时超时。

    BIST 初始化 DRAM 需要太长的时间(10秒以上)

    一种简单的权变措施是不检查超时。

    文件: TI-PROCESSOR-SDK-LINUX-ADAS-j721e-evm-10_01_00_04/board-support/ti-u-boot-2024.04+git/drivers/ram/k3-ddrss/k3-ddrss.c

    #define BIST_MODE_MEM_INIT      4
    #define BIST_MEM_INIT_TIMEOUT       10000 /* 1msec loops per block = 10s */
    static void k3_lpddr4_bist_init_mem_region(struct k3_ddrss_desc *ddrss,
                           u64 addr, u64 size,
                           u32 pattern)
    {
        // ...
        #if 0 // you can del it to workaround timeout issue
        if (i == BIST_MEM_INIT_TIMEOUT) {
            printf("ERROR: Timeout while priming the memory.\n");
            hang();
        }
        #endif
    }

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="448873" url="~/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally/5827866 #5827866"]

    BIST 初始化 DRAM 需要太长的时间(10秒以上)

    一种简单的权变措施是不检查超时。

    [/报价]

    在测试时是否添加了上述代码?

    我相信、如果我们在没有完成 BIST 的情况下发布、 那么我们可能会看到您看到的未初始化问题吗?
    我们不允许 BIST 完全完成?

    您使用的是上述代码吗? 我可以看到 BIST 完成未完成。

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    在默认的 u-boot 代码中、似乎它会尝试通过 BIST 初始化"所有 DRAM"。  

    k3_ddrss_lpddr4_ecc_init ()

    --> k3_ddrss_lpddr4_preload_full_mem (ddrss、ddrss->DDR_ram_size、0);

      --> k3_LPDDR4_BIST_init_mem_region (ddrss、0、total_size、pattern);   

         //我担心这里有一些错误、 因为2组 DRAM 地址不是连续的。

         //也许这就是为什么你看到 BIST 从未完成?

    在我的测试中、我只想初始化"DRAM 的一部分"  

    k3_ddrss_lpddr4_ecc_init ()

    --> k3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0);  

       //仅初始化第一组中的部分 DRAM 区域。 您可以在上面的聊天中参考我的补丁、了解更多详细信息

       // BIST 可以在没有超时问题的情况下完成、但不能找到范围和模式。   

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="448873" url="~/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally/5827893 #5827893"]

    在我的测试中、我只想初始化"DRAM 的一部分"  

    k3_ddrss_lpddr4_ecc_init ()

    --> k3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0);  

       //仅初始化第一组中的部分 DRAM 区域。 您可以在上面的聊天中参考我的补丁、了解更多详细信息

       // BIST 可以在没有超时问题的情况下完成、但不能找到范围和模式

    [/报价]

    "这是我的错。"

    U-Boot SPL 2024.04-ti-dirty (2025年5月20日- 12:03:20 +0530)
    SYSFW ABI:4.0 (固件版本0x000a '10.1.6--v10.01.06 (Fiery Fox)')
    从器件读取错误:41c863bc 寄存器:x!
    ECC 已启用、对 DDR 进行启动需要几秒钟时间。
    ECC:启动 DDR 在760ms 内完成

    另外、我还与我们的开发团队进行了多次检查。 这仅在 TDA4VH 上验证、在 TDA4VM 上验证。  

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    感谢您的信息。  

    目前、我们只手头有用于 BIST 测试的 TDA4VM 参考板...  

    从硬件视图中、TDA4VM SoC 支持 BIST。

    应该能够使 BIST 在 TDA4VM 上正常工作。  

    至少、我的 TDA4VM 参考板可以在启用 BIST 的情况下启动。

    我担心电路板故障的根本原因是 PMIC 驱动程序故障" 从器件读取错误:41c863bc 寄存器:x! "  

    我搜索 u-boot build 输出文件夹、然后找到以下内容:

    ~/ti-j7/board-support/ti-u-boot-2024.04+git$ ls build/r5/drivers/power/PMIC/
    build-in.o PMIC-uclass.o PMIC-uclass.su tps65941.o tps65941.su

    相关的驱动器源代码是  

    文件: drivers/power/pmic/tps65941.c

    static int tps65941_read (struct udevice *dev、uint reg、uint8_t *buff、int len)

      if (dm_i2c_read (dev、reg、buff、len)){
         pr_err ("从设备读取错误:%p 寄存器:%#x!\n"、dev、reg);
         return -EIO;
       }

    我想您的电路板中的 PMIC 65941可能有问题。

    您可以尝试另一个 TDA4VM 参考板吗?

    希望问题能解决。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    另一个发现  

    根据您的故障日志、您似乎只使用 BIST 来初始化 ECC 受保护区域的一部分。

    能否帮助您再次检查  k3_ddrss_lpddr4_ecc_init ()末尾是否禁用了 ECC 检查?

    否则、ECC 错误将导致系统卡住。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我尝试使用其他电路板、并交叉检查是否看到相同的问题。 我会在明天晚上回来的。

    [引述 userid="448873" url="~/support/processors-group/processors/f/processors-forum/1507435/tda4vm-bist-initialize-dram-doesn-t-work-normally/5830346 #5830346"]

    能否帮助您再次检查  k3_ddrss_lpddr4_ecc_init ()末尾是否禁用了 ECC 检查?

    否则、ECC 错误将导致系统卡住。

    [/报价]

    您是否明确添加了?

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    如果您只是初始化 ECC 保护区域的一部分、则需要禁用 ECC 检查。

    文件: TI-PROCESSOR-SDK-LINUX-ADAS-j721e-evm-10_01_00_04/board-support/ti-u-boot-2024.04+git/drivers/ram/k3-ddrss/k3-ddrss.c

    static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
    {
    
    // ...... skip 
    
    #if 0   // leonwang del for test
        /* Enable ECC Check */
        val = readl(base + DDRSS_ECC_CTRL_REG);
        val |= DDRSS_ECC_CTRL_REG_ECC_CK;
        writel(val, base + DDRSS_ECC_CTRL_REG);
    #endif
    }
    

    以下是我对 k3-ddrss.c 的完整修改、请参阅。 (禁用部分初始化和 ECC 校验)

    diff --git a/drivers/ram/k3-ddrss/k3-ddrss.c b/drivers/ram/k3-ddrss/k3-ddrss.c
    index eaf31cd4..db06139f 100644
    --- a/drivers/ram/k3-ddrss/k3-ddrss.c
    +++ b/drivers/ram/k3-ddrss/k3-ddrss.c
    @@ -807,9 +807,17 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	u64 ecc_range = ddrss->ecc_regions[0].range;
     	u32 base = (u32)ddrss->ddrss_ss_cfg;
     	u32 val;
    +	u32 done = 0;
     
    +#if 0 
     	/* Only Program region 0 which covers full ddr space */
     	k3_ddrss_set_ecc_range_r0(base, ecc_region_start, ecc_range);
    +#else
    +	// leonwang modify, enable ecc region 0 to cover partial area on low mem
    +	//printf("---> leonwang add %s %d ECC protected cpu phy addr: 0xC000_0000 ~ 0xD001_ffff \n", __FILE__, __LINE__);
    +	//printf("---> leonwang add %s %d ECC protected ram bus addr: 0x4000_0000 ~ 0x5001_ffff \n", __FILE__, __LINE__);
    +	//k3_ddrss_set_ecc_range_r0(base, 0x40000000, 0x10020000);
    +#endif
     
     	/* Enable ECC, RMW, WR_ALLOC */
     	writel(DDRSS_ECC_CTRL_REG_ECC_EN | DDRSS_ECC_CTRL_REG_RMW_EN |
    @@ -818,7 +826,25 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	/* Preload the full memory with 0's using the BIST engine of
     	 * the LPDDR4 controller.
     	 */
    +#if 0	
     	k3_ddrss_lpddr4_preload_full_mem(ddrss, ddrss->ddr_ram_size, 0);
    +#else
    +	// leonwang modify, cpu vs BIST initial write on ecc protected area
    +	/* cpu initial write ecc area on low mem */
    +	//printf("---> leonwang add %s %d \"CPU\" init write to cpu addr: 0xC000_0000 ~ 0xD000_0000\n", __FILE__, __LINE__);
    +	//done = get_timer(0);
    +	//k3_ddrss_preload_ecc_mem_region( (u64 *)0xC0000000, 0x10000000, 0x12345678deadbeef);
    +	//printf("ECC: priming DDR with CPU, completed in %lu msec\n", get_timer(done));
    +
    +	/* bist initial write */
    +	printf("---> leonwang add %s %d \"BIST\" initial write on cpu phy addr: 0xD000_0000 + 0x1000_0000\n", __FILE__, __LINE__);
    +	printf("---> leonwang add %s %d \"BIST\" initial write on ram bus addr: 0x5000_0000 + 0x1000_0000\n", __FILE__, __LINE__);
    +	done = get_timer(0);
    +	//k3_lpddr4_bist_init_mem_region(ddrss, 0x50000000, 0x10000000, 0x11223344);
    +	k3_lpddr4_bist_init_mem_region(ddrss, 0x50000000, 0x10000000, 0);
    +	printf("ECC: priming DDR with BIST, completed in %lu msec\n", get_timer(done));
    +#endif
     
     	/* Clear Error Count Register */
     	writel(0x1, base + DDRSS_ECC_1B_ERR_CNT_REG);
    @@ -826,12 +852,31 @@ static void k3_ddrss_lpddr4_ecc_init(struct k3_ddrss_desc *ddrss)
     	writel(DDRSS_V2A_INT_SET_REG_ECC1BERR_EN | DDRSS_V2A_INT_SET_REG_ECC2BERR_EN |
     		   DDRSS_V2A_INT_SET_REG_ECCM1BERR_EN, base + DDRSS_V2A_INT_SET_REG);
     
    +#if 0	// leonwang del for test
     	/* Enable ECC Check */
     	val = readl(base + DDRSS_ECC_CTRL_REG);
     	val |= DDRSS_ECC_CTRL_REG_ECC_CK;
     	writel(val, base + DDRSS_ECC_CTRL_REG);
    +#endif
     }
      

    BTW、

    为避免误解、  

    启用 ECC 检查后、我的电路板可以正常启动。  TDA4VM:J721E 中的内联 ECC 错误处理-处理器论坛-处理器- TI E2E 支持论坛

    目前我想测试 BIST 功能、因此我暂时禁用 ECC 检查以进行测试。   

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、感谢您分享所有更改。 我会尝试在另一个板上、然后回来。  

    此致、

    Keerthy  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Leon:

    感谢您的所有更改。 我看到了您观察到的行为:

    K3_LPDDR4_BIST_init_mem_region (ddrss、0x50000000、0x10000000、0);

    因此0xD0000000 - 0xE0000000 -->整个范围应为0。

    但我确实看到:

    =>
    => MD 0xd8000000
    d8000000:ffffdfff ffffffffff bdffffdd ffffdfff ............
    d8000010:ffddbfef fffffffdff ffffffff7f ffffffffff ............
    d8000020:FFFFFFFF ffffffffff ffffffbf ffffdfff ............
    d8000030:ffffffffdf ffffffffffff 7effff ffffffffffff ........... ~…
    d8000040:FFFFFFFF ffffffbf7 ffffffffff ffbfff ............
    d8000050:FFFFFFFF ffffffffffff ffbff ffffffff7f ............
    d8000060:dffe7fff dfefffff fff7fdff fffffdff ............
    d8000070:FFFFFFFF d7f77fff bfffffff fdffffff ............
    d8000080:FFFFFFFF ffffffffff ffffbdff ffffffdf ............
    d8000090:FFFFFFFF ffffffff ffffffff f7ffffff ............
    d80000a0:FFFFFFFF ffffffff FFFFFFFE ffffbeff ............
    d80000b0:fffffedf fffffffffffff ffffffffffffffff ............
    d80000c0:FFFFFFFF ffffffff fd7ffdff fffffff7 ............
    d80000d0:bfffffff ffffffffff ffffffffff ffdfff ............
    d80000e0:fefdffff fff9bfff 7ffffffffb ffbfffff ............
    d80000f0:ffbffffffffb ffffffffffff ffffb9ff ffffffff ............
    =>

    这些值为非零值、不符合预期。 也就是说、此时我不确定 BIST 是否已写入完整的范围。

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Leon、

    一个快速观察结果:

    k3_LPDDR4_BIST_init_mem_region (ddrss、0x10000000、0x10000000、0);

    基本上尝试从0x90000000 - 0xA0000000写入0。

    这似乎很有效。 我看到了所有范围0。 那么、您能在结束时尝试检查一下吗?

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    应用 k3_LPDDR4_BIST_init_mem_region (ddrss、0x10000000、0x10000000、0)之后

    不幸的是,这是我的结果  

    => Md.l 0x8e38e340 0x20
    8e38e340:fdffb7ff ffffede 1 effbff ef6f3dfe .......... =O
    8e38e350:fffe7ff7 ff3ffff5 bddffd7f cffefdbf ?……
    8e38e360:ffd6f7ff bffbdfff 87ffafff fafffdeb ............
    8e38e370:dff7ff7f fffffff9ff ff6f5def ffffffd .......... ] O.
    8e38e380:00000000 00000000 00000000 ............
    8e38e390:00000000 00000000 00000000 ............
    8e38e3a0:00000000 00000000…
    8e38e3B0:00000000 00000000 00000000 ............


    => MD.l 0x90000000 0x20
    90000000:00000000 00000000 00000000 ............
    90000010:00000000 00000000 00000000 ............
    90000020:00000000 00000000 00000000 ............
    90000030:00000000 00000000 00000000 ............
    90000040:00000000 00000000 00000000 ............
    90000050:00000000 00000000 00000000 ............
    90000060:00000000 00000000 00000000 ............
    90000070:00000000 00000000 00000000 ............


    => md.l 0x9c71c6c0 0x20
    9c71c6c0:00000000 00000000 00000000 ............
    9c71c6d0:00000000 00000000…
    9c71c6e0:00000000 00000000 00000000 ............
    9c71c6f0:00000000 00000000 00000000 ............
    9c71c700:9dffbdf7 9f7fffc7 bdb3ebfd ff7ffffff ............
    9c71c710:dfffffbf cdfff97f 9bd5fa9f fbffc97f ............
    9c71c720:badf3eff 7dff7fbf af7fbfef dff3fd9f .> }....
    9c71c730:bfb9dffa fdfffbdd ffbffffffffffffffe ............
    =>

    您能帮助仔细检查您的结果吗?  

    不仅检查 DRAM 内容是否始于0x9000-0000、 还包括其他区域。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Leon:

    我做了一个随机检查接近尾声。 让我查看一下这些地址、然后今天返回给您。

    - Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Leon:

    因为 J721e 未在 SDK 中实现。 我在下一个 SDK 中提出了支持 J721e 内联 ECC 对 DDR 的支持的要求。
    实现还应考虑解决您确定的启动问题。

    感谢您的耐心。 请查看下一个 SDK 版本说明、因为这是我们将返回开发团队进行实施时缺少的功能。 如果需要更多详细信息、请随时回复。

    谢谢、
    Keerthy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keerthy、  

    感谢您的支持。

    我将尝试在下一个 SDK 版本中使用。

    此致、  
    Leon