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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
' K3 R- N% ?, b
1. Overview
2 r; C  w2 \) A' [8 h# u  Z$ Z% j* T: s; v9 c% J; e
) `9 f" K) c; E9 c* |6 y( J1 t' }5 A/ U
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
7 K- A& t, _% [" E: B9 N降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看) B  b0 S6 j$ r) Z6 S1 k
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。7 X2 h: G: R1 F2 b
3 ~1 B1 n5 c7 w9 |, H8 m* A, ^
cstate1.jpg

7 _+ ^  ^7 {$ @% i) N% ?/ u8 K8 f
1
# ], v$ }8 q# y9 K/ S8 y1 q* ^
2. C-state Control
8 l. ?1 `$ j! I9 e$ F( Q1 e9 x3 y! p% o) C1 J6 M& k" q
1)/ }$ h5 d! K2 V, t
Detect & Enable C-state
0 t! `; R) {  L# I' i; C8 U0 a8 t0 P$ S+ a2 l0 X. s
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的支持。
" V: T6 t. q3 x# {$ `
. R$ x- W$ s0 C1 w, Y2)
5 q. h; a  c- `) \2 GC-state Basic Configuration3 I; P: a# {# t+ \3 C) w7 x& P
通常情况下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)。
' M- h8 C2 u2 [6 C$ j* {: u8 V3 @3 f6 t; s
3)/ q: _5 g, y# \
ACPI Structure For C-state
$ a6 R3 Q3 J7 r& S. _$ ^% Q8 U$ q
& q5 d' m: C; c7 U) I* Q7 v( Tl( i2 ]- Y9 @, O9 e! D) q& I
_OSC & _PDC: T3 P# ]; F: I0 R2 V, q# `
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 M  o8 s" ~$ \+ W; D# t0 i* K! S& ml8 D9 l$ j. t0 Y+ U* v2 m! G
_CST/ I* v) j, U9 Y  Z0 b' n
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:- H7 I1 n7 \" z9 g
CSTPackage : Package ( Count ,5 @9 G3 R) n" c0 L( X1 s
CState ,…,
3 O$ P- q4 U6 h- L2 V" G; `6 T% ~CState )
$ r" r1 ]5 `) \. {2 |4 p其中Count表示所支持的C-state的个数
# F4 A7 B" D- v$ ?* t' LCState: Package ( Register ,
) T1 f; O. n4 z; O4 J* q* }Type ,3 d% E7 s* i2 p  s# p" G1 p5 t/ ~
Latency ,0 Y2 R9 Y8 f! ^- P0 q" {; k
Power )4 Y* ^. O! s4 ?, v, X2 _% b

; j% ]; k  D, X( oRegister表示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' ~' v$ x  B: ]( _8 Z. Q
  \  g% H- v2 r% G! U
Name(_CST, Package()
$ K& F- A# F% a: r. R% s0 L
6 e7 I) c. l2 I& W' Q
{
6 n4 ?  j$ J# N! M4,
) z: m; T) {$ U  m* f. h, H' n+ F( T5 P// There are four C-states defined here with three semantics
% K$ L7 N1 T9 r8 i/ M3 W* @
6 \! w! R. G. |( y( W; d
// The third and fourth C-states defined have the same C3 entry semantics7 y" y3 G' k$ m! u3 n6 x3 l

) z" l0 W# Q% ~$ n0 zPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% J* C0 p  u7 i7 K# K1,' i2 w2 B& L0 s0 y& Q* V4 L! R
20, 1000},4 Y! x3 X' J0 `9 B

$ ^7 C9 f. x1 oPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,: o7 o: j9 T* ?, ~4 a% o: ]6 C$ D
40,
* Z5 v# v3 t% j* r7 e9 @750},
: }' _  `. T1 q- r! w
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
- _1 I2 L$ O/ Z60,: \  ^& V2 \7 ]5 g
500},
7 B5 m6 Y$ U3 p3 N. O- c8 B( R" c5 l
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,4 \% Y3 l7 e* v5 e) }4 i  f; a
250}
, S- y! u: h8 S+ j. _2 O
& q9 k0 x! M5 E6 b8 T) Q% o
})
/ m$ D, E3 J* F% X9 y, c1 \
9 P1 G$ i& s( {! ^; x. z5 B- Tl
& J+ Q7 m% u8 `& l
_CSD
; h1 J/ O1 L  k9 Q
% N1 G% G- H8 }3 Y5 w, n5 w2 vC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。9 T1 l  m- l( Y& L) }) M5 }

0 W$ P0 N( V  I& {3 H
* ^) T% g) b4 c# `  l
2 o  G  J7 t0 x$ M. P# J
$ Z8 L- x+ b0 `/ o4 m) N4 A& U3. P_LVL VS FFH
$ O& W$ _/ U: d. [! r8 t5 r8 W2 g- R4 l6 w5 f
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)1 N+ [1 C, s; D* |8 j
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所示:
8 t' D7 d: {8 C
) {7 K; [3 h: z1 {
gas2.jpg
) S( J6 ~( i1 }: p
2
8 W- Y% a- |" p# s' o
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的一个例子:
* c+ c) ?/ F' }% K% ]Name(_CST, Package()
( a5 ]! j' j" [. Z& A- G
& b6 t9 q! m  M
{
! ]2 w  O# I) _2 P0 z3 p2," W  F* ^) u; Z! t! Y, q: ~
// There are four C-states defined here with three semantics

3 s; k, H/ i( q& N# R6 Z+ p. Y) o, I- y( M/ x5 F
// The third and fourth C-states defined have the same C3 entry semantics7 e, \) H* M& d1 I! E

/ _7 U0 p& q8 S* l# G. {Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},/ ~3 R. c: E) V. m+ L( {" u
0x01,
; M& i  ?# w9 {& R$ ~0x03, 0x000003e8},
1 R1 i1 c( p1 Q
2 c5 i; x. w/ |3 q; k. E
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},- ^1 J# q8 i7 O% B$ P) e
0x01,# D1 A2 z- X/ V! H: e, b
0xf5, 0x0000015e}
# O8 B/ ]0 E4 R# C# D
}) - }+ e6 |7 r4 k& Y

8 x* l; y7 ]& [
1 J8 U9 [: P$ a( [2 NREFF:. P/ a- B% y/ [4 A
1.% _* F: P8 X/ w0 J% \$ L
ACPI Spec 3.0: c3 v3 M8 Y3 v( E5 ?5 m3 @. a! J" |& z
2.4 N+ A* X/ Z7 x% [
Intel Processor vendor-Specific ACPI6 }2 t1 X# w3 _

! f0 ~9 C: q" ^5 v0 Y' F3 a+ G0 W. {6 i3 Z0 [) E8 ?
That’s all!
4 M0 x$ e- w' w# G* O# s
9 E7 e, w' Q5 G9 A! d5 wPeter
* Q& A) t9 x3 W- ^) l
* a% f: d& L1 P1 ?3 r8 z' M" J2010/9/20
3 g. `/ e5 p" U' f3 W7 a  w1 a3 C' s" f2 E/ c! ^
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview3 |8 T0 ~- o+ ~

( `1 g4 t+ Q9 \: W) k: C; u5 e: E) lCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
- [7 B. `0 ?. r# ~# H( eEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。1 w' C+ z" C7 {3 Y5 \% A

; n* l5 o7 I& f" L0 _4 F3 c2. P-state Control
4 {& c* z# t; z" M9 ]   b6 w0 w5 I- Q5 ]: J" J
1)
) M" q* P$ O# I# n. D2 [Detect & Enable P-state
" J% h/ w$ r/ F' p; g" R 9 m. C8 ]" K$ F0 }
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
* m$ q/ u) ^5 c( J5 ^5 I+ G. p , X) h. n, l* U; o- K
2)
8 T) i/ L" L& |4 x. FSupported P-states
; ]3 o( C% a$ U! B1 c
6 g8 B- n) p% H; n+ [: |, O, @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
5 B" z7 Z2 D+ Y$ T 7 [0 K% y8 x% z6 B; `
MinRatio = PLATFORM_INFO5 d6 I5 q6 l- \( s+ ~; c# `
MaxRatio = PLATFORM_INFO
8 \- i9 L$ h* h1 v4 ?- A' iRatioStepSize = 0x01, Z( ]/ o7 L9 Q# @) x
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1+ G  O* K* [9 I2 N- V

' f: |+ g# Z8 M2 P6 M# s9 UIf(NumStates > 0x10)1 _4 `+ q; ]9 L3 _
{- x! g" s( v" o( J
RatioStepSize += 1$ s& I* {$ p" G2 a- J! I
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1- T! f: G! }* E5 Q+ }* _5 g
}
$ x5 a* E8 E! ~3 F+ L; ]# A( {7 a
) @% w- E3 _3 N! ~1 M) y% p3). N, R" V( j3 }3 |3 D4 n
Turbo Mode0 h7 q; W' S; I3 s2 ^/ i9 t

( E% q$ `  K* d) J! I: cTurbo 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# i1 ?# f$ I0 H. D& Q$ d1 b
& r; s6 l; s! k# E
4)
6 K- @6 M! O$ E) K. J5 dOver Clock9 R/ O& O9 J2 W5 t
9 e) K9 G" a! g+ e- G, 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)。- o' N4 k: O3 e
/ V8 \: }+ L- j# ^+ B% S8 e
5)% @( u; [( t( ?2 m) E& V
ACPI Structure For P-state7 C% ~2 b% |& F2 q- C
2 M7 O2 H" i% [: h
l
9 R' |# z1 X% ^" C0 z5 p$ v
_OSC & _PDC% e3 b: x- H/ i

$ e# i, d7 Q: D$ Z/ k_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures' Y& J6 M) M  T/ G

- p1 M. m) M2 g: p: b# O! r: ~+ ?l
2 ^5 B+ U) z+ ~' Z) w+ A
_PSS: u# `1 M9 E3 z3 w" u3 m; a/ Y
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量- [& {, z2 `2 A( D
并且通过一个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做比较
4 z8 [1 h0 m# @" J: k( A) ~以确定P-state切换是否已经完成。
, n( P2 e/ @! t( C. O( x; h, V 8 ]6 }% n3 q( u% l  d! H
Name (_PSS, Package() ! G) f8 |4 t' f7 d) ^: C
{5 f9 E* P( T: y
// Field Name
. i" Z; Y' g# c2 f/ \, ]Field Type
$ a; w' o! G/ k8 m2 G* ~0 b! c
$ I0 Z5 |4 D5 ?: L/ a+ W/ P1 I" t1 P0 r) X  W8 g

$ ?" u! S# J& L9 A0 @, Y# u7 C6 X( w* q  h8 {Package ()
( C8 q% [- W, z- H// Performance State 0 Definition – P0
3 i" A5 Z4 N: u% c/ P$ o
) w2 y' @! Z* U% G# E6 O/ f: ~{
; t* O' l  ~( c2 m/ S
/ t) z0 y" {# k8 J1 D4 K* g: ?
4 q. w% |7 |+ w. \+ n/ u' RCoreFreq,% ~, T; V  q# C, d  ~9 S1 s
// DWordConst
" ^: W/ C. i6 H) `3 l' _. c5 R0 s0 b9 w

4 A3 z2 b; Y7 _) ?8 ]Power,
4 K* X# Y1 Z0 i) v// DWordConst   E0 l6 a4 B7 b$ A, U

/ K2 @  D+ L. ~TransitionLatency,
) l/ k3 Q6 Y) L9 M, ?: m// DWordConst
8 K* F9 o! T& J, Z' Y) T4 {$ x% w2 H; J" r( @" J
BusMasterLatency,
- S/ |# i- i5 X3 h# v8 W7 U6 {// DWordConst ) [+ I) N6 o; ^  {2 f. h

/ n" O! p/ J9 I* ^9 gControl,
8 T) o* O2 f  t9 Z- w9 ~+ ?// DWordConst 5 O. T' k" t- V2 j& X8 Z

2 c: [/ a! m4 L  l2 ]Status4 b) x5 ~; L% P1 Q
' `( `) s7 Z& z2 f) ~
// DWordConst
! n0 z. O7 s: r! @( P' Q6 F; D0 N) Q- B* c8 d3 E+ p
}, ; u& v+ t; n& i  p+ m4 t
" I+ Q6 M/ J9 a) S
.
3 k8 c; f: C: ^6 n7 o0 Q$ W7 I( {  @2 `) H8 G3 V
.
( \  }% v, h: o1 Z3 f# M* L( ]$ r. ]% ]3 B- d9 q0 W5 j
. , g, {) j+ X% U/ m
}) // End of _PSS object
! i8 a) Q) |: N" X6 p% d0 c  T前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
6 {5 W! I. {) A. d 7 J; o1 D- T, T0 W* T6 g5 M
Name (_PSS, Package() . h) x; S7 @- N* u9 }) g  U
  ?3 p! n: z. j- J% r4 _  Z0 ~
{
5 L. c2 L7 u. d# Z' W6 _. Z
7 p& N8 J2 m( l: u4 u' ?Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
4 I# ^; p& t+ h( ^& l. `% w0 j% m' N' e; C  L. T: D# m
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
9 t( H' H+ ?0 e# `! r9 u% n+ z# C; H& o1 C
Package(){1400, 8200,
" ]+ H- i) r) u& P; C10, 10, 0x000E, 0x000E}
- P! J/ y5 J8 A6 P2 M// Performance State two (P2)& X$ @* O5 j6 P2 o& d
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
! E+ \  K/ A& J6 l# V8 lPerformance State one (P3)
- W0 M' s6 K% C0 i
: L$ B, H- j7 _1 M. dPackage(){1200, 8200,
8 m. P) c( w1 Q/ W6 ~4 Q10, 10, 0x000C, 0x000C}1 o; O0 A$ N9 q3 i8 n" i" R! {8 d
// Performance State two (P4)
8 g& d4 O8 d, t6 S$ x7 c
( }% |. q! e8 h/ u2 r7 X4 Q}) // End of _PSS object
; M( v# l0 q/ m7 {* S3 V4 _
/ ^7 _1 G: Z' O8 h3 A  F另外当该平台支持Turbo Mode P0将会reportTurbo Mode$ u+ d/ b0 U/ i; F$ J
" Q8 f% J+ v8 p+ G- o) ?  Q
l
- v4 T( I: O! j4 b4 n
_PCT; i7 x; y/ v5 i2 I# f8 b2 O1 l7 }3 N
  [$ r+ |* f, j: h6 `& ^
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的方式来进行。
4 V! N0 o+ M" [4 G# W) o
: _2 }3 ^0 b% E6 @Name(_PCT, Package ()+ _. N* E( ~  k% m# o1 X4 H- @- V7 m
// Performance Control object ! l! V3 E8 {. W% z! M& q

: j$ n  `% K$ `{
& U( w5 X9 Y& j% h) Q% R7 @" Q) W+ n9 ]9 m: f
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 [& Q( N2 d( P. D  T4 b  V
// PERF_CTRL ) ]. H7 [$ J" }6 t6 U$ ^) u

& b% @/ y; o; b0 i/ E) d8 pResourceTemplate(){Register(FFixedHW, 0, 0, 0)}" I4 c# V$ E8 W0 E* g7 C+ z: R
// PERF_STATUS
% @1 T5 X7 S9 F; x+ ~, _8 v. v* ?* r/ ]$ Q+ A: J6 j' R( v
}) // End of _PCT object
: b( @$ ]- ^; Y5 l9 u' W
6 F9 [7 q4 }) ~9 jl/ ~& x' k: ]4 Y) }" b
_PPC4 m. f9 f, k# ~3 w! U
$ @" j0 d$ y% T  a  s8 V7 U
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-states6 @- ]+ e, }, g: T7 y$ Y% ]. z
! T/ V, U' m) Q3 r3 V
Method (_PPC, 0)# h5 ?, }" I; ^$ ~1 e
// Performance Present Capabilities method # q3 z; P+ U9 R: N% d' X
6 b4 r6 b" m( N6 l! f) W- o
{
. Z( K! ?$ {8 @" @; B" ~  t( ]" q) f8 `9 U" U* o
If (\_SB.DOCK) ) v7 z! \6 ]. d( {

7 ?# M  T2 X, o- c+ W5 B+ I{ # V2 K: s% x) u

" R# I4 S& X5 \$ w2 p" i' y# l1 UReturn(0) // All _PSS states available- |2 w3 v3 S; N; {0 J! |% d) ^

0 x. |" I# O! i' H; t5 r/ ~6 |6 u2 v2 S3 ~
} 8 V: W9 L  W1 G" t4 c0 |, I
! i) s3 |8 C$ p6 I8 X# P  B  I8 {0 B
If (\_SB.AC) 7 a& W1 {  a. `; I
8 Z5 D6 w9 c  P# E
{ : r7 Q! L( F5 h. u! q, [5 {" Z( k
% V% t$ D. K6 o  _
Return(1)
  A& Z" e3 P0 F1 m1 M- b// States 1 and 2 available
2 \9 t& M) r: U& n7 {* F# Y8 [4 R. r
}
! j: j$ i" T0 `  j0 f' L3 |
" D1 m) h' W  Y+ J3 ^8 EElse
* P; X( y9 h8 U1 Y! ?3 W7 A$ |% C6 n) N, `4 X- l6 j
{ $ _, @- l$ ]6 M; `& Y5 ^7 M9 K" O7 o. \

, m2 \, |  X/ S/ M: L& GReturn(2)
- _: A: ?) L  p// State 2 available; ?1 _6 W$ E: o5 X- J, |( _' O
3 x; a9 _7 g( U. A& q( d& ^
} $ K5 I6 x+ o, f& j

+ i0 E' y4 F1 B$ V} // End of _PPC method5 E% h' G* s# u! B- B1 T
2 k3 U$ s8 P5 ~+ h0 d& T1 s% }
l
/ A( T6 U1 b7 v* P* @: r
_PSD, Y/ h9 O7 G' I+ P5 T  B+ S% u

1 `4 }  B/ ]: M  n$ UP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
0 ?- I0 v+ _6 h" ?( ?  Q" y
; A  E3 o7 W8 q0 i$ A* vREFF:9 i2 t! t+ ~- t# \( h; h) p/ R1 D
1.7 V1 F6 \5 W) S1 N! `* N0 M: {; h
ACPI Spec 3.0# A, ^4 t$ L- T
2.6 D) l: }  I8 u( M
Intel Processor vendor-Specific ACPI. L3 i" k$ X; B" c
% \( @! L" l* j$ D! s
" n3 c, J3 h$ U& ?
That’s all!
5 x& O/ ]8 A* Q" ~4 c ! M% L1 [" n7 b( H
Peter
: r# z# D) ^1 N9 W& S
$ n" Q  [) r5 h# n! `+ |2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
6 h2 j5 c/ z$ }$ {
+ N+ o- L( [; ?) {: 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工作时间的占空比)的方式
7 Q; K) ?$ {# F,影响系统的功耗和温度。
8 i, m7 [" Z9 L: B3 U% W
+ W# K- e- k2 b! c% p2. T-state Control
$ F7 j& K# }% Y, T# p ! {) [4 a% O; j* O: Y" G
1)
5 K: F5 q! C( i( a8 G8 ]MSR Based Control
: p7 K% l, c+ x- ]3 |
5 |0 W! P" z8 S& }- K% CBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 + h. G' Z3 b" Q' U4 M$ r  k8 u

0 b, h  Y! u' H" N" ?7 j# a' _2)
' h1 s& ]( I, i) b* i8 VI/O Based Control
% p; W" `2 O- ^0 t( x  l . G  z% T/ q2 w. u, F  b
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
6 s6 |+ h2 u% a 6 ^$ _% k1 Y& N$ g* f! _; g
3). y$ y) C( A* d2 F. H) s
ACPI Structure For P-state
0 z: ^6 B0 \+ {l
  y6 W9 _& W0 r  |  |' D1 E
_PTC: ~3 D, G7 C1 }  F" _  l. U3 l
$ O, a( W: L5 ~+ j! l
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:# D3 h, f- d8 ^
) U5 R+ n0 P3 [' o
Name (_PTC, Package() ( L5 b& L$ V! F7 m) o( F
{
8 C# m4 I/ |6 ~8 K
, ?# e: @6 p# r4 K' Y. sResourceTemplate(){Throttling_Control_Register},
4 x% m1 L; A7 R+ I//Generic Register Descriptor
7 s  S" C/ a" h* O2 \- _+ l. B- S' F0 Z+ C4 E
ResourceTemplate(){Throttling_Status_Register}
2 k9 J. f( e3 @* ]4 y& t//Generic Register Descriptor % [2 j/ o$ u. \5 b1 g" P3 _
}) // End of _PTC
+ {: \' X$ `- U" i7 Y4 S5 s  p + h: W- g$ V8 Q, @) x
下述是一个sample code+ a7 g5 V+ S" C- u5 @$ k! W3 Y
- K0 K1 {0 X0 ^8 v7 l: J. }3 D2 W
+ Y! _  i) C; u- o  {' c1 a( \
//! J0 y) c7 T% I3 v

; N- |. s+ s/ Y$ [// T-State Control/Status interface
, N2 U, y  y2 a& L( D3 F9 T+ u/ K+ t
//9 B' u% c0 d- l0 S5 z" U
% I$ d! R1 E* }5 y4 |7 e# X- v
Method(_PTC, 0)
' G4 O7 `4 T4 R  |9 P7 [# K2 k0 l( M' q  S  E" s# k8 [' p
{. j, I+ q9 q8 r1 E2 l

' f5 v4 H% _) V/ t//4 U+ a% ?5 z. z- ~5 X, ^; z) u
0 n% S" G* Z7 L' N
// IF OSPM is capable of direct access to MSR
0 G$ \8 ^! p% I+ I" Y2 N4 Z7 C. U
2 s4 @, ]! H. m& @* C# |, x' c3 @//
/ P6 J6 q0 [! U- ?% p3 p  _* S1 C( [Report MSR interface4 d2 T/ N- S# q2 d3 B& s% h
- S) {7 [- e6 c) q/ Y2 T  `
// ELSE& T! l5 J& S& _% I% e+ h

5 f) D8 C/ H# ~6 C% d+ B( c# v//
. m9 O8 l2 d$ _$ l9 iReport I/O interface1 o: z" M7 X0 K2 T# A& ^) e
" Z; U9 o1 z+ t! k
//& }1 s5 Y" S) ~6 ?
, {5 X7 B. n9 v4 }* s
//
$ A5 K! ?$ I0 n5 ^# `7 a' F6 S! OPDCx[2] = OSPM is capable of direct access to On
9 v, W& G; h- d- T7 S- |+ K
8 J3 g4 u. D4 d//! h" q' w8 ]0 p$ T
Demand throttling MSR
+ o8 P" w3 E& P& t5 n/ ]8 Q, {
) c* V% f  W/ u5 W: \5 n4 {//) B$ S# T" Q+ k/ h# U

7 S# y: f' e5 x. a( ]$ b  ]; gIf(And(PDC0, 0x0004)) {
* [( K5 p# J7 k; L/ X8 D+ a. V( O. Z
Return(Package() {
) Y2 k2 a  T1 S6 c, |# u6 I" f% T1 l+ W( u/ T1 g
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 V4 o6 T( i1 N' n; @
4 A+ w& ?3 z" T* x; C* m! R: L- T7 E
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}6 X4 h/ a- Q' S+ {3 y) N

7 d5 h5 Z4 `1 ]- O% s4 E' }9 L})' k' A0 \: y9 o/ V. _2 q6 W

1 s. W1 V9 K" T& h1 a1 O) n}) ~6 @& V9 w& c! e& W2 d
) C( T$ _5 w1 N, l# a
Return(Package() {/ C7 e1 A% \- {. h$ N" o. E1 ?
$ ~+ o# U4 ?. j$ t2 m. R
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
- S, F9 d6 i1 @8 i6 F; M4 \4 J& f8 F& y9 w
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}8 Z; E* I% x( a. D
# \# R, i1 Q: ~/ a8 e. U
})
; j4 @! U6 x- ?( P  h8 m6 o2 }( M
}
/ b+ A; J6 N, }/ c
3 A- o( @" I% S6 J  {/ Z6 T# o# R+ j" k9 s& D
# N" ]* Z' m. P1 R: Y. i6 i0 g
l
) t9 y7 u+ V8 `) W+ \. o
_TSS
2 _- C- R  U; K. u
& j  i# j' p2 n& fThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:" O$ g5 b7 i, ]7 _/ F* c# C
Name (_TSS, Package() ' Y! u0 t" q0 O8 i; b- S* k
{# c& l- p) Q' I! g
// Field Name5 O7 t* y! W+ g! ^  [6 M4 ^. I
Field Type
* E  V' U9 ]4 K
! d" ?! V/ A3 G% M9 G3 n# x" O2 N7 g$ P7 K: g

; D+ g. U  i) N7 V; ]Package ()/ q( G& b  @5 J2 l0 P
// Throttle State 0 Definition – T0
, I4 q0 A+ b; }) |; B: l8 ?: y' \2 d! ~- V; L
{
$ t: c1 C. H1 N6 {! Y7 `, f! k) J, d" V- F

9 W+ N8 R  @  q! M! {FreqPercentageOfMaximum,
/ y, u5 w! u4 {/ D6 d* c// DWordConst
0 a/ R' V$ m% M  ^" \
: j7 w8 c8 g  E6 P4 \Power,
3 @$ h8 ]; e- h) y" K  v( K2 ?7 i// DWordConst : ]1 M1 p  d6 E! A! R+ D

1 C9 O6 D. S3 [7 DTransitionLatency,& K4 m" |' ^2 q4 O
// DWordConst
. u3 k" z  a7 Z9 B* d. r" F- x# x/ I. N( v; O6 k1 K  f
Control,. M% V7 {9 _6 g8 X  P( [$ k
// DWordConst
4 m8 E. ~& J! j. {
# e" M  e- t$ lStatus, K% Q1 C4 s7 h' f
// DWordConst ; T$ I# _# l4 L# P* M$ J
},( c5 x5 c! I* |7 f8 h
……+ G4 M; k; D( S3 J: w4 g7 F- n8 c
}
$ S  r4 X+ v: w1 L$ U- x1 N9 J6 u  _3 ^
Example code 如下所示:
: Z/ M: t7 a4 Q, C+ I6 ?6 d7 X3 i' b/ f& R7 F2 `5 u
Method(_TSS, 0)
5 V" e/ D& j- \# Y( A0 Y
; z. {& C  @/ ~" b1 N8 M{9 B3 b4 x& Y. P4 C& q9 G
. z7 q$ W" G. ^; Y6 v9 e0 m
Package(){100, 1000, 0, 0x00, 0},
5 e" J1 I7 n4 }# K6 F/ v1 O6 D. c5 `2 `& W3 n8 u$ J
Package(){ 88,
  ?+ c7 e7 q' o2 ~' ?- \7 a875, 0, 0x1E, 0}," e2 W+ \1 l( M6 L4 S, j

  A; ^. }5 b- V( K5 {$ XPackage(){ 75," ~, i+ _' K( e. V6 G% o9 _
750, 0, 0x1C, 0},
% g* p/ p* K4 s; A# z- q# u# T/ v) M2 Q+ M
Package(){ 63,$ K; Z& }6 m* r8 P* B4 H
625, 0, 0x1A, 0}," w( ^+ m7 U+ ~* r! k

& B5 s9 b6 F) X: Y" DPackage(){ 50,2 \+ Y# O! l. \, @' F, q2 s) v9 F
500, 0, 0x18, 0},
# P, d8 o1 [+ f8 W5 I* c% r
6 X  t: T  X  ?5 k  z$ Y7 tPackage(){ 38,% w0 Y  n; N5 l8 m9 T( i
375, 0, 0x16, 0},
, v! v, A4 ]1 g6 u
% u1 y7 `& q# O) PPackage(){ 25,
( j0 M9 [9 n$ `* A250, 0, 0x14, 0},
2 ?, N. O3 G. k- D
! H( F- ~/ U5 g- ]+ r4 zPackage(){ 13,
5 L. _0 ]1 R" a0 {0 |: o$ x125, 0, 0x12, 0}
: a+ @% s+ _  L+ p6 x+ Z% b4 j% e* M, n8 n0 s. y
}
" t7 M% X* ]5 L4 v3 ~1 _
7 K( [9 Q! J, g# f
* n- f* r7 Z$ R" X' A" d# Vl
+ W8 [& {, G* Z0 A5 o
_TPC4 ^, k: q+ h0 t  _8 G) W) l9 `& t
6 |, I) Y+ ^1 [0 p( u2 |$ c
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC$ E# p. E* D# c- @

1 G; T# @) J! B) d4 P2 X: Ml
. k$ p8 v' G9 b& D; n( l) @# Q
_TSD$ Z( x2 n, |$ D! w/ `; q

/ u  `0 a6 `! H! ~T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code! z4 l8 p' h! g, X$ b$ h# D+ Q
- n% L5 d/ J0 f
Name (_TSD, Package() . y$ e: J/ e0 Y$ E2 E

9 H; c$ @: k( H{ : ?0 n6 H0 }0 M  n3 _* ]. [3 t

5 p& k2 \0 |0 [4 k: u; J+ T/ JPackage(){5, 0, 0, 0xFD, 2}
0 j9 s( J6 a, }2 B4 V. x// 5 entries, Revision 0, Domain 0, OSPM
6 b2 w1 J% g9 Q) X* gCoordinate, 2 Procs
+ n2 Y4 {' n" g: C2 ^$ p% Q9 |& W( x' u) h/ S7 t

3 A' w$ Q# @  G! x$ G; G0 s}) // End of _TSD object
0 W) r) z" k  c8 }  J1 W9 F$ _ ! h2 c+ n! @2 \" V) L. A" Z
REFF:# c3 J" _: O2 L- U8 N
1.3 L9 a* u8 ]% A1 U
ACPI Spec 3.0, Q5 K3 o. s0 }- N  \5 U+ ]+ R8 Q
2.; C$ M9 a$ t: e" `
Intel Processor vendor-Specific ACPI
: D& e2 p$ P1 Z7 L( r3 p 5 y/ y* q) c/ }# A6 f+ \& x8 E: x

( g: h% ~, I' Y( _" P' F( N4 c, J% r: lThat’s all!8 i+ ]' m0 S* k3 l+ K' ^7 D6 W8 I
6 Q2 J9 Q7 K, L( h  y
Peter. A5 V# {- j/ y5 s* O

7 Z) Q: t. a$ F" ]2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 06:44 , Processed in 0.080651 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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