P-state

来源:互联网 发布:法院行业数据交互标准 编辑:程序博客网 时间:2024/05/31 13:16

P-state

1. Overview

 

CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
 

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, 10, 0x0010, 0x0010}, // Performance State zero (P0)

            Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)

            Package(){1400, 8200,  10, 10, 0x000E, 0x000E}  // Performance State two (P2)

Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //

Performance State one (P3)

            Package(){1200, 8200,  10, 10, 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, 0, 0)},     // PERF_CTRL

            ResourceTemplate(){Register(FFixedHW, 0, 0, 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
发表于 @ 2010年09月24日 11:43:00 | 评论( 1 ) | 编辑| 举报| 收藏

旧一篇:C-state | 新一篇:T-state


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hgf1011/archive/2010/09/24/5903082.aspx

原创粉丝点击