Linux Thermal3

开始之前~_

如果你喜欢,聊历史,思哲学,品诗集,赏国学。

那就关注公众号:二校五叔

这个是博主的文学公众号啦

这篇主要跟踪thermal probe的过程
首先是probe函数:
在msm_thermal_dev_probe(struct platform_device *pdev)函数中

static int msm_thermal_dev_probe(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;  //获得此设备的设备节点
	struct msm_thermal_data data;  //属于这个driver的结构体
	
	memset(&data, 0, sizeof(struct msm_thermal_data));
	data.pdev = pdev; //把设备结构体赋值给thermal data结构体

	ret = msm_thermal_pre_init(&pdev->dev); //thermal的前初始化,里面涉及到tsens_device_list的列表,有空再展开
	
	//用来进行检查温度polled的tsens的id,通常是最接近cpu0的那个tsens
	key = "qcom,sensor-id";ret = of_property_read_u32(node, key, &data.sensor_id);
	//去读sensor的采样间隔,单位是ms
	key = "qcom,poll-ms";ret = of_property_read_u32(node, key, &data.poll_ms);
	//阈值温度threshold,超过这个温度就开始cpu降频,单位是摄氏度
	key = "qcom,limit-temp";ret = of_property_read_u32(node, key, &data.limit_temp_degC);
	//低于阈值温度,使CPU频率上升
	key = "qcom,temp-hysteresis";ret = of_property_read_u32(node, key, &data.temp_hysteresis_degC);
	//减低cpu频率的步数
	key = "qcom,freq-step";ret = of_property_read_u32(node, key, &data.bootup_freq_step);
	//如果是online core需要支持hotplug cpu
	key = "qcom,online-hotplug-core";
	if (of_property_read_bool(node, key))
		online_core = true;
	else
		online_core = false;

	probe_sensor_info(node, &data, pdev);//获得各种sensor的信息,存储在数组结构体中struct msm_sensor_info *sensors
	ret = probe_cc(node, &data, pdev);//初始化相关threshold温度值
	ret = probe_freq_mitigation(node, &data, pdev);//初始化降频的阈值温度,和需要下降的频率
	ret = probe_cx_phase_ctrl(node, &data, pdev);//初始化cx_phase control功能
	ret = probe_gfx_phase_ctrl(node, &data, pdev);//同上初始化gfx_phase control功能
	ret = probe_therm_reset(node, &data, pdev);//初始化reset功能
	ret = probe_vdd_mx(node, &data, pdev);//VDD MX restriction 相关
	//下面是可以选择的qcom属性
	ret = probe_psm(node, &data, pdev); //有关pmic
	update_cpu_topology(&pdev->dev); //不知道用来做什么的
	ret = probe_vdd_rstr(node, &data, pdev);//VDD restriction 相关
	ret = probe_ocr(node, &data, pdev); //optimum current request 相关
	ret = fetch_cpu_mitigaiton_info(&data, pdev);//各种频率相关的enable
	//创建所需要的node
	msm_thermal_add_psm_nodes();
	msm_thermal_add_vdd_rstr_nodes();
	msm_thermal_add_sensor_info_nodes();
	msm_thermal_add_ocr_nodes();
	create_cpu_topology_sysfs();
	
	msm_thermal_ioctl_init();//注册字符设备流程,见下
	ret = msm_thermal_init(&data); //字符设备和dts的节点都读取到后,接下来就进行初始化thermel,见下
}
//注册字符设备流程
int msm_thermal_ioctl_init()
{
	ret = alloc_chrdev_region(&thermal_dev, 0, 1,MSM_THERMAL_IOCTL_NAME);//向系统申请未被占用的设备号
	msm_thermal_major = MAJOR(thermal_dev);//获得主设备号

	thermal_class = class_create(THIS_MODULE, "msm_thermal");//内可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用device_create()函数来在/dev目录下创建相应的设备节点
	therm_device = device_create(thermal_class, NULL, thermal_dev, NULL,MSM_THERMAL_IOCTL_NAME);//cat proc/devices可以看到
	msm_thermal_dev = kmalloc(sizeof(struct msm_thermal_ioctl_dev),GFP_KERNEL);//给字符设备结构体分配空间
	memset(msm_thermal_dev, 0, sizeof(struct msm_thermal_ioctl_dev));//清空
	sema_init(&msm_thermal_dev->sem, 1); //初始化互斥量
	cdev_init(&msm_thermal_dev->char_dev, &msm_thermal_fops);  //用于初始化cdev的成员,建立cdev和ops之间的链接
	ret = cdev_add(&msm_thermal_dev->char_dev, thermal_dev, 1); //向系统注册字符设备
}
传感器信息节点的设备表示应该是:
compatible: "qcom,sensor-information"
子节点:qcom,sensor-information-<id>
子节点需要的属性:
qcom,sensor-type:sensor的类型,一个sensor的类型可以有:tsens,alarm,和adc
		tsens:是在msm硅芯片上的
		alarm:是在pmic硅芯片上的
qcom,sensor-name:sensor的名字
qcom,alias-name:别名对应一个设备,像gpu/pop-men,他们的温度是和定义在子节点sensor的温度相关。有cpu的为别名的设备,这个节点不能用,thermel驱动中根据sensor定义在profile文件中的名字定义cpu的别名
qcom,scaling-factor:需要乘以传感器温度的单位才能在摄氏温度下获得温度单位。如果这个属性不存在,那么一个默认的比例因子1被分配给一个传感器。

在probe_cc函数中的一些设备节点读取:
首先num_possible_cpus(), num_present_cpus的数量大于1的话,就core_control_enabled = 1;hotplug_enabled = 1;
qcom,core-limit-temp:达到threshold温度就开始关闭cpu core,单位摄氏度
qcom,core-temp-hysteresis:cpu core将按顺序上线,当温度低于某个值,与上一个相对应
qcom,hotplug-temp:到达threshold温度就开始关闭cpu core,单位摄氏度。这个节点被使用的时间是,基于cpu core控制的polling 模式结束的时候。core-limit-temp是用在early boot阶段,之后是thermal_sys阶段提供hotplug模式
qcom,hotplug-temp-hysteresis:当温度低于某个值的时候,thermal将不会强制cpu core强制下线。这个时候cpu core可以被online如果需要的话。
之后就给mit_config(cooling的一些相关信息)的其中一个结构体赋值,cpu热插拔的名字为hotplug,它的disable函数为thermal_cpu_hotplug_mit_disable。
在probe_freq_mitigation进行一些降频的配置,读取的设备节点为:
qcom,freq-mitigation-temp:阈值温度,超过threshold温度后要降低cpu最大的频率。polling模式下的频率控制disabled后才使用这个模式。和limit-temp的不同是,limit-temp是用在early boot阶段,先于thermal_sys可以使用的时候。也可以这么说,这个emergency 降低频率方式是把频率降低到设置好的值的一个步骤而已,相反于boot-up阶段的一步一步降频的方法。
qcom,freq-mitigation-temp-hysteresis:和上面相反,低于这个温度thermal不会降低cpu最大频率
qcom,freq-mitigation-value:当freq-mitigation-temp温度到达后,cpu core的频率需要下降到这个值,单位是hz
把freq_mitigation_enabled置1,
然后赋值mit_config结构体的名字为cpufreq,设置cpu降频disabled的函数thermal_cpu_freq_mit_disable
probe_cx_phase_ctrl
qcom,disable-cx-phase-ctrl:如果这个节点定义了,将取消cx phase control以及相关的功能,不明白这个是做什么的
qcom,rpm-phase-resource-type:RPM 资源的名字,用来	发送temperature bands给CX and GFX phase selection.如果其他属性请求CX and GFX的资源就需要定义这个。
qcom,rpm-phase-resource-id:RPM 资源的id号,同上
qcom,cx-phase-resource-key:key name 用来从CX端发送信息给RPM端的
qcom,cx-phase-hot-crit-temp:到达这个温度threshold后,发送HOT_CRITICAL给RPM,这个将帮助RPM决定CX rail phases所需要的数量。
qcom,cx-phase-hot-crit-temp-hyst: 低于这个温度,将发送WARM给RPM,同上
调用sensor_mgr_init_threshold函数,来初始化这个功能的threshold值?同时注册了cx_phase_ctrl_notify来进行相关功能使用
然后赋值mit_config结构体的名字cx_phase,同时设置其disable函数thermal_cx_phase_ctrl_mit_disable
接下来的probe_gfx_phase_ctrl同上
接下来的probe_therm_reset同上,这里面比较简单:
qcom,therm-reset-temp:超过这个温度,ktm将会开始进行看门狗重启,当这个节点被定义后ktm将会在boot的时候监视全部tsens,并且初始化安全的看门狗重启机制,只要有tsens的温度到达这个threshold,就会reset。这个机制会生成更多的dump信息。回调函数为therm_reset_notify,如果温度高执行函数msm_thermal_bite,不知道是做什么的

qcom,boot-frequency-mitigate: Enable thermal frequency mitigation during boot.
qcom,emergency-frequency-mitigate: Enable emergency frequency mitigation.
qcom,hotplug-mitigation-enable: Enable hotplug mitigation. This enables hotplug mitigation both during boot and emergency condition.

现在不妨换换思路,瞧点文学东西

如果你喜欢,聊历史,思哲学,品诗集,赏国学。

那就关注公众号:二校五叔

这个是博主的文学公众号啦^ _ ^

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值