1. 程式人生 > >Linux電源管理(五)thermal

Linux電源管理(五)thermal

thermal子系統概述

thermal子系統是核心提供的溫控管理框架,一套軟體溫度解決方案,配合ic內部溫度感測器,對ic溫度進行管控,保證系統穩定性。
thermal系統多用於對ic內部的重點發熱模組的功能管控,如cpu、gpu。
thermal sensor驅動負責讀取硬體溫度sensor的溫度,並傳給thermal 子系統,thermal子系統將根據調控物件的溫度,決定是否觸發對應的冷卻措施,如限制CPU最大工作頻率,以及CPU開啟的核數等,從而實現對系統的冷卻。

  • thermal zone
    Thermal zone代表一個溫控管理區間,可以將其看做一個虛擬意義上的溫度Sensor, 需要有對應的物理Sensor與其關聯再能發揮作用。
    一個Thermal Zone最多可以關聯一個Sensor,但該Sensor可以是多個硬體Sensor的混合。

  • Trip Point
    即觸發點,由Thermal Zone維護。每個thermal zone可以維護多個trip point。Trip Point包含以下資訊:
    temp:觸發溫度,當溫度到達觸發溫度則該trip point被觸發。
    type:trip point型別,沿襲PC散熱方式,分為四種類型—passive、active、hot、critical。
    cooling device繫結資訊:
    記錄在thermal_instance結構體中,描述trip point與cooling device的繫結關係,即當trip point觸發後由那個cooling device去實施冷卻措施。每個trip point必須與一個cooling device繫結,才有實際意義。

  • cooling device
    實際對系統實施冷卻措施的驅動,溫控的執行者。cooling device 維護一個cooling等級,即state,一般state越高即系統的冷卻需求越高。cooling device根據不同等級的冷卻需求進行冷卻行為。
    cooling device只根據state進行冷卻操作,是實施者,而state的計算由thermal governor完成。

thermal軟體框架

要實現一個溫度控制的需求,試想一下我們是不是最少要有獲取溫度的裝置和控制溫度的裝置這兩個最基本的東西?當然附帶的也會產生一些使用溫度控制裝置的策略。

那上面這些東西在 Linux Thermal 框架中怎麼體現呢?通過閱讀原始碼我們發現程式碼中對上面的東西進行了一些抽象。

獲取溫度的裝置:在 Thermal 框架中被抽象為 Thermal Zone Device;
控制溫度的裝置:在 Thermal 框架中被抽象為 Thermal Cooling Device;
控制溫度策略:在 Thermal 框架中被抽象為 Thermal Governor;
這裡寫圖片描述

thermal zone

dts裡的配置如下:

thermal-zones{
            cpu_thermal_zone{

                polling-delay-passive = <1000>; //超過閥值輪詢時間
                polling-delay = <2000>; //未超閥值輪詢時間
                thermal-sensors = <&ths_combine0 0>;

                trips{
                    cpu_trip0:t0{
                        temperature = <70>;
                        type = "passive";
                        hysteresis = <0>;
                    };
                    cpu_trip1:t1{
                        temperature = <90>;
                        type = "passive";
                        hysteresis = <0>;
                    };
                    cpu_trip2:t2{
                        temperature = <100>;
                        type = "passive";
                        hysteresis = <0>;
                    };
                    cpu_trip3:t3{
                        temperature = <105>;
                        type = "passive";
                        hysteresis = <0>;
                    };
                    cpu_trip4:t4{
                        temperature = <110>;
                        type = "passive";
                        hysteresis = <0>;
                    };
                    crt_trip0:t5{
                        temperature = <115>;
                        type = "critical";
                        hysteresis = <0>;
                    };
                };

                cooling-maps{
                    bind0{
                        contribution = <0>;
                        trip = <&cpu_trip0>;
                        cooling-device = <&cpu_budget_cooling 1 1>;
                    };
                    bind1{
                        contribution = <0>;
                        trip = <&cpu_trip1>;
                        cooling-device = <&cpu_budget_cooling 2 2>;
                    };
                    bind2{
                        contribution = <0>;
                        trip = <&cpu_trip2>;
                        cooling-device = <&cpu_budget_cooling 3 3>;
                    };
                    bind3{
                        contribution = <0>;
                        trip = <&cpu_trip3>;
                        cooling-device = <&cpu_budget_cooling 4 5>;
                    };
                    bind4{
                        contribution = <0>;
                        trip = <&cpu_trip4>;
                        cooling-device = <&cpu_budget_cooling 6 6>;
                    };
                };
            };

核心使用thermal_zone_device 抽象獲取溫度的device.

struct thermal_zone_device {
    int id;
    char type[THERMAL_NAME_LENGTH];
    struct device device;
    struct thermal_attr *trip_temp_attrs;
    struct thermal_attr *trip_type_attrs;
    struct thermal_attr *trip_hyst_attrs;
    void *devdata;
    int trips;
    int passive_delay;
    int polling_delay;
    int temperature;
    int last_temperature;
    int emul_temperature;
    int passive;
    unsigned int forced_passive;
    struct thermal_zone_device_ops *ops;
    const struct thermal_zone_params *tzp;
    struct thermal_governor *governor;
    struct list_head thermal_instances;
    struct idr idr;
    struct mutex lock; /* protect thermal_instances list */
    struct list_head node;
    struct delayed_work poll_queue;
}


struct thermal_zone_device_ops {
    int (*bind) (struct thermal_zone_device *,
             struct thermal_cooling_device *);
    int (*unbind) (struct thermal_zone_device *,
               struct thermal_cooling_device *);
    int (*get_temp) (struct thermal_zone_device *, int *);
    int (*get_mode) (struct thermal_zone_device *,
             enum thermal_device_mode *);
    int (*set_mode) (struct thermal_zone_device *,
        enum thermal_device_mode);
    int (*get_trip_type) (struct thermal_zone_device *, int,
        enum thermal_trip_type *);
    int (*get_trip_temp) (struct thermal_zone_device *, int,
                int *);
    int (*set_trip_temp) (struct thermal_zone_device *, int,
                int);
    int (*get_trip_hyst) (struct thermal_zone_device *, int,
                int *);
    int (*set_trip_hyst) (struct thermal_zone_device *, int,
                int);
    int (*get_crit_temp) (struct thermal_zone_device *, int *);
    int (*set_emul_temp) (struct thermal_zone_device *, int);
    int (*get_trend) (struct thermal_zone_device *, int,
              enum thermal_trend *);
    int (*notify) (struct thermal_zone_device *, int,
               enum thermal_trip_type);
}

thermal governal

降溫策略一個抽象,與cpufreq的governal概念類似。
核心已經實現了一些策略,step_wise, user_space, power_allocator, bang_bang 。我們常用step_wise。

/**
 * struct thermal_governor - structure that holds thermal governor information
 * @name:       name of the governor
 * @throttle:   callback called for every trip point even if temperature is
 *              below the trip point temperature
 * @governor_list:      node in thermal_governor_list (in thermal_core.c)
 */
struct thermal_governor {
        char name[THERMAL_NAME_LENGTH];
    /* 策略函式 */
        int (*throttle)(struct thermal_zone_device *tz, int trip);
        struct list_head        governor_list;
};

thermal cooling device

Thermal Cooling Device 是可以降溫裝置的抽象,能降溫的裝置比如風扇,這些好理解,但是想 CPU,GPU 這些 Cooling devices 怎麼理解呢?

其實降溫可以從兩方面來理解,一個是加快散熱,另外一個就是降低產熱量。風扇,散熱片這些是用來加快散熱,CPU,GPU 這些 Cooling devices 是通過降低產熱來降溫。

struct thermal_cooling_device {
    int id;
        char type[THERMAL_NAME_LENGTH];
        struct device device;
        struct device_node *np;
        void *devdata;
    /* cooling device 操作函式 */
        const struct thermal_cooling_device_ops *ops;
        bool updated; /* true if the cooling device does not need update */
        struct mutex lock; /* protect thermal_instances list */
        struct list_head thermal_instances;
        struct list_head node;
};

struct thermal_cooling_device_ops {
        int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
        int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
    /* 設定等級 */
        int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
};

thermal core

Thermal Core作為中樞註冊Governor,註冊Thermal類,並且基於Device Tree註冊Thermal Zone;提供Thermal Zone註冊函式、Cooling Device註冊函式、提供將Cooling裝置繫結到Zone的函式,一個Thermal Zone可以有多個Cooling裝置;同時還提供一個核心函式thermal_zone_device_update作為Thermal中斷處理函式和輪詢函式,輪詢時間會根據不同Trip Delay調節。
模組流程圖如下:
這裡寫圖片描述

操作時序圖如下:
這裡寫圖片描述

相關推薦

Linux電源管理thermal

thermal子系統概述 thermal子系統是核心提供的溫控管理框架,一套軟體溫度解決方案,配合ic內部溫度感測器,對ic溫度進行管控,保證系統穩定性。 thermal系統多用於對ic內部的重點發熱模組的功能管控,如cpu、gpu。 thermal se

Linux常用命令賬號和組管理

linux 用戶 組 常用命令 侯良金 Linux常用命令(五)賬號和組管理 一、管理用戶賬號 1、用戶賬號的分類■超級用戶:root用戶是Linux系統中默認的超級用戶賬號,對本主機擁有最大的權限,類似於Windows 系統中的Administrator用戶。■普通用戶:

Linux用戶管理Linux系統的啟動

linux系統啟動Linux系統的啟動一.啟動步驟和GRUB1.Linux啟動過程分析 (1)BIOS自檢l 硬件檢測及初始化l 引導啟動設備(2)引導啟動設備l 軟盤(0磁道第一個扇

Linux系列教程——Linux鏈接命令和權限管理命令

密碼 mission pos link 掩碼 Owner 最大的 linux系統 passwd   前一篇博客我們講解了Linux文件和目錄處理命令,還是老生常淡,對於新手而言,我們不需要完全記住命令的詳細語法,記住該命令能完成什麽功能,然後需要的時候去查就好了,用的多了我

java程式設計師菜鳥進階十七linux基礎入門linux檔案/目錄的許可權和歸屬管理

在linux中的每一個檔案或目錄都包含有訪問許可權,這些訪問許可權決定了誰能訪問和如何訪問這些檔案和目錄。相應的每一個檔案和目錄都有所屬的屬主和屬組,合理的設定檔案和目錄的屬組和屬主在檔案/目錄管理中佔據著很重要的地位,所以,今天我就和大家一起來看一下有關檔案/目錄的許可權和歸屬的相關設定

Linux系統管理

linux redhat 服務器 系統管理 點擊下載:Linux系統管理(一)本文出自 “飛奔的魚兒” 博客,請務必保留此出處http://feiyuer.blog.51cto.com/6967044/1931977Linux系統管理(一)

Linux系統管理網絡服務

網絡服務 linux redhat 紅帽 點擊下載:Linux系統管理(二)(網絡服務)本文出自 “飛奔的魚兒” 博客,請務必保留此出處http://feiyuer.blog.51cto.com/6967044/1931978Linux系統管理(二)(網絡服務)

存儲與虛擬機主機管理

存儲與虛擬機主機管理選擇在openfier 虛擬機添加的一個T硬盤發布成功後 進入vmare 界面 創建虛擬交換機249和250一樣上述步驟 創建249-250設置虛擬交換機步驟以此類推 雙面性將10.250主機上的VM虛擬機轉為模板,模板名為mould,之後通過模板創建虛擬機將10.250主機上的V

Linux系統管理Linux系統安裝與修復

linux系統安裝與修復一. Linux多種安裝方式與應用軟件安裝1. Linux的硬盤安裝方式(1) 復制Linux的ISO文件到硬盤某個分區(2) 用Linux安裝啟動盤啟動/DOS啟動盤啟動計算機註: DOS啟動盤中必須要存放加載Linux系統的工具及Linux內核和initrd映像文件,主要文件包括:

Linux系統管理Linux設備和內核管理

linux設備和內核管理一. 設備管理概述1.Linux設備的分類字符設備(c):以字符為單位,傳輸速率較低,無需緩沖區。塊設備(b):以數據塊為單位組織和傳輸數據,需要建立緩沖區網絡設備(s):一種通過SOCKET接口進行主機通信的設備2.設備文件(1)功能用於用戶訪問設備進行輸入和輸出操作(2)常見的設

linux壓縮命令之tar總結

tar linux tar linux壓縮 tar支持打包和壓縮,支持目錄和文件,使用linux上使用比較廣泛的壓縮工具tar打包:tar -cvf 171210.tar ? ../d6z/打包一個目錄,格式是先打包後的文件名,打包的目錄,如果打包後的文件名存在,會直接覆蓋而不提示tar -xvf

Angular5學習筆記 - 路由管理

.html 修改內容 註冊 out style 導航 name alt angular5 一、添加路由管理引用 打開src/app/app.module.ts文件 import {RouterModule} from ‘@angular/router‘; import {

linux 基礎知識

linux 基礎命令 補充上一章關於alias,取消alias的方法為,unalias + 別名用戶登錄流程1.用戶在登陸時,會調用一些文件(這裏註意下,是用戶登錄,不是開機啟動)/etc/profile/etc/profile.d/~/.bash_profile~/.bashrc/etc/bashr

Linux日誌管理

日誌一、日誌中的四個WWhen:事件何時發生Where:日誌在哪裏產生Who:哪些程序觸發了這條日誌What:發生了什麽事件 二、一個簡單的日誌收集拓撲網絡設備、服務器通過syslog的協議將日誌傳送到日誌服務器上,日誌服務器定時地將日誌歸檔,儲存到後端存儲設備上。 常用的日誌管理程序為rsyslog和sys

linux內核虛擬文件系統

偏移 進行 系統 smo 磁盤信息 就會 space 而是 就是 虛擬文件系統(VFS)是linux內核和具體I/O設備之間的封裝的一層共通訪問接口,通過這層接口,linux內核可以以同一的方式訪問各種I/O設備。 虛擬文件系統本身是linux內核的一部分,是純軟件的東西,

Linux 基本命令

1、 許可權  檢視命令:# ls  -la 或者   #ll eg: drwxr-xr-x. 2 dalianmao dalianmao 4096 Jul 11 08:01 Desktop 檔案型別d 第一組(rwx):檔案擁有者許可權

Linux作業系統概述

第十三單元 kickstart自動安裝指令碼 1.yum install -y system-config-kickstart httpd 安裝system-config-kickstart和httpd 2.system-config-kickstart 設定kicksta

linux基礎篇:檔案歸檔與不同系統間的檔案傳輸

檔案歸檔 檔案歸檔,就是把多個檔案變成一個歸檔檔案,即將多個檔案打包起來 tar命令 Unix和類Unix系統上的壓縮打包工具,可以將多個檔案合併為一個檔案,打包後的檔名亦為“tar”。tar檔案格式已經成為POSIX標準,最初是POSIX.1-1988,當前是POSIX.1-2

linux系統管理1之 核心編譯選項檢視

三個方法 proc檔案系統 ubunut debain 紅帽等 proc檔案系統 /proc/config.gz This file shows you the compile-time configuration settings for the kernel (gzip compr

Linux 使用者管理

一、groupadd  --create a new group 建立新使用者 -g  --gid GID 二、groupdel  --delete a group  三、passwd  --update user's authentication tokens 更改使用者