こんにちは、
私はLS1046Aをベースにしたカスタムボードを開発しているのですが、FlexBuildで生成したDebianイメージで起動時に問題が発生しています。
まず最初のステップとして、デフォルトのLS1046AFRWY BSPを一切変更せずにビルドし、自作の基板上でテストしました。カーネル起動中に、以下の出力後にシステムが必ずハングアップします。
PSCI:DTからの導管方法のプロービング。
カーネルパニックや例外は発生せず、システムはこの時点で停止する。
以下のNXPフォーラムのThreadで非常に似た問題を説明しているのを見つけました:
https://community.nxp.com/t5/Layerscape/LS1043A-RDB-Linux-Hangs-At-PSCI/td-p/750075
一時的な回避策として、以下のコマンドを使ってU-Bootから手動でLinuxを起動できます。しかし、カーネルは、ブート引数「mem=」を使用して使用可能なメモリを1982MBに制限した場合にのみ正常に起動します。この値を増やすと、カーネルが再びハングアップします(起動中の異なるタイミングで発生することもあります)。
mmc dev 0
パートUUID mmc 0:3 パートUUIDr
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)を使って完全に新しいBSPを作成し、同じハードウェアでテストしました。
結果は全く同じだ。カーネルは再び出力後にハングアップします。
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の最上位から約10MiB引いた領域付近で、サイズは最大2MiBです。
Linuxが4GBのDDRマップで起動すると、BL31のリージョンと物理的に重なるページが割り当てられます。最初の PSCI SMC 呼び出し ( psci_get_version ) が、すでに破損したメモリにジャンプし、システムはハングアップします。パニックも例外もなく、ただ沈黙するだけです。
bdinfoの出力は正確なパターンを確認しています。DDR バンク 1 は0x8FFFFFFFFで終了し、BL31 は約RAM_END - 10 MiB = 0x8FF600000にあります。
| DDR銀行 | スタート | 終了 | 備考 |
|---|---|---|---|
| バンク0 | 0x80000000 |
0xFBDFFFFF |
~1982 MiB —作業mem=制限 |
| バンク1 | 0x880000000 |
0x8FFFFFFFF |
2 GB 高銀行 — BL31 はここに住んでいます |
mem=1982Mの回避策はLinuxをバンク0内に留め、BL31が存在するバンク1には一切触れません。これがまさに機能する理由です。
正しい恒久的な解決策は、DTSに reserved-memory ノードを追加 し、BL31のリージョンをLinuxのメモリ割り当てでタブリングにすることです。
ATFビルド構成を確認してください( plat/nxp/soc-ls1046a/.../platform_def.h )BL31_BASEとBL31_SIZEについて。FRWY BSPを搭載したLSDK/lf-6.xの場合、一般的な配置は以下のとおりです。
BL31_BASE = 0x8FF80000 (top of high DDR bank minus ~512 KB to 2 MB)
BL31_SIZE = max 2 MiB
実行時にU-Bootの出力や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は正しく機能します。
よろしくお願いします。