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

CPU Power States

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

3 ^* u5 z$ j/ H, g+ |# K: v1. Overview
# R6 V8 u$ {- ^$ Y6 O9 u- B0 C3 q4 h( `
9 t  A/ D8 E3 m( ]) p. G  A
* r1 q  I! ]0 J/ P- J/ c; N) HC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换5 N  O' j2 E. H
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看  A. R! V3 z! [$ j( h+ {5 O7 u: R
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。1 o! @0 |# C5 y, t5 p3 |

2 A+ [8 U6 o  @! z9 a% V0 M- T$ e
cstate1.jpg
+ Y5 S: _( C5 ?% R  n
1
' w' L* J6 M3 {; U
2. C-state Control
0 o0 x& N( K% ?; r5 \* z* }
( L- Z3 `( o/ x. s1)' h5 B0 {: m9 s0 s, U% K/ P
Detect & Enable C-state
& t& S5 M$ v. q2 [( U
% x- _3 ~4 z$ V% e  MBIOS可以通过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的支持。( u, R( a6 q. G

: [( d9 ~" |+ T+ Y2)7 b2 G, N7 q% W4 p0 t* O* I/ l
C-state Basic Configuration; h# \6 ?5 _! {' ]" F1 {' J+ ~  w# X, m! w
通常情况下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)。
* @$ D" P8 O9 |0 o  x3 q5 |4 l+ j, P
3)% \$ U0 t" h3 M- B  }
ACPI Structure For C-state
/ T7 X$ Z) Q& B$ y
; w- o. r3 j& s$ R8 C: _( Jl( q8 g+ I+ a6 }/ `
_OSC & _PDC. h2 |0 C& `0 u; i
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures" L7 b; F5 ?- \& F
l4 @& A4 S+ D) u1 X. P, e( t
_CST
$ s9 w4 u6 U$ @_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
7 U4 |; u# s/ x+ S& |CSTPackage : Package ( Count ,
3 O  y  A2 E( ^8 S& ~CState ,…,
7 q  B5 s( I& x5 s8 mCState )! H5 w7 X# A/ k- r( U) U
其中Count表示所支持的C-state的个数( O" {; c4 T3 \. M' _
CState: Package ( Register ,9 l6 B# Q4 i; p- D: o" l
Type ,+ @' \/ o  ~% g+ S5 h$ C4 u$ B
Latency ,/ J8 E/ k4 s( E: u9 p0 u4 _# Q8 x
Power )& l' ]; v1 y. [9 t& Q, a0 }
1 m) A, G  i9 N/ S# Z
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
! v4 i" X  d+ R) ~
* x: r/ G- E# t) b& n1 _Name(_CST, Package()9 q) q. s# o1 K
6 F( h9 r6 Q' B7 X# ?2 _
{ + c7 u- ~, b5 K& V8 j
4,5 @& D8 N  v1 j, H) w& m
// There are four C-states defined here with three semantics

3 V, H* {) y: C7 u7 ?# G, z. v" e
9 ]  M5 Y5 X4 P9 m// The third and fourth C-states defined have the same C3 entry semantics- C7 f% |' A+ w2 l4 Q) F/ _. }: a
2 I0 W, x6 U( s6 N  F
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
3 [0 \" V) \* _/ r, C1,8 D2 S/ z/ W7 v6 n! q+ }; y
20, 1000},
7 r# H! p: V# y* J

4 V( @3 n4 h' |( L9 f% B  E$ B6 ]Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
  q& `2 r3 W/ }2 K40,; \% E  e: t9 ~
750},
$ g/ p$ [( F: o2 w3 E: i
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,8 |1 M& S2 @! ^
60,4 h2 g: N/ |( p4 |* m* o% e7 V5 }
500},
2 n& a3 ^1 Y/ B$ D, L
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,2 J: n8 q+ u, f& n! w/ _, Q
250}3 g, T* e  i8 U4 `+ D8 P, }. V
7 I  s) p5 ~, P% t  H  k
})
8 _  F; S: l: H9 E0 B& m$ [
$ Z' K3 x: q- c& gl
6 I" L1 k1 @5 Q% w9 N
_CSD
. ^' H# d" m9 v0 f2 ]/ A3 c6 _1 }4 s, ]
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。/ _; J( i2 r$ e! ]8 h8 \2 ~2 P
. B* V# O+ V0 H7 `1 x$ X* H. h

) q( L9 D0 q, f# Z4 J6 i; v: q( x

  y3 n4 K& r1 \0 n" V( m( e3. P_LVL VS FFH
1 U6 r: @4 [8 D2 g% h! E- @, ^: Q; {  L9 F# k
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)! ?5 h3 q$ s6 E% ?$ S  k
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所示:
+ \) F7 R# M: P# Y6 Y* G4 L, U
5 {9 O* w& a+ s1 L- S; S
gas2.jpg
3 U9 G2 ~) ^0 B3 Q
2

" q0 S  F8 ~9 m" H+ k4 \3 V. mOSPM解析到该_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的一个例子:- h; O  w( J& s
Name(_CST, Package()
$ f( N' L% W, b, }, r2 c
1 b2 N  Z, f2 |3 u& Y
{ ) [" g7 h3 |( o+ Q3 o3 ?1 C, b
2,
. v; C% x  W6 {// There are four C-states defined here with three semantics
$ f5 y9 n) \6 h: P+ }0 p* t
% H) H4 `1 J) v+ X
// The third and fourth C-states defined have the same C3 entry semantics4 \  Z+ l) \% E" K! C% p$ D
" @9 Q" p! `* t1 {
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
3 V5 F0 Z! X, F' H0x01,
" v6 v* ?, O/ Q1 K. ?* z0x03, 0x000003e8},
) X0 ?( ?& B4 |$ ]

1 n0 y9 S; ~8 p) U: I! j  {Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},! g" o1 D$ [' [$ p
0x01,- b4 N2 U9 T$ ?. Y! m8 Y
0xf5, 0x0000015e}
$ V+ u% U- z$ Y, g$ b+ q8 N
}) # i) N; l6 Z$ e
9 X9 `6 q2 P7 @" ]0 |) q
# r7 @* {7 g2 ?- X2 s, R
REFF:
' p+ h" m$ E* I5 g1.1 e9 ~& L$ c2 f0 u
ACPI Spec 3.0
5 p5 p5 D' c. Q% h! d$ N2.
5 o' p" l* r. z$ MIntel Processor vendor-Specific ACPI
1 {3 I5 P) M5 G6 M2 L2 w1 J0 Y, O' ^+ h5 e3 R
; r% x, S, }; K
That’s all!
+ O5 K/ ^, \, S/ \3 l; |* W1 J, c& s0 r5 |% }% C3 h
Peter- O/ s/ ?* t& j) y2 N
8 `' S7 M. J1 Y  p! v
2010/9/20* A# X, K$ p3 |4 H, a6 O8 {3 N

, m! K# V# a, V[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
# Y4 R2 c3 x9 u8 N0 p" B: }
( s  g- ?3 {" ^* O+ ECPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
" ~* v" G' ~8 Y0 T  l, {  r* ~Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
5 W9 {0 d, T* F) T1 c; T3 J) B * w9 h( B( o) v5 ?8 e3 U( E
2. P-state Control
( w' O) |' H! s& \: Z5 f& B 3 m0 Y8 H' ~( I% m
1)) r# ]: v6 Y' G
Detect & Enable P-state  @. _4 m6 d6 o5 l1 H# v
8 N( N# l/ z9 S
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state$ ]! Y" L; z5 d

, L) i1 x7 B) J. _2)
% P& f6 v! v$ Y7 w4 Y9 H" i$ E' J% cSupported P-states
8 G. d3 @6 [7 ]: q4 Q" c8 h' @9 n 2 E" b; V5 b. L
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  y! G. W' ?, m6 D' x
9 q8 w& n6 V: S: D( ]
MinRatio = PLATFORM_INFO' a' A: S$ ]8 U: U
MaxRatio = PLATFORM_INFO
4 o4 G0 u" e* N4 F) f/ ^RatioStepSize = 0x01
5 w$ y0 G9 k9 P/ a( iNumStates = (MaxRatio – MinRatio) / RatioStepSize + 16 i" H8 c8 T9 Z6 D: i8 k* e- G( f/ o
9 ?8 V1 e1 g( h7 l( Z6 `7 Q
If(NumStates > 0x10)  v+ t) G$ G$ r& P( T
{
" H) J/ ^! y. b- S) v4 m+ wRatioStepSize += 19 x; m  |9 C" l1 ^/ d
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 12 g0 ?, _$ ^: X
}
0 Z) B% @( S( M3 z: |$ H/ w+ ?3 f . N* P( U, N* Y6 i6 m
3)
# Q) B/ o# [; C# n8 l. [Turbo Mode
; g0 F( {* i/ l( G% |
$ a6 P1 f( E7 |2 nTurbo 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
8 _3 T  b" i) k' b 0 m# _6 {2 v( @% C: @: A! Z; L
4)8 ~; c) l) ]3 d
Over Clock
  [- o6 c" n3 X$ O) I8 e0 _, i
+ O# G5 |; z7 C* ~3 h某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。/ {" U: c+ W$ T) O+ t3 u
- W3 k1 W5 c7 w. t5 z
5)
0 H) \4 S$ P% q5 h2 y  wACPI Structure For P-state8 d5 f2 ]# t* z  h3 z

; ^) ~  D  U& o# |' G' ul0 j( `! I+ ]1 v# f' }  {
_OSC & _PDC
% `! K" f8 D) r, G$ D   u2 w- z0 M9 B  R  D
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
  T3 ?7 i5 K) W
( }( Q' U$ C; q, }1 N8 g1 q' @l
, g* W: V" h# J' x, }8 t2 K
_PSS) \) F8 N) i2 B: q$ R8 l4 }
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量' H$ I) |* w$ _
并且通过一个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 p' w; o- q6 S1 q9 E
以确定P-state切换是否已经完成。! R: |- i( e4 v

! k7 F( [% m7 H  z% x$ EName (_PSS, Package()
( e" g/ p" Z9 C/ I( N. ?+ ~{
/ |  Y7 |! g/ b; k2 n// Field Name  f, L; T" Y1 u$ w" a# |
Field Type
& F! K4 s; H* [9 ~' `" E9 V" X8 e$ a8 K& T: G7 V* Y6 F# [5 N

3 y7 _7 h. B8 n$ ]# }% I, j
# w8 Y* p4 H7 M1 P, LPackage ()
, Q& K# w5 ^) c/ [  Q+ O  w// Performance State 0 Definition – P0
: ]7 a! Z' n, W  M; y1 Z$ p8 u) X- q% x3 U4 C& Q* L; ~
{
/ U# h' t* L  Q. F% `. K5 o  b0 v8 R# o. B
& q  C8 ~9 O; O4 i7 c$ E3 w
+ O7 e3 f' \  H1 Y# `+ wCoreFreq,0 I$ N' H# g# A* P
// DWordConst $ N: D4 P8 L1 }, \& F/ M
! ~) Q# j/ D. t5 L/ R
- G6 O# \+ [: A/ m) ^8 `
Power,
: N# t4 j, a+ R5 Q% N// DWordConst
9 w: W  S! [( @( I' u7 q& e# L8 d% b) z5 B
TransitionLatency,
) w: D3 k- x- D* X# l! j0 ^: j// DWordConst 3 R6 y7 ]6 v3 s) Y! Q/ W" \

  m( U  n4 j' X* O- p1 n" zBusMasterLatency,9 o, U9 d& ~- v# m2 \! E7 m
// DWordConst + l( `1 ?5 Z  I4 K% r  h1 t3 e

" e( T2 `: }9 ?Control,; x9 g9 i+ J  e# v2 i+ a0 D4 a
// DWordConst
, d; C" {( ?7 |' u
$ G- o& i: W4 I' N, k# JStatus* ?/ O7 d9 c$ j/ j; z$ e
' Q" I; F/ H. v' J, F
// DWordConst
! n% {% g! }8 O. s% [) E: j, ]
6 [5 V! Q. G6 E1 {) E# `8 j}, 2 ?* H  H# c, X( q7 d0 t- H
8 W1 S1 R- m; {, h) g8 Y
. * P. F$ |5 u) w; m
( o8 v. C9 k0 }; ~) g; G6 {! M
.
; ^& Y, s: o1 V$ }7 u$ F/ I- A! p* k; ?8 `3 w3 p9 w
.
/ ?# Q3 }3 a8 J/ R% Q' ]3 z}) // End of _PSS object* j7 T; G5 D! s' F+ R$ H. V. z
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 / D1 S7 h5 K5 Y. X2 P+ M! F( ~+ i

2 R, n/ F! b9 `2 SName (_PSS, Package()
  x3 h1 s" \& J0 ~9 H1 a/ t9 N" t' F
{
. L9 Y& K3 z  d+ K5 E
* [! @. y8 @4 L0 FPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
" L# f4 C6 C: ?: T$ P: J6 d4 i% _; N  S/ J2 S
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
  o9 T1 p& Z* I* @( r0 T) J4 X5 U, F2 P
Package(){1400, 8200,* l% Y! }( w0 a  O2 ?
10, 10, 0x000E, 0x000E}' o3 v- {! p* I! N1 q# }  {1 s
// Performance State two (P2)5 n5 Y0 M5 g! P7 p" I; R2 Y0 D, Q
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 8 e1 E8 g: F9 M- m; o) C
Performance State one (P3) ' R' F$ A# V- b) O! r' p
: U, ], Q9 ?" w- F) X1 T7 C9 ]7 M
Package(){1200, 8200,
0 X2 E3 F, X& e8 r$ {* w- ^) N) u* a10, 10, 0x000C, 0x000C}
0 {4 V7 A; P/ y! v. `// Performance State two (P4)! ?. t" u  g3 q# I
/ N- y) l! r# F/ {" t
}) // End of _PSS object
7 O, r! e: {! ~2 f
: V( ?  ^/ h% b/ C另外当该平台支持Turbo Mode P0将会reportTurbo Mode9 V' k$ s% V% G$ U8 c) V

! ?9 g9 q( i+ c  b9 al# x8 h- V) h( V
_PCT
7 D) p6 x" _, q2 A 7 S3 O% h" g$ y! V
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的方式来进行。
: J. R& C# p& Z " u- S& Z$ s) C9 f6 E3 f, h
Name(_PCT, Package ()
* Z' _/ k4 z' z* ]9 @' {// Performance Control object
/ L, e+ X0 b* U; K1 f7 A( K, a! x, U5 ~- H: C
{
, A( y. [: J( i$ _7 ^# k; o3 r4 \- c' [/ v3 C' i" `: X
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},; {8 k7 @! e& T) D( h% L: `! A
// PERF_CTRL / `$ @. a0 P4 V5 q% R

8 i& z. z  l# M+ S! pResourceTemplate(){Register(FFixedHW, 0, 0, 0)}: B9 M$ L' u6 J+ I
// PERF_STATUS
( N* l1 ?0 h- k4 |
+ `: f6 f! z  b% Z}) // End of _PCT object
8 b; ?9 N' V, |" W/ B6 x# C1 Z ' o1 j* ^3 ^1 S$ p, |
l6 {: q" I! E+ W
_PPC% S2 Z4 M+ G* N6 l) A& V  L

) C! p5 o5 ]- s( z4 @! h9 }1 ^, fPerformance 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
; |, h3 Y- c" Z- `: w+ b% [
& Q8 G: F* Q: [7 x1 SMethod (_PPC, 0)
3 U2 q, D& c- a// Performance Present Capabilities method
! p7 K  x  {+ p8 U$ b0 h& g2 t
- [1 Y3 d9 J4 J! H& E{
- j! I% t- m: A+ z1 u$ W' W& n; i8 I" [/ r; H
If (\_SB.DOCK) 0 d6 {% d2 ~2 t( ^

) F9 D1 B7 R, M/ ]5 C. s4 I{
1 T' m5 m. @) g. w" k5 P; ?. ~" R4 Q" z5 U) t7 a/ t
Return(0) // All _PSS states available( L5 [# `2 k4 H; o

% x7 {: b3 I) S' v, N; q# y; }
" f! J# @" x* f# d- G7 G- i}
* r+ |7 K6 M6 \% X6 ?) w$ R. y% J2 Z  L: R- ?0 H1 Q: W9 i
If (\_SB.AC)
' @. z) k3 y- ~, n" J4 H0 I# C5 A
{
! ]8 T, Y# g+ ?. K* s, o# p' }" \0 ]3 L
Return(1)) T1 Q$ N; @  \. S! Y) L: h
// States 1 and 2 available
6 U, E+ n/ M# R  Q4 `: Q
2 ?4 R3 `* f( c' L' ]  p1 ]} 5 Q1 l: ]' |: p, O: h

7 z7 e+ e* W  N! o/ AElse ' k: ]. x( o1 J) G3 F
6 V' Z7 I$ ?$ H+ m/ W+ u
{ % O1 |1 q5 l" u
; K! U, E% \" m
Return(2)
7 Y$ B2 {! n8 i; ~0 H' v// State 2 available7 O) A) n6 R& N. q/ u7 n# I
- M! r7 \9 V4 D/ R/ u6 y
} 7 m" D. c& Z7 M- k  e7 [
% s: R  z; P! z
} // End of _PPC method
% d) z( {9 y# V* Q: d- r( O $ r: i3 ~. I- Q! C3 e
l" z" G* g  K( @, a1 X  F+ c
_PSD) n7 i7 u: o, b2 Z# j

" T0 A% L, O9 R9 P' a9 G8 _0 O! NP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
) G" Y/ c! E! \! {# k
" d( I; O2 w  K! uREFF:# u6 F! m5 D* B# L& d
1.
  u* n( e- J; _& ]0 B# w2 i' TACPI Spec 3.00 U- D  P4 r. G, v5 v" `+ a1 t  I# Q
2.
8 k" @/ a7 |& i" pIntel Processor vendor-Specific ACPI# I/ ~% w( H  e" A: z) q
: x8 E) e/ R. F' q/ y7 R- E* @

5 N$ S+ t( \- E1 X; wThat’s all!
5 S6 J! V% T+ l9 J" A3 _$ C 9 K% s* C( d/ x# J
Peter
; D' p" K# i; t" R3 A- M ; t7 a, U/ \/ E0 A- V9 d/ Q& L8 C
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview" R  M; B1 _* p
* r# |* Y* X2 b/ 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工作时间的占空比)的方式
  D4 A7 {) l! H5 {/ ~1 Y5 ]6 k,影响系统的功耗和温度。
- `- y" O; J! L& E2 S
3 L: I+ E, ^: }2 `2. T-state Control4 a- X$ Z9 j1 y9 |6 I1 Q
! ^3 @9 w9 I6 M" ~( D
1)3 Y$ c$ {. C- h
MSR Based Control( a5 G! y) Z/ }$ {% X' e3 O
1 K% g( q" `* \9 \8 P
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ! z8 ~% S6 S( V1 r1 c# e
3 i. a8 [& ?% D8 N3 ~+ a( b! s" L; v! j
2)
$ ]$ R+ R, O6 l2 G; t6 aI/O Based Control
" W. F# i  R. e( F: v" F& E& Q
3 A' C4 G- |; ~7 Y5 h除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
/ b7 t2 r+ l" ~: c7 E/ W6 z: V
# v, j8 g' K3 `8 p9 c- ~2 i3)
* m% `6 x/ J) m, OACPI Structure For P-state; S2 k1 L0 P2 U8 }: d
l- {: ~+ V; x3 M9 d9 X+ l% }& h
_PTC
7 {3 E# l: b" h6 n9 o) T/ j- b
* a" ?4 ~% b6 u1 X- V% e* v" KProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:% K' E. B$ `; S9 u& [

' U( \( z! M% y% f3 }( ^Name (_PTC, Package() 9 Z' `+ D+ J, m9 D* G& p( `- M
{
* O' A) Y* F' K# Q9 m' \; i
! q: E( H6 ]( F3 c9 Y& y' _' h2 N# @$ ~ResourceTemplate(){Throttling_Control_Register},1 \4 b8 H. }) q$ P: A/ l
//Generic Register Descriptor
; k# B; e7 C3 w+ f# }
" P0 S$ c  t8 [9 t  e0 R- T9 f8 pResourceTemplate(){Throttling_Status_Register}) B* A/ t3 f# h1 u( G4 t+ {$ [
//Generic Register Descriptor
; Z2 y! _4 n& X) e& ?}) // End of _PTC
" V/ z8 G) w& M # N# w  \: @5 d5 G
下述是一个sample code. q$ k4 s+ W7 {( X: X
% [, a8 g% Q$ n9 U% c# |+ h: u
( A# x% a0 b+ {  c1 R! ]# y& j$ P
//
0 _! X7 x# M3 z/ d5 d# V# q* V1 _( n5 e# b* r% Z
// T-State Control/Status interface4 b: o4 |/ k& _6 |0 ~5 w# b
1 H* p# q( s2 l/ {9 p- D
//
9 t* D6 y0 o1 v4 j  Z  R
- j- N) D+ Z& x/ tMethod(_PTC, 0)
; p6 _" `' a  c, c6 l% c" O# y
6 N. q) z% C+ z- o! ?: _{# _+ k9 P2 d. ]& T+ d

. l- F7 j. |# h% v3 p7 ]//# \: j2 K; i0 }1 \% K+ m* x+ _# U* k
; T7 p( h+ h# R, u
// IF OSPM is capable of direct access to MSR0 F4 F6 q2 D% l* k9 Q: U. O
, x! x) O3 [& i0 S0 W3 H! f' C! O
//
* b0 ?3 z  }1 }" k0 J+ A; }Report MSR interface' g" W0 p+ E) s$ \4 h% a
* ]" Y, b. `! b  V
// ELSE6 O  J& j: j5 w
& E$ o! n( O( L& i" g5 u8 i$ m
//5 i4 ~. N8 c6 r, G/ Y5 ?
Report I/O interface2 z9 G" ]- B6 q

( N& |5 y% H( ]. e8 {( N//
/ _: k7 e7 _( S. C3 x
" ~+ ~4 \" o0 B# B' J' J, {1 I: Y//" F, [- C% {) r5 r, Q3 Q
PDCx[2] = OSPM is capable of direct access to On
6 a& R6 D: E! H1 L; P: i8 U  l, D8 [# O( l/ ]
//  Y/ Q: \; ?1 u6 Z% s4 t# L
Demand throttling MSR/ ?0 y5 n: ~9 }

% A  J! O) I, ?, X2 I8 R, g" y/// c! |3 h2 o/ W7 `

; K1 _$ ?) O. e4 C& c( AIf(And(PDC0, 0x0004)) {
- _& ^$ _2 m( V3 K% Q! I3 z9 k" J, ^1 E/ k* B6 R
Return(Package() {
' `& E5 w- X( x) z& a* B2 ]% m. Z  M3 B/ A( W
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
  j. j2 v1 }/ ]
4 s, M- F/ S3 c3 s& v, FResourceTemplate(){Register(FFixedHW, 0, 0, 0)}) }% [* A$ I$ ^
, j- o/ |" F% S: d
})
6 r# x4 O5 @: i9 ^( u
* X" i2 t8 w; e: v; u$ c. v}6 k$ S+ |3 _% o4 h+ e

9 C" z5 Q+ x" b7 A  k( S9 rReturn(Package() {
! d8 O. \* {+ d/ @! U- @/ _. {$ P7 Y3 c& }4 o# E
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
$ m2 b$ z: G- r6 K- E
; j) `7 f  C9 K; d3 K) FResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
" O1 O9 Y; g/ [5 j4 c  g: {- d3 L) f8 L6 p9 F! ]' \
})
8 G$ r: F0 D: z' r
) M3 K6 I5 t% [# a" i. q3 K1 Y( N. k}, C( C) K7 a; j

0 t) r" J2 J$ g# a' V1 z4 j+ a1 l; Z3 p2 P" U; E

" e2 x& h( R0 z# Il
+ E6 E3 y* e5 I4 Y
_TSS. P7 S7 ^$ b, ~. }3 h% V  `

$ c$ \/ n# B- BThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:: H3 \1 j5 ?5 S6 G( g7 |. i
Name (_TSS, Package() ' f- |+ E' H% U
{
9 Y6 p6 y7 W' n; S// Field Name
, h& n+ c" v( z1 BField Type
# S6 t" Z" f: Q* F3 q4 Z
) x" G0 q. i! t% {+ z$ x5 t& K7 I: f" b; L) p

- d/ `6 V$ S9 {7 j- ]Package ()
# r! g- z0 k/ \3 J9 |6 P( W// Throttle State 0 Definition – T0 - h1 j$ \7 U, ~

: t4 V* Y' A8 M5 l{
! i, B1 {. n' x7 ~5 R2 a" N2 s4 x7 P
" e* \: k+ b8 v' @# _
FreqPercentageOfMaximum,
- `; _7 R1 k( j% N) i  p// DWordConst
7 W# O7 L* g) K5 p- q& r# r& p/ I
Power,% G4 K; L7 g2 Z! H( ]$ h
// DWordConst
3 C2 V# y. L7 R0 j6 K) |* f2 S
! k: k0 R  k( j4 E  j9 E9 aTransitionLatency,9 K% r+ ?0 ~9 a, f9 e
// DWordConst
6 ?5 X. |1 l& l( r& Z$ X; `
' Q/ D) a) G7 D- p7 T* ^5 r. NControl,
4 ~% q+ S& u* T1 F6 G. c// DWordConst
; q; R" ^" i% l5 ?  R2 J# a/ V4 Q+ T0 S
Status
4 s, G' p3 t1 w# A// DWordConst
) I4 M, _% Y/ q2 u},1 S) G1 _2 h  y; @" X2 q* T/ x
……' ]7 V4 ~/ @' B. {8 I0 [; v1 z
}# }5 F  A0 s5 z! Y3 w8 t8 z

/ k: M% T' T" ~) A( H' ~4 `Example code 如下所示:
0 m8 l8 c6 M9 n) a7 S; h
+ D  S! ~. r4 DMethod(_TSS, 0)5 n* X) K1 @4 _& ]- R

  w3 {8 B% w4 c+ |( e% ]+ I8 L{
$ V  ]7 w" P- S7 G1 Z' g& B& h3 G5 E5 j; f( ?9 L5 s9 y& ?
Package(){100, 1000, 0, 0x00, 0},
- a& a5 X* m+ q9 e
: W* S) P" }  w. {Package(){ 88,$ P7 Y+ Y( l% G" m/ [) r
875, 0, 0x1E, 0},
6 T: A1 G2 D8 k' ?! s
6 I! \; a' W* C4 @Package(){ 75,
; e7 {& @% n3 E+ z  M# R3 U750, 0, 0x1C, 0},
0 K4 }' R$ z% z; x( b) v! |; A# O+ F4 O: O. p
Package(){ 63,$ U# `  R" l& I, P& k- z7 U
625, 0, 0x1A, 0},
' G& Z& {* T0 `7 S/ Y. w: ~: i
' e* K' [' S3 v2 z+ [Package(){ 50,/ o' V0 ]2 X+ c! {& w
500, 0, 0x18, 0},
* L5 T( j* @# E8 G, R7 j" o: X7 N! a0 z
Package(){ 38,
: e5 z+ M% r& w/ G, {+ U375, 0, 0x16, 0},
( R3 s+ B2 [: N6 m/ d% H, f8 Z  p3 |- }- K+ N
Package(){ 25,
3 n3 V5 I9 v8 D. D4 }( I8 A250, 0, 0x14, 0},
5 J2 }" K5 V/ F+ r' M+ k
* x- f" H0 ~" C: h! P# vPackage(){ 13,
" x4 q5 G9 @  ]9 C3 T125, 0, 0x12, 0}6 R$ Y0 Z/ d) Z# ~4 C% J

3 @+ L; a2 Y/ ^6 ]* [& Q- R. n}1 p9 {7 D) m  U- Q

, C* G) Y4 p0 k& @8 k1 L) n- ~9 ^
$ l* w$ E8 \% fl0 p) y% z7 s0 f4 `- f( o- H3 [
_TPC
! j( Y  ^1 T% ^8 H
3 j5 O  C8 r4 W9 f+ f! GThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC$ s$ A  J  j( H

; H2 d( i6 r4 j6 V1 K6 Nl& `, b, D3 ~' J) B
_TSD
# C0 b$ ^5 h7 S  p3 G# Y
% {9 l8 S- R4 B: f- X  b+ cT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code5 |7 f# w9 n0 C/ S8 v& c
6 {& w2 y+ ^( \/ P- {
Name (_TSD, Package()
& D1 H( O- C7 x. a
  z5 C" _8 v- x6 C{
: |2 T8 u: C" h9 `$ |
: N3 R; o. V% B/ k7 JPackage(){5, 0, 0, 0xFD, 2}
4 G4 R+ H; C/ C( Q4 n( v  z// 5 entries, Revision 0, Domain 0, OSPM + a* p# L* R  D, }  y
Coordinate, 2 Procs
# C" B% k8 Z  u' n) \# P4 ~
% n- W2 |& T1 F& e1 J  X: t8 R# k6 t" V% c/ S- Y) A
}) // End of _TSD object
2 ^3 ]" S2 I( I5 A/ N0 k9 S5 j8 I ( H/ v5 Q; ?4 D" ]* y) D9 |/ H9 E
REFF:
, V: o* }# Z6 }# a' g1.
. u- l5 l- I! H' C8 ~9 uACPI Spec 3.0
+ K1 r) H/ e# g2.: e% r- A/ e3 ?  m( e
Intel Processor vendor-Specific ACPI, @) _1 j1 T  ]$ v: L! [
3 X" X3 l9 s. C" H4 L! S" ~: ~
3 `3 q7 y7 T0 E! E8 M. x2 H
That’s all!
; K( Z  b7 w0 ]' K 0 N: t' Z; o9 M1 ]" e4 g
Peter
. L. N- ]% G# ?: R2 {9 W 8 n% W# L* H0 B
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-20 09:21 , Processed in 0.365795 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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