时钟

NVIDIA® Jetson™ 板级支持包 (BSP) 支持通过软件配置 Jetson 时钟和外围时钟。本主题介绍如何检查时钟状态、获取时钟的最大速率以及配置时钟源。
注意
有关可用的 Jetson 时钟源和功能的信息,请参阅您的 Jetson 处理器的技术参考手册 (TRM) 的“时钟和复位控制器”部分。 TRM 的这一部分还介绍了时钟源多路复用器,并提供了每个组件的可用时钟源的描述。
在内核 4.9 及更高版本中,支持通用时钟框架 (CCF)。因此
所有设备驱动程序都使用公共 CCF API include/linux/clk.hinclude/linux/clk-provider.h,包括诸如 clk_getclk_enabledevm_clk_getclk_prepare_enableclk_prepare_disableclk_disable 等函数,而不是平台特定的 API。
所有时钟驱动程序,包括 Jetson 自定义 clk 驱动程序,都实现 clk_ops
设备所需的时钟源和时钟在设备树中定义。
时钟由称为启动和电源管理处理器的 R5 控制。它从 bpmp.bin 运行 RTOS 软件。在 CCPLEX 上运行的 Linux 内核请求此软件进行时钟编程。
NVIDIA® Jetson™ Linux 驱动程序包 (L4T) 时钟驱动程序包装器在 nvidia/drivers/clk/tegra/ 目录中可用。
要检查时钟状态
适用于:Jetson AGX Xavier 系列和 Jetson TX2 系列
在设备上,输入以下命令启动 debugfs 并检查时钟
sudo -s
# cat /sys/kernel/debug/bpmp/debug/clk/clk_tree
这是 NVIDIA® Jetson AGX Xavier™ 系列的 debugfs 输出示例
A screenshot of a cell phone Description generated with very high confidence

覆盖默认时钟频率

每个组件的默认时钟频率在启动期间设置,并在驱动程序的控制下通过请求 BPMP 进行更新。debugfs 服务提供了一种覆盖默认时钟频率并设置固定时钟频率的方法。 debugfs 仅用于调试和实验目的。
您可以在每个时钟节点下找到如下所示的子节点。您可以使用它们来更改节点的父节点和速率。例如
root@jetson-0422818069479:/sys/kernel/debug/bpmp/debug/clk/can1# ls
 
all children dvfs
flags fmon hz _ off
max_rate min_rate mrq_rate_locked parent
possible_parents pto_counter rate state
vdd_aon
Jetson AGX Xavier 时钟由 BPMP 控制。例如,使用以下命令覆盖 EMC 速率
echo 1 > /sys/kernel/debug/bpmp/debug/clk/emc/mrq_rate_locked
echo 1 > /sys/kernel/debug/bpmp/debug/clk/emc/state
echo x > /sys/kernel/debug/bpmp/debug/clk/emc/rate

配置 GPU 时钟

启用使用 devfreq 框架的 GPU DVFS 后,GPU 频率会根据负载而变化。如有必要,您可以改为以固定频率运行 GPU。
要以固定频率运行 GPU
1. 输入以下命令。
对于 gp10b
# cd /sys/devices/17000000.gp10b/devfreq/17000000.gp10b/
对于 gv11b
# cd /sys/devices/gpu.0/devfreq/17000000.gv11b/
2. 列出可用频率
$ cat available_frequencies
该命令显示可用频率列表,如下所示
114750000 216750000 318750000 420750000 522750000 624750000 675750000 828750000 905250000 1032750000 1198500000 1236750000 1338750000 1377000000
3. 固定频率。
要将频率固定为最大支持频率
echo <max> min_freq
其中 <max> 为最大支持频率。例如,要将频率固定为步骤 2 中列表中的最大支持频率
echo 1377000000> min_freq
要固定任何其他支持的频率
echo <freq> > min_freq
echo <freq> > max_freq
其中 <freq> 为所需的受支持频率。例如,要将频率固定为 828750000
echo 828750000 > min_freq
echo 828750000 > max_freq

配置 VIC 时钟

视频图像合成器 (VIC) 提供一组视频处理服务,包括用于镜头失真校正和时间噪声降低的几何变换处理。 VIC 电压和频率根据 活动监视器 (actmon) 测量的利用率进行动态调节,以节省功耗。
有关 VIC 的更多信息,请参阅您的 Jetson 处理器的技术参考手册 (TRM) 中的“视频图像合成器”部分。

VIC 动态电压和频率调节

VIC actmon 是一个硬件模块,用于在固定时间窗口内监视 VIC 活动周期。它与 wmark_active devfreq 调速器配合使用,以执行 VIC 的动态电压和频率调节 (DVFS) 操作。
wmark_active 尝试将当前负载(VIC 活动周期与总周期之比,缩放到 [0, 1000])保持在一定的百分比范围内。它为当前负载设置上限和下限。当当前负载超出这些范围时,VIC actmon 会引发中断,从而导致 wmark_active 提高 VIC 频率(降低当前负载)或降低频率(增加当前负载)。
wmark_active 中的控制逻辑是
if (freq_boost_en && curr_load >= load_max)
;
else
;
选择第一个可用的频率步长,该步长大于或等于 avg_target_freqcurrent
其中
curr_load 是当前负载。
freq_boost_en 是一个旋钮,用于启用或禁用频率提升功能
Fmax 是最大可能的 VIC 频率。
load_max频率提升阈值。其范围是 [0, 1000]。当 load_level 超过此阈值时,wmark_active 会将 VIC 频率提升到 Fmax
load_target负载目标)是 curr_load 的值,wmark_active 尝试保持该值。
curr_freq 是当前的 VIC 频率,以赫兹为单位。
curr_ideal_freq 是 VIC 频率,以赫兹为单位,在当前的瞬时运行条件下,它将产生 load_targetcurr_load 值。
avg_target_freq 是目标频率的移动平均值,以赫兹为单位。它用于避免在重新计算 curr_freq 时的突变。此属性在 使用控制旋钮自定义 VIC DVFS 中有更全面的描述。

用于 DVFS 控制的 Sysfs 路径

本节介绍控制 VIC DVFS 运行的几个旋钮的用法。
用于 DVFS 控制的 Sysfs 节点路径名
控制 VIC 旋钮的 sysfs 节点位于一对目录中,这些目录的位置取决于平台。以下描述使用这些占位符来表示这些目录
对于 NVIDIA Jetson Xavier™ NX、Jetson AGX Xavier 系列和 Jetson TX2 系列
<knobpath> 表示
/sys/devices/13e10000.host1x/15340000.vic/
<knobpath_devfreq> 表示
/sys/devices/13e10000.host1x/15340000.vic/devfreq/15340000.vic/
对于 NVIDIA® Jetson Nano™ 设备和 Jetson™ TX1
<knobpath> 表示
/sys/devices/50000000.host1x/54340000.vic/
<knobpath_devfreq> 表示
/sys/devices/50000000.host1x/54340000.vic/devfreq/54340000.vic/
在以下过程中,请将这些占位符替换为您 Jetson 平台的相应路径名。
VIC DVFS 控制术语
许多控制旋钮都与当前负载负载目标有关。默认负载目标为 700,即 wmark_active 尝试将 VIC 活动周期保持在当前 VIC 频率的 70%。
较低的负载目标使 VIC 频率调节更积极,因为当 VIC 活动周期超过(负载目标 / 1000)× Fmax 时,VIC 频率会向上调节到 Fmax
启用或禁用 VIC DVFS
要启用或禁用 VIC DVFS,请输入命令
$ echo <gov> > <knobpath_devfreq>/governor
其中 <gov> 是要使用的 VIC devfreq 调速器的名称
要启用 VIC DVFS,wmark_active
要禁用 VIC DVFS,userspace
默认情况下启用 VIC DVFS。
例如
要在 Jetson Xavier NX 系列平台上禁用 VIC DVFS,请输入
$ echo userspace > /sys/devices/13e10000.host1x/15340000.vic/devfreq/15340000.vic/governor
要在 Jetson Nano 平台上启用 VIC DVFS,请输入
$ echo wmark_active > /sys/devices/50000000.host1x/54340000.vic/devfreq/54340000.vic/governor
使用控制旋钮自定义 VIC DVFS
block_window 控制旋钮定义了 VIC 频率调节操作之间的最短时间段,以微秒为单位。如果上次 VIC 频率调节操作是在不到 block_window 微秒前执行的,则 VIC actmon 会跳过频率调节。
要设置 block_window,请输入命令
$ echo <period> > <knobpath>/block_window
其中 <period> 是要设置的 block_window 值。
load_target 控制旋钮设置 VIC 负载目标。要设置 load_target,请输入命令
$ echo <target> > <knobpath>/load_target
其中 <target> 是要设置的负载目标。
freq_boost_en 控制旋钮启用或禁用频率提升功能。如果启用了频率提升,当 VIC 负载级别超过频率提升阈值(由 load_max 控制旋钮设置,如下所示)时,wmark_active 会将 VIC 频率提升到 Fmax
要启用或禁用频率提升,请输入命令
$ echo <b> > <knobpath>/freq_boost_en
其中 <b> 是 1(启用频率提升)或 0(禁用频率提升)。
load_max 控制旋钮设置频率提升阈值wmark_active 当 VIC 负载级别超过频率提升阈值时,会将 VIC 频率提升到 Fmax。其范围是 [0, 1000]。其默认值为 900。
请注意,只有在启用 freq_boost_en(上文)时,wmark_active 才会提升 VIC 频率。
要设置频率提升阈值,请输入命令
$ echo <max> > <knobpath>/load_max
其中 <max> 是要设置的频率提升阈值。
curr_ideal_freq 是 VIC 频率,以赫兹为单位,在当前的瞬时运行条件下,它将产生 load_targetcurr_load 值。
avg_target_freq 是平均目标频率,以赫兹为单位。也就是说,它是目标频率的移动平均值,以赫兹为单位。
smooth 旋钮调整 avg_target_freqpreviouscurr_ideal_freq 在调整 avg_target_freq 值以趋向目标频率时所赋予的权重。
如果 smooth 为 0,则 avg_target_freqprevious 的权重为 0%,curr_ideal_freq 的权重为 100%,因此每次调整时,avg_target_freqcurrent 都设置为 curr_ideal_freq
要设置 smooth,请输入命令
$ echo <value> > <knobpath>/smooth
其中 <value> 是要设置的值。
要设置静态 VIC 频率
对于调试或功耗/性能评估,您可能希望将 VIC 频率设置为固定值。如果您禁用 VIC DVFS,则可以直接设置静态 VIC 频率
1. 禁用 VIC 运行时 PM(电源管理)挂起。这会将 VIC 硬件模块强制置于通电状态,以便您可以使用命令配置 VIC 频率
$ echo on > <knobpath>/power/control
2. 读取运行时状态。
$ cat <knobpath>/power/runtime_status
该命令应显示 active 的运行时状态。
3. 禁用 VIC DVFS
$ echo userspace > <knobpath_devfreq>/governor
4. 检查可用的 VIC 频率设置
$ cat <knobpath_devfreq>/available_frequencies
该命令列出可用的频率,如下所示
115200000 268800000 409600000 550400000 691200000 844800000 985600000 1036800000
5. 选择其中一个可用频率,并将 VIC 最大频率和 VIC 频率设置为该值
$ echo <frequency> > <knobpath_devfreq>/max_freq
$ echo <frequency> > <knobpath_devfreq>/userspace/set_freq
6. 启用 VIC 运行时 PM 挂起
$ echo auto > <knobpath>/power/control

配置时钟

通常,每个模块或模块都有一个专用的时钟源寄存器。有关给定寄存器的详细信息,请参阅技术参考手册 (TRM) 中的 CLK_RST_CONTROLLER_CLK_SOURCE_<module_name>
时钟源寄存器为模块提供时钟源选择和时钟分频器控制。分频器通常为 8 位,7 个整数位和 1 个小数位 (U7.1)。
要在内核设备驱动程序模块中更改时钟配置
1. 在设备树中声明时钟。例如,对于 padctl-uphy,可以将时钟声明如下
clocks = <&tegra_car TEGRA210_CLK_HSIC_TRK>,
<&tegra_car TEGRA210_CLK_USB2_TRK>,
<&tegra_car TEGRA210_CLK_PLL_E>;
clock-names = "hsic_trk", "usb2_trk", "pll_e";
2. 使用 devm_clk_get 函数使用 clock-names 获取所需的时钟源。
3. 使用 clk_get_parent 函数获取所需时钟的父时钟。
4. 使用 clk_set_parent 函数为目标时钟选择指定的时钟源。
5. 使用 clk_set_rate 函数设置目标时钟的频率。
分频器会根据目标速率自动计算。成功的时钟频率设置必须满足该模块的可用分频器和时钟源的频率。
6. 使用 clk_round_rate 函数获取可以从当前时钟源配置的精确时钟频率。
7. 使用 clk_prepare_enable(或 clk_prepareclk_enable)函数来取消门控/启用时钟。如果操作可能会休眠,则可以使用 clk_prepare 函数代替 clk_enable 来取消门控时钟。
要使用 PLLAON 作为时钟源
适用于:仅限 Jetson Xavier NX 系列和 Jetson AGX Xavier 系列
默认情况下,PLLAON 时钟在 T194 L4T 平台上禁用,以节省功耗。
您可能希望启用 PLLAON 以在某些用例(如 CAN 和 PWM)中实现更高的时钟速率或更高的精度。您可以通过首先将 PLLAON 添加为时钟的可能父级,然后将时钟的父级设置为 PLLAON 来执行此操作。
您可以通过修改 BPMPFW DTB 和内核 DTB 文件来进行这些更改。 BPMPFW DTB 保存时钟的配置;内核 DTB 包含启用和禁用 PLLAON 的设置。
以 CAN 用例为例,按照以下步骤将 PLLAON 添加为可能的父级
1. 使用 dtc 工具将 BPMPFW DTB(例如 tegra194-a02-bpmp-p2888-a04.dtb)转换为 DTS。
2. 编辑 DTS 文件,将 PLLAON 时钟 ID 添加到可能的父级列表中。
clocks 下的 DTS 文件中,将 PLLAON 的时钟 ID(符号 CLK_PLLAON,十进制 94,十六进制 0x5e)添加到 allowed-parents 列表
clocks {
clock@can1 {
clk-id = <9>; /* 确认 TEGRA194_CLK_CAN1*/
allowed-parents <nn,nn,nn,...,94>; /*TEGRA194_CLK_PLLAON*/
};
...
};
这允许将 PLLAON 设置为 CAN1 的父级。
3. 将 DTS 文件转换回 DTB。
4. 使用 dtc 工具将内核 DTB(例如,tegra194-p2888-0001-p2822-0000.dtb)转换为 DTS 文件,或获取内核的源 DTS 文件。
5. 编辑内核 DTS 文件,使 CAN 使用 PLLAON 作为父级,并从要禁用的时钟列表中删除 PLLAON(条目 0x4 0x5e
clocks-init{
compatible = "nvidia,clocks-config";
disable {
/* 编辑 clocks 属性以删除 PLLAON 的时钟提供程序 + 时钟 ID 对。*/
clocks = <nn nn, nn nn,...>;
};
};
6. 要更改 mttcan 节点以选择 PLLAON 作为父级,请将 "pllaon" 添加到 clock-names 中的列表,并将 0x4 0x5e 的条目添加到 clocks 中的列表
mttcan@c310000 {
pll_source = "pllaon";
clocks = <..., 0x4 0x5e>; /*新条目*/
clock-names = <name>, <name>, <name>, ..., "pllaon";
};
7. 将 DTS 文件转换为 DTB,或者如果您编辑了源文件,则构建内核 DTB。
8. 使用修改后的 DTB 文件刷新板。
可以将 PLLAON 作为父级的时钟
以下时钟可以配置为将 PLLAON 作为父级
TEGRA194_CLK_CAN1
TEGRA194_CLK_CAN2
TEGRA194_CLK_DMIC5
TEGRA194_CLK_I2C2
TEGRA194_CLK_I2C8
TEGRA194_CLK_PWM4
TEGRA194_CLK_SPI2
TEGRA194_CLK_UARTG