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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
& d+ h. S" f! t; N4 U
1. Overview1 a- m- L$ p: a8 {

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

6 ~" R  y/ U3 q) s) ]8 e% w
1
- Z9 {. R0 O5 O( w7 a& q$ N" k
2. C-state Control
- ~: v; R; y0 V- K# [2 @* o# @$ W+ `% A: x
1)1 {/ V, T2 c$ o7 L
Detect & Enable C-state  N/ R" {( u' a

  [: u( u; p6 {0 wBIOS可以通过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的支持。
. X2 z" S& W8 c5 Z! H3 @* A2 r5 ]; m+ K9 g7 y# N: M* }. s
2)* m4 y6 B! b6 T" ]
C-state Basic Configuration
' F+ p" g0 _& B3 G: E8 t2 z通常情况下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)。
5 s3 {; [5 i6 i: A7 `
$ B5 G1 b8 W% d; E4 W( M' j3)
* B: X! P+ j4 k% S7 NACPI Structure For C-state' `! k. ~0 X" i7 x) ^' H" s/ G
" |; i1 A% B, G" u7 \
l
* i1 \2 v& w- K. {  \: v) v3 y
_OSC & _PDC% O0 v; q4 p! ]2 m- d  Q& K/ `) X) _- N
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
/ f5 F1 z9 [9 v( ~l5 r8 w% W* o6 K! ?
_CST# Z9 F3 t- ~6 v( Y& m" X
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:' X6 K1 c  U/ q- g* P" U( n
CSTPackage : Package ( Count ,, [$ q. r2 P+ F: g! Z* Z
CState ,…,
5 ^$ Q  \' O- H% U# }" ECState )
) `- F8 c9 G8 G& e其中Count表示所支持的C-state的个数
! h/ F& N' J# G$ I5 CCState: Package ( Register ,% c6 H. o- Z, ^' m8 o$ Y! D
Type ,8 U6 z" h0 |* h! k
Latency ,
3 R7 F; D& M0 X. @: R' X2 x: bPower )
% E: [8 A" B2 ?/ b! Q  V8 U' x+ N' k
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
0 y/ h# `1 ^5 }6 H9 a0 T2 h0 F# B3 q9 v
Name(_CST, Package()9 ~: y9 D1 p" h

0 A5 ]- {0 Q; P% H! e$ o  a: Q{
  a; ~6 _3 I1 r/ I4,
8 k# C! |: _; O7 h) e// There are four C-states defined here with three semantics

4 }" l6 [* G# `7 b* }  I5 [% r; P2 x+ ~% j0 H' P- M5 R5 c, ^9 q
// The third and fourth C-states defined have the same C3 entry semantics
3 k* U7 x  |  H+ k) A* E3 g; g$ O% M, ?1 Q
7 J. v) V$ H3 z' B: G/ I) `
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
- A; h$ {; I) a% E, F1,
  v1 Z8 I* o1 W+ `( t2 [20, 1000},
; k5 S/ g9 w2 u5 m
  g# K1 O$ ]& b9 l* X1 y
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,+ d/ k+ ?! O- K2 t" y
40,3 i  Q. N/ o) A% P+ `/ d+ \! y
750},
7 B3 d( d3 a& F# r+ u- D$ G
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
6 E: V1 {- c0 p& F0 R4 a60,
8 u6 [/ H5 V& S- J7 l/ A500},
# `, L- _" T/ z8 g; P/ d0 I
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
+ z: @+ U# i4 n9 {5 O250}: M+ L# n% [- H$ A) G/ m
: |4 G) k! e' P% x6 f1 l
})
% d7 @" u$ @# n  o0 c: V& p6 H* A9 Q- A0 P# w$ D) G
l
; j+ D6 q. I  c4 c+ o8 j: a
_CSD
  C9 k  H# u6 l
: a' ^0 E* \2 lC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
  Q! I  m5 N+ |
( ?9 E1 s/ U8 _9 x0 ~/ T* u/ M, v: D9 k! [$ t

' ?4 I' v9 @$ U2 r. s, y) T8 O
: b1 ?7 ]' _% W* V7 V) X0 Q7 }- p3. P_LVL VS FFH1 A' s. o0 i/ _  p4 P; T
6 H1 t9 V4 @1 C$ i: @3 c1 i. t0 k
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
2 y( v. |; z' I1 B) q4 }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所示:, U; X4 u7 \1 L- k
7 ?. I/ k+ @- O. x3 y
gas2.jpg
- F6 ~" @# W, ?3 ]
2

/ F+ ]9 m: y& k7 F6 X# k7 ^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的一个例子:
. K/ z0 V  \  \5 c$ C& vName(_CST, Package()
4 ]9 X: Z7 r: v% H+ m

  v5 c" {2 k- L. U6 A{ 3 U1 X8 V: }4 b4 u3 M" d2 y7 a
2,  P7 U6 Z5 N5 l  f1 ^4 t
// There are four C-states defined here with three semantics
* {2 ^3 ]4 ^/ J

7 w7 N5 ^+ P" {; [8 J4 ]1 Z// The third and fourth C-states defined have the same C3 entry semantics7 b8 z: H: k% [

2 r2 g  C, D- I2 D4 F  n9 zPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},! c5 D! X1 k+ ^4 H4 F6 N4 q7 D5 _. M
0x01,
! l8 Z. h$ Z: W9 r3 [0x03, 0x000003e8},( e9 d+ \0 h, h3 Z4 n, R
9 W0 @' g# I$ x( i2 ^8 P, _
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},8 `! j8 ~$ J( ^( @* N( r, J
0x01,
, N6 x8 B2 W' f0xf5, 0x0000015e}

. u$ e( V! b7 N$ M/ l6 p# p! I}) # \  |1 R, X9 A" d0 P

. B( h1 i# W% `7 U* M
) ?& b- o" S/ R( Q; I) AREFF:- d2 e" \& [2 ]# |) m
1.
9 j  k; b5 |3 N: dACPI Spec 3.0) x' P9 R& _% J& x. b; K' d
2.
- u9 c$ h4 V5 \3 IIntel Processor vendor-Specific ACPI9 G7 ?! d& Z/ I

' |  M) w$ x# M
: E3 ~3 L) w1 e/ @That’s all!' Z/ k7 {! Y9 v
3 ?7 _; K% i; ]
Peter* s& S+ ~& `* Z( s, H; e! ^; w
3 W2 E/ m; }4 ]9 j
2010/9/20
' y( ~/ D3 ~& ?, M
) i, H+ u# V+ {[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview3 ~+ f( v4 s2 b9 P# c. ]
8 }* j( m3 Y5 _/ d8 X" e
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
) \' T" }& S4 \Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
6 K, X) E6 z9 x& Q : c, @, p9 n( y
2. P-state Control
! q, D! e- T$ L1 n6 D! X- ~
4 |& [  ?* I# B& }3 o1)
6 X  b, I0 Y1 @  X* oDetect & Enable P-state
2 e7 q' [; N8 w& {+ T ) D* i. q: ^' A7 u! c$ U
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
9 F) m; K1 }4 J / ?( Z/ D" g- x8 ^  ]2 D+ |% k
2)/ O0 m) I+ O1 d3 A9 X
Supported P-states3 D: e; z3 t  l. v- u8 E5 \2 c

! G( U0 Q! C' UBIOS 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
6 H- l- `/ J$ w' F ; {1 v8 \' ~/ z6 U1 A/ h8 W
MinRatio = PLATFORM_INFO
9 e  B* T0 y4 R2 l2 |MaxRatio = PLATFORM_INFO
% \7 R  W$ l* E. A  T6 B( TRatioStepSize = 0x01
4 v! a/ D( j4 o" w6 T  INumStates = (MaxRatio – MinRatio) / RatioStepSize + 1) E; W0 v6 y6 `0 O& g
3 m8 l1 @7 [. C0 W, O
If(NumStates > 0x10)
& q, w$ l( W, `% O; P! Q8 l{
# }( H' ]0 R" p* sRatioStepSize += 1! c9 k/ V  Z4 p
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1& [7 W+ \) N* B5 ?4 H
}
, |" |" p& G+ n6 A : U$ X9 s  A! x! N: ^
3); `; F8 U- v7 ?% Q' P3 @( o7 F
Turbo Mode6 ]& |+ O$ s$ s8 t4 N" B" R# k  l
+ R5 l# G( s, C: E9 p2 J
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
- j: t. h' p) ]( o$ Q
8 k7 s  b2 @/ c7 X7 t5 ]4)5 X" H7 U2 L5 D. m6 }" l0 S
Over Clock' `  j. [4 w4 z: s- h
5 J; }; L3 V7 [' ~5 {. _4 x# W
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
0 O+ r) s2 E- A
. D; e2 d! v: [- [) @$ G  X; S5)
) g& ]9 l$ w1 S+ h' p. YACPI Structure For P-state% L1 l" y: a" f  M+ C' U5 x7 _

' ?+ P1 t% t0 q6 Q- S# Zl5 J6 b3 ]. H% o, M
_OSC & _PDC6 s& [6 x( ^, d3 ~

: C" S9 }; m7 v  e; {/ L% k& i. H" P_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures( q( D8 x( `# U+ c. A1 t1 P
; R) q; o: j' l( L/ h, f% {9 Q
l
+ P" M0 E+ j2 n, l/ H
_PSS5 Z) D' N/ R3 q
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量- B3 {$ x. j2 {' @( B- c. y9 o3 J, `
并且通过一个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做比较
3 X% C9 u3 w% W$ A! c( @3 u0 |以确定P-state切换是否已经完成。3 Y' @- K9 Z& P6 `$ ^, S; q  X

  f9 ?" T5 R! q" ?9 C* VName (_PSS, Package()
5 x0 x5 O) X2 S$ A; Z: H{
+ r1 p4 L2 j2 b/ e* l// Field Name
- C/ Y' Y# }. s* }Field Type
# ]5 N6 t; K+ p! D% U& C* f. T  Y( ~6 u9 e

! y# n4 a; h9 T
$ c' O" F9 F; Y) GPackage ()
  F6 z: S( R+ G1 u* ^// Performance State 0 Definition – P0   F0 ^: @6 b2 ~) F" i% g* c
* j% I2 m: `; J( }6 h( H
{3 y: B* V+ Q, T1 l1 ^

  u; j5 U# ^: Z: d3 D& |; D6 L4 M( u- K1 x- m* D
CoreFreq,
% ]1 h3 O# d- E- j8 `* W// DWordConst
4 V9 ?3 s9 O! a8 Z- {: `' ~5 V5 R* x- J( ~% ]: b0 t4 H

* t1 N3 V5 D& c; {2 ]" DPower,* `  A, y( s3 M. Y
// DWordConst
0 S, N; ?; t8 k9 \2 D6 b' p+ p1 _. V  {& G  @
TransitionLatency,3 u  X. |) X' }, `9 \$ o
// DWordConst
: o, e7 a: M3 s* \( Y4 {# t$ n
  }3 W/ I# i! m7 ~% u+ a( T# B( zBusMasterLatency,
  \2 ~, L% e+ D6 z0 p1 b7 O: ]6 `// DWordConst
1 z: l9 e  h3 b2 h
+ p+ b( d* K4 fControl,! I# K! i. C% s) l
// DWordConst 8 D- k: @' Z, B$ R% j# ]7 ^1 }
6 _; Z% s# Z" a  p4 a2 R
Status' m! B9 U4 D, l7 ^1 x/ v
" ^* ^6 X5 ^8 ]* Q+ V. J
// DWordConst 1 B  ]- c; }& J+ L

4 D+ i1 F7 N8 N: c) r},
# B4 s! ?2 h7 {$ n9 _0 i' m, D& v( L1 ~9 ^7 h; l% X
.
- D, |" T( Q- z
  i8 J7 b4 g% i# M. |. ' E$ n) }1 v2 k) d4 \

& E/ Q7 N& [- W9 f) D.
' L+ _! }! P# x) H' v% K: e9 y}) // End of _PSS object( r* D- Q" A/ G5 ?
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
: I* `. T8 p$ j% v" J
6 j" [% e' ^7 `6 Y& q5 Q3 C* O; IName (_PSS, Package()
2 J+ u) J6 Q# y" S7 }" N8 K8 j* i
$ p& C3 Y0 k  D# Z: H{ ( B3 H9 ?0 |  }1 |# Y: K6 Z' y
  o2 n. |( o  M+ X
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
' i* i. @' H" }! J4 I% h  k9 ^" B$ z: ~% J$ H! f4 T$ U, R. _
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 4 D# [9 P8 j. t( [2 l
' o, n/ o( A' P- T
Package(){1400, 8200,
% C. k: U/ S9 L* D1 O% O( s10, 10, 0x000E, 0x000E}
" T: T' M- f$ ~) V9 w+ o// Performance State two (P2)3 J( R9 I* o9 U. _6 }
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
, r" a3 F9 I" ^. O, c  E3 ZPerformance State one (P3)
6 D% T, d$ e! L: s% {
+ R5 r" i- E3 z# ]/ j$ n5 BPackage(){1200, 8200,
% |% S2 ?. Z6 o9 U1 w" r. ?10, 10, 0x000C, 0x000C}3 L- A6 M7 r( q
// Performance State two (P4)3 |& ~/ J# U0 V: Q
; N0 I& k! g0 L+ z+ e9 Y) A! q" X6 w
}) // End of _PSS object
4 {% s6 j+ t4 I4 B  ^8 D  N4 H / W/ s, H" p7 S- Y
另外当该平台支持Turbo Mode P0将会reportTurbo Mode& Q# b- B2 k( I7 O9 d. r
1 F1 q3 r! k2 [3 R9 e/ n) S
l( ]$ [5 \* a2 ~+ d7 E9 ~3 P- m
_PCT0 d& N3 K6 ~% m+ Z/ v

2 S7 X9 P: u# OPerformance 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 v0 ~! h, |# P
9 T6 c+ S% n! ^' lName(_PCT, Package ()1 f. P/ i! L' g% T0 |5 u6 [: a
// Performance Control object 3 I* [1 H6 ~  s" ~3 @2 d
$ p" X+ V8 i: L
{ 5 |2 x/ n* t% K, p" C
& o9 K; o/ ?! Z& T9 H6 ]; T( b
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}," v4 `9 ]2 f1 l! P6 P3 C/ i
// PERF_CTRL
. a- u7 S# [. d, K
5 C' ~0 z" W0 SResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
3 \3 A! c+ U- z# E. ]// PERF_STATUS 5 W. J& z: D- w! l% e: D
% C9 D" A# B& C* @* s4 H9 {( `3 S% i
}) // End of _PCT object
/ J1 S# V) N5 Q. I
* u) Q/ R" c: `l
! M& E  p) A. t) r9 T+ R
_PPC
/ g* I+ [# C* M1 M0 s
+ ^2 g! f; Z( U& YPerformance 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
7 [" u' n/ J1 Z8 r$ b0 k
6 ^" V0 K5 I; D0 N, }) v  o% ]Method (_PPC, 0), A+ |6 |9 B9 T& K1 Y8 X
// Performance Present Capabilities method ; v! x/ I/ l8 G& H: S9 R
% X' N1 f# S& T1 ^1 ^
{
8 `4 p) o0 u; V+ P2 c0 X* v' ~1 h7 \! r/ V. ?
If (\_SB.DOCK) / Q) s! J4 u' g- m" l& m

' }: q  ]! k9 ]4 y6 B& @) O{
+ t& c& v  P  g" q" R) P6 r; D% X0 d* W7 e: ]: [, ]
Return(0) // All _PSS states available& h- _$ X" r. ]3 ^/ A

! u& _  m# |9 K" s5 ]0 H, f: n
: |: g5 B# i/ g8 G! n}
6 ~6 n& m! O! x  n% `  j! [
% z$ M" ?- N& r! U, CIf (\_SB.AC)   S6 Z0 x% z: N& \9 A3 S
" w+ c# y& K; O6 L* G
{ . x0 w+ n# v. S' Y- O1 A. R: t

0 e% U8 z: A' BReturn(1)  C, d1 t* m5 ]" \: M0 e4 @
// States 1 and 2 available
2 O# S) k- G  v4 X6 F
& e$ K# B1 i1 _2 V* V} 7 Z) d4 u' y4 n+ q

7 ^# ?1 g6 `& d1 I& iElse # R; v; D# l) B/ H
: U  }' F3 g& D2 p' I; U' [
{
0 s: n7 ~  F0 A- @4 q
( L5 X9 w& V' t- ^) cReturn(2)% M! l( b4 [( J& Z4 q
// State 2 available' l& S9 N3 s6 U- l
5 g* k. G+ j. y: o# |" |, ~8 m1 ]
}
  l& Q' W  m7 n, n. y; M' L: t( a% j, t/ d- h) M( W, L# P
} // End of _PPC method
) R. X* s" F6 _: s
6 Q" p* n+ K* C! N& fl* O& y9 s+ E# Z: M; S
_PSD: L  C1 L2 i+ R- z. E% B0 D& w

/ ^3 S1 X+ Q; y- vP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。5 {# s! F$ b4 z$ m2 w

% `2 A$ |3 {5 {8 d8 g9 jREFF:
4 \# }$ _( L8 N6 V. ^4 G5 a+ j1.( V$ O1 S" e0 }9 }/ n2 e6 R
ACPI Spec 3.0
. b0 w( ]( g8 x$ F2.( h! @( |- W9 C- |# y
Intel Processor vendor-Specific ACPI. s2 E8 B( y8 k3 i: q( f% ?0 c

6 A" N) K! w0 J; N
; B1 u) X9 p/ B% `2 z3 }$ t  PThat’s all!
. d$ |7 M7 B7 s . S6 J" E7 D/ ~$ d
Peter
5 V: H1 X3 T$ P; {& S, [8 v% w1 O$ D. s+ x & m- j, ?. u) J$ ^2 d/ D' w  m  P
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
/ ]$ }; Y) c; }) [ 2 U- v. e( O' d2 L3 w4 `% W
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工作时间的占空比)的方式7 |, e( n$ W9 _: J/ u) z; t
,影响系统的功耗和温度。
' h4 C3 t8 f) \. |
% V. o, |4 s; e) H. S$ O7 c0 a2. T-state Control
7 `8 E% X9 j6 k9 [
# k7 O. Q0 r% d9 T1 C0 X, s  N  y1)
+ m, @( c/ G6 O; Y0 d0 K) e- NMSR Based Control* L  S9 N. L! h

6 z4 y7 e6 Y5 [BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
3 M+ N, k+ }1 I$ i/ G3 l 7 X1 c$ O8 K/ U) H. Q: ^/ b( C& D
2)
0 w: d0 F. G. j$ I) K; L6 TI/O Based Control8 [2 o: P; s2 p/ a1 ?% G
7 Q/ O- ~- H7 W1 w5 k0 Q8 Y( H
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
1 ]0 \! Q  e3 D # n& ]' z% p& x* V
3)8 @  H" J, K- D5 _. b
ACPI Structure For P-state
" @7 J5 a) m$ l6 o9 j3 r& fl6 M+ G8 [2 y2 `2 o& @* S
_PTC
( E6 _% Z  e8 R% e, g
5 r0 C7 z" ]) Q) T5 a& P! mProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:' d" T' U9 J1 U7 o4 S
2 M/ y2 ~! n1 ]% _! @
Name (_PTC, Package() . N& x( z& B, z( E1 o3 A0 f, W5 @
{
  v: }) Y3 W: {# F
8 a1 N2 g! H' r0 `7 kResourceTemplate(){Throttling_Control_Register},
- F8 Q2 V$ W  E" H( a& b2 l# W//Generic Register Descriptor
5 h' L- O2 @; @7 X
9 G, b6 j$ z! v4 uResourceTemplate(){Throttling_Status_Register}8 L! R7 _( ~/ p1 p. ^& a
//Generic Register Descriptor
% }- z# a; a& Q, z9 V( w- e! N) x}) // End of _PTC
6 W6 I. O. l6 w  u4 a+ [: ~1 w
( o0 ]. y+ @$ f% r/ J0 @. \* i下述是一个sample code" V! E) G0 D" |1 b8 Y5 o" N
) o$ S' t! x# }. a6 j4 k! U
' R: a  l7 X& A
//. D  M; S) U& [7 g, ^. m8 b
; c4 Q4 ?4 y7 ]( F- [' r" j
// T-State Control/Status interface( j" s8 @  j# O( Y

, o2 I* @4 M' t9 m' F: T/ V//% @8 ~7 M2 {( e8 ^

" k5 X& N" d* n6 |' R; MMethod(_PTC, 0)
* z1 m+ M1 A( f# N0 v) Q3 j  @7 O0 o; S: H+ Y
{3 g  a; a% z* s1 [
3 h# x0 A$ D9 _" A' r. w
//
. v. J8 Y5 n) C8 T; `4 T; M/ e$ P5 Q9 `' S
// IF OSPM is capable of direct access to MSR. y$ w; y2 N9 V. z4 _3 [# t1 l

% C2 N* q) D2 ?. K7 C9 T//
; i% S3 z: A4 y+ v9 F8 D" S" rReport MSR interface
5 u" W0 a, J8 p: [) }1 M5 |% }
6 f% t3 P6 I8 n  o& z" d% K// ELSE. P  W4 v; U$ Q5 S3 [. X7 @2 M

7 _& x; p3 p" H2 m7 D# E//
- |( A% Q8 z* z6 H" bReport I/O interface
9 _# a% Y" ?4 l, [' p9 L# u. y8 |* P) P2 P: T/ X5 m7 u+ n
//
) p& S4 @* {: G& N1 R/ w6 ~$ y: a& r9 s6 M9 `: z) Z$ N& g
//
- B  ]1 u  e5 ?2 T6 O) MPDCx[2] = OSPM is capable of direct access to On
& S" G' w8 o& \% z# C; _) g7 l% e4 v
//
& O. Y2 J$ x6 ^7 c- R, A$ zDemand throttling MSR# }. ^$ u; B/ k+ K4 {: d  C

9 {- Y+ ~% i$ R: \1 X2 K) ?//$ |7 r0 J' {0 |9 Y5 s# `% g+ d

: Z! |* o% H/ b) _+ aIf(And(PDC0, 0x0004)) {
) ~$ x; d. F% _' Z) N/ I0 H/ `7 M# g1 G% E
Return(Package() {+ X2 _3 a1 V: [4 G. c

' l  }6 p" R0 b: R" A2 |- KResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
( {8 {+ u7 z5 _' o
; ^  p# O6 f: I" HResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
' P4 {+ O$ F; R1 _! I/ y+ c6 k8 S6 w$ l2 j' Z# L
})
4 N3 c, p5 F/ ?3 {0 \9 f$ x/ C
" g. |" O1 W3 b! b; p6 H- W}
, q8 ~. y$ z0 Z9 f4 y$ g! K
$ L( L* U$ u6 j) h9 |Return(Package() {
; U, R2 `! h" A) I+ x: [
: e1 L" R/ B0 f" ]( R. ]: GResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
+ c  f8 K) \$ Q$ {9 K9 p" e# R2 n) ?0 v, D
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}" b/ s9 {4 M* d

1 e! F2 x5 w' l: [) J) {+ i})0 G+ u7 i( c& {: {
8 d0 E9 ?4 l0 |9 e- u
}
- M  \: ^1 D: a$ R7 L" v1 ^
+ V; X6 G0 j2 _0 j' f. ^% d5 `& x! l8 O

0 z$ x: w5 D% {# c  ol4 L* Y' k* O" |! ^$ K
_TSS+ z% G2 k9 d2 g& q2 c; A. f

! U4 U( I9 R, W* tThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:1 ?' o3 C! W3 b! {
Name (_TSS, Package() . x& f1 F( ?; X( h. n6 h
{* _- t+ d( S, W( L& E, {
// Field Name# U5 O* b  N" A" [, l8 X
Field Type 0 }8 m! R( g1 ~" x6 o* R3 _

, a% C: R3 D8 U( K1 |
% }" t9 ~, ]+ G9 ~" K
2 g# V# x% g* \. y8 cPackage ()5 D$ l& Q) H: e/ {& g" T
// Throttle State 0 Definition – T0 . p" s6 s$ }+ P) P0 [: p5 Z$ i) |3 t( B

, Z2 V3 X* |( e7 |9 S{
  O$ b7 J( c$ i9 [1 E5 l1 O3 n, e
9 Q9 a* E2 d7 C( R+ \2 p& P  o
; v( }  v: A3 m% J2 x' g( O, VFreqPercentageOfMaximum,( n9 {6 W  _* D
// DWordConst
" H* l) q6 D  N! J# f2 ^8 C7 F. S- U2 N% U1 H; D% g$ h8 J
Power,
6 R' \* W) _1 I) _; u: o// DWordConst ; i* a8 r& D% r
, c6 L: B2 W2 v/ m
TransitionLatency,( _4 W1 h2 d4 @( }
// DWordConst , c) b6 l7 b# h
/ j9 m/ U% {) n6 O
Control,8 S/ b6 L/ \$ M% }. a" s6 m
// DWordConst
2 y- A: M4 b( G5 C* x9 B& x# ~- l9 P7 x! \0 {# I
Status5 T) F' n3 q$ U
// DWordConst 0 F5 U' B4 A  k7 `# v+ i% r
},
+ a, V' Z* d" ?" h, s- g* Z4 I……
4 _+ B* ~0 j  e$ `+ y7 C}
. ^# j4 t$ I5 A  V, p4 G3 G" ?: ]/ Q) z0 s$ ~: ^" e
Example code 如下所示:9 K- E: [' i1 I2 c% l  X4 J
: A+ e& `& v) p
Method(_TSS, 0)' Z! |) i0 n: T2 p
+ q4 y" P# q' E1 v. _: M7 f0 M0 W
{
' f0 m3 ?+ i, u6 d! \
* d7 `5 Z$ |- f. j) Y3 H4 UPackage(){100, 1000, 0, 0x00, 0},& G: h/ N$ z) f% j

; R! O# y, C6 H+ g' y: CPackage(){ 88,
5 c, W  }, a5 H8 W$ p1 t- @5 i: J( w% U875, 0, 0x1E, 0},
: y0 a- i/ O; L% e+ _
) b0 ?, G, A3 |( k7 vPackage(){ 75,
; _" ?% T" X- i# N- N! c750, 0, 0x1C, 0},
+ K) A3 R: m3 U5 H
- U4 t8 Q9 S/ |  `& FPackage(){ 63,
/ w# R: Q0 O: W1 U4 O! t625, 0, 0x1A, 0},6 d0 S1 }( s7 X# y" @3 R
& \* O3 o: |$ D+ F$ W
Package(){ 50,4 Q) {8 q" ]* b% ~2 E
500, 0, 0x18, 0},
, N) M% R0 u9 [, e( S7 {; v7 L) l7 j1 ~% B
Package(){ 38,
" X8 q( g" j4 b9 m/ j0 R* t375, 0, 0x16, 0},
4 W: }, I3 M* K% X) a* A5 U' y
' Z% h! h; p* D3 ~" s9 vPackage(){ 25,- {' b6 [# `- ^. A3 I$ d" {
250, 0, 0x14, 0},! o4 c6 ?2 R' M" G2 G2 m

& E0 V% H* {* i; d0 k0 bPackage(){ 13,
1 h  i0 L& g: \  s: d125, 0, 0x12, 0}
8 l" l/ k9 ~* n) }$ F7 e+ B
8 ~* R6 s! z7 C5 e}
7 `* }6 P  o0 R2 O3 e; F1 D  @; S) q! F
$ T( m& p4 y, Y+ `5 Q% v2 S
l
. I$ Y# B' S7 M- E7 |
_TPC
% C% _  X% [' p+ o/ a
- ^; h. I8 B$ q" W, N" mThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
$ t7 e, n! |1 ]1 H$ Z- o
) p* P$ P$ {/ }* b. Zl7 R8 n, @+ b3 x" D  R2 c1 s4 f
_TSD
+ e: n8 Y0 W5 T2 r* Y! {  |+ a + W5 d2 s7 c5 j1 [
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
6 r( R0 w: b8 `! M7 Y# S - _9 S# O8 t1 `/ l( p) q7 w, r% E
Name (_TSD, Package()
; c: ~) S& K8 s/ M6 j  i) q! ?
  x& f# {3 J) A{
# `3 S! M9 U; p: C  ]7 [+ e2 q( {3 K- z/ t2 n
Package(){5, 0, 0, 0xFD, 2}
- u9 W9 J6 q1 s9 r+ v// 5 entries, Revision 0, Domain 0, OSPM 7 E, W8 i0 J# Q: U( v
Coordinate, 2 Procs
2 I! J+ J6 W( t8 d8 j6 i9 k( h, Y/ q7 M
& w. k, v6 Y* `0 U) `7 s% F
9 }  Q* k6 G6 G: z6 D: @8 s5 _% O}) // End of _TSD object
1 A7 y% e! D3 f5 }; j
& M1 G3 P8 F" J* w9 ~% K+ uREFF:
3 F9 [" U0 P+ T1.. q6 s' d9 g' u$ D, Y
ACPI Spec 3.01 p8 W" d" R5 X# J1 U, Y
2.
' o7 W& T7 g0 ?% S( i9 r$ @Intel Processor vendor-Specific ACPI) U) X$ [, A4 k

4 N; h  l% W* i! f. h0 Q, B
" p, K: V# u  L9 ^2 nThat’s all!
# j: Z8 _+ E$ u, X . c8 i, o* T: c7 c
Peter
4 N+ v, R1 P7 O1 F
* S) z4 B1 Q- g2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 12:18 , Processed in 0.063041 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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