NXPエキスパートの皆様、こんにちは。
コミュニティ全体を検索しましたが、満足のいく答えは見つかりませんでした。
以下はNXPのLinux 6.12のimx8mp.dtsiの予約メモリノードです。
予約メモリ {
#アドレスセル = <2>;
#size-cells = <2>;
範囲;
/*
* optee の使用のために予約されたメモリ。使用しないでください。
* OP-TEE がインストールされている場合は、これが dtb に自動的に追加されます。
* optee@56000000 {
* reg = <0 0x56000000 0 0x2000000>;
* マップなし;
* };
*/
/* 連続した割り当てのためのグローバル自動構成領域 */
Linux、cma {
compatible = "共有DMAプール";
再利用可能
サイズ = <0 0x3c000000>;
割り当て範囲 = <0 0x40000000 0 0xC0000000>;
linux、cma-デフォルト;
};
GPU予約済み: GPU予約済み@100000000 {
マップなし;
レジスタ = <0x1 0x00000000 0 0x10000000>;
};
dsp_reserved: dsp@92400000 {
レジスタ = <0 0x92400000 0 0x1000000>;
マップなし;
};
dsp_reserved_heap: dsp_reserved_heap@93400000 {
レジスタ = <0 0x93400000 0 0xef0000>;
マップなし;
};
dsp_vdev0vring0: vdev0vring0@942f0000 {
レジスタ = <0 0x942f0000 0 0x8000>;
マップなし;
};
dsp_vdev0vring1: vdev0vring1@942f8000 {
レジスタ = <0 0x942f8000 0 0x8000>;
マップなし;
};
dsp_vdev0バッファ: vdev0バッファ@94300000 {
compatible = "共有DMAプール";
レジスタ = <0 0x94300000 0 0x100000>;
マップなし;
};
};
1.2GB/4GB/8GB DDR サイズの i.MX8MP の reserved-memory/linux,cma/size と reserved-memory/linux,cma/alloc-ranges を調整するにはどうすればよいでしょうか?(サイズ(960MB)は2GB DDRには大きすぎること、割り当て範囲も2GB DDRの範囲外であることは明らかです)
2.linux,cma/size と linux,cma/alloc-ranges を除いて、DDR サイズ 2GB/4GB/8GB に応じて変更する必要がある他のプロパティはありますか?
3. gpu_reserved ノードの reg が 2GB ddr の範囲外であることは明らかですが、どのように変更すればよいでしょうか?
NXP の linux6.12 arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl.dts で、reserved-memory/linux,cma/size&alloc-ranges が変更されていることがわかります。
予約メモリ {
#アドレスセル = <2>;
#size-cells = <2>;
範囲;
/* 連続した割り当てのためのグローバル自動構成領域 */
Linux、cma {
compatible = "共有DMAプール";
再利用可能
サイズ = <0 0x38000000>;
割り当て範囲 = <0 0x40000000 0 0xB0000000>;
linux、cma-デフォルト;
};
};
4.この変更のきっかけは何ですか?これは DDR サイズの違いによるものでしょうか?
また、NXP の Linux 6.12 arch/arm64/boot/dts/freescale/imx8mp-evk-root.dts では、node/reserved-memory がさらに変更されていることにも気付きました。
&{/予約メモリ} {
jh_reserved: jh@fdc00000 {
マップなし;
レジスタ = <0 0xfdc00000 0x0 0x400000>;
};
loader_reserved: loader@fdb00000 {
マップなし;
レジスタ = <0 0xfdb00000 0x0 0x00100000>;
};
ivshmem_reserved: ivshmem@fda00000 {
マップなし;
reg = <0 0xfda00000 0x0 0x00100000>;
};
ivshmem2_reserved: ivshmem2@fd900000 {
マップなし;
reg = <0 0xfd900000 0x0 0x00100000>;
};
pci_reserved: pci@fd700000 {
マップなし;
レジスタ = <0 0xfd700000 0x0 0x00200000>;
};
受刑者予約: 受刑者@c0000000 {
マップなし;
レジスタ = <0 0xc0000000 0x0 0x3d700000>;
};
};
&{/予約メモリ/linux,cma} {
サイズ = <0 0x28000000>;
割り当て範囲 = <0 0x40000000 0 0x60000000>;
};
5. 新しく追加されたノード jh_reserved/loader_reserved/ivshmem_reserved/ivshmem2_reserved/pci_reserved/inmate_reserved はどのような状況で使用する必要がありますか?
上記の疑問について詳しく説明してください。
こんにちは、ホルヘ・カスさん。
ご協力誠にありがとうございます。Quction6についてはまだ疑問があります。
2GB/4GB/8GB DDR を搭載したカスタム imx8mp ボード (6GB DDR を搭載した imx8mpevk ボードに基づく) では、異なる DDR サイズの各ボードごとに個別の u-boot.imx があり、linux6.12 ソース コードの imx8mp-evk.dts から次の ' memory@40000000' ノードを変更せずに保持します。
メモリ@40000000 {
device_type = "メモリ";
レジスタ = <0x0 0x40000000 0 0xc0000000>,
<0x1 0x00000000 0 0xc0000000>; //3GB+3GB=6GB
};
そして、弊社の imx8mp ボードは正常に動作します。また、彼らは一晩のテストに合格することもできます。
以下は 4GB DDR を搭載した imx8mp ボードです。
root@router:/#無料
使用可能な使用済み無料共有バフ/キャッシュの合計
Mem: 3686580 159528 2914044 19536 613008 3458156 // 4GB DDR の場合、合計 3686580 KB を認識するのが妥当です。
スワップ: 0 0 0
root@router:/# /プレスリリース、製品ニュース/MCB2/memtester 3G
memtester バージョン 4.3.0 (32 ビット)
著作権 (C) 2001-2012 Charles Cazabon。
GNU General Public License バージョン 2 (のみ) に基づいてライセンスされます。
ページサイズは4096です
ページサイズマスクは0xfffff000です
3072MB(3221225472バイト)必要
3072MB (3221225472 バイト) を取得しました。mlock を試行しています...ロックされました。
ループ1:
スタックアドレス: テスト3[3326.210063] clean_cache.sh (100707): drop_caches: 1
[ 3326.277139] clean_cache.sh (100707): drop_caches: 2
[ 3326.316299] clean_cache.sh (100707): drop_caches: 3
わかりました
ランダム値: OK
XOR比較: OK
比較SUB:OK
MULを比較: OK
DIVを比較: OK
比較OR:OK
ANDを比較: OK
順次増分: OK
ソリッドビット:OK
ブロックシーケンシャル:OK
チェッカーボード:OK
ビットスプレッド:OK
... // 一晩のテストでは問題は見つかりませんでした。
4GB DDRデバイスのカーネル起動段階のメモリ情報は次のとおりです。
[ 0.000000] マシンモデル: NXP i.MX8MPlus EVKボード
[ 0.000000] efi: UEFI が見つかりません。
[ 0.000000] 予約メモリ: 0x00000000c4000000 に CMA メモリプールを作成しました。サイズは 960 MiB です。
[ 0.000000] OF: 予約済みメモリ: 初期化されたノード Linux、cma、互換ID 共有DMAプール
[ 0.000000] OF: 予約済みメモリ: 0x00000000c4000000..0x00000000ffffffff (983040 KiB) マップ再利用可能 Linux,cma
[ 0.000000] OF: 予約済みメモリ: 0x0000000057c00000..0x0000000057ffffff (4096 KiB) nomap 再利用不可 optee_shm@0x57c00000
[ 0.000000] OF: 予約済みメモリ: 0x0000000056000000..0x0000000057bfffff (28672 KiB) nomap 再利用不可 optee_core@0x56000000
[ 0.000000] OF: 予約済みメモリ: 0x0000000100000000..0x000000010ffffffff (262144 KiB) nomap 再利用不可 gpu_reserved@100000000
[ 0.000000] OF: 予約済みメモリ: 0x0000000092400000..0x00000000933fffff (16384 KiB) nomap 再利用不可 dsp@92400000
[ 0.000000] OF: 予約済みメモリ: 0x0000000093400000..0x00000000942effff (15296 KiB) nomap 再利用不可 dsp_reserved_heap@93400000
[ 0.000000] OF: 予約済みメモリ: 0x00000000942f0000..0x00000000942f7fff (32 KiB) nomap 再利用不可 vdev0vring0@942f0000
[ 0.000000] OF: 予約済みメモリ: 0x00000000942f8000..0x00000000942fffff (32 KiB) nomap 再利用不可 vdev0vring1@942f8000
[ 0.000000] 予約メモリ: 0x0000000094300000 に DMA メモリプールを作成しました。サイズは 1 MiB です。
[ 0.000000] OF: 予約済みメモリ: 初期化されたノード vdev0buffer@94300000、互換性のあるIDは共有DMAプール
[ 0.000000] OF: 予約済みメモリ: 0x0000000094300000..0x00000000943fffff (1024 KiB) nomap 再利用不可 vdev0buffer@94300000
[ 0.000000] NUMA: [mem 0x0000000040000000-0x000000013fffffff] でノードを偽装しています
[ 0.000000] NODE_DATA(0) 割り当て済み [mem 0x13f84a840-0x13f84d3bf]
[ 0.000000] ゾーン範囲:
[ 0.000000] DMA [メモリ 0x0000000040000000-0x00000000ffffffff]
[ 0.000000] DMA32 空
[ 0.000000] 正常 [メモリ 0x0000000100000000-0x000000013ffffffff]
[ 0.000000] 各ノードの移動可能ゾーンの開始
[ 0.000000] 初期メモリノード範囲
[ 0.000000] ノード 0: [メモリ 0x0000000040000000-0x0000000055ffffff]
[ 0.000000] ノード 0: [メモリ 0x0000000058000000-0x00000000923fffff]
[ 0.000000] ノード 0: [メモリ 0x0000000092400000-0x00000000943fffff]
[ 0.000000] ノード 0: [メモリ 0x0000000094400000-0x00000000ffffffff]
[ 0.000000] ノード 0: [メモリ 0x0000000100000000-0x000000010fffffff]
[ 0.000000] ノード 0: [メモリ 0x0000000110000000-0x000000013ffffffff]
[ 0.000000] 初期化メモリ セットアップ ノード 0 [メモリ 0x0000000040000000-0x000000013fffffff]
[ 0.000000] ノード0のゾーンDMA: 使用できない範囲に8192ページ
1.実際には 4GB DDR デバイスの memory@40000000 ノードの6GB reg 構成によって発生した不合理なログを特定できますか?
2.SO、カーネルはDTSのmemory@40000000/reg構成のみに基づいてメモリ範囲を計算しているのではなく、U-BootからATAGを介してカーネルに渡される実際の物理メモリサイズと合わせて、包括的にメモリ範囲を決定しているのではないかと推測しています。つまり、2GB/4GB/8GBのメモリ構成ごとに別々のDTBファイルを用意する必要はないのではないかと考えています。この点についてご確認いただけますでしょうか?
改めて感謝申し上げます。
こんにちは、
1.
デバイス ツリー内の予約済みメモリ ノードを調整するための具体的なドキュメントはありません。これらの値は DDR サイズとアプリケーションによって異なるためです。唯一の制限は、リファレンス マニュアルのメモリ マップに記載されているように、各モジュールに割り当てられた最大メモリ領域になります。
BSP のデフォルトの CMA サイズは 960 MB CAN が、2GB DDR の場合、960 MB は大きすぎるため、CMA を 256 MB ~ 512 MB 程度に減らすのが一般的です。有効な DDR スペースでの割り当てに重点を置く必要があります。
2.
追加のプロパティを追加する必要はありません。
3.
設計で使用可能なサイズに応じて各ノードを再編成できます。例:
gpu_reserved: gpu_reserved@70000000 {
no-map;
reg = <0 0x70000000 0 0x10000000>;
};
他も同様です。
4.
このデバイス ツリーは、ハイパーバイザーの予約済みメモリに使用されます。
5.
これらのノードは Jailhouse/PCIe/仮想化に使用されますが、使用しない場合はこれらのノードを省略できます。
詳細については、このドキュメントをCAN参照できます。
6.
はい、各 DDR サイズに一致するはずです。
よろしくお願いいたします。
質問6:(追加 )
メモリ@400000000ノード(arch/arm64/boot/dts/freescale/imx8mp-evk.dts内)のregプロパティはDDR容量(2GB/4GB/8GB)に応じて変更する必要がありますか?
メモリ@40000000 {
device_type = "メモリ";
レジスタ = <0x0 0x40000000 0 0xc0000000>,
<0x1 0x00000000 0 0xc0000000>;
};
はいの場合、異なる DDR サイズのカスタム i.MX8MP ボードには個別の DTB ファイルが必要であることを意味しますか?
事前に考えます!
こんにちは、
情報ありがとうございます。
1.
エラーや警告などの重大なログはなく、カーネルは U-boot から利用可能なメモリ範囲を使用するだけです。
2.
カーネルでは U-boot と DTS の両方の構成が使用されます。
デバイス ツリーでは、物理メモリが十分でない場合でも仮想メモリをさらに割り当てることができますが、RAM の使用量が多いとシステムがクラッシュする可能性があります。
よろしくお願いいたします。
こんにちは、
社内チームに確認しました。
U-boot 構成には、使用可能な物理 DDR メモリに関する正しいデータが含まれていますが、DTS 予約メモリ ノードもカーネルに渡されます。あなたのCASE、ノードにさらに仮想メモリを割り当てることができますが、物理予約メモリをすべて使い切ると、使用可能なメモリがないためエラーが発生し、物理アドレスが存在しない、または他のモジュールによって使用される可能性があるためにリソースの問題が発生します。
予約メモリを各ボードに適合させる必要があります。おっしゃるとおり、これは機能しますが、RAM の使用量が多い場合は、エラーやカーネル パニックが発生する可能性があります。
前回の返信を訂正させていただきます。
よろしくお願いいたします。