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

CPU Power States

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

# {; s  y# ?; o8 \1 ~  z1. Overview4 T8 O9 A- C2 m. O, ]7 y

# q9 ?. P/ A- g2 D* X
7 K' f) i6 S* ^9 U+ S. W, wC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
  A/ s' P& h& D降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看5 D! Y( m7 S# R4 _
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。! {* o/ n2 d" Z6 g' d/ L( G3 V- ?

% l+ _/ |8 O$ l- z  f) ~- ~) u
cstate1.jpg

% x, V/ C" B7 W9 O+ t) i
1

: Y4 a# i6 j/ Z8 o- b2 O& U, y" ]2. C-state Control
* u% f# W; u  F
2 D6 M+ u+ X3 q+ k7 S9 _+ |, C1)2 ]8 R( l" b- J; l4 s1 L% F
Detect & Enable C-state
. `; ~- l7 [! [6 Y9 j7 u' R, ?
, Y% s2 q/ Q3 FBIOS可以通过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的支持。  b9 w( _( F- K3 T

8 _2 g; U! ~7 A9 I* a$ S2)- l8 i: _( \6 U- V
C-state Basic Configuration& G; M! G0 k8 o% v
通常情况下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)。$ z7 A# j9 B) ~/ x3 J6 v

3 r- ~8 o8 @) U5 K0 s* s3)
; Q8 j5 k9 E, s! E8 nACPI Structure For C-state6 X1 {9 L- x; d/ w  j
# |/ V7 M& X0 c9 F! ^) f# U" q; N1 [
l
' s' S  R; {8 D) |1 B
_OSC & _PDC; D0 a7 ?7 H- k/ B  D2 W2 }: s
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures) ^3 c5 }1 o$ \. h
l
2 t. l" u0 z# f9 g% [( W4 ~
_CST# L4 g) J# [2 H+ p: L. q
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:3 w$ t6 l% H, r
CSTPackage : Package ( Count ,% r' i: I- |+ n; V
CState ,…,% U2 `8 \* s+ a: \5 q9 }
CState )7 z( v, V! T$ @1 m% t7 g
其中Count表示所支持的C-state的个数5 Y: f% n0 i! C. D' G
CState: Package ( Register ,' p5 v: w) H) v
Type ,5 |: i" A; G4 J& u3 W1 S: b
Latency ," f7 L; h/ h; P, J5 B
Power ), }  Q, m% ]% L: w" D+ c6 C7 G
: S2 }  I! a! S& Z
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 C37 p4 a+ \: A9 [- g
; _- w, M2 p. C# x5 N/ y6 G
Name(_CST, Package()
4 V& h9 _5 D2 t2 t- n2 j, G( |; M
4 ^2 `8 m0 }! X$ i- \
{
! Z' y9 c% p8 z0 C0 {) K4 ^4,' v- ?2 ]/ w: P( s5 m- t8 J" d
// There are four C-states defined here with three semantics
! X6 s3 ^! B8 X' M* Q" ^# H

+ N+ E+ |1 z/ V) `, g// The third and fourth C-states defined have the same C3 entry semantics1 L! ~% r5 }7 m7 b

. K. _: @- O6 lPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},5 t/ {% L5 S: B% F* T
1,& n% |0 A( C3 O' h4 N8 _
20, 1000},
$ l* N6 |; \' s3 f, l9 Q0 e9 k

, u0 M' j" l9 }) M3 t1 `* O: d. @Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,0 H! o# x0 j6 o9 u+ Y4 \9 c
40,; u& `) Y% `$ l. v- @" j# t
750},
$ {; t. m" X' M/ K) h
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
  [% z* U2 h" |0 ~60,' Z" I. n' G. A0 N
500},

; l, Z  q& |: _2 _* L6 [9 OPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
8 i0 V+ [: K+ Y5 S( p4 T250}* X( w0 O) G& S. B0 g" ?

+ v+ B# f# o( v4 d& ?}) - c' R' o- U3 s8 Q
7 z: f3 X* ]/ D: [( r
l& i& p2 Y3 Z0 t
_CSD
. S; R1 q+ |4 s% b4 u. n( t$ o, b
( w4 t, b+ T$ |6 KC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。3 [1 ?! X2 u# k$ K& ~- p
+ o/ B4 ~. z, {* U( i0 n( h; R

- e1 d8 t0 E/ X# N) F- H' P- V# q: H+ I( g. U) U. G
% d  L$ V4 }" B4 d. E) G
3. P_LVL VS FFH
. U0 \2 G, ^, R8 E: B7 G: i7 v6 {& h4 I* z
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
+ B) D6 {8 K' S/ s: c7 O8 l5 l0 bFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
8 _  a* V' a4 j/ [+ d( s- i4 C1 B
2 b# T/ f. J4 S
gas2.jpg
! [' J! O7 Z! f3 v! _
2

3 L! |  j4 [# G7 L# K! ZOSPM解析到该_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的一个例子:7 O6 G; f0 W: o1 \; X! M: T6 l
Name(_CST, Package()/ D8 n  R. t# m- K8 n2 _. ~4 N- q

( H: J7 |' K& |( t4 z3 K{ ; `% B5 E+ f6 k' X4 z+ k
2,
! w' t% z& Y) f6 @1 |// There are four C-states defined here with three semantics
$ J6 z9 G2 t2 t3 ?

. ^) u7 G7 q/ z: R$ z. g  d' y// The third and fourth C-states defined have the same C3 entry semantics* \; C4 F& R% f" f5 D* X+ G5 S; R
% C3 I% Z1 j2 Y4 X, z
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
$ a7 r( j  _0 R" d0x01,  j" R3 \- j1 ?+ G6 b% B$ D, v/ M
0x03, 0x000003e8},$ C0 `( k7 q5 z

/ X$ \0 M8 P; K* \  A9 W' WPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
, Y/ B% x; Q0 `. x; j9 i0x01,
* z9 L3 ?" f4 q5 L! m* v8 c& F: X! e0xf5, 0x0000015e}

- M, k+ c2 N7 z+ ^! F})
8 U4 n% R2 {2 v; _8 b- j. ?! p9 ]8 \4 p6 H$ J
! t9 g! F( j, e$ P; Z
REFF:! u6 p6 D8 a9 d7 j( J
1.: p* I7 ]% t* g/ J' S% U1 g+ w
ACPI Spec 3.0
  ?% ?3 o0 ~* ~! I' C2.
/ E& r5 z( q5 L" A( MIntel Processor vendor-Specific ACPI
+ s2 N1 G* p- ]# @$ j! C1 D' ^& J" c% c7 e: |1 N; P

" r$ h2 E- M9 c- f0 N- IThat’s all!8 k  r$ i9 r, ?% U) Y
; s* F6 C9 S: A1 q5 S
Peter
7 z2 d" q/ M$ G% N9 t! i. ~
% K( L9 y. Q, _5 _# h; N+ r+ H" b2010/9/20
( t( s2 K$ r8 ^" M6 r  E
9 D1 ~) ~' g) T7 H' D+ O: W; R& A[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
6 Y1 E; U1 B* Y7 k: [3 n
- ]5 V2 Q' C# I3 [( A, HCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
( P0 _4 l* P' W+ r9 P+ D- T8 B( `Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。- D. q6 I8 U- u; F( f  R, Z  |7 Y
- V4 N4 r3 c7 A; ^7 ~
2. P-state Control
, E; v/ t  l- e9 z8 n) K. F
- q( V2 A5 N, `, V" S1)6 M5 z5 M7 U& Q1 M7 W
Detect & Enable P-state$ E/ z0 W/ N' S4 J

: w( n6 z1 G& B6 CBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
) b( R7 _: b% Q: W 1 g+ j; L; J' w6 N+ C
2)" j- O1 \) J. \3 c7 H
Supported P-states
( a& N( E) J( M! K
2 U- H1 G4 R' d; l: |+ |/ q8 hBIOS 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& {1 i" M8 L- m) i( f' c
1 B0 ]$ R2 _; T, J' |
MinRatio = PLATFORM_INFO" H, {* N' y/ c& K$ b
MaxRatio = PLATFORM_INFO# L6 T( T! J) K% l2 E8 Y* X
RatioStepSize = 0x01
$ @( h3 _# Q8 `NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1+ R' r; p0 Z. [4 D% Y. q1 J

: ]% _$ G6 T% M2 dIf(NumStates > 0x10); t# v9 c  ]) k
{8 J# X; s0 G3 |; y& ~$ I! M
RatioStepSize += 1+ u% _" m4 ^6 }( E3 d- t4 G/ j
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1+ G' [5 r; S. K4 I9 d: G
}/ B# y" }1 M- g4 _5 I/ S
3 r; j; f0 G- p/ a6 W% O
3)
1 e+ b0 ~- Y! t0 qTurbo Mode3 A; x- k$ H8 Y" F) F3 K* {5 z
* E. W2 [& Z0 G4 k' ^. L1 Q
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 ModePerformance9 V# q1 V" ]0 y) {7 @4 z

9 P3 j- a( m- C* z4)7 [9 X. J- E: R1 n
Over Clock' S  Q& P) Z0 h2 [5 z0 }

" d2 ]# }2 z: M某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
4 w3 }& g/ e3 b , R3 f, H# n  `, @
5)7 E/ |5 U+ L4 `: G. X
ACPI Structure For P-state$ n- ]- M2 W  F0 |# ]
# |: x0 v; _  q5 x
l" @: |" L5 K/ }8 s7 ?# O
_OSC & _PDC
: z- U1 y; S* R: v  `% { 7 f  k  L/ ~+ i
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures# T( t' a2 X$ e0 v
$ L8 P8 I0 R9 e
l3 x3 h& p8 z4 Y' ~8 u/ Y& P
_PSS% x! g; X, Y" ~1 p- t+ v. q4 }
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量8 E: k' a' g$ N& z$ Z
并且通过一个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做比较9 V4 {4 R- `# I% ]2 g" v% D
以确定P-state切换是否已经完成。) V( f" y& {  Y' R
" U% H$ m5 E/ f$ Y
Name (_PSS, Package()
6 p( F  R! w5 c. @6 T, p) |{
3 Z5 |1 w  y3 n+ g3 P) R// Field Name
4 v" L1 Q: w' w" vField Type
# W4 {; I+ O" Y
4 E4 Q, J4 B  f: _, O. G! G* G2 ]9 z' A! u5 n- O7 D- J# i

& d, }" A; }. c6 F- M8 Z5 LPackage ()
3 B: T' j) A4 y) w7 d1 H' p// Performance State 0 Definition – P0 ! j' O1 E( y' l7 f+ V; }8 `3 h
" X0 F) Z! W4 e, N8 i" a$ @
{
5 V5 E0 d! r) V" z& V- j2 H
/ R2 A& {# P) m/ q0 O5 t- U
' o) j7 ^/ x( D# NCoreFreq,
7 _  j4 D1 n3 d  T: n7 _// DWordConst ' w6 Y1 `3 [; c% Z" z; W& _, `
' u0 G# a8 C  n/ h( l+ e1 F- {# W4 j

0 s5 W" N$ l$ @# [# }1 E9 aPower,
9 X# }, {  Y: A& [3 t9 `// DWordConst 2 d. P# y/ a2 [6 u9 g

$ e: h- g' C5 o7 p2 J& b, ^TransitionLatency,$ l0 E! ~2 G" c4 \$ R+ s6 R
// DWordConst
& H& [' ?. E( {3 o1 g" Y' O3 }9 }, ~9 H0 Q  W- t3 f1 I. M
BusMasterLatency,
8 g: Z# e+ J) w9 o, Z$ O// DWordConst 9 ]& U2 N) U8 Z, f

; h# M" M# z# R* S, d+ W8 ^Control,
. f2 C3 ^7 V' F5 S3 |// DWordConst
) ~' m- I9 n2 x1 y0 M; l2 Q" m6 {. U  U: y
Status
' Q  j5 h) F& S1 l8 x& g7 z& R) x' p6 n) h' w
// DWordConst ( C& _& i9 Q2 Z* t
) r) S0 W" z1 S/ ?
},
3 W6 f7 W  `( L# W% D+ r+ @# m, `: j% C3 [5 c6 V; l( R/ e
. : _6 y5 o+ m, L
( A, a. A; D3 u( D3 W
.
- Q7 V# M! Y, I+ R7 e7 R1 C/ U8 T1 g0 b7 N" z' M
.
5 b9 r5 R; r' G: J: j}) // End of _PSS object4 e6 h! ~' c# B' \% t7 {
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 / f' h+ F' D9 h7 S$ x  Q6 k
+ k5 L, ]8 [5 Q/ |% i
Name (_PSS, Package() + q: B; J5 D/ u+ M' Y+ Q

0 I& w* k0 W+ U1 ^6 l0 N{
4 t5 R4 ]( a  N  d; m! B7 v1 u1 l
7 U2 t( r6 d! [- q: E  ZPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
" J! y, f. s1 J" b+ p
9 b2 ?9 m5 V1 l( ?7 P) O# HPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
) }- E- x! R" F  |: [: G1 _$ K
/ T0 p% Q3 z) Z+ x- U; z5 ?Package(){1400, 8200,* X, o, a/ {, ~
10, 10, 0x000E, 0x000E}
- o# F1 o2 d' n  h// Performance State two (P2), ^5 s7 G/ w5 d% B
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
' l/ @* V2 ^+ m. PPerformance State one (P3) % [1 Y2 P5 K5 Z; f1 E: L# f
0 r+ |+ p0 i' @! I8 h8 x% C
Package(){1200, 8200,
( S' e& P# u- S: M3 k- C10, 10, 0x000C, 0x000C}
4 k& e1 O' _( W7 J$ X2 g// Performance State two (P4)& K0 \1 N+ }  o. S  H' G
! r8 \4 a& R) _4 e' r
}) // End of _PSS object
; B+ F3 C/ m9 B
0 \4 D3 h" J8 A& |4 B另外当该平台支持Turbo Mode P0将会reportTurbo Mode
4 L3 _; a4 O) ^: A - z8 y7 t/ [" F  d; X: D$ t
l! m4 d6 w/ ]3 Z7 ]' A
_PCT
6 K3 c" f7 ~1 ?/ y. {2 g
/ M& j  L9 b6 e. @$ H8 APerformance 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的方式来进行。& A- @+ w1 C8 X

: P! Z  d; w8 r: E# S" |* U! xName(_PCT, Package ()
; `  u& ?8 E; L0 c// Performance Control object ( ?9 N4 y, F3 ^9 N4 Q& M# P
( ]7 ?: [& k0 e" O  O# a$ b
{ + g' h! M& r# j/ {4 B) r+ p

' c* ?; Q3 W% s% aResourceTemplate(){Register(FFixedHW, 0, 0, 0)},$ ?; B' _, ~* C
// PERF_CTRL
# I" a/ j/ u* C9 Q6 H' S4 m" m( U. ~4 F% h+ A3 m
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}1 O1 z0 N8 u2 z7 v5 y' Z
// PERF_STATUS
+ j4 ?, h  S6 g5 @; ^$ X5 H0 t& D/ j; x& _4 [6 X, B; I
}) // End of _PCT object, \8 z: E! }- D& B# @

, p1 _' w" a/ p! ?3 k' Hl( r! ?' J! P- W
_PPC
& o, F/ O- a' W0 H# ]0 G 9 j1 z2 U' h4 J2 D, 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
  _5 g' d4 ?! p. K3 I
3 o1 |7 P$ s; }; y9 L% s1 g. M& OMethod (_PPC, 0)
$ o1 @' E" i' h% K9 f2 T* ]4 H// Performance Present Capabilities method ) B3 q% Y$ g- o2 h
' r0 n7 X# P: Z. \
{ , y" ~3 U- q5 z5 g

7 w- J* G7 C1 f) UIf (\_SB.DOCK)
, [$ U$ i- ?! \% Y& ?) [6 [. h9 J1 f
{
2 T( w( u+ B5 _1 Q1 w% B+ Q
- R  e+ M; [# U. O7 PReturn(0) // All _PSS states available
& p; P$ D! O9 g6 @, h
; i! Y8 D' r% n+ V- ?' Z
$ o5 G$ Q3 [. w/ j0 K; N% W) o: }}
7 I0 C0 Q0 n+ Y' ]. W9 S+ I3 z' x( |; F. Y; f- Y$ o
If (\_SB.AC)
0 y4 a! r/ ^; U. l0 A0 E4 t) \( Z( N# `8 w/ ?( K% i4 Y
{ $ r3 @: u; h3 n& L% n: w5 w
+ c* V( k. Q' a1 @  n; N4 O
Return(1)9 A$ q3 k/ l, a0 m8 A/ _
// States 1 and 2 available 7 V0 W: |, f0 k( o( a

+ U  H" V- ]- ?/ J} 6 |/ O" _, P3 V; s
, A: J. k" g& Q# }( m- |2 Q) f
Else
: ?- z! m  e- Y; }8 \! l7 d- H. Y' J2 z5 V8 F5 t( h' ?
{ # ~: }/ h: G, s7 }  {
' U; O4 F! k- p6 [
Return(2)
, e- c. Q# ^) n. c1 L1 i, ~// State 2 available
+ g5 _: b) C* Z5 D, f8 d% o  P* p1 t, _. P1 L# d4 H( W
}
) P. H" u0 S' i9 r/ }6 w
7 A. w2 b2 v/ t- K8 V} // End of _PPC method, P: H" Y" L8 H( D

* ]2 N$ P! B# |  b" cl
4 X! O9 }, y. Z# e6 m# {5 q/ U
_PSD
9 x) s1 s: ~, W$ q9 C
2 E5 K& A1 u# N, M. h; {P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
5 I, {. U4 B, d$ Q3 N9 i7 _ 9 D) \: o' G0 v+ K) O; Z; X( m
REFF:
, p/ ?6 G! K- t% j) v1.7 W3 S$ t% ], H3 Q8 |
ACPI Spec 3.0
1 G. e+ \3 a% V1 [+ `- H+ J2.4 I, D: C* n- ^- k% W9 W
Intel Processor vendor-Specific ACPI
% A2 p2 f; d# t8 Q1 b# D 6 j$ H9 D  J" j
/ |% x2 X5 x- L
That’s all!, N2 |! W. X7 F, L
4 d1 P) c$ c  ~! U8 F+ k( W. N
Peter
* r/ P4 Q% w+ e  J+ d8 A
- v  s8 ~9 Z1 l7 B. a2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
  g5 R% o8 k7 F# ~4 q, A" _, J' b
  B/ D! M9 Z  n/ LCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式4 ~1 y0 S3 [2 t& Y: T
,影响系统的功耗和温度。
3 ?0 O% G8 @  }* `9 K
. k$ {" [7 B+ B" b( ]5 W2. T-state Control! F3 n4 m7 x. r3 L/ v
' u1 n8 s3 K% X1 B" b( P
1)# q3 q! T, l; Q3 B+ k) |
MSR Based Control
# D; o8 I" \. r  Z% x 3 F9 ?* `" B* Y: B9 Z3 o9 Z, g. h
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
: J. Q: R+ X: U) Z% ^2 Y
7 w1 g* y( ?0 Y& h2)7 Q% w( B5 P9 h6 d* b- \
I/O Based Control
7 p3 j# A; u) n, l * D( b% p1 l! G: b' L; L
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。/ d# x( J* g3 O' m! X) Z) |" A! \

' U3 E; |( E; l/ W6 e6 E3)$ Z4 q3 }# M, }$ U3 x& |3 ?7 K. P4 H
ACPI Structure For P-state6 i% e: I  m& a+ B& v, j
l
, u4 Q# M2 Z+ j4 S5 a
_PTC
* b( O/ x2 w5 M" h9 U
2 i2 ]3 G. G' ]2 T; k; u+ \Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:8 F0 `# L' r  w% g, H, o* h* k% C
0 h# G, L* _' ?/ I
Name (_PTC, Package() - o, }" {% v" R! P- ^( [
{ ) d- m# s, R$ x, \/ f6 u

, D; Z" e; y/ |9 z* aResourceTemplate(){Throttling_Control_Register},
3 x/ d  L+ Q) m+ G. l7 O- q  r' |//Generic Register Descriptor + |; \' v; r3 a/ G2 n

4 n4 {1 |9 r; R3 ^ResourceTemplate(){Throttling_Status_Register}, q3 G" \% U* V1 X3 w! T# q
//Generic Register Descriptor
9 l9 _$ j1 E- V6 C' M}) // End of _PTC
, ~0 e3 e& q' k , U6 S7 ^7 e! X; A# T- W
下述是一个sample code
6 _" i; ?  v6 a5 u 8 q# l& v: R+ S1 c7 `! S* c

7 ~6 n% @8 v. L8 f" w
//
% ~5 Y) _. T% S
! J1 \# X) L/ q  f0 X4 \// T-State Control/Status interface
  L5 }7 L+ V/ R( E8 n+ j! e- m, b4 U+ b
//
! D' a2 a- G" l
) j5 b1 Y/ x# ~' Z8 f* v9 q7 ?# Q& t0 pMethod(_PTC, 0)" \+ f6 M* j: d/ `
! `& v$ Y, o' N% D& h  O! W
{, K* ]' X: N; p3 T/ G- }4 ]
1 ]9 S  W7 T7 d+ A- s
//' N1 o9 L+ j7 ?8 J  K) v

1 R: V7 k" z' Z0 N, X" I// IF OSPM is capable of direct access to MSR
% ?" u- H& U0 B) O' {! Z; M( D( r: k
//7 ?9 O( V# E8 y; }7 r. U$ x
Report MSR interface
+ {" t7 {1 R! E( c2 L
  j- n$ `6 L" e2 D  _* @6 p// ELSE
5 T2 D7 G) r9 e  t) g
# X; g% j* X4 T; ~3 l0 U" u//$ f4 O8 X# K: |; ~% [
Report I/O interface
  F! U$ @/ ]2 z: {% W# A/ r& c
" b' h, F2 r/ y& ~//
; W  N- [. z2 u) L5 P# G8 w; B  A1 o% f) H- @
//
! m9 i$ `" N3 P# h9 B& c2 m6 Q1 bPDCx[2] = OSPM is capable of direct access to On
, Y8 S. f  Q4 v2 R" y# r( ~! x1 V: m0 n% z6 X) _, E2 f
//
, U: h/ L: z% a( KDemand throttling MSR
6 b/ X5 x; Q6 F( i* a( h
6 g# m. K. b+ Z) s//
# `0 P6 O! F- M3 @6 p) G$ A! o; b7 E2 y
If(And(PDC0, 0x0004)) {' a( q- U' e; U! U: i' L
1 R& s6 Y' ~, I# o. G
Return(Package() {
5 m. J, t/ i  U6 G" A
( \5 f# M9 r8 {1 ]+ Y$ UResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
2 ^) @& L: X- D1 Q7 q8 i3 @8 i3 \5 [9 U
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}9 u; i$ t5 I: T  w# j. V
; u% o& h; a! l% k3 f3 V& ?8 t
}). o. e* |. ?5 [, \& D, i

$ r$ X$ G/ R/ E; P1 @/ ^}
; X" o1 w5 o: c9 d
) t4 i  s8 ]/ p3 o; b$ Z; `3 mReturn(Package() {% A: ^4 _1 d2 f! R1 n# ~
1 ?6 ]' w7 m! m2 |
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
4 [0 L  @3 i4 Q& b" m' R9 |4 g* J1 [0 M) e( g1 z) O( z' H: h
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
  N+ Z% R6 i4 _; w* f( N4 [, H6 n+ @& |8 H; Z5 `4 ^" X$ d
})
9 O! x2 ?: J* ^3 C2 k: _6 B7 p; a+ j! w7 D
}7 e3 \; h( p  `) `7 e! q6 s" @

5 H; Y8 X: X8 y9 b8 Q8 u( T2 |+ M# K! H

0 C, U! B7 V: @8 T2 |  xl
+ h# D2 x% N. J) G# p
_TSS
9 A: G+ B: ^& C/ N5 Q- A$ p% S( }% C
3 u0 ^: N$ H: A! gThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
6 j1 G  F( i+ ^1 O/ ^0 N$ {3 eName (_TSS, Package()
( v7 _: I7 J/ ?  \{
$ e- {) T& H  j: U! I// Field Name
" j/ k# V5 `9 jField Type ' ]! d3 s- a& ~9 _$ p( M) |
! t, c" C: X4 n3 K0 A6 T

) L, ^4 H2 H/ {
# a- J+ u, X, C& X7 e( u# T) j1 iPackage ()( A" {5 Y8 m) h5 D) B
// Throttle State 0 Definition – T0 8 ?- o5 b, r& u+ ^3 R+ Y0 l
1 S0 g4 D5 w+ f: b& @
{
1 A  F1 h! e! `  ]/ |- ]: \
9 H2 P! K: q) j7 d% q& j6 E2 x3 ]- J. \' t
FreqPercentageOfMaximum,
2 l* Y. _5 t7 P0 ?; J// DWordConst $ h4 @% u3 u* Y( z

0 {, [( Q- h8 G+ D1 o# ~: j7 IPower,
* |! V2 A; h! L8 z// DWordConst : p+ R* {" o" N2 V8 T, T, ^( ~# s
3 r5 G+ m+ O' j
TransitionLatency,5 K4 `/ Q4 Z9 ]3 K: n
// DWordConst - D# n; Z: w7 C( H8 r6 B1 Q7 s: E

: C4 W8 `! {) H# fControl,
/ h) f! M9 J8 H0 L5 r7 L// DWordConst
0 Z8 h/ j/ R/ y6 Z1 s: r9 i1 ]/ C, R7 P4 ?& |8 J! n# |
Status
* a" }) c2 e6 M2 n// DWordConst ! w/ |: ?8 i2 k5 {5 c
},
6 R2 @: M2 R* b( Z. _  T……
# X  \4 }4 k! S) R}
4 v/ Z9 t& {  x/ |9 e2 F/ ~% S- F( L4 E7 P0 W8 B: q
Example code 如下所示:
/ L) [7 f0 @4 ~5 h+ [( x; j
4 ]! n1 x# h+ K7 N+ B+ |Method(_TSS, 0)# E8 @+ R6 p8 x- h9 G" z

1 `$ c) U- \6 F1 n8 u5 Z{
: H; _7 T2 \+ D8 ^8 Z
; E7 j2 C4 o5 L7 sPackage(){100, 1000, 0, 0x00, 0},( o- i' n+ q* V4 \' Z& n) f

1 k' o, G# b" ]) ?. H- H+ E. HPackage(){ 88,
' _4 r9 U0 O, B3 [1 T: k. C875, 0, 0x1E, 0},
1 `7 U6 Z& ~5 M7 r
. r- B: A( }' |; E8 s: DPackage(){ 75,
3 {1 Z( p7 h3 ]$ }6 b750, 0, 0x1C, 0},
; p- i& H  ~0 x. Z
. A0 |  d1 x: H9 U; o1 {Package(){ 63,' t. {1 F4 u5 y! l- y  D3 d
625, 0, 0x1A, 0},
3 T& e9 f: l# L& G& c2 G4 u' [# f- D( j  y# j
Package(){ 50,
4 \. D& X% Y0 W8 \) \500, 0, 0x18, 0},$ M+ r0 k1 K% R6 Q4 v
. g* `. ~. f. J  N4 `1 q; j
Package(){ 38,
- w$ `' U6 J; W6 P9 C$ d375, 0, 0x16, 0},
* ^, L4 @- L" [/ ~
& n/ C" [( E, X1 ~9 `Package(){ 25,2 w6 B# u3 N4 B$ a" C5 M$ F: |
250, 0, 0x14, 0},
! k/ F' a! \# e7 [& C: D  u& K$ X( f) ?8 X- m  g! o! G
Package(){ 13,
1 y: @4 T: e; D# N6 c9 V125, 0, 0x12, 0}" c7 J; b. m% W1 w
6 R& E. Y( T/ |' ~0 k
}! M5 u- w0 S5 h! ?( I

' s% i. M) F2 ]" U1 O5 B/ V* F5 O7 O) v' u
l. T6 I2 L! K' C6 ]# ^( P. i
_TPC) K5 v* L8 {; {) T
5 l% p# m0 x8 d7 s1 g& u  C, W/ m
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC& g. }! O0 a# @# B: `

+ I8 O1 X8 ?0 |& Wl8 R8 n) T/ F2 G
_TSD
8 k) C* J' y! R: s
6 Z! Q8 u; c) Z( PT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
1 d/ s% U1 M, j6 l8 f5 x8 P( o: p- N
" w% L. W7 x1 b$ i# w$ dName (_TSD, Package() 6 Y" ]! V, C( G- t) n  Z! G

. S6 F$ w; E% K. o) f{ ) k, j, J( g/ u5 k' G& ?

2 F$ B) V' O5 z* B; pPackage(){5, 0, 0, 0xFD, 2}
1 i$ _' {- S4 o7 D// 5 entries, Revision 0, Domain 0, OSPM + |% d" _; ], h0 O! J' G( H
Coordinate, 2 Procs
; c0 [/ v8 k* q9 J7 `
1 t) c. B9 o+ v8 w9 f
$ R' h. d$ \+ z}) // End of _TSD object  T/ t" G+ g; d4 I$ n
" O* y4 s0 W% v) r& L
REFF:8 N# `$ E" R" @) n
1.4 A* Y/ q$ U$ N0 B8 l
ACPI Spec 3.0
% H9 L* \5 B2 b/ E2.
9 ]$ f) h% Z8 TIntel Processor vendor-Specific ACPI
  }4 u" `3 x4 i# {6 b" o1 \
8 O" Z) b6 n  D$ Q7 N' X
4 q; }% _! ^- _That’s all!4 j- @$ m/ ?1 R, [

# n# t* B1 W- |4 b, _. FPeter) N3 N# K4 \; P, x+ q. T
0 o7 _# c# a3 D& ^9 n
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 08:57 , Processed in 0.098822 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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