找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 18189|回复: 2

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
5 \  F7 p) f/ s( ~0 L! t! N9 Y
1. Overview* G& Q) D, F+ A) ~3 Z0 T( A
# F7 w$ {+ L7 {8 y; Z8 P
& u2 b! D/ N9 d; I6 K' }
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
& x  c7 I9 j" G! A降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
0 K( B6 E1 S: A. y' w  ]& z比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。: [' w' u3 K+ t1 s8 N6 T1 f2 l
  u$ v: m1 a8 W7 y8 b' ^. R/ G
cstate1.jpg

; W+ m0 \6 P9 q! m( C# A8 g
1
6 q' l( b$ A4 f# W4 i; J& Q! n
2. C-state Control
; E! Y/ e0 j  _) d4 C, y! q! `6 I$ U* f* \
1)
3 Z  p% B2 o3 ^/ a( C  `( rDetect & Enable C-state
7 i+ G3 j3 ~, ]8 v: a
. _0 ^! L/ t( l5 o- ?2 K6 SBIOS可以通过CPUID function 5 check CPU是否支持C-state,以及支持哪些C-stateC1 C1E C3 C6 C7),支持的最大的C-state也可以通过MSR去设定,默认情况下增强型C-state以及IO MWAIT Redirection是不支持的,BIOS要根据系统的需求决定是否开启支持该功能的register,对于多核的系统就需要对每颗核都要单独去配置它的C-state的支持。
6 R5 T  e5 Y3 ]6 K
. C3 E6 T- |  q' f, m: m$ L2)
3 Y% H6 K' g5 V, g  n4 w2 {1 \/ @' IC-state Basic Configuration1 [8 y- t0 [( d5 M
通常情况下PPM code会根据MWAIT以及AC/BAT是否存在给出不同的配置方案如:a.MWAIT支持的时候通常的做法是将CPU MWAIT(C1) 映射为ACPI C1,CPU MWAIT(C3)映射为ACPI C2 CPU MWAIT(C7)映射为ACPI C3,当AC存在时为了系统获得更高的性能通常会将MWAIT(C7)不再映射为ACPI C3,也就是支持ACPI C1 C2 两级C-stateb.MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的supportcode)。
9 M% a; e4 c7 h) `% ^% @7 b- E- l% K% o  Z0 \2 Y- W
3)6 F! S5 v+ q$ _
ACPI Structure For C-state
1 w' }7 i% P6 y' ^/ v; ^2 H
. q2 `$ z  k* ]/ D) Bl
3 N. N2 x$ R; K" w
_OSC & _PDC
% j2 m% p/ R( Z& G9 \3 Y9 T_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures' ~8 y" ?: i/ e5 g/ M( a9 a( q! ~
l
" A1 W  z9 _  D! h% N+ N
_CST% F  Z8 @6 n$ j$ o/ i) G% z' u0 G
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
+ [' e" o  q7 h9 P+ aCSTPackage : Package ( Count ,9 O2 {2 W8 w1 J6 s7 z9 O5 e; ~- ^+ I
CState ,…,& j2 }$ s1 E7 G4 |8 E4 H
CState )
* r+ F& c# {; S: z, q- F其中Count表示所支持的C-state的个数# K. H8 ~0 u. `" i( B% N3 ?8 L
CState: Package ( Register ,! w$ t! |0 T) M  [4 G  n
Type ,
( y9 T) e( l. O, d6 eLatency ,
# ~8 u! U( T: o6 ^+ QPower )
. S& ?) K4 M  d# `
7 s6 a; g4 c- z4 _3 h1 L( M0 KRegister表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4C-state,其中C1使用FFixedHW的方式访问,其它3C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3! W! T& `% r2 _, o$ I# l8 ^

# }: K  v; L& M( LName(_CST, Package()" X3 L4 h& u! B; w) W. y
9 ^2 S5 s+ a9 Z
{
7 C# n. U: C* C- V/ f; p8 Q% o2 L4 U4,
4 b+ {2 n: h  Y" P; D1 m! |9 X; |- F// There are four C-states defined here with three semantics
2 E" a$ W0 O! d( b) c6 K( v
. D! d0 ^; H' H; Z) P
// The third and fourth C-states defined have the same C3 entry semantics
* A7 ]; }8 h7 Z0 K1 K' C& y

! k# Q' P8 l; C# ?6 H6 x# [Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
3 x- o4 W8 R2 m1,
/ t( O; p( A9 r$ T, N2 S* ~+ U20, 1000},
/ s' ]! c; v9 G) |$ e
1 k- n* o3 \3 n. w+ K$ Q; s0 ^" U
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2," V6 w. M' A2 g; c  @  m& |
40,
+ W3 f  ^$ G% n" D/ v750},

  d3 s- e8 |/ t( ePackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
$ v/ t7 ]& l7 T$ y) t2 {1 p  l60,
' A& t0 @* |$ d% }9 G500},

/ @( G4 ]! d4 G2 Z! f& D$ f; {3 hPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,9 l* h' N% G' n/ @1 N
250}2 L; o& l  [1 e" u0 @2 l6 P

' g3 q. B: R( Y2 C( G5 k. t- D}) + {3 M0 H  }# n. f  G& o$ ~: ]. o
4 n9 Y! n7 s9 b% E) O& s+ G
l
% S- J; n: u. ~! C% _% p1 e
_CSD
$ P& S- ~' j9 h; x3 Y# T
5 O4 l/ I, v4 a+ B) V8 GC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
, ^, o7 j( n$ [
, ]  h2 e* F- v$ T& B4 p2 X
7 t. t4 G& a) E" y" H( |4 u: d& F$ X7 S8 T4 M* ?

: _: ~: y9 ?, E0 n" d- ?" g4 ]3. P_LVL VS FFH7 _  K+ X9 ?+ u+ ?

) i) K$ b; c" |( mP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)/ ]( R, D# O# G9 y2 q
FFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:/ D# J. t9 n3 e" b6 C4 N
6 ^& A; d  K6 e8 L$ y
gas2.jpg
7 f& K: `+ y# j, v( r, ]
2

* X6 g* m  M1 {7 p1 pOSPM解析到该_CST structureID0x7F,在切换C-state时就可能就会去用Intel特定的native 指令MWAIT去切换,其中Arg0 Arg1主要是MWAIT Extensions指令中传给ECX EAX的参数。Intel之所以将切换C-state的方式从读取P_LVL改成MWAIT指令的方式主要应该是因为性能和时间上的影响,P_LVL的方式就通过IO read 4**地址的方式去做的,IO读取是比较慢也是比较耗时的,所以改成现在通过MWAIT的方式去做,可是现在的CPU仍然可以通过开启IO MWAIT Redirection的方式支持以前的P_LVL的做法。下面的_CST是使用FFH的一个例子:
+ z$ v0 h$ `# i* r& |Name(_CST, Package()
$ d1 t; i1 O9 |. e$ w* O
5 \' P0 ^! \' o2 ^% R' M' N
{
: h$ N2 g% f0 |; ~" f1 _2,
  Z6 q2 }4 b$ Y* L/ F// There are four C-states defined here with three semantics

: L  A; q7 S: F5 V; E+ Q$ p
1 v4 I) n$ k0 T. ]. T" f* a: z6 c// The third and fourth C-states defined have the same C3 entry semantics
' w9 ~3 D/ [% z" q8 ^2 U  b0 ?: @0 c

+ R! N6 X0 @2 [1 S5 J# Y& \Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},3 F7 |3 f: x2 U+ V6 e
0x01,& H  F: @6 w; C! c2 U
0x03, 0x000003e8},
* J& x& \  \/ o. P% t

* y" w1 P3 x. E; C+ d  `* fPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},' o" i. |" V- g7 I
0x01,  E# p8 ]0 P5 {4 P* I! e: C
0xf5, 0x0000015e}

. p: y4 [( U# i) L# v8 U}) : C. E7 g( H" W

- V- C% {1 ?( m% s& ^- A+ y+ V: G2 h+ K
REFF:3 [! f* a- n2 B1 p  k. r) c
1.
" S: k/ T+ {$ Q8 A+ Q& I3 p: IACPI Spec 3.0
% I% J$ \% l) k. v2.  G2 b/ j( `" \) z8 C( \  L
Intel Processor vendor-Specific ACPI
& n% ]- s0 v% }6 x3 W8 D2 ]  g9 t
: h; I$ V3 N5 ^5 ~$ ]6 W" L5 _) f) X
That’s all!( b- o0 A% q( c8 n+ }0 q4 ?

0 m4 V7 F8 `8 Q$ y# ~1 iPeter" t( v1 S. K0 f$ D4 L

! {. P% r& W9 @! C2010/9/20
, F9 y, @& n+ n2 `% r
& }2 c* z( A" s' O9 ]0 j[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
2 e; F! g6 M4 z - D' j3 n2 t' g& |8 [
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
$ |+ E1 O1 ]2 V7 vEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
& d; z9 B" k5 |3 U$ d% [) F
) h# j$ \7 i* j1 t' Q0 s# S+ x2. P-state Control
2 m* p  O  }3 t1 D
  T: t9 |! a: y. [1)
3 z# Q% h  U4 U3 T$ H* XDetect & Enable P-state6 `" Y! e3 h* A8 Y' P7 |$ F& p: H  @, A
( o1 }' C5 D: B& x  y# \. i8 `) ?
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state( W9 ~( A, U: z
4 `/ F: _( B: ?1 r
2)5 `: k' E/ Y8 l4 {8 M5 q
Supported P-states
; X) R" `( a3 V. @+ U( q * S; q0 F9 n) T
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
; `- Z4 i, z* o  @0 P1 K2 w
& y" r# P- R. S3 U) rMinRatio = PLATFORM_INFO
. i$ m8 J9 ?1 G( Z0 p' V' m8 ^6 gMaxRatio = PLATFORM_INFO
4 c  P/ W# t" ~RatioStepSize = 0x01
, c$ e0 p$ `8 d! gNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
8 q& G( ~( s1 ]; i( r% r8 t
- ~9 f& R3 ]# r8 |8 I+ MIf(NumStates > 0x10)7 w8 I! L0 o7 p9 |1 A3 M% ]
{. A3 s' |. C9 X3 p+ o4 U6 X  O5 G
RatioStepSize += 19 x+ Y' L/ G3 G& J: C) q
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
; z5 z1 q* u+ `  O: G}4 C) F8 e  T- f$ m) M
7 g# [6 b' a% c4 C/ Q# {2 c- z
3)
  q- x4 c3 B" W9 q! A! ETurbo Mode+ R) l8 k7 }! O" x
5 J' t% @7 G9 ?1 R$ ~+ V- ~
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
  m( v8 |* N4 x5 D% s# r: }& m: C
3 O+ c" P, W" v( i3 N4 g8 j' v4)
- H9 ?# u/ P& g" ROver Clock: |* T5 W- B2 T6 _6 p% ^9 {
5 {  {/ Y7 K3 O- k. A" L
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。+ c% L5 l, f/ @

, C- i3 S" V, y! `% Z/ I- ^5 m, P5)3 f! k' D( T% d  H
ACPI Structure For P-state5 ]" U) I. \  X" b" G  i/ Z
2 t4 t' J5 L. `
l8 j" s; n# \  l# ^5 d. g
_OSC & _PDC( W5 U; q% k* |! n+ b4 ]8 m

' W0 x2 B" q( {( u_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
5 S, {6 m* ?3 S$ s+ a3 _/ Q; V . x) g6 ^! ]) K) [3 T( F- ]3 I3 `/ O
l% `$ u3 H. b& m! i) f
_PSS; h: T" U1 {) e6 N
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量% I+ N2 q. E) j  e( w* }2 R. m
并且通过一个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做比较
+ a( R( l3 v  r6 d8 K0 @以确定P-state切换是否已经完成。1 N6 i+ V$ v/ L/ y. l2 o% e( v

8 ^7 q8 R* a+ i8 W6 ~Name (_PSS, Package() 9 @, Q9 h( Y- K1 L# Z
{
) W& @& H  W* T) f& C$ W// Field Name
4 W+ w6 a5 y  w- V  TField Type + ~8 ]3 ?, I% q2 t) f6 Y4 z
. X9 Z# w( @8 {" D9 Y, ?- Q

, L' e# W( V3 A! n) f% p+ @8 Z2 p/ Z- B/ {7 {# E) p* N: j
Package ()9 X5 q* f! \8 S5 I, z& n: P- B* `% M
// Performance State 0 Definition – P0
+ q/ M/ `" [* V  U6 P$ r- A( E+ }3 k& n' z; Q- u9 B- w
{
6 a' }& {* I  L# b3 y9 D  Z0 e' u+ \6 c  T' \, J

" S, U9 |' H" aCoreFreq,6 w( X! ^. h; ?8 x& V) c6 v
// DWordConst
: N/ u! M$ ?" e! Y% s, H
1 d2 }: n& l' ~' i+ {4 Z6 ?3 j- p' I' `) z$ e
Power,
3 d- Z, @9 h" y' u2 `: V// DWordConst : s7 W0 o- {0 ?/ i% N/ z

8 Y* J, o5 t# `7 N+ Z( ATransitionLatency,
2 E  [+ l4 b' Z6 K( d3 j" l// DWordConst
6 f# E* ], _8 p: \
; u8 p8 X, |$ L- x! _' rBusMasterLatency,
4 ~3 r( J& t" L; p// DWordConst
+ k4 I' o: N& D, O
" N! g0 B4 {: Q! P* BControl,; c" j$ G4 ]3 E4 C8 X; {
// DWordConst 4 Q& b+ Z* D3 f, n0 m6 G; M; ?
- K% J6 T* u6 Q* i
Status7 @" \3 Y" u' R! O  a
; T# Q% C, q; |1 i
// DWordConst
. L$ H5 L8 O  y3 U7 v6 G0 B! p
7 j  M7 L. @8 W) _% u+ C}, - e  y7 H8 o8 @/ W) h
& S7 z6 b6 M/ d+ L$ P; _
. 3 ], _4 ~+ t, s( {5 e

( Y8 j% |# Y! ]9 [+ O4 }8 R3 f.
/ {: K/ ?: {. W; E4 _$ g: ~& \) R8 ]- ]! {
.
: X7 [3 ^7 c" }. x$ U. E}) // End of _PSS object. x' S% ^0 X- Z6 ~; O
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
. ?$ j9 K- c, B( R( f2 ? . l* b: V5 g4 T# S* Y: v6 @2 ~
Name (_PSS, Package() 2 B0 x0 C; S; z# O4 \& G5 t  u& J& {

. j! Q, L7 ?% d. R& z- ~- p- C5 e' `* [{
. D& M( h9 ?' t
" n; K$ m; d8 x( Z; J( p* XPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
$ f0 l, o2 N- e! c% f; o
6 L5 j1 y+ z8 \& l$ A) {+ @9 jPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) * E  ^8 Y8 J  R" F
0 {5 l  b1 ~" E3 o2 A3 Z
Package(){1400, 8200,/ Y5 e$ [4 X/ O; @$ N& o
10, 10, 0x000E, 0x000E}
2 f+ J5 D: m& O* n// Performance State two (P2)  B- M2 T' h/ a/ x
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // + A% M8 m7 Q$ s- k4 o$ }5 o
Performance State one (P3)
# [/ C9 u; ]$ a  c7 o* S3 \
8 f9 C$ P7 G9 A# l" H3 h: ?; O4 ^Package(){1200, 8200,
5 W* f8 Z- }) J10, 10, 0x000C, 0x000C}
) y. o2 P: k5 H// Performance State two (P4)+ T, ]. r! _; M! k  C

* d* K( U6 a. k' q: l5 P}) // End of _PSS object0 J" s" H$ f3 B6 n
% g0 [9 s0 T/ Y1 a
另外当该平台支持Turbo Mode P0将会reportTurbo Mode- s: i* \6 e1 B* J2 }
! ^! g1 n: O0 Q0 V5 ~9 t7 }
l( [! Q1 R! W/ n' N/ ~! l
_PCT% ]) h8 |+ G8 F0 X5 G9 R9 g
9 h8 {+ i4 j  Z0 y- W' [; l
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的方式来进行。
" G( M* ?( l& r 6 _8 {; m6 e5 \& V) b6 S
Name(_PCT, Package ()
; u$ r" w, \: Z6 D) i// Performance Control object : A3 P* W% ^, E5 P( c" C

' Q3 L+ [# ^2 z2 o& E# ~{
/ P$ c8 m. y, H$ F9 O# K+ A' E, j5 _1 y' S. S
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% h* F- m/ ]2 M  ^- T$ _% S// PERF_CTRL
- Q9 p4 e# e) m& ]: Z3 F9 a; |- A9 Q$ M7 A" \
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}  z7 N+ q. Y9 q. M/ _
// PERF_STATUS
) h" _9 L2 A* ]! c8 b! z
6 H: I3 D8 r- N9 u}) // End of _PCT object
+ x7 d1 e' D8 T* k) t5 a 0 H- b5 ]! Z) v! K5 ?% I- q
l
9 r/ ^" l" v# h6 ?: Z6 i
_PPC
# g# c& e, n( x& ]$ {7 j) `
3 ^& E4 _7 t6 G; mPerformance 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- c) A/ a7 \, p% a" k
/ ^& p* [/ g# e+ ?' f' w. W
Method (_PPC, 0)0 k8 y9 l! a% r* }
// Performance Present Capabilities method $ @, B% n7 C* p- o

3 f' j4 X9 |" \6 @- f  K, d  {{ # Z/ U2 g  o/ Y8 y3 A$ Z  M+ D4 h

: ~, D$ W; m! W2 I- W/ [1 k2 ^6 qIf (\_SB.DOCK) " v; J0 O* y: `) b5 a

" k4 F4 {$ f. d1 G{
" [2 ]- q9 E1 u. L& l! }5 a! t
" ]; j2 X0 J6 K$ fReturn(0) // All _PSS states available4 |1 a& h. O: S$ F- T

- k1 l, O0 T' M. K( z" Q
1 y8 [2 U9 m  B# X- t7 A7 c' m} ) f5 X6 I' N) W0 H9 V
3 h0 T" [: ~) y/ N" Z+ k' o# X
If (\_SB.AC)
3 n3 a" l- [2 ^( E
4 C/ D$ E. }6 _  m7 C5 e& B8 ?  s9 H{ 7 ^0 H1 l5 I8 F; S
. ?0 P5 d, n6 F/ ^
Return(1)& f9 ]; d+ @% Z% t( v" U
// States 1 and 2 available
3 w" X0 t' ]/ Y8 {, ^
4 ?0 S' s7 J* }& h  T$ u3 O& n}
6 V% P# I; _3 Z0 X4 |& t' A" I! ~( |9 w, Z: P
Else
: H" T5 w7 r0 }
. P) ]( k  i- G  t% \9 q! h% P8 o, Z{ , b8 H. H; n5 H# r9 G/ J

3 ]+ p( m8 A  h! O- U4 mReturn(2)
1 Y$ H: Z1 l4 ~3 g// State 2 available. P- s6 M  o# n/ v+ @/ o0 F# O2 k; y

- ~/ J$ I1 L5 t; X5 x5 L7 v4 x6 {# `} 8 v0 H) K+ P1 A5 l

3 S1 c/ b& b0 |6 v, R( M) b} // End of _PPC method! f0 n  k+ J: Y# D+ k! H" r) W

) M6 `/ B  T! [% \l; j  ]* Y8 T! a% M4 `% e
_PSD
9 D2 O: g$ ]" G: y% r/ z* J ( B! y- r: j) _% z
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
! h$ f$ \; A' Z4 J1 [' Q7 \
! G) F% {9 @0 l1 Y6 D, I( EREFF:
  l9 J( e, M, a2 o8 U1.8 q- a/ y3 N) ?
ACPI Spec 3.0% X) ]) q7 r' X7 ~
2.* {/ s) D, _6 w* s% S
Intel Processor vendor-Specific ACPI
. c% I. W+ }8 s  } 8 ~3 V6 l  y; c+ v% @

# I+ R6 b, J  T8 QThat’s all!8 |. l1 o* j( G% J

" q, u, a  e) C! `9 `Peter8 G+ }2 \. z1 `4 D! `& @" H
+ N1 d5 E, f" h7 v1 A  {
2010/9/24
回复

使用道具 举报

 楼主| 发表于 2010-10-1 20:46:32 | 显示全部楼层

T-state

T-state
1. Overview
3 l) w. w4 P0 A
- e# b3 @: m% x2 U" M+ c- oCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-stateT-sate全称就是Processor Throttling States,它为OSPM提供了一种通过降低Processor Performance进而降低系统负载和温度的能力,听上去可能和P-state很像,其实是有区别的,P-state通过调整CPU VID电压进而影响CPU的工作频率的方式调整系统系能,而T-state则是通过调整单位时间内CPU Clock On /Clock On + Clock Off)的时间(也即Clock On工作占整个CPU工作时间的占空比)的方式  [$ d; m4 ]/ {2 e0 F2 }
,影响系统的功耗和温度。* [" }! K( r9 D$ N6 ^( H; J
+ g/ ]) ^6 _+ ^, s8 p0 d
2. T-state Control
, \1 L7 C/ A( C$ Z8 [, O * t" j: [) U: L- ^: ^
1)
$ w0 v6 [8 b+ m0 E3 c. d( u# VMSR Based Control' ]  \3 l8 @* f$ |+ a; Y

7 ~- Y; L3 ?$ u" Z+ j  t3 f0 sBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。   M8 o: m! k% O. G$ @

% }  ]9 E0 g7 Q6 Y( _! z0 z2)& R6 p1 _0 G! E  H6 ^
I/O Based Control
6 e+ Y$ m1 q: a# l % u3 G' X" c9 a8 {6 a7 Z* L5 ?: ^
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
% \" v4 h) r) c& u6 Z
+ J4 B* F3 u( I3)$ J+ m: y4 E  M! w5 Z, ?! _; M7 {- k
ACPI Structure For P-state: ~. p' c9 X  R5 ~; T& a6 Y
l
, Q) }) M7 i5 x1 q0 O
_PTC9 R4 n! c' z. }# t4 v# B

+ c6 b) s5 G" L; T( FProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
8 b2 W! ~4 M$ ], L$ q
# D, I7 r7 f3 u% ^) g5 Y: s. OName (_PTC, Package() * _9 E: R( [) G  g, K3 Q% X
{
# _; ^- ^! h. k; x! W) r8 h& ~& ^% @+ u
ResourceTemplate(){Throttling_Control_Register},
2 r& i( c6 I6 X7 v//Generic Register Descriptor
- |: n; o6 Y" n  W( C. i, L
! I, X9 h" b& U, C0 g% Q0 LResourceTemplate(){Throttling_Status_Register}: r0 G8 c- Q+ f+ `; J' P
//Generic Register Descriptor 5 W  J! `0 p0 a$ F5 [
}) // End of _PTC+ T& k* Y, o' B3 D3 D* b

  \5 N! M3 k( }7 I, y" R6 c1 f+ o下述是一个sample code' B! J4 p4 i% P/ [! f0 R
$ K0 T5 F4 ?( ?6 }& C

. N3 X- m; D7 j, ?
//
6 }3 E8 q0 z  H( z1 D+ O5 D1 y+ X+ W) k# {, ?
// T-State Control/Status interface3 v4 ^5 }0 }3 l
5 f' m1 c. `  d$ }* I
//( q0 ?" u: @1 G+ c' d, `: M4 w' a% S
- Q& v6 N: L# @. ~* @/ s
Method(_PTC, 0)7 Y( @) P% m4 e8 p
9 v3 W) p2 d# z/ I5 K5 k8 Z
{% Y; U0 e* Y6 `, H# Y/ F

8 {5 Q7 H" T" {" ?/ j9 z//; ?- N, g" `, U1 Z0 c. W
6 ~8 T. e0 M  n: U2 k4 [* H  f$ O
// IF OSPM is capable of direct access to MSR* `9 j$ h6 [1 s$ _+ C7 @9 h" G: h

9 U( W* ^% }& k# d' |//$ Y$ s# o0 S4 H7 P+ b1 n- O
Report MSR interface
* `  n, b  q% }0 L3 M
# p3 \$ H) t& m$ q% y: C// ELSE) B9 `  N2 I) k+ U8 O4 `! q
* F+ D9 s" Y' ]; W( i& U6 L" m' i
//, t. e# ^8 E& c1 V
Report I/O interface
$ \) G$ e6 d" j$ n1 O; I" O& T" `, k* R) i1 U8 B% Q& l/ \0 P0 b( J
//
$ F8 D: i0 G/ N' C1 u# }. Y/ t  m7 F( q& f5 m, x
//8 p) v( n. l4 P6 [+ j2 U0 a
PDCx[2] = OSPM is capable of direct access to On
+ p3 A: o9 X4 }: V- }9 z7 n. B7 m& T% p! z" }1 p# |/ K
//
6 ]) `8 F8 q- V$ lDemand throttling MSR4 f8 I" C! ]' t1 V
! w8 S! w3 U( n9 P9 ^/ L6 [: O
//3 f5 E7 k* r; b5 h% f
) D! X+ Y; a7 r# S9 `6 J) a
If(And(PDC0, 0x0004)) {. ]3 n% f8 A, {: T, o# i
6 y! M3 v3 l2 V9 Q% v, d. w
Return(Package() {; `8 @! y3 y- Q1 M
! M3 T% d& b6 B* l' F
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
1 v' x9 Y4 ?  h- u" s1 U) B( e" m' B" A7 ~; ~( H
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
) d# c) B. j9 H4 [2 i; G" ~- O0 Q3 H) z3 r, Z6 }& K) A! U3 G
})5 D1 b( [- s. w$ I$ W
" J# @6 `5 Z% Q; ^
}4 z; s0 B. W1 q* r6 K  M% [

: Z- V2 Z8 L6 X1 V% v" x) RReturn(Package() {
0 b9 ]: Q1 }+ d8 \3 X) v5 f3 [4 G. j; P
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},) Z" ~! x* c$ @% I5 U4 i
4 z7 j9 D' ]# g7 k: ^1 m
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
; u; E4 L& T. N& `# v( r1 q) z% H8 n4 L% y4 ~; v+ F5 Q+ {
})0 z5 `# x4 O$ b8 @5 {& \# W0 D

1 g" ~: G6 @# x! q2 H}
: _! `7 n. s8 F* O8 ?/ B. l- g
* d" @4 ~' L/ ~- V- U/ l) L+ i7 t

. D6 W: F0 d; Z) wl9 Z4 h- ~% M% c3 F3 X
_TSS
+ ^# _7 N4 [! y, S ! ~4 _' J  i, K- s* X% S- y; j, f
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:' u0 F  V0 V3 C! Z! _; t$ g, P- W
Name (_TSS, Package() ) F# g( q+ C* d/ c9 H7 L
{
/ n; U" Q0 ?7 q// Field Name1 v5 P- B" |( D* h  E8 X
Field Type
0 G, S- d: a8 w$ i! \: B
9 [8 N8 g4 X2 x  N: h8 L
; X3 v; n2 |: ?  E/ Q" A4 c, j1 r5 l# e6 n% p! w1 S  s
Package ()
" x/ N7 K/ @: I, k/ A// Throttle State 0 Definition – T0 $ V1 ?' i# K  [$ U

+ S+ I% Y4 D' ]% U. d{
+ ^7 O; f$ v9 F# Q9 q! _
0 n7 m4 p( b4 `6 J, C. g' t6 W$ ?3 Y: c: [- e
FreqPercentageOfMaximum,8 p7 s2 M3 ~# n! a
// DWordConst
0 ~# X; L6 H: Y4 i. r+ f
! \/ I% H2 L8 o, K( x6 @  K# G1 }Power,
* V4 D: ^# j. P' g0 o; U1 @; y, W) B// DWordConst   e! `: _, W5 {8 W7 F" s  U
5 T: a: l# o- x- ~1 Y
TransitionLatency,1 c' Z1 g6 J& z; \5 y
// DWordConst 8 W1 ]" G. D5 [7 M( L! p
" T8 Z( r5 z/ \: W2 ]+ Y
Control,# c- S/ T. t5 w: M% d
// DWordConst
+ t, b1 S1 F) Z* ]& N  [5 G9 R6 z1 X/ W$ W8 a4 M
Status% x! M4 A6 \0 N) D  d
// DWordConst
( k' Y3 [% S0 l% M},2 V9 x6 n3 R9 W' Z/ R
……
" Y" t9 B0 i# H}
/ g" p0 a/ {2 N
9 r( q) V: y, PExample code 如下所示:& x! r' ]& }  E. w, H; F. `

* H2 J$ A. P0 o& a0 N& kMethod(_TSS, 0)3 r& d) F* G7 {

2 T2 o7 |7 M) F; a/ `7 b: _& }) H{
, p% c; L6 f* u  g7 H/ S- ^  p! Y' ^  _3 q  S
Package(){100, 1000, 0, 0x00, 0},9 z; S* ^- q0 @0 Y3 d3 ^

- g; }  }' n  \2 ^: DPackage(){ 88,
9 K( ]2 T3 s; ]+ j+ a- }! L875, 0, 0x1E, 0},
, m/ f" B/ Z! b0 a1 M4 s* b7 X- ?$ ~$ c- s( E7 g) B
Package(){ 75,
( E% H  o2 n0 b7 J1 e4 N750, 0, 0x1C, 0},
0 z+ y* b) J7 _7 a/ `9 o! K
3 S" t; S; E1 T8 ZPackage(){ 63,/ c; o7 @" j* E3 T! w
625, 0, 0x1A, 0},; `0 ^- |: F7 u, x' q" s( D

0 j9 P& a5 l+ |8 q: G" }Package(){ 50,* q2 B- @4 N' ?: B2 s, }
500, 0, 0x18, 0},
/ z4 P' u: U2 J& I8 P9 H5 t! l( E  d1 Z" N1 [+ Z% i& u9 c- t
Package(){ 38,
' N( R) U: F) Z4 G6 i# S) }375, 0, 0x16, 0},# E/ l! {" }/ q: v

3 ^1 c2 R" v( H3 V+ yPackage(){ 25,/ q4 W: F. J; y% G
250, 0, 0x14, 0},
8 x& y& c( [9 w7 M: g$ z1 A/ W% R* d
Package(){ 13,
# R8 A/ K$ m/ c. ?$ h125, 0, 0x12, 0}+ f. G5 J) A2 b9 ~9 h
4 S1 i) S8 W( [' o
}
6 W7 O& i* s2 l5 K. t: I
0 ~! R2 W3 l0 N  Y, }3 N- q: Z: f
# P# n: b5 @, G( w4 Ol
; z3 X% O7 y- a/ `' f1 L
_TPC
% N& l4 B  u8 }6 q
! D3 Y% g+ y, A% c4 _Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
) G( \& u. g2 h: ^/ ]
& j$ U  c* D( u9 p: S& N0 b1 Ml
* ?  D7 ~! q! G' }6 C
_TSD
! I: F0 X2 u7 u& k: p
  f' k. H2 ^; B  h8 U4 wT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code! x2 V1 ^) X: s  ~1 Q

+ Q& s0 s6 E' L- j7 W' ]2 W) E, CName (_TSD, Package() & m% H2 o/ o' m7 u, t/ i+ j: z

3 J% a7 b5 R9 y" `1 L- J{ ( D$ e8 b" A+ {) [3 v2 f3 z

6 F- g9 n5 c. S7 L# l% oPackage(){5, 0, 0, 0xFD, 2}
/ }& W( \$ m7 ^// 5 entries, Revision 0, Domain 0, OSPM
0 z/ Z& x9 ]4 V9 T+ ^0 WCoordinate, 2 Procs 7 h: D' z  o; O" [0 G$ D2 F2 ]4 H

; N- {: H% [3 M' f9 p! E; n
5 z% u. C, i6 V7 K7 h5 D}) // End of _TSD object+ v- J2 N. L; z) W& a6 ~) _
, R: F8 {! A0 s! d8 m  [
REFF:8 g" _9 {5 ~) k
1.
( }5 f8 p% y' F+ S: j& L2 }9 [ACPI Spec 3.04 a7 w+ P( ^% e7 b
2.
5 E5 K1 {: ]. h" L- \9 j5 X6 n7 ?3 F# pIntel Processor vendor-Specific ACPI
, M0 }* r2 M$ A7 ^ " b- s2 \1 N. F2 O% L* t) ?% I- o
3 B/ U7 g% V7 p  y( q5 c
That’s all!3 A& E7 q& _4 v4 i+ b

5 K7 j# G/ h; [" cPeter' B, {+ T1 J! t9 _. b" R

. b6 l/ T2 g$ S6 J+ g) j2010/10/01
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-12-1 07:15 , Processed in 0.086394 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表