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

CPU Power States

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

% l8 q, |, w. u$ P' p; ~1 V1. Overview4 d, G! X$ Y7 _3 G; c

( l5 d7 u) I+ w$ Q6 P7 ~0 {/ C1 p( W, r2 V1 {0 @/ g4 V( |
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换& U  ?7 I/ _( N3 [2 Q- d: W
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
9 `, l0 j7 A7 b1 g3 x比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
" |0 m" {( w  L4 z/ Y  G6 p  ~9 L6 v
cstate1.jpg

: Z2 U* e) s$ f3 x# {5 z! [8 h
1
3 I4 f+ `: `& I5 L4 b
2. C-state Control
. o) s! L# N; Q
' k( {3 D4 m( z8 i  a1)' J9 ]" w! U- y" G/ L" I
Detect & Enable C-state$ c) g+ ^" S  u  Y

0 a! k9 f8 R+ Y, B  eBIOS可以通过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的支持。
0 `& S7 E3 g; n: r# d% U' [
/ ?: Y. e" K: Q1 [& ^2)
# i) g& z4 o5 x5 Q: Y! ]C-state Basic Configuration
+ k4 v0 y# A# R  g通常情况下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)。
: x/ P1 W9 M5 }! f! n! F; e  Z, C3 M, R5 _# Q
3)
; t7 ^. {) h, nACPI Structure For C-state
5 j. s3 |' i7 [" A( h. D/ P
+ [( c2 B9 R3 Q& L; b  Al  A/ c4 N0 y3 D/ V! O' i4 `
_OSC & _PDC
0 s: b  {' o: p4 L9 z6 @$ g  a' h_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
" O( g4 ]4 }9 d+ n' g# W" D* c5 Fl
' K3 O. e# P2 v  H+ T
_CST1 D/ u- E$ a& u& s, s: m
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:' Q/ h0 M' [1 V4 m9 Y5 ?
CSTPackage : Package ( Count ,
% \& O, t% B, p8 VCState ,…,
" Q% Z7 @. X$ h% |CState )9 D- J2 f+ t! p
其中Count表示所支持的C-state的个数
" ^6 @$ a" s4 MCState: Package ( Register ,
% @! G) B* j2 Q4 d& k1 W- PType ,
) P* a" X% R) K# r8 o5 P# u, z/ DLatency ,
1 n3 f* B% Z; {5 TPower )
4 j, |  a, \, u( a5 j5 {3 _" x  i
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
) m3 R, Q* l- \; G9 s9 C. ~  a0 [* b( h2 s
Name(_CST, Package()
' ^, j+ ~, n1 O7 m  m1 O

3 S! d3 P: }. J& _2 b" u( \4 s{ , A2 G+ P- q7 J1 ]& ~! T
4,% N+ z: x" W8 d% [
// There are four C-states defined here with three semantics
, U  r, `5 N! O: L& t  @5 C

( I7 S. ]1 ^8 L, g1 o5 G: k. p// The third and fourth C-states defined have the same C3 entry semantics
% w) i. v+ v2 J+ Z$ u
7 I: `7 N2 M1 _( G# C
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' `9 O; |( v% P) J
1,6 t/ e7 v4 h  b  U  r# D
20, 1000},
, {9 w1 M8 b1 f% s
% Q% O; I" ~7 \% \& J
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
9 z4 x6 R7 x8 I40,
' g; b0 F3 D5 R3 |7 T750},

3 I6 S6 z# @6 K6 m8 OPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,# w4 L: I  J) e. @7 p6 U
60,
6 Z3 v, ?( B7 |2 {500},

6 l  }/ L# j8 j+ ]1 q+ ]Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
4 S: D5 N: C6 `  i* f250}
/ q) p- B8 z% Q
1 p/ z) F8 r1 x7 X
}) & \  {3 q$ h3 K% K: S/ n7 v1 z, ^( \
8 ^# _9 }& i* I' f" d/ p9 B( U
l5 j( u) L" g, L5 x$ V. ^; E
_CSD
3 k  r# c2 T: k% W  o( _" @" @
/ o' ^& c6 ]8 k% SC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。* H6 p1 `5 j2 c# `. B* c  e5 x

% C' P4 f4 V2 h4 n8 b- L4 p4 g1 X! X: M9 p5 E! a1 J) q
! m( X7 r9 q6 @0 `2 G
: u1 u+ U; P: n# K- b3 |( [  D
3. P_LVL VS FFH
$ N( w6 F3 K# Q' V/ f
% S) _! `! @' ~6 s* mP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)5 }/ A9 A# w/ k- Z( 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所示:& T. d# ~7 Z7 E- s: a) Q

' K; G( t) m) H9 e2 x% g3 G
gas2.jpg

( L6 T* g. [3 {& J8 r$ Q$ [
2

$ m& M  T5 V9 f/ V6 A; WOSPM解析到该_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的一个例子:$ w3 X  n& ?1 Q; L1 v9 g
Name(_CST, Package()
# ?6 j2 g6 i/ |0 C

, K# a# `7 x: e! J{
  N' M* G% K2 _2,
! a) _6 a/ f7 i; R+ z* T. U// There are four C-states defined here with three semantics

, ^; P( f/ \# l4 o$ R' O: s
# f2 P: h) g& `, Z// The third and fourth C-states defined have the same C3 entry semantics
9 F" K0 w  W  E4 I) d% c
* [/ I3 }9 B, ^; S! p
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},5 |- W# O3 t. `, Y" W9 j) e; Y) s
0x01,
1 o2 Y+ g2 K, a3 l0x03, 0x000003e8},& f8 `! F8 L* }- B( o
$ [" E" e) Z* t
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},) [8 c& _) j: c
0x01,  B  L# |0 p4 h3 K
0xf5, 0x0000015e}

& L  p7 j3 f6 q! m" a# F}) 7 G2 h: ]1 _4 B- U3 t; D, {3 v6 ^

8 j, f6 ]4 k! L8 f9 r& E% @( h% ^5 ?$ ^9 u1 N+ _3 o3 I
REFF:; _; n, v% U6 r( P8 _
1.! h% k% T6 }5 L/ m* v( K
ACPI Spec 3.0
# B# U) L4 N9 ^7 h. b5 v2./ i8 M3 B! z+ F3 o$ l- k
Intel Processor vendor-Specific ACPI- t/ u& n% c7 q: X) `  X3 z

3 g* t0 R# j5 k+ x% @. ?7 @, Y) b7 \. B' f8 h6 S& h: b& j
That’s all!2 L# V9 e. l! Q6 j/ o

) Z: |2 @5 a* F* w4 V1 c* I" JPeter( _( O8 N; O# S; \9 W
1 B* ?' i5 L" N2 _8 V
2010/9/20" l& j! d  m0 e4 y
$ H1 ?6 M, G5 [, j6 J2 W: n
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview$ V+ e. ?: g* X

6 |2 R6 S$ m1 t3 g. O. ^" RCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST5 [; f) G- G& ]2 u* P9 T
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
5 `& n. h/ J: C9 \
' K- y/ A3 O6 x2 T2. P-state Control
5 o3 D# u0 n" v4 \$ g% ?6 z 6 B( q; S6 z- Z; I2 I
1)/ `9 x/ R1 @0 b: s( @9 m
Detect & Enable P-state4 N7 w  {( ]' u6 }, m8 n5 `  P

4 u7 M" j! c/ w( \4 z2 |BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
% m$ T$ S, }% ]
7 Z) t: R( U. @1 [2)
0 Y- E2 k. r* v9 o9 ~Supported P-states
* m' I$ x0 e( W  d; C
3 `' v( q; W$ P& j4 wBIOS 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
  L- i" H# m% h  S7 f
6 W5 I% C6 d6 `4 I4 ZMinRatio = PLATFORM_INFO9 v+ m# N' G1 e, z# N
MaxRatio = PLATFORM_INFO. B' L' Z8 Y! n8 u8 `
RatioStepSize = 0x015 }1 x, M+ G. `5 S( R- _5 Q$ F2 }
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 14 [  A5 X  I; D; N; F

' _" p6 F. B5 D' E9 UIf(NumStates > 0x10)
6 v* `6 B* F4 v0 Q3 `* t- S5 @{
5 M6 {* B6 \9 u  ~. z- m) G0 FRatioStepSize += 1# @+ m$ e1 i! J* S
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
* H5 D" x& T' x" l6 h! d8 E}
' }" j3 c& Q6 v) n0 }* f
5 l1 z& j& X" o( i! Z0 p( _7 d+ w/ k3). A5 e/ @8 ^4 H, [$ u; V
Turbo Mode
6 {3 |- R& d$ G% e9 C- U
7 i$ P7 U6 c% j9 K7 {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
! Y% ~+ G1 C% F
1 n* a! i, W6 I7 ^4)
  D  ]- W. d: G+ J% @( J% g4 VOver Clock: g( _% T$ e& a' Z  f
' [& K2 G: j: m/ f+ i! l6 a. T
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
# d( S6 ^" w! z1 d9 C4 H ) f& t  {2 e& A! u4 }! H/ n
5)
3 X2 q% }  w; M; j: M- x2 u2 s* t3 |ACPI Structure For P-state
& H% p$ h6 y9 x0 |0 S
  {( p3 W& X- y, O; v$ el$ O+ U# n' T6 |" @# N4 [+ p! y
_OSC & _PDC- c9 k9 b- P9 p4 g3 W$ X' @

, n# F% U. q9 _4 W  A_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures+ q2 {& \, i: q
9 I/ ^+ }) q! x
l
# c# N! f; Y' d! E3 G( k
_PSS% C! S& w& V7 T) N. O
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量; H& Q' `) ]' }
并且通过一个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做比较  S: N: }# |! w2 z' u
以确定P-state切换是否已经完成。+ e% T( T1 p  x
' D& J( {) l0 F# _4 P; H& X
Name (_PSS, Package() ( x6 N& H( n6 g8 G* V
{# J7 S) h" X0 K' r9 V" R
// Field Name
) X# B4 _+ h4 n& ]+ FField Type ! m' _' g$ d1 ~# D6 M) t

# t) a! W/ z; R& t8 C0 a
' V. X" i/ b0 w' B" ~8 {- L
8 P9 M& ^4 }1 K5 i' Q% ZPackage ()
2 `8 e2 f6 O0 H& {// Performance State 0 Definition – P0 : y* `6 X; B6 H) C  u9 Z/ r
- P: U  N( j/ q* |5 T
{
  c' U% T3 [" n* W* _( ^: F& j- z3 J  j0 ~- T9 Z! W1 i
0 H/ C6 H0 Y& Q. X; d
CoreFreq,
! h7 u  l9 q# f4 ~4 \9 @/ F// DWordConst
: d7 F. u; L# p/ p+ P& [
7 }9 z' W6 M3 b! c9 k) K7 h- w$ b
2 q3 J+ ^; I3 H5 b, YPower,6 E1 J" H3 I# \
// DWordConst ) B2 p2 y/ h( U
+ u& ?4 O* t9 s7 |  L" X) s# |0 u
TransitionLatency,
. [6 `. S, e; w- ~// DWordConst : o# g' Y$ u$ H3 B# G
& C- l" O5 A% T( V1 h  X+ ?
BusMasterLatency,
. a: X& B: M, m3 k$ P3 t" h// DWordConst
# _7 j6 F! A/ F" y* W' j' c+ C
$ _  T' ]+ f1 \7 T' W2 nControl,
- N2 r$ w) _; I// DWordConst % l. X" V3 \2 p6 S+ r, I' [5 }9 R; E

3 R* x* {. |$ p! AStatus
& I3 J, a0 L) N, D- f: F
' {5 q0 X3 _+ F) Y3 i// DWordConst ' R8 f- o8 S. h4 v  y

- T2 G4 M- b1 p; c+ `}, # g0 s; a, n7 i/ E

, Y2 N  k2 n; B6 k$ }.
' p( u8 [2 J* h" t, V+ K1 J6 Y* e% V; W
.
* l5 v- R  N6 _  S' u% B  e4 b4 y) U" n9 n2 `  Q
.
9 D6 ]# x* _5 _7 S9 x+ E* f}) // End of _PSS object
- d/ L1 z. Y+ X! h- u/ @* S1 N& Z前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 7 a4 D+ D3 R3 O+ C$ s

7 N# Y4 Z3 n: p# w/ h0 ^2 d/ `Name (_PSS, Package()
% i5 N. C$ F  [* e; Z9 g! u& X3 L5 A1 E' U3 b+ J0 J  P
{ + W/ n# c$ z! @; q  i, a1 ]6 T

( f/ L. a& J! F' E& p+ aPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
" J* J1 o3 M  m0 W" I8 n3 N( N9 ^2 |: ~
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
% N7 r& }6 ?& m8 U( t
/ {$ S1 @4 _' J, W: u) R* _- [Package(){1400, 8200,# r. d5 Y7 b+ T4 k; J1 F# X5 t
10, 10, 0x000E, 0x000E}
: \6 c3 i# W' v% u1 g& ^9 G// Performance State two (P2), t" }4 a# Q+ a! g3 Q
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // . ?9 y" C. [% w& t
Performance State one (P3) - L4 Z3 W$ j4 ^' p" n% M* n' C
& Y/ `) f- R- g: h& H* ?0 l5 A. d
Package(){1200, 8200,: a8 O" W* R0 e+ y
10, 10, 0x000C, 0x000C}
. N! n# h. j: c3 |- l4 {5 [* N// Performance State two (P4)
) F# u! |9 [7 @  G: c" T$ m! m2 |& a; @1 X0 S& o7 x* i" Z9 H
}) // End of _PSS object
. q8 O) q: _3 T  s2 E; @ 4 J- L$ C7 @4 n+ `
另外当该平台支持Turbo Mode P0将会reportTurbo Mode" w+ q2 w8 t5 l0 B: w3 F8 K

' ]- d  @# d  W* U3 I* ?' tl
* g3 q. g  I) _
_PCT
5 b  \4 f4 K! h * R. m0 P1 q1 M# C% _
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的方式来进行。  i6 T, X2 ?$ k: r

1 f% P) A- R/ DName(_PCT, Package (), p" o8 S3 f% w, O: j
// Performance Control object / z$ b5 i% n6 K+ f9 U

/ f) `$ @0 G) l9 F{
) G- \6 d# T) y4 W4 c0 L8 y% X/ b' k0 k' y* k- O% a. u( V
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
2 p. }/ g; q: K6 B// PERF_CTRL   w" z( @/ x4 O6 @
( x9 d! L, R7 ^" z* H7 O' s4 @
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}4 A9 W2 D' |- q8 I. ]" p
// PERF_STATUS
* l$ K2 c, e9 j/ d
5 X' V& Z8 S$ D4 _. T}) // End of _PCT object+ U9 G  ^5 z  o2 G% _  h

) Q. C, D+ {* V  r7 Ml  v1 Q1 e. ~+ s, \: g* \$ I
_PPC: I+ w, p( l* n% W% Q

, N+ G' J4 [& U+ a) g. y( wPerformance 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
$ V/ X+ g+ B) C7 K, I
$ _& S; |1 R+ jMethod (_PPC, 0)# s. ^$ l& X3 g1 _9 B6 U
// Performance Present Capabilities method
5 K# T  G. x' W$ V. T/ B5 X5 s  @
: @  L; p& e& r9 {$ r  C{ 5 a; B; E- X& I( s1 M
; F! b* ?7 Y* u8 z
If (\_SB.DOCK) ' t/ ]" `. P- y$ a% d4 o

9 S- k2 [! @. F' c% P{
* A% ^, R' }3 n" p6 }+ |" b* t. |: f& E. Z# i) E
Return(0) // All _PSS states available
6 |3 o+ m2 b- h7 l5 ]: L# {% B2 Y! I( [( H; ?# o  l& p

; f  w$ r0 W3 u3 q- M}
/ H( A0 B& Y' p4 o
. F) f# l$ y. s# iIf (\_SB.AC) ; j5 i& }, N2 L- }

2 a3 l) d7 v: V2 Q' x& C* |{
7 Y) t7 x. S; o6 O! j3 Q2 P" C1 H" I4 e" w* I; C
Return(1)% Q9 z6 Z! b. R( [/ v% p" O
// States 1 and 2 available 1 P' I- _# _1 ~/ j+ J3 W

3 h& v  B% i. j$ J7 ^} / R4 v$ x# l, R8 f! C
" y/ \3 Y+ w% X4 u
Else & t" `  |7 l6 O* a. c0 f- T& ]0 t
4 M' T. C5 S) r! B. }! d) J& `" ~3 e
{
+ j8 t* ]4 H% S. [# P2 d
+ Y/ q7 @- E$ z% cReturn(2)8 G" s" i: R# m. B, L: ?% V
// State 2 available
* C1 E0 S* S1 r3 M0 x  x
% }+ c& r6 w+ V1 \7 F8 v9 N} 2 q* q+ U; h2 I. D- [

" V3 b( J4 C0 r0 w& h1 q} // End of _PPC method9 T* ?% L9 X6 D* s3 v. P
# d' g. o7 l2 i- Q2 m  k
l
; P. m: d1 c9 p6 `. s+ U& y  k" G
_PSD
# _, ~1 d8 {8 l
- e- ^9 t; |, k8 CP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
$ Z" s3 a) l! o+ A" T
$ i$ ~0 A) C% W& e- R( vREFF:
4 ]8 c/ z8 @9 {  K9 X1 Y! ?1.$ R# g1 P; ]5 \  @
ACPI Spec 3.08 L1 g( }7 w- k5 o, ]' Y
2.
& z3 X, I9 A/ L/ x' J/ u& U" M% yIntel Processor vendor-Specific ACPI
8 l9 V; c2 t* Y& ~; o8 A 4 X! l4 U9 Q+ I7 |  w8 G9 q% h

8 |8 y2 T; r. V1 h! n% kThat’s all!  K+ E9 Y+ i. k3 {: a2 [
2 W- L0 l6 p+ B% g: q
Peter
8 C- n7 y1 }! `9 U4 C2 J7 ~ * @; n* d6 H' n( I' J
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
1 U% F: q5 [. `- T8 ]! D . t: D; B0 b/ K" c# \
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工作时间的占空比)的方式/ K; R' X  J3 G1 @2 k4 p
,影响系统的功耗和温度。7 ?* m8 ~' W9 B

7 O  U) K: C% h& o& g5 n2. T-state Control
6 }# ~( _7 ~2 M$ ]
( t, w; r. J' I% u1)
0 K% J: E- t/ v* M& f# X. [MSR Based Control8 k; i0 i* x% S3 U" c1 k
+ v: b8 s2 `8 v% s5 T! t
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
+ Q+ _4 d! B4 [8 t( j" Y
4 ^9 W5 n; T& d9 ~1 [( j  ?' H4 \2). r% F5 }) f) @: l! N# }& S6 M
I/O Based Control4 z' `! k+ T6 w6 I$ i/ H

8 n% C4 B1 u- c3 z6 H/ ^9 w5 \. K除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。0 f* K% }) s# E+ m3 i

' B, @, S0 q3 [, u3)  p# a( x! S& B% }/ p* J9 V
ACPI Structure For P-state3 o' b( H0 _! V" K6 S, ^! h, x5 s
l5 j) u0 |( u6 B2 m8 r) W
_PTC
* f! C( y9 B% M, ^" Y9 S: y 9 y4 i5 s- m! @0 C& R' b
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:6 k. x& \/ e; ?7 I
1 i+ I. m8 `! D  D
Name (_PTC, Package() , G* Q! p1 N9 P
{
* L; Z# r' z9 I0 C/ l! H, f/ b( _/ A8 z% Y& p! n- B& F! b% r
ResourceTemplate(){Throttling_Control_Register},
$ A1 S( C& d& ]9 [# B* V//Generic Register Descriptor
: X$ r) k/ m4 g# b+ |  ~, b5 M  ^" M5 \* i1 s+ G
ResourceTemplate(){Throttling_Status_Register}8 w: j4 I% a3 Y; W
//Generic Register Descriptor
* N! y' y) w+ _}) // End of _PTC4 P, ^+ ?4 j7 ?4 [3 b
* o" f/ T, ~5 r0 T0 A. O
下述是一个sample code0 c9 p/ R* A6 M+ ~
2 x; ?4 A2 l* m1 l' n6 G

! f9 \) r4 Z1 o4 J) A5 y( B" [) j
//3 z& w6 U: }: y3 r" E
. ]1 S7 h2 _8 n9 i) l! j. p
// T-State Control/Status interface/ t2 e1 y; ~, ?% I

  D% Y* J- [  s/ e: e//
$ z7 S- k8 _# d
/ \2 L# Q$ q3 v' E8 C1 _4 D0 Z( `Method(_PTC, 0)
# T8 L4 ~7 x. Z. u9 Q) V5 C) D. i
{
( F7 \( X2 p2 m0 G1 u& l0 \( g6 m- {
//
* z$ w* v, \! t1 G5 ?8 z+ }. g+ ?' k: A
// IF OSPM is capable of direct access to MSR
1 u* A: d' B1 f/ ]! e0 P( @7 E$ P( I2 J( N
//2 ~. s7 C! K/ H5 R( _
Report MSR interface2 D, `6 B' `, `: Q' L
9 {" x* _; W& |" q5 E$ o: a. {! z% e
// ELSE
. _5 c; d7 Y$ N3 k2 s; \" B& D+ S
$ E& N, |2 J" t; g//
0 E6 N% ]4 Z3 C3 I% zReport I/O interface
3 r; S1 H- R( P7 k7 K0 }
5 b/ D$ N! l& d  D7 h  D" d//4 m- g. z3 ~) D* k( d, a
9 t; S! R2 @7 B
//
  A: j& o/ Z6 Z+ }% SPDCx[2] = OSPM is capable of direct access to On6 U5 t- f  D1 s/ `8 e

. _' \" b- `! w, H. R7 Q( u8 {( A7 b//
( c' {& }! T, |( a- A# F' Y3 EDemand throttling MSR
1 W* u- {+ V3 S- D+ v  H" X
( @8 B6 W: i" g! l) f, m  E//
* s% H# H/ R+ D) q. v! H
, g1 X  C/ B3 @; O0 P) \2 m3 mIf(And(PDC0, 0x0004)) {
' w" M  P. A) \7 u* r) J. k+ F; M, |
Return(Package() {. _& [; }) l5 ?6 h- \& k2 R

9 d1 O' }& B* C5 \ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 f! I" `3 n0 I# p0 q
5 D" c' |$ @3 e: E# X
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
" ~- A6 l1 l7 G' [! \
0 e! R: h8 j- B})
# F" @* s( ~- A
  j# F: {4 X- |}9 ]0 C8 N  m2 y; Y5 P5 B
4 [- K* ]1 ?9 [2 P9 d/ a. Q; m
Return(Package() {
) ?1 i6 O! B: h- q" U% }# V, R: O6 a. w8 @  y" i
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
- f7 k1 l5 c+ p8 Q  f
, o. _' p7 _+ H$ W/ x: IResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
2 S- Q1 r3 e, U5 G/ ^# V. t# s" y# I6 ]7 Q5 L
})
! |2 N3 I8 \) C$ C% W) `* r4 Z+ P  J) }! w# A
}
4 [6 |3 r+ ]  _9 o( t3 w
; H# M& E. s) p! ^
+ v" F8 ^% h; N; g7 n. a# n8 Z: P' F" r0 u6 ^# S, E
l
5 c. l$ t+ V7 w/ C5 t; G8 F
_TSS% e& G. r- o7 V+ y4 m! Y/ g* s$ J

4 G/ L5 U6 v$ d* {, R2 q, VThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
$ ~3 b/ o5 j" E" N* `# yName (_TSS, Package()
6 |2 ~4 F* |# _! d2 a' t( w7 e, B{
. C; `1 z$ }5 e: Y// Field Name& I  p2 v1 g0 l% G
Field Type / H, g4 X5 d9 Q
' l% K, _7 j# E

' S4 z. k; p! R- G+ F! s- I5 e9 h3 M) L
Package ()
/ ]( d! U4 \0 Q$ f// Throttle State 0 Definition – T0
  j2 h$ q5 q4 v) t5 k3 |5 O7 y5 \: Q0 s9 q
{
/ {8 H3 l; [* B0 k2 y2 `6 n5 e1 W' _$ ^7 a# m, c/ J
  Y) I7 t! w: _& O* p# l- H
FreqPercentageOfMaximum,9 h6 ^9 Y# a/ ~% |# P) ?
// DWordConst ! K, r+ A; y" C( [4 n) |
4 i; f" f4 t* h0 R3 {. @4 G1 R
Power,; I0 j/ U) {( ?3 E- o
// DWordConst
3 r8 h  _' C8 V* K# X/ W, v" [* w# v
TransitionLatency,
8 Q. |4 ^3 e$ X" J! s// DWordConst + }6 r/ L1 t; }9 e
$ ^. q7 p+ }, j& N) b2 v2 J
Control,8 Y- k* k, t0 h+ f# r% L$ Q3 Z
// DWordConst & e; ?6 g# |" g+ M6 U3 y

7 Y$ ]' c/ z# B8 j5 [" GStatus
& R* ~( b( d3 z* h$ b$ v2 j// DWordConst
& q  g" b) K3 g},/ c) V1 [6 E5 K' Z# H0 g. ~
……
8 F" q  u6 M9 [$ W# }% Y}
4 ]( r- x: o' L! Q1 m( G8 C$ l& m4 R* z4 ~
Example code 如下所示:5 ^/ L: p" {# }% R* F' ~
! a$ ?. t( v1 [% P# Q8 `
Method(_TSS, 0)
8 S) C; H% |7 ^& ?+ E( m. k- `  g
3 E+ u2 w$ n1 ^" K{9 `) ]# D" D$ |
5 K. T- E2 `( C$ H0 ?) X4 `
Package(){100, 1000, 0, 0x00, 0},
& N6 i9 X& k+ S# m5 d( N, U6 S+ ]' }2 k* [  c8 x$ d% L
Package(){ 88,2 o" F* D9 m4 n+ ]) `
875, 0, 0x1E, 0},, v0 b" d% c+ p4 e* i4 U) ^  @
# \/ _5 i  N0 n
Package(){ 75,
3 O) L$ o+ \  J* g' [# U+ E% W4 @750, 0, 0x1C, 0},6 \4 s# E& z2 W* j$ a$ x. f
% E1 c1 [5 }  d& F) Q; A0 _
Package(){ 63,
8 I8 D8 r4 G! k9 Y9 F625, 0, 0x1A, 0},
) N1 R8 T8 Z* c% t8 ?) W  W& w  W# X0 E8 U  l2 c5 w
Package(){ 50,
& _9 Q+ ^5 ?' ^9 [500, 0, 0x18, 0},
6 Z' p' t- M6 ^+ i0 z/ d/ j# X  v7 O
) P7 p0 P6 v0 F1 i4 _2 ~6 iPackage(){ 38,
- {' l/ i( G5 d0 ^- c& \375, 0, 0x16, 0},9 Z( A7 [- h2 c. a+ H

4 q3 A- R0 s7 u( N+ [$ w4 WPackage(){ 25,
7 _4 S; K( v, H250, 0, 0x14, 0},
5 ^1 E' i$ c( F4 |$ G( k# `. r  P8 q% z7 I' A6 ?+ q( u( k
Package(){ 13,
( |; F. X) ^$ L* n- ?125, 0, 0x12, 0}5 q/ V  b. E& Q$ O! |: k# i  d' O7 ~
! k" r1 r& Y0 U$ R0 L) X) ^8 B+ f
}8 k( ~* [$ p( P4 k) l6 r6 Q

/ N  k5 E7 L) m7 T' p' C8 a
1 d: C! k9 |( Y8 [l
  K7 s" y6 X$ G4 v, _, u
_TPC7 F7 o$ {# z! `( Z9 E3 s) X

2 V& `4 Z+ u! k% e, nThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC- J5 P1 L/ n8 c' S2 D

; j* {1 ?! k1 F2 nl
" F3 H1 J; i2 U! H+ v" {$ I
_TSD/ [/ o1 d' \! b2 G
; d5 w7 v) ~8 B. m
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code" X/ ?* h; ^( }0 S8 q

! F+ W6 e' H' uName (_TSD, Package()
% h: }' D* ?" k
; R  D, P, f: @8 y{ 3 G8 y6 b+ E# o' r/ @9 D& a
" }( h9 b( L2 I4 d- _( w6 q& ~$ P
Package(){5, 0, 0, 0xFD, 2}
6 ]; [$ j5 r! I* _// 5 entries, Revision 0, Domain 0, OSPM
; d$ U7 n" K: q8 sCoordinate, 2 Procs 5 F1 D7 j$ x0 N3 w
6 u3 Z% K: }- I: d$ M

7 a9 ]: R2 _/ d# Z" i) G5 x' A  F1 @: E}) // End of _TSD object% ?- p+ ^( C" }

" d2 E3 S4 a% r9 ]  O) B5 T5 y2 `REFF:% h! f  h' g3 Y1 G. M
1.
- N/ P' r) t; ^3 I. cACPI Spec 3.0
. E  `, n/ V4 j6 S6 u9 w- B2.* N0 i6 g! E0 y: M; ]$ v! I2 q
Intel Processor vendor-Specific ACPI6 Q+ ~1 k/ n( \" i6 u0 L- h6 n

) }6 i, q9 O+ q, Y( A & _3 _: d( Z. i
That’s all!" e4 F5 a1 ?8 P* K

2 ~9 K0 |  W6 H% uPeter
: F. i% a, P5 q, r/ A+ ^
$ g  v2 q" ]9 x2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:45 , Processed in 0.219400 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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