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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state

; ]) W4 v& g. W) X; y1. Overview6 |% E, ^' \8 Q7 M3 U

; ]) a6 S6 E0 t0 ~& Q
/ S+ d2 x- R, kC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
; `2 t% ~1 t8 d# Q- z降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
& Z" _1 u3 w9 d8 b3 M7 |0 z: ~比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
) |, o' M2 o) x5 h7 I# v6 A+ c) V! Q5 K
cstate1.jpg

# [+ X1 ~5 Q5 d0 b
1
/ M" D9 C: f% H
2. C-state Control; N4 g  ]9 w! f9 Q
8 u# z& S. w( R1 t1 \+ z
1)2 A4 K* m1 D7 U: ?0 v  ^
Detect & Enable C-state9 j1 W$ J+ t+ w6 m) {$ u: J
, A, |0 ?! V0 y1 Y0 v7 }
BIOS可以通过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的支持。
. ]7 U$ S. _7 p5 i+ ^
# E( M4 V  a7 m8 p7 R% g$ [% a6 l2)
9 |4 c1 I3 R4 F( f! w! X* x5 z" U9 dC-state Basic Configuration6 ~" n6 e" N1 H1 k" `- V7 @
通常情况下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)。8 O" F) k) v- m  G5 ?
; B  J) e! m* w2 q
3)
, u; \* d% N# ]# @ACPI Structure For C-state- W1 P4 P' G: x+ h7 J! F

6 ^3 W1 T' ~" g+ k3 f% al
. o1 Z! \! }  @/ O" t$ U% c
_OSC & _PDC" e2 w0 u! ~( @0 U) D
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures$ i3 g! E! a# g+ e8 }
l0 {+ Y: v# m4 E: A1 y& Q
_CST4 ?3 }: H) Q" @7 ]$ g  w4 |
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:9 c7 ]* W1 W- U9 ]
CSTPackage : Package ( Count ,
- g8 t# }# o2 n! D+ u; eCState ,…,
) b/ K0 o1 d) r5 P1 ?CState )
6 A. B+ {0 g7 H其中Count表示所支持的C-state的个数$ V) D0 X/ P( M( _& n2 U
CState: Package ( Register ,) m5 H3 w. r" b' s7 n/ F, B
Type ,
3 f+ \$ @$ E8 W7 f" N7 f8 s2 kLatency ,) S4 M; E6 K" q8 U6 t( D$ o8 P
Power )
7 ^& e0 O/ j% |) \% i3 b% K, g
Register表示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
+ \% K. F, j) w& [+ T& k; t: l7 O& N1 p7 |2 ~3 m2 N& b0 Z+ Y: l6 t
Name(_CST, Package()
) T" `  L% v7 q/ m; Y! @5 n
* T# Y+ e, ~% o+ G; Y
{ 3 |. |- G5 B- P0 [
4,
! v2 }0 {: _& V7 n% n6 C// There are four C-states defined here with three semantics
, u/ j; x& t# l
: |4 p+ O: `% C7 N
// The third and fourth C-states defined have the same C3 entry semantics8 {/ X+ e. j( Z+ p/ V
: s- U( r2 s0 _1 G
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) B& j/ ]& C! S# B
1,4 M$ ^% G+ n) K
20, 1000},
( q! [7 ~) k) D/ l
1 C- J2 B  p% C9 Y% V
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
/ Z+ m( s; ]* v  u) B$ V40,( U$ T" ~0 I; x  u1 [+ J
750},

! x0 m6 V! p7 A9 Q' T; nPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
+ M3 u! K) Y* M60,0 C+ y$ [4 F/ q- P0 x: R6 ?$ \
500},
" n. x% `# c7 ?# P+ \8 f- ~
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
' b) v, x" }# r) A. h4 X. U, K250}
: P) r5 g+ p: q% A7 @# z
" e( x$ d3 c/ [5 E
})
5 z( Z  K( M0 I# R& y" m/ \1 W- O; U; u  V
l
; x. }" ~5 U2 ^) ?: r2 Z- _7 G
_CSD
% q* A+ r/ A% U, l! I9 w
& O; d) U! _; AC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
. ?& d! L; ]- L2 x2 P2 \. o. T. o7 }0 K

8 e; |$ k, `) H
' ~7 s( k! S7 q/ P; v" f" F
9 r- j  s  N7 h- y7 V9 }3. P_LVL VS FFH+ _% ?3 R/ s9 |* R) W$ V, E( o

* ~7 O& ^6 T# N% GP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2). d, X( v/ D$ J
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所示:
) Q: f/ b; \; c2 r) \; g; w8 p$ p/ |8 B: X. d& {4 |+ n
gas2.jpg
. K0 l- _6 b# D/ ~7 R5 I
2
4 y: G% G& r0 g; i4 T8 N
OSPM解析到该_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的一个例子:
) A! U$ N3 S: V1 |) F7 @: S$ }Name(_CST, Package()
) a; P# k7 C# D

9 j) P) y3 D, v7 @{
: `$ j* x1 q& g5 P: b2,0 t3 X! `1 I4 H( ~% k1 \
// There are four C-states defined here with three semantics

8 f: g  ^& B0 x2 a" |, `
  _! ~1 {0 `0 l+ }5 |; m// The third and fourth C-states defined have the same C3 entry semantics
2 n8 i* j5 [1 A* ~2 z. U: ?( {

( L6 R/ M9 x+ x) x+ EPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
1 A4 O4 B; J9 t0x01,
& e. E" x/ [. ]$ W4 |. W7 \0x03, 0x000003e8},
# o. V  [& p. n8 T7 c3 U, J

2 q& W7 I! I2 {Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},6 r" j+ [# d: i% K5 A$ b
0x01,4 `$ f9 _2 D# p/ ?( O% e2 B: \
0xf5, 0x0000015e}
2 @$ q# Z& F* {7 [
})
! u5 d3 s. K) e
* I' j9 |; L6 h8 p( |
7 D' t1 {% `; P0 n3 s1 `) e' RREFF:0 R* i" a" v8 R' {. v) A6 K: E
1.. p1 Y* j$ L- @" @! k
ACPI Spec 3.0
- b1 K6 W* |, k- M* `- @2.4 I& @4 F9 s$ E+ ?
Intel Processor vendor-Specific ACPI
1 z8 ?0 B" l, \, L, y: W* f: p. p8 P! T7 c: H0 @

, c4 _0 x0 x! M% T; A! x9 MThat’s all!! m% {# ^- {' T& q9 v
' G9 G2 w6 Z. \0 G6 R) c
Peter' X, I3 C8 A& n& t; S& R, e' W

& h/ N8 F% R+ T  r9 P: a9 t9 y2010/9/207 Q5 j3 M  V- b8 I0 e4 Z) G- C
6 w) Y/ w1 E2 h- x
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview5 B5 z8 X( N4 p4 R2 {) N

& e: A& h1 y7 d% Y) B! Q2 v" n. ACPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
1 @3 G- N  \3 F' K/ A- TEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
! C8 U( h# _2 w  ^! i4 g" G$ @
0 n0 t0 g2 @+ o2. P-state Control
* `$ b" V- f; m. ]* s. s
: r. k# H+ c3 [' I1)# R) T$ S( t% T1 T6 Z6 q. ~9 T4 M8 u' d
Detect & Enable P-state
1 a2 K2 J2 m8 j) m: _2 m6 }: a- R
3 V1 S1 X3 N: F( w4 y7 D- O2 _  wBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state* m# e& y4 c8 t( f/ h
0 ~* f  m; @. {$ I, z- C
2)
$ g, [8 \$ J$ aSupported P-states
3 X$ G% Q: L' C
/ S8 g* L9 S& v6 GBIOS 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* K6 l7 A( x  d2 `2 t$ s5 N0 {6 T7 H
) [- B/ q6 Q1 E% x; f' x0 F
MinRatio = PLATFORM_INFO1 c! g  H& p; R; B
MaxRatio = PLATFORM_INFO+ f- O- Q: T' L% [3 a8 W3 t
RatioStepSize = 0x01
; ^: X5 {) D2 P- SNumStates = (MaxRatio – MinRatio) / RatioStepSize + 17 ^. l; }# E* m5 E
- e5 B4 k$ s, V8 n6 z
If(NumStates > 0x10)$ C- W9 h2 H, O' B4 \8 Y1 }& J  w2 ~
{) R/ r1 i5 ?, X& q1 S: u; F
RatioStepSize += 1) ~6 u! z+ b4 n9 x, P  J
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1# i: b) G, i" I8 X- F7 y$ d
}
! l4 E; \" E# q
# S  Y6 g4 y& ]. y" c6 S3 P3)
+ i+ r, `+ J2 w% aTurbo Mode  H' e% r" s- i' S

3 k7 Q7 g4 s) d4 aTurbo 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
! R* I1 G' B4 w. u
9 ^  ~- S5 E8 q  a' l- \4)! e& x1 T2 y  _
Over Clock
/ y* e# Y* {! Y% @! m) a2 q
0 _$ V. x+ ~& ~# o, d& q6 i, q6 g某些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 t1 y& T# D# o
8 ?% D1 Y5 L1 s# ^$ Y
5)! @( k$ r) v* D4 R
ACPI Structure For P-state5 P! |- I& P) a" c

# o1 B% O  \- j' G/ J& V& Z) r! p5 Fl
5 ~( v+ a4 q2 q, G1 @
_OSC & _PDC
1 f3 N( s7 I2 t' K0 `. C1 Q$ o/ J0 ~ : }4 z+ o" @7 h. m4 y3 k
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures, d. P0 \) S6 A. b3 ~3 `# C

1 m( t, |1 P+ T$ sl
& S& s; b/ I+ U
_PSS: f# E( r7 \0 T* F8 H) {9 O
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量; \( s/ X; }9 ]5 c7 d6 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做比较
: P# F5 ?: `, g6 d5 _" F- z以确定P-state切换是否已经完成。& _7 q9 L: f8 w

% V  U( X: O7 Q( @5 DName (_PSS, Package()
, g$ H  p% _0 G! i& I7 c{
7 W1 j' h2 [: E+ z- q7 t# o5 K// Field Name8 ~4 q' S: C( @& n& k5 F3 [2 z3 T
Field Type ; S! x% m4 r/ h5 W. t+ h0 ^
5 x. G5 n. O7 M7 U5 I* D  h4 g2 J

' ~7 T; L4 v9 ^  c2 r% L  i' g2 [# d: O
Package ()
# D, s. C+ e- s// Performance State 0 Definition – P0   A* @- z; h, ^

6 E3 v3 w/ p: M/ U{) Z8 W/ w- L3 c/ V0 Y( a

' H7 p9 N: g( x- i1 |/ S0 Z9 {  p& n* A) ?+ v! ~& Z/ S2 ^
CoreFreq,
1 @1 L3 m8 M( E) i  k// DWordConst - ?* P6 B! O* U! I% u
1 J7 B# B" K7 N. Q% F
! \: @; o. v; {2 H+ |
Power,
4 c/ D7 ?" Z& y+ K! ^// DWordConst / T- A2 s( Q6 \0 H- Y

0 c) }. P  `4 w3 \: N1 }TransitionLatency,# c8 y* v% j# d( N
// DWordConst % _" f3 Y9 k6 o1 Z; Z& g

5 @+ b' i. h8 C  x- q9 d2 FBusMasterLatency,/ m2 f7 \- d( g1 O: p7 j9 G5 t( @8 v
// DWordConst
! f) Q7 ^' X8 A4 n6 M, ^6 H7 f% h& F( Q) Z" ]$ [1 r- z* e
Control,
/ K( H4 o5 c* t; X4 G5 g( j// DWordConst ( u" P. A# ?, S8 V3 b
- X0 F. `/ A8 Y! {5 Y9 W
Status& ^+ x' |4 Z, p
; V7 N3 ~3 Y& Z! W) e
// DWordConst , ]- A; y- N+ D2 k' _+ W* L
3 ]' {4 S3 G" e# z- [# J
}, ) K, \: ]. m, M6 v4 x/ n, A

% `0 U5 _: f+ o0 p- H  u2 c3 p.
+ r. M2 }9 V1 s" D( r( P! r6 |
6 C) n# B+ |8 l, t& x.
8 D2 b: G4 Y2 }# j4 ^& e- d) J' G4 Y- N; @  L; N% g
. + e$ ]2 r: L# `2 A+ F
}) // End of _PSS object
/ H% |  |8 p7 C9 l前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 3 u  V" W3 \' q
2 Q0 b6 R0 _9 |, I4 `6 A
Name (_PSS, Package()
$ |% w0 U# m, K" I& x: V7 u8 _  ^7 c5 \  E5 y: l) T% F6 p
{
8 Y- [  y9 N! _) r0 R* }. m1 }7 K+ x" l
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) " _) W+ S1 C% ~/ x. d' O

0 y4 }! H* T# B% P) y) L2 p7 JPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 9 @. T+ O- Q4 R, M5 i

5 t0 ~' v$ l& j$ D) ^: KPackage(){1400, 8200,. \: ?: u( i, z8 R6 Y: |' W. k
10, 10, 0x000E, 0x000E}# f6 k& O8 m! `2 j3 V' W
// Performance State two (P2)
# x1 e4 ~* i; n- rPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
5 w( y4 O: f( n4 TPerformance State one (P3) , m- i6 B/ |( L+ y- y7 D/ k
7 y+ S: s" `4 j. j/ @  c6 A
Package(){1200, 8200,
% ]4 P& F! D8 v10, 10, 0x000C, 0x000C}
  F  \! k* D" x5 T// Performance State two (P4)
, {; k; P# e2 h5 ]  P2 _" P, a; @) g& T0 \
}) // End of _PSS object, e9 ^4 }2 A' r; l0 J

3 O$ x+ C# \; z9 e3 f& |" y另外当该平台支持Turbo Mode P0将会reportTurbo Mode
5 u1 ~" F3 Y( F 9 H' @1 D2 \% p% e6 {5 y
l8 ~4 R/ f' C! j: o
_PCT
! L. h$ `0 K$ O7 A& |& @ - z: @7 ^& g0 ^& F' ~& D* O% F) M
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的方式来进行。* e& F1 _0 c; W9 O+ G: A4 y& w' d

% o3 h* r  W% Y) \5 RName(_PCT, Package ()1 Z' q( U, k( _( f, p' H
// Performance Control object 6 N) c- f$ y1 ]( K6 \

: M5 D9 J% o  ^) s2 `{ " D5 C' P5 k3 ]) X, P

! J& g$ C) H. u3 PResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
8 d$ ?8 u. N# T3 A/ y// PERF_CTRL
- o* r2 |! K; W( }, F6 _: T( K# v8 d: t: F
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}9 ?# a: O+ A. B, Z
// PERF_STATUS 0 O" h+ g$ v. L/ }# A

' d4 @: h+ k; [' v& y}) // End of _PCT object
  y7 `' t7 x7 K! F
3 z6 l9 g/ y0 h' |( n' k) K' il) ?& e* p  `" g% ~8 k" X# E7 w
_PPC" c9 g1 E  y  L1 H+ G

' n! Q' q) N# q) u, n- p! X8 I" dPerformance 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
/ s2 z+ ^* V# U. e
  f. M( y" v/ C' ^/ P$ G) ~Method (_PPC, 0)/ F5 {+ J6 n, N% b3 D7 w0 c
// Performance Present Capabilities method 9 n; ~$ [0 g$ S6 [1 {

. H# x: G9 N- D& [! T{ 0 S# [7 ^8 I$ J  U/ o5 W2 v" a

% }& p) o6 z5 tIf (\_SB.DOCK)
6 U% u# \# R* P( F' C$ c9 |/ T/ {4 _6 T" j9 ^# u6 `, M  X& P
{ " B: a% f8 P9 N( N! d0 |$ k) d  [  {
9 G+ k% K0 [0 l& E
Return(0) // All _PSS states available: @2 U" ]: U0 X

2 G; B9 C! E  [/ L# S7 P3 q& x: c' d5 C+ ^! G
} " q' c$ V; O. o8 s2 z8 ~

4 S& g7 X( a6 CIf (\_SB.AC) , {2 _' ]' U) N5 O  L

# G# ~% E' v! A{ ) G6 F% g: b5 {0 e$ E
7 ~/ L1 R' y$ R4 o3 F) `* W
Return(1)* O! y9 a0 R5 |9 J4 Q; Y
// States 1 and 2 available ( x3 p  o; P+ Z1 l9 S  `5 J& p& g% t
9 |. \- q7 m8 N. @( k
} / o# V: g2 h" p( s' [: h
0 m; f" B& m. H, d2 L
Else
9 j. k6 y2 i" P3 v, B/ ~1 f# q; F" G) H* [0 t
{ . k% A5 w" d( U/ Q' V$ y6 Y
  m  t# ^5 U, s6 c& i
Return(2)' ^  `2 |- H% r5 o) e. \
// State 2 available
' c  c! K8 |+ \. p& c1 F
, C: P- |- I- }2 N; j6 p) u- X! }}
* O# _9 {7 N' X/ k8 D: q
( `6 k6 C4 H9 K3 x} // End of _PPC method2 \) I$ \9 Z; t! d
0 n, Q  `$ j' ], _$ W
l
( V8 W" c( X4 _2 u4 c5 j
_PSD. F4 ?6 C1 K) \- i
; Z" w0 D3 Z, i. n
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
, h; E9 f4 Y; q5 G : P4 v: E2 k/ @4 a0 d9 V
REFF:
% e3 t3 I6 C4 w% h  a! j, t* [1.' ~# V- X$ F( w7 {) O
ACPI Spec 3.0
  Z+ I$ E( h" h8 Z; ?2.8 ?& o/ C; i# F) Y; m
Intel Processor vendor-Specific ACPI
) j7 Z% p$ ?( I* w
  w3 r! d6 g" G( l3 T/ o7 `6 J # O3 T% \" ?0 a" n+ z
That’s all!
# E3 H( @+ j$ v+ v 9 F- Y9 u$ T# d& x
Peter& E2 F# |2 X. ?. W

9 O0 m3 E9 p$ c1 Q2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
3 Z7 f# m" `2 V3 g  r8 T% z$ d ( {- F4 n2 k  |$ B
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工作时间的占空比)的方式! d1 _$ f* R" z7 n' Y" u
,影响系统的功耗和温度。$ e. c. {! F: I2 h

; [( z. D& B2 q8 Y3 M2. T-state Control2 v( _; U9 q# D; s

) _8 M( b  Z3 W4 B4 K' g* Y0 L1)- H( e6 u7 J0 W7 g3 L
MSR Based Control; s7 N% k1 i' J3 y9 j

' d- z8 c' ?7 D' S) `- ^0 L6 {BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 " V0 T- p. L! d7 y: k% q. L) j
1 d$ F# W( Y- e& s" D% N+ q- |
2)
: a. b$ z2 O' N5 j: r4 [I/O Based Control5 F2 w: a7 m, ?4 O! z
3 F( r7 U* U2 }4 N6 b6 M
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。0 D1 j, E1 M: o% I$ v+ f% b3 {
$ l/ I9 n# U+ Q- v7 w/ `4 T
3)$ T5 v5 o% l/ m7 C, M% w5 v
ACPI Structure For P-state
7 N4 J7 v3 d* V4 Pl7 M) _4 L1 o: d. [: N6 a
_PTC
2 s! j; |9 k. q
8 f2 p* J7 f+ h. E/ O4 YProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
1 J7 R6 \/ Z) k * m. m: }; ]  f# ]0 _8 p$ l
Name (_PTC, Package() + e+ f8 n5 g( f0 c# O. O
{ / w! s7 r1 W& L, [

) [3 W1 N) Z6 y+ z' qResourceTemplate(){Throttling_Control_Register},$ j3 H/ H5 `- p
//Generic Register Descriptor # G; m8 H# n1 v+ d1 D, x$ {! j5 j
5 x' Y: E" `4 U" Q* l
ResourceTemplate(){Throttling_Status_Register}/ c* ]/ u: q' M# r/ C7 A: S
//Generic Register Descriptor
3 J" n. b6 A/ T4 [0 h; x}) // End of _PTC
! r. X- U/ C9 R) z, ^; s 0 N( U6 \" _8 S  y* {: f
下述是一个sample code5 E% V/ J- B8 [& S" a2 D
9 Y9 _$ t+ ~' q* h* K5 j. J

$ V; Z) W  [; }7 t7 b0 x
//
6 @+ L8 l  M0 L( ~6 K: ?) S9 m8 v% n" b4 A0 L! T: J
// T-State Control/Status interface8 W5 Z: v2 ]7 j! E6 f
8 C, L& L1 s  w- J; |, [. {5 s
//8 N6 i/ d: l) V+ A% R
1 [/ y. Y2 C- M' y: A; I" @7 e
Method(_PTC, 0)2 t' @$ x) W7 O6 C
% j. ?0 S9 \# v3 V
{
: m- w: p4 ?. x6 _4 M) G6 ^8 n4 t4 E4 K8 h+ Y
//: N* D  }' W( h+ k' |9 u/ Z" v% Z

% e% ~: G) F( i// IF OSPM is capable of direct access to MSR
( j& x1 O3 `/ w, ]! O% ~
1 K& B% F3 s5 K//
7 d- ]5 f$ m7 ?Report MSR interface0 q& N+ Z* t7 D- M$ P2 X) @. u* l1 E
' g$ l2 ~9 m& [6 W
// ELSE
' ?* T& k. y0 ?9 b! \+ {
. Z1 j" q5 U" c0 T" \# D/ f  d//2 B( B7 i2 ~) _1 d1 X$ E( u3 B
Report I/O interface
3 _0 u6 a4 [+ x3 U7 t6 Y7 Z: P9 W( e/ H, l' d4 v% }
//$ C0 k8 u) ?& O% Q

+ B4 ~& N4 Y+ e, p, ?  I//& o( p  O. M4 \2 ^6 |
PDCx[2] = OSPM is capable of direct access to On
# L( I) f7 [: a" L. ?) s% m$ J4 P: N/ S, G( h3 [8 s. J
//
5 ~6 D6 x' [5 N6 w; \  n5 CDemand throttling MSR4 A! i9 D7 m+ M" t
' a# [& }9 W$ o3 e. b# M  u3 l2 g
//- A% b8 u7 D; ?/ B2 ^; }
  r" U, {1 A9 q+ J
If(And(PDC0, 0x0004)) {& S) ^# d2 v9 j. h8 q' T) {% S; K5 O
' ]& q2 @. \3 z
Return(Package() {, D4 |. c5 J+ W& m

+ Z2 b' _+ T% X# D0 Y% LResourceTemplate(){Register(FFixedHW, 0, 0, 0)},8 g* E3 }2 l8 y8 E# w( R; H- g
% D# C5 o# B$ j4 Z
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}. S  W* `" h. ~, j
7 ~. t. ?! m1 V) D- Q( ^% v
})
( h8 ]; o/ a! `( \/ g8 `! ~+ l8 k1 @, i7 Y/ v
}
. q- ~' s* H& e6 P8 h  N+ w" ^0 F- O. k) x+ _! L/ p& J
Return(Package() {
+ l$ J, S7 I2 Z' ~* X! V. X6 N
  X& ^) C6 y! Q$ H; M- `; YResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},4 N, N7 Z4 {- D0 {& ^

# G5 v) o! O* W0 B! ?ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}) V* W9 O; w$ U9 K- j1 h
2 Y  O% h; u* C& {: k9 V( }
})
; H0 M5 ?  p9 Y: y+ r# ?; E, q7 t, W) c7 G  |2 {
}
( o5 p) y% @1 {! ^+ M0 F, y" V+ }" m+ Q' e: Y6 Y
8 a( l" [* q3 X
+ D  T6 j3 _. u, N( L
l
% V& ?# m/ p" y, g" w) |
_TSS8 P5 W4 p6 \, x+ U& B* L

/ D" u% s. r1 iThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
, c9 H. J0 F, {* O3 x; M  ]; sName (_TSS, Package()
) T' t8 I; O" h% h2 r{
; m% C# I) p8 l* I$ Z! p// Field Name
" {! e  [' S. H" N& V0 J, B% OField Type 0 A9 L1 m5 E! V% c" V
" ~( _  d" A6 ?' [+ X# O9 p

1 f* O! c$ W# s0 R* v- g% c- D' i# m; i5 X8 w! j% o, v3 p# m1 Y) w
Package ()$ m0 x6 Q! I0 R1 |7 B; H# S
// Throttle State 0 Definition – T0 2 M" C8 f+ R0 \5 r! F2 f

) M, F+ E8 \8 f7 P' L- v3 G{
  g7 C2 y3 q% W- I1 f
4 F; r# |& V7 v( p# \7 i. O" w
FreqPercentageOfMaximum,  Z- o: \/ R8 T# X5 ~
// DWordConst * }8 @4 L% ~1 v

' F' M  d* q. E. `7 G7 lPower,1 R' x4 {1 P3 g( B7 D, N! V% N, R
// DWordConst
' ^9 i8 T' f% x4 m
0 M6 ^9 H) W( C; U9 A' ?& oTransitionLatency,
! j: O7 F8 w& n// DWordConst
# n) M" `3 |8 W
* Q6 l9 {3 @3 l, Z7 |! {Control,. ]. p. p; t- k) b6 }, T- Y* Q
// DWordConst ' O& w1 H$ o9 Q( \1 Z
) {7 I3 F+ r+ b2 h. t, m" T, s* G
Status
) d: z, W: ~! W: \) D# y. Z* v// DWordConst 1 k6 }+ ^4 S" v& |9 V
},+ i" O6 W3 L& D  F+ Q  h
……, x' ~( i6 d3 q0 n, Q! W* v# ], D
}% g% o+ v% S1 ]4 e; T$ |; r, k+ k
% m2 x, S2 I' U' m9 {9 ?6 i
Example code 如下所示:3 I% y& E; Q; L  U0 ]$ X
3 {( F& H' k3 |7 t
Method(_TSS, 0)
: ^+ B5 J5 f; w' {. ?" e* ?/ f, @
3 D4 T/ n8 T5 _% s$ _{
9 f2 y8 F8 q" W$ f0 Z
/ [7 ~2 D) x7 o) ePackage(){100, 1000, 0, 0x00, 0},) y% x" o/ h! V/ F2 ~
/ ?5 X3 h% {) s: h8 U9 H! `$ L5 k
Package(){ 88,
9 m- f' G" ?, z9 _: M875, 0, 0x1E, 0},
- k; U5 c/ i5 o" J* x+ `$ q
( G! x+ [) L' e2 _6 Y; nPackage(){ 75,: f8 h/ p. u1 H' P/ T! G
750, 0, 0x1C, 0},7 Y. d1 l6 B; W- C$ |
& ?  `, ~7 J0 V
Package(){ 63,8 E; @# G8 z) x& q+ S
625, 0, 0x1A, 0},4 p! |. Y4 K# u7 Y. u  v
. Z7 H3 x* F, [# F9 d3 [
Package(){ 50,9 [; h+ F0 l6 r- A) c
500, 0, 0x18, 0},& O8 P; F6 A2 G% Y3 V, q' W3 V
/ V, {7 L2 t( q: q+ t3 L8 O2 t
Package(){ 38,
8 b1 u! ?/ P( @' y. R& f375, 0, 0x16, 0}," X. p. j% b9 S" Y) I: B) c. }# ~
! P1 Q. R7 U2 ~9 m
Package(){ 25,
0 W3 ~3 r4 ^  y. d; e250, 0, 0x14, 0},8 l; D- t# G6 \# X& z* O
* D3 I) w4 ]) r4 N* K/ n
Package(){ 13,
. \% Z3 b2 m9 G/ _' s( x$ p125, 0, 0x12, 0}
* p9 z$ ]* q! X8 ^; o3 m) m* L8 b  T. {! f# G0 ~; E
}
* k8 A+ c: q5 t# n, c! T4 G; q3 \5 L2 D+ i

' g' o) ]# c0 }' q6 pl
. [/ s; _9 k& P/ Z" N5 L6 \
_TPC* f0 p% n# Z  |6 v6 `! u* }

5 F7 _8 m. R$ Z4 J$ NThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
- \* u" I% M& h , x* h5 Z% n' O+ V0 C3 Y9 X
l! {, H" [; t9 |- l/ S0 O/ F
_TSD, k8 ~" I/ Y- s, l, f( w) u

( C3 e1 r9 k5 O+ CT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
8 |6 w% l# F4 \6 x ) b4 ]( n! j! h* o; J
Name (_TSD, Package()
  ?; {% H0 L+ m! @( Y4 }7 C7 k" |6 ^; d
{ $ d  e  b1 `0 k; O

# a! N: D0 [4 M. zPackage(){5, 0, 0, 0xFD, 2}! q+ w' z. q$ F) ?, ^$ ?- |
// 5 entries, Revision 0, Domain 0, OSPM 3 L3 u2 g+ k: ?; L! d* N
Coordinate, 2 Procs , G! @% a/ J1 X

5 K8 V  A. B& w; p) y( @" b4 @' H0 Q4 ~5 ^: U3 J4 Z
}) // End of _TSD object. l5 x, F( C& X
$ ^) D8 V  N5 a; w  ]6 E" ~8 t
REFF:
# a- N7 B' D7 L8 _1., V; S: H5 v( Q2 e1 K
ACPI Spec 3.0
, k. S$ I- u3 A% Y+ V2 i2.7 y2 ?  @8 Q# c# \7 H" J
Intel Processor vendor-Specific ACPI
: b0 p; X3 ?0 r2 | ) p8 L, Q2 Q9 |0 c" ^0 }5 \

8 S; ^# T; H  gThat’s all!
/ x4 O, q% F5 a: u+ f0 o1 \6 Y* y
$ P* c# j; |: t; _8 t- w) K+ UPeter
. G" H2 G1 K( C7 d7 S
+ f4 G  Y/ @2 I2 |8 J0 A1 Q2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 03:08 , Processed in 0.114500 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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