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

CPU Power States

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

9 u1 }. S# ^# H; Z6 F9 E; h+ v* l1. Overview/ i, _) s' t0 ?, l, R2 j: _$ P( t% y) z
% j# l0 E1 K1 a
! q( J+ w8 Y& H
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换5 o! F7 O: j. O0 n' Z# j4 U
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看" v, @! A' n3 o# l/ D; P8 x' r
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
  ^& B9 e) l7 j5 f( o; N. A+ ?  S4 P1 O9 q3 Y2 \
cstate1.jpg

1 _' g3 L* ?0 ^# Y% i& _
1
3 q$ c( @- g' q  g
2. C-state Control
9 n. J& I3 X$ h' M2 v; z) \0 U6 m
( c# i% B! c8 J1)
& w9 S) _7 n' w! |4 SDetect & Enable C-state6 Y; X2 u+ |$ G' g- B4 V+ P* l
7 m6 y- _) O; X' ~
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的支持。8 o. J; A! A$ `( t7 a) ^

( c3 h& ], X2 @" `2)
% e; C, v$ ?6 ?- o+ \! D# a' D. D6 T+ CC-state Basic Configuration
- v& b1 g  ]; d) u# Q3 C0 X$ K$ M通常情况下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)。
. q6 o+ w) A  F  L( o" S, @
& ]6 y7 p+ ]- r0 Y  u( o3)
; Y% I6 H/ m4 _% @: k! EACPI Structure For C-state
1 z) {2 S% O& M  p# N9 u2 N7 s$ Y2 J" }4 N2 `
l
( Z3 C& I& K) u1 K
_OSC & _PDC
" o% N: I3 e- r$ m0 p_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures. n' L# T/ v7 a) E1 ~
l
* u$ V& k3 s" i  P' s& b
_CST" I5 c' \% u: P) u6 O3 c5 H8 U
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:- K) O9 h2 J0 Z8 j
CSTPackage : Package ( Count ,7 m$ g. D+ i" h4 d2 e1 J( C+ u
CState ,…,! P! C0 Q! x! S2 p, M
CState )
' X  H: W3 z4 H  y其中Count表示所支持的C-state的个数
$ {2 J) z* e' e, a# DCState: Package ( Register ,7 P" y; d$ w' z0 X2 ~0 K0 d+ o
Type ,, ~2 q0 F9 L  `
Latency ,
3 D, b; P# R" |0 @Power ). r8 Z' y+ Y/ t
7 `0 v- d0 m/ ~; d
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 C3. j( n5 o1 S) V& I- O
  s& h$ g4 ]; W" M0 i. e
Name(_CST, Package()" m  q7 J$ m) Q9 ?6 K- y( i
6 T. |" {1 l; B9 k5 j- r$ q# Q
{
/ D7 S( g  v1 ?8 M4,# }" F, r! s! B) y  q
// There are four C-states defined here with three semantics
& F7 c! B: o$ B8 L, q! @; \
8 A5 N, _9 T+ d9 n$ Z3 }2 ~8 Q3 f
// The third and fourth C-states defined have the same C3 entry semantics8 w9 F* E' X4 J) H9 f. o7 B
( n9 z& d  a! }2 _. h
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' K9 v: a& C; R- r% U
1,9 w6 b% e* d; a* n, Q  o' Z( w4 S
20, 1000},2 d& Y1 z. J- O( a& a: }3 v

/ N: E+ Y% h1 H- e6 VPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,0 X* d- G' P, n; q, r
40,+ [! z# F' }; K& I
750},

  r" ~6 H; L- x- p8 W, c5 {Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,* {; K0 {4 U6 w! }& ?
60,6 p1 R" S3 J. H: T7 _
500},
. W9 d5 G) }' X: I8 M
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,# q+ K4 i3 V0 E7 k% ^' G, N6 l- ?% J
250}
- [3 U: Q+ `& p6 s( Z
; `) H# q9 ^9 O
})
) H9 _. |' c/ v, [8 ~+ h
  u8 s* {/ p- p2 J" Ll
4 [! J* S% O" n- c
_CSD3 {8 v) T/ |! D7 s  a4 \( W
# i3 a* _  d. z) _$ ~& `
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。! C  \6 Y. ^4 h( N) ?$ L

, Q: N( T; _; }4 X* j, w# R
; [0 h/ W) r  p" A; t7 N7 |: }6 t! L$ G& w

  [- e# U, ~# I2 n3. P_LVL VS FFH
8 z0 s/ Z. u1 n6 ?/ c! Y/ Q, G& b3 l
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2), r0 L3 e& ^. i. r/ d1 K. F- |
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所示:
( b9 W/ X  T9 `" m. g% p2 v$ I( m# X6 h
gas2.jpg

; V- J! s( C! w9 Y
2

+ r/ K% b9 s1 A2 AOSPM解析到该_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的一个例子:1 o5 @1 N! m: }( T; S
Name(_CST, Package()( D4 ~# u1 G! z. h) H' }

& @7 w* N) e0 V2 d5 J{ 1 p' P0 L7 @0 ]. N
2,
' {5 G& c; z! R1 N# k// There are four C-states defined here with three semantics

* ^% V9 ~5 K* `# S* i
9 {1 T- x. e7 k1 K0 l1 @// The third and fourth C-states defined have the same C3 entry semantics: O7 e* B* l' T

3 i. d% m% l# x; h& J: E4 A& g- zPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
7 H4 F+ k5 `+ `# T+ n6 Y, }( d0x01,0 S: p# P& O& ~$ w
0x03, 0x000003e8}," e$ C1 i. J$ p

9 o+ \- M# {9 ^9 Q6 I7 iPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
7 X: H+ `5 x( Y' M- Y. P" p5 c) x0x01,% a1 C$ [7 M8 |! L
0xf5, 0x0000015e}
: `$ r8 d# K9 i. w- b7 c
}) ; h0 K7 P, b& r( M- i+ g4 l

% u7 C, N! B: N$ M9 w/ m
. S. v0 W( \: ^( }% S0 b# aREFF:
# o- E* ?2 T( {5 H, d( m! r. @$ }" e1.
1 _; I7 s  i$ `% C6 g  `+ XACPI Spec 3.0
# o$ C' P5 A7 {# y2.' q8 k8 }- y! n
Intel Processor vendor-Specific ACPI' v$ O0 F# D3 i& ~- T7 r# X' U: a
4 j- j9 O* o. d# o$ \

; P4 [% G# a' `: FThat’s all!6 L. f, p2 K' w  }) o0 s5 [* m

3 r+ q, a4 O& H6 S# i1 lPeter
  I7 t& w" C8 p! U$ ~
9 K4 Z6 M9 s. `- |2010/9/20
9 L) R! e' {8 R. t
* D5 {; A4 \1 j0 A) p' @# W! ~- r[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview& N" ^8 ^7 q! A" G, i5 I1 E, m$ X
  v" X- \  v2 f( f
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST9 e4 d4 [, o# b% P+ H( x" h1 q
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
% M1 f0 H9 z( q/ D5 W 1 {# ^) c+ A, u1 w/ a" ]
2. P-state Control
) D; y8 P0 t/ I  q7 {# a! H 5 t' D/ B) e: j6 `% Y% J+ d: _# i
1)
* b4 e! r& e% b* n8 Y) MDetect & Enable P-state; H) m6 Z0 R1 X4 I, ]( i- y
, F& r- v4 P1 A
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state( K: E7 [. a9 j3 t; @
2 |1 ~- Q: e4 s" d" J; r
2); {3 S4 s) o. c) P" @: }9 i, `
Supported P-states& x7 y; O. z7 S$ e) ~/ x
4 H0 S3 [+ l& |2 y. A' M) E3 m8 Y
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  C: U  A, x, w+ P- O* o
+ g% M5 ?- z1 H1 ~. q7 }
MinRatio = PLATFORM_INFO
3 y* B: U% Q. i) |MaxRatio = PLATFORM_INFO
% ]( ?+ t1 ^0 mRatioStepSize = 0x01
3 H! U: ]0 p5 o/ [5 F5 [$ FNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
  j7 F  S' x# i2 M- K
8 V; D* K9 z. l2 RIf(NumStates > 0x10)" t8 p- p) p7 O2 I5 ?" ~
{
7 ?" R9 N/ z/ z0 K+ e. g- X/ E/ BRatioStepSize += 1
7 f2 m- [( [8 b# ?) y# i+ dNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1* D% Q- w2 f! {( u+ [
}7 @$ T8 B+ h; p8 Y# E; d( j2 e

( U: M. r# O! x8 n3)
! o: j1 q, R/ t9 d3 U) w% X3 p4 R# U. xTurbo Mode
6 l% O# ]$ r! n$ Z! d
7 b% _: i0 Y9 x2 G7 M- h, |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
2 x5 o$ A! d. g- \ ( N8 W' t/ e8 k/ B9 ]: B9 @# \4 j
4)
& C" X# b- T" A* J' TOver Clock" f& \" `' Q1 e

; ^# O- x" `; h1 D某些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/ M4 T7 w2 C8 L- ?+ \* U, q
) {. E0 H' X! U, H: O0 b0 J
5)5 E& {: Q  L, r/ u. p
ACPI Structure For P-state
+ m* `: d7 F, X" O: x , B+ \1 q. C# X/ v5 {/ t
l
% p/ A8 [  C% _0 n/ l, W* Y' @
_OSC & _PDC4 x2 k0 t& n4 y8 {& z
" B1 @1 G2 m8 C$ m) G
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures* L0 u0 x/ ]( ?3 v% Y* a
6 d% v: m4 g' U: s7 |9 H" E* q
l
2 ]9 X1 q/ P( r
_PSS8 p- X, r5 H, m1 r
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量+ V" t! T: g0 t! 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做比较6 X% P( i' M0 y9 y/ u* b2 ]
以确定P-state切换是否已经完成。
4 ]: J4 j" \) W, c4 b$ C4 [6 {
; s3 A+ E  }$ b8 {Name (_PSS, Package() & K, M; z! J" h
{
' H" Q; [- }3 X1 }0 w3 c: f// Field Name, c' ?, y; W; s8 J( I
Field Type ) {4 E+ D  B: `' ?
1 Z3 w) X  c/ v% Q* L" @4 O
/ j1 n, n, z1 _9 a' f

' p9 i5 V1 L: N+ wPackage ()
8 G$ _5 E, x) i* o0 Q// Performance State 0 Definition – P0
# ^- P4 J; Q/ z4 F" |1 T' q
& h( e, S6 p9 r; p2 i9 D3 ?9 B{
" I& a7 }/ q* s1 a* j" M  c8 ~: ?- E" b4 L, `; x
7 A6 J  x$ D; `, z
CoreFreq,
# C3 c7 \3 }5 @/ Q: P# W+ T' b+ _// DWordConst
4 S% W) r) k/ L$ I4 _( D* `% r9 {" T! Q
/ ]* o4 H4 @; N$ y1 s
Power,
2 K7 B/ l2 G- C; r- r" T  O6 `. ~// DWordConst 0 K5 N1 s# N! s, J

, e; ?2 r+ A9 d9 s& e2 [6 W4 j( STransitionLatency,
0 U" A# G2 X/ [) x2 C// DWordConst
! k' x1 X' S/ [' g' d
7 ]# p5 e; L# }BusMasterLatency,
" a  U8 `3 P' }0 M1 M3 j$ e// DWordConst - l, N5 P: {5 |# a* M

6 Q: ~* ?! Q* k* R& L& B2 \Control,/ v7 E& d$ s6 i7 k
// DWordConst   l, R7 [& i  Q' y

) Q% R3 t' a/ M& vStatus
$ D5 R3 I$ K* c1 k' k0 {: f# Z' g: |3 Y' ]2 B9 G9 |
// DWordConst ' @3 [4 x& i  x7 S

6 d  r% e2 I) ?! g}, 8 i+ T0 W- e! t6 `, k
8 m$ h+ W5 a" i  O! H, N0 Z
. 2 T- C- e& y" b& t* D% O, _
" m6 u. d2 |- R0 F
.
2 K! e* ^1 j0 ]6 N/ L7 F* N
/ D% U4 Q& [+ O) y  V8 O2 d.
8 b# D, ?  w, V0 p; }* m" y}) // End of _PSS object$ o' ?+ `% c: u
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
: x6 i3 H) I/ ^" o* `6 _( X
3 _. k6 {  Y# B4 u; ~9 XName (_PSS, Package()
1 h" f! F; ^1 U6 J3 F/ r- u0 n) z6 D5 m
{
& _0 o* T. Q8 b
; a4 d$ F/ v/ p- W! x/ T) ]Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ) H4 U6 N8 m/ B  D4 \
1 ]; X8 r7 x; K0 g/ v
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
  n( {1 x+ i3 U& M( o5 }! s! E, o3 v) G5 z
Package(){1400, 8200,
' X* k9 [' P$ q- {& @+ V% L10, 10, 0x000E, 0x000E}) \3 n( w$ `: R0 S: o
// Performance State two (P2)
/ x$ x- m! L) O5 qPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // . X8 `. a( g  m( s4 {
Performance State one (P3)
; H) ?; R' t8 I( {. Z* t9 J2 m
3 L" q- j7 L5 l/ I" ?7 QPackage(){1200, 8200,: V2 J7 |5 N7 ]
10, 10, 0x000C, 0x000C}
$ \2 g$ i! \: h9 F% O  }// Performance State two (P4)
" `, G* |9 S+ h' k7 t0 U, H3 B
}) // End of _PSS object" }/ a- o3 e& I# b/ n3 ^/ m9 l: g

& t6 \& q+ ?/ e6 O# r+ [另外当该平台支持Turbo Mode P0将会reportTurbo Mode
. H4 h' @3 L. _' Y( j5 p 6 j9 @5 B) j/ x5 U' r5 G
l/ `; c# R* g+ |# m  c
_PCT
, {0 W  K" [6 g8 M4 I+ w % e9 {; p/ e6 I  a2 g5 }8 |
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的方式来进行。
- z/ b, D- Q- \8 }" \" C$ A7 n 8 |; e" A" F. }$ @/ T
Name(_PCT, Package (). ?: C0 U6 a) w% I7 A2 P$ i3 ^1 [  l
// Performance Control object
2 P5 V9 \) R& A) \: d0 Q; a  m9 l
{
; i. {0 z2 T9 i7 ?) |" k) j
4 B& e" f  {) _: {2 ^# s* vResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 q2 B% E8 O+ H: `// PERF_CTRL 9 f4 z" `* O4 Z' b

& p( B# [# U1 X1 V: `' @- OResourceTemplate(){Register(FFixedHW, 0, 0, 0)}2 h- m+ f4 b0 w$ g+ |! L/ t
// PERF_STATUS
  K, f) |7 m+ |2 a
: N! n  }- k) W: c9 c2 c}) // End of _PCT object
+ D. T1 B2 {- U; H0 p- ^4 s, f 4 L. @9 J" b- v* f
l% p* c5 Y0 t2 P, g7 u" E
_PPC7 D6 h2 a# z/ n6 ~: _  K- D

9 f. p" D1 ~: G0 _( f$ v/ z5 zPerformance 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
, Z( L  A* \3 s- X & Q( y7 S  ^! N# U
Method (_PPC, 0)
" A4 J8 C5 V3 `8 Q7 f// Performance Present Capabilities method 9 o1 n& d; m, z! ~. T9 t
' C* r8 C# m2 Y4 q& g& `* Q* j
{
( P4 k8 {, ]) I" h  B+ h
  X0 k: n" C& }1 ~- lIf (\_SB.DOCK)
4 D; j+ f6 f0 l( ]) j
8 @3 P5 ~) x/ o3 d1 C, H; e" |7 _% r{ $ _5 B) e$ L) B* {
! ?, b( s7 g$ H" m: P
Return(0) // All _PSS states available. s( m6 l9 f1 P- S9 M2 r

1 }' T3 r, n1 y6 L  i
& B! I& X* [/ W' G}
! c6 ]$ r2 x* }& f5 x: V7 `$ h$ m+ a; L- ?$ C
If (\_SB.AC) ! B, a+ }' v/ \2 F' k+ I% y
: V. \! ~3 p8 J& l$ T/ h
{
: e" E" h# o2 _3 B+ k- _; k/ `
+ j3 f! R6 T4 K) d/ jReturn(1)
* w* P9 e  v9 E6 G// States 1 and 2 available ( k: M6 J2 m4 O8 D9 L
2 I' n' N2 S- [, I4 b
}
( @0 L" V( T. l2 {2 v% l
, D- \2 U. \, U& O' q" g; qElse
' t/ f; ^8 A  o3 G# i, |* N. a
9 H$ Z; @. Z4 A2 ^2 i{
9 H) k9 D& p% e" s
; [1 Y0 f6 }0 m/ y# n$ wReturn(2)
" [6 r  L! `3 O5 {, D- x// State 2 available2 w- h! s& o1 I

- _5 [: x+ S8 q* ~& f}
$ M& ^! [9 E6 Z
6 Q  ]. n% x" m5 X8 C/ n} // End of _PPC method
  f% h3 E; h+ ?/ a+ E1 L/ C  b
2 ?) ]3 e' d% v+ |" {) p8 u" gl
: V  c2 v6 n) [0 `+ K* ~) r5 N
_PSD! p5 I1 I' t: o. L) w( K. j: u- _
! e" ]" ~+ @! @% a; l4 j
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。( u5 I! N. V4 Q( `; w
' N. a% O* B) G: d1 D
REFF:6 I# Z* h5 J  c+ `3 A
1.
8 \; f6 N" s6 h0 S2 |ACPI Spec 3.0' `; p. w( ^: E2 \6 U8 \' I
2.. ~8 F/ d" M7 K% o  n6 w8 C& D
Intel Processor vendor-Specific ACPI
0 r* W, H  \# [* u1 U$ S# T # y  F" o0 R% s
+ ^8 b' r8 a8 H- u, k3 e
That’s all!
# v; W( Q( B6 q8 Y & f, a+ A+ t* W! }
Peter2 M6 Z, I2 u0 I  G& n" ^
4 A: r* I+ o) ?) S# S; ~
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
; ?6 B- ]6 @& {7 }+ l& D% F 4 P8 j, p/ D4 M( g0 g$ ^# T
CPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-stateT-sate全称就是Processor Throttling States,它为OSPM提供了一种通过降低Processor Performance进而降低系统负载和温度的能力,听上去可能和P-state很像,其实是有区别的,P-state通过调整CPU VID电压进而影响CPU的工作频率的方式调整系统系能,而T-state则是通过调整单位时间内CPU Clock On /Clock On + Clock Off)的时间(也即Clock On工作占整个CPU工作时间的占空比)的方式! z( M4 _* \' N: [; F1 n
,影响系统的功耗和温度。3 d# k+ j! b5 _+ R- A
. }: F0 O- x- I7 d% ~
2. T-state Control; c7 A+ O7 a& o' Z4 \

1 u- @. L! C  e9 `& a/ a1)4 o8 Y  G3 C2 `- f& Z4 v, }& C
MSR Based Control
* q9 j! D. R0 u* a1 j
& E! x3 y! P5 u8 L  J+ a. i! A7 BBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ( b; U$ E. u+ `$ |
1 a# u8 r4 m; {2 v/ O: {! P
2): o# r" r1 I9 i4 S
I/O Based Control
- F9 h3 r5 X6 z0 l ) X7 l) R; P' j, x7 R; o7 }! W3 u& z
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。3 ^4 j! A( H$ _( x! \

+ H# e+ l0 H6 }/ ]! w3)7 o6 z- m3 z4 h$ b
ACPI Structure For P-state
- [8 T7 `7 h% p# |l, G7 v2 g# r5 c9 J, q& u+ s
_PTC; \9 B8 ?" n0 ?. p

) f/ [( N% |1 I( _' lProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:& a/ ^2 H- s2 Z  A
0 J# g) V! g/ _  ~
Name (_PTC, Package()
+ _4 Q# m9 E3 ~! G2 S, y! r+ w# Q- E{
) e5 a, u# n: Y4 s: f) \& r9 J3 P- g: \0 G8 c
ResourceTemplate(){Throttling_Control_Register},
( y; _$ L  W* \, M% s7 [- {//Generic Register Descriptor 8 z! J+ r* F3 U
& K( Z7 e1 n8 B  S- S& N/ I% j
ResourceTemplate(){Throttling_Status_Register}
+ Q5 C6 r* e1 `+ |4 u( G& C8 J4 ?, I//Generic Register Descriptor 0 ?. G' _+ q! ~$ i5 q
}) // End of _PTC
4 }' e( }$ r. h. }5 K* b& U 6 o# x& M  D) i  F) D' g+ b. ?# T
下述是一个sample code
/ b( b0 a2 R: {5 R   V8 S+ d8 b6 o8 i; |5 l: o

+ B7 s4 V) u2 ]' v, P
//: y  `1 K# _/ m; [6 p
& v) l; O0 f; w9 J1 ^. w
// T-State Control/Status interface
# E/ f+ g7 ?8 W4 P) ~: m. F, N  l6 c- X. T. g$ o3 n
//+ I- H. `* k; C) w

5 i, Q; B8 a6 ?( Y& X0 KMethod(_PTC, 0)4 |& e1 f$ S! t+ R! b
0 v: X8 ?+ H: N; Q* ]
{3 S) {* j3 j' d) N" K2 o( q
. }6 S; s) O9 z& g% p7 `
//( K3 {! W9 ]: n% @* x
4 [9 z4 Q8 F+ {3 c" J; p
// IF OSPM is capable of direct access to MSR
0 S/ U5 o- b7 [7 y3 v" H, S1 ]
9 i9 M" g- T. `, J! h$ G//
' T* T3 X: ]4 S' i% K, ?Report MSR interface
; |& O5 u2 e- S: ?8 B' j, M. c$ [; {; s* Q
// ELSE# j4 }8 `6 O- ^4 \. g4 L  H
3 Y$ x: |0 P: Y3 {$ O" Y
//
& N* a0 \$ M) M# O' |: O: a% LReport I/O interface+ }3 o# P  L- Q4 z  j

& B1 l3 n5 h8 d3 j. x4 A* W//
. x4 n9 g* ~" K- U8 j& U- K" i8 @7 a& Y6 a
//
% y# l# [; F, @# |5 iPDCx[2] = OSPM is capable of direct access to On
+ L; `( o. d- o8 |' M- b2 u2 X+ c0 Z6 @( ~5 {
//% B7 I# O' T$ P
Demand throttling MSR7 \" A5 G8 e3 K: ]/ t7 e

/ W  q7 o1 U3 i//9 B. a4 z  ~- F7 j3 ]- n/ b' w& N

5 H* N0 p, A! M% O7 tIf(And(PDC0, 0x0004)) {
* e& x* J) U7 ]* h: R
1 m  n; h7 ~- t7 }& K; oReturn(Package() {0 }+ o* ~$ F. ]$ G% g% d- Y
3 p- m% P3 E6 L3 z
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
! Q$ F% S' B% h0 M6 m/ i) g
6 O+ r$ r' z# m( V6 IResourceTemplate(){Register(FFixedHW, 0, 0, 0)}7 `3 R# M+ ~4 h, E% |. G& o; t
! ~* s) |+ t0 \: w
})) `  x% `6 Y% x. H5 ?6 C2 w/ b
! e8 F0 f- t# J% a" P5 T
}
  ]' y; U) ]3 _  l- \& F4 L6 `+ e' {4 a& R8 t
Return(Package() {) z; h/ Z8 s0 m: G$ A

" Y. E7 [, s5 qResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},- P& i" J, l8 H% X

1 c6 r- @/ x1 t4 kResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}1 q, ^9 v6 C; J8 M1 z
! R# P# K* x+ k/ T
})
+ k5 _( o. v- H
: s/ f$ _# c% g}
9 [# ~, E: `3 w9 C+ G: P( P6 O' q: q9 D  ]

. t% N7 h( f" V  M, x+ y" s1 b
! F( a+ v- `) u( S3 V" il+ F9 |- L  \& X: Y# Y1 }
_TSS
- k7 h( V& u" \% P& T9 d
- u9 U; R" b# TThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:) c6 V/ _: |5 ?; K8 O5 u* h" V# Z
Name (_TSS, Package()
% C# A3 X" _2 e! H. d4 A{5 U2 j0 j" Y* k+ V- F, v; K2 n
// Field Name) p8 @* o4 k7 U. ?* c1 ]
Field Type
, Z! w' k) |" j$ O$ M
8 Z' F: F0 I$ R( z* r8 Y
& V* d$ W$ e3 e" P/ p4 i
+ e* F) ?5 b+ g/ h( ]) yPackage ()& s% ~; w# n, r
// Throttle State 0 Definition – T0
1 w; v3 ^, m* I1 ^$ D( J8 c3 v
  `1 n6 U2 J4 t7 J- A  I) }- }{
' q4 D! P( J$ S* @  k0 J* G- u* R1 t% f8 E  X/ w: W
1 f% \% Y3 o% ?* H/ [
FreqPercentageOfMaximum,
  W) K: U: C& a, J// DWordConst
0 c( J: i. M' u/ A- j  c
0 Q1 p+ f: b2 [- p/ {- nPower,
2 r! l0 W  R3 z9 R// DWordConst & ~& z6 a1 Y7 B+ j; ]* d7 ~
4 F# C$ m, K: ?+ }. U
TransitionLatency,
  @! S. U' T$ C# k- \; ~2 X$ \% ~& P- e// DWordConst 6 o* h/ Y) |5 ~
& M+ ^* w# D. v0 Q7 R, e8 ?; p3 m5 P
Control,; \6 I; f$ p' k: F  ?+ S! @
// DWordConst ! g- t7 L& n  N* m# T8 [$ W
6 t3 s. S  y7 q3 g: Q5 d3 t& O! x
Status9 a" e- x9 N1 _
// DWordConst
0 ^7 d/ ~( I1 V4 F0 ]},- I" A2 V0 E+ q# `
……
3 \: z% u9 c6 O1 ^# H}
& c9 Y* [  T( U) j( ~/ \. f% M% C
Example code 如下所示:
+ v: w* a  i8 p  X
: t& e6 @9 E) S- O- UMethod(_TSS, 0)! y1 q, h8 h& s& a: K& N. ^# _" M

# l" f0 P5 n5 `# l9 A* L- W0 e+ I{
4 W  D( X7 v- c6 b: D% _* H, R+ T3 t" ]
Package(){100, 1000, 0, 0x00, 0},9 _. E' l( C4 u3 G& d

" r* P& t' c2 a* z# S, _7 YPackage(){ 88,
8 ~( F3 I: L$ d! `" E875, 0, 0x1E, 0},6 i0 h% H- K* B4 R0 }$ ?( X
8 p+ b3 \# g( z& n  m
Package(){ 75,, H3 ]# ^$ k8 T
750, 0, 0x1C, 0},
4 w& Q: \7 B+ C9 U
& I! D( M! E4 Y" F0 g! O5 dPackage(){ 63,) z5 a) C1 |( S% D  C9 L) Q$ O
625, 0, 0x1A, 0},
1 k" K* `* ^2 y' S* |/ `2 V5 y# q
Package(){ 50,; d& |1 v' w/ ^; {
500, 0, 0x18, 0},1 N5 Q- L* Y' u$ T* M3 e& C- X
/ Y  \' Q7 F" c6 M* t7 }
Package(){ 38,3 Q% s$ X$ N  T# f: ?/ E
375, 0, 0x16, 0},7 T- Q' w. Q4 w" d

" \. e  H2 v. Y: A6 JPackage(){ 25,
/ x! g* ?3 y7 {1 m' ?250, 0, 0x14, 0},
9 H+ e# r/ b! N6 E. g$ \) V; D/ P( c% U, i; B
Package(){ 13,+ |% c$ r# L9 v7 q4 J, b( t
125, 0, 0x12, 0}
6 |. `) ]# Z1 S( \5 V8 ?! H, V# i  y
7 D; v5 _$ W& y& v1 O}& i: ?% E% x3 S. p
; ~5 J2 ^9 Z  n# a- [

4 a. U: L5 t7 N8 K( Jl
& D& L0 H- z7 C- z4 l7 R
_TPC0 m: k5 J+ e; _
" {) E/ E8 c" S
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
* S; Q$ L6 E+ E# [5 q( \" Y
& k9 P& b' ]. J+ _l4 T+ H. U& c. N' U- \) x% j4 s
_TSD$ _" q! z2 F+ M
9 w0 n* t$ n7 o) {
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
8 M7 _' U" U( u, }7 e / p* d/ n# e' P& B
Name (_TSD, Package() & ?" b( s" N" q- Q
8 o0 w% E3 g$ w: k+ ^, w1 E
{ 8 K) z6 o% q- {2 a( T; V
1 s4 i! w1 e( O* p
Package(){5, 0, 0, 0xFD, 2}' ~/ s* g4 j) q9 J6 ~
// 5 entries, Revision 0, Domain 0, OSPM
+ m! O/ v- p+ D5 L3 nCoordinate, 2 Procs + R- N- M# A! r
0 s" p# z/ ~6 Z% E( M2 N% s2 W, `

" ]& H- b( J- C, u- b' k. \}) // End of _TSD object
9 f5 S4 s9 j, K
, O" r1 o# R, c2 BREFF:
/ G/ E1 k, @) P9 N1.* g& D9 d( K8 C  e5 k/ l+ ]
ACPI Spec 3.0
7 x# j5 x; g; Y1 l" ^  ~2.
2 B2 h1 O" c" u  D8 o1 z6 s6 IIntel Processor vendor-Specific ACPI  n: F) h2 f* H
8 `" T1 c; _, h1 h% }
; I; u9 h1 D% i) ^
That’s all!7 B5 @6 Z( a1 o% w! q  n" }+ I# b6 q: q

& u! r4 ]' M/ l* _* k$ l+ r7 N+ ~Peter
- s$ M6 ~/ }/ K( j+ N
3 q7 q6 [3 R* J# _5 t7 k2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 16:05 , Processed in 0.054322 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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