SKL+平台XCPM+HWP完整原生电源管理探究

SKL+平台XCPM+HWP完整原生电源管理探究

目的

本文研究在macOS系统(10.11.6+)里SKL+平台使用XCPM+HWP获得完整的原生电源管理,目的在于给SKL+平台的Hackintosh提供兼顾性能与节能的自定义电源管理配置数据解决方案。

目前研究状况

什么工作

  • 目前已经可以实现SKL+平台完整开启XCPM+HWP模式,可自定义修改注入频率向量(FrequencyVectors,以下简称FV)数据
  • 可自定义修改Low Frequency Mode频率(Low Frequency Mode,即空闲频率(某些CPU不支持LFM则用最低档位替代)以下简称LFM),最低可降至800MHZ,甚至500MHZ/400MHZ(我个人未测试未证实)。
  • 可以为默认不开启HWP的机型开启HWP
  • 可自定义能源性能偏好EPP值

什么不工作

  • 在FV里面的18个电源特征/配置参数(Power Features,以下简称PF)里面,目前只有3个(hwp、epp、perf-bias)可以确定其作用,剩余的15个PF作用仍未研究出来。
  • FV里的关于档位的定义研究不透,没有一个有实用价值的解释。(也许HWP控制下是弹性频率,没有中间档的固定值?)

原理

什么是XCPM

XNU CPU电源管理(XNU CPU Power Management,以下简称XCPM),是macOS/OS X系统在Haswell平台开始引入的XNU CPU电源管理模式。相对于Haswell平台以前使用AppleIntelCPUPowerManagement.kext和AppleIntelCPUPowerManagementClient.kext驱动的传统模式,XCPM是集成到内核里面的,效率更高,使用起来更灵活。

更多关于XCPM的资料可以参考Pike的博客文章:点我打开

什么是HWP

HWP是HardWare-controlled Performance states(像传统的ACPI P状态)的缩写。

支持硬件控制的性能状态HWP的处理器可以根据操作系统提供的性能指导提示信息,自动地选择合适的性能状态。

HWP是ACPI定义的协作式处理器性能控制(ACPI-defined Collaborative Processor Performance Control, CPPC)的一种实现,规定了系统可以枚举一个连续的,抽象的无单位的性能值等级(continuous, abstract unit-less, performance value scale),这个值不与特定的性能状态/频率关联。尽管枚举出来的值基本上与一个整型基准测试性能结果成线性关系,操作系统还是需要为实际的业务程序建立性能值范围以便获取实际可以获得的性能。

当启用了HWP时,处理器根据实际的业务程序,自动地选择合适的性能状态,同时还会考虑操作系统提供的限制提示。这些操作系统提供的提示信息包括最小/最大性能界限,倾向于能效还是高性能,以及指定相关的业务程序的历史观察时间窗口。操作系统也有方法可以覆盖HWP的自主性能状态选择,可以指定自己期望的性能状态。但是,可以实际获得的有效频率受制于能效与性能优化的结果。

更多资料参考英特尔®64和IA-32架构软件开发人员手册:点我打开

方法

首先,BIOS里需要打开Intel SpeedStep®技术

仅HWP模式

首先非常有必要说明一下:非常不推荐使用仅HWP模式!

推荐使用XCPM+HWP模式

为什么不推荐的方法我还要写出来?因为这也是研究的一部分,到后面你会发现它们其实是相通的(如果你能理解的话)。

我覺得 Clover EnableHWP 這個選項 完全沒作用。EnableHWP 這個選項,應該是(大部分人)對 HWP 還不完全瞭解時的產物。

PMheart

更多研究资料请参考:链接一链接二链接三链接四

缺陷:

  • 缺失XCPM内核电源管理
  • 睡眠唤醒会丢失HWP(有解决方法,后面会提到)

方法:

  • 禁用XCPM内核电源管理(取消Plugin-Type=1注入即可)
  • Clover_HWP参数设置(Clover的config.plist里勾选HWPEnable、UseARTFrequency以及设置HWPValue值),或者使用HWPEnable.kext驱动
  • 添加Pike提供的MSR_0xE2__xcpm_idle_instant_reboot内核补丁(在具有MSR 0xE2解锁的主板上不需要)
禁用XCPM内核电源管理

为何要禁用它?因为如果使用Clover的EnableHWP+XCPM的话会导致频率锁定最高值(以牺牲XCPM为代价得来HWP,勉强来的是不幸福的!)

一般来说,取消Plugin-Type=1注入即可实现

Clover_disinject_Plugin-Type=1

如果你使用了ssdt-pr.aml(迷你的Plugin-Type注入)或者ssdtPRGen.sh脚本生成的包含Plugin-Type注入的ssdt.aml,请一并删除!

但如果你想在逻辑上更靠谱一点,你可以:

  • Clover的config.plist里设置FakeCPUID=0x0306A0
  • /EFI/CLOVER/kexts/Other里面添加NullCPUPowerManagement.kext(点我下载
FakeCPUID_IvyBridge
NullCPUPowerManagement.kext
Clover_HWP参数设置

在config.plist的CPU项,勾选HWPEnable和UseARTFrequency,然后设置HWPValue参数

如下图的例子:

Clover_HWP_i5-8400-Desktop

我这个例子中的CPU是i5-8400,具有2.8GHZ的主频以及非全核心4GHZ的最大睿频(全核心最高3.8GHZ)。你可以在Intel官网找到CPU相关信息。点我查看

HWPValue参数说明
0x20002801

前两个数字:20

此参数为EPP值(后面会详细有详细介绍),它决定CPU工作状态是偏向性能,还是偏向节能。

取值从00~94,00是最接近高性能的数值,94是最接近节能的数值。

一个简单的粗略划分:

  • 00=>视频编辑、游戏(Mac上玩游戏?哈哈)。需要高性能的朋友可以考虑(前提是你已经准备好足够强大的冷却系统)
  • 20=>平面设计,高清视频。推荐台式机平台的朋友们使用该值
  • 40=>开发网页、写代码。平衡性能模式。
  • 60=>office办公。平衡节能模式。有办公续航需求的朋友可以考虑。
  • 80=>经常使用笔记本电池的朋友们建议使用。

第三和第四个数字一般无需修改,具体起什么作用未知

第五和第六个数字是你当前CPU工作状态的最大睿频

还是看上面的i5-8400例子:

主板默认设置下(没有设置超频),i5-8400最大睿频为4GHZ,即4000MHZ,取前两个数字40,转换成16进制即28,填入即可。

如果你在主板BIOS里设置了OC(超频),那么就填入超频后的16进制值。

这里推荐一个在线进制转换的网站。点我查看

第七和第八个数字一般不用修改,具体起什么作用未知。

如果你不想配置Clover_HWP参数,那么还有另一种方法:使用HWPEnable驱动。

goodwin开发了最初的HWPEnable驱动(goodwin版本的HWPEnable驱动需要安装到LE/SLE里面),用来替代Clover_HWP,效果相同。

该方法存在在睡眠唤醒后丢失HWP的问题,headkaze修改了一份HWPEnable,可以解决该问题,且不再需要安装到LE/SLE里面(放Clover引导里就行)。点我下载

添加MSR_0xE2__xcpm_idle_instant_reboot内核补丁
Comment: MSR 0xE2 _xcpm_idle instant reboot (c) Pike R. Alpha
MatchOS: 10.11.x,10.12.x,10.13.x,10.14.x,10.15.x
Find:    20b9e200 00000f30  
Replace: 20b9e200 00009090 

作用:在具有锁定MSR 0xE2的主板上使用HWP需要添加该内核补丁来防止内核崩溃重启。(Tips:你还需要勾选KernelPM来绕过内核对MSR 0xE2的写入)

部分主板BIOS提供CFG Loack选项,将其设置为Disabled可以解除MSR 0xE2的写入保护。

KernelToPatch_MSR_0xE2__xcpm_idle_instant_reboot

XCPM+HWP模式

前面说了那么多都是饭前小吃(希望你别已经饱了哦),下面开始进入本文重要内容。

XCPM+HWP模式,顾名思义,就是在启用XCPM的同时也启用HWP。白果MacBook、MacBookPro也是使用该模式。(注意:白果iMac或其它机型默认不使用HWP哦!)

优势或缺陷

优势:在使用HWP的同时XCPM也能正常工作,兼顾性能与节能。

缺陷:目前没有。(频率向量关于档位的定义暂不清楚)

方法:

  • 注入Plugin-Type=1属性
  • 设置逻辑上应启用XCPM内核电源管理的SMBIOS机型
  • 注入自定义频率向量(FV)
  • 添加MSR_0xE2__xcpm_idle_instant_reboot内核补丁
注入Plugin-Type=1属性

一般来说,在Clover的config.plist的Generate Options下勾选PluginTypes即可实现给CPU0/PR00/C000/P000注入Plugin-Type=1属性

Clover_Inject_Plugin-Type=1

但不排除某些特殊(奇葩)主板使用特殊名字或路径,这种情况下,就需要我们使用迷你的ssdt-pr(仅注入Plugin-Type)来注入该属性。

需要在第一个CPU设备下注入:

Method (DTGP, 5, NotSerialized)
        {
            If ((Arg0 == ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
            {
                If ((Arg1 == One))
                {
                    If ((Arg2 == Zero))
                    {
                        Arg4 = Buffer (One)
                            {
                                 0x03                                             
                            }
                        Return (One)
                    }

                    If ((Arg2 == One))
                    {
                        Return (One)
                    }
                }
            }

            Arg4 = Buffer (One)
                {
                     0x00                                             
                }
            Return (Zero)
        }

        Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
        {
            Local0 = Package (0x02)
                {
                    "plugin-type", 
                    One
                }
            DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
            Return (Local0)
        }

以CPU0为例:

它可以是在_PR下面:

_PR_CPU0_Plugin-Type=1

也可以是在_SB下面:

_SB_CPU0_Plugn-Type=1

CPU设备名称是什么?你可以使用终端输入如下命令回车

ioreg -p IODeviceTree -c IOACPIPlatformDevice -k cpu-type -k clock-frequency | egrep name | sed -e 's/ *[-|="<a-z>]//g'

如下图所示,我的笔记本是CPU0

Show_CPUName

完整路径可以使用MaciASL软件很方便查找到。

这里有宪武提供的迷你ssdt-pr。(如果CPU名称或路径不匹配,请自行修改哦)

点我下载(注意:dsl文件需要编译成aml文件再使用)

设置正确的SMBIOS机型

我不知道这是否有必要,但是,在逻辑上,我们应该选用默认使用XCPM内核电源管理的SMBIOS机型。

这意味着是Haswell或更新平台的SMBIOS:

  • MacBook8,1或更新
  • MacBookPro11,1或更新
  • MacBookAir6,1或更新
  • Macmini7,1或更新
  • iMac14,1或更新
  • iMacPro1,1或更新
  • MacPro7,1或更新

一般来说,只要使用了默认开启HWP的机型,你就可以获得完整的XCPM+HWP模式 了。

请注意:在白果机型里只有笔记本是默认开了HWP的,台式机是默认不使用HWP的。

PMheart告诉我大概两年前有过一次讨论,台式机开启HWP会损失有些性能。但我认为,兼顾性能与节能才是最好的状态!毕竟很少有人的台式机是每时每刻都是满载工作的。

默认开启HWP的机型:

  • MacBook9,1或更新
  • MacBookPro13,1或更新
  • MacBookAir8,1或更新

那我们应该如何选择呢?

方法很简单:对号入座。

如果你是台式机,使用iMac机型或iMacPro(为了14.5和以上系统a卡开启单卡硬件加速必须使用该机型)

如果你是笔记本,使用MacBook,MacBookPro,MacBookAir机型

请注意:你的机器需要是SKL或更新的平台才能支持HWP哦!

注入自定义频率向量(FV)

如果你使用的是默认不使用HWP的机型对默认使用HWP的机型默认的电源管理数据不满意,你可以使用下面的方法注入自定义的频率向量(FV)。

频率向量(FrequencyVectors,简称FV)存在于X86PlatformPlugin.kext驱动的Resources的对应plist文件,这些plist文件存储的是macOS系统给不同机型配置的不同电源管理数据(包括变频睿频,ASPM,AGPM,似乎还有“温度墙”等等)。

在这里,我们仅讨论Frequencies和FrequencyVectors。

以MacBookPro15,1(Mac-937A206F2EE63C01)的plist为例:

MacBookPro15_1_plist

上图的Frequencies数组里面的代表CPU最大睿频,每一项后面都标注了一个索引。FrequencyVectors数组里每一个索引都跟Frequencies数组里的索引相对应,后面储存的7668位的数据即为FrequencyVectors。

系统是如何根据不同的CPU来选用不同的FrequencyVectors的呢?答案很明显,通过CPU的最大睿频值来选用索引值所对应的FrequencyVectors。(PMheart告诉我,如果CPU最大睿频值不匹配任何一个数值,那么会默认使用FrequencyVectors[0],即FrequencyVectors下的第一组数据。

如何理解FrequencyVectors里的7668位数据呢?

我们可以打开系统自带的文本编辑软件,拷贝一组数据到里面,如何进行拆解分析。

FrequencyVectors_analysed_1
FrequencyVectors_analysed_2

以上两张图是我标注出来的比较有意义的数值

其中的LFM、HWP、EPP值是我们需要重点关注的。

  • LFM:闲时频率(通俗点可以说最低档)
  • HWP:HWP的开关
  • EPP:Energy Performance Preference的缩写(能源性能偏好)
LFM

默认情况下,FV里定义的LFM基本都是0x0D(转换为10进制为13,代表1300MHZ)。如果你想把闲时频率设定为Intel官方所设计的频率800MHZ,你只需要把0x0D修改为0x08(转换为10进制为8,代表800MHZ)。

Tips:曾经有人做过测试,结果表明更低的LFM不会带来更好的电池续航。

HWP

默认情况下,只有移动平台的SMBIOS机型才会默认开启HWP,对于默认关闭HWP的机型,我们可以使用默认开启HWP的机型的plist为模板修改注入。

68 77 70 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

这一段数据,代表这HWP的开关,数值在倒数第七个数字,01即为开启,00即为关闭。

EPP

EPP是能源性能偏好,控制着是优化性能,还是优化节能。

65 70 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

在上面的数据里,关键在于第41和第42个数字,取值范围是0x00~0x94。

一般来说移动平台默认使用80这个数值,偏向节能优化。

关于如何选取合适的数值,在上文的仅HWP模式章节里有一个简单粗略的说明可以参考。点我查看

像LFM,HWP,EPP这些FV里面的参数,他们称为Power Feature(简称PF)。除了以上介绍的三个PF值外,还有大概15个PF值。关于他们的作用目前研究不多,尚不清楚。感谢Pike R. Alpha提供的数据。点我查看

hard-rt-ns		
68 61 72 64 2D 72 74 2D 6E 73 00 00 00 00 00 00 00 00 00 00 00 09 3D 00


ubpc				
75 62 70 63 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00


off				
6F 66 66 00 00 00 00 00 00 00 00 00 00 00 00 00


on				
6F 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00


hwp				
68 77 70 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
#HardWare-controlled Performance states.
#HWP的开关


epp				
65 70 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 92 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# Energy Performance Preference.
#
# Conveys a hint to the HWP hardware. The OS may write a range of values from 0 (performance preference) to 0FFH (energy efficiency preference)
# to influence the rate of performance increase / decrease and the result of the hardware's energy efficiency and performance optimizations. The
# default value of this field is 80H.
#
# Note: If CPUID.06H:EAX[bit 10] indicates that this field is not supported, HWP uses the value of the IA32_ENERGY_PERF_BIAS MSR (perf-bias) to
#determine the energy efficiency / performance preference.
# 00~94 00是最接近高性能的值,94是最接近省电的值,建议desktop用20,laptop用80


epp_override		
65 70 70 5F 6F 76 65 72 72 69 64 65 00 00 00 00 00 00 00 00 78 00 00 00


perf-bias			
70 65 72 66 2D 62 69 61 73 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
				
70 65 72 66 2D 62 69 61 73 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00
#允许受支援的英特尔处理器上的软体更主动地回应,以决定最佳效能与省电之间的平衡。这并不会覆盖其它省电政策。可指定的值从0到15(0xF),0是最佳效能,而15是最省电。


utility-tlvl		
75 74 69 6C 69 74 79 2D 74 6C 76 6C 00 00 00 00 00 00 00 00 28 00 00 00

75 74 69 6C 69 74 79 2D 74 6C 76 6C 00 00 00 00 00 00 00 00 3d 00 00 00

75 74 69 6C 69 74 79 2D 74 6C 76 6C 00 00 00 00 00 00 00 00 3e 00 00 00

75 74 69 6C 69 74 79 2D 74 6C 76 6C 00 00 00 00 00 00 00 00 4e 00 00 00

75 74 69 6C 69 74 79 2D 74 6C 76 6C 00 00 00 00 00 00 00 00 4f 00 00 00


non-focal-tlvl		
6E 6F 6E 2D 66 6F 63 61 6C 2D 74 6C 76 6C 00 00 00 00 00 00 FA 00 00 00


iocs_engage		
69 6F 63 73 5F 65 6E 67 61 67 65 00 00 00 00 00 00 00 00 00 00 6A 18 00 00 00 00 00 00 00 00 00 00 00 00 00


iocs_disengage		
69 6F 63 73 5F 64 69 73 65 6E 67 61 67 65 00 00 00 00 00 00 A0 25 26 00 00 00 00 00 00 00 00 00 00 00 00 00


iocs_cstflr		
69 6F 63 73 5F 63 73 74 66 6C 72 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


iocs_rtrigger		
69 6F 63 73 5F 72 74 72 69 67 67 65 72 00 00 00 00 00 00 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


ratioratelimit		
72 61 74 69 6F 72 61 74 65 6C 69 6D 69 74 00 00 00 00 00 00 C0 C6 2D 00 00 00 00 00 00 00 00 00 00 00 00 00


io_epp_boost		
69 6F 5F 65 70 70 5F 62 6F 6F 73 74 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


ring_mbd_ns		
72 69 6E 67 5F 6D 62 64 5F 6E 73 00 00 00 00 00 00 00 00 00 10 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00


ring_ratio		
72 69 6E 67 5F 72 61 74 69 6F 00 00 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

以上就是目前知道的PF值(大概18个)。

epp/epp-override/perf-bias这三组PF这会使用其中一组。

FV里面还有许多数据,除去一大串无意义的00,剩下的数据应该跟频率档位控制有关,可惜目前研究不够深入,尚不能准确清楚的定义这些数据的意义

猜测

关于FV里的频率档位,我做了一个大胆的猜测。

我使用Diffchecker软件对两组FV数据进行对比,发现它们这有固定位置的5组数据不一样,其它的都是一样的。而且经过数据分析,我发现它们转换成10进制后比较符合频率档位的特征,我的大胆猜测就是这些变化的数据就是所谓的“频率档位”。但是我没有确凿的证据来证明它。

另外,PMHeart告诉我XCPM中有提供部分power feature值浮动调节机制,所以在plist中直接修改这些值并无意义。

FV_Diffchecker
FV_Frequencys
节能优化键值

如果你想要更节能的电源管理数据,除了降低LFM到800MHZ,定义EPP为80,甚至94外,你还可以尝试在plist上添加以下键值。这些键值应该起到优化节能之类的作用。这些键值是MacBook9,1的plist带有的。

power_reduced_playback
thermally_optimized_xcode
optimized_photobooth
optimized_screensavers
optimized_slideshows
optimized_visualizers
thermally_optimized_maps
MacBook9_1_plist

听说MacBook8+中包含的一些特殊键值确实对电池续航有改善作用。

上面介绍了FV的结构以及可自定义配置的参数。下面我给大家介绍如何注入自定义修改过的FV数据。

使用CPUFriend

在这里,我给大家介绍一款十分好用的神器:CPUFriend 点我查看

鉴于某些原因,你可能需要修改 X86 下的电源管理数据达到某些目的。(如为 iMac 机型开启 HWP ;为较新的笔记本机型修改最低频率等)此前常用的方法是直接修改 X86 ,或者通过注入器空壳的方式,并将其安装至 /L/E 下。
为方便注入以及达到“无系统修改”的目的,在 vit9696 的帮助下,我写了 CPUFriend 来动态注入这些数据。

PMheart

通过PMheart的CPUFriend,我们可以很方便地注入自定义的CPU电源管理数据。

具体使用方法可以在远景论坛GitHub上找到,本文也简单介绍一下使用方法:

1.下载最新的预编译release版CPUFriend.kext,放入Clover引导中。 点我下载

2.自定义修改一份plist文件

3.使用项目自带的脚本把plist文件转换成CPUFriend可以读取并使用的格式。

CPUFriend.kext是必须的,脚本可以生成kext或者ssdt,两者二选一即可。

假设你把脚本文件和修改好的1.plist文件都放在了桌面上。脚本点我查看

生成CPUFriendDataProvider.kext(操作方便)

cd ~/Desktop
ResourceConverter.sh --kext 1.plist

生成ssdt_data.dsl(速度更快)

cd ~/Desktop
ResourceConverter.sh --acpi 1.plist

如果你选择生成kext,那么直接把该kext也放入Clover引导中即可。

如果你选择生成ssdt_data.dsl文件,那么你修改使用iasl编译器,或者使用MaciASL软件把dsl编译成aml,然后放入/EFI/CLOVER/ACPI/patched中。如果你正在使用ssdtPRGen.sh生成的变频ssdt,你需要合并两份文件,否则两份aml的两个_DSM方法会冲突。

合并方法:

使用MaciASL软件打开ssdtPRGen生成的SSDT文件,找到_DSM方法,把ssdt_data.dsl文件里面的”cf-frequency-data”及其数据拷贝到plugin-type项后面。

修改完的_DSM方法它看起来像这样:

        //
        // Context of the SSDT generated by ssdtPRGen.sh
        //
        Method (_DSM, 4, NotSerialized)
        {
            If (LEqual (Arg2, Zero))
            {
                Return (Buffer (One)
                {
                     0x03
                })
            }

            Return (Package () // size removed, just let the compiler fill it up
            {
                "plugin-type", 
                One,
		
                //
                // Paste it from ssdt_data.dsl
                //
                "cf-frequency-data",
                Buffer () // size removed, just let the compiler fill it up
                {
                    // Data from ssdt_data.dsl
                }
            })
        }
	//
	// Context of the SSDT generated by ssdtPRGen.sh
	//

如果你编译报错,检查粘贴的位置是否正确,检查Package()里定义的包范围是否太小,你可以直接删掉该数值(留空),编译的时候让编译器帮你自动计算。

添加MSR_0xE2__xcpm_idle_instant_reboot内核补丁

此部分内与上文4.1.3章节的内容一样。点我查看

验证

按照本文XCPM+HWP模式修改并注入自定义FV后,我们如何来验证是否起作用了呢?

测试工具

在这里,我推荐使用:

  • HWMonitor:监测CPU实时频率和温度(需要安装额外的传感器驱动) 点我下载
  • Intel(R) Power Gadget:Intel官方出品的CPU频率和温度监测工具 点我下载
  • Hackintool:其中集成的AppleIntelInfo驱动可以获取并打印输出有关CPU的各种状态信息 点我下载
  • CINEBENCH R15:一款基于Cinem4D引擎的CPU/GPU测试软件 点我下载

为何不推荐使用CPU-S这个软件?

因为该软件无法准确测量HWP工作模式下的CPU频率表现,具体表现为测试结果缺失中低段的频率。

HWMonitor
Intel(R)_Power_Gadget
Hackintool
CINEBENCH_R15_OSX

i5-8400测试

以i5-8400为例:

以MacBookPro15,1的plist为模板,修改LFM值为08(800MHZ),修改EPP值为0x20,通过CPUFriend注入,使用iMacPro1,1机型运行CINEBENCH R15的CPU测试。

最高睿频全核心3.8GHZ
最低频率可到800MHZ

i5-8400官方设计最高睿频4GHZ是非全核心的,全核心最高睿频是3.8GHZ

注意:如果你使用的是华硕主板,请把BIOS设置的AI Tweaker选项卡里的CPU最大倍频修改为Sync All Cores,否则CPU无法睿频到4GHZ以上。这主要影响i7,i9等CPU。

Hackintool_AppleIntelInfo

注意:使用Hackintool获取并打印CPU信息的时候不要勾选启用HWP!

Hackintool_enableHWP
Hackintool_IA32_HWP_REQUEST(774)
Hackintool_CFG-Lock

部分成果分享

对于没有能力理解并自行修改FV的朋友,我在这里提供几份定制好的CPUFriendDataProvider.kext,有需要的朋友可以来使用。

以下文件全部基于MacBookPro15,1的plist来修改

文件名文件说明下载地址
CPUFriendDataProvider_MacBookPro15_1_LFM-800_EPP-00_perf-bias-00_performance-optimized.kext极致性能下载
CPUFriendDataProvider_MacBookPro15_1_LFM-800_EPP-20.kext优化性能
台式机推荐使用
下载
CPUFriendDataProvider_MacBookPro15_1_LFM-800_EPP-40.kext平衡性能下载
CPUFriendDataProvider_MacBookPro15_1_LFM-800_EPP-60.kext平衡节能下载
CPUFriendDataProvider_MacBookPro15_1_LFM-800_EPP-80.kext优化节能
笔记本推荐使用
下载
CPUFriendDataProvider_MacBookPro15_1_LFM-1300_EPP-80_RAW-DATA.kextMacBookPro15,1
原始数据
下载

Credits

  • Apple for macOS
  • kolyapatrik for HWPValue
  • headkaze for HWPEnable.kext
  • shuhungsyscl find the method HWP(Intel Speed Shift) enable with full power management
  • PMheart for CPUFriend
  • Pike R. Alpha for _xcpm_idle patch stop the kernel panic and Power Feature
  • XianWu for ssdt-pr Collection
  • Mison write this article with the help of PMheart

讨论

遇到问题?可以加入我们一起来研究讨论:

QQ群:715388432(黑苹果进阶完善群)

Telegram(以后添加)

Written by

Mison

2 thoughts on “SKL+平台XCPM+HWP完整原生电源管理探究

  1. 请问怎么让CPU持续最高频率运行呢,就像Windows的“高性能”电源计划那样。
    iMac19.1,i5-8500+RX590,我觉得变频意义不大,因为我希望CPU持续最高频来获得最佳的响应速度。
    现在CPU(驱动原生电源管理无CPUFRIEND是2-3之间波动,除非跑分否则都不会到最高的4.0G,感觉浪费性能)。
    用了您的CPUFriendDataProvider最高性能没看出CPU变频比之前更激进。
    有相关的讨论,设置HWPValue来定频,但是我测试iMac19.1/2均无效,无论怎么设置值,打印CPU信息HWP数字不变。
    您有什么建议呢。

    1. iMac19,1和iMac19,2默认开启HWP(你可以检查频率向量获得相关信息),且默认EPP值为00,所以iMac19机型的白果跑FCPX双机位或预览4k素材不会卡,然旧的iMac机型默认没有开HWP,就会卡顿。你要是想锁定最高频,可以在clover里勾上PlugnType以及HWPEnabe(这两项功能冲突会导致CPU频率锁定最高频)。不建议这样做,使用iMac19机型的默认设置已经足以实现高性能FCPX需求。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code