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

CPU Power States

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

4 {8 S) t* x$ A! k1 {! ^1. Overview
" b: U+ f7 N6 }& j+ {0 p+ }5 h
" I- d) L* @/ K: D
$ @, v  z1 y9 R- \# G% ZC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换2 {0 W  K( }1 [2 s) p. P# V! O
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看9 O0 E, l' D: a8 ~) U
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
+ X+ m; u7 p& e6 ~5 g* n3 b' g: U" U* j) b
cstate1.jpg

4 `& {/ d6 F' f. R) }
1
8 H# P" u9 [& ~+ `
2. C-state Control5 {# q7 `9 t+ d0 O% ?

, ^: o- K5 @, e# N# e8 f' K# Y1)$ b, c$ F9 C8 }( K  `
Detect & Enable C-state, s* S1 x7 i: K/ F5 P  I: h

( `3 h# Q+ X+ r" HBIOS可以通过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的支持。* E' w; N& ~2 k4 ?! c5 ?

8 a0 P6 T, N& |8 E0 c2)
& W+ B& a( t% @$ bC-state Basic Configuration1 A6 d' c2 s! G. a0 G; M- Y* Y
通常情况下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)。/ N  b& `1 f8 O
8 E0 J8 _+ t  N' J. _2 r- r
3)
+ Q# h+ R  ?( M1 }7 |7 R0 uACPI Structure For C-state2 H% k9 G" _: A

" B# K2 n4 M6 m! y  o. Wl6 x) A* k3 i4 |" s+ k
_OSC & _PDC
8 H0 ?* O6 }5 w0 g_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( H, B0 t2 N' k: K% Wl
' V6 r" ~5 E0 B
_CST5 U1 `; i2 s" y$ ^2 _8 b4 }" v8 v
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:5 \( A; A% P! W$ H4 ?8 ^0 E& B
CSTPackage : Package ( Count ,
4 Y- ]. k" g/ z( N' k$ {CState ,…,( D- r( b7 U, D
CState )
0 a2 V8 \8 b& w" J其中Count表示所支持的C-state的个数
) |5 r7 u* c$ P+ g+ }5 P8 jCState: Package ( Register ,- f! ^# s7 F! s! N% P$ l
Type ,8 g5 w8 z0 Z5 I5 }; ?: p4 u( k
Latency ,
9 Y! }: \9 w8 L+ N9 @9 j. L  qPower )
( a2 I7 q3 M8 o" r  A/ c
& }, t. j4 K. R& P! N7 U6 d' ZRegister表示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
, Q8 Y! }/ F0 ~  g$ T8 G
* |4 [  ?: H& l# @; pName(_CST, Package()9 o  A  W. K5 x  O
: N5 H$ R, I! P4 h
{
* s  Q$ @4 Z& ~( ^; O4,
3 M9 ]+ \6 a7 Y1 h// There are four C-states defined here with three semantics

( ~0 J6 K+ _  B) [( Y
, G9 m& I7 l5 ~$ T" Q// The third and fourth C-states defined have the same C3 entry semantics
7 q# j' E3 z" W! D6 a6 h6 B

: P) Z/ v4 o5 @! IPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 P1 b( C2 B1 E
1,1 N4 N5 Q9 }, \5 w" p: ?$ s
20, 1000},
' ?1 f: s- C5 t8 B0 r2 N& g5 [' d

% ^' p/ P* S( |/ HPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,$ C; x+ e! K) D. d$ g- x
40,7 U8 U% ~! V5 T2 _- X% c
750},
& W/ F% p! `; U' H1 J, B7 w
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
) H+ z: A0 s. A0 q' ]+ k60,
6 i# t5 l- P. p5 P. W6 b7 g1 l9 Q3 S500},

  ^- H; l) Q9 i/ w0 D2 IPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,* Y- D; \, Y) l" ~$ x5 C
250}
$ O6 I8 U6 ~; Y

- n% o$ n' J7 m! y})
5 L. z3 ?5 r2 ]: x3 T. z1 z; \' M2 M6 t* F: D; {1 \! c
l
0 X" ?! h1 Z. N: ~
_CSD
6 |1 c  A3 I+ n: r1 N
( \% P. W+ K7 m6 D4 CC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
/ D4 m+ y0 b6 n/ v2 f, L, A/ h
& x! L- f5 K0 t( w8 X9 ^
0 c& Q2 u7 `( E! i7 b( K# B# _' Y5 f9 Z/ H9 ?' f
6 G; @  l$ x1 k9 W
3. P_LVL VS FFH! Y9 g2 `) [4 E4 g
3 I6 g$ [$ ~. R2 a. n2 C0 h9 d
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2), g- i# k$ L4 t  O4 n6 F" z: F1 X" G
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所示:
" C- l- p  F4 W3 |' a& a. ^* g% C0 L8 Z$ T. u% g- c
gas2.jpg
5 K! m; b& U: r4 ~  W: X  t
2
  X1 B- ~4 w5 A0 c/ l0 r( {& a+ U
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的一个例子:
% P3 g; A8 k, B5 {( aName(_CST, Package()$ |; E% P0 R5 I/ ?0 R# ]6 \

& g6 d! k8 Q% Q8 I{
- a' ^. e8 ^- ?6 p" {; D3 ~9 {2,
+ V% H5 E! W# Z( U* {( v/ Y// There are four C-states defined here with three semantics
0 r" a- r5 E( e5 C" V1 \
5 V1 P3 v$ o  P' T
// The third and fourth C-states defined have the same C3 entry semantics
6 j: l# t0 P$ M* r7 j! p

; S; P, ]1 M! [6 A/ V, _Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
; S% @6 b8 v9 L, {. q! u: c% I0x01,, L! q) c4 |% p  l& M! E
0x03, 0x000003e8},: ]. a/ ?0 M3 w' a! n( Q" I+ ~% r. s
8 K1 `+ q" j8 L' B# n
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
" H0 \5 Y% G1 V5 r2 n" M' i3 d0x01,; S1 F" {0 G1 i, I) I% F1 `' {3 A
0xf5, 0x0000015e}

. M- _. n; g$ N4 i% Q! V* B( m( G})
" M; f6 h1 J: {6 ]/ S% H
$ N, X' @8 c  n3 e! C) ~: D* v* Y6 i' l1 ~" Z6 Y0 C
REFF:
- {* A' }$ V4 ?& J4 T1 Q/ x1.2 ]: z& J( k  E9 d" f. ]6 u+ F
ACPI Spec 3.0
3 n8 u: @0 C2 K. J2.9 i& _' d9 R' N1 a
Intel Processor vendor-Specific ACPI/ C. Y( w2 G- A3 q) |+ Q

' L; i' k2 q: d6 E5 ?% R, z1 w  Y% Y0 k1 ^, A* i
That’s all!% i& |# l+ {, x% H5 i# }
" ?, K3 k9 i/ R) q# b: P3 e6 E# h
Peter
1 P9 t( O: I- X/ z. f# B. d1 Q& U& I! D9 p
2010/9/20
( |" u6 {8 I, J* o" U6 d6 I1 U2 H5 _8 T! i, j! F$ S7 h8 [
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview7 @6 x+ F7 t+ \8 j$ L9 F2 R

; u" r0 |' b2 `4 ^+ c/ T  nCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
: s4 V* \/ V" u. E. l/ d& jEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。6 V, d' g5 A( M
4 _" v0 I2 }- H
2. P-state Control
7 p( R" i3 [. g
  o7 J3 T- Q$ J' I1)7 V5 @+ ~+ ?( a1 h8 V
Detect & Enable P-state
( |/ A5 F3 x$ y" X* W+ `" d 6 Y6 }0 m2 p3 Q0 C3 B' N
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state0 h# l+ E3 m8 Y4 C0 m4 L
: l: S6 e9 j; M1 W, b9 U1 b4 O
2)8 w' ?4 z* }: j5 b
Supported P-states, |" z, W+ v% @6 T8 b! C, R2 a( ?

8 ^* Q% A/ `; r) G$ s4 I$ LBIOS 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 q+ u- E6 C9 k6 H: p # \: j* h' A* W  w8 X- v
MinRatio = PLATFORM_INFO
1 h7 |- ]. F# ]; K/ n& dMaxRatio = PLATFORM_INFO
! `) ~% N! K$ Y9 A+ [RatioStepSize = 0x01
4 L8 i) _2 m2 Q# k0 FNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
; T5 |" A9 \) g ) t  j% i5 n1 H2 r2 \
If(NumStates > 0x10)2 d# o4 q3 K. _: \" o0 E1 D
{
+ C9 s" K" h. A1 q6 X% d$ {9 YRatioStepSize += 1
) {) U3 |" p# ANumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1, f0 |0 n6 [9 l& S5 n( {
}& ^" p1 j- Y4 a& @& t4 ]: M( @
0 v8 ^9 V) a4 w
3)% |5 a" K  B) G2 ]
Turbo Mode5 l% O! J9 l2 r

8 K  a8 S( B9 i. y, PTurbo 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: m# s+ P! A3 G* Y. y

7 `& Q, I' o. w9 J) s4)! I0 G8 g0 G7 a% f
Over Clock" o" f! i: U& O. N8 E/ `% f
, |" M% N; e6 l$ v
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
. U" s& P8 J" g" B8 K) d2 v6 s' M, K0 g
* H; A. j" E2 Q1 Q; y5)
  k  y. W+ ^7 h8 _2 Q3 Q8 k+ ]ACPI Structure For P-state
' |; l) n0 m/ a- K( [6 E  L , w, E' C7 ?1 j* J  n) k8 Q6 o
l
  T4 t  ~* w5 m" \" X9 Y
_OSC & _PDC" ]! r- ^( J; E
8 ~+ X; u* b" c
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 ^1 c' e! A7 a5 ?6 k9 x% w 8 p& H& O/ h5 A
l
/ |% f3 Q5 I7 c: I4 h  x9 z0 i" j! T
_PSS$ K: ?* E% ?" T
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
4 Z. }- `/ ~# X" s% ]) R0 Y并且通过一个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做比较2 _  ~$ x0 F; x- f0 a
以确定P-state切换是否已经完成。
  a7 ~9 E) I8 }6 p 5 O! w; p9 n7 N, n1 K5 T1 `  n/ z
Name (_PSS, Package() ! T) @, m/ z& g& J% Z4 V6 l
{
# x$ l2 ]( D2 M5 m5 _9 `// Field Name
/ e4 q. n( o5 z& OField Type
2 D0 I' w" P4 k2 y
6 H9 N2 g: w3 J. p5 U" y+ M% }
7 K! ~" U- [% A/ S4 j+ [3 y+ p8 i! o- r
Package (). Q# j! R: s8 z7 j
// Performance State 0 Definition – P0 0 y5 M( {, i9 p0 z3 J9 x
2 P5 L& v; x" J  L' Z8 |: a
{
% {& n; ^( X! T; `5 F" S0 V1 B9 p( K& Y( W" I5 v/ o- A0 g
& w+ f1 _9 n5 L6 Z
CoreFreq,) E  `  ~2 ?3 w5 H
// DWordConst " {2 ]! ?( n! O7 U" Z" n
+ D. D# C, ^- x" W+ b

# n0 n$ Z3 G& f7 U! ePower,/ U4 }, f8 h; B  A8 A2 }" x
// DWordConst 4 W2 Q1 Z! C6 |: @
0 g3 k7 X/ N$ ~! R( Y* W
TransitionLatency,
5 f8 W! `" H" {# G) P3 j// DWordConst
# z/ G0 n- u0 ]# Z
3 Y$ E, Y3 V( E( o  L+ A- xBusMasterLatency,
6 Z- m/ |* f( W6 c# c// DWordConst 2 ?1 b3 J7 w) h! G2 b  k
& N, j' f1 e' H+ U  Y
Control,* a% `8 X; T8 M5 p! U( l- }9 t
// DWordConst
. G* t4 B# Q* s' U; O. s- I4 U* y- B" U4 @+ n
Status
9 j, [7 H  O6 [6 l
) n, z  y1 z/ n+ s- H4 q" F: l// DWordConst
* s8 [  c: ~, |7 W. x) u
7 x5 M9 \. r* |1 J/ e7 {! ^}, : T& B& D. j# L- o% K
7 }$ U* Q6 r6 p/ K2 @5 u
. 8 F# s) @: u+ [  _4 M- D
6 U  V! h& m8 i# v
.
( h$ d3 b! G: I" i! Y6 e
/ x1 e% ~) s. i. 0 k) j8 H1 {$ M, ?7 ^
}) // End of _PSS object
1 x6 o0 M) |0 n4 F前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
/ P5 B) ^. ?  K5 |3 d
$ ^' ?- w  y- R, H* N" eName (_PSS, Package()
% D! t6 v5 ^, v5 y9 `# y3 W% P
+ T8 D/ ~4 g, S{
) j" f! U) G' m8 ?: D7 D2 }0 z3 s" I
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) " o: @2 l8 i! y1 M0 u+ q
6 ~! R' e+ T7 \
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
+ G0 ~6 }6 a) P
! _6 y( h' o1 U- F9 m' ~Package(){1400, 8200,6 R( r; v, m2 C9 h8 S) J  b
10, 10, 0x000E, 0x000E}
* M. y! j  }) ~- R9 z// Performance State two (P2)( T! V$ `4 k0 ]" v- A8 c, v/ ?; V
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
" a4 `& O7 j; {2 ?  T: YPerformance State one (P3)
) v: e8 c9 t8 Q( }
; A4 j7 Z. }0 p: @Package(){1200, 8200,3 ~9 n+ y. _2 w* Y5 c* i
10, 10, 0x000C, 0x000C}
$ i. c% E# B2 D  L! T// Performance State two (P4). y' y' j6 q2 b! U$ k, |4 i
- R5 e# ~+ z6 F; @
}) // End of _PSS object
' W% l) c3 e* K$ W + _& c5 q' N! ^
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
  @2 Y1 F5 ?7 g1 Q7 C3 I6 w
# r2 w, l( a0 h& D+ Gl5 }  N5 C- u1 x2 G- d1 ]8 M
_PCT' B: l* M- ?. v; G  z

$ c! M' k3 h2 o; [! O7 T% p- ePerformance 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的方式来进行。7 l* @# y6 g( ^/ y4 [

* E; x- J1 {# J0 OName(_PCT, Package ()
- t- t$ P* e" E- \6 n// Performance Control object , i/ t* X  {0 J$ d# j* l
. `0 X. p/ l& P2 ]
{ 8 T4 M, Q7 R" S; D+ x# H1 b# p
' o2 u" w, s& R- U3 t
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},/ V2 \+ Z, [- S1 ]- l
// PERF_CTRL / l: h& t6 O* g7 N/ J

- H$ K' d! ~# b5 k( oResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
' e/ l- Y# D0 ^& T// PERF_STATUS
$ g1 o# b& r5 o) o$ r; j" h* T: g6 f4 q( |' i4 ~4 R
}) // End of _PCT object/ x/ E; l7 Z. V" Q; j- r, M
% l; }6 E. ^( q9 ~+ f/ S- u* Y
l
9 |8 j- M3 A4 b! F( K8 _3 r6 O
_PPC
$ J" |9 I+ D# b3 F & w2 G, U, z! M% [4 H. A
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
' S  }6 {5 g' y2 ]3 i ; d9 g  L9 \; A3 o, U. y9 X
Method (_PPC, 0)- N. F6 V' I/ D* E& s1 I
// Performance Present Capabilities method   n) K1 \2 N+ p9 t) `. l

9 q+ {5 ^( o& K{
, Q, I' q! M3 O8 n! M
: I8 J8 n0 m! {. W6 j( K6 DIf (\_SB.DOCK) # \$ @  K$ t2 L0 g4 H& v
$ r4 F' V& d' A& O; i- v! b3 K
{
+ @( f' Q; i& B( P8 t. }1 ]  _4 L# i8 z# K6 ]  @- M
Return(0) // All _PSS states available
. P8 b. g: J& f
& q: ~3 w& _5 C, o, |+ a
- m0 k4 r& U9 W3 ~. H} + m9 |; V* x- Q" G
/ Y4 B' S/ I9 q0 l/ H, j8 T
If (\_SB.AC)
% n; j+ \3 x+ B0 X3 R% u8 w' M3 d' G7 c
{ / F( a1 l/ F0 G, ?) ~5 I
! V/ O' f8 N. D+ {. J$ i
Return(1)
3 G) x5 l( n/ c6 @$ l. h. |// States 1 and 2 available 3 g3 J  C3 v) X2 _/ r
5 W$ d$ k5 C8 F7 n
} . i  V- v$ w) `

. M# F3 \. ^" OElse   e0 j- z# s2 I3 r0 {8 L
# |5 O  B  R. z6 R
{ 7 E- }' ]5 o0 |

) c: s4 u9 {1 [9 k% XReturn(2)4 P9 c5 f- ^3 k- {: X
// State 2 available
2 s- |( S% X5 N! U" O! H1 Y- g4 y- c. w
} / N1 l$ W4 d3 _
" n1 q9 ~2 r: D: [6 _- G3 V
} // End of _PPC method7 o5 @. ^% d+ V  s$ t! C. V
$ X! c0 X( I) z! h& _! Q  N  D1 ~/ r
l
; g/ B7 Z* Q3 Q: v& M2 R
_PSD1 }2 B  ]! t& T

# B, Z; S5 T* n" E  ]- vP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。  z# _) _% H' Q7 A3 u( n

2 e$ \% `7 t1 s7 I0 M) VREFF:! O* e5 \5 _7 S5 C: n& x1 W2 I, Y
1.
; M, P8 t% U6 O7 H+ C3 O# fACPI Spec 3.0' D* R* r; Q9 m* y& [- t4 ]! w
2.
' a( L" i/ `# nIntel Processor vendor-Specific ACPI: X0 _7 U6 z+ R% c" ~' E- L
6 r6 }% G- C4 T2 K
4 G3 ~% A5 [) N0 n# A; Q
That’s all!( T( F. j' y1 ~* U

# n. V- {+ [# L' I3 j$ _" y6 uPeter, t( I* h( }& ^% K+ A

( P- J, H" d# M7 [2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview# ?$ @$ j" r9 N! w# L, P
! `/ _5 |2 G  m/ r' V
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工作时间的占空比)的方式
& j: t$ J- A' H6 K; R( r,影响系统的功耗和温度。3 }! O$ w7 N% I% R* }4 d: r  y
6 C$ @+ F7 v" z+ K3 r
2. T-state Control
& J/ L$ F. `' ]) n% v8 p2 s/ B 4 M; [/ R" e- @- k- x
1)
4 I! Y, G0 U1 x: x: gMSR Based Control) K1 K$ f% A, _  v$ Z

8 J& Z0 ^* @" z/ `3 yBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 : X  ~+ {7 M. B0 f- l2 v9 c
7 z. J! ?+ x' z  h5 c' }7 B
2)
' w, t1 Z8 b1 hI/O Based Control5 d$ T9 \) _; A; x
! L+ x9 a+ `& e  N$ M5 Z; R& s
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
9 q, m( t& k7 M" A9 w; C 1 h6 n. V8 ~- L5 n7 L# @% r
3)% x+ i" D9 x; z5 Q* }
ACPI Structure For P-state- c3 q6 N$ w; j/ H0 n6 O
l% }" f' E2 O, N, y3 H% L8 C
_PTC6 A5 t3 l% N" @$ f# t+ x* Q6 v$ a

) n3 L# a- O5 @+ a0 u( V" V2 }: VProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
$ [& ~6 B, l# o3 Z3 S# g 3 z4 e' y1 ~4 x" P( ]6 k  u9 j
Name (_PTC, Package() + A0 |- l" R# w6 S+ H7 T1 y4 I
{
- i4 |+ m5 w' P4 D9 @/ |8 v
$ ~  v. p+ e9 K0 }ResourceTemplate(){Throttling_Control_Register},
& B" j0 O9 I$ W, v//Generic Register Descriptor
7 B5 U" |( V& h- ~& ^$ _% [$ p4 P" l0 {
ResourceTemplate(){Throttling_Status_Register}
; J! q- G1 j0 y" N2 J& m# C) F//Generic Register Descriptor
& u5 H  |9 O% y! c$ r}) // End of _PTC1 k! ^% A4 u7 p3 y9 X) u

% w' Y! a0 l2 n下述是一个sample code
1 u1 g+ Y# Q# G0 ^) Y* U 8 e: M7 E" i& [
. z. j4 o- T3 ~+ v
//1 K; b) Q/ N4 y* Q, d; `  V
2 ?0 V" Z: X+ C6 E4 L
// T-State Control/Status interface9 i6 t, X0 |+ a3 ^/ ^: c" X6 T: Z
! d; P2 w% b6 i% A
//
& O5 Z: B8 d2 l4 e5 ~, [3 I' W
+ p1 b6 G7 D$ Z, WMethod(_PTC, 0)* B& c, f, \7 M) f) s4 S% q7 b

$ G# h6 D3 a0 \8 q: p( o{5 X# f% t( _" r* a6 ]3 a

. W* o" o+ D7 Q7 p* _//
( j/ G, `% P# U0 w6 f* c4 z! n8 e3 u* a: t' c
// IF OSPM is capable of direct access to MSR/ h9 b6 n$ M/ Z$ v: c  H8 A5 X7 D
, F$ S* B& Q6 X
//
( ]0 e- k, U: r: D, AReport MSR interface
; e3 J2 G" Q; r/ t. N; V
- {0 |& D; Y* P% U, W$ ~) F+ o: v// ELSE
6 F+ W+ c  O9 Y+ U4 O0 V( s2 e  X/ J2 J
//+ I, Z* z% ^( t8 ]/ `
Report I/O interface# G/ [* m* A/ y; F3 u
. h3 V. V0 K* o2 D* L" f
//
7 x8 T) w; a9 d8 {! _$ |0 Y& M$ ^
//
+ d8 F/ [5 c+ g# E) h8 I6 e: D7 aPDCx[2] = OSPM is capable of direct access to On
9 E$ }, k% T; x4 P5 q+ G) ]$ B
  E  x# l' Z6 @3 C8 ~$ E//$ i. I% j* X# `) \% f
Demand throttling MSR3 `- B4 n2 t( j& `
2 v- D* p+ [/ n! c
//5 n* v( |% N! R. }; E

( |; l: v6 a  \+ P. L0 c8 b: GIf(And(PDC0, 0x0004)) {
# ^- Q9 p3 O& p- n0 I. i; P4 o  J: d
Return(Package() {# z2 |3 S6 u9 |1 C: A

! i: B7 y8 i! A7 d; y* jResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% Z1 v4 f/ q3 X4 W" t' H; |- ]. i, Z0 p  a+ P
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}& S* l5 C4 V- }7 }! Q' ~$ z$ L

" c7 g! l/ U' o4 `$ ~& {9 u})7 v! O3 P% y6 H' Y) u& T; T

# _$ ~; D4 J: q; B1 G( I}4 }; I$ m: X1 w! e, ~$ Y+ P4 h: Y$ q
' N& Z9 s! x2 C+ @/ e7 G- J
Return(Package() {2 Y, Z* V  J# k, \: @8 H

+ K1 u1 D2 v% W* z6 yResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},& J: `( B3 S9 S4 T+ W
# H" ^5 |; F" I7 i  `$ z! D- G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}7 l/ B# P% `' L0 \* T
" ]" \8 T! C4 h1 h
})
* d' U# S8 J0 }: {' t& a& t! c4 G6 _9 o+ x. N% t
}& o' |( h) q* s) z. B% ?" X3 ~1 C& R
  Z9 p6 k' x) J: w' M+ F& p  w/ \

6 L- h4 ~3 e5 _/ n9 y) G
8 z6 W- Y) g# O( A& S7 x, M0 ol
& |3 G% @+ D* a, n' m
_TSS
9 j9 ]: a' d9 r: b
2 }" I, p' n$ xThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
$ y& n9 A& Q" I) |4 t- W5 dName (_TSS, Package()
" x: e2 E1 _3 l- y1 |: g. ^{
+ ^+ p: u. I- d$ e, \$ g- X// Field Name
* [1 x" ^! X, {+ _( LField Type , R3 n2 |. S+ T, v* O, ]7 V
# C2 ~3 Y: f5 d5 H% v, h

1 i& }2 ]! q1 a4 W* S0 t4 D& x! M4 r9 [
Package (): X7 j8 c5 v$ E) U5 ?- G
// Throttle State 0 Definition – T0 # O4 v7 i% w- A9 i$ R0 m% ^: M
5 N$ V, D8 s3 J# ^
{
2 }% t6 T7 D' M8 S/ U
$ H5 f9 j9 T* T- C8 [" h! Z3 k5 D$ N
" k: f% `( u/ r( fFreqPercentageOfMaximum,
8 x) Q+ y) n0 d& l+ f7 l& Z  f" Y// DWordConst
8 u- Q8 J- ~$ s; K7 I
: b) Y: S) }7 }6 p- D* N9 Z! ZPower,5 [4 s( Y* C4 s7 G" o6 P
// DWordConst 9 v- d  v7 `! ^. H1 b# A

" F6 k$ a! \0 ]8 w0 TTransitionLatency,
. j  n0 h( Y9 e% B4 E// DWordConst 9 P( d. L: T( z$ t- _# W
# y0 Z% u8 ]$ `
Control,) Y3 w( x  u7 P$ r/ {% l2 M
// DWordConst , x; l+ Q7 R  Z
! Z. ]& C1 ^8 V. V3 K
Status* E" X% }6 ]6 W# C, i( |( t
// DWordConst # i. H2 b- S# t" x7 @! U3 I7 ]3 Y
},8 d* `/ D' M7 y2 `2 e
……
- e: u; A- t* s" \$ V' Z: v}
3 a" H! l6 s% a- t$ U! f
" P  s% o% K- w* e+ n1 LExample code 如下所示:
' K$ i/ z6 _( D8 K2 E3 w' X
9 Z4 p2 ^+ t3 q7 h. f( F8 N. E, L( i4 kMethod(_TSS, 0)3 I& N( e* Y" x# n4 Q/ T
. t+ p: j- D3 R2 X: v7 `0 r, [
{, ]9 U+ _  N  A% c
5 `# @7 w& J2 v+ n2 Q
Package(){100, 1000, 0, 0x00, 0},5 ?$ j8 L+ Q$ w) F

2 B& S( t9 @7 B3 u3 jPackage(){ 88,( [7 |% E" S1 W) j0 b
875, 0, 0x1E, 0},
* M6 [! p2 l% }: l" Q& V  e3 d. z5 M$ Y3 d4 Q( d! l4 Z
Package(){ 75,
0 J  h) w7 E3 n750, 0, 0x1C, 0},
; Y/ e( ^5 p  l+ m7 {, T7 ?4 W: |& J, O8 }* `9 |7 A' b
Package(){ 63,
6 v$ M8 ?, X. |9 y8 i: ~625, 0, 0x1A, 0},
; H+ W+ W9 G0 l, q  ^; P3 s+ m) F; d+ d: N0 P# s, u4 F3 H
Package(){ 50,- n7 `) s0 o! {* O0 \" g2 Z! F0 Z
500, 0, 0x18, 0},- R$ x$ m" d2 B" [/ M
4 X& f8 O; B: T* |$ S
Package(){ 38,0 [% m9 z, O& T6 D) L
375, 0, 0x16, 0},
0 C; ?2 t* ?8 e+ |
7 s% G0 V% P; cPackage(){ 25,
$ ^" e$ z& y* x( m* S# K+ g, F250, 0, 0x14, 0},4 i) ~' d; P: T( P; ?! u

/ x6 V/ H8 h  J$ `( Y4 gPackage(){ 13,
- h5 j5 \0 N/ x' z125, 0, 0x12, 0}$ `, V8 E5 u/ B( N' F! `9 E$ a% v
. H- J% o- x8 L9 ^
}+ C5 B$ e5 H9 T4 @( F* o# Y) d7 _* N

0 e% n( A: `( a1 U8 m8 S" E$ r: ], l: Y/ W2 H& P$ B
l
, n+ h+ a1 Y  f  b) G8 _3 e
_TPC2 J8 u( {+ p/ h! }7 O7 ^2 i$ [8 U
8 P  j: o2 `5 v' I3 Z
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC0 }8 S+ j; J  q1 f5 g

& r6 u/ p9 U: m' N! C/ y- ?l
# G) o' M& a( L; X
_TSD
# w% I4 c9 N  g
& ?+ b- a$ l- j9 z: Z- vT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code8 H4 `. S- j2 W4 @5 V% Y: x
" Z0 [& C6 b/ M5 K. @, p  C  h
Name (_TSD, Package() 2 L) \* ?, |7 K5 N) t

# s0 |2 ~% g- }+ ^; Z, Z, k( d{ % V% |+ a; P* w$ W, @3 I
4 m9 ]) j, l6 _4 Q0 X2 R
Package(){5, 0, 0, 0xFD, 2}
- K9 j/ N" V3 V// 5 entries, Revision 0, Domain 0, OSPM
+ p2 L, e. ]: P& m- _* k8 eCoordinate, 2 Procs
  d. o; X" y. j4 [8 D2 d7 S
( l3 d! i- X) f: Q
- S3 H; U* \3 Y2 i; F  f8 e}) // End of _TSD object
9 H" y0 i9 @. q5 h3 N 9 o* W" F7 s. v* \  u2 |
REFF:
+ e+ C! W5 n0 K$ a1.
3 m7 H7 p- C# [( f7 ?) MACPI Spec 3.0& g& Q- c) w4 Y- j
2.$ H* i- X! X1 `6 s
Intel Processor vendor-Specific ACPI
, _( a; d* M8 ~/ I / l6 n0 X  X2 }9 F( m* Q
% i- H1 ^* @* S  F1 c$ ]: A( k
That’s all!
8 G  z1 P/ T' }5 k. f# f
  X4 F4 G' r7 ^- ^6 Z/ U% P8 a8 ^Peter7 l+ S/ u, Q3 m8 t" P
- I! G; J% q& l( h! r. k
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 15:02 , Processed in 0.148715 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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