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

CPU Power States

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

8 O1 w. S; W. `7 A2 x7 Z* O1. Overview
4 A- I; K) f2 W5 a2 z  V+ c, q( A/ N  ~  b
: u8 u1 M7 a7 O3 ~
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
& K7 R# o6 E3 y, G- Z降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看1 f& X7 d6 x1 e) \. d2 Q! `
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。' @$ z6 W  y7 x& v  o

1 Q8 B, x" r. J5 G8 Q
cstate1.jpg

, t" e9 @+ y5 N( l
1

, _/ D2 s3 r. r) T8 c2. C-state Control
0 ~8 S- m' }6 _7 _$ ^5 @/ z  H7 ^
- l+ X6 P, s. r1)  \1 X4 ]" T" ?9 i7 X: Y
Detect & Enable C-state9 A0 l! K0 g) B$ s

7 I6 I1 \; K) F0 f' k# uBIOS可以通过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的支持。8 |* f% z# _% Q; s1 J% F4 x
( Q: G& x& _" A8 z7 d- H
2)% ^7 u, n1 G8 V, j
C-state Basic Configuration4 `7 n# o5 L( |
通常情况下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)。$ s* C6 j1 V  Y4 n  ~/ e& W" T: ]

8 J% M' x1 Q  D- Q4 D& |3)* J/ V! a3 D' O( N
ACPI Structure For C-state
: L: o: L/ T3 U  {# g4 T
6 l. P1 k4 i& V7 Sl* d9 ?8 l9 b5 M* {# N1 x
_OSC & _PDC' v$ ]* K& B% z
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( g/ `: U6 c# U- C  ol% D: N, l, t! K+ q' n2 c# k4 K
_CST) Q6 F2 m- ~8 X' S8 k6 {
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:- n/ F0 u1 [, c9 a, y
CSTPackage : Package ( Count ,  L! Z3 Y* K1 `4 I6 I5 y
CState ,…,& G8 J  S/ b6 U0 `
CState )
% T& [3 p7 a/ O# l其中Count表示所支持的C-state的个数& ~7 s8 ^6 A7 O  D7 t+ ^& ~
CState: Package ( Register ,: p) t" q  z; g: ^2 N# B; E( @
Type ,, o% d9 T' Z8 c5 Z
Latency ,
  e9 R" x1 u& R6 O6 J- [Power )5 E1 {+ d* P8 G+ y7 `+ p9 K* s
% u! N3 Z6 U0 O: E9 y$ Y
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! ]* ^' t4 W
2 n( Q$ h$ q+ h9 [% aName(_CST, Package()8 X4 n  u. b* o; ~

! x2 j0 d% n$ `% C4 }0 [7 H{ ' m1 s" b7 h! K5 A9 g% q: P" a) y1 p
4,
+ ?8 U4 h9 G- ]! t# p// There are four C-states defined here with three semantics

2 Z; B" ^' l, ]! @9 p9 D4 g, ?! y" C, W' ^7 Y' |* ^2 q7 q1 j
// The third and fourth C-states defined have the same C3 entry semantics! ?9 {6 F4 p! ~* p& ]9 h+ {) {
1 r7 p2 q, j5 B" `& M( |, S+ [7 K
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 G4 P% B1 X! H! D4 I" V1 x
1,) C9 p' f% O( Q& X5 @3 h9 \9 \& ^5 M
20, 1000},
( n7 ]* p4 |0 n) A. I

+ B- g& s# _2 ?% w1 jPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
" W4 J; n: d# {4 F8 [40,9 U& x2 c# T& q% ^7 D8 @
750},
% |5 v0 Q  H7 o& f: K0 A6 n0 N, C- [
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
: W: i' D' O, v( ?60,
. a2 [9 ^' c* q" @500},
$ }  g5 h  W5 H
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,- _) R/ F' V; B7 E
250}
6 ?( W* W7 d. O& H# o' Y

0 y" t) L& f1 \})
" K8 B' m& c2 t) C
3 }$ V& ^! V( z* K3 ]. U- vl" M& T9 M" `* i6 |1 ^
_CSD; Y, ?* H; m6 b: c9 C6 |; I
, X1 S6 \0 R, g
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。) N, H7 n" A+ z
! }0 m+ i* }- _/ @# [. k: P

, M0 M' d- a( u( u: k
% p. T5 P- d$ W, z+ s4 x% s) Y% O9 J& J1 @' L! N$ I8 i
3. P_LVL VS FFH9 d; s& K+ l4 f8 |) y+ t9 h
' L! C5 k5 X& C" D- q
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
2 Z/ x7 r& y/ Y& v2 }# \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所示:
% S& Z1 D- @' B6 Z- r4 I9 J0 G- q/ H  n
gas2.jpg
3 P' J8 P$ e' X0 `! H0 k) U
2
8 e; \' k: Z- C7 m
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的一个例子:& R* L! P9 p" l3 I. V* y
Name(_CST, Package()- v" ^. [5 P7 ~7 h' T, T+ T

6 P- C+ O9 w* J9 U7 a{
2 W% \: v7 J! w' v2,
6 [8 c/ Q7 V; k// There are four C-states defined here with three semantics

. R2 K+ E( p: @* X/ u( {& T  k" H( e
; s) s+ A5 l& F2 h$ F) C$ z// The third and fourth C-states defined have the same C3 entry semantics2 v0 B) C1 X' x7 F0 W( z

. \' e0 z3 O1 [# [+ PPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
, c7 A# G2 N9 f8 K! P7 a9 z. Y/ a( Q0x01,
. [( z0 f" `, v7 Q' T2 W* t0x03, 0x000003e8},; z" m* I& b! j6 i( V
9 M  o: _8 B$ ~% H# Z% V
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
# W) r5 U+ C6 Q. v0x01,: Q* `8 f% O4 L9 h# I
0xf5, 0x0000015e}

8 Q8 R% ~  X; O* w0 I}) 4 m; \2 }& c6 p  h
9 L% z3 N9 r& [' v- H
8 h- ]/ E( _# `) H! W7 u) w  f" q0 L
REFF:% r7 d2 J4 `% q) f- H0 H
1.
  p% `2 b/ T2 _, f/ ~ACPI Spec 3.0
" s- o" k2 h* s" B! v5 ^2.
, y7 I1 |( L9 Z" ]4 k2 I: VIntel Processor vendor-Specific ACPI
5 ^* M* _/ r4 Z! N0 a- |8 M& o, ?* a9 D5 ]; f% t5 K0 \1 ^

) F, b/ b) R& D! t; w: N  c4 |( NThat’s all!8 d; ~, j  f3 J- A
4 C1 V! |; U+ t  j
Peter# q# j' r, Y3 u' t. }# n: \

  U( t2 E2 w6 T# a1 z+ k) S! Y2010/9/20
: Z& n( u; n# ~  q+ f9 B
6 k2 E4 ^: @* k[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview" T& z! \* Y; p+ R

/ ]* {) T2 l/ C! `CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST* ^- L+ C* b! o! T
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
' r! a+ d* z: V: B1 @* j! e& A ( E! r9 X5 v$ f, N  i) m0 y9 g8 [
2. P-state Control
( I$ J- w( _/ C . w: k- v. H, `9 ], [0 y/ R
1)" o# [( T/ t9 i$ j
Detect & Enable P-state, C7 u) X/ x) l/ ?# U
$ F; o) U) Q. }" C+ E
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state9 x( M$ Z( m$ ]7 S6 r
" k5 I' W$ v1 t: e) O% z4 Q9 E
2)0 X; a2 G' m, i4 |$ o1 k: C
Supported P-states9 z3 g$ Q( _4 }' |

6 r8 I9 n' g! Y. M" 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固定是100MHZ0 K" V5 ^0 q0 x3 T

3 F  a0 D( _. r& y" _# N/ I: ?! OMinRatio = PLATFORM_INFO3 J8 z# [4 x9 _7 I1 E
MaxRatio = PLATFORM_INFO2 ^4 D8 b% N, F& A# V" k+ i
RatioStepSize = 0x01( b& `' {. I% {* @0 {* L
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
8 J/ x5 U; y" _( U7 }
, ]% i& }0 C2 W% UIf(NumStates > 0x10)
; i. w+ |5 y' g9 l1 B: s{0 J) I; L* F: ]; a
RatioStepSize += 1+ X% X0 S5 }" @6 t0 a2 i
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
& B# ~9 K6 n0 Q}5 h# |0 Y, }5 s6 L' `
7 N7 I7 R, u2 G0 \3 P5 Y
3)
4 U' H4 J5 @/ ]2 k- h" uTurbo Mode
& U2 }* t( O$ g0 y ( f1 C# [- j2 P8 N7 I& {& z4 r
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 ModePerformance5 e7 O$ Q2 ^9 T. {3 `% p6 `
$ G2 ?" {5 I8 Q
4)- J" {* D3 ~' i4 I' U4 n
Over Clock: N: j" q: A- O% }* G3 O( q
0 a! \7 j: u' {' c; S
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。" P; h3 F5 r7 T$ t- Z) W
- A5 T" Q" y& N* A% G
5)
) v% f2 T$ H0 w) ^$ O) d$ F: g; ^ACPI Structure For P-state3 s' A$ d- {* M& ]: R2 J

) @2 @* q; l( p- u$ \5 ?; D( Ml
8 {3 k$ p* ^. W# A! a9 v% P
_OSC & _PDC
" J( }! m# L* T" f
' u; f# }1 l2 e_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures/ [$ Y& U$ P( _8 l

+ @, u: B0 v6 \4 P6 E, f# tl
1 Q6 B) }( Q  J: e% N8 \! `9 }
_PSS: K* j, ]& Z4 G9 N, t; o
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
' A+ ?) x% V; p1 M$ ^+ ?7 v并且通过一个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做比较, I, t( I5 {3 ~/ Y! t4 r) T
以确定P-state切换是否已经完成。
( d, j! U( u5 }& O, W & D* O# _: @3 n; N
Name (_PSS, Package()
, a; p* I+ \3 l/ l7 F4 ?; E{
) H' Y6 s% E* Z/ T! n4 N// Field Name7 x6 B4 S  I* [/ k
Field Type : x6 r! S8 |0 r
1 O6 I$ W- j% y3 k: S7 z5 |

+ D& S1 v- [6 P' L2 \, K& U; }$ M/ d: ]& L
Package ()' |! B6 c( S4 ^
// Performance State 0 Definition – P0 % U9 `* {6 x# w; C. R' A
, ^  T/ R+ _8 m1 [2 v  ?
{
% k  ~5 B  z- X$ v" }+ E& a& E  y: s9 S0 T9 i- n# Y, ^
( a6 ?/ a  o: b( e" m3 j$ R. @
CoreFreq,4 E  j6 K! X2 g2 S
// DWordConst : S6 Y! x( r7 a* l4 x. Z. w. \

* ~( \5 j9 k$ `' j6 k, u" g6 R9 X6 G0 D8 X, Q, l
Power,
+ l6 R$ N: L0 S, A6 H// DWordConst
' M6 b2 T+ R) V! ~! ]
6 W" z* P* s5 Q6 y- Z/ N, V8 JTransitionLatency,
* U5 u! x0 m0 D6 o. M) t) v// DWordConst 2 o1 s# _4 o# b8 u

& _  u3 ?! ]% U% E7 X! k3 EBusMasterLatency,
! F- ?9 d5 D2 J, D9 x) |// DWordConst
2 Y4 v/ i5 e4 l& d# Q# C
  l" L! T( p2 y$ A8 t5 g$ _. ^Control,
. s! k+ {( `$ P+ |7 f// DWordConst ! Y% A, K+ [9 n' O# R
4 O  j1 f) x. S
Status" Z8 B- z. u1 ^5 P8 M; j" R

9 X, K5 r2 T0 T' q// DWordConst
2 i/ @+ `& t/ w5 h  S, l; Y" r
8 @, e4 t1 Z0 @. d! @0 N8 e% p},
: a; X4 n! }5 o% Y4 j1 Y% L. P7 w5 @2 s+ M% b( Q$ u
.
' H6 w  Y$ Q: {9 n, x4 E; `
, ]! \# _5 ?6 w4 E/ V3 f1 w. 1 v; H. p; k. i6 @7 z0 p
# o" k% o; _% L6 ~5 j0 {
. * p) e( j) @7 s, l$ q# m
}) // End of _PSS object
: y7 ]2 H4 X5 Y0 v4 u前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 8 W0 ~/ T# l+ {5 n. V6 }) ]- ]

1 s  V2 v5 m/ mName (_PSS, Package()
4 B5 D. r, k+ Q' [1 ?0 h) ^9 W/ b/ T. E" r0 P  X2 S
{ / N6 d& C8 k- T( n& c

  C7 i% V1 w1 X1 h0 ?Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
  D9 h+ b$ R; j4 t1 X3 c/ f
% [) V; U. }3 E) XPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
$ c) C. z5 D6 x, \/ @
$ O7 X5 D4 [  t  lPackage(){1400, 8200,
' N0 P, a5 @4 I+ {5 k! k10, 10, 0x000E, 0x000E}
+ a$ N; o& N/ _$ _3 N0 z. \9 \// Performance State two (P2): [3 Z+ u. m( D. ^
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // + m+ u- _9 j0 K6 M; i7 T
Performance State one (P3) & L; |' \$ R7 Z1 P- i

8 A3 F9 ~# ~1 f  |5 LPackage(){1200, 8200,1 L, |+ v% w3 K
10, 10, 0x000C, 0x000C}
" r5 ~4 c4 O7 F8 ^- u- d, J// Performance State two (P4)
/ N' h9 M% ]2 A# L9 v5 J+ |/ \% M3 y- n$ f1 ?( G+ Q; o
}) // End of _PSS object
8 r( m: S5 ^! p9 B   n: h5 @9 p, O* M) `2 V
另外当该平台支持Turbo Mode P0将会reportTurbo Mode) S: }- H8 s2 V5 \! `. z; N

7 {1 d, z' H3 O9 [- ~l
8 A3 Y8 Y1 h" c0 L1 _0 Z6 \
_PCT
: \) f& ]7 g. a' E% y
+ R! p5 V! T1 [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的方式来进行。* [8 d3 q8 a- R$ N8 r( e

8 N  W7 V6 m9 o% Y+ B# A4 ?Name(_PCT, Package ()2 r% T: t0 ?8 P, a, {
// Performance Control object
! Z7 n7 D/ |7 a
& v5 p. \$ _5 F$ T6 I! Y1 Q3 L& e{
' f! z: j" `; Y2 l( S0 U
1 }- k- b* T- ?$ G' |ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},% E4 R, x: S0 a% U, L
// PERF_CTRL 2 g9 n, S0 l$ y2 {, O% G
( f( A( ?( ]" ~6 `- m2 t# U3 Q0 M& L
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
& c% l: J# d8 ]1 O7 a/ J% j- |// PERF_STATUS
6 L" ~# w) R6 C7 K7 i$ ]1 ^$ z  i! _
}) // End of _PCT object+ S3 e$ `& P" F: N) K! s6 X
" m4 g- Y* H2 P9 g
l
8 x  E2 ~9 Y. G" q
_PPC  y+ f6 P: g& Y+ M. s

. t/ _% `5 u$ U. a' `' G/ YPerformance 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-states6 y- R$ }- v  l- _

3 w: y0 j8 e$ x6 V+ W3 r$ J$ _: ?6 LMethod (_PPC, 0)
* v3 G2 S; ]9 y// Performance Present Capabilities method
& q- g' M1 S! ~8 L3 X0 g; T$ @2 A6 f% f) b
{   j' M3 w, d: ?) D; D6 e! {

- P4 `: D, c; ?/ r: D& y% h* rIf (\_SB.DOCK) 5 o5 u8 r* A" q9 [
. ^  F5 X& F8 v% L& Q; k
{ & t# |- {; E! y. g4 A# L
% ^7 S# Z0 G8 i. C: j9 ^8 t) T
Return(0) // All _PSS states available1 Y, _/ b9 n% E2 v: o6 c

2 F6 r5 \) s' R8 c" ~, H" j0 X# u
, b( C( y" V9 l0 }$ Q}
6 H7 u& C  [) y8 _" `2 p8 J7 ?6 ~* D+ B/ m( ^7 i
If (\_SB.AC)
. U% J. l2 ?" a+ Z* r; R* w4 F. {, I0 @, N8 B4 Y* m% S
{
6 i0 n6 l1 N7 O& e, ]$ g* q! @& }1 C  ?( G; X. ^0 S: a9 t
Return(1)# e- U6 b2 s9 l2 c! _# R1 Q0 g
// States 1 and 2 available   `( ]& k9 i: m0 H

% l6 o9 P" ^2 y} & [& @; e6 t" v' [" V
1 m( ^0 M3 o1 X
Else
0 ?2 y2 ]" Y- H) @+ \+ ?! v, m9 J0 q. q9 r. H+ N6 X4 k
{ ( s7 V: \4 o0 L5 P! v% T  x! N

+ e! B; Y6 K8 \9 L' Q& u$ C  o: [Return(2)
% j! [2 Q9 g' f, g3 ?// State 2 available
4 F' q( a& h, |% B$ L. e1 z- {$ B/ X* y% q
}
! z: u% H% N! g, r
* y; F9 z- E8 ^8 }$ d% R6 f} // End of _PPC method
0 h- P! \: f+ p; E7 V' Y4 f; D" ?1 h; x * @* C9 w9 C+ v8 E7 a
l
$ t5 I0 Z/ Z/ k& ?
_PSD
5 a/ T- |: E4 i6 l& N
/ Q; R3 k2 e- d1 |P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
8 N) {- {  w  l  m. E. T " p5 v9 u3 ~2 b3 t' @
REFF:
0 v8 x  s4 j' E1.4 R# D: x! L  g' A9 x- p+ v7 z
ACPI Spec 3.07 W4 e. N1 D# ]8 U1 w5 I
2.3 d8 N0 W- {1 Z9 ~
Intel Processor vendor-Specific ACPI1 u$ F* F- M. A6 j  L: x

: P5 w% G; q( m! v ' }. y# n- [- F" h& i* L
That’s all!  K+ t) H- B8 X1 u. h. n- u

2 h/ p* n8 x$ {' e/ E* ?3 qPeter# b6 R1 m2 k7 i
( ?; Z, T7 N! w: K1 ]' y
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
5 P# g2 a3 c# c0 u) E8 {
5 H  m# u% a, g* S' B% o( iCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
. Y4 R0 K& S; M: o1 @4 Z$ L1 N,影响系统的功耗和温度。( B- I8 K/ f. q# `/ d+ b' d

" c7 u' g# r/ H2. T-state Control
$ x$ O' {# H+ T# _8 w
# |9 Z' z# f! R4 D1)! M* @5 V# F' n5 D4 D
MSR Based Control
" s/ ?3 F5 I/ N0 X( }6 r: U) j / V9 l% t4 w& c2 k$ F$ ^
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
1 [8 p4 o  i! f6 G$ _1 a, ^ : ?5 f- H/ d3 t; X/ k, v
2)0 E) P9 o0 r) i
I/O Based Control) H0 W: v$ M- B8 d* D2 `7 X

! M9 ^6 R; a; {% k, T: {除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。9 i6 M5 w2 B' i+ _' G
8 s+ V* o" u  [  Y' K
3)! Y, P* U9 |8 N. R! b
ACPI Structure For P-state$ s1 R3 z/ n! }2 M8 U  }
l/ c/ E. ?& y: `& _! p' L* c$ T
_PTC
5 r# C8 K/ W& }) Z7 D* g
5 n. J( r& \. k$ c) |8 aProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
% `+ p1 N; U1 {; U 9 y5 I  }4 E% u
Name (_PTC, Package()   e, U3 D  A3 Y  V9 r" \& g; j) ?
{ 4 \) C7 W. b' Q6 v

; [0 ?* S2 S7 }  B- jResourceTemplate(){Throttling_Control_Register},6 _/ C! G$ g0 e! U
//Generic Register Descriptor
1 d' Y' {% \& ^, r9 f, a8 U0 I/ h! h: k, y/ R9 T
ResourceTemplate(){Throttling_Status_Register}
" }+ W) ]; Z5 U% p% u, f5 A' L//Generic Register Descriptor   f" x9 [# i. k6 Q: p2 }8 x8 n
}) // End of _PTC# C" S  z2 V7 c; u
6 U; I/ o8 Z! H: {: {/ o+ D: r  v
下述是一个sample code
! ]: a$ A5 U$ \$ r2 {
0 w2 w- G  C, }& W9 C( x
) }: I' W. O# B5 u
//, P( k4 M; @7 j1 F% R
" @9 }/ x* }3 P
// T-State Control/Status interface8 g0 S. f1 w" k5 B% L; g/ z3 n

0 g; \1 ^: ]7 l/ d' p6 g//
, D8 ^" \6 J+ R( c
* U& B* W7 ]! qMethod(_PTC, 0)6 m, u: Z$ a- @
7 B: _. V7 o# B; a$ k
{, A8 S3 V9 ]8 k( v* M0 j- J
5 Z/ L$ J6 Z# m! v7 K0 _( O
//
# k( F: \6 T8 B) G2 }8 m
) S: J" d$ J6 w" J# e// IF OSPM is capable of direct access to MSR
+ H( R1 i- H2 Z( \. q% t
8 h3 |$ i( h8 t5 ]9 e' j, a! f//
" o$ `2 W/ ~" [$ W3 GReport MSR interface8 X/ a; c' ]5 c! J( v

3 m5 B: f* [* m1 I  e9 B( i  y// ELSE
% o2 `7 l) t( S8 J4 e6 d3 Y
: w9 \+ W# }' x0 C* M  i0 w//- d0 F1 [( t1 l4 D
Report I/O interface
0 Q4 d3 K- R4 }8 `( n+ {; x# u8 z
) U2 v& v& r' K( e$ D+ P+ n//( [& E' M  ?- c  H  g; ]; _$ ~
' }+ e' m0 ^  h
//( I+ }0 p+ ?0 r% k$ c
PDCx[2] = OSPM is capable of direct access to On
1 e; C6 O, [: B0 u- p7 k* Z5 i: ?) Z
//
0 u3 f. D5 ^' A" Z1 r; a" a  {& Q2 ^Demand throttling MSR& C4 V) l& L. |' Q7 P3 U

) {; R% v  K# W  N/ J, {//
% I* X; l: W9 |4 F$ E$ L
! T# ~+ V$ Q% N; g- p! J/ j* J4 ~If(And(PDC0, 0x0004)) {8 M: u" g8 g' z+ e: p
, S6 n+ {/ @0 u) _% M
Return(Package() {
% w9 ]7 r! F* C" I. t- V7 Z# H4 ?9 V* x8 L* x- D) ^; l
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
7 ~4 P2 e9 i$ M+ n/ q" r+ F2 K/ q) |1 K
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}6 w6 H5 y4 `4 B* A" G

. T8 O# k8 h9 R})# |! V; o6 |  E* S) f( J1 t
0 d) ~* t4 B6 e
}1 _$ N. w7 {. v: r$ k$ i
% o7 O# |) {2 x3 ]# ?% z) T; p. |
Return(Package() {
, U* Q: r1 n  n: w% }9 @& P1 [3 j
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
8 n' i1 r4 w2 W' t8 Q& b/ I" _0 b5 |& p+ t% E8 T2 T
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
, a. d' Y( m8 ?: \% R- ]
* l6 Q& o: F, E9 p})
  k$ J, a% d! R1 b5 a" l. ^3 \2 e* B" P( Q0 G
}
- K0 z2 i: g, \) s* j0 {  B5 }9 x" Z+ ?. @5 J1 \9 [

* ~$ ^/ q0 G# @2 Z' C: s' f/ y6 c6 S$ X% I4 K& b
l+ K5 S& @- f( W- L; j5 _
_TSS
% C# k0 x# a3 `% Y- A/ a
, P5 a; M. I& v  T8 E) L8 z" eThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
$ W/ C# x3 F& v, g" }Name (_TSS, Package() ! m! j$ Y; {) y5 E
{
6 V( i0 G; e. |  Q6 |, l// Field Name
" m% ^  L. K6 SField Type
1 ?& h/ T; e4 P# o3 m1 \" x+ t7 V8 E  Q( k( R" N

5 @$ ?1 l, U8 e0 P/ I) M! B4 b7 s5 N: ]2 R4 v
Package (), ^4 g9 j+ D% }! a* d' `' ~
// Throttle State 0 Definition – T0 . e$ F6 B1 V6 e1 w5 j

7 e4 W. C7 d. {% D9 R{  F  X9 C9 H! |- g% K0 r
1 r: a: `' u/ K! g: d% L
9 X" `3 V. _6 s6 Y# S: o
FreqPercentageOfMaximum,. L. h0 ^7 P2 i+ z* Z" z0 ]
// DWordConst ) b- {( ~& r0 D( P. c" ?% A
1 E/ r/ A6 b& X; z
Power,
1 n. A5 R$ A7 J8 b! v// DWordConst
' _- f! O$ ~! {
* @$ {; c: s1 {4 `) r* TTransitionLatency,
$ n( ]( ?+ a2 g/ E1 M// DWordConst 8 d, x. Q, n3 p; ?
6 o! o* X  Q7 ]. `2 s$ Y
Control,) j$ i, f' ?5 w$ H4 e1 s6 |  E
// DWordConst . J, h: \0 x3 ?) T

4 W  z& Y6 _2 R& W; S8 V4 nStatus' }- a) \; a0 G( q9 B
// DWordConst - R! c; T1 ~( J4 _- ^/ q, u
},
! r/ a9 D* X7 N. I4 R1 b……
3 w" P( e: A6 C; _}# r+ ]! k; F0 L9 O9 t1 \. g& n

, E! E& }5 w9 \  J  q. T: H! fExample code 如下所示:
6 a0 Y3 D) K" M$ r2 u
+ ~9 ~2 [& s, ]5 B4 {  U% G5 a1 F+ KMethod(_TSS, 0)
* c# D: x2 y2 C  o( a
( X' m! _: V  I* v- f; f2 g: e{8 C% b" S. A+ ~# V/ g

5 d. V7 {. q* r7 q; @Package(){100, 1000, 0, 0x00, 0},
2 w' T" L  y/ |* |
6 j7 D9 f5 h8 P# ?2 lPackage(){ 88,
3 ?& {" q( D( Y  e875, 0, 0x1E, 0},* V7 O% B* M% J, Z/ L& L" y

' T" `- C1 Z4 n. V  T9 YPackage(){ 75,, y9 y7 D: |) y7 C$ @. `) e, q
750, 0, 0x1C, 0},
5 @1 P5 O; H: ~" X' Q9 y9 {  }2 R
  u( i* R0 E' k# c6 s6 s. LPackage(){ 63,
7 v% e2 j. I* r- ]" q625, 0, 0x1A, 0},
' B  Y; m0 A/ g9 }+ w$ f0 H, u* \) t
Package(){ 50,
  x1 x3 O4 v( l5 ^' g500, 0, 0x18, 0},% l* Y) P$ ?& m. W1 e

6 j& m' B4 k  ]1 W. m# mPackage(){ 38,
  @" v, A9 A7 ?9 L2 n375, 0, 0x16, 0},
5 [9 r, ?2 p; h4 Z! u- x* I
- M$ L, x- h9 CPackage(){ 25,
6 |( ?4 ]5 K  [7 s5 O1 c0 }' s250, 0, 0x14, 0},- i& W9 S3 o1 F/ B/ u- o

& ~7 r$ V9 `' D# Q% J0 PPackage(){ 13,
; X: U- n5 R0 U) w/ D125, 0, 0x12, 0}/ H, \7 z' s, m
' Z6 W$ D: y- L( H$ i" x- a" e
}. c6 r! p; D0 B( p( R! s/ Q3 z) R
) q$ i+ }1 B4 r. e" s

- [6 I- W% n& b7 o- Nl
2 `- ^7 |6 k- D& Z4 }6 M2 m
_TPC# [- y3 d7 \+ V" c2 V+ i9 c" _

- A) o3 L6 l  S5 F6 ~% |Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
7 y$ h4 ^9 J) o2 `/ G* X% g- j: y 9 F# k+ M. B; N. B& B7 M! k
l
& @. P+ O, P! `. p
_TSD  O" `+ D5 f# z/ m( O  b; n4 ?2 S# \
  \' R. U  q! i. i" t( ]7 m1 y. c
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code6 }/ g* {& u) ~! e# X! g

' l/ I( H# V3 C1 V2 {/ D+ U( dName (_TSD, Package() / y' |  R, I$ d" H4 A

1 f. z( z, _: W- F' O( \6 @8 q{
- r: Q: `. t  h( l8 M& E/ V3 j7 k/ G- g
Package(){5, 0, 0, 0xFD, 2}6 ~# U! J, o# l3 `6 b' `9 L* y
// 5 entries, Revision 0, Domain 0, OSPM & s! d& P9 s, x/ f
Coordinate, 2 Procs 2 S3 }0 d/ d( r# C2 E6 U
; Y7 L0 A5 b# U- `
1 r. Q9 y6 y) ]( L: k
}) // End of _TSD object" u9 }1 `% P" d. d' M
& M; ^1 ?) T9 K* }
REFF:/ D1 H# A; s3 ?. o# j( l" Q' B
1.& ?" `6 F' c2 [' S+ T9 P
ACPI Spec 3.0
6 X8 E8 c( j% q& u+ @2.8 U9 c% q  _! Y7 c$ d
Intel Processor vendor-Specific ACPI3 E, M2 ]* H  K. z) V5 _

( v3 @$ I* ?/ v0 F3 M; O 5 ~4 z' b  ^" F# H& [
That’s all!
7 G, o" s) |4 L# m) `' D( w 9 T$ o+ N% \' c
Peter
% C+ Z8 k' r) L8 W ) U$ m# h" v4 ~- u! V
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 07:29 , Processed in 0.046791 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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