P-state
P-state 1. Overview ? CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST 2. P-state Control ? 1)??????? Detect & Enable P-state ? BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。 2)??????? Supported P-states ? 当BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize、NumStates,所有这些信息都可以通过CPU MSR直接或者间接的获得,其中MinRatio MaxRatio都可以从PLATFORM_INFO中获得(不同的bits),NumStates就是二者的差,有一点需要注意的是如果NumStates > 16,RatioStepSize就会加1直至NumStates <= 16为止。CPU的工作频率 = BCLK * Ratio,旧架构的CPU BCLK通常是由clock gen给出的,通常上是100/200 MHZ。新架构下CPU clock gen是内置的,BCLK固定是100MHZ。 MinRatio = PLATFORM_INFO MaxRatio = PLATFORM_INFO RatioStepSize = 0x01 NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1 ? If(NumStates > 0x10) { RatioStepSize += 1 NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1 } ? 3)??????? Turbo Mode ? Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermal、current、power的信息从而根据这些信息动态的增大CPU以及IGPU的frequency。CPU可以工作在[Max Non-Turbo,Max Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 report给OSPM,另外Turbo Mode的Ratio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermal、current、power的门限值,BIOS可以通过设置这些参数影响Turbo Mode的Performance。 4)??????? Over Clock ? 某些Stepping的CPU具有Over Clock的功能,BIOS Detect并Enable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OC的CPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。 5)??????? ACPI Structure For P-state ? l???????? _OSC & _PDC ? _0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。 l???????? _PSS Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量 并且通过一个packaged list的形式回报出该P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0个package表示该平台所支持的最高的P-state,第n个package表示最低的P-state。Packaged lists的格式如下所示,其中需要说明的是关于Control和Status这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较 以确定P-state切换是否已经完成。 Name (_PSS,Package() {?????? // Field Name????????????????????? Field Type ? ??? Package ()????????????? // Performance State 0 Definition – P0 ??? {? ??????? CoreFreq,????????????????????????? // DWordConst ??????? Power,????????????????????????????? // DWordConst ??????? TransitionLatency,???????????????? // DWordConst ??????? BusMasterLatency,????????????????? // DWordConst ??????? Control,?????????????????????????? // DWordConst ??????? Status????????????????????????????? // DWordConst ??? }, ??? . ??? . ??? . }) // End of _PSS object 前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。 Name (_PSS,Package() ??????? { ??????????? Package(){1600,21500,10,0x0010,0x0010},// Performance State zero (P0) ??????????? Package(){1500,14900,0x000F,0x000F},// Performance State one (P1) ??????????? Package(){1400,8200,? 10,0x000E,0x000E}? // Performance State two (P2) Package(){1300,0x000D,0x000D},// Performance State one (P3) ??????????? Package(){1200,0x000C,0x000C}? // Performance State two (P4) ??????? }) // End of _PSS object ? 另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。 l???????? _PCT ? Performance Control用于将P-state MSR interface Report给OSPM,OSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample code,OSPM透过_PCT得知是native mode,当系统切换P-state时,它应该就会通过MSR IA32_PERF_CTRL和IA32_PERF_STATUS的方式来进行。 Name(_PCT,Package ()????? // Performance Control object ??????? { ??????????? ResourceTemplate(){Register(FFixedHW,0)},???? // PERF_CTRL ??????????? ResourceTemplate(){Register(FFixedHW,0)}????? // PERF_STATUS ??????? }) // End of _PCT object ? l???????? _PPC ? Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSS中report的所有的P-state [p0,pn]; return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(/_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states。 Method (_PPC,0)?????? // Performance Present Capabilities method ??????? { ??????????? If (/_SB.DOCK) ??????????? { ??????????????? Return(0) // All _PSS states available???? ??????? } ??????????? If (/_SB.AC) ??????????? { ??????????????? Return(1)????? // States 1 and 2 available ??????????? } ??????????? Else ??????????? { ??????????????? Return(2)????? // State 2 available ??????????? } ??????? } // End of _PPC method ? l???????? _PSD ? P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。 REFF: 1.??? ACPI Spec 3.0 2.??? Intel Processor vendor-Specific ACPI ? ? That’s all! ? Peter ? 2010/9/24 旧一篇:C-state | 新一篇:T-state
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |