JAJAA75 October   2025 AM62L , AM62P , AM67 , AM68 , AM69 , TDA4VM

 

  1.   1
  2.   概要
  3.   商標
  4. 1VTM モジュール
    1. 1.1 VTM モジュールの説明
    2. 1.2 VTM の動作原理および使用方法
  5. 2TI プロセッサのハードウェア温度保護
    1. 2.1 VTM の過熱保護スレッショルド
    2. 2.2 最高ハードウェア温度保護
  6. 3ソフトウェア温度保護戦略
    1. 3.1 オプションのソフトウェア温度保護対策
    2. 3.2 Linux 温度保護ロジック
    3. 3.3 Linux で未使用のコアを無効化する
  7. 4まとめ
  8. 5参考資料

Linux 温度保護ロジック

SDK 11.0 (またはそれ以前) から、Linux SDK は Linux VTM ドライバの組み込みを開始しました。Linux カーネル VTM と SOC のハードウェア VTM は、2 つの異なる概念です。カーネル VTM フレームワークは、デバイスツリー構成(例:カーネルサーマルバインディングドキュメントで定義される k3-am62-thermal.dtsi)を用いてセンサ温度を監視し、CPU 周波数の低下、シャットダウン、Linux の再起動などの対応措置を実行します。Linux で使用するセンサ温度は、AM62x SOC ハードウェア VTM モジュールから取得されます。

カーネルデバイスツリー k3-am62a-thermal.dtsi の定義と設定は、単なる一例です。お客様は、Linux のシャットダウンや再起動など、プロジェクトの要件に応じてこれを変更できます。カーネルデバイスツリー k3-am62a-thermal.dtsi のデフォルト設定では、温度が 105°C に達するとカーネルがシャットダウンシーケンスをトリガーします。Linux SDK 11.0 では、Linux VTM ドライバもハードウェア VTM 向けに同様の割り込みスレッショルドを定義しており、最大3つのプログラム可能な温度スレッショルドを許可します。このうち2つは スレッショルド超過時用、1つは スレッショルド未満時用であり、VTM がカーネルに動作を促すアラートを発信できるようにします。例えば、最初のスレッショルドを超過した場合、カーネルは CPU の電圧とクロック速度を低下させるよう通知され、SoC 全体の温度を安定化させることができます。SoC 温度が上昇し続ける場合、2番目のスレッショルドを用いてより積極的な対策を実施できます。例えば、2番目のスレッショルドを超えた時点で、電源オフコマンドを発行してデバイスを完全にシャットダウンすることが可能です。スレッショルド温度は、デバイスツリーで定義された値を使用してカーネル内で設定できます。これにより、カーネルが SoC をシャットダウンする臨界温度を設定できます。SoC が過熱すると、カーネルにパッシブアラートを送信し、cpufreq ドライバを冷却デバイスとして登録することで MPU 周波数を低減できます。ソフトウェアの熱保護 スレッショルドはコード変更により調整可能であり、例えばシャットダウン温度を 105°C から 125°C に調整することで、ソフトウェア保護を産業用グレードから車載用グレードの温度仕様に切り替えることができます。以下のコードは、55°C を臨界温度とし、5°C のヒステリシス制御を設定しています。55°C 到達時に冷却措置を開始するパッシブ状態に移行し、125°C到達時には即時シャットダウン(2°C のヒステリシス制御)を行います。

/* From arch/arm64/boot/dts/ti/k3-am62a-thermal.dtsi */
thermal_zones: thermal-zones {
     main0_thermal: main0-thermal {
          polling-delay-passive = <250>;     /* milliSeconds */
          polling-delay = <500>;          /* milliSeconds */
          thermal-sensors = <&wkup_vtm0 0>;
          trips {
               main0_alert: main0-alert {
                    temperature = <95000>;
                    hysteresis = <2000>;
                    type = "passive";
               };
               main0_crit: main0-crit {
                    temperature = <105000>;     /* milliCelsius */
                    hysteresis = <2000>;     /* milliCelsius */
                    type = "critical";
               };
          };
          cooling-maps {
               map0 {
                    trip = <&main0_alert>;
                    cooling-device =
                         <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
               };
          };
     };

コアがパッシブ状態になると、コアは優先度の低いプロセスを強制終了することで、対応するコアの負荷を軽減できます。 重要なタスクでは、動作周波数を下げることで消費電力を低減できます。動的周波数選択(DFS)は、CPU 周波数を動的に調整してパフォーマンスを最適化する効果的な手法です。詳細については、チュートリアルを参照してください。

DFS 方式では現在、A コアの周波数を容易に調整することが可能です。次のセクションでは、他のコアの周波数を変更する方法について説明します。まず、TRM (クロックセクション) から、コアに関連付けられたクロックソースと PLL と分周器を特定します。PLL に基づいて分周器を変更することで、最終的な出力クロックが速度グレードを満たすようにします。

以下に、AM62A の C7x コアクロックを変更する方法の例を示します。PLL は MAIN_PLL7 HSDIV0 として識別され、対応するデバイスの TRM に記載されています。変更内容は以下のとおりです。元の 1GHz メインクロック周波数が分割され、500MHz とします。他のコアについても同様の方法で周波数調整が可能です。変更後は Linux の k3conf コマンドで対応するクロック周波数を確認できます。お客様は、k3conf set clock $CLOCKID $FREQ コマンドを使用してクロックを変更することも可能です。デバイスによってはデバイス ID の変更が必要な場合があります。例えば、AM62Aの C7x は ID 208 と 211 に対応します。

k3conf dump clock 208
k3conf dump clock 211
output: 
|----------------------------------------------------------------------------------------------|
| Device ID | Clock ID | Clock Name                        | Status          | Clock Frequency |
|----------------------------------------------------------------------------------------------|
|   208     |     0    | DEV_C7X256V0_C7XV_CORE_0_C7XV_CLK | CLK_STATE_READY | 500000000   |
|----------------------------------------------------------------------------------------------|
|   211     |     0    | DEV_C7X256V0_CLK_C7XV_CLK                      | CLK_STATE_READY | 500000000       |
|   211     |     7    | DEV_C7X256V0_CLK_PLL_CTRL_CLK                  | CLK_STATE_READY | 500000000       |
diff --git a/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
b/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
index 2122081..7438db5 100644
--- a/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
+++ b/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
@@ -2440,7 +2440,7 @@ static const struct clk_data_div_reg clk_data_hsdiv0_16fft_main_7_hsdiv0 = {
 static const struct clk_data_div_reg clk_data_hsdiv0_16fft_main_7_hsdiv0 = {
      .data_div          = {
           .n          = 128,
-          .default_div     = 2,
+          .default_div     = 4,
      },
      .reg               = 0x00680000UL + (0x1000UL * 7UL) + 0x80UL + (0x4UL * 0UL),
      .bit               = 0,

上記のコード変更後は、SDK 内の lib ファイルをクリーンビルドする必要があります。また、変更後のコードは DM (デバイス管理)コア上で動作するため、DM コアに対応するファームウェアのクリーンビルドも実施してください。