Linux CPU温度制限解除


以前,SBCのCPU負荷試験では,温度が上昇するとクロックが低下することが分かった.
CPU内部の温度センサは、特定温度以上の状態が検出されると、若干の制限を受ける.
消費電力を考慮せずにできるだけ冷却をサポートする条件で、制限を解除しても良いので、制限を解除する内容を記事に書きます.
デバイスファイルを変更して温度制限を解除できます.

必要な基本情報


Linuxカーネル・プライマリ・ライン・リポジトリのホットドキュメントでは、ホット・ゾーンの制限を調整するためにデバイス・ツリー・ファイルを変更する必要があります.
CPUの熱相関設定は、各CPUのデバイス(*.dts)ファイルに記録される.
デバイスツリーには、次の5つのノードタイプがあります.
これらのコンテンツは、リファレンスドキュメントの表示と学習を同時に行うため、エラーが発生する可能性があります.
エラーの内容が表示された場合は、フィードバックを提供します.

デバイスツリーのノードコンポーネント


コンポーネントは、熱センサ温度測定に使用されるセンサ冷却装置が温度に応じて冷却される装置のシャッターポイントについて何をすべきかを説明します.考えられる温度と作業を結びつける部分.冷却マッピングテープ点と冷却装置との関係を説明するために記録された部分.ホットゾーンハードウェア内部の熱関連データの記録部について説明する.

Thermal sensor devices


thermal-sensor-cells


type : unsigned
size : one cell
通常、温度センサがあり、この場合は0に設定されます.1でなければ.
詳細については、ホットゾーンバインドを参照してください.

Cooling devices


cooling-cells


type : unsigned
size : one cell
冷却装置に関する情報を提供します.
参照で使用する最小および最大の冷却状態を指定するには、少なくとも2と書く必要があります.
第1ユニットは要求の最小冷却状態であり、第2ユニットは参照で要求された最大冷却状態である.

Trip points


temperature


type : signed
size : one cell
Trip温度レベルを表す整数.(単位milli Celcius)

hysteresis


type : unsigned
size : one cell
温度特性の低いヒステリシス値.
相対値、単位はmilli Celciusです.
履歴現象またはヒステリック現象とは、物質が通過した過去が現在の状態に影響を及ぼす現象であり、ある物理量は当時の物理条件に依存せず、以前の物質が通過した過程の特性に依存する.

type


type: String
文字列を含むTripタイプ.

Cooling device maps


cooling-devices


type: phandles + cooling specifier
このバインディングで使用される冷却装置を示すインジケータ付き冷却装置のファンのリスト.
冷却インジケータでは、最初のセルは最小冷却状態で、2番目のセルはこのマップで使用される最大冷却状態です.

trip


type: phandles of trip point node
同じホットゾーン内のジャンプポイントノードのモデル

Thermal zone nodes


熱領域を記述するために必要なすべての情報(冷却装置のバインドを含む)を含むノード.
[列領域](Column Area)ノードには、アトリビュートとは独立したグリップ付きノードと、すべての領域の冷却マップを含むサブノードが必要です.

polling-delay


type: unsigned
size: one cell
この列領域をチェックすると、ポーリング間の最大待機時間(ミリ秒)が表示されます.

polling-delay-passive


type: unsigned
size: one cell
手動冷却時にポーリング間で待機する最大時間(ミリ秒).

thermal-sensors


type: list of phandles + sensor specifier
thremal領域を監視する際に使用する熱センサモデルとセンサフラグのリスト.

trips


type: Sub-node
サブノードは、ホットゾーンを記述するために必要なポイントノード付きコンテナです.

cooling-maps


type: Sub-node
グリップと冷却装置との関係を記述する冷却装置マッピングノードのコンテナのサブノード.

dtsファイルの操作


使用しているプレートは96プレートのRock 960 abです.
以下の内容は、github@rockchip-linux Linuxカーネルの内部にあるRK 3399です.抜粋部分dtsiを修正します.
thermal_zones: thermal-zones {
	soc_thermal: soc-thermal {
		polling-delay-passive = <20>; /* milliseconds */
		polling-delay = <1000>; /* milliseconds */
		sustainable-power = <1000>; /* milliwatts */

		thermal-sensors = <&tsadc 0>;

		trips { // 온도에 따른 정책
			threshold: trip-point-0 {
         // 70도를 넘길경우 2도마다 작동중 클럭이 낮아지는 이유는 여기서 알수있었음.
         // temperature 항목을 수정하면 클럭이 낮아지는 시점을 늦출 수 있음.
				temperature = <70000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "passive";
			};
			target: trip-point-1 {
         // 이 부분에 대한 이해가 약간 부족해서 위의 threshhold 부분과 같이 설정해줬음.
				temperature = <85000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "passive";
			};
			soc_crit: soc-crit { // 여기까진 안올려봐서 모르겠지만 이 이후로는 고장날 것 같기도 하고... 관리 범위 밖인듯.
				temperature = <115000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "critical";
			};
		};

		cooling-maps {
			map0 {
				trip = <&target>;
				cooling-device =
					<&cpu_l0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <4096>;
			};
			map1 {
				trip = <&target>;
				cooling-device =
					<&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <1024>;
			};
			map2 {
				trip = <&target>;
				cooling-device =
					<&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <4096>;
			};
		};
	};

	gpu_thermal: gpu-thermal {
		polling-delay-passive = <100>; /* milliseconds */
		polling-delay = <1000>; /* milliseconds */

		thermal-sensors = <&tsadc 1>;
	};
};
  • 熱領域内部の温度値を変換し,温度が100度まで上昇してもクロックは低下しないことが分かった.
  • rock 960 abプレート上で圧力試験を行った.
  • 4プロセス、8スレッド
  • 212 V/0.45 Aの電力を消費した.
  • dts変更後、同じ条件でテストを行った場合、消費電力は12 V/1.05 A程度となります.
  • で希望する数値を選択し、テスト終了後、元に戻します.