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

CPU Power States

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

6 V. B1 N7 @7 b1. Overview9 P' l! W2 O4 F

0 a+ d. V# F& s4 G; A1 e/ s: O! ~2 |& V
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
. x: }% U: ~* X; T( u& G降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看6 y* `/ S: A' k: W# u) q( t
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。/ n$ S9 r2 I+ T& D

. H( O$ ]6 n7 E0 R
cstate1.jpg
' d5 N9 ^9 ]2 b6 K
1

% N1 I" ~4 b% }$ Z. r; w& c1 u2. C-state Control- O. s6 ]6 X& U0 k. b- X
/ w$ J" o) G7 H% X
1)/ T8 {! G3 G% t3 R  I( i
Detect & Enable C-state' |8 y( A+ G: r& E: ?/ L
( a" J/ ^0 O) F
BIOS可以通过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的支持。
' ]9 r$ F( r$ v5 H- O* w4 K; Z8 ?7 r5 a) o# e
2)4 O# m9 R' {; l4 N" v' b
C-state Basic Configuration
% F" T) l1 ~- n* d* a通常情况下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)。  h7 L" s4 ~2 H. O" k1 Q; a

; a- ~; f  |. O+ `0 d5 s5 ?3)7 X2 @2 i( h3 V3 k. o, [
ACPI Structure For C-state
+ j5 v4 G1 _6 q7 ~3 q$ Y' ~
, R4 ?/ j# Z6 ~l8 O5 Y) i5 P  g) ~  I
_OSC & _PDC
1 B% J% g! x9 q- o3 c_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
- w( ^8 v9 W- n; a' zl
% y. i4 d0 P6 b' }7 q
_CST( a$ y. E. _4 \7 B. Q5 ?% N
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:& f+ x7 P: D7 N: L  g9 B
CSTPackage : Package ( Count ,5 f& R) Z; E1 z3 J5 z# F
CState ,…,
: ~( r8 z& \9 m8 h) u% G  E6 A  fCState )9 J; u2 i! n" F
其中Count表示所支持的C-state的个数
, b" l, B. l% r6 yCState: Package ( Register ,
' a5 R# F9 s% A/ yType ,
) M; ]# [" K( H5 ZLatency ,
, G$ E5 M5 j7 \Power )1 c1 e7 d0 c4 i9 \- ?

* B/ J$ m! R0 ~- D- t9 N$ i$ [7 LRegister表示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
- G5 t8 N8 x9 W( m% k) z' P- q) T* h; J2 a. \0 N7 \5 @
Name(_CST, Package()
5 \5 K3 G+ p: N& i" p/ \2 B

5 X. H. t4 }0 B{ - I  R9 Y" I- {& x% ~) B% p9 j
4,: t3 \. Q( E) l6 N
// There are four C-states defined here with three semantics
+ K) o! F3 A: k8 h' m) h

/ v2 Y) L% w: P1 M8 e/ u9 s; O8 p# z// The third and fourth C-states defined have the same C3 entry semantics. p8 ~. F" F/ [( K" I7 `

* O( M! O: t) f) u% u, k, yPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},5 J6 J+ J* \5 m1 X' a
1,
/ n: ~/ \1 z) Q1 ?4 h& y20, 1000},
  ^- `& x7 V! N

( Q  M& w3 s/ a/ g5 x  i( }Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
, G4 B$ E$ f: v8 K* A4 d0 R40,- c$ q7 z9 Y! m: ]% X, n
750},

; K. p! x+ Q) s, yPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
' o1 {; [* i1 \+ v% H7 U& t# w  I60,4 J) }. w: o- C/ f& a6 z5 x
500},
7 ]! t/ z5 m( l+ q& @
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
  @" P2 d+ k! J0 u5 X250}
5 X. f  u5 ?; y: t5 p1 U3 Z$ `% ]7 A

* ~) L& ]. j6 K& \' ?}) 7 Z6 P9 j- Q$ b% B& I* r

" O% B" V9 l" H" M& H3 Ql
0 H( w9 ~% k8 u. I8 T3 V
_CSD# P1 [  z0 W2 ]3 U) n" P

+ R8 i, S7 k3 v7 h2 r3 A6 ?# YC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。0 [, G5 t3 ^3 U
& i, B8 D" d5 D2 W$ n5 H

) K- A% {6 ]6 n# G0 \: r; t& b# i& S1 [1 u& |& h

3 ?% S; {) {9 C) t  d! `& {5 w! B3. P_LVL VS FFH* @/ c$ D1 C4 e2 M: q
3 k5 T0 _/ e$ E" K" J" w- a
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)/ ^9 ^, N5 u( }) z7 b
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所示:
0 L% M: P9 H( Q4 r( b3 h+ Y2 F1 v. ^( n: m2 Q
gas2.jpg
$ k) j3 z! b7 }2 U7 F
2
% |& v/ i- ]  Q8 Q. ?1 i  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的一个例子:
" l9 a; h3 D0 S+ G! c; y7 YName(_CST, Package()3 G0 Y0 y3 K+ A8 u7 s

; D! n  D) f% H, i" B: D; {{ - J) b+ m0 |' j# U( W* n6 o# U% u+ _
2,
7 k4 _2 P+ w/ b. c// There are four C-states defined here with three semantics

$ Z1 P2 m2 k  l: f! E1 F
7 @; ~  C' f9 V5 L: n// The third and fourth C-states defined have the same C3 entry semantics+ G3 g6 o/ @- {
$ u8 w8 j/ V" d7 V& `. Y/ O
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
7 I2 Y! C& x5 S7 E0x01,7 v5 I2 U+ v. e2 V8 G8 M
0x03, 0x000003e8},  t/ \, u1 Q; i4 C% O" C
9 L6 L5 y$ g& w% t4 f7 X/ k8 |8 n
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
2 a+ m3 j5 \9 t0x01,. v9 ^& z( q2 P& J) t& p
0xf5, 0x0000015e}
1 B" O* T: n; }, i* K' H8 J$ L9 u
})   S/ r1 k9 o! m) n
! n" P# X+ o; l* |

* W+ l& E/ a4 `0 N, r' CREFF:! O) Z5 t  O4 F( `( c$ u# ?  R
1.# f& u% G; k- S5 y" x' J
ACPI Spec 3.0
, R4 y0 o8 e& I+ a8 P2.
9 O0 c( \5 K. R& ?* B* ~Intel Processor vendor-Specific ACPI2 x9 h* |) y/ g
: K  m% r) Z( t" Y+ Z

9 V0 M& H" D* {6 K' H* S5 d3 T: kThat’s all!- C' I" B1 Q) I  u

  t/ A; @+ {$ H! aPeter! q4 l0 u0 ?4 T) D
- |- d' I; p. N2 V" A# X  a; Z
2010/9/20
8 ~  g4 O2 C% K4 |; O
6 T7 O5 B. s( z: a$ _7 c, Y" Z- r  r[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview* {! ]9 K0 Q: W- G# T) z
: V0 y$ l# }3 q' i/ P' g0 G
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
3 p9 R' s7 c* B. P& GEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
8 K6 ]5 }0 g3 ?* V
# h" D$ @1 j) g2. P-state Control* e6 ~5 o7 i+ ^5 [* q0 Y3 h

6 j" p4 m% f0 [4 a1)
) L2 _2 D: N; ~3 WDetect & Enable P-state3 x/ p! [" e+ K* u6 d0 x

% k) D9 s+ z7 P( j, _BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
+ e0 d8 z8 M9 w5 ]$ x8 \ ! L6 Y* c5 `+ k0 B" F7 l( O
2)
# O, N- H: M8 w  Z5 DSupported P-states3 q6 _) U6 k6 d" K% N% w
) C" m  b* q: t! ~" n* h
BIOS 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
, I  H6 D$ W( H+ o  u 3 k  |" |( w1 ]( [: @; M7 w3 N
MinRatio = PLATFORM_INFO- d* a: F) ~% q) q- z4 Y( F
MaxRatio = PLATFORM_INFO  x3 A6 ]% y% d! l0 C: O
RatioStepSize = 0x011 |3 b# N3 P7 O8 T: h+ a. O, L7 t
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
. T6 R8 B( P% ?) N7 U 5 e. q; d& l2 W( x1 z
If(NumStates > 0x10)
9 M' u+ t+ r# Y{
: s, o3 d5 U# E4 M; B9 N2 q6 \8 I+ _RatioStepSize += 16 V  O3 p5 l, y" F3 `' ?( V8 p
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
2 j( b1 t7 i' K4 ~- j& E- \  l}
* p+ g$ L+ f; c" z
2 l6 c6 V; l9 d% H# d2 o3)
& I. L9 G; }2 K; VTurbo Mode
+ Q" _2 m0 D/ k. g+ ]: X ( N4 b3 H- n# F, ]) P8 D
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& W9 t$ G6 [8 u& {

! D0 \% o8 ~6 ^: _( ]# _4)
3 e! d) p# A' D8 u4 H3 tOver Clock: p8 Y: O3 |" [; ?9 R
5 s  `- F# B  D" H2 e' r) P
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。- ~* T$ t6 |% x, X0 {
* {; q: K  i7 j) [  B& i
5)
& ?  A& K4 A  }) M" KACPI Structure For P-state4 N* B$ S1 h$ o& a

4 [: Z) Q5 |7 l, @7 [l2 l! R4 M; U, @  ~+ l8 ^
_OSC & _PDC" t  V5 o2 F8 f& x: S8 f
) `0 _/ H: T+ ?1 Y6 M. N! {9 \1 M
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures2 `9 W! {3 @4 d4 i2 N" [' h1 z* L
. B5 h) L& r; e/ T& S
l5 R# P1 i9 h3 G& Y1 R# u
_PSS
" ?! Q+ c( A$ G( k1 X+ H2 GPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量1 U$ P! r0 h& C
并且通过一个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做比较
( f7 p7 u6 @& k- H: |$ Y以确定P-state切换是否已经完成。
. V$ X3 i+ u3 u0 ], d; r % b: [! N/ \9 c% S3 W9 x, O
Name (_PSS, Package()
$ ?' z# C+ L1 ^1 g/ q' z: ~{
$ \! P3 |+ x% ]* V* {// Field Name6 `( H5 M3 D$ T1 B" W# L
Field Type 7 y' o4 a8 T; T) I5 u
/ P+ y1 B# Q. d+ [

; k& Z6 Z% d+ ?) A% v2 T3 h* P% f1 @2 m4 o- s9 h
Package ()0 `) U' |9 C3 f. K" o: _0 g0 F
// Performance State 0 Definition – P0 8 u( |) K, Q8 p9 `" `! S! g
) [" M+ J9 r8 L& Q
{
" j- R& ^: ?: d/ ?( C
* v# r7 h& s8 e$ h7 J+ O0 o. W! S  S1 q2 E/ r
CoreFreq,
# e7 t# t* R. i- M- f+ U8 O// DWordConst # P' `7 f0 z, O( d3 j0 e
+ r4 r1 j! `! l2 I7 l5 t+ [
. h( ]* A9 Y! d1 |7 L( f# Z3 }* b1 L
Power,
! o7 D( p1 s1 F8 v// DWordConst & w: r' [1 O) F0 t. k' [6 A
) F( ^9 X' c7 p' F7 j5 F  ?
TransitionLatency,
4 H" l: i3 l" f: n5 F' q8 @// DWordConst
- \6 q& ?* I& A* z; P0 e
9 v, p' p! U& e/ r5 a% mBusMasterLatency,
% E+ a2 P9 D6 j2 J& d+ e// DWordConst : e4 q  \" z. I; E) C

/ n% P) m8 U8 H& d, H- zControl,1 f- y1 p0 v* ~  h4 Q" L
// DWordConst ( d/ y  e! ?6 y$ M' Q: O

5 r7 V" U) P. `Status
  ~, s' D9 X  u# ?/ J- V8 o3 n4 Q, Y6 [! e
// DWordConst
& ]6 w& A$ R& ^; y" a& t* g2 }8 F$ Q" \% E" X7 d  A2 |7 t4 M& Z
}, % @" F: W6 z+ @% f& o
' Q2 q* D7 {# _
.
- m3 C  ?8 j- u# C! y
. W6 q" k5 p& v* U! l, D9 O! D* D.
7 P3 z; R6 t7 l# x, Z8 n! W0 `7 `5 f- z2 G) j
.
( E6 D8 g" p; M6 ?}) // End of _PSS object
  n; F  }/ ]0 E1 `; V3 U前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
+ U8 x/ U* O0 k2 m
' L% |7 e4 Q& s! {Name (_PSS, Package() $ j+ n* \5 z( S- {- l5 K
  w3 L6 N% P  \# ~
{ * A9 H5 }9 B/ x& @0 A: M. k

$ k1 B9 ~; z* z; i) Y1 h: uPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) : K+ f$ S+ y: @4 r& W; O( {0 L
  [+ N+ m1 c0 W  p3 T6 L) L
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) ' ]2 ?, V$ Q3 C
, \' b5 z2 D% t- g# W; j
Package(){1400, 8200,% k( E" M/ k! ]! O
10, 10, 0x000E, 0x000E}
+ L' B& }  p  X// Performance State two (P2)+ x8 v; {! `) g5 d9 j
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
& ?0 V; R. t8 \: FPerformance State one (P3) 8 h: F# l* ?4 Y5 z; u8 B# c4 L
: A5 |: p" V/ `9 H  P+ Z
Package(){1200, 8200,; M. ~. E# V/ [8 k% A& Y" V
10, 10, 0x000C, 0x000C}
, p% l$ I; ~0 u3 A. Y: r  d& x+ c// Performance State two (P4)6 H" n( v* o/ H2 L3 _, z: h" N

9 b4 `7 O; k! S* C. E% y% `}) // End of _PSS object
9 ^' g' Q7 m8 C. ?1 M; s" H7 I; I
6 y/ Q, P, U. z# g2 W另外当该平台支持Turbo Mode P0将会reportTurbo Mode' N+ I& ^# K, q+ D5 \% _

: k+ W. E7 N4 q5 w  ~0 ]4 \l
" F& o! P& ?7 ~3 f; w/ _
_PCT; l: z6 V( r/ @3 p! }- V! n  a2 \

+ ~2 l8 @9 {, i: S: V, fPerformance 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 y* J; ]* I6 _7 ]
" `) e7 ]3 o: hName(_PCT, Package ()
2 y# s4 t1 i+ Z+ g// Performance Control object % c( r# X4 i8 @6 ]' ?! x* i

% b9 B9 Q1 y2 b; O{ 7 V2 N: ?( a& z

6 l2 v9 A4 g8 [% c8 {$ D- F. dResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
4 ^9 ~4 j. F2 I( X: w! H  o// PERF_CTRL
; T  o# T& D$ e5 z9 _2 j# v- I
* o! N3 ?6 z% a' \) z. j$ RResourceTemplate(){Register(FFixedHW, 0, 0, 0)}  `! a7 Z& ^4 P& V
// PERF_STATUS
. [( f& ^9 |6 [, {+ S
  a+ h$ M# M9 F5 t# _}) // End of _PCT object
+ D  y3 x& n6 V' g' a  z 8 y( F" b* D6 |5 {
l1 x' h# C+ w8 V! x
_PPC
* }8 b: P. `7 i' |. k. i 5 e7 Q* B3 w, P! i
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
( P3 ?0 p7 G8 T' S- i 1 N# X3 f# a+ `, e; y3 I7 ]. T/ v
Method (_PPC, 0)& ?1 O' Q0 ?, X
// Performance Present Capabilities method
9 |, H& N9 S5 f+ |8 ^+ S
/ l5 \- O4 w3 ?5 u+ |: p" U{ 6 d9 a* r: C% I( o7 f( L- Y
1 i. V0 |5 s& m2 y+ j
If (\_SB.DOCK) 2 a2 q- I8 k: K/ L$ l$ y/ h
9 T) S1 M0 g( M; w3 P2 a6 D
{
. R" {  X8 x: R& A
- [9 }7 b4 [( W" s3 w8 F$ ?Return(0) // All _PSS states available
0 N0 S6 s7 G% }8 g- o* y2 D9 i- e  Z) N0 J; O% D& A2 D

& ?1 i% a  _" `}
0 u: U" y7 o, z1 ]/ F
2 c6 b: n6 ?5 ~- xIf (\_SB.AC) # r4 ^& T0 P, p; P* _
4 }# l: f. F( D& x9 g
{ . N- ~$ [2 f- i6 o, {* Q) `

& C; z7 \1 c) K6 E* @- bReturn(1)7 S" m6 O( J+ m
// States 1 and 2 available ) B/ ~6 X' f9 K: T7 Z

9 t7 z6 q8 }: ]) E  C} 2 Q! D; X- j2 `1 W

& v& V! Z) r4 R3 X" O' j8 E% jElse
- L/ e5 }% e+ h' @4 S5 p
# v# M2 v6 n! O. @8 ~+ I( y$ `5 `; y{ . ~3 t* g! R6 H5 n3 S; b; O

& N9 v# u$ l- KReturn(2)! L- O2 C" I" T8 S5 q( H$ p
// State 2 available
8 m# R1 r% c; m0 @
  G! U- O0 `: P# a& C2 U: i} 3 I% I$ O& H$ e" i
! u7 O4 \$ O4 W
} // End of _PPC method
  O1 w, X5 i1 ~* _, H2 e- X . [+ }- q/ ~' T( L" w3 b
l
6 q: S; k, U! i) ^5 c
_PSD
7 p( R9 H. n/ C$ [, X0 i1 w+ W2 y# ]2 |
; u) }0 [( O8 ]1 L' Y/ {3 XP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。5 S  W5 x: q. s1 a* y& B

5 _+ G4 u4 d$ ~" H% JREFF:/ z1 w/ l5 o7 I9 W" |5 P
1.
) u2 e3 d' b/ A* f( mACPI Spec 3.0
( c, z% H! y0 u) H; l2.
/ q/ y2 I( I$ [& N+ F. qIntel Processor vendor-Specific ACPI
& I6 f9 G6 E( d5 Z4 j+ D
) t- a4 A. I& |) n  w% V: l+ o' ]( u, b
. f& B* a, k* L, a+ ~9 y8 |" A8 gThat’s all!
) D; G; u: ?3 G; m# E) c , B( |% O# `: ?' q8 m! v( i
Peter! l7 K  O4 d3 o( u/ p

, J, t- x0 n+ U, J5 J2 [/ I+ M2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
) N$ o2 ~5 e6 y3 X* \5 F. `" p0 U
0 x7 L4 x( `+ z7 z' N3 DCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
7 K; ?3 V, b+ i; P,影响系统的功耗和温度。$ D9 B) Z" U$ y# W( x! v% N8 `
. K+ G$ b) z$ @# N6 X* m* l. y) j8 o: v
2. T-state Control
; x( ~" d& b* q, g" y " d9 M4 X, Z9 p" R" ~
1)
3 E% G* j* ]1 DMSR Based Control( I+ J, M( r: {  M+ |" ~1 z
: t* X' g- M+ P$ N3 O
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
5 u  n0 I' C+ E0 b$ F$ t+ U # F$ {* {" Z0 ~! w* V" X
2)0 d. |' f6 D. G4 d6 Z% j
I/O Based Control& }; `  _- w! j6 c0 O
, Z7 @  O2 u& B5 M1 R* F5 P" K
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
& k9 W1 P( e' P* S  D
  x2 p3 }6 _* E& x0 L, g; S! U3)4 w. O; p8 y) \, M
ACPI Structure For P-state2 ~" q. o% \, \7 l: G+ A0 o+ A. K
l$ q2 b0 ~; c( {/ }* |5 v$ I" {2 @
_PTC% k; F0 d' W4 ~, \
9 G5 N, t+ P+ I, N9 j
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:/ B; c0 \/ s* j6 \

: J: E9 k" P/ p4 G+ w/ aName (_PTC, Package() - k2 S# }/ B8 G- g4 o
{
4 {, H4 ~; n, s. u. H# R" G
. ]9 h) T; n8 V4 OResourceTemplate(){Throttling_Control_Register},, @8 x) G4 p* I( Q' v5 o
//Generic Register Descriptor
5 f, [' M$ q) F* A2 [  q
! t# L1 k6 k. i+ {' yResourceTemplate(){Throttling_Status_Register}
) o: ~+ f. K; r! V# V4 }6 I//Generic Register Descriptor
) w- H( n3 l& c" Q}) // End of _PTC
) J4 n% ~- I8 _- ^) i# q+ s3 g
8 z) G* N. S4 h$ e9 B: b7 w下述是一个sample code
6 n3 h* P% g; e; E; h6 r+ Z" `( u
0 i; z& U0 E6 [" Z  p( C, {; r
: ^0 u* K* X! t/ v
//0 L, t% x; J+ W: c
) E: H/ r( [) n9 G; M5 U
// T-State Control/Status interface& Y( Q) x. ?' v( h) i" a* L
3 V9 F& _- ]$ @; I
//2 \; t6 k( c$ L; j8 ^; L
6 O" n0 U+ ]/ f! ~- z
Method(_PTC, 0)
  B6 e5 Q# b4 Q! X( r* [8 b, T4 a8 y  i" a
{
1 r# q1 ^5 o0 ?! b8 ~$ Q4 `% \- v2 m( X
( }) C& L8 |  K9 }- ?  \//
) A; o/ m! Q/ y% |+ A
0 x/ P4 ?3 O. h  V// IF OSPM is capable of direct access to MSR0 A: ^. h# s* V% b
) K0 [: f. N' b7 M4 ]0 \
//- S5 l( o% t/ X3 T4 z0 M
Report MSR interface
1 Y1 X* B8 t" @* j: G1 ~( s
5 ]# r5 P2 D( N1 @+ |& M; L// ELSE
, W7 v& g$ Z, F
- z2 R+ g# H( e" }, ^8 A, N//- W. Y+ b4 y+ o0 S- E8 U
Report I/O interface
1 I, O% @6 p( ?, `1 A) y  G: d6 I
//
) b* ^9 {+ V  Z: B* o% Y6 T# u
( b. x. @! ~& ~7 _; Z//
( ^" @0 @- ?4 r$ ~" J1 `  k3 NPDCx[2] = OSPM is capable of direct access to On
2 c! j# ^6 z' v: [( Y; g3 R0 `" q! y2 T1 j
//
% m, O0 c0 f: y) E1 WDemand throttling MSR
) U) r( D  v( b* g" Q- z) W
+ b5 y; k" N" H# g; j3 i& ?# v# h//
# Z1 R( b. f3 q7 }
0 ]1 C/ |/ x' C1 D; `  M3 gIf(And(PDC0, 0x0004)) {
2 T: y9 Y3 i, e" k3 r; ]* `2 V" F! j5 l( j- O1 M
Return(Package() {/ r" L7 w2 @( H( P/ U
( Z- b; s3 h- {7 Q5 W5 d
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
( ]2 V: Q( }0 o5 q9 h2 T( }3 h" }6 V
6 E' Z! F$ ~: t+ b: Z6 S* c8 {ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}( a* [3 V) c# }- l5 e
. ^4 j/ W5 t% K2 Q: p4 {# S
})
) w. k$ `# E+ f; \) I9 x/ e  L8 W# h% H3 x$ S+ g% B
}2 w2 z4 [' N- E9 L
$ _& ~) a, H( w
Return(Package() {
) ~* [) j2 g+ S/ Y
0 a) |" ^; i3 B1 AResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
; {) n, N3 [) H. `; Q. X# C1 P" }: J% B0 ^% G. U6 |
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
5 F- A3 ~6 ^0 v3 m! U4 C- r8 Y6 N
}); H6 g7 }4 D0 ]/ l
" B& I4 e2 L% f4 E2 v4 N+ p7 Q1 \/ X
}
' K, N: J6 f$ f1 P, A  J/ u! z+ a) i

2 A- {* Z# `- l2 o4 D% p6 A. c0 u
" h) w4 Z2 p- s: c7 g2 ll! Y4 F: D, P. x2 D0 q
_TSS1 G! Y. h( U$ Y8 Y& u+ r
  J. j, l7 h" X+ y" a# s
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:) X4 X! O( }: Q4 E6 u
Name (_TSS, Package()
7 |8 `% C! B9 @# m  ]  v{
+ I4 H  D# w+ \// Field Name$ N3 r3 Q1 E5 L% C6 O+ P3 G  J, G" D
Field Type 7 w: n# Z4 t* l& F& H; k3 @- G
1 l6 k. Q  J9 B6 k

7 Y! m, @* k  i, W5 {# `
, o1 h$ U0 p, uPackage ()
/ I* x& y1 }$ {# u: C% s// Throttle State 0 Definition – T0 - ^+ W& o8 G2 O6 ]

/ `4 j# \, j7 Q0 n{5 ~) ]! M2 ]  H- h
# s7 r- S$ U$ \% q7 s" g6 ?  T: e9 B

: t: f+ I# @: @& D8 V; E" bFreqPercentageOfMaximum,
8 _" N' p; V7 }: Q% e5 a& T// DWordConst # L. A" K. f5 O5 o# B

8 R& N) u0 j1 R1 n$ I7 GPower,0 u% _2 m' U4 |& ]( I
// DWordConst 0 ~( b) d$ d* h' }

/ W5 j* z2 [- d$ l) e) b1 WTransitionLatency,; U- M/ I0 S- D1 S: e
// DWordConst 5 U$ F9 i8 O4 Z! Y

2 J9 j5 q5 a) C  `/ pControl,
" O/ V1 @; Z* I- A// DWordConst
9 h2 A& }* Q8 A: }6 l
3 q$ F/ x( Q% J2 H# B7 BStatus+ B- w$ }: p# s
// DWordConst
6 ~6 ^" z: q" ?7 a" r! c) w},
4 h6 [  _8 N/ v: j……
# o/ p; W# p6 g2 v8 z9 p" s}
8 u+ v- j5 t; B5 N' X/ \; K
" N0 b: b( i. B, Z/ S! yExample code 如下所示:; ]! `5 Z" c: \/ f

& Y1 Z. T- E2 `9 H5 ZMethod(_TSS, 0)) `' s; A: ~5 d

, X) Y/ \; X/ `8 R{8 o  x: e( }. U) I; V5 S

: D  c9 s% B8 x5 NPackage(){100, 1000, 0, 0x00, 0},1 r$ z" _* W2 Q  S- I2 k
$ W0 N. L$ H4 |" s
Package(){ 88,
! p2 d# E. W& H! ~/ f8 d+ y" H875, 0, 0x1E, 0},' L4 }4 w, h. H+ _$ a1 F
) p% C0 G8 N4 G6 m7 q$ e
Package(){ 75,! c! P+ @; W) P7 p
750, 0, 0x1C, 0},
& f! _; z5 e  b3 n& [# T2 b9 P$ V
) |3 Y' H! [3 c. APackage(){ 63,  j- N- o. X6 {! b6 h) u, c2 }& f
625, 0, 0x1A, 0},
4 V% v4 }2 b5 V" Y& i# n
; l6 ]+ q2 _- M; W. G8 g  DPackage(){ 50,7 K  q0 g6 M8 t
500, 0, 0x18, 0},0 k! w# U& S! J  w! y1 z1 z; m) ~1 d

- v5 @* T/ C# Z5 B7 H. NPackage(){ 38,
! S8 D9 \( j- f# r% E& H375, 0, 0x16, 0},8 r6 i  w" a( w

1 t+ T! P% e3 ~6 J( j6 S* V+ g& w$ TPackage(){ 25,
) U0 F" h- B% I! n; m' |( _! i250, 0, 0x14, 0},  J7 e; ?! i3 i2 @: y/ S9 f: u

) _: P) |* s2 r7 G! z$ |4 ]! mPackage(){ 13,' A! e- u, N* ~, O  l9 w7 q
125, 0, 0x12, 0}
/ ]; c+ c, p  H+ t. y5 q) d+ E. ?; D, m
}( X0 Z# p; \. l& Z" b% q# S7 p+ b; s' J

) y2 ]4 y3 B. U; n/ Q& l* v: F% D$ U% m/ ?, L5 \) W( a- ?! r$ S! A
l
' I; A9 R1 a$ Y6 g( G
_TPC. `9 J& S" F8 z* ]  M
- w7 ?3 Z. M' ^, L# c" N% U
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC! K% g1 y% g# x! u: ]
: U" B' T* Z, v% z# T3 P
l
3 R$ m% W. |, l& Q
_TSD  Z2 U6 ?4 Z0 g& `2 z! Z

+ T4 [( B+ R1 }' t8 L8 C1 gT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code, q9 |0 v# a+ r( I& O2 ]
" \. ~) W1 q* T! H6 A
Name (_TSD, Package()
$ i6 m$ y5 `3 e  |& ]: ^1 _8 V: }9 V& k1 h0 K# y9 [
{
( l2 [0 L  A$ a* I1 W: _
6 E6 A6 t, G( m. Q3 A6 E1 GPackage(){5, 0, 0, 0xFD, 2}
2 H  W2 e0 w$ }$ I( h// 5 entries, Revision 0, Domain 0, OSPM % o$ p, X3 @7 q! A
Coordinate, 2 Procs 9 y5 m! L9 A' K9 f# O

+ i5 z8 W5 Z! m/ L
8 i( x  E4 j& z- A7 ]0 D}) // End of _TSD object4 d2 r( f. Y4 ?
5 d( ?' {+ d; \. E% Z! X
REFF:5 V2 [, O6 N' [0 [3 {. U
1.
" S4 |  G5 [, F# Q. BACPI Spec 3.06 E- I: F3 w. _
2.4 t/ m8 h3 B8 Z) j
Intel Processor vendor-Specific ACPI
3 |5 n/ ?, @& ?/ x6 p" U 1 ]$ Z, F6 f, T% d' F" I
' H5 c) |. a! S/ b" w
That’s all!% F) E: {" R$ ~

/ I, W$ g# S: wPeter) r/ {3 Q1 d- G% s' ^( D

2 @7 Z; b: d( b! X2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:40 , Processed in 0.180230 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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