Jetson时钟定制Skill jetson-customize-clocks

该技能用于在Jetson边缘计算平台的镜像刷写前,通过编辑BPMP设备树(DTB)和nvpower.sh脚本来自定义CPU、GPU、EMC时钟行为。支持锁定/限制频率、启停EMC DVFS、设置cpufreq/devfreq调控器,以及将系统固定到MAXN等,适用于性能测试、功耗优化和BSP级定制。关键词:Jetson时钟定制、BPMP DTB、nvpower.sh、EMC DVFS、CPU/GPU频率、cpufreq调控器、Jetson BSP、镜像烧录、MAXN、Orin/Thor。

BSP与板级支持 0 次安装 0 次浏览 更新于 9/6/2026
名称 jetson-customize-clocks
描述 用于通过编辑 BPMP DTB 和 nvpower.sh,在刷写前锁定/限制 Jetson CPU/GPU/EMC 时钟、切换 EMC/CPU DVFS,或更改 cpufreq 调控器。不用于实时调优或 nvpmodel 编辑。
版本 0.0.1
开源协议 “Apache-2.0” metadata: data-classification: public
作者 “Jetson Team” tags: - clocks - cpu - gpu - emc - dvfs - bwmgr - bpmp - nvpower - cpufreq - devfreq domain: clocks

自定义时钟

目的

在刷写镜像之前,通过编辑 Linux_for_Tegra/ 下的文件来自定义 Jetson 目标平台上的 CPU、GPU 和 EMC 时钟行为。涉及两层:

  • BPMP DTB 位于 Linux_for_Tegra/bootloader/<BPFDTB_FILE> — 每个时钟的 max-rate-custom 上限,以及 EMC DVFS 门控(所有 SoC 上的 bwmgr + cactmon;仅 T26x 上的 osp-controller)。
  • nvpower.sh 位于 Linux_for_Tegra/rootfs/etc/systemd/nvpower.sh — cpufreq / devfreq 调控器,以及(可选)在启动时写入 sysfs 的每设备 min / max / 静态频率。

常见触发条件:“锁定 CPU/GPU/EMC 频率”、“将 GPU 固定到 Fmax”、“将 EMC 固定到 MAXN”、“禁用/启用 EMC DVFS”、“禁用/启用 CPU DVFS”、“设置 CPU/GPU 最大频率”、“更改 cpufreq 调控器”。

超出范围:在运行中的目标设备上进行实时时钟调优(无刷写步骤)、nvpmodel 电源模式编辑(使用姊妹技能 /jetson-customize-nvpmodel)以及硅片上限覆盖(max-rate-maxn 是只读的)。

先决条件

根据 ../../context/target-platform-contract.md 解析活动配置文件。在以下情况拒绝并转派:

条件 拒绝并转派至
无活动配置文件,或 active: NA 转派至 /jetson-set-target/jetson-init-target
配置文件缺少 bsp_image: 转派至 /jetson-init-image
<bsp_image.root_path>/Linux_for_Tegra/ 缺失 转派至 /jetson-init-image
<source.root_path>/Linux_for_Tegra/ 缺失或不是 git 仓库 转派至 /jetson-init-source

解析路径:

  • 如果存在 bsp_image.root_path:,则 <bsp_image.root_path> 来自该值,否则为 <workspace>/Image
  • 如果存在 source.root_path:,则 <source.root_path> 来自该值,否则为 <workspace>/Source

对于本技能,<bsp_image.root_path>只读的;每次写入(操作1中的 BPMP DTB 和操作2中的 nvpower.sh)都落在 <source.root_path>(overlay tracker)下。这是 ../../context/bsp-customization-workflow.md#workflow-invariants 中的工作流不变式——手工编辑上游会悄然破坏 diff 跟踪,并使 /jetson-promote-image 变为空操作。

说明

  1. 解析上述先决条件(活动配置文件、已解压的 BSP image、已初始化的 source overlay tracker)。
  2. 从下表选择操作。
  3. 遵循链接的过程部分——操作1(BPMP DTB)、操作2(nvpower.sh)或适用于两者的 MAXN 配方。
  4. 按照各操作的提交约定在 overlay tracker 中提交编辑。
  5. 使用 /jetson-promote-image/jetson-flash-image 部署。新的 BPMP DTB 和 nvpower.sh 将在下次启动时生效。

支持的操作

操作 编辑位置 过程部分
将 CPU / GPU 时钟锁定到特定频率 BPMP DTB 中时钟节点上的 max-rate-custom + nvpower.sh 中的调控器 performance “内容编辑:max-rate-custom” + “选择编辑”
将 EMC 锁定在其初始频率(禁用 EMC DVFS) BPMP DTB:bwmgr.enabled = 0cactmon.enabled = 0,外加 T26x 上的 /delete-node/ osp-controller “内容编辑:禁用/启用 EMC DVFS”
重新启用 EMC DVFS BPMP DTB:bwmgr.enabled = 1cactmon.enabled = 1,在 T26x 上恢复 osp-controller “内容编辑:禁用/启用 EMC DVFS”
将一切固定到 MAXN 以进行压力测试 组合以上 + 将 nvpmodel MAXN 设为启动默认值 见配方
降低时钟硬上限但不锁定 仅 BPMP DTB 的 max-rate-custom “内容编辑:max-rate-custom
限制设备频率范围但不定格 nvpower.sh 中通过 sysfs 设置最小/最大值 “选择编辑”

操作1 — BPMP DTB 编辑

遵循 ../../references/bsp-customization-bpmp-dtb.md 中的 BPMP-DTB 定制协议。该协议负责机制——首次接触时的 pristine 导入、dtc 反编译、重新编译、健全性检查、提交。本技能仅提供时钟特定内容(在协议的"编辑 DTS"步骤期间要编辑哪些节点和属性)。

编辑后的 .dtb 落在 <source.root_path>/Linux_for_Tegra/ overlay tracker 中。/jetson-promote-image 的通道 A 遍历 tracker 并将文件复制到 bsp_image不要直接编辑 <bsp_image.root_path>/Linux_for_Tegra/bootloader/<bpmp-dtb>——那是 promote 的输出,不是输入。

解析 SKU 正确的 BPMP DTB

根据协议的"解析活动 BPMP DTB"部分,从活动 flash conf 读取 BPFDTB_FILE。对于常见的 Thor / 单 SKU conf 形状,这是 per-board .conf 中的静态 BPFDTB_FILE=... 行,值直接可信。

对于SKU 复用 conf 形状(Orin AGX devkit conf 链通过 update_flash_args_common 根据 board_sku/board_FAB 选择不同的 BPMP DTB——参见 ../../context/bsp-customization-software-layers.md#per-board-conf-dispatch--update_flash_args_common),使用活动配置文件中的 board_sku=<module.sku>board_FAB=<module.revision or empty> 走 dispatch 链,并从 dispatch 输出读取 BPFDTB_FILE——不是 per-board .conf 的静态行。对于非复用 conf,静态值和 dispatch 值一致;仅当 conf 链有条件地覆盖 BPFDTB_FILE 时才必须进行 dispatch。

列出有效最大频率(检查)

在决定 max-rate-custom 值之前,检查运行时上限的两层——参见 references/clock-control-model.md#effective-runtime-ceiling

检查食谱(BPMP 端反编译 + grep;nvpmodel 端对 boot 默认模式 awk)在 references/bpmp-dtb-clock-edits.md#inspection-cookbook 中。

对于 nvpmodel 层,参见 /jetson-customize-nvpmodel

此步骤不改变状态——它是确定"在命名时钟节点上编辑 max-rate-custom 内容"大小的先决条件。

内容编辑:在命名时钟节点上的 max-rate-custom

在协议"编辑 DTS"步骤中,修改指定时钟节点内的属性——绝不触碰 lateinitmax-rate-custom 必须严格低于时钟的硬上限(如果定义了 max-rate-maxn,否则来自同芯片/SKU 的运行目标上的实时 max_rate)。

DTS 编辑形式、语义以及 nvpmodel ↔ BPMP 时钟节点映射见 references/bpmp-dtb-clock-edits.md

然后将控制权交回协议——其"重新编译"、“健全性检查重新编译后的 blob”、"在 overlay tracker 中暂存"和"清理"步骤处理其余部分。提交消息约定遵循协议: <BPMP_BASENAME>: jetson-customize-clocks — <clock-node> max-rate-custom = <value>

内容编辑:禁用 / 启用 EMC DVFS

默认行为(EMC DVFS 开启)无需编辑。禁用 EMC DVFS 是多节点编辑,在同一协议"编辑 DTS"步骤中应用,不是 bwmgr 开关:

# 编辑 作用域
1 bwmgr.enabled = <0x00> 所有 SoC,强制
2 cactmon.enabled = <0x00> 所有 SoC,强制
3 /delete-node/ osp-controller T26x(Thor)强制 — T23x(Orin)没有此类节点,跳过

检测:dtc -I dtb -O dts <bpmp-dtb> | grep -c osp-controller — 零命中 ⇒ T23x 路径。完整的 DTS 片段、存留路径故障模式以及重新启用过程见 references/emc-dvfs-disable.md

多节点编辑就位后,应用协议的"重新编译"到"清理"步骤。提交消息约定: <BPMP_BASENAME>: jetson-customize-clocks — EMC DVFS disable (bwmgr + cactmon[+ osp-controller])

禁用会提高空闲功耗;适用于压力/性能测试,不适用于生产 rootfs。

重新运行 + 幂等性

根据协议的"可重新运行性"部分,使用相同目标值重新运行本技能会产生无操作提交。使用不同值重新运行会重写同一属性——git log -- $BPMP_REL 显示每次运行的记录。要将时钟恢复到其 max-rate-maxn 上限,请编辑 DTS 以移除 max-rate-custom 行并重新编译。

操作2 — nvpower.sh 编辑

编辑 nvpower.sh,该脚本在启动时通过 nvpower.service 运行以设置 cpufreq / devfreq 调控器和频率。

每个脚本文件

本操作编辑的脚本的相对路径:

Linux_for_Tegra/rootfs/etc/systemd/nvpower.sh

它存在于两个根中;操作同时处理两者:

角色 位置 技能是否写入?
检测 + pristine 源 <bsp_image.root_path>/Linux_for_Tegra/rootfs/etc/systemd/ 否 — 只读
Overlay 编辑目标 + git 提交 <source.root_path>/Linux_for_Tegra/rootfs/etc/systemd/

后续子步骤中的每脚本文件指的是 <source.root_path> 下的 overlay 副本。<bsp_image.root_path> 副本在下面的 pristine 导入步骤中读取一次,之后不再触碰。

Overlay 编辑配方(在编辑 nvpower.sh 之前应用)

遵循工作流文档中的规范 Off-skill edits recipe,即 pristine 导入 + 自定义提交对,两者均受预览门控。nvpower.sh 是单个文件,没有传播集;一个 pristine 提交 + 一个自定义提交即可覆盖整个更改。

本技能的具体替换:

  • <rel>/<file> rootfs/etc/systemd/nvpower.sh
  • 建议的 pristine 导入消息:import pristine: rootfs/etc/systemd/nvpower.sh, 正文 Source: <bsp_image.root_path>/Linux_for_Tegra/ (BSP <bsp_image.version>)
  • 建议的自定义提交标题:jetson-customize-clocks: nvpower.sh <summary>, 正文行如 set_cpufreq_governor: desired_cpufreq_gov "schedutil" -> "performance"

选择编辑

函数位置(set_cpufreq_governorset_devfreq_governor)、常见编辑配方(固定到 Fmax、静态频率、最小/最大边界)以及 nvidia-l4t-init 包升级注意事项见 references/nvpower-sh-edits.md

部署

overlay tracker 中的自定义提交不会自行到达设备。部署链:

  1. /jetson-promote-image — 将 overlay 中每个被跟踪的文件复制到 <bsp_image.root_path>/Linux_for_Tegra/。差异感知(跳过字节相同);对 rootfs/* 目标使用 sudo cp -p
  2. /jetson-flash-image — 将更新后的 bsp_image 刷写到设备。nvpower.service 将在下次启动时运行新脚本。
  3. (替代,无需刷写)将 <source.root_path>/Linux_for_Tegra/rootfs/etc/systemd/nvpower.sh 直接复制到运行目标设备的 /etc/systemd/nvpower.sh,然后 sudo systemctl restart nvpower.service(或重启)。

编辑 <source.root_path>/... 而不提交——或直接编辑 <bsp_image.root_path>/...——不会对 /jetson-promote-image 产生任何效果,并且会在下一次 /jetson-init-image 重新提取时被静默丢失。

配方 — 为压力/性能运行固定到 MAXN

组合操作1和2。操作1的 BPMP 编辑全部在一次协议循环中完成(一次反编译 / 多节点编辑 / 重新编译 / 提交周期——不要对同一 .dtb 两次往返协议):

  1. BPMP DTB("内容编辑:在命名时钟节点上的 max-rate-custom"步骤的内容):保持每个 CPU / GPU / EMC 时钟上的 max-rate-custom 不设置;移除现有降低上限的 max-rate-custom 行。
  2. BPMP DTB("内容编辑:禁用 / 启用 EMC DVFS"步骤的内容):将 EMC 固定在其初始频率 — bwmgr.enabled = 0cactmon.enabled = 0,外加 T26x 上的 /delete-node/ osp-controller(T23x 上跳过)。
  3. 在一次协议"编辑 DTS"调用中应用两个内容编辑,然后运行剩余的协议步骤(重新编译、健全性检查、覆盖两个内容编辑的单个自定义提交)。
  4. nvpower.sh(操作2):无条件设置 desired_cpufreq_gov="performance"desired_devfreq_gov="performance";移除 set_devfreq_governor 中的 GPU/nvjpg 跳过。通过操作2的 overlay 编辑配方应用("Overlay 编辑配方(在编辑 nvpower.sh 之前应用)"步骤)——这是 rootfs 脚本上的一个单独的 overlay-tracker pristine + 自定义提交对,与 BPMP-DTB 协议的提交分开。
  5. 通过 /jetson-customize-nvpmodel 将 boot 默认 nvpmodel 模式设置为 MAXN——无论 BPMP DTB 内容如何,每个时钟的 nvpmodel 上限都会限制在 max-rate-maxn 以下。

部署 /jetson-promote-image/jetson-flash-image 在下次刷写时通过 overlay tracker 获取新的 BPMP DTB 和编辑后的 nvpower.sh

限制

  • 仅限镜像构建时。 所有编辑都落在 <source.root_path>/Linux_for_Tegra/ 下,并且仅通过 /jetson-promote-image/jetson-flash-image 到达设备。实时目标调优不在范围内。
  • max-rate-custom 仅降低上限。 它必须严格低于 max-rate-maxn;不支持提高硅片上限。
  • 有效上限是两层。 运行时上限为 min(BPMP cap, active-nvpmodel-mode cap)。nvpmodel 上限由 /jetson-customize-nvpmodel 负责;本技能不编辑它。
  • SoC 有条件的 EMC DVFS 门控。 禁用 EMC DVFS 需要在 T23x(bwmgr + cactmon)与 T26x(bwmgr + cactmon + 删除 osp-controller)上编辑不同的节点集。错误检测会产生未定义行为。
  • T23x GPU 上限是多节点。 GPU 时钟拆分在 nafll_gpusys 和每个 nafll_gpcX 上;只有当上限应用于所有这些节点时才生效。
  • nvpower.sh 由包管理。 它随 nvidia-l4t-init 提供;包升级会覆盖就地编辑。长期设置应优先使用 systemd drop-in 或姊妹辅助文件。
  • ODMDATA 优先。 当 ODMDATA token 覆盖某个属性时,token 在刷写时覆盖直接 BPMP DTS 编辑。直接 BPMP DTS 编辑是没有 NVIDIA token 覆盖的属性的后备方案。
  • max-rate-maxnlateinit 不可触碰。 max-rate-maxn 是硅片上限(只读)。lateinit 用于启动时时钟初始化,不是上限覆盖——不要修改它们。
  • BPMP DTB 可能为 SKU 复用。 在复合/派发 flash conf(Orin AGX devkit 链)上,BPFDTB_FILEboard_sku / board_FAB 通过 update_flash_args_common 选择。当链有条件地覆盖 BPFDTB_FILE 时,读取静态 BPFDTB_FILE= 行是错误的;请通过派发解析。

故障排除

错误 原因 解决方案
设置了 max-rate-custom,但 T23x GPU 上的时钟仍升至 max-rate-maxn 仅对 nafll_gpusys 设了上限;nafll_gpcX 分区仍以 max-rate-maxn 运行,并主导有效上限。 将相同的 max-rate-custom 应用于 nafll_gpusys 以及 grep -nE '^\\s*nafll_gpc[0-9]+\\s*:' <decompiled.dts> 枚举的每个 nafll_gpcX 节点。
EMC DVFS 禁用看似生效,但 EMC 在 T26x 上仍进行缩放 仅设置了 bwmgr.enabled = <0x00>osp-controller 仍然存活,并通过 QoS 路径重新发出频率更改。 在同一个"编辑 DTS"步骤中增加编辑 #2(cactmon.enabled = <0x00>)和 #3(/delete-node/ osp-controller)。通过 dtc -I dtb -O dts <bpmp-dtb> | grep -c osp-controller 验证 osp-controller → 应为 0。
T23x 上禁用 EMC DVFS 因 osp-controller "节点未找到"而被拒绝 T23x(Orin)BPMP DTB 不包含 osp-controller;T23x 上必须跳过编辑 #3。 使用 grep -c osp-controller 步骤检测 SoC 家族;仅在计数 ≥ 1 时应用 #3。
编辑后 BPMP 拒绝加载 DTB:max-rate-custom >= max-rate-maxn max-rate-custom 被设置为等于或高于硅片上限。 max-rate-custom 严格降低到 max-rate-maxn 以下。如果节点中没有 max-rate-maxn,请在运行目标上查询实时上限:cat /sys/kernel/debug/bpmp/debug/clk/<clock>/max_rate
status = "disabled"osp-controller 重新出现 status = "disabled" 不会从设备树中移除节点;BPMP 仍会遍历它。 替换为 /delete-node/ osp-controller; — 该节点必须不存在,BPMP 才会跳过该路径。
apt upgrade 后对 nvpower.sh 的编辑丢失 nvpower.shnvidia-l4t-init deb 包拥有,升级时会被覆盖。 对于长期测试设置,将编辑打包到 systemd drop-in 或 nvpower.sh 引用的辅助文件中,而不是就地编辑 nvpower.sh
编辑 BPMP DTB 后 /jetson-promote-image 无效 编辑应用到 <bsp_image.root_path>/Linux_for_Tegra/,这是 /jetson-promote-image 的输出,而非输入。 将编辑移到 <source.root_path>/Linux_for_Tegra/bootloader/<BPFDTB_FILE>(overlay tracker),并通过 BPMP-DTB 协议提交。
上限在首次启动时生效,但电源模式更改后重置 活动 nvpmodel 模式的每时钟上限将频率限制在 max-rate-custom 以下。 检查两层;如果 nvpmodel 正在绑定,请通过 /jetson-customize-nvpmodel 提高(或移除)nvpmodel 上限。单独的 BPMP 上限不是运行时上限。

引用