一、of_parse_thermal_zones()

接着上一节的代码流程,of_parse_thermal_zones() 这个函数粉墨登场,可以说读懂了这个函数,Thermal框架就明白了一大半。那这个函数是干什么用的呢?做了些什么事情呢?函数体有点长,我们拆分来解析:

/*** of_parse_thermal_zones - parse device tree thermal data** Initialization function that can be called by machine initialization* code to parse thermal data and populate the thermal framework* with hardware thermal zones info. This function only parses thermal zones.* Cooling devices and sensor devices nodes are supposed to be parsed* by their respective drivers.** Return: 0 on success, proper error code otherwise**/
int __init of_parse_thermal_zones(void)
{struct device_node *np, *child;struct __thermal_zone *tz;struct thermal_zone_device_ops *ops;np = of_find_node_by_name(NULL, "thermal-zones");if (!np) {pr_debug("unable to find thermal zones\n");/* 即便dts里没有thermal-zones结点也允许thermal core跑起来 */return 0; /* Run successfully on systems without thermal DT */}......
}

需要指出的是,这个函数位于 of-thermal.c 里而不是 thermal_core.c。我们知道,关于 dts 解析的一系列 API 都是 of_xxx() 的形式,所以根据代码位置和函数名,也可以猜到这个函数应该是要解析 dts 里面的东西。首先看注释,说是用来解析设备树 thermal 数据。具体来说,这是一个初始化函数,被用来解析 thermal 数据以及根据硬件 thermal zones 信息来填充 thermal 框架。个人认为 thermal zones 是整个 thermal 框架中最不容易理解的一个概念,本人在代码分析阶段也是反复阅读分析才明白。所谓 zone,就是区域的意思,thermal zone 可以认为是一个温控系统的抽象,比如概述里描述的空调制冷的例子。在这个温控系统里,有温感 sensor,降温设备,温控策略等信息,而 Thermal core 就负责解析出这些信息,并使之有机的 work 起来,各司其职。

还记得概述中最后的 dts 结点吗?我们的分析就是从这个 dts 结点开始。既然要解析 dts 结点,那就得先找到这个结点,这就是 of_parse_thermal_zones() 里做的第一件事,通过 of_find_node_by_name() 找到该结点。注意返回值检查的代码块,打印提示 log 后返回的是 0 而不是 error code,return 0 后面的注释说即便没有 thermal TD 也允许 thermal core 跑起来。没有初始化也能正常 work 起来?根据本人的分析和理解,这是有问题的,因为后面 PM notifier 回调 thermal_pm_notify() 中会去调用 thermal_zone_device_update() 去更新温度及相关信息,而这个函数又进一步会去调用 delayed_work 的回调,但是这个delayed_work 并没有初始化。这个问题先抛出来,感兴趣的读者等代码分析完了可以跟踪代码分析看看。

接下来我们分析是如何找到 thermal_zones 结点的:

/*** of_find_node_by_name - Find a node by its "name" property* @from: The node to start searching from or NULL, the node*     you pass will not be searched, only the next one*     will; typically, you pass what the previous call*     returned. of_node_put() will be called on it* @name: The name string to match against** Returns a node pointer with refcount incremented, use* of_node_put() on it when done.*/
struct device_node *of_find_node_by_name(struct device_node *from,const char *name)
{struct device_node *np;unsigned long flags;raw_spin_lock_irqsave(&devtree_lock, flags);for_each_of_allnodes_from(from, np)if (np->name && (of_node_cmp(np->name, name) == 0)&& of_node_get(np))break;of_node_put(from);raw_spin_unlock_irqrestore(&devtree_lock, flags);return np;
}
EXPORT_SYMBOL(of_find_node_by_name);

首先对临界区上锁,用的是自旋锁,而且是关掉了中断,这样运行这段代码的 cpu 上就不会被中断打断。自旋锁也属于内核基础设施之一,关于它的更多细节,计划以后开专题来研究。for_each_of_allnodes_from(),根据名字也可以猜个七七八八,遍历所有的 dts 结点,并根据传进来的 name 实施匹配。如果匹配上就 break 跳出循环并返回该结点。

Linux Thermal机制源码分析之Thermal zone相关推荐

  1. Linux Thermal机制源码分析之Governor

    一.thermal_init() 在开始源码分析之前,需要先说明一下.Linux 内核代码庞大而复杂,如何 reading the Fxxking source code 相信是很多从事 Linux ...

  2. Linux PPP实现源码分析

    Linux PPP实现源码分析 作者:kwest <exboy@163.com>  版本:v0.7 ©所有版权保留 转载请保留作者署名,严禁用于商业用途 . 前言: PPP(Point t ...

  3. Linux PPP 实现源码分析

    nux PPP实现源码分析 2013-05-21 23:44  6091人阅读  评论(18)  收藏  举报   分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux ...

  4. Apache Storm 实时流处理系统通信机制源码分析

    我们今天就来仔细研究一下Apache Storm 2.0.0-SNAPSHOT的通信机制.下面我将从大致思想以及源码分析,然后我们细致分析实时流处理系统中源码通信机制研究. 1. 简介 Worker间 ...

  5. 第十期-Linux内核补丁源码分析(2)

    作者:罗宇哲,中国科学院软件研究所智能软件研究中心 在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分 ...

  6. Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

    Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadO ...

  7. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  8. linux打印源码,Linux打印机驱动源码分析.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsplinux/Unix相关 Linux打印机驱动源码分析.pdf1 ...

  9. Linux PPP实现源码分析-1

    前言: PPP(Point to Point Protocol)协议是一种广泛使用的数据链路层协议,在国内广泛使用的宽带拨号协议PPPoE其基础就是PPP协议,此外和PPP相关的协议PPTP,L2TP ...

  10. Android——RIL 机制源码分析

    Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...

最新文章

  1. Java机器学习库ML之二Feature Selection(特征选择)
  2. camvid数据集介绍_fastai 官方教程之查看数据
  3. yii框架phpexcel
  4. GPIO8种方式小总结
  5. MySQL循环语句之while循环测试
  6. centos6.5 安装python3.5
  7. 目标检测中的正负样本
  8. promise A+ 原理
  9. php 连接redis服务器
  10. 【排错】exchange2013不能显示所有OU
  11. 【转】Android业务组件化之URL Scheme使用
  12. 简单的开源日志Log4D delphi 6---delphi xe 10全可用
  13. 各种数据集汇总——转载而来
  14. matlab潮流计算编程教学,潮流计算 程序_牛拉法潮流计算程序_matlab潮流计算教程...
  15. Windows python pip换源不生效(window11系统),以及pip下载库包报错 because normal site-packages is not writeable
  16. 线性MMSE检波和ZF检波
  17. 21、人类简史-从动物到上帝(赫拉利)
  18. 7个实用的免费网站托管站点
  19. 乒乓球比赛赛程_这家律所再次摘得业余乒乓球赛事冠军,为何结缘乒乓?
  20. 无法解析服务器的dns地址

热门文章

  1. 华东师范大学2017年数学分析考研试题
  2. 开关电源的电感选择和布局布线
  3. 楼天城楼教主的acm心路历程(作为励志用)
  4. dz论坛非应用商店的插件如何安装教程
  5. es 按条件查询数据总条数
  6. 学习笔记 Tianmao 篇 recyclerView 的自定义使用
  7. java 第七章 数组
  8. eBay运营模式有哪些
  9. STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)
  10. 计算机学院部长换届答辩,未来可期,各自精彩——记计算机科学学院2020年两委换届竞职答辩活动...