你好,
我正在开发一款基于 LS1046A 的定制板,在使用 FlexBuild 生成的 Debian 镜像时遇到了启动问题。
首先,我版本了默认的 LS1046AFRWY 电路板支持包。没有做任何修改,并在我的定制板上进行了测试。内核启动过程中,系统总是在打印以下内容后挂起:
psci:从DT探测导管方法。
没有内核崩溃或异常;系统就此停止运行。
我在NXP论坛上找到了一个描述类似问题的帖子:
https://community.nxp.com/t5/Layerscape/LS1043A-RDB-Linux-Hangs-At-PSCI/td-p/750075
作为临时解决方案,我可以使用以下命令从 U-Boot 手动启动 Linux。但是,只有当我使用“mem=”启动参数将可用内存限制为 1982 MB 时,内核才能成功启动。如果我增加这个值,内核又会挂起(有时在启动过程中的不同阶段)。
mmc dev 0
部分 uuid mmc 0:3 partuuidr
加载 mmc 0:1 0x81000000 图像
加载mmc 0:1 0x90000000 fsl-ls1046a-frwy-sdk.dtb
setenv bootargs "console=ttyS0,115200 earlycon=uart8250,mmio,0x21c0500 root=PARTUUID=${partuuidr} rw rootwait mem=1982M"
booti 0x81000000 - 0x90000000
测试环境:
为了排除 FlexBuild 特有的问题,我还使用 Yocto (YP 6.0 / lf-6.18.20) 构建了一个全新的 电路板支持包。,并在相同的硬件上进行了测试。
结果完全相同。内核在打印以下内容后再次挂起:
psci:从DT探测导管方法。
下面显示的是bdinfo输出的相关部分:
动态随机存取存储器\(DRAM\) 存储体 0
动态随机存取存储器\(DRAM\) 存储体 1
LMB 内存区域:
内存[0] :0x80000000 - 0xfbdfffff
内存[1] :0x880000000 - 0x8ffffffff
保留[0] : 0xfac154c0 - 0xfbdfffff
保留[1] : 0x8ffff5000 - 0x8ffffffff
有没有人遇到过类似的问题?或者有什么建议,让我接下来应该调查哪些方面?
任何建议都将不胜感激。
你好,
LS1046A 的启动流程如下:
Boot ROM → BL2 (DDR Init) → BL31 (stays resident in DRAM) → U-Boot → Linux
BL31 永久驻留在 动态随机存取存储器\(DRAM\) 中,并处理所有 SMC 调用(PSCI: psci_get_version 、CPU 开/关等)。它的典型位置在RAM 顶部减去约 10 MiB 的位置,大小可达2 MiB 。
当 Linux 使用完整的 4 GB DDR 映射启动时,它会分配与 BL31 区域物理重叠的页面。第一次 PSCI SMC 调用( psci_get_version )跳转到已损坏的内存,系统挂起——没有恐慌,没有异常,只有寂静。
您的bdinfo输出证实了确切的模式——DDR Bank 1 结束于0x8FFFFFFFF ,而 BL31 大约位于RAM_END - 10 MiB = 0x8FF600000 :
| DDR银行 | 开始 | 结束 | 说明 |
|---|---|---|---|
| 银行 0 | 0x80000000 |
0xFBDFFFFF |
~1982 MiB —您的工作mem=限制 |
| 银行 1 | 0x880000000 |
0x8FFFFFFFF |
2 GB 高位银行——BL31 位于此处 |
mem=1982M变通方法使 Linux 保持在 Bank 0 内,永远不会触及 BL31 所在的 Bank 1——这正是它有效的原因。
正确的永久解决方法是在 DTS 中添加一个reserved-memory节点,将 BL31 区域标记为 Linux 内存分配器禁止访问。
检查您的 ATF 版本配置( plat/nxp/soc-ls1046a/.../platform_def.h )对于BL31_BASE和BL31_SIZE 。对于采用 FRWY 电路板支持包。的 LSDK/lf-6.x,典型的安装位置如下:
BL31_BASE = 0x8FF80000 (top of high DDR bank minus ~512 KB to 2 MB)
BL31_SIZE = max 2 MiB
您可以通过检查 U-启动 输出或 ATF 版本日志中的 BL31: v2.x... Entry point address = ... 。
在您的板级 DTS 文件(基于fsl-ls1046a-frwy-sdk.dts )中添加:
/ {
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
/* Reserve BL31 runtime region — adjust addresses to match your ATF build */
bl31_reserved: bl31@8ff600000 {
reg = <0x8 0xff600000 0x0 0x00200000>; /* 2 MiB at RAM_END - 10 MiB */
no-map;
};
};
};
调整
0x8ff600000和大小0x200000,以匹配 ATF 版本中的实际 BL31 加载地址。
添加预留信息后,重新构建 DTB 并启动,无需mem=变通方法。内核将跳过该区域,BL31 保持不变,PSCI 将正常工作。
此致