• Android/Linux Thermal框架分析及其Governor对比


    image

    图表 1 Thermal框架

    随着SoC性能的快速提升,功耗也极大提高,带来的负面影响是SoC的温度提高很快,甚至有可能造成物理损坏。同时功耗浪费也降低了电池寿命。

    从上图可知,Thermal框架可以分为Thermal Core、Thermal Governor、Thermal Cooling、Thermal Driver以及Thermal Device Tree五大部分。

    Thermal Core作为User Space和Kernel的接口,同时也是Thermal框架的中枢。Thermal Driver负责为整个框架读取温度作为输入,同时从DT中读取参数注册设备,一般一个Thermal Driver对应一个Thermal Zone。Thermal Governor提供多种可选Governor:Power Allocator、Step Wise、User Space等。Thermal Cooling是作为Thermal框架的输出,在PC上可能有风扇作为Cooling设备,但是在移动设备主要是通过降频降压来实现降低功耗,作为Cooling设备;目前Cooling设备可以是CPU、devfreq、clock等。从中我们可以看到的是,Thermal Driver作为输入设备,Cooling设备作为输出设备,两个都是跟SoC相关的。

    Thermal相关Feature内核配置:

    # CONFIG_SENSORS_ACPI_POWER is not set

    CONFIG_THERMAL=y

    CONFIG_THERMAL_HWMON=y

    CONFIG_THERMAL_OF=y

    CONFIG_THERMAL_WRITABLE_TRIPS=y

    # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set

    # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set

    # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set

    CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y

    # CONFIG_THERMAL_GOV_FAIR_SHARE is not set

    CONFIG_THERMAL_GOV_STEP_WISE=y

    # CONFIG_THERMAL_GOV_BANG_BANG is not set

    CONFIG_THERMAL_GOV_USER_SPACE=y

    CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y

    CONFIG_CPU_THERMAL=y

    CONFIG_CLOCK_THERMAL=y

    # CONFIG_THERMAL_EMULATION is not set

    CONFIG_HISI_THERMAL=y

    # CONFIG_IMX_THERMAL is not set

    Thermal代码位于:

    drivers/thermal/

    Thermal相关sysfs节点位于:

    /sys/class/thermal

    1.1.1 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调节。

    image

    图表 2 Thermal Core Init

    函数

    作用

    thermal_zone_device_register

    thermal_zone_device_unregister

    thermal_zone_get_temp

    thermal_zone_device_update

    thermal_zone_get_zone_by_name

    Thermal Zone的注册函数,也包括获取Zone温度,根据温度设备状态以及进行Cooling。

    thermal_cooling_device_register

    thermal_of_cooling_device_register

    thermal_cooling_device_unregister

    Cooling Device的注册函数。

    thermal_zone_bind_cooling_device

    thermal_zone_unbind_cooling_device

    将Cooling Device绑定到Zone的函数,这样Thermal Zone变得有效。

    thermal_notify_framework

    thermal_generate_netlink_event

    通知函数。

    图表 3 Thermal Core API

    image

    图表 4 thermal_zone_device_register

    thermal_zone_device_check是thermal的核心函数,读取thermal温度;然后根据trip类型执行critical或者non critical响应操作。critical则直接调用orderly_poweroff;non critical则调用governor的throttle函数,此处即power_allocator_throttle。在power_allocator_throttle中进行power的分配。

    1.1.2 Thermal Governor

    Thermal Governor作为Thermal框架的决策核心,都被注册到thermal_governor_list上,def_governor指向当前使用的governor。

    image

    图表 5 struct thermal_governor

    thermal_governor结构体用来表示一个Thermal Governor;name是名称,bind_to_tz用于将Governor绑定到Thermal Zone,unbind_from_tz用于去绑定, throttle主要被handle_thermal_trip调用,然后根据trip参数和Governor算法调用Cooling设备操作函数去设置set_cur_state。

    下面重点分析Power Allocator和Step Wise两种Governor。

    1.1.2.1 IPA(Intelligent Power Allocator)

    参照文档:Android/Linux Thermal Governor之IPA分析与使用

    1.1.2.2 Step Wise

    static struct thermal_governor thermal_gov_step_wise = {

    .name = "step_wise",

    .throttle = step_wise_throttle,

    };

    Step Wise的核心是根据当前温度的趋势(上升、下降、平稳)和与当前Trip温度对比,来决定CPU下一次的Cooling状态。然后调用thermal_cdev_update进行Cooling设备的set_cur_state。两个核心函数是:get_tz_trend和get_target_state。

    thermal的温度趋势有:

    enum thermal_trend {

    THERMAL_TREND_STABLE, /* temperature is stable */

    THERMAL_TREND_RAISING, /* temperature is raising */

    THERMAL_TREND_DROPPING, /* temperature is dropping */

    THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */

    THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */

    };

    get_target_state流程图:

    image

    图表 6 get_target_state流程图

    1.1.3 Thermal Cooling

    在嵌入式平台中Cooling设备主要通过改变频率电压,来达到改变功耗的目的。所以只要可以修改频率电压都可以作为Cooling设备,比如CPU、GPU等。

    1.1.3.1 Cooling设备之cpufreq框架介绍

    image

    图表 7 Cooling设备cpufreq框架

    核心结构体cpufreq_cooling_device作为thermal_cooling_device的扩展,最主要两个成员是dyn_power_table和cool_dev->ops,即cpufreq_cooling_ops。

    1.1.3.1.1 dyn_power_table

    由power = (u64) capacitance * freq_mhz * voltage_mv * voltage_mv;计算可得到一组平率和功耗表格。这就用到OPP(Operating Performance Point),也即一组平率电压组合。

    image

    由上述OPP参数,可计算的如下dyn_power_table。

    Capacitance

    Frequency

    Voltage_mv

    Power

    Power

    max_allocatable_power

    311

    208

    1040

    69

    69.9665408

    552

    432

    1040

    145

    145.3151232

    1160

    729

    1090

    269

    269.3648439

    2152

    960

    1180

    415

    415.714944

    3320

    1200

    1330

    660

    660.15348

    5280

    图表 8 dyn_power_table

    1.1.3.1.2 cpufreq_cooling_ops

    cpufreq_cooling_ops主要包含六个操作函数:

    cpufreq_get_max_state:获取最高cooling状态的回调函数,这里指的是208M所对应的状态。

    cpufreq_get_cur_state:获取当前cooling状态的回调函数。

    cpufreq_set_cur_state:这是根据coolingstate执行cpufreq的回调函数,是执行操作的实体。

    cpufreq_get_requested_power:获取当前CPU的功耗值,包括dynamic功耗和static功耗。中间需要用到dyn_power_table进行转换。

    cpufreq_state2power:将CPU cooling状态转换成需要消耗的功耗值。

    cpufreq_power2state:将CPU所能获取的最大功耗值转换成cooling状态。

    1.1.4 Thermal Driver

    hisi_thermal驱动主要获取内存映射、中断资源、时钟信息等,注册中断处理函数,并且添加thermal sensor到thermal zone。中断处理线程函数会更新thermal的温度,同时每个thermal zone都有work queue去轮询读取温度,这一系列操作的核心是hisi_of_thermal_ops。用于读取thermal zone的核心函数是hisi_thermal_get_temp。

    1.1.4.1 DTS配置

    thermal sensor硬件配置信息:

    image

    图表 9 Thermal Sensor DTS

    thermal-zones的配置信息:

    image
    1.1.5 Driver

    image

    图表 10 hisi_thermal_driver

    thermal zone的注册在thermal_init中完成,这要比thermal driver早完成。也正是因为此,才可以在thermal driver中将thermal sensor和thermal zone绑定。这样每个thermal zone就有对应的thermal sensor操作函数,可以读取温度值。thermal_init是fs_initcall,而hisi_thermal_driver是module_init。

    1.1.6 Thermal Device Tree

    Thermal相关的DTS位于:

    arch/arm64/boot/dts/hisilicon/hi6220.dtsi

    主要包括Thermal Sensor和Thermal Zones两部分。

    1.1.7 Intelligent Power Allocator和Step Wise的比较
    1.1.7.1 测试环境

    l Kernel:4.4.14

    l Android:6.0.1

    l 硬件环境:HiKey 2GB RAM+8GB ROM,分辨率1024*768

    l 测试工具:Antutu 6.1.9 + WA 2.5.0

    1.1.7.2 结果分析

    由于没有测量Power仪器,只能分析Performance。

    A、B、C、D四组测试的总分以及分类平均值比较如下:

     

    A

    B

    C

    D

    Overall_Score

    32416.5

    33094

    32350.5

    32594.5

    3D_Score

    2447.25

    2439.75

    2449.75

    2437.25

    UX_Score

    13141.5

    13703.25

    13211.5

    13512.75

    CPU_Score

    12538.25

    12628.25

    12390.25

    12312.75

    RAM_Score

    4289.5

    4322.75

    4299

    4331.75

    图表 11 Thermal Governor和cpufreq Governor比较测试

    从上面数据可以看出:

    a) Thermal、cpufreq governor对于3D和RAM测试项的影响很小。考虑到测试中的误差,基本可以认为对于3D和RAM没有影响。PS:目前的Thermal governor也没有将GPU纳入考虑。

    b) 下面重点分析CPU测试项:

     

    IPA

    StepWise

    IPA-StepWise

    Interactive

    12538.25

    12390.25

    148

    Performance

    12628.25

    12312.75

    315.5

    Interactive-Performance

    -90

    77.5

     

    图表 12 Governors均分比较

    测试前认为IPA应该优于StepWise,Performance优于Interactive。

    从上面的数据可以看出,Performance不一定优于Interactive;但是IPA应该是优于StepWise。

    (PS:是否需要更多测试,以及影响测试结果的条件是否考虑完备。)

    c) 关于UX的分数悬殊是没有预料到的,需要进一步分析。

    (UX结果分析)

    下面是四组测试的柱状图:

    image

    图表 13 Governors比较图

  • 相关阅读:
    ar_track_alvar
    软件、库官方下载地址
    docker build pull 的 意思
    linux 的lsof 工具
    linux 下 tcpdump 抓包分析
    Python集合生成式
    Python集合的创建
    Python集合的数据操作
    Python字符串的创建和驻留机制
    Python集合的相关操作
  • 原文地址:https://www.cnblogs.com/arnoldlu/p/6388151.html
Copyright © 2020-2023  润新知