jetson-optimize-memory

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

jetson-optimize-memory

Jetson内存优化

Memory is reserved across four layers ordered by boot chronology (higher row = earlier in boot, closer to hardware):
LayerContentKey files
MB1 BCTfirmware carveoutsper-module misc DTS
MB2 BCTfirmware loading + AST controlsper-module misc DTS
Kernel DTSreserved-memory and driver bindingper-module DTS
SWIOTLBDMA bounce pool size
<module>.conf.common
(
CMDLINE_ADD
)
Critical rules:
  • Only the scenarios in Scenario recipes are validated. Refuse any request to disable a carveout/cluster/node not in that table.
  • Zeroing a carveout requires both: disabling the cluster's loading controls AND removing the AST that references it.
  • Emit explicit overrides for every cluster in the recipe, regardless of how the source
    #ifdef
    /
    #else
    looks. Verify the merged binary.
  • GPU SW stack must match the chip: T234 -> nvgpu, T264 and later -> OpenRM. Follow the shared derived-platform rule in
    target-platform-contract.md
    ; stop on mismatches instead of guessing.
  • Do not set SWIOTLB to 0 — some peripherals can't use the IOMMU.

内存会按启动时序分为四层进行预留(行数越靠上,启动阶段越早,越接近硬件):
层级内容关键文件
MB1 BCT固件内存划分各模块misc DTS
MB2 BCT固件加载 + AST控制各模块misc DTS
Kernel DTS保留内存与驱动绑定各模块DTS
SWIOTLBDMA bounce池大小
<module>.conf.common
CMDLINE_ADD
关键规则:
  • 仅验证场景方案中列出的场景。拒绝任何禁用方案表格之外的内存划分/集群/节点的请求。
  • 清空内存划分需同时执行两项操作:禁用集群的加载控制 AND 删除引用它的AST。
  • 为方案中的每个集群添加显式覆盖配置,无论源文件中的
    #ifdef
    /
    #else
    结构如何。请验证合并后的二进制文件。
  • GPU软件栈必须与芯片匹配:T234 → nvgpu,T264及之后的芯片 → OpenRM。遵循
    target-platform-contract.md
    中的共享派生平台规则;若不匹配则停止操作,不要猜测。
  • 请勿将SWIOTLB设置为0 — 部分外设无法使用IOMMU。

Scenario recipes

场景方案

KeywordMB1 BCT carveoutsMB2 BCTKernel DTS
headless
DCE-family (see chip table)DCE
auxp_controls
+ DCE AST(s)
display@<addr>
(and
dce@<addr>
if exposed) → disabled
no-camera
RCE/VI/ISP-familyRCE
auxp_controls
(each instance) + RCE AST(s)
recommended: VI/ISP/NVCSI → disabled
关键词MB1 BCT内存划分MB2 BCTKernel DTS
headless
DCE系列(见芯片表格)DCE
auxp_controls
+ DCE AST(s)
display@<addr>
(若
dce@<addr>
暴露则同时包含)→ 禁用
no-camera
RCE/VI/ISP系列RCE
auxp_controls
(每个实例) + RCE AST(s)
推荐:VI/ISP/NVCSI → 禁用

Chip-specific carveouts

芯片专属内存划分

ScenarioT234 (Orin)T264 (Thor)
headless
CARVEOUT_BPMP_DCE
,
CARVEOUT_DCE
,
CARVEOUT_DCE_TSEC
,
CARVEOUT_TSEC_DCE
,
CARVEOUT_DISP_EARLY_BOOT_FB
CARVEOUT_DCE
,
CARVEOUT_TSEC_DCE
,
CARVEOUT_HPSE_DCE
,
CARVEOUT_DISP_EARLY_BOOT_FB
no-camera
CARVEOUT_RCE
,
CARVEOUT_CAMERA_TASKLIST
CARVEOUT_RCE
,
CARVEOUT_RCE1
,
CARVEOUT_RCE_RW
,
CARVEOUT_VI_TASKLIST
,
CARVEOUT_VI1_TASKLIST
,
CARVEOUT_ISP_TASKLIST
,
CARVEOUT_ISP1_TASKLIST
Post-boot:
headless
sudo systemctl set-default multi-user.target
.

场景T234(Orin)T264(Thor)
headless
CARVEOUT_BPMP_DCE
,
CARVEOUT_DCE
,
CARVEOUT_DCE_TSEC
,
CARVEOUT_TSEC_DCE
,
CARVEOUT_DISP_EARLY_BOOT_FB
CARVEOUT_DCE
,
CARVEOUT_TSEC_DCE
,
CARVEOUT_HPSE_DCE
,
CARVEOUT_DISP_EARLY_BOOT_FB
no-camera
CARVEOUT_RCE
,
CARVEOUT_CAMERA_TASKLIST
CARVEOUT_RCE
,
CARVEOUT_RCE1
,
CARVEOUT_RCE_RW
,
CARVEOUT_VI_TASKLIST
,
CARVEOUT_VI1_TASKLIST
,
CARVEOUT_ISP_TASKLIST
,
CARVEOUT_ISP1_TASKLIST
启动后操作:
headless
场景 →
sudo systemctl set-default multi-user.target

MB1 BCT carveout overrides

MB1 BCT内存划分覆盖配置

File:
Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb1-bct-misc-<module>.dts
(e.g.
tegra234-mb1-bct-misc-p3767-0000.dts
for Orin Nano,
tegra264-mb1-bct-misc-p3834-0008-p4071-0000.dts
for Thor).
For each carveout, add inside the existing
carveout
node:
dts
aux_info@<CARVEOUT_NAME> {
    pref_base = <0x0 0x0>;
    size      = <0x0 0x0>;
    alignment = <0x0 0x0>;
};

文件路径:
Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb1-bct-misc-<module>.dts
(例如,Orin Nano对应
tegra234-mb1-bct-misc-p3767-0000.dts
,Thor对应
tegra264-mb1-bct-misc-p3834-0008-p4071-0000.dts
)。
针对每个内存划分,在已有的
carveout
节点内添加:
dts
aux_info@<CARVEOUT_NAME> {
    pref_base = <0x0 0x0>;
    size      = <0x0 0x0>;
    alignment = <0x0 0x0>;
};

MB2 BCT cluster + AST overrides

MB2 BCT集群 + AST覆盖配置

File:
Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb2-bct-misc-<module>.dts
(includes
tegra<chip>-mb2-bct-common.dtsi
).
For each target cluster:
  1. Override
    auxp_controls@<index>
    :
    dts
    auxp_controls@<index> {
        enable_init    = <0>;
        enable_fw_load = <0>;
        enable_unhalt  = <0>;
    };
  2. /delete-node/ auxp_ast_config@<idx>;
Look up indices in
common.dtsi
:
auxp_controls@N
carries a comment naming its cluster;
auxp_ast_config@N
has
ast_region
children whose
carveout = <CARVEOUT_…>;
lines identify the owner.

文件路径:
Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb2-bct-misc-<module>.dts
(包含
tegra<chip>-mb2-bct-common.dtsi
)。
针对每个目标集群:
  1. 覆盖
    auxp_controls@<index>
    dts
    auxp_controls@<index> {
        enable_init    = <0>;
        enable_fw_load = <0>;
        enable_unhalt  = <0>;
    };
  2. 添加
    /delete-node/ auxp_ast_config@<idx>;
common.dtsi
中查找索引:
auxp_controls@N
带有注释说明其所属集群;
auxp_ast_config@N
ast_region
子节点包含
carveout = <CARVEOUT_…>;
行,用于标识所属内存划分。

Kernel DT reserved-memory

内核DT保留内存

sh
DTB=Linux_for_Tegra/kernel/dtb/<platform-dtb-name>.dtb
dtc -I dtb -O dts -o /tmp/platform.dts $DTB
sh
DTB=Linux_for_Tegra/kernel/dtb/<platform-dtb-name>.dtb
dtc -I dtb -O dts -o /tmp/platform.dts $DTB

edit: status = "disabled" on target nodes

编辑:将目标节点的status设置为"disabled"

dtc -I dts -O dtb -o $DTB /tmp/platform.dts

**Display** — disable `display@<addr>`, plus `dce@<addr>` if exposed as
a separate kernel node.

**Camera** — under `host1x@<addr>`, disable whichever of `vi*` / `isp*`
/ `nvcsi` exist on the BSP (only emit present nodes):

Locate the display controller node in the decompiled DTS and disable it.
The node's unit address is chip-specific — find it by `compatible` string
(e.g. `nvidia,tegra234-display`) rather than hard-coding the address.

```dts
host1x@<addr> {
    vi0@<addr>   { status = "disabled"; };
    vi1@<addr>   { status = "disabled"; };
    isp@<addr>   { status = "disabled"; };
    isp1@<addr>  { status = "disabled"; };
    nvcsi@<addr> { status = "disabled"; };
};

dtc -I dts -O dtb -o $DTB /tmp/platform.dts

**显示模块** — 禁用`display@<addr>`,若`dce@<addr>`作为独立内核节点暴露则同时禁用。

**摄像头模块** — 在`host1x@<addr>`下,禁用BSP中存在的`vi*` / `isp*` / `nvcsi`节点(仅对已存在的节点进行配置):

在反编译后的DTS中找到显示控制器节点并禁用。节点的单元地址是芯片专属的 — 通过`compatible`字符串(例如`nvidia,tegra234-display`)查找,而非硬编码地址。

```dts
host1x@<addr> {
    vi0@<addr>   { status = "disabled"; };
    vi1@<addr>   { status = "disabled"; };
    isp@<addr>   { status = "disabled"; };
    isp1@<addr>  { status = "disabled"; };
    nvcsi@<addr> { status = "disabled"; };
};

SWIOTLB DMA bounce pool

SWIOTLB DMA bounce池

The NVIDIA IOMMU covers peripheral DMA, so SWIOTLB is rarely used. Edit
CMDLINE_ADD
(never
CMDLINE
) in
Linux_for_Tegra/<module>.conf.common
:
sh
undefined
NVIDIA IOMMU覆盖了外设DMA,因此SWIOTLB很少被使用。 编辑
Linux_for_Tegra/<module>.conf.common
中的
CMDLINE_ADD
切勿修改
CMDLINE
):
sh
undefined

Total bytes = swiotlb_value × 2048; 4 MiB pool:

总字节数 = swiotlb_value × 2048;4 MiB池配置:

CMDLINE_ADD="... swiotlb=2048"

---
CMDLINE_ADD="... swiotlb=2048"

---

Override verification (mandatory)

覆盖配置验证(必填)

After every patched MB1/MB2 BCT
.dts
, reproduce the BSP's compile + decompile using the same
-D…
flags from
bct_flags.append(...)
in
bootloader/tegraflash_impl_t<chip>.py
:
sh
gcc -E -nostdinc -x assembler-with-cpp \
    -DENABLE_<FLAG_1> -DENABLE_<FLAG_2> \
    -I bootloader -I bootloader/generic/BCT \
    -o /tmp/cpp.dts <patched-bct.dts>
dtc -q -I dts -O dtb -o /tmp/cpp.dtb /tmp/cpp.dts
dtc -q -I dtb -O dts /tmp/cpp.dtb | less
Confirm in the merged output:
  • Each zeroed
    aux_info@<NAME>
    (or
    aux_info@<id>U
    post macro expansion) has
    size = <0x0 0x0>
    and
    pref_base = <0x0 0x0>
    .
  • Each disabled
    auxp_controls@<idx>
    has all three
    enable_*
    fields
    <0>
    .
  • Each
    /delete-node/
    'd
    auxp_ast_config@<idx>
    is absent.

在每次修改MB1/MB2 BCT的
.dts
文件后,使用
bootloader/tegraflash_impl_t<chip>.py
bct_flags.append(...)
的相同
-D…
参数,重现BSP的编译+反编译流程:
sh
gcc -E -nostdinc -x assembler-with-cpp \
    -DENABLE_<FLAG_1> -DENABLE_<FLAG_2> \
    -I bootloader -I bootloader/generic/BCT \
    -o /tmp/cpp.dts <patched-bct.dts>
dtc -q -I dts -O dtb -o /tmp/cpp.dtb /tmp/cpp.dts
dtc -q -I dtb -O dts /tmp/cpp.dtb | less
在合并后的输出中确认:
  • 每个被清空的
    aux_info@<NAME>
    (或宏展开后的
    aux_info@<id>U
    )的
    size = <0x0 0x0>
    pref_base = <0x0 0x0>
  • 每个被禁用的
    auxp_controls@<idx>
    的三个
    enable_*
    字段均为
    <0>
  • 每个被
    /delete-node/
    删除的
    auxp_ast_config@<idx>
    不存在。

Verification (on booted target)

启动后验证

sh
sudo cat /proc/iomem | grep -iE 'nv-reserved|cma|fb|carveout'
ls /proc/device-tree/reserved-memory/
dmesg | grep -iE 'firmware|carveout|bpmp|reserved|fail|error' | head -20
free -m
ScenarioSysfsdmesg grep
Display off
ls /sys/class/drm/
(empty)
tegra-drm|nvdisplay|dce|host1x|fb0
Camera off
ls /dev/video* 2>/dev/null
(none)
rce|nvcsi|tegra-camera|vi0|vi1|isp
SWIOTLB shrink
cat /sys/kernel/debug/swiotlb/io_tlb_nslabs
matches cmdline
swiotlb
For SWIOTLB:
/proc/cmdline
must contain
swiotlb=<value>
, and
watch -n5 cat /sys/kernel/debug/swiotlb/io_tlb_used
must stay under
io_tlb_nslabs
during full workload — if exceeded, restore original
CMDLINE_ADD
and re-flash
kernel-dtb
.
sh
sudo cat /proc/iomem | grep -iE 'nv-reserved|cma|fb|carveout'
ls /proc/device-tree/reserved-memory/
dmesg | grep -iE 'firmware|carveout|bpmp|reserved|fail|error' | head -20
free -m
场景Sysfs验证dmesg过滤关键词
显示关闭
ls /sys/class/drm/
(无输出)
tegra-drm|nvdisplay|dce|host1x|fb0
摄像头关闭
ls /dev/video* 2>/dev/null
(无输出)
rce|nvcsi|tegra-camera|vi0|vi1|isp
SWIOTLB缩小
cat /sys/kernel/debug/swiotlb/io_tlb_nslabs
与命令行参数匹配
swiotlb
对于SWIOTLB:
/proc/cmdline
必须包含
swiotlb=<value>
,且在全负载运行时
watch -n5 cat /sys/kernel/debug/swiotlb/io_tlb_used
必须小于
io_tlb_nslabs
— 若超出限制,恢复原始
CMDLINE_ADD
并重新刷写
kernel-dtb

Purpose

目标

Cut the unused DRAM carveouts that ship enabled in the reference BSP when a Jetson deployment skips display, camera, or other peripherals, freeing the freed bytes for the application. Always edits the four layers in boot order so an early-stage carveout never outranks a later-stage shrink.
当Jetson部署场景无需显示、摄像头或其他外设时,削减参考BSP中默认启用的未使用DRAM内存划分,释放出的内存可供应用使用。始终按照启动顺序修改四个层级,确保早期阶段的内存划分不会覆盖后期阶段的缩减配置。

Prerequisites

前置条件

  • Active target profile resolved per
    ../../context/target-platform-contract.md
    .
  • BSP image extracted and source tree initialized (
    /jetson-init-image
    ,
    /jetson-init-source
    complete).
  • For headless / no-camera recipes: confirm the workload truly does not need display or camera.
  • 已根据
    ../../context/target-platform-contract.md
    确定目标设备配置。
  • BSP镜像已提取且源码树已初始化(
    /jetson-init-image
    /jetson-init-source
    执行完成)。
  • 对于无界面/无摄像头方案:确认工作负载确实不需要显示或摄像头功能。

Limitations

限制

  • Only the validated recipes (
    headless
    ,
    no-camera
    ,
    swiotlb
    ) are exposed; ad-hoc subsystem disables outside the recipe set are refused.
  • SWIOTLB shrink is bounded by peak in-flight DMA — exceeding the new
    io_tlb_nslabs
    requires reverting the change.
  • BPMP-DTB edits land in the overlay tracker only after Customize + Build + Deploy run; this skill does not flash on its own.
  • 仅提供已验证的方案(
    headless
    no-camera
    swiotlb
    );拒绝方案集之外的临时子系统禁用请求。
  • SWIOTLB的缩小受限于峰值DMA流量 — 若超出新的
    io_tlb_nslabs
    限制,需恢复修改。
  • BPMP-DTB修改需在执行Customize + Build + Deploy后才会加入覆盖跟踪;本操作不会自行完成刷写。

Troubleshooting

故障排除

  • Boot fails after MB1 BCT carveout disable — restore the pristine misc DTS and re-flash; the missing carveout is mandatory for the active SoC.
  • io_tlb_used
    exceeds
    io_tlb_nslabs
    — revert
    swiotlb=
    in
    CMDLINE_ADD
    and re-flash the kernel DTB partition.
  • Reclaimed delta smaller than expected — verify the recipe truly matched the deployment (e.g. display still attached); use the
    dmesg | grep -iE 'firmware|carveout'
    check in this file to confirm.
  • Validation
    dmesg
    shows the disabled subsystem still probing
    — the change probably did not promote through to
    bsp_image
    ; re-run
    /jetson-promote-image
    .

  • MB1 BCT内存划分禁用后启动失败 — 恢复原始misc DTS并重新刷写;该内存划分对当前SoC是必需的。
  • io_tlb_used
    超出
    io_tlb_nslabs
    — 恢复
    CMDLINE_ADD
    中的
    swiotlb=
    配置并重新刷写内核DTB分区。
  • 回收的内存增量低于预期 — 验证方案是否与部署场景匹配(例如是否仍连接了显示器);使用本文中的
    dmesg | grep -iE 'firmware|carveout'
    命令进行检查确认。
  • 验证时dmesg显示已禁用的子系统仍在探测 — 修改可能未同步到
    bsp_image
    ;重新执行
    /jetson-promote-image