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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
- e; o' ~  Q. c  i- |: j
1. Overview4 T: t0 ^! R7 Q: I7 Q; J

6 ^* i4 F) d9 t% j7 f* H) V  |( E& |/ |% U. U6 a
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
2 R- p  f1 b/ @! d. z$ v& O1 h降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看2 c$ |" T, {" h
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。8 i8 t6 ~+ S' K! F

0 G" i  {$ z* d- u" _
cstate1.jpg

. B( }9 {8 e- g2 C8 k, k! V
1
& W& y7 v5 a0 E( ^" m' R
2. C-state Control
, Y$ E! a# \! f( t* N" k  S( V# G2 A" V  k7 V5 A  }
1)
6 [. }' L* X% j$ }0 uDetect & Enable C-state' E1 }9 ^9 d7 ]% m7 |# O# b! O

- k+ Z; z1 F3 ?4 [9 ^2 _: b9 dBIOS可以通过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 c" p6 L! C% ^, F

: g, @0 |3 a/ a1 w7 g2)
8 b- o" ~7 ^( D; g* f8 h, eC-state Basic Configuration. I( ~4 {: h" r
通常情况下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)。* }8 ?! y6 K5 n9 i

* {4 W( j6 d( M( _6 D; y. Q+ ^3)9 _8 D3 u( J( E  }0 k
ACPI Structure For C-state! ^, [- b4 J. E
: d" i5 W; b$ l* `/ \5 U: U+ R; ]9 L
l
, T4 Z# l( m- l3 Q7 c4 |
_OSC & _PDC
  v1 A5 B2 v- H3 R7 O_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
. L4 R# r  B* x+ T; J8 J  c: pl" v% m! J; d0 X. m
_CST
  }, _# M& B8 B_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
: c. n( z+ L* q+ yCSTPackage : Package ( Count ,* x7 |" ?; ~6 D, \. J& B9 ]
CState ,…,3 l% G3 g9 r5 {
CState )5 {( `5 `# x. b% g, @
其中Count表示所支持的C-state的个数1 r; j8 T* o; e) }* L7 S
CState: Package ( Register ,
6 k7 U+ j0 R8 ~1 E2 @Type ,
$ K& H0 ?: `7 a0 `, MLatency ,
6 K, v* G. M, y9 F  `" nPower )
, b6 I6 ^6 I1 L* G
0 ~$ o2 j; ?* G; J" Q8 QRegister表示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
6 f  i; }* N4 a& P7 b% h8 Y0 F& Y: \1 L# ^7 T9 L
Name(_CST, Package()1 S2 {0 }2 e- l& S+ e' H0 b
4 a0 R6 T" m$ O  z, h# T
{ $ V; t% x; z) S% I0 X
4,1 C0 @0 e$ G# c" e+ Z
// There are four C-states defined here with three semantics

6 {& D/ E* e2 X! S
5 i$ ]' b$ |. C9 H8 p// The third and fourth C-states defined have the same C3 entry semantics
0 i$ E, ~. F- m1 R% o2 u3 ~

* q# H9 X9 ^& I! R3 z* {Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
) l' L& ], U  E! p8 ~/ @' i1,# u* C* V" o$ i7 i! ]# E) \
20, 1000},+ X4 L9 a7 _* n# T

5 ~  X4 M4 t3 Y" C0 a- Q4 q8 hPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
' s8 O7 F+ K( N$ k/ ]  o40,! {) s: [' H  T* o7 _7 K
750},
" d" _2 s6 D! H, L0 u: ^
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
& x( G' r/ ^8 |1 ]60,) w5 D+ P' I5 N- }1 m
500},
2 |/ C* a+ w' N! j9 G) l
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,0 ^# s7 n4 I/ \# O
250}
7 p1 ]8 Z; W6 J1 l( z
- U. T; z. ]" A2 H4 |% t( \; A
})   ^* o# I- T8 M3 w/ S  k

% a7 K9 i+ Y$ T- O3 t/ l. [l( X+ C2 Y4 b5 x7 ]
_CSD
7 s7 u& i( _5 }1 o9 d
3 I. c) ]  t. o$ {- ~. Q' qC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
3 q7 `! S& L: P8 `: p7 d
5 l0 i6 h6 Q0 c# b' v( ]5 a) p! f: d: {$ y) I. f# |1 f  c

) K' ]0 C# I3 Y& _, w, P4 }! N1 k% P+ G
3. P_LVL VS FFH
! H& c4 t/ W$ k( d  a4 U! n9 X
8 g  C( y, P- M, Z. c% kP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
: @# p! P. l' Z8 j1 ^6 j, E* k) W) |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所示:5 M7 |# f# O2 W( k
  Z) ?0 X6 _$ p4 j; D
gas2.jpg
& [  _4 e  w9 P4 h! W+ v. ^: p7 w
2
; Q$ x  F/ h0 x" Q
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的一个例子:
9 c2 P; d  A) u' C5 UName(_CST, Package()2 w4 ~" h) x9 }4 U6 |  |8 `' C
+ F  a% ?4 r; u. q* {' h. h
{ # H" x& ?7 g' i5 [& k
2,
9 l, b. t. _5 u" T; `) i1 B2 I// There are four C-states defined here with three semantics
% }& \! x5 i. J! r9 ]
6 n. G. m) ]+ u1 |4 ^( e$ D  O& [
// The third and fourth C-states defined have the same C3 entry semantics( e6 Q+ z" h( h( R. i
& N6 ]9 O. t9 T  t
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},* O4 U( L0 T, z& d- [2 u
0x01,
% h2 \* s8 Y* `3 K8 o. E7 Q7 b0x03, 0x000003e8},
9 J, x5 ~% v5 G

% o6 r( {7 \4 bPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
  g9 n# X3 g8 s% E& O: e3 W: r0x01,
9 ], }" P! x$ H$ t1 T0xf5, 0x0000015e}
7 E, @) ]& _1 {
}) 4 l+ {8 n% ^' Z7 \

. u! I6 W; `3 b- G/ z% y) E, ~
REFF:
4 a! D% [+ G+ f3 H2 E, \1.
. \+ A0 Z7 T/ B, [ACPI Spec 3.0
7 s8 F) d9 j5 `0 H+ P* q6 X2.# W' I( \/ O4 P" q
Intel Processor vendor-Specific ACPI
, |- \* P  W+ x9 ]6 `0 J. _( G7 D( R+ l& q

) Z5 t8 _/ z- G) MThat’s all!
0 _! }8 w& \5 G" U  I! L1 H' b% Q- ?3 a( S* F1 P
Peter2 P( G8 `. H3 k
9 N; d8 I/ F4 E7 {4 Z0 w! F8 }( Q
2010/9/20
. a  G( y) U" U; j/ P. r7 c
) ~; J& t( g( f7 G$ K[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview1 I. u& Y6 E" C

5 \+ @! [+ e4 o2 j2 ICPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
7 V- j4 p) ]( v8 h, @; JEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
' Q8 S  a2 @. c 0 J9 B5 Y  r: {& ^) @
2. P-state Control
; ]' F! q( M, Z4 J
* q' t: d6 `7 {" M! j+ M  l8 E% B1)
+ r' l2 t0 G9 yDetect & Enable P-state
" q" ^  D3 r8 i' p$ B 9 I5 {) D6 V7 z8 e) W
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state; I' }, v/ [; d1 z9 V, z# t: H

# ?( \* m! T: R+ b+ E6 k. ?& T2)
8 e8 q1 [3 v% @& U) JSupported P-states6 Z0 {) v3 B! j" m" s: u3 l5 l

0 a5 w% a; z# oBIOS 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固定是100MHZ7 l2 q* L+ A. n5 ^- l, u# i3 G

# B! B" c' o3 t% a$ T% gMinRatio = PLATFORM_INFO3 m. |/ M: g$ g5 R) c9 F
MaxRatio = PLATFORM_INFO3 s9 y* X: n; f/ B4 S
RatioStepSize = 0x01
' {: _3 ]9 l! J8 P: MNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
' c) F9 x# b4 q& C; x" Z
8 M( }" v. K( M' ?6 J4 `9 g8 C4 \If(NumStates > 0x10)
' ?# r: U! q/ m' K{% l* g; w/ a. s1 @
RatioStepSize += 1
# t* b6 t6 v  E: E( ANumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
1 ]) }& W. K0 w* U' r* J}
: }, [' Z; z4 u& B! ]" T- ^9 K
8 ~' M: E8 h  `% R3)3 B" B% r' B. s& n/ L: B% g: R0 s
Turbo Mode
1 l5 U1 N/ J% ~: e/ Z
- r& L3 ?6 v1 Z* A  K# LTurbo 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
0 b. c# k  x; k( |
* D4 i& l( S5 s5 q) v+ R) L. H4)0 B& c$ d& u$ b" ?9 V
Over Clock/ C# O5 A8 G9 U, c3 q
1 I9 y4 j% f' Z8 [/ O3 R" a
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
1 Q6 b+ ^7 Q) @
% S5 f1 F; z/ a2 ]+ z1 I) z5)
2 U! X3 X/ p: {& M& YACPI Structure For P-state
! H" L$ k9 h& | + V! y# a* D, U6 V6 E
l
3 E) E6 g  e: L7 T
_OSC & _PDC6 i  x, ^2 E8 Y1 m  M/ z

' l, d/ I% ]$ k! g% J* V2 A+ s_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
0 p+ V9 p) r% D5 O. v
: ]  s/ k& {: Z: j$ w" ql6 v6 J$ L7 Y1 w" l1 I7 ^
_PSS# p! e6 R  |2 R: {! M0 V
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量& }, I* F& k' w! s  u
并且通过一个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做比较& z& f3 `, _& i2 S& P. B
以确定P-state切换是否已经完成。
6 T, r+ a* D& A' }9 b" ` 8 q( A" l: W) }5 `
Name (_PSS, Package() " j; l1 a; a5 A7 w7 X8 f. B. m% e
{' S. j2 ^( s2 a- F: D) Y
// Field Name
- L( _2 s3 x9 V0 B0 U$ T# zField Type ! n! e  X  g. Q( z. P. _! X% z
9 J9 }. A# P8 C& N" `, T
) t( S3 v3 S( {1 K: G3 A/ G
7 k- {) ]' p/ N9 E5 u8 O
Package ()6 x( r" U. R5 P/ d7 p2 h1 K
// Performance State 0 Definition – P0 + m  k8 {3 y& P& r

, b8 V( b5 [" y( l3 P{- M. f3 F5 u5 `' b' M; I

: s' K& z# ]& S+ y( D
: E0 O5 P* g1 a0 t" m) _$ jCoreFreq,
0 \7 Y2 O! J: \- t// DWordConst
" m# y6 e0 k4 V6 Y2 \, j9 \! H; p! O+ v+ h1 y2 ^0 p# {

* n7 c& K. j6 mPower,
/ [- n# @1 Q. P// DWordConst
0 ]. J8 R' V5 j* M6 ]% Q1 G5 N  x) r) w2 Y
TransitionLatency,9 W) o  P8 U0 ?) h. Q) B
// DWordConst 2 p: @$ V. Q& z! R$ w

- v# ?2 L& B+ ^. rBusMasterLatency,1 Z2 f- y6 z& B/ N2 w9 N
// DWordConst # R6 Y$ A$ V2 D- N7 c5 Q1 V

2 Y( N' k+ ~9 s: s" _' I% h  c+ R8 G# L8 w4 ZControl,% h- {. i4 j4 ^* z) m
// DWordConst
$ P* s& o# @6 f) p' t% S' F  b5 [9 N4 }1 c+ M
Status8 h6 m/ d3 ?9 H& l

' A* o- P% D  u7 y/ m, v" L& c! Q) j// DWordConst / ~8 _( b+ X4 j# h2 E0 {# Y3 E
  E$ W! F# e! P  R, |  l0 J: G  H
},
0 F( C" A$ ], u) ?- ?3 J3 T7 t& R1 a9 q! M4 _
.
! \# e: m2 D% Q# O9 a- a3 l
# s- ]" p+ |! Y/ {  U* C  l0 a. ) B: {7 r! v! \, k+ v2 ]
4 M, R6 V0 H% C3 J0 }, S% N
. / q" \! E; X1 W& ~% D
}) // End of _PSS object
/ U1 h. S$ |* K/ L前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 0 G3 H5 N9 g& F) }) w  R  }
+ a) R2 S! ?8 M- L& `8 s" t: ?7 d
Name (_PSS, Package() ! E, `  n6 y& V1 a
8 P0 u. o5 R. V+ {1 X
{ 5 X- a# e8 G* D& |9 u2 F# ]3 C
8 q5 @0 a% M" ?8 O9 G% J, V, g" Z
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 4 U+ Q& q/ x7 L' ?( N7 Q
# C  U! G, n; i+ E! M/ |2 e% A
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) + g$ e0 `' D% K% D8 Y; P5 Y; A

2 o$ `, i8 A" C0 [2 aPackage(){1400, 8200,
5 O8 O( c5 d  k' j/ a+ F( F0 ?( @10, 10, 0x000E, 0x000E}" q+ |0 _: M6 Z# d. E( b
// Performance State two (P2)' W" T7 i0 D" E5 v9 B
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
; \: }4 S% X0 J& y  g6 n+ C& A: LPerformance State one (P3) / y/ J. r6 ?, T* ?

/ m3 l0 k2 z! V# e  j5 \Package(){1200, 8200,
& S! n; `- U. z4 C6 `$ I; e: _" P10, 10, 0x000C, 0x000C}
$ x9 p6 |( C2 \" @// Performance State two (P4)
1 P8 t+ R- F/ @! E) }6 ?
- J/ _+ ?4 k' A: m" g2 \}) // End of _PSS object
; s0 E, l0 ^, v- D
5 U8 W! G- ^3 N7 ~" ?另外当该平台支持Turbo Mode P0将会reportTurbo Mode
9 O9 G4 b5 ]5 j0 A; G9 Z$ j
( o" \+ |3 `5 ]  _: T5 `; L8 u2 h5 p1 Z" {l" ], j, b5 m- ^
_PCT
- o5 |  w3 g" r/ Q! M . f0 V1 W( @, W0 m( @- g& G
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的方式来进行。
1 Z/ i& Q5 a4 W6 Q, W' d+ u 9 p6 P+ f  L! f& G
Name(_PCT, Package ()0 R* N# Z8 x3 q, Q6 B4 K8 G" v% j
// Performance Control object ( g7 h( H( {5 a3 Q) i* [6 X
- z- I% l! M5 ?+ z# m5 G& z- E
{ ; }7 s; Y( v3 r* e: M8 F
+ {' E, Q6 |3 r# d# P% t. M4 M
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# b3 R( H# L0 c% p, N1 V. d9 W% @! V// PERF_CTRL   `) e: `6 D3 u$ B1 w
& N) C8 d# O3 g
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
3 A1 P8 d1 ?( s: Y* ^/ x% A& {// PERF_STATUS 3 ^3 `# S  K; {' ~  ~7 D2 U" l
* c$ W% _, P+ Y/ _7 d* q
}) // End of _PCT object
6 W* c9 d6 i9 l6 `. ~" W8 ]0 P 4 b$ E( |6 c4 v$ \# U4 V4 a# t
l
  P1 p( H* U9 L- ?; w
_PPC, q7 m$ P0 {& N* `- |

2 g. I6 [, I/ I/ j" j; NPerformance 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" a% s$ U+ a* O- y* \
6 e$ z) [0 s# x6 G0 z3 _, w$ X& |: _
Method (_PPC, 0)
& q) J- ]; b2 r0 H// Performance Present Capabilities method
; z  ]. q" ~" E) ~+ d
. x3 t7 b3 \. b5 o{ ( `# ^" n- b  @) g

! ~) Q. B, U: Z' u! \) _8 z7 xIf (\_SB.DOCK)
1 D( c! R* h$ x6 I$ p4 a3 X5 D, Q$ q2 d1 d2 Z( u' J& o
{ " U  Y* l2 [% \# v

- E, o+ _6 E7 TReturn(0) // All _PSS states available
1 t4 G9 `1 `4 Q7 N9 ]* o, h( M5 v* d* y3 }! b% m% M
% }/ b/ D- Z9 Q
}
# o" f! M0 W# z/ m6 [) r4 f* N- f( `. I9 \9 u! w7 a
If (\_SB.AC) - E- L: [3 m! M* A# Y$ B+ Y+ U

: G( p4 z0 d* J{
' w% b5 t, S9 X  x9 K0 U% z& k2 r# ~; I8 _8 K' L+ R- {
Return(1)
: P* w) Y" ^7 G$ }// States 1 and 2 available * p* L6 _7 Q- _, d: A

2 s( A# W2 r0 ^% D' r+ i% L}
$ ^$ B% j% m$ y+ p+ U0 H* z
3 u% u$ j+ n6 d% sElse / U: t- D2 |& Y& W; T% ?/ w7 s

* Q; z' s% \6 v, o/ F{ 4 I7 s# ?4 k1 y+ C5 B2 t

/ K3 L, H& G% F2 h) ^$ cReturn(2)
- Q& {. v* s0 c// State 2 available
2 f5 a% s) |2 m8 ^* s3 R
: ^9 o- C" J* u1 ^  [}
- C( ~$ }: ^; D4 M# m1 k% @
( a3 _4 M! `- ?: D9 q! F: }} // End of _PPC method) f5 b7 _- T2 G6 W0 `* D
7 X# L# S- V% }7 d3 m
l% b7 }0 P2 j8 Z2 n7 \( P
_PSD5 I! E/ [* W" [. [

, c; K1 |& @! v0 ?3 n  [. r$ l7 {P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。2 W# q$ ^& _; x9 p+ V- f/ X7 Q
2 O) B5 q4 u. [! k4 `+ E6 H2 S
REFF:, S2 L8 a  q2 K1 V5 g; A
1.
: l/ |' f+ ^7 M, ]7 g* `& ]ACPI Spec 3.0
6 `  r, V4 Q6 l- t' R) F: L2., B. a" u& D6 ~$ D7 S4 T1 l; k
Intel Processor vendor-Specific ACPI
0 f# b1 {- k- |* g 1 b) d7 s. C9 j3 n. F: C
% R, g6 z0 C! \' g: f3 l5 Q
That’s all!
  k" L" K: E% V$ h
9 X6 @, {  v$ S! q* RPeter0 g- `/ s; t. {( T* A" T
0 f$ F7 E, P: f9 e" @3 |
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview4 s' d  W+ U" z0 W! ]

6 @5 W+ q8 J& z% B9 K# B8 KCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
6 l9 H2 p- U& [0 o,影响系统的功耗和温度。
- l8 S/ `0 B1 r+ X ) P8 d0 S$ N2 u+ W' M
2. T-state Control$ D, T: j" z. V0 ^

! S; ?3 H# ^# [/ k) |+ d1 v1), a" I( F9 p0 N. r2 R
MSR Based Control
$ J, E5 O4 p, F" |- W- A& Z! [   ]' \* u( w# C; j  m, O7 |
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
: |, n+ B' I" I6 D  j + B# _% e. z5 \8 ~  b
2)
( ~5 Y+ ?1 y* {+ w- U- dI/O Based Control
! M" c0 M- W8 k/ b7 c7 | 4 `6 g3 P" d5 |! {& c
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
8 G( K5 n5 N7 t, u7 b - S$ U. P2 c9 q& Y' b
3)4 n! B! I) x( h. g' K) q  T- d7 R4 q
ACPI Structure For P-state
! ^, {$ a8 ?. _+ l! q  c5 N% Fl
3 r3 s  |3 ?8 E( V* P8 O
_PTC6 _1 ?2 g1 R/ N
) L0 F& ?. ?% {1 F$ }+ N& u  O
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
9 S: J  B. W1 i! u7 f" I/ e # x2 s; k$ x2 Y& B% y% L7 t
Name (_PTC, Package() ( v" l5 n) V1 T
{ ( Y! F! A- d. l  X
- S* T2 z7 _0 K
ResourceTemplate(){Throttling_Control_Register},0 S! S4 `  o3 R0 v  L
//Generic Register Descriptor
1 g$ w1 U" V/ ?1 T; h/ s
/ D' Q. u" S# \& L9 S: j- RResourceTemplate(){Throttling_Status_Register}
- L7 X* U9 x5 ^0 o, }  M8 u//Generic Register Descriptor ) n. i4 M; d) \3 E' b3 h
}) // End of _PTC' L7 j; J6 u$ A9 V
$ a1 S  g3 M$ Q% U
下述是一个sample code; A' X( H! _& s/ O9 Z

3 \- C2 O1 M: |# p8 I8 |
% y0 C/ V" U- ]
//
" |7 T2 G& w4 U8 t4 f$ Y" W( k+ a# F4 [
// T-State Control/Status interface
* y; ~9 z) c) }+ W* g8 `1 \6 p% u: q2 Q2 M4 j/ L
//
  g3 |: x. R7 @/ |# v
) X9 t8 \& s( ]! t- F8 p: oMethod(_PTC, 0)
1 I7 I# x" m( K/ I; W. i. X1 [& ]0 W  |5 _9 d4 [3 s
{
/ b: p& N" D" d, n+ u$ P5 G, z  v! F: H7 H- N
//2 I  H. P3 O# A4 `
0 Q% {. ~: p2 T' X
// IF OSPM is capable of direct access to MSR
+ C, ]1 F+ S0 d! f+ _
" @  A! T( p  Z( ?0 ~//
2 p) K: }+ d& v5 K) c3 lReport MSR interface6 j  @1 C2 ^& [  X5 ?
$ a; u+ l- o! H6 }5 }
// ELSE! V; D" E* \6 s; F0 T, ?

+ u. W* N4 w1 ~) Y( w4 e! L& x2 J//
9 c" Y/ d3 d5 \! \% w/ ?  Z3 T% uReport I/O interface
$ \* i' e4 @9 i3 B+ e5 K' X& H3 S7 C& N: ~
//% A& q$ u: i$ P; ^( m* \2 G

! P, \& T+ E+ O: P1 ^# X- F: w4 \//
+ f$ t$ ?6 X# L! o! t2 pPDCx[2] = OSPM is capable of direct access to On
6 _0 B) [5 o0 j0 y- h/ T) u" d" |. z8 A, z
//: {4 K  J& a- p: Z3 {# V2 u6 l
Demand throttling MSR2 G) Y- F5 z) S/ X

* _5 P$ g/ w6 p: I& D$ O8 U1 i//
2 @1 y& B0 m' J& J, i% Z. p3 D/ s2 ]" ^8 X7 |  W/ U* `8 p
If(And(PDC0, 0x0004)) {+ [* Q0 ?% ], ^
' O8 l  B+ c3 }# s" e" d# `7 q
Return(Package() {2 J3 g) D5 l# Y5 G1 ?
" I7 f9 y" _3 }5 F
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 V/ \& w9 K- [' {7 _

* C' L5 c8 A3 Z3 `/ ^ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
, T4 ]; v+ F5 o% M5 V4 b0 U6 t! B; ^* D( j0 f! @7 O
})
0 b0 }6 m1 I  z- g
) `! X* A* L' w}
$ F1 E, ~; N) z+ D9 Y5 ]* P( O- H8 u  a! p
Return(Package() {  h1 C% X9 N( O8 j3 l6 r; |1 H6 g% N
% }( Q6 W2 Q# V) Y# C% N: N" C: C, A
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},4 D4 t4 G4 N! c

! Z5 N; X  p; C% D$ W+ M7 GResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
7 f! A3 p' y" g2 l. Y" n; O) U) f5 u* i& G
})' r9 S+ {; |9 Q# N8 N4 D

& {( c( w$ [+ u8 N7 G) S}, ?0 ^, i% S6 f5 y& i# |

! W/ L" ~0 O: _/ `- c0 _9 a' [/ Z: m- p
: s5 X8 G" t' M% I! V
l
  m" x: N& L# R. h6 ^- T, w9 `
_TSS
5 `" e# {8 C$ A: ]
6 c1 C/ k% \& u: C$ LThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
% @4 N0 _: ]7 k  ]  {Name (_TSS, Package()
3 n- c7 k# i/ k; x- }3 y7 h0 J% e0 x( R{2 S* \! D0 Z9 p& i
// Field Name
5 B7 I% V* K; zField Type 9 i5 f  N. `& u# S( f& W) b
+ c7 D% b1 [9 J* |
8 x" s' F2 P$ E7 g8 e# z2 X7 B8 B
" z' F7 g0 E: ?( k; E
Package ()2 L, ]# H6 Y  e# A0 f
// Throttle State 0 Definition – T0
3 C8 j. p1 N7 i4 ~4 `& g% u- ]; v8 _  c; S; ~6 m$ X" d
{2 B8 ?" r5 t" q" H: R6 ]

" x: e, Y  p' |/ @; ?2 b3 Z' _& o6 k+ b" ~
FreqPercentageOfMaximum,. D$ F5 D  U: \- x0 _, M% P! d
// DWordConst
- c, f: p4 B7 g: `* z
  E# y2 `- o: u! sPower,% I, ]7 N. }9 U: P& @) n0 @
// DWordConst
4 w7 [9 ?6 y1 y; [7 M! d
& f/ p" P0 M( l7 XTransitionLatency,- m3 O* K+ x) h2 g% j- {& F  j
// DWordConst ( ?; Q  p6 V8 {' n3 y- ?' x* n
# z) ~7 q  z3 |
Control,2 P  a( v) m8 [: G0 V
// DWordConst ( s& K2 d$ ]$ p% L

. B2 C, r3 x; v; p3 f- H3 VStatus1 w- U9 C% c0 G* p
// DWordConst
7 A  f7 b# K% o) B9 g},
" }* _# |2 j# B……
( |6 w8 o9 g8 D5 b9 j1 M}
3 ^: f# G$ o2 W1 m8 M# z7 u" N) v5 K! U0 j& S' n/ l. x
Example code 如下所示:
* {5 p9 P% s7 _6 J9 M5 s7 i3 B0 ?* b' o( L, ~
Method(_TSS, 0)
7 U; p5 k7 }9 G( R/ U$ u% }/ M/ [7 [$ {$ o5 J( R1 s
{
6 l& |% o- W4 t! E2 f# K9 c7 n$ d  F+ n+ X7 ^! O6 `
Package(){100, 1000, 0, 0x00, 0},
: L( \8 p5 E  O$ l% x: ^; _
7 y7 |: l, `: B5 U1 x: dPackage(){ 88,4 m6 ~$ C5 G5 p( y
875, 0, 0x1E, 0},: J. ^: f% X. L7 w

4 M$ i2 E6 B0 d& kPackage(){ 75,6 V. ~" ]# x/ E5 _+ v% M1 r
750, 0, 0x1C, 0},
# l3 Q; w; A$ D/ z8 V2 `7 \
+ H# `( {& B: z& ]* z4 |- [Package(){ 63,
/ W5 S5 Z4 Y- g3 M# h8 |# s625, 0, 0x1A, 0},2 ?0 p+ g/ G. n8 ~' E5 Y, Z

% J! c# j& }; }) Y! H' W& sPackage(){ 50,( M2 Q/ X! j5 X, v. p- `
500, 0, 0x18, 0},! K, O* Y) o  A( a' K9 ?6 R( o

( q) N& G( e7 ]+ q" s8 @Package(){ 38,; Z  a7 _8 }" B3 ]
375, 0, 0x16, 0},) Q5 L$ \; O7 V/ @9 u
2 c, v% R: n  N. ^  y2 N
Package(){ 25,
4 H! [  x- `$ m/ r7 E  K% I250, 0, 0x14, 0},$ {& ?) i* X) C& B
3 W1 {  F9 [% \
Package(){ 13,
: e- T5 m- S. N* P- B6 \, x5 P& r125, 0, 0x12, 0}
' E3 P+ C# o2 S9 ]" b- P- W* r; ]4 Q
}
+ B0 E  p' g% k3 E9 {
& f3 g2 J. H3 l  z$ R* s7 H6 e5 J& S  p  J& z! U! g. j
l6 G0 A; o& c+ e0 a) j
_TPC
  P$ k. ?, q% t8 X5 q& z0 o+ d
1 s" h8 c$ u; m: c0 n1 {Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
8 p7 Z1 a0 N# T1 w0 V7 I+ p; e 9 g% f+ Q; e" ~1 o( k6 x+ Q: E
l
1 V. r1 L3 j& h, g, ~1 q4 q' E$ d
_TSD5 n- g( k9 M/ I6 S8 H0 U& v% ]. ?& V
' G3 d" l9 h2 D1 @4 v! R
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
' s" i3 d7 L/ e7 q& q/ K1 ~ / \5 \: L2 {4 n3 u; x6 y  l
Name (_TSD, Package() ' Q9 m3 i5 S6 m5 P
5 I; {, g! @; D3 ]1 e  f
{
  Z8 V  Z. A9 O, W
+ {7 l- L8 u; `& ]" G; t/ QPackage(){5, 0, 0, 0xFD, 2}
; Q$ ~- H8 Y7 b& u+ n* k2 Q; O// 5 entries, Revision 0, Domain 0, OSPM ; y, N. I6 K9 x: h9 }/ i; ~
Coordinate, 2 Procs " F, y7 U) G( Z1 c. k5 V: M
6 V( }3 J  ]; N" A4 A

* @0 G0 W* s0 i3 f  c7 G5 j3 ]}) // End of _TSD object
. M/ i4 X/ i7 w2 y7 d3 d/ G/ H( z
% m" [6 S; M4 ^3 i4 j5 DREFF:
! x6 F  E5 A6 H. m# `# c1.
4 z6 o7 L8 m- A# w& W& w! [4 Y& G# DACPI Spec 3.07 ]! [/ V# ]& q/ Z% P- H* O
2.
. A9 Y# `3 H( T/ |$ SIntel Processor vendor-Specific ACPI3 i6 s# S7 j4 Y  M

; _. E' a  [& A0 o1 ^ : c1 s/ d+ z6 N0 ~
That’s all!+ s( U9 e: Q0 E" U, `5 Z: M
% [% d4 N3 f; M  K; Q
Peter
4 C+ u5 g# c  ~. ~& c# B
; e$ s5 {. c5 }2 `7 b( T: y2 t+ t3 O2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 13:59 , Processed in 0.038214 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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