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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
3 k1 ?4 R+ R/ n1 Y/ a( Q
1. Overview8 _; G; m  F- T' \3 M5 Y& m
% i' r4 M1 ^8 ?1 Y8 k' w0 L+ r
: Y2 ?' ?! x% G' t& [& k
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换1 y' k0 v+ \, m# m
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看8 i( |" S! U' K% H
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
) M# c; N6 K& o2 \  c& l, N+ b' ^' f, l; q0 ~1 m* C% P
cstate1.jpg

! l$ {# I8 e0 S( M7 U' A
1
& n! l5 A) u" E4 E$ b
2. C-state Control
4 \7 f6 ^, t- W3 r
0 |; \0 n% |" b1)
: u0 a) \6 Y3 r! ~: v9 E/ `Detect & Enable C-state% t6 |5 R7 [" d* M% o, q7 B

) `: Q, o4 Y/ rBIOS可以通过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的支持。# Z6 l! l+ ~& C+ Y! D7 Q* x6 C/ m
& S/ G/ J, @+ z9 \- j" J
2)+ S! w( u" E1 b9 m* m2 x
C-state Basic Configuration1 F  q: Y0 F8 h# v1 k
通常情况下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)。- K$ r  y: m) x+ \2 c

, b( E1 g% e& m. x3). U* u$ R% U, G6 y
ACPI Structure For C-state
3 B3 Q8 E( H# M' i$ q9 O
- B, }, U5 F- t. R4 kl
' s# j+ K0 C. i
_OSC & _PDC$ k' H8 d2 ?) H8 b3 |, V
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures: w* Z" w: v% J" S3 s0 M
l
* i" R- E( v- _( w! k
_CST* f' l+ T- o9 p
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:" N( {  Q  t5 o
CSTPackage : Package ( Count ,2 X1 a. O0 B/ n- n5 d
CState ,…,
- {1 m0 c$ l: x: S& _CState )* C: v, V' r, g' ?1 j
其中Count表示所支持的C-state的个数
- j- U' u# n4 aCState: Package ( Register ,
0 P: ~1 ~- B7 ?! WType ,  U8 B* Z, D# R% \& @3 E$ y4 ^1 t
Latency ,, R9 h  i) P' y/ f1 t: B; k
Power )
' G' j( P% x) H$ r% o
" M' O% k  [, J5 e# [* s, jRegister表示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 C34 H: |2 `8 Y, \+ |. Y% e% X6 `
+ p  I* v" g9 Z9 L
Name(_CST, Package()
) ]/ b# n, |' t" j! u( X
4 x* `( U7 e; n. g- x# |
{
/ Z2 H% V# |+ ]9 \$ {4,
, g( ]3 L( N* g8 V// There are four C-states defined here with three semantics

" O; t6 U: C6 w
& A4 y5 c! _/ Q. Q$ g6 B# h  `// The third and fourth C-states defined have the same C3 entry semantics+ `. }% z* ~0 v5 f
+ ^! d' X; }* Z2 Y
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% [2 J  y( [, T" T! A3 \& o& B1,
( n' K+ n( {6 }% _20, 1000},5 U/ p! {. p; d$ y) F2 U7 |, W
8 R% P! e$ v; A' |2 X
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
( o" X& E, S" H' S1 j/ P7 H40,; A0 k$ U3 x+ ~; |8 h! m
750},
- _" L- Z% ^' \# e! W+ l4 ~1 T
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
) R* |# R/ y  T- b7 G% ?# ^5 R60,. m# g( ]2 P/ o1 C* ?
500},
6 P# u" H/ w5 B) {
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
5 y& w1 E- R/ F$ |: ]* ?250}1 C- X% ]! A6 N4 |
: x6 c4 M" i$ j: W* I$ C3 s1 i
})
, H5 _) j( k" K! Q3 q; w, |
3 J7 ~7 `) a$ Fl
, f* x* h% t! v4 T, V( y4 {
_CSD3 b: }0 @" y1 T

+ ~. l! V- I% m; c6 gC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。+ F4 N7 c+ D, x8 ]8 f7 x
* \3 C# B/ g6 p5 [

. ?  H1 {2 D. o) O$ c0 q+ n! T% U- q4 M! G2 u$ f
. m: ~& \7 E8 {( P! Y4 {7 m5 T
3. P_LVL VS FFH3 C3 W" i5 ]$ s$ |, I8 O
+ \& t) f2 r" ?6 T0 Z' O, f
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)+ S: ?. `; g4 k  B
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所示:- T4 c4 h/ U3 `% a. A/ |8 P* _

! p9 d' O" u, ~8 z/ {
gas2.jpg
; r( v2 C7 W; ?' a- @& s
2

3 C2 u6 F4 |8 @4 M0 r; P7 P, mOSPM解析到该_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的一个例子:
9 L9 V# A  m6 q" _. O% v8 |4 DName(_CST, Package()3 T: G9 b' r8 c. y/ H

3 b3 G/ z: D$ [9 Z& I{ 5 h# h% u6 q5 k5 C3 Q1 c: F
2,
1 I6 X- E7 f, ~" G) \& f// There are four C-states defined here with three semantics
# K( L4 p4 |6 l
  I6 w& A  H7 c8 N
// The third and fourth C-states defined have the same C3 entry semantics
; n5 t5 D8 g: V/ ~& I

+ {. U  I( ~' a6 {7 X6 Y8 pPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)}," a  `! e- X0 z+ Y, p
0x01,
3 H, ~! c3 \& K" |& c) ^0x03, 0x000003e8},
2 [5 Y3 t* Y/ a) d4 W" K
/ j/ ~/ V- U/ {- o
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},4 ?0 |# Z- r) B
0x01,6 r1 }* L/ r( O+ F( A% ~
0xf5, 0x0000015e}
3 `7 \" d' {% J. E5 V) B/ b* E
}) 0 H/ W4 v# Q7 s2 ^, I  V
" X; J+ G3 b: X- D$ P

* n% @+ c/ f2 K- c7 aREFF:
2 C. f2 z! l& I+ J" X1.
- D/ A( ^' N9 [$ s- x. K! PACPI Spec 3.0% A" u# ]+ }0 R  g
2.7 v& K0 e( Z5 i
Intel Processor vendor-Specific ACPI  o9 K' ~4 e/ B4 g8 M! x" }& X. C3 k

6 W8 U" U, l! E. [6 m1 Z; O6 \8 ?1 E4 n2 ^5 p
That’s all!  M; U  W5 |/ v: X+ j1 Z* C* s* C5 a

" |. C1 t* }5 }2 f% {Peter0 d3 m5 d7 O* K% s
  n. {, Z$ x+ l) ^, V% P
2010/9/20, {0 u. ]) d6 S& p+ ~
6 J& m5 ]% E0 ~: r# {( A* r
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
2 x* Z! H; n. z6 l! ^8 |! p* d% F
! m, {: \; S; ~. r# U; l( P  qCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST1 A+ F7 T1 w: V
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
  @5 m5 l% \# g  `' k   X4 S) }/ T8 x( u( T4 J
2. P-state Control( f' }& Q. h. G* Q+ b
, O/ H" r5 l5 ?% P/ a
1)! R  V7 Z3 G# ^
Detect & Enable P-state
% b! o  x/ v8 o2 b* p7 P % R7 i) D6 f7 }# R+ H
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state* V2 b+ D7 E8 j: Z& r# x) i
+ J) o2 B$ w6 d  Y, r4 _
2)
' M+ a4 L  j' j, l, kSupported P-states0 A; p% `" b+ s7 i9 g

* U9 X# n: [! O! RBIOS 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
8 I/ Y! ]! J# f, ?
/ `0 y. D" n. r. d* w; ]MinRatio = PLATFORM_INFO, D0 r; r: o& \' ]& d9 d( b7 u( o$ n
MaxRatio = PLATFORM_INFO, i- U/ O: W$ u% }  o
RatioStepSize = 0x01# I0 j3 T2 q7 E# R9 W- F" X
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
. K- A1 y( }2 J* K* {" ?5 } / `& y* P2 p& b5 Y
If(NumStates > 0x10)
: n% F8 [8 |. a, P) K# m{, X9 k% f) t6 p" R( I  [& Q
RatioStepSize += 11 m1 u% j8 D+ ~% U5 i
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
9 P+ r+ S1 R) A7 ]' B9 h}
! X% U' [! V& ^9 V: D0 m
4 k: _, ~+ H6 |- o7 w5 v: }3)
  F- ~3 f1 p( }" rTurbo Mode
. I( T2 x1 w) j  n5 {( d- O
. W) I% w! G* |9 J7 oTurbo 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
  b' X5 {6 K. f  A7 r# [8 w % T' }# I. Q- b2 [
4)
) l, |( y9 c' N: nOver Clock" Z# [" r% y/ U3 l7 t0 z

6 a) L1 s( [8 e  W$ n! f某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
8 D& f, E- z" b+ s& }# a, Q0 {
+ D: Y2 K& i4 H: z2 |# @5)4 d8 T, Z9 Z1 q0 m& N
ACPI Structure For P-state
0 g0 Q8 w+ p$ t9 E# O7 D- Y
. j* U! s7 q9 v& k7 V  Z3 G& P3 bl
; H2 |+ h3 Y& h, S* D
_OSC & _PDC
6 G) ]1 S! S  a0 M7 K2 }
3 O6 F5 C: ^/ d& a/ n1 E! [" __0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures1 ^: t/ S7 o6 w& y$ C

5 W5 h5 m  c  K% jl
9 k  Q3 w2 a3 ~' d+ u' }6 N6 \/ _0 m6 a
_PSS
, g* k+ r: J. P* B' lPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
4 T4 p7 h5 y; M9 E: M* f9 e- H并且通过一个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做比较1 c. t5 j0 ]7 _
以确定P-state切换是否已经完成。
% ^3 [/ K) h/ h, h9 h" M * i3 ?6 Q& t, r! j7 n
Name (_PSS, Package()
2 [0 Q/ F* r5 ]5 S: P{/ W  [2 X$ j8 u
// Field Name# e% P+ p2 S, E# M/ W$ P+ P
Field Type 4 V: I; E1 b8 {+ P! T

, b: Y4 {9 ]4 s2 O; ~6 ]( H) g# Q" n8 b

" E0 y0 m. a3 g: @Package ()( B. G6 y6 M" K3 ~
// Performance State 0 Definition – P0
7 W$ n* b* f( x0 J7 k! J" @
# e' I) C" I! {5 e{
; K5 @: E+ x2 [- e7 r, {+ q  I$ D0 S4 O9 R& E4 t( \. }
! n1 @3 ~) P% d$ F4 o& Y& q$ \
CoreFreq,
- ^. |1 z. m# Z/ t  r( w6 D// DWordConst + }9 S& [& K7 g( T3 ^5 _5 @4 J
2 |* {5 @, w* W  w3 \4 f6 \3 v  ]
2 @$ Z+ M2 G( ^1 s( m
Power,
  G9 S  X1 @  d# c9 I& }9 w// DWordConst
9 }5 a- D7 X+ D* p+ z! v9 p" I+ I) o$ C
TransitionLatency,8 \% X" b! T$ g4 G
// DWordConst
; Y6 g; f! o: z5 W9 |
1 W# f7 n  u( ~, I- V: b3 aBusMasterLatency,+ I8 x% c: ^+ D" E1 c; O# ~' }
// DWordConst
! `: g8 v( f% D* m  w$ e( ^  r2 Z6 g0 `8 `3 s$ z; G; A
Control,
, |  ], l/ M4 ]0 B5 G2 e  j5 c// DWordConst * ~: o" n# Q! R* S2 k0 X
3 N- Q7 Y2 O$ R* c5 }" T: _
Status* c4 r0 _- e  n, f* K
, K4 y2 u$ Z; r+ [7 z
// DWordConst
. b8 I" ]+ \: Q' k
$ `3 R. T) ~: i9 c2 D' Z}, ) x* m$ b/ W# S  x

& Q$ {1 i# r! v$ `* x" z6 U. : U/ m; o& [# R& _/ S5 ~: T
) R; g* j5 }) v
.
! |5 t3 x/ F$ u( x+ Y/ y4 L6 r- M
: x0 K; ~7 e8 ^8 G9 E. + J) W) n/ V/ B, o& T/ Y6 z: Z
}) // End of _PSS object
% K; m1 H" j: d7 S$ j9 A. q; X前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
6 x4 d! m' \! S
1 ?; j; P% o8 ^9 ]. g$ q" NName (_PSS, Package()
8 h) Y( R3 N, U( y" g( c2 J3 N
" F, ?; `0 q3 v; L{
: L7 Y; }( D, ]. B/ ^+ L
% S% F- ]8 W1 m8 FPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ! J. ]( A! y6 E
) ?; g8 A1 W+ e7 h+ Q9 `4 a
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) : @; c$ u1 L3 M+ l

: Y- N$ Z. N7 ?0 d6 H) ^/ zPackage(){1400, 8200,. I- b& F5 T: J  ]0 l( {7 W
10, 10, 0x000E, 0x000E}
0 X( n( t/ y% S) t! O// Performance State two (P2)
* A1 L% `4 g. n& O% B; r! @: bPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // + Z6 p- v, [0 o. D
Performance State one (P3)
4 ^; A# W7 ]0 D8 K8 R& L
0 R& d2 p: A9 \0 MPackage(){1200, 8200,
& C, ^+ j8 e8 _, z10, 10, 0x000C, 0x000C}
7 @1 d0 ]- R: V) v5 N" q: @) ^// Performance State two (P4)
. S% U: B7 l0 c: e: a! |- ^8 r& K& I; s' R; J
}) // End of _PSS object+ j. R% m- u# q6 Z7 [  e; r

5 I; g, q# o2 N3 A另外当该平台支持Turbo Mode P0将会reportTurbo Mode
( ^* a) Y3 N( S , x/ S" i) }4 n7 ]1 _( F9 o5 G
l
9 G" L. b1 R- P5 o1 Q3 N% {0 l
_PCT8 j& Q6 @/ l& U! L

- d; P8 l& D1 d( V, PPerformance 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的方式来进行。/ s) X, k" J; ], W) h# A! ~
( ?6 u5 i1 C. y2 c6 p2 R
Name(_PCT, Package ()& j' _% z0 ]" w: h; H- y/ K
// Performance Control object 7 }  |( ^5 z1 l8 l" W

" }0 r. z: J+ h{
/ |7 S2 z$ ]2 j) E  d( }, M& R5 S" o( V, ]
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
* H; y* n* C- a- \* w// PERF_CTRL ' x) o) y( G  A, u& e6 U8 C

4 S0 q1 E1 `: s9 f! I9 `ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
. o! `+ N; M7 b2 x2 s5 M// PERF_STATUS
( K/ K% z+ ~8 e7 c2 f7 m$ L3 Q% p
1 F( `: A, o7 ^}) // End of _PCT object
% z$ O5 T& G5 ^/ y" j# I6 A ' ^/ [% C* Y9 F
l
3 _# N6 h+ b7 \1 \! ]+ n& c
_PPC
+ K  {0 E+ {% y$ w$ A , k; r4 y# L2 u5 K$ o5 L% Z% s3 f# ^7 M
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
9 i: _* a3 C3 u4 T, \$ \ : A4 H8 }: {" J0 S7 y
Method (_PPC, 0)
7 v8 u& n6 g! e, {// Performance Present Capabilities method
9 U9 B& J0 Q6 G! W% b0 y
. A4 M7 F- A# O4 P  e1 M, N& a$ k{
1 y0 ^: {6 |, t% N6 E2 {0 N
: {0 U7 S; s. }- ~If (\_SB.DOCK)   _$ [. |2 l4 B7 p/ q' W! l4 `

3 H7 e! l3 y8 _: |{ 1 K6 T1 o2 q1 h5 E0 @
( A: J% y% f5 h. q$ M
Return(0) // All _PSS states available+ P9 l  z. }6 K5 G

! {! [" q) z$ D. z$ n4 H1 R9 g8 \3 F
6 a" w- H8 P0 a9 {& e}
- b& a2 u) r) r. m) d# c* t
* N( P& ]& Z; t5 N" f5 E7 {If (\_SB.AC)
6 `* ?1 Y1 s  D
. D2 M* M2 @7 m. D( U9 V{ 4 b" y2 D; N2 r- J' H, ~1 Q" k

1 d! f- R0 i8 Q8 m9 I/ i: IReturn(1)! j/ Q' c% ]! g9 y. O9 P
// States 1 and 2 available
1 U2 w! S4 r0 l2 S! @: b
3 Y, s  V$ o* S; ^3 G5 M# k} : ?% r, A  Z. a: ?* J
9 S$ ]- Y/ n( e4 {' [6 ~/ e( f8 @
Else
- K2 q. z2 x; M/ c
! W+ k0 ?( v+ i2 f* @- k{
9 i! r7 \" p( c0 n; D8 |9 F2 s" ~2 N# r2 E! q5 P( P: h: h
Return(2)
% i+ J7 B4 U, o- c// State 2 available
8 S- H$ h0 s6 C) j2 h4 k+ t' N2 K6 n& i
}
( L! ]4 a4 w+ d7 O" {' p$ q9 g6 g  e, G5 b' J
} // End of _PPC method
9 f; n# [) e4 E5 Q# P( F, V0 G 0 w- \+ I; o' B
l
) g" z) v. U! J$ F) }, s
_PSD3 _6 X5 k1 x% ]$ u) g4 t* }3 z: \

9 S+ J& g, ?) j+ i3 h0 y% u: gP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。/ u0 I4 {3 Z  z( N( B4 s' @. d6 E
0 W2 |8 b: @- R" H7 i  C
REFF:
; C7 s1 L) J9 o4 w1.
  R1 U0 z( |8 P2 i- @9 c% H' TACPI Spec 3.09 c' t: y( K. e! g) w& a
2.
4 q$ p5 D/ }( i8 `* [: PIntel Processor vendor-Specific ACPI2 C+ d: s; n' b! s
+ F+ b' ~1 z: l' [. L9 t

5 E; _' u, E* H! x' y5 L; SThat’s all!2 t& b% P5 {9 l" Q0 r& R7 N) |+ }1 ?

: l/ C3 q( }9 o3 EPeter
  _) ^* N/ _, s7 q# C( t( r 2 E& y3 H. X, n; [! `
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview, y8 E/ a* b. Y6 q7 c
- G: o2 a' L( C0 X  @3 o
CPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式5 a6 l. m. e. a) v$ |% ]' o
,影响系统的功耗和温度。  o- N1 D4 y# o1 g( p
6 I& V9 N* r; ^! T( {' b* x
2. T-state Control1 O' z: c9 v+ d- D+ J

1 n" X' {/ b0 I7 ^* [1)
+ q2 F  G, D- GMSR Based Control1 A5 t+ h' C2 I9 ?  H9 O8 N
: U* Y; G6 v0 b2 F& r$ r' O
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
1 s- F! m$ ~5 O) P/ ?8 ~$ H 2 A$ B( n. e+ S' c( Q: `
2)* }% k1 E" r# M0 {+ \% @$ n6 T
I/O Based Control0 v, t- d  Y0 ?8 t3 x! v/ J
3 j8 I' Q3 M% d
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。1 \# B- C$ v% W5 A- B: ~2 [, ]4 O% L
( u+ p( d- h+ a* }+ f
3)2 w) e, f( P* h8 ^' A
ACPI Structure For P-state: l: l6 h: y  P
l
1 W9 Y, n( }3 P7 a7 q' V. \, @, M
_PTC1 C' E6 m# k5 u# P% p
; K# G. ~* L* _. ~
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:( t4 B/ W0 N/ ~: |' m4 n* ^

! G; A1 I8 G/ e/ eName (_PTC, Package() 3 M9 d4 E4 n8 E3 W
{ 9 g. d4 M4 e+ k  [% c
5 N1 x; i- \$ G( D' [' ?
ResourceTemplate(){Throttling_Control_Register}," Q+ v7 y2 k9 J# H
//Generic Register Descriptor
4 }7 c) S  f; H" `, e9 [' u  b4 k- b4 M8 Z. G
ResourceTemplate(){Throttling_Status_Register}
, a+ q$ ~: O4 ]$ F1 k: [- _8 Y//Generic Register Descriptor
5 b9 E2 V& N$ ?& t, H# {3 M}) // End of _PTC' e2 \- l0 |6 [

7 s# e; u  z9 q3 S下述是一个sample code
4 G# o( Q& T" _. Q" X
) |/ d% I+ f- C; N( q. h$ g  r- o" v
//; y" |  H$ n! }1 I$ z; ^6 f. [1 N

7 i' i* g6 q" W% z& O// T-State Control/Status interface$ e: M, G( J* M0 [4 x/ e4 W

8 O, ]6 J( D) d4 S5 H& G//
9 h3 Y' y" U$ C1 t5 t6 s. t: b) l% g# y5 M5 A2 w# M
Method(_PTC, 0)6 ~0 @" A8 c  l. w
% r8 R' S( a7 m- P/ l
{/ x2 f/ o* R5 g: N% z
( {4 [7 A' x6 Z" \" g
//8 H  ~1 _4 }6 B% E8 r: l0 t( N: o
5 p3 u6 ]3 I6 ]; a4 r1 u
// IF OSPM is capable of direct access to MSR
- F% q6 L3 D; b8 }3 ]: U" c
2 U7 |& s2 P& O" j3 B/ G. i; m//
2 z3 a3 Y: t& E! f$ V( ]6 V) j4 VReport MSR interface
; A/ r/ A$ n/ p! O) e- ^% R" z' D
9 Y& D' J4 E* u' k/ {. Y: o7 d// ELSE
1 l/ r$ J6 G" T5 |) _3 [" c$ {9 T% D3 [- V9 H2 B& N% T: u( Z2 K4 y
//
5 r6 v# u# K* b6 e1 `1 z: j% q( }/ hReport I/O interface! w7 ~* a( D+ G/ x

! c$ z  m8 _3 q0 h! D5 G//
7 `( [4 d0 u1 Q) G
5 o8 }) t- u; n//
) [! {: Y( S# y2 ~& qPDCx[2] = OSPM is capable of direct access to On
4 h- l; b. `( ]/ Z
1 d( V8 w% W7 b# w//5 H  E. I- _, i' x/ E
Demand throttling MSR* d/ e! C6 w- m

" c3 ?* y9 F' V% Q* Y//0 F- i8 j3 i( u$ |* X( K/ O
! w$ P& ^2 \5 {3 V# m
If(And(PDC0, 0x0004)) {8 _) ~! Z4 `7 R

7 o7 b. t  J7 l. d. p0 D7 YReturn(Package() {+ J" w4 a. t5 X/ \, G8 _- `; l

( V6 o' I7 [5 |+ J% ~, pResourceTemplate(){Register(FFixedHW, 0, 0, 0)},# J; I# L0 O; _: v
3 C" f$ O: x4 [  S
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
: ]' L0 s9 ^0 v& o7 w
7 H& c3 S  I* \: T0 S7 ?8 A})5 S3 K* s4 W% v! o

) w# _6 b7 k- W3 n, s* Z}
2 a5 i% y5 p% O1 M1 |
* \$ Z4 F5 [" [" MReturn(Package() {* h. E, K$ V! O+ V: ]' k

1 j8 R  E2 j/ N0 p' DResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},9 }1 L4 j6 K! P7 I* U8 L9 X* F
' ]/ e3 _: q2 b# j; D" |' {
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
$ y3 P% ], g$ F7 z5 K4 Z$ h1 @; E$ Z1 |
})/ E2 H( T2 {1 Z3 V4 s
/ {" T) t9 ]% O$ X
}
+ j" y1 h& Z9 [8 P0 m; ^; J6 d# ~+ b; R& e' |( S- ^! M
3 q& ?3 {8 l! l' A* h( y  j
1 G4 C* E9 n$ P9 {6 ?
l
3 X$ X$ |+ ~# Y7 `) N2 g. B
_TSS
( k6 q0 ]% P3 h9 e2 G% U7 M, Y/ c
* f* Q3 U& v' n/ Z" OThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:; U6 X1 `1 c3 |+ q( |9 o/ e: v$ K
Name (_TSS, Package()
. ?+ j6 `) l  @7 h{
2 I/ J7 k; ?3 u7 K5 ]// Field Name
9 l) G* q7 Y" v8 }6 ^Field Type
* R7 j. @/ ~% _9 s6 Z$ Z( j4 c, k1 |/ G1 y2 x" p3 k

0 i8 B. ]2 y! |" Y( ~# M, z
* o& j$ Y! t/ {+ S5 Q; i" B- ~Package ()! F, b& p, |; O5 z& N( u) C
// Throttle State 0 Definition – T0 & r: A. |0 e2 n. e& \2 {0 C! d; k- H

% R; p5 ]- Z9 V1 c* K{4 \! q' n: `% z/ V
/ [+ n) i/ W6 e4 s! `9 G% Z

; ]! p$ ?7 C) i2 x! zFreqPercentageOfMaximum,6 \6 B' {- o+ |& S0 N+ Z0 ?$ R2 {  b3 Q
// DWordConst & y/ B4 @- i2 E+ E

- L3 h' P( M' U. d$ ~4 S' M% yPower,
4 {2 l1 Q  Q4 I% {// DWordConst " K3 m  F, a2 O4 R$ R0 ^; i5 m

; M' W+ b) c4 ?0 [TransitionLatency,
: _0 u% q2 u4 G5 _) O, |; t// DWordConst
& v1 t' D. [) C( `% h3 V8 G: S. N8 A% d- N) |3 C3 f7 r
Control,
2 |/ j5 B" K+ k/ ~* o: W// DWordConst * O. K+ q" @6 N$ K

$ A: f% x* D2 X+ D$ OStatus
- T4 R5 J  R, V// DWordConst 2 b9 z5 f' j9 w* L. b: g9 E
},3 a2 z8 n5 b% M5 y* ^
……
5 o) a1 A0 M- t; X3 l$ P! @}
0 Q2 w, Q7 Z9 j) Z0 A: \
: n6 F7 h, B  N( H5 wExample code 如下所示:  z( e* p6 `( |# e7 [1 x+ s. W
: G. p  M$ V0 {, B
Method(_TSS, 0)0 b' X. ]. A: V/ }( ?* O
, i3 g: V4 H  V' H/ ~+ a
{
, |% ?7 {7 k  P
3 o1 l6 U; B% C+ H6 Y0 i( Y+ W/ OPackage(){100, 1000, 0, 0x00, 0},* V/ I! b& y0 _, V1 F' @8 j; O  a4 r
. a* r, ~# B% S7 _
Package(){ 88,! R" z. O- T" h: ~) [4 M& Y
875, 0, 0x1E, 0},
- R" }6 S: u; R+ G' I8 e2 k% t: A+ c! \, p: e1 T
Package(){ 75,
- Q# D# ^0 M* L: \9 A! f750, 0, 0x1C, 0},& y& f) G7 V- {8 j

2 S) W) s+ p& m' G- VPackage(){ 63,) O1 q$ Q! t4 D% `/ j
625, 0, 0x1A, 0},
* _, n9 Z5 v* x- e0 D$ S+ G& {- p; G+ M" r: K9 H% I( \% p
Package(){ 50,
) c- `5 e" V, y3 I6 n500, 0, 0x18, 0},
5 P# {3 H  j6 p1 t& C  S
" y! S/ S2 G) h$ i+ [& H+ V9 y" i/ I/ X) EPackage(){ 38,
# |+ _1 u/ \& {; p375, 0, 0x16, 0},
, ^* v6 \1 |) g- U) @4 {
. {  |2 l- A: ?Package(){ 25,7 d! b2 d! x2 k& T. Z/ Y  u0 c
250, 0, 0x14, 0},
4 Y' b0 Q$ c1 `# p1 x5 W4 S# }/ G1 j, N9 M* a
Package(){ 13,6 O' [! b* I) ]: m
125, 0, 0x12, 0}
) r! n. l, X* L* u3 L) s6 d, G- j
  \* b$ _- P# R7 e}
6 o8 P2 f# A# M( O
- ], q; A# C! V$ n8 d9 R0 w, K& G# w& R( O4 q# m, ?
l
& h9 t. X4 U. l( `( E2 u+ S! E
_TPC
3 l+ ^& @" t" S  U4 L
5 k0 m: f" H: p5 T" i3 F. N1 @+ PThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC; g. p0 `1 \7 J2 r

0 W- X/ {$ |7 w( ^1 }" B6 W8 Kl
5 U% P+ i0 E1 Z/ i! ~
_TSD1 b7 X8 r4 Y7 ~. g7 C; x7 U- _; `
/ R! ~1 z( {9 I+ B# ?9 R* D
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
$ H- h$ \( V& [ & V6 b, I" p  u' {0 o: l+ H
Name (_TSD, Package() ' b" Y- }* g( j2 o3 L+ ?
/ l$ N0 e$ n+ Z' i7 y8 C' v( W6 ?2 j
{
' t! b. p* H; l( b' O8 v1 v4 `. G) h
4 f1 l$ ^- S( m* `4 O) O4 @Package(){5, 0, 0, 0xFD, 2}
1 C8 R1 N$ R9 g1 g) h$ U4 Y8 N// 5 entries, Revision 0, Domain 0, OSPM ; u# ~6 O* y+ l
Coordinate, 2 Procs
1 U& S- l3 h+ ~( ^) W' o7 f9 h1 s% s9 Y; k" W

7 B9 h% F6 b, ?; T$ T}) // End of _TSD object* y% `; H$ k/ L/ y. y+ K$ B7 n
) r: k; x9 t  K) a' K% y  g
REFF:- {% d+ o, [" l' |
1.
7 N) O6 [+ X& t- T5 b/ h$ |3 \+ ZACPI Spec 3.0; x! y! d! a0 M* g- [( w
2.
! g5 x( q. [/ @' }5 \  MIntel Processor vendor-Specific ACPI5 K6 z% ?5 p+ G( Q: j' R% o8 _. k2 N. D
4 f# p# S$ [( P& g6 l
" x+ s1 B0 G1 b1 L+ w
That’s all!6 h% _% w4 w% P

, W- [  w5 W" g4 A$ A3 yPeter: o/ k8 a8 J5 }/ O

9 h1 i, J' u& z7 q) m8 X# ~2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 00:17 , Processed in 0.131310 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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