CPU的P-state

来源:互联网 发布:64位mips risc编程 编辑:程序博客网 时间:2024/04/30 23:34

转自:http://blog.csdn.net/hgf1011/archive/2010/09/24/5903082.aspx

P-state

1. Overview

 

CPUC0状态时会执行指令,但是即使在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-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state

 

2)        Supported P-states

 

BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) MaxRatioRatioStepSizeNumStates,所有这些信息都可以通过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能够访问到与之相关的thermalcurrentpower的信息从而根据这些信息动态的增大CPU以及IGPUfrequencyCPU可以工作在[Max Non-TurboMax Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 reportOSPM,另外Turbo ModeRatio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermalcurrentpower的门限值,BIOS可以通过设置这些参数影响Turbo ModePerformance

 

4)        Over Clock

 

某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 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-Stateinternal CPU core frequencytypical power dissipationcontrol register valuesstatus register values。第0package表示该平台所支持的最高的P-state,第npackage表示最低的P-statePackaged lists的格式如下所示,其中需要说明的是关于ControlStatus这两个参数,其中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中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 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将会reportTurbo Mode

 

l         _PCT

 

Performance Control用于将P-state MSR interface ReportOSPMOSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample codeOSPM透过_PCT得知是native mode,当系统切换P-state,它应该就会通过MSR IA32_PERF_CTRLIA32_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表示支持_PSSreport的所有的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