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

CPU Power States

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

; |( r! Q- y# o9 v, Q: q1. Overview
# j' v, u7 k/ [0 I/ _4 J6 v9 ~# x, V. [
5 f' ?5 M. I- f# r8 J+ x2 b5 U
) h. M" J. V/ Z  r' J5 _, ?* LC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
0 H& ^: Y1 }' M/ y/ I* N; U降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看1 n1 m% j8 P5 L; H# O+ |
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。( s1 j/ c* Z/ u( w. o- h) R
7 T( K  ]" `! b5 Y
cstate1.jpg

! E6 M( p, m( B5 Q
1
- S. W7 A4 ~  U8 d+ N; K5 H4 a
2. C-state Control$ ?5 N) C, J% j$ I( H
4 v% ^3 Y( k$ T6 t# r$ F
1)& Z$ K! k/ R6 W8 L: V
Detect & Enable C-state/ A0 s, X5 t0 y; J) r- V

0 T! @/ l1 o% K7 w( ]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的支持。
/ U' r& n9 l: x' E4 J) V9 F6 L$ {7 q6 H* }' C- u2 H+ o& H
2), D% D7 s; h% \2 t
C-state Basic Configuration8 {7 S) P# [, d
通常情况下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)。  h/ p& I  Z! v0 B0 a- S$ V: g

- L' F# Y* ?: D. G0 P3)1 T6 W8 I4 _* @$ B" ^- l
ACPI Structure For C-state
( a7 H; m1 k- g  v1 n" I! h: f3 k
4 |7 o- ?( ?. Xl1 q3 i; C- K5 F
_OSC & _PDC
& J) A: I0 r- V% H_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
0 V' y3 @0 D% t/ L( q3 h) El* y4 }$ M  ~5 `; |' l$ K/ ^
_CST
+ d  B! J* n6 V8 C5 O! ]6 a- e_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:# T4 D- `# ~' b; R) H
CSTPackage : Package ( Count ,
) Z' X7 d& \" }7 f4 cCState ,…,
5 M+ V7 P& p6 c9 {CState )! V/ Z* u9 e9 U8 }$ s
其中Count表示所支持的C-state的个数# s4 a( P3 F4 D9 g9 Y. C  z" @1 b
CState: Package ( Register ,
: u) e( m5 s; _+ XType ,$ s; ?' m1 Q5 r% P# a* g
Latency ,
9 P+ F- A; h! J5 b' jPower )# {# h3 n. R. M/ C" C9 u  U
9 y" s5 I9 L9 O7 ?& F2 d
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* P: ~; H. B# b+ @& R9 h! ~
4 z7 |. p4 s6 A' ?  s0 b' {
Name(_CST, Package()( W- Q0 o! m1 Q) u- U' T* I

0 x: o: \; v  o0 v6 o! U- k{
6 _" |4 c/ k: l! D4,
( H. N1 R4 [- H* i// There are four C-states defined here with three semantics
  ^  h+ @9 z, \

/ i5 l' A- R2 W7 y// The third and fourth C-states defined have the same C3 entry semantics7 f0 Q; G# Q% B9 L% B
; }9 n+ F( a6 @& ~; J) [
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}," \2 W! `$ M4 h( D
1,
3 y: N! M! W4 X; j2 n8 |+ Z4 z; V20, 1000},
; s& \5 _2 `1 P: a4 ^4 G" d' z
% B# j6 j* y. t) j+ n; O$ K' T  h, x
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,2 K+ E4 A$ F6 k2 U1 ~& \7 v
40,
7 Y- }3 G2 G% }, S4 N5 y7 M750},
/ P, B7 I( w# i  ?! n$ g
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
: n3 |2 o( R  F  y% ~; q60,% r" w9 |! ~! n
500},
; l5 b+ J7 L: E8 U" }
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
7 P5 V4 P- M# a: A) i# O250}
, V# g4 {% c8 o5 P+ Q7 g. B9 C
% Q7 M9 {6 I3 k
}) 6 b9 [8 x. A1 N4 \3 U1 l
. G  H6 I5 v2 a2 J- O; H& P7 D, F
l
" v2 p' T6 r) I6 U
_CSD
% E% g/ l& d% h. J9 f" _3 }5 Z- N; f* `1 i
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。4 I4 Q/ t3 f8 x" p- n/ v: J

7 `$ y5 ~  E/ T9 I! ~0 X% @" ]  h* k: {- `* y7 ~$ h. k& g

2 f2 Y7 @! f$ K9 E! @2 R: H( O1 S
( }2 d2 S' I9 H! ^$ K3. P_LVL VS FFH
! D0 ~7 T' ?3 @/ @& p/ [. a3 n
0 }) [9 a4 v6 }" {  |P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)8 y1 O0 `% K9 E! ]! X* S
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所示:
) W6 R% {: }; Q8 P( {. ?1 W8 c) c: d5 o) n! D" c9 m
gas2.jpg
8 y& M- b- R4 E) L9 G! {
2
2 m2 F8 @! l, S' h" O! [
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的一个例子:
4 s; O3 O9 A. JName(_CST, Package()
5 Z+ @, z: |+ l/ b9 v

- J/ @0 l' c5 H{ " B) u+ p2 u  Q8 I" |( R+ }0 {
2,, @: a9 S/ v4 ^! P: {
// There are four C-states defined here with three semantics

/ p3 c7 P5 m( {0 x& E% E' k' U4 T9 V: }3 @  d. A
// The third and fourth C-states defined have the same C3 entry semantics. B0 ]' F, O+ P
: U# F1 X* m: j  Z) m
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},5 _9 c- R) z% }/ A7 {3 S
0x01,
& F- A6 r* D- p3 [0x03, 0x000003e8},  X9 p& E3 U6 W/ Q, A  _
9 g0 z% _( n$ f8 s5 }7 Y. e
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},/ [: _5 i3 Z' ^/ ?$ l0 l# i5 {
0x01,7 w! T& g0 j# a! g
0xf5, 0x0000015e}
; W  K$ O4 y" a+ [
})
* ^" U3 h$ s( y' ?- V
6 i7 i5 j5 G1 R
% o$ `( W( n) @0 G; n, h. JREFF:7 q) |3 Q8 P+ P- w4 Y% q, n& ~! j
1.
* o# x6 F2 P8 B* jACPI Spec 3.0
% a  a/ T$ ]: i7 h; K. P2.
5 ~) t- H, p& v2 ^0 y. zIntel Processor vendor-Specific ACPI
3 k% M! d8 B; F: V9 P7 e
6 Y5 A2 b) a3 m
4 T7 M& J/ t; M0 a7 a2 @- r3 oThat’s all!# }4 W# G9 H4 P- Z% p
3 j/ m) q% n2 v/ A& S. H
Peter
& `) S, M( k" q# W5 x! s) U& @- K* Q: o1 {1 ?$ l7 j. L
2010/9/20
  b5 Z- b( l! `0 H; h: J: D" K( C7 B
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
7 M) @9 p# {/ n0 U4 @ # O5 \* l. V- x
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
/ t5 u! V: |# D+ AEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。4 R# ^- t0 [5 d( o. d: j# Z5 f

# w3 R5 w. s; W; g/ H1 K2. P-state Control, X1 o4 D. n" W) l1 D
% Q$ @2 |7 J0 ]5 e
1)
5 Z" I; E" w, i/ B9 z5 q% l/ ZDetect & Enable P-state
3 n1 t9 u1 K' L. Q/ t  l / j# q3 J# w7 V1 s" i, }
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state5 e# S7 W$ B7 H9 Z
! i  Q+ {6 k0 \, e4 M
2)
, p  i9 G2 n* R, V  b3 F  ESupported P-states& F/ A' f8 J; L. y# f2 l. c
" j  O7 k7 [0 [, R: Z
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: m+ B( G" e: @  p0 N+ Q% y; v

6 Z' s2 V! y8 y& t3 L6 @MinRatio = PLATFORM_INFO1 z. {" L% |* M
MaxRatio = PLATFORM_INFO9 D, n9 R" J7 A
RatioStepSize = 0x01) R  f/ [& q6 w6 j7 n
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
  ]) K: T: X+ V8 T, B- f, f8 X
7 t# u3 z! e& L" Z6 ]If(NumStates > 0x10)
( K+ T5 ?0 V. y# Q4 g, [+ k, E{2 w6 V; r- X  O8 Q5 `* \
RatioStepSize += 1
, d+ y) s! p- `3 `  H8 E' CNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1/ p7 V2 D# T0 a" [
}
! z7 k& C2 e3 L   f) S' d" B! \
3)
1 H, q5 v  v' h$ n$ k4 oTurbo Mode! S, e" ~8 d3 f( [. i

' g1 E; x7 g# s) C! hTurbo 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 ModePerformance8 O( f1 c- f8 U$ _8 a5 ~* w
! g( u2 U: B- n" H& o5 G/ ^
4)) t  O  G1 Z- M
Over Clock
' M  b; u7 }& g1 a$ A3 c 2 p3 S2 _; H$ Z
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 l% I( n) N! Q( D( h
$ ?! N0 N6 M  }! F7 Y' _) }1 I
5)
* u: s" x& |% D. KACPI Structure For P-state! F$ Q" j) D0 p& e$ \4 t
# A* z) o/ [* p4 Q  d
l2 g# n) P+ I) x9 ~% Q) l* I5 j
_OSC & _PDC
" M4 G: X! |0 ]- L3 `
, v/ ]/ z' `/ P_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures( u' [( |& b3 w/ ]# E

& ]. O5 J5 L% o0 y$ M5 S; B4 Jl3 {! [' z; O. ^! r# z
_PSS3 p. @7 _; ^6 \' l
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
0 D5 T, T6 w- S8 d: V7 K并且通过一个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做比较) B+ _  F7 o5 Q! ]2 g
以确定P-state切换是否已经完成。
7 c& V" U0 r; g ; l2 g8 V5 ?9 T5 J9 I
Name (_PSS, Package()
+ k+ R# }* O5 W) R3 b{9 `4 q9 I+ {* C
// Field Name( N' ]- ?+ H% h8 i* |2 y2 X
Field Type
8 E( a; F6 f; A+ k, `$ \# p
6 k7 j7 r+ q+ N' a; d4 ]. B5 R  W  Y6 r4 O8 b1 B. f6 w) q" `
1 c: q0 x& Y7 ~" L  u2 h# u6 ^9 _
Package ()8 z4 G' n; L$ C9 x( i' K
// Performance State 0 Definition – P0
% o$ j' \+ K$ u$ C, Z
1 H" j& C& {8 u$ x' o0 g{
) _4 U0 ?- h  ]# [$ y5 |) n+ k+ U) j5 U- k2 G" L0 f5 p7 d5 @

  X7 P* p1 x7 t& B" {( J8 l. w! PCoreFreq,' u6 h# \6 }1 j4 w/ P
// DWordConst + V+ [( F9 m+ h  Y

" R: z; X8 N5 r: d* T, v5 c" C4 k7 i! r' w  o
Power,- h/ w; B2 m, i* g2 i
// DWordConst
' {: \% o6 H" J8 m
. g8 m- |) {  ^' Z2 ^/ I/ tTransitionLatency,
* v- @4 F8 e; E// DWordConst
, S4 t/ Z4 D; r/ u8 ]2 Z+ e7 z5 ^* R3 i& Q2 E$ K
BusMasterLatency,
% k7 Z0 ?7 ^" m4 N// DWordConst
: S1 |" l( ]# W5 Y& X' z- E6 l; ]7 \' ~8 O) q3 \3 A$ W- v
Control,
8 f/ m1 e# c9 b// DWordConst
: @9 d1 U* @4 S: y7 T, l+ |
0 o; Z- U: m2 \7 b/ IStatus
+ f, _- ]: w) p8 L+ A+ m
/ i2 a: d3 a% W4 i; q3 v; A0 L/ D// DWordConst
% W3 F: S! B  I+ c& v& A) o0 F0 `- t7 j% o) s% S$ I
},
. [8 Q$ q4 q6 ?) {6 v' E5 f, w- k: H: S1 r2 U" N" W
. # [9 n9 C5 V+ L2 F) F

. Z- z& E' l" _# B. + f5 e+ P& U) `- L$ [
5 F4 {$ r9 F6 L8 Z5 d; W
. : D6 C% @+ m+ p( F# L+ p
}) // End of _PSS object7 i4 t) O; _7 J
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
( {- O6 o: m+ L$ o, y
3 I, a( v, ~" {# s' y: C/ `Name (_PSS, Package()
, W% H6 p, D& U6 n, K! x0 n2 `
% @: T/ U! F' Z2 V$ j{
- U7 c  f3 B$ @2 I% Y
, c' i8 p2 I" Y9 `Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 5 [& K/ u4 l+ M$ b! x

- E  Z7 S! W  D& `Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
3 {, C0 m% ~# j
8 l6 L5 ]& r5 s: B2 a  H# C: uPackage(){1400, 8200,
* ^2 m0 J3 {9 B& ?# F8 I9 q! V10, 10, 0x000E, 0x000E}2 i" x, K' d( \/ Q2 K
// Performance State two (P2)
# {$ l- ?& q9 a( A( J0 sPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 2 U/ k# _4 A" j; @- O6 j/ }* W$ w
Performance State one (P3)
/ @  p& s; I! u$ @
) T7 G; [% B% Y1 z0 L& l- A: fPackage(){1200, 8200,
; b7 k/ q$ @% I; U4 Q) ~10, 10, 0x000C, 0x000C}
% M% X4 L9 L" N9 n: N: p// Performance State two (P4); P( _- U# Q8 y1 c" ]- S* J

0 p# d& y+ s1 D6 C+ v2 ^) j/ o0 g}) // End of _PSS object8 f1 W* X0 y1 A/ C4 G7 B# H* J) J
0 v7 O' Z: d, J2 Q% k
另外当该平台支持Turbo Mode P0将会reportTurbo Mode" x! M# W. g4 n, |2 A0 b! ]& r

8 a% o; ?5 H" A& xl
5 B; e2 k, G; U5 _2 K8 m: o
_PCT
" F# \- M# }! |; J
8 I# b( p, Z8 MPerformance 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的方式来进行。. F- L/ l+ g5 J  s4 I8 E
- g3 \( T9 ?+ o
Name(_PCT, Package ()  e% f* s! m6 o, F
// Performance Control object ' N4 M: [8 @, `( S7 b

6 D4 q* e* _# H8 [( M$ M1 i* d{ ! _  G$ c9 q4 c, D  r3 Y

- W3 i' F9 |7 K, {ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 |: f! Y. j& {0 s
// PERF_CTRL " v" ^+ l7 n/ @+ E2 U# c
6 q  w7 |- R  Z! _
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}- r( d2 h% N1 n$ L1 c
// PERF_STATUS
! s' M2 |9 k0 ~) y# a' T" E0 i
! {! {2 _8 A$ N6 J  C1 ]}) // End of _PCT object3 W. m* \% D2 ?* P" p6 v# c8 |
/ U# l9 k$ y: `" ?* z/ g
l& n( @  J/ m0 h+ C5 V
_PPC0 q' T* D: Y- s  x2 G
! p6 e) v: n5 j$ r5 [8 H
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-states2 @0 t# v) f2 u
- W+ l! e- V" A
Method (_PPC, 0)% n( V# D! l% a  m1 h4 K5 u
// Performance Present Capabilities method 6 E* g% N3 B0 @7 S+ B. n8 @9 ~8 O
5 Z6 m- v. }, F/ k
{
( Z8 Y+ o7 c: W" V9 U( Z
: }) P& f( c7 m/ O5 Z5 MIf (\_SB.DOCK) " s0 I- P" f2 ]( }# ]% x% J

" [$ S) H1 ~2 f5 y- [{
3 z% \5 I) M& w( _* n5 z4 x# h2 p* c! o7 N* o) {
Return(0) // All _PSS states available0 C( Y  l8 v( O" U: `) U
+ x8 Y4 e" c0 a- Z. Y* H

2 Q& J, s! \/ @/ z! o7 \}
; w8 X5 A6 z) h. O; ]0 A  q4 ]9 m5 L8 ~
If (\_SB.AC)
5 c9 e6 k- h  X% F9 S; j8 B5 M0 d) `6 W6 H' M( A$ B
{ 2 m: U9 M' |# c0 k# @* X  }

8 h8 O" Q- a$ W5 U3 z! R$ ?2 V) h/ [Return(1)5 c, f6 K; ~$ ?: W
// States 1 and 2 available , u. T0 N/ A/ J2 k, e0 ^9 O

7 ?2 t4 S  `( M- L' f2 n} + }9 S' D+ b1 l% }

/ J: A  G3 C" nElse # N  K4 }4 e8 Y4 f6 p
. T4 I2 \3 u" Z1 [
{ * J+ \# X  |. k  w9 U1 A$ F8 x

/ q. v6 h0 T9 a& u, o3 I/ QReturn(2)( _1 B! H4 B: [& b& T+ |; n
// State 2 available$ U+ P" \$ M2 b$ S# u- O( e6 L

4 y" o: j) y* j3 G$ W} ' E! a# k8 x. H2 o' n5 \

8 t" V3 C' C7 ?& n3 }8 N3 I} // End of _PPC method
. Z5 M, U! w/ D4 m0 u/ o+ a # F- Y! K  l4 R3 [8 x! V
l
/ t. V4 D/ g- K7 R1 C# s  `5 q9 h; b
_PSD
1 `  J& u; w- l9 Z* J
) D. u) u$ K4 U6 _, l6 AP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
' U9 }8 d; O1 J: R 8 `! U7 N! g% G
REFF:
4 H9 ~/ G0 ?  F5 e$ ]1.
# e/ n6 V! `. `2 _/ ?$ sACPI Spec 3.0" d! X- I1 a: ^8 Q
2.- |" W2 W% ]: _2 o
Intel Processor vendor-Specific ACPI9 H% i+ q. _- {  U' C
, R8 L( V4 N: c0 E' g8 L2 V) D

1 L# r$ d  x/ L7 u3 _1 R/ B6 \That’s all!
4 O2 ]. a* l! R. A6 K9 Q % ~& X  V0 M7 d7 L  [9 a
Peter
# [; g5 Q5 S0 Y) o4 V " |: T/ ^  i% S' O
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview! r+ [, ?+ S- w3 z

6 _4 G9 H2 y' [* M+ x) _  G1 N! y, v% JCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
% Y" m- _0 F, t1 O/ R,影响系统的功耗和温度。
1 r5 \+ t% k# T# ^+ T9 A% X ( r# m! U# }$ T- D" F2 t
2. T-state Control
$ E  X+ h$ ~( b7 f+ C% n 4 w' d( o- N' s- R/ Q# L, l
1)) [, H( H( w; s7 ?% Y& c6 t
MSR Based Control2 b- x& @. v5 w) e% n: [

: T- h; }+ |! T/ \/ A: fBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 4 q5 K" N5 M; H6 v; `8 a3 Z: P

& j  f6 R2 c, @. D, ]2)' e$ ^" D/ l1 T3 g; R: ?
I/O Based Control1 W5 y% B  G; ~2 V4 h/ G

  y: d7 y; `+ k  C8 ?2 Y6 m除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。5 }# B. q! e" h

- H' ]8 _+ _+ S* c3)
$ ]* w3 q2 y* w" L5 s  h8 [7 AACPI Structure For P-state+ q& ]! x+ A* p3 a5 W
l% z' V; c; e6 ^; G1 f- G9 e
_PTC: Q+ L+ M( `; f1 K* W) j0 i' {2 k0 a

* n+ a$ t/ G( jProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:) A6 U; @% l5 c

3 F  I3 A, k; r. UName (_PTC, Package()
# I' w0 r  {$ t{
7 `% j' [* ]4 ~( S. \& r: Y/ x
ResourceTemplate(){Throttling_Control_Register},
8 w1 G" l% w1 _* h  b) w//Generic Register Descriptor / d1 v6 L) T! s/ n9 X- [" a1 s

6 z7 i$ F$ ^3 V! E. H5 m# l, QResourceTemplate(){Throttling_Status_Register}
8 I1 e3 r$ V- ]/ B2 n: q) U//Generic Register Descriptor
+ w' F0 R% w& R7 u7 F  h( j}) // End of _PTC, s- v) e2 w* z' n) m/ ]3 \
! [! L9 W4 z, Z* Z6 m# ]9 H
下述是一个sample code
2 p0 v# a( Z8 ]0 c2 s0 \0 e2 ~9 x5 h
3 c) y5 s, E5 G! [3 @2 Z$ `- j8 Z7 E$ M+ k- {
//
. ^. ?1 V: t0 w7 ]8 s- Z! U! l2 x2 V4 E; p% Q* P
// T-State Control/Status interface6 R6 e9 X8 |6 s9 i
. e, ^/ d2 Q0 x5 Q6 i
//+ m* f" L9 E; A3 w: D! U

; {4 d! r* {$ d4 ]. O1 E* zMethod(_PTC, 0)
, s( [. M/ G* z2 X/ p# g, E% n" {+ l
{
$ m; ?) g' A; N9 q' ]5 d+ ?6 i
; U0 d9 c7 g$ O* r, H( n//
- O  C. H0 N( B! ~- w7 O0 e) ~: A: M0 N" h( ]
// IF OSPM is capable of direct access to MSR* y/ C2 Z  z* T
, B. O- B- n% B. N9 I
//9 h5 ~. y9 }( K5 J/ p
Report MSR interface
1 g7 h' r; S- V7 i
7 Z  s! Y- i- f: A// ELSE( f8 O* }& B% N4 r

/ E# p# r0 E. k6 r( u/ \8 c* Y//
0 z; U% [( M- U; m0 y9 CReport I/O interface- h% f; h: ]' C: y: E

: q/ V. A. z. L, G0 s/ C& `' A//
5 b- s4 J4 p5 Y0 g; @/ S/ p$ p
//
9 H. q3 q6 ~9 O) mPDCx[2] = OSPM is capable of direct access to On
2 K/ i* G( y, {* @$ \) ?  H6 v- i
" o; U8 E! T- r//
& B) W+ c. X) @! SDemand throttling MSR
( E" D& F8 k/ c* Z$ F: O% n0 C3 e: ]/ S. ]$ K
//
) f* u( f) f/ T* J2 @! f$ c$ X# `8 U: @9 }% U* H: }5 D
If(And(PDC0, 0x0004)) {
& T8 f4 s! c  a; _# H4 R8 h1 j1 c& m2 L
Return(Package() {
# h2 |6 L& B2 o9 m# n5 y( Q1 N9 H2 p8 b9 k7 a) R
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 T2 f2 \5 C$ W% `  U
* N- Z; v* }6 `( r
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
7 _) V4 S! g8 V% u  q
5 \6 Z( g1 j% {* z7 Y})  o7 N- t6 V& S( u! e3 H
; G) \( e* B1 r3 C( _3 d+ N
}
  h7 r+ i  \& ~6 G
: L  ]) O; Z; D/ C. q. KReturn(Package() {- C% p% W! o' _. x2 ]
% o4 G/ x* J- Z( C
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
6 k+ g9 w7 u/ @, _# @! Q- B2 R! a( n9 q; l7 R
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}% m/ X3 o8 U- \. R* ~9 U7 h

6 u" n/ F' ~" B})5 h+ b: o9 s4 I" k. K5 l

9 q" G7 @" s$ W5 Z, H" M2 N}  ^/ J1 W6 M, j1 n

6 j0 i$ s# ^# I: Q# E9 b/ v/ G: B6 d- V) V

: k' i7 _8 X9 I! z# ]l
1 ^/ T) `1 T/ s/ y) D: ^% ]
_TSS
, E# z' W" \8 b$ d4 O+ A: I2 ^( P
% e/ n7 y  E9 m& u( X) F" y+ k6 _Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
9 j9 L. {* k0 u. T# w% lName (_TSS, Package()
2 w! {. q# r2 o) V9 v, j{
% \. F7 L3 z9 S3 y7 {// Field Name
0 r/ v: ~; v" Y- tField Type 0 c% |- q/ m( P4 W, u

3 p1 a% J8 a! w  i; A& F* m& s( t: j0 Z

$ L, R; B. o/ u1 Z7 iPackage (): H; ~1 w+ _3 I+ [0 A" T
// Throttle State 0 Definition – T0 ( O0 x5 h& X0 [$ }* w5 K
6 C# E0 @9 Z2 E' ~2 G4 D0 E
{
+ P7 _2 q8 N7 d! f4 \- z9 u
4 K- Z2 v' E, ]* u/ l& f1 a3 b8 D. b/ A+ H
FreqPercentageOfMaximum,% \: V, X8 k. A1 m( ^
// DWordConst
  q4 }0 o/ n% A( |9 H" V0 f7 p. a' C7 K; j5 A
Power,
, P+ R% k+ a( n* L; |// DWordConst
& r, D: h' L( |$ ^" |4 A# I  l/ k( |1 m. @- T  S, ~
TransitionLatency,# ?( _1 y4 A! S8 O8 B
// DWordConst
3 U" j4 o" \1 L+ f0 n0 \
' b5 v! c5 S% i- v  s7 ]6 T2 YControl,
" @3 C' d* a8 l$ ~! N6 R7 F* J- ?// DWordConst
  l# c$ I5 c8 Z' u- d6 p2 R4 X4 _$ A$ R6 l8 o9 x
Status  m$ Z9 p' s& F# F3 Y' B7 v  z$ c
// DWordConst 8 ]6 _+ y) H! N) e  f" V
},
3 |2 g/ h, d; Q……) z3 Z- x9 H9 m" E4 N, ?: e
}
. u9 G8 o6 G5 f2 k1 b6 l; Z1 }- W! K9 b7 o. x
Example code 如下所示:
1 j' o* s; E9 V" s  I6 E' m% u4 ~5 R# r
Method(_TSS, 0)- s4 o! q% }8 F

+ m4 T) N( L* a0 k6 t) L5 k; D- x4 `{7 A3 Y. c, V& r3 h7 X3 J

6 J6 x$ q, b6 ^% v0 LPackage(){100, 1000, 0, 0x00, 0},+ v3 W, `! ~/ u% _

+ T) Q! D  Z1 O% aPackage(){ 88,- \5 {, J* w. N: y) x) T4 z
875, 0, 0x1E, 0},
5 Y) _5 ~, Q: `& k
: w" H4 T6 z. J5 F% B! z. I/ R# zPackage(){ 75,( N$ |7 y( {; h0 R  h& {: o6 o
750, 0, 0x1C, 0},
: @9 `# r: `7 j& c8 ^% r3 t- Q
4 f& B- S. |& j) g: fPackage(){ 63,6 [5 |. U: f* |5 J
625, 0, 0x1A, 0},
! E! i4 f( u7 r9 C. M! f/ `  C
/ V$ _7 c! D; K" k6 g% k9 n  ZPackage(){ 50,
# L5 a5 p, `9 Y0 s1 s" D500, 0, 0x18, 0},, {' P& f1 A1 B4 L" I

2 Y8 {1 ^% ]. U! h0 P! b" TPackage(){ 38,
2 Z( |4 J! j/ U& v! H9 \4 i+ i* D375, 0, 0x16, 0},
7 ]) Q5 D. g- E5 s2 o2 L; Y0 t( k4 j" f  m* Z  a
Package(){ 25,/ h! m4 Z5 q$ d6 S# h9 {6 ]
250, 0, 0x14, 0},
) ?* c: N  L3 P) L( Y% e: m/ C6 U% {  }7 s" W+ q8 t) t+ P) _6 K
Package(){ 13,+ R: R1 C. R4 R" @
125, 0, 0x12, 0}
2 d, B7 b' n7 }5 r3 z* B5 g; V4 k. ~  x" j# O- C, d/ r
}: J7 X6 _/ F6 @, L1 W7 u, o; W

( v' M( W1 F! B
6 y5 x, s4 `, a, \& Rl
4 n* G) X# ~: ^* V  I  P; w; _0 o! q3 W
_TPC9 p5 [% [) l1 C. {

6 U. E" o) u( @$ aThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
) j& Q) t+ V! k$ v' f8 i6 ~
' H- ]8 s, A0 u8 a; dl
% W; g# l# h) {2 z9 ?0 h$ a! R
_TSD7 W( a/ p; M, Q& q1 k& u
3 i6 X; b$ _1 b3 T& ?
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code) i% q' U0 A+ J* Z

  Q  g8 s$ k8 K  U* VName (_TSD, Package()
6 O3 E+ Z$ y6 L3 H
& L  i# w4 I- G; T1 S{ 5 h4 V* W0 N7 h0 o
$ [# C' P4 G# c, s% U6 q5 |# k
Package(){5, 0, 0, 0xFD, 2}- Y% G: H9 y: i. H9 g) q
// 5 entries, Revision 0, Domain 0, OSPM ; L- E) j7 E9 }- P7 X
Coordinate, 2 Procs 9 a, n  C& g6 d# T

  r# F% m8 C& q
: O! H( c7 p) k" q+ u. a* h# Z}) // End of _TSD object& b5 E% d; x- f
3 O" ~" f  ~  P' Q- t
REFF:
$ p5 k8 S, H9 r: y1 l. ]1.
3 Q7 S8 u& a. y+ @$ hACPI Spec 3.0
) }, h. N' U6 s" q7 ]# {7 W2.
- s: |2 _6 m; Y- x; CIntel Processor vendor-Specific ACPI" t" k0 }1 o  Q/ Y% `' l$ u
* o  F1 ]3 `' i, M* h3 d
4 C0 K. `% }8 L4 G
That’s all!
: v0 X. D* h6 O1 ?2 `
+ U) B  I( @; y& ?" {9 c' BPeter) A: H* @8 [& ^# c
; Q. u! e5 q: O! l6 T7 M
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 02:18 , Processed in 0.046101 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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