本来一直没有注意到这个点,是 @asto18089 (他好像还没来akr)使用他那敏锐的嗅觉和丰富的计算机知识,提出了大胆的猜想,才让正确的降压方式浮出水面
此帖以8996为例,可以推广到8998/660平台

传统/错误的降压方式

修改qcom,cpr-voltage-ceiling
这是在各种第三方内核中非常常见的一种降压方式,因为这里指定了每个频率可以使用的最大电压,修改它仿佛非常有效。但是,它真的有效吗?
打印了regulator的电压表,结果非常有趣:即使是最高频率的ceiling voltage也远远没有达到qcom,cpr-voltage-ceiling的值。在我的中等体质820上,2150mhz的ceiling voltage是1025mV,远远没有达到dt中的1140mV。另外,许多频率的qcom,cpr-voltage-ceiling都是相同的,而这些频率显然不会使用相同的电压。
那么,电压究竟是如何调节的,qcom,cpr-voltage-ceiling究竟扮演了怎样的角色?

源码分析

我们从源码来看看电压究竟是如何生成的
首先在此处 hardcode了一些电压,它们是什么?有什么含义?
我们继续往下看,在此处,那些hardcode的电压(ref_volt)被执行了一个cpr3_convert_open_loop_voltage_fuse操作,那么它是干啥的?
我们找到这个方法的本体,可以看到它在解析一些数据(判断符号位,然后按照正负号加减),这些数据又是从哪里来的?
仗着刨根问底的精神,我们找到了数据的来源,上面的注释写着reads a CPR3 fuse parameter out of eFuses,到这里,一切就很明朗了,这是在从芯片中读取预设的体质电压偏离值。也就是说,高通在出厂前测好了体质,把电压烧进eFuse,然后regulator会根据当前eFuse中的体质对默认电压进行偏移
别急,我们继续往下看
在读取并使用eFuse中的电压之后, 在这里,内核又对电压进行了新一轮的调整。那么,它的数据来自哪里?
我们继续追随源码,在 此处找到了偏移的来源:qcom,cpr-open-loop-voltage-fuse-adjustment
我们回到 dt,可以看到此处确实存储了电压的偏移数据,而内核正是应用了这些偏移值
那么问题来了,ref_volt只有那几个值,偏移又不会使值变多,那对应到每个频率的电压是哪里来的?
高潮来了,精准到每个频率的电压,竟然是 插值 出来的😂插值算法 在此
这可真是令人震惊,奇怪的操作又增加了
回到正题,ref_volt究竟代表着什么?
其实,答案已经写明。此处的数值是指频率表中的第几个频率,而经过各种偏移后的ref_volt正是这几个频率的电压,而其它频率的电压,来自于插值
你以为就这么结束了吗?
还没呢,插值完成后,电压会被 再一次偏移,这一次的偏移来自于qcom,cpr-open-loop-voltage-adjustment,并且是针对每一个频率的(插值后已经有了每一个频率的电压)
在这里我们可以找到这次偏移的数据
到此为止,开环电压的初始配置也就完成了,全程没有看到qcom,cpr-voltage-ceiling的身影,是不是莫名嘲讽?

正确的降压方式

  • 修改ref_volt
  • 修改qcom,cpr-open-loop-voltage-fuse-adjustment
  • 修改qcom,cpr-open-loop-voltage-adjustment

总之,别摆弄qcom,cpr-voltage-ceiling