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.

[参考译文] AM625:减小 DDR 大小会导致 U-Boot R5 SPL 在以太网引导期间崩溃

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1497680/am625-reducing-ddr-size-causes-u-boot-r5-spl-to-crash-during-ethernet-boot

器件型号:AM625
主题: SysConfig 中讨论的其他器件

工具/软件:

您好:

我们正在设计一个使用 AM625处理器(具有1GIB DDR4)的定制电路板。 我当前的问题是、当内存大小配置为1GiB 时、尝试通过 TFTP 加载 tispl.bin 失败。 如果我将内存大小设置为2GiB (即使板上只有1GiB 器件)、则加载 tispl.bin 将成功。

切换到1GIB DRAM 的唯一更改是在器件树内存节点中(除了包括由 TI SysConfig 为我们的 DDR 器件生成的 DDR dtsi 外):

memory@80000000 {
		bootph-pre-ram;
		device_type = "memory";
		/* 2G RAM */
		reg = <0x00000000 0x80000000 0x00000000 0x80000000>;

	};

更改为:

memory@80000000 {
		bootph-pre-ram;
		device_type = "memory";
		/* 1G RAM */
		reg = <0x00000000 0x80000000 0x00000000 0x40000000>;

	};

tiboot3.bin 加载并开始执行、但在上挂起

Trying to boot from eth device
eth0: ethernet@8000000port@1

内存大小设置为2GiB (但仅存在1GiB)时、加载工作正常...

Trying to boot from eth device
eth0: ethernet@8000000port@1
thernet@8000000port@1 Waiting for PHY auto negotiation to complete.... done
link up on port 1, speed 100, full duplex
BOOTP broadcast 1
Using ethernet@8000000port@1 device
TFTP from server 10.0.0.1; our IP address is 10.0.0.3
Filename 'tispl.bin'.
Load address: 0x82000000
Loading: #################################################################
	 #################################################################
	 #####################################################  0 Bytes
	 1.2 MiB/s
done
Bytes transferred = 935411 (e45f3 hex)

(请注意、这仍然包括我们自定义的 DDR 配置 dtsi 文件)

我已经追踪了崩溃到 pktdma_tisci_rx_channel_config ()( k3-uvada.c )中对 uma_alloc_rchan_raw ()的调用,特别是行:

int tc_ring = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);

我已经浏览了设备树中的 pktdma 配置、但我看不到需要更改的任何内容以适应更小的 DDR 大小。 是否需要进行其他更改?

谢谢、
Ben

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

    您好 Ben、  

    您使用的是哪个 Linux SDK 版本?

    Unknown 说:
    我已经浏览了设备树中的 pktdma 配置、但我看不到需要更改以适应更小的 DDR 大小的任何内容。 是否需要进行其他更改?

    根据我的理解、除了您对存储器节点所做的更改外、我认为不应该对器件树本身进行其他更改。

    在 tiboot3.bin 加载后、当内存大小从2GB 更改为更小的内存时、TFTP 也会出现类似的问题。 要尝试的一点是注释掉第126行、并将第140行更改为下面的行。 我个人没有机会尝试它以前,但觉得可以尝试它,看看它是否会改变。 如果您有后续问题、请告诉我。

    第126行参考: https://git.ti.com/cgit/ti-u-boot/ti-u-boot/tree/drivers/dma/ti/k3-udma-u-boot.c?h=ti-u-boot-2025.01#n126

    行140参考: https://git.ti.com/cgit/ti-u-boot/ti-u-boot/tree/drivers/dma/ti/k3-udma-u-boot.c?h=ti-u-boot-2025.01#n140 

    		rxcq_num = k3_nav_ringacc_get_ring_id(uc->tchan->tc_ring);

    -道林

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

    您好、Daolin、

    感谢您的答复。 您的建议已解决 DMA 问题、但现在我得到了:

    TFTP error: trying to overwrite reserved memory...

    我已经研究过这一点,它似乎是因为 arch_LMB_reserve_generic ()逻辑保留当前栈指针以北的所有内容。 令我感到困惑的是,这与我的内存配置设置为2GiB,但我的调试表明,这实际上是工作的时候,它不应该。 在 LMB.c 中的 LMB_get_free_size()中出现问题(不确定确切的行号、因为我添加了调试代码):

    if (lmb->reserved.region[i].base +
        lmb->reserved.region[i].size > addr) {...}

    对于我的1GiB 配置、此检查正确地报告 TFTP 加载地址0x82000000位于保留区域中。 但是、对于2GB 配置、计算会溢出、这意味着检查变为

    if (0 > 0x82000000) {...}

    例如,在我的1GiB 配置中,arch_LMB_reserve_generic ()从0x81ffbc58获取0x3e0043a8字节的所有数据(到 RAM 的末尾0xC0000000 )。 使用2GB 配置时、从0x7e0043a8的0x81ffbc58到 RAM 末尾的0x1000000000都需要处理。 因此在上述检查中、0x81ffbc58的基址加上0x7e0043a8的大小溢出32位支持类型。

    我对 U-Boot 中的 TFTP 不太熟悉-是否有一些配置选项会在调用 arch_LMB_reserve_generic ()之前为 TFTP 使用开辟一块内存?

    谢谢、
    Ben

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

    只是为了添加一个小的更新...


    我已经确认这在原则上是有效的,方法是更改 arch_LMB_reserve_generic()以在堆栈指针的末尾添加一个10MiB 缓冲区,然后再进行保留。 这样、TFTP 传输就可以正常工作。 这不是一个永久性的解决办法、但至少表明没有其他问题。

    我不清楚的是应该如何正确地解决这个问题?

    以下链接的补丁手册中对此进行了一些引用:
    https://lore.kernel.org/all/af6aa5cd-7cc1-7954-9c54-8699ec3bb178@gmail.com/T/ 
    https://patchwork.ozlabs.org/project/uboot/patch/20190114213823.32486-10-simon.k.r.goldschmidt@gmail.com/

    谢谢、
    Ben

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

    您好 Ben、  

    由于我在过去两天里被其他一些任务所耽搁、因此对延误表示歉意。  

    我对 U-Boot 中的 TFTP 不太熟悉-在调用 arch_LMB_reserve_generic()之前、是否有一些配置选项会为 TFTP 使用开辟一块内存?

    我对 U-boot 中的 TFTP 也不是很了解、在快速浏览/net/tftp.c 代码后、似乎没有什么东西可以使指定的内存段用于 TFTP、尽管我还没有研究您提到的"arch_LMB_reserve_generic()"。

    [引述 userid="612467" url="~/support/processors-group/processors/f/processors-forum/1497680/am625-reducing-ddr-size-causes-u-boot-r5-spl-to-crash-during-ethernet-boot/5755976 #5755976"]

    我已经确认这在原则上是有效的,方法是更改 arch_LMB_reserve_generic()以在堆栈指针的末尾添加一个10MiB 缓冲区,然后再进行保留。 这样、TFTP 传输就可以正常工作。 这不是一个永久性的解决办法、但至少表明没有其他问题。

    我不清楚的是应该如何正确地解决这个问题?

    [/报价]

    这可能是一个 U-boot 源代码问题、而不是特定于 TI 驱动程序的问题、尤其是考虑到您找到的补丁也引用了相同的 TFTP 错误。 请注意、除了 TI 驱动程序特定问题(例如 U-boot 源代码)之外、我们还无法提供有关如何正确解决问题的建议。  

    现在、似乎至少有一种方法可以使 TFTP 传输正常工作。 如果我有时间,我可能会试着再看看这个星期五。 如果您在此期间有任何后续问题、请告诉我。  

    -道林

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

    您好、Daolin、

    感谢您的更新。

    您是否设法进一步了解了这一点?

    我同意问题是由我引用的补丁引起的、但在存储器开始加载 U-Boot 并设置 CONFIG_LMB 时、我无法真正找到任何参考、说明它们如何在 SPL 中实现 TFTP (或类似内容、例如 wget)。  最终、 SPL 中的 TFTP 不应用于 TI 的评估板配置-它是存储器控制器基地址和具有2GiB DRAM 的电路板的组合、这会导致在 R5 32位环境中的计算溢出、从而使其能够正常工作。 这 就像是一个安全问题、因为它绕过了我提到的修补程序中添加的功能、这些修补程序是响应 CVE 而创建的。

    此行为(U-Boot SP 以北的 RAM 被保留)仅在设置 CONFIG_LMB 时发生。 从存储器中(我看过这个内容已经有几天了)、这最终来自编译中的`bootm`命令支持。 由于 R5 SPL 仅加载 A53 SPL、能否将其从 U-Boot R5 SPL 构建中删除? 同样、对于内存、当我查看它时、我不确定是否可能、因为 TI 似乎使用适合的映像格式来加载其他 TI 固件(因此需要 bootm 命令)。

    谢谢、
    Ben

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

    您好 Ben、  

    此行为(保留 U-Boot SP 以北的 RAM)仅在设置 CONFIG_LMB 时发生。 从存储器中(我看过这个内容已经有几天了)、这最终来自编译中的`bootm`命令支持。 由于 R5 SPL 仅加载 A53 SPL、能否将其从 U-Boot R5 SPL 构建中删除?

    感谢您登记入住。 不幸的是,我无法更仔细地了解周五。 我尝试联系一位更熟悉 U-boot 内存分配 问题的同事、因为我承认、说到 U-boot 阶段的内存分配方面、我不太熟悉(但我将在此过程中向您学习)。  

    我明天会回来提供更新。

    -道林

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

    您好 Ben、  

    我仍在等待同事的答复。 不过、我收到了反馈、认为 SDK 11.0 https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX SDK-AM62X 应该解决了与 CONFIG_LMB 相关的问题。 我没有尝试过、但想让您知道、以防您发现它值得进行测试、看看它是否能解决此问题。

    请告诉我您是否能够试用、以及它是否解决了问题。

    -道林

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

    您好、Daolin、

    感谢您的更新、很抱歉我迟到了。

    从 SDK 11.0迁移到 U-Boot 2025.01确实会修复该问题、因为这样可以消除对 CONFIG_LMB 的依赖。

    不过、需要注意的是、您上面为 k3-UDMA-u-boot.c 提供的修复程序未包含在内、对我来说这不是问题、因为我有 Yocto 将这些更改作为补丁应用、但我建议 TI 应考虑在其主线中包含此修复程序。

    谢谢、
    Ben

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

    您好 Ben、  

    很高兴听到迁移到 SDK 11.0解决了该问题、感谢您的确认。

    不过请注意、上面为 k3-UDMA-u-boot.c 提供的修复不是问题、因为我有 Yocto 将更改作为补丁应用、但我建议 TI 考虑将此修复程序包含在其主线中。

    感谢您的注意、我认为 SDK 11.0不需要我为 k3-UDMA-u-boot.c 提供的破解、只需在 A53 defconfig 中应用 CONFIG_SYS_MEM_TOP_HIDE=0x4000000。 当我测试时、这是最终使以太网启动(将 RAM 减少到512MB)与 SDK 11.0协同工作的原因。

    -道林

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

    谢谢你 Daolin、这是很好的了解;我将在下周尝试一下、并希望删除补丁。

    谢谢、
    Ben