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

CPU Power States

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

0 W# e8 f3 B) F! [: S, ~, p1. Overview6 |2 w5 \2 x* _3 z4 E9 T& g

+ `: ], |6 E8 X2 [& f: K, [; |
: C+ c, T# i- B4 NC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
6 ?& [  R# q9 z9 i! Z降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
+ X- W* {0 b2 I" D比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。9 t% |/ K' e% E* K3 U
  j" n0 X) I- \; D8 O5 P
cstate1.jpg

1 D5 t+ z5 Y( E" s  p2 Q, a- [: i
1

" X) X( t: V. R7 b0 z6 a8 v2. C-state Control
; k% a7 q% V4 s' ]0 v9 W1 V3 E% _9 l$ J: q
1)
- b, A1 O& i, B, w4 cDetect & Enable C-state
: N, b/ Q5 T- K  b8 t: G. `# E4 c- S# Z( h
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的支持。2 i' U" o# R8 X  ^" ?
; {- }0 L  H( n3 g: ]% U
2)
: u4 z' s2 v( v1 X8 m8 aC-state Basic Configuration
# @  A# t4 L5 Z/ k8 o通常情况下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)。
2 C. W! p% z7 x' J
. f5 ]+ C/ I  v! ?% |8 n3): p/ P2 P2 o$ [/ ]
ACPI Structure For C-state
/ K6 p( x8 D" x) J$ h$ m! r' ]7 j
0 Z" h1 a3 }6 m+ s2 p% Gl* c! X9 \2 [, h' ?& |1 w
_OSC & _PDC4 L5 w; M' ~% a
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures6 s. o3 w: U' Q1 H0 l( b
l" a+ I/ ^% P! j# z# I5 E
_CST- p# p' k" q! ?
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
2 H+ f1 ^" V9 L3 {7 Q6 jCSTPackage : Package ( Count ,8 J5 R  E5 M- v. ^
CState ,…,- c! O- N0 r: m
CState )
5 `/ ]( t  z- ]! e. r, m其中Count表示所支持的C-state的个数
3 W/ M5 w3 ^" fCState: Package ( Register ,$ J1 r* K: V4 l! w: `& V
Type ,
+ m) a1 Z9 S5 s6 X3 X/ e# tLatency ,
; \! K& z! C' `Power )
/ N. m3 o1 w8 t% }* d+ b8 s- Y
% K# _# k0 S5 i8 w; l$ V7 mRegister表示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: Z; O6 L: W# Q' p7 P9 q' u

3 y4 \8 L8 p- I- X" {+ ~Name(_CST, Package()
: I; g1 d# p- B) {- E" j. Z
5 w+ [& `) L5 n; G8 E- k
{ ) \( B7 V( Q' ?- k
4,
. b; @0 B9 |+ c7 m// There are four C-states defined here with three semantics
, H: Y- j8 w* C+ M# a; r- D

& M5 ~! ~; R" d1 f// The third and fourth C-states defined have the same C3 entry semantics: V* i, l2 E2 l* Y$ i7 G3 x

+ S) t, Z9 H, J" X) BPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' ]" Y- |" d. q6 x/ l
1,
2 w: V$ Y% \3 z3 K$ A20, 1000},! a( B, A% t. Q5 [+ r

# c; M# A* o# E( ^8 ePackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
3 Y$ M1 Y- X: \- A$ K  m: F40,
  \3 f5 O+ c$ H8 y  t750},

% ]/ h/ e; k  KPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,8 M3 O; v" k2 ]0 J) v
60,8 D4 c& g: D# V4 B; l2 _
500},

) }; u; u+ o* ~2 A' APackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
/ I) r$ X( W. l8 D250}4 w+ \: n0 h6 J. X
: O# G1 r1 W' L9 J) p( c$ m
}) + o) G  I! q9 i6 G1 }6 X8 d

7 O/ K& }/ O( |6 hl7 @% e: V" v& [+ Y& h# Y
_CSD
+ Z7 X+ _- T: e4 k) W6 V% R
5 L' @& G" ^& y! w) j9 nC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。+ H, n4 r8 u* K+ F* A* H
" ~8 _5 j4 J2 f& ?8 [/ g: F0 j

/ k1 B1 i* [7 I( ]
, k  L$ {; Q) G& l: X* A4 Z5 G, T% U* ~+ A5 O& ?& g% b" K+ M& I) V! `
3. P_LVL VS FFH
7 H. a) S1 h, A1 k1 x  X0 Z5 J% g2 M/ Y4 K! J' v2 K- w+ z
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
' o: F' k. j8 ?( B% SFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:6 `/ W& N3 o0 _( ~/ P! O1 Y  j
! K  N0 p5 L( `
gas2.jpg

  K- F6 l: N+ b. u( ^7 E
2

: @  _% A( V" v0 v% BOSPM解析到该_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的一个例子:
& O; L: S/ @5 F6 o' w9 z9 `# t& [Name(_CST, Package()
" [; S- o$ l  [" X# S$ G- V

  ~6 f7 U0 y  g3 F6 u1 {' e{ # l. ^. W5 v0 C9 K( i5 v
2,9 r+ @6 e$ @  @8 V. l1 S
// There are four C-states defined here with three semantics

) S- e) A5 {: }2 t8 [# f( b6 z( [1 L3 A4 F" l! a
// The third and fourth C-states defined have the same C3 entry semantics4 u9 R1 G# Z' a9 R0 l' f" N; k9 b: g
; J  A+ E2 Z, g
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},9 g$ ?' Y- V. \1 D
0x01,
+ V* p6 i& B3 \& `8 A! u7 G6 X4 T: c0x03, 0x000003e8},
& `* {1 r+ i+ B- N; ^# Q
* L5 `9 \1 x% {9 y3 b
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
8 k) l4 Z$ w) m/ g0x01,
3 U0 B1 w) n7 f, t4 K! `1 D! X0xf5, 0x0000015e}

7 O0 z4 Z0 I; q8 }7 e}) # x( B! x* Y& n& J8 v

1 F, O& P5 K( x  x
8 H3 F4 z7 n! b% N- cREFF:# E% d! d8 c# k) o
1.: t0 h: S  i  G! k2 n+ D) M
ACPI Spec 3.0
% r$ ^% C* a, U2.
1 S) \  c" j) E! t9 T/ mIntel Processor vendor-Specific ACPI7 v( @9 o# f2 k
# D3 C4 u0 P# K; u0 X

, _: i3 D; b' G+ Z! XThat’s all!
% m' ?7 {& O9 z+ F9 ]
% ^: Y7 H3 o4 N  p- ]Peter% y4 E8 J% G! O& _

, F8 \6 W0 c; v; ?1 f2010/9/20$ ~/ W. _) {, U7 E+ `! s

, w4 n% L) M- Y. U* V1 c; W7 [  v[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview2 S* H8 ^& l& d* T4 v  |

% B2 w  D5 o! D0 X9 L% L% B: rCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
6 ]: ^+ B$ y0 `( g1 q% O& VEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
0 S/ i; q; U- v; @, c$ I
! y) ^' E# t* u5 J9 F# u& y2. P-state Control% i6 k5 }2 a, A! x
# w% {# x( M5 Y& `, E+ S: |* I1 Z( J
1)
, {2 G1 Y3 E5 t8 A7 B: c: DDetect & Enable P-state
! ?+ a5 f* @* ~0 P3 c/ u' G % \* [6 g6 ]8 @9 S3 W  |
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
3 d) S& M# C! N2 P$ D
: f, G! g& ]4 x" S$ N2)
  |% u8 x: ^! dSupported P-states
! u8 E, W; b+ Q) \ ; k. `& o4 @  _- _& ]. Q! U
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- j% j$ w: e$ C5 a( R2 T

  `( L, {, T2 gMinRatio = PLATFORM_INFO- m9 [8 |0 N# I3 C
MaxRatio = PLATFORM_INFO
  V1 q! \" R9 c* gRatioStepSize = 0x01
0 q+ L" w; l) _& q+ x& K3 w) jNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1) j  X% b/ Z' Q3 V% q8 C5 D2 f6 R

& G+ r7 e8 G) @+ \% KIf(NumStates > 0x10)
+ l% H/ b+ O% |( U: Y+ L( y{
2 Q, |1 D3 |( p, kRatioStepSize += 19 S, O6 x- \4 N" S& n$ P! d
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1+ D/ C+ C' R* a2 g+ z
}
9 {2 c% V3 B$ o/ l# [8 |
# x" C9 V7 {9 D) l( Y3); J# [" M+ s9 p9 v
Turbo Mode
; z" X4 ?0 m) H+ q ' {  F$ l! e% [, i
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
% U* K) f9 E+ K& [" ~
; Y  O: L0 _, D2 X: r+ a* T4)
! f' ]/ n8 S+ J+ W$ y5 bOver Clock
! K2 o2 U; E3 k0 H) w: F
7 h6 a# q6 ]1 ^" c2 T某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
1 c( i6 O' B- d * B" A  h! g. B9 s
5)1 M% Z2 Z! K) V9 i/ X
ACPI Structure For P-state
- q& m$ w0 Z9 ~" L" w9 D9 f7 }& }
7 h1 A6 ~+ }* B% h9 N" ol5 C8 K; L- q, P8 ~* }
_OSC & _PDC
& v8 W' A7 q% E2 t. ^
" `5 F, o9 ]! S; B; `0 G_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 _: u. C3 E5 a; ~7 e& b/ { ; ^1 N7 V' h+ @" r5 z8 D
l
7 q  X- T) W' i" ?. o+ s
_PSS) E( o! ~9 C% ~3 H6 s* w2 h
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量# p2 L- \% J1 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做比较
& {. j! x. X. g; h. H. w$ H以确定P-state切换是否已经完成。- B- k) l3 v4 |+ Y7 s- u

* H+ O, M9 Y! P9 E* t0 IName (_PSS, Package() 2 {8 I+ h- d8 P9 t8 I: x
{
  \- `+ t, [' a6 {// Field Name0 Q' {* |- R9 c& U- R
Field Type
/ T+ z5 W/ U3 Y
7 j( E5 m. o% n' G( P! q+ Y, L$ e% P. L4 d" w

* W( _3 s$ d3 r# R- UPackage ()
! t/ O1 {; n1 b$ Z0 Z* u! f// Performance State 0 Definition – P0 1 ^# Z" L" g9 o/ r9 Q
9 E, ?5 Y- p6 F# J/ P9 l% @. P) u
{
3 n: U: I' Y$ {/ y
, q$ O7 Z& U  P( m
# E$ t/ C$ ?0 ECoreFreq,
" l* I$ g) [- h; z& R# r+ C// DWordConst
) o- p7 W/ B8 x6 n: `: |& h+ [* ?/ U9 P4 {

: |: ~6 a; Q& xPower,+ r. Q  V' Z0 w1 s
// DWordConst
2 B; ?* w5 a* J8 i6 Z
/ H4 x$ @1 g! |* ]TransitionLatency,5 D* a4 B# I. ?. {* I
// DWordConst
2 Q- a' ?) M* x4 V  Z: u+ F! g! ^8 L. S1 U
BusMasterLatency,
5 `# \6 n3 q% [// DWordConst
+ {* o( ~; b6 i$ Z/ E
7 p% w& u' @$ K, J' c" o5 UControl,
: D- M, G/ w8 d: i' T* d& l4 A// DWordConst ( G& G. M! O" Y

  b$ }- u! e( t8 kStatus
. @  h+ {4 _4 w1 u+ c
% j6 l( |% Y: `9 v7 x) Y// DWordConst
, c' @' g$ y2 V5 p8 m6 c* ?3 |! `1 Z/ e; R! K
},
+ R  q% O4 _- p/ D7 e0 s
1 Q. s$ D. w+ y3 d' p.
  O; ?' F8 o3 m2 `2 S
1 n% u- p: Q6 B. " L2 [* B& U0 a' b5 e

  r- R. B$ p7 V9 l& D: ^. , ~3 ~" S, P! Z4 V4 q: O# C; B" `
}) // End of _PSS object2 u/ B& r8 U% q5 m8 i# e# n& |6 ~
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
/ P* \% k+ Y# p5 }% B, d* T+ ?1 [
' Y4 Z* K( p7 x# J+ uName (_PSS, Package() 2 p) G0 D2 J0 v
; f1 @9 H6 V. ]6 l
{ ; r" U3 o  @& [8 H

* e* S3 q2 J8 F; u4 LPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ' X; }4 G+ v  @, q8 ]
, g3 \* ?' E; I- |
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
! W4 l# Z3 \: D! O% _7 T( {) E
* M7 l* r" g% |: w1 `" zPackage(){1400, 8200," ~+ n; j' `; D- Q
10, 10, 0x000E, 0x000E}
6 m& B1 Z% X: j9 [// Performance State two (P2)
, F. N4 H6 J) v- Z3 U4 @- F! LPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 2 a" O5 l& W6 d! V& o* L
Performance State one (P3)
: T5 p6 _3 s, x& h, `; e- L1 n# w% o1 F1 \7 v9 T8 \  P- V
Package(){1200, 8200,
2 c! ?1 y$ d$ P6 T10, 10, 0x000C, 0x000C}
0 U0 O& i6 d+ l! Q// Performance State two (P4), K. C- b0 e+ [( K0 \3 i  k: d
2 p+ y' e/ p! R& o( |9 P/ A
}) // End of _PSS object
; i* Z# Q* W7 W# z* g
# X4 }' b! ?+ \6 G8 p另外当该平台支持Turbo Mode P0将会reportTurbo Mode
, R5 x* \, s  Q$ {! T5 C' D 0 F3 z9 H5 _+ e# H2 i
l8 j0 @$ ?5 g- E7 h% E! M" `4 b6 _
_PCT
+ P* d; O' l# ]4 ^0 p3 ~   y& q# ~2 m1 ]
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的方式来进行。; n* p) t8 J: t: u
6 r' l: j+ ~; e' I$ Q6 q
Name(_PCT, Package ()
% \4 Q! ^& o. ?/ Y: ~// Performance Control object . H* h2 |: a/ `5 ?0 \
1 Z: a1 B6 L! l# J- g$ g
{ 1 ^, y) R) s/ \2 U+ j+ }- z
/ [, d7 Q" [& |" o
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},5 x% b2 [; r( K8 e  S
// PERF_CTRL / j1 t1 X4 r7 |4 @0 N" G
. p6 I1 O3 x: W! j2 S( l
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
# u" E, ^1 @. |$ T2 |// PERF_STATUS
8 `* w% V+ n* @, B* J5 M$ h; Z
3 o% R* ^1 x7 e+ f5 u}) // End of _PCT object$ z9 @/ m4 y# B% s: l% [
( h- p( [) s- ]
l
) E+ G0 y; t( ?1 _3 [  B
_PPC
! B) B' h1 l: X% f  c! p/ u
7 l5 q; k/ f! ]& L7 n& IPerformance 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
5 S; W+ t9 {/ ^/ o; ~7 {
# I$ g( \8 O% @' mMethod (_PPC, 0)
& P0 m7 Z8 y* _/ ]// Performance Present Capabilities method
' M7 K! W4 _# u# Z- g7 Z9 a, e+ d/ J/ Q" p8 }% ]
{ 9 ~1 F7 K2 e+ c' G' U8 r
& J3 ~  w  C7 R! u& `& |6 G& _
If (\_SB.DOCK)
2 @. h0 m4 H* u$ y% ]; Q0 z* J0 |! P
{
" \( i+ u$ P- c, i% Q. t$ O. ]+ D! }. n; b
Return(0) // All _PSS states available
% W: N7 O. |( O' ~1 K5 _7 e8 W" x! _! c, m
  o& w6 W+ o: N
} : ^5 N* N$ V0 y  j

- S+ L# U; B  ~$ U: |/ _+ fIf (\_SB.AC)
4 q9 u, [6 h4 q+ M/ R( U0 P9 K6 |0 t6 X& S0 h4 X! V
{ # M: |' d5 V% k/ ?+ H0 ]
( N1 ^9 M' m* M8 ?8 |" A# g5 s
Return(1)4 a' N, a1 k9 l
// States 1 and 2 available + I/ w4 c5 t/ T/ g

  h4 f, |- V3 E% D) q} + a0 j7 [' |6 `! t4 `

- E! ]! c/ j9 A$ i! `& y/ p, ]Else
1 h# w+ h7 p3 L( t. b( g& B4 J3 [# d3 m( P. B, v$ {5 n* w+ ?/ b
{
2 W5 D1 ]' B( Y; o
9 N7 G' {, V0 Y, u0 W* MReturn(2)
1 O! S7 W" z& z* h. N// State 2 available  u; g! j7 G. q7 d& y: ^

0 G) h' t5 M" R+ @! y2 J} : i: T- u% v7 M: n4 L* j/ b
4 a" V% ~, D: g/ R4 u& {! s0 w
} // End of _PPC method& Z: F3 u0 x' W  e2 c
1 u( j7 M, S% D
l8 @: x. l4 u2 Y& X- ~- C
_PSD# z9 ^8 X% M! D

. @3 |5 s+ _# g+ \P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
, U& [' d. j( G" s0 l+ v$ o1 S - Y+ `2 T; M0 x4 j) A! G
REFF:
( L) b- c; r4 D! b1.3 [5 x, J- \1 j& ~( F
ACPI Spec 3.0
: C4 ~0 r) w6 _3 l8 P% o2.
+ J: ~1 g* X% c; D8 x& \Intel Processor vendor-Specific ACPI
5 {$ F# y5 }2 c( {0 P" Z 7 d7 s- E$ f+ C( y7 ]$ K. X
9 ?! @- h6 s) C( {* i9 C! h
That’s all!# ~0 H& ^. `& E8 A! O% @

1 ?, Y- ^4 }$ ^3 r2 DPeter
: |4 |, N( c% ^ . v+ @. f" k" Q
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview1 E; O; E  d5 a0 S. D/ @

9 s* N5 @4 y1 |( |/ N( uCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
% Y: K* \$ d& |8 c$ y,影响系统的功耗和温度。
& q! |; t, ]# f0 _# @; K0 H
4 j- B) U, [* D/ f9 }2. T-state Control8 f% Q- @; j6 N: e: j8 k

: F0 X: v# u: R1)
2 t; c8 ~, J- E' O% X: p. K; n1 \MSR Based Control
4 \1 f, i4 P8 Z! A
5 [: K) l( P3 w6 C1 sBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 $ ?7 C3 c! R2 J% e" y8 N. M

9 f# r' d0 r2 ?9 V/ _2)
- H" x7 d$ H/ l- {9 w! V* PI/O Based Control
% |5 r+ ^0 Y+ {2 Z( v# x : z3 F  p7 F' J9 m5 f+ f
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。* S2 H: b& ]; B; @8 f
* L& t  r! A/ t
3)
1 w3 U+ y% p, v5 a! X: R6 X7 nACPI Structure For P-state- i' \5 m- |6 k4 O6 D2 I, ~
l
3 J" ~' C0 U4 D8 b: S
_PTC9 i3 M7 U8 E( L- G/ g  P* K3 g
1 g5 g  [9 F  _" n7 i# P3 i
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:6 h. h& \# E* b. q" n/ K

5 _, e" I- m8 H" j$ k$ XName (_PTC, Package() % b4 _# w3 }0 z
{
" Z3 }8 v" n; k
# @. A. }- @" B8 `8 DResourceTemplate(){Throttling_Control_Register},0 P- {" }0 N1 @7 i6 ~* }4 l; K! v
//Generic Register Descriptor 5 W+ S) ?; u0 w# Q: P' y
5 U8 |: `# e- n5 |" \4 A: ~0 [' d0 X
ResourceTemplate(){Throttling_Status_Register}  }- ~; l! c9 I: l/ l& ^+ p/ d6 a
//Generic Register Descriptor
; ?2 }' h3 T% X# K) Q  a}) // End of _PTC
( o8 b  m2 S. y ( b( X, S" @% h" x
下述是一个sample code) i/ j8 X. V6 F6 f0 I6 P
0 [9 }1 a, C6 B# \9 v" C6 _1 a& M- K
, p, M8 Z" i/ z8 w* W6 f" u2 _
//  ]2 }1 A; T$ i" a: i9 ~

$ i$ q+ Y) J6 g8 J// T-State Control/Status interface4 i* z8 S) j/ O2 C% Q

. C1 R& ^4 S, q) L6 U5 i//
+ E! V$ p& T; I0 A' o! i0 |$ p9 f' O+ ~+ g
Method(_PTC, 0)
7 I3 A, q" W& l+ {( H) {6 Q( P; R5 @7 R$ e& B* d+ [
{
# H6 ?8 ?7 N( q2 J5 @# c6 o
2 \/ I3 h7 w2 y3 k% G+ Q5 }* p//
6 n/ t6 p( `1 a+ g4 }/ B8 T* G) A: T: X/ @" a
// IF OSPM is capable of direct access to MSR0 o  V4 \: M! J: ^2 ^8 z3 D) E$ o

+ m. _' {* g& R' k% E- |//5 U/ n5 F/ |) W/ e
Report MSR interface6 v0 d$ L  _. I3 a2 ^

& n& {6 V5 N# ?& ~// ELSE5 v$ o% u+ W8 |6 z' E: c+ M4 l
2 Q0 V& j+ f6 J
//
& h" h& Z$ A/ E& r  D- o! \$ fReport I/O interface( U0 {8 Q2 Z* L! x2 O) s( G* I0 J; Z

4 q' Y% Y8 }! e; S7 n# u//9 Y3 K0 a2 s, Z+ O+ F8 c$ Q

4 A  h  n  R9 H+ A! ~0 G//
$ b9 m% t0 m7 c) t& h; rPDCx[2] = OSPM is capable of direct access to On$ s0 A/ w3 t# {) }5 b, n
$ @  M  N; x$ U. G7 ?! @
//
2 b+ f% q: O2 L% B6 e: ?Demand throttling MSR2 @( ]9 ^; s9 P
1 w/ u5 u1 @( T: N! V' Y
//! l. t& S# l* o
% C5 p( \  i3 P; r8 s. I  p
If(And(PDC0, 0x0004)) {
" A1 d- W1 Q: M; J: u6 ^  `# Y0 y: y# ^& F# k! o+ k
Return(Package() {
) d( `8 R5 B% S5 s" ^" o
/ E9 N4 [4 e+ z* u$ aResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) k( K3 ?8 @3 `2 A
/ F. @0 q+ K% i) F3 l* f
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}5 L/ V! e5 ?8 {3 z4 j% o

$ K& a- ~7 M! e8 a9 g, S: C1 P})+ ?! `7 x4 X9 T
) T  L9 K9 l8 [+ A
}
% ^1 ?5 C. U0 V! a4 t- V7 Z% q* S, k0 x4 @4 H! g* b
Return(Package() {
- _0 t( ^+ C# O6 w; I0 C: A( s
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
+ m1 Y2 U! }: ^" E1 Q3 s
$ Q, c7 j4 N, }6 K6 }ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
# g9 ^9 d8 A  d. h$ k! ^4 @, d7 `8 ^4 y! K/ z
})
. t: O: {  ]1 J/ z7 _! ]4 u' ?
& D( y2 @1 k# O0 v9 y' v}
, ~3 F/ n* u( F8 f9 M" R8 C1 ]" ^+ ~" |& r1 F

! {3 V! n+ P& ^; g0 o* R; q( b) L4 m! n1 {' x9 x5 _
l, K# f0 E9 a0 K( l& q4 I( S
_TSS0 U% @: q# b" s% ?6 ?

, G- q1 p7 A& r( w( i$ a& cThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
' ~' w* i& b5 SName (_TSS, Package()
7 N' E! C2 r5 O+ @2 v{+ b' S; E; i* o- ^/ o; @0 a
// Field Name
; L. V' d1 L) m6 c' ^Field Type
; ?  S4 J* g) |) x! d, d* l0 H  n% u

9 o% C6 n2 i& f- N2 B4 u+ ], d- D) [0 x
Package ()( P* v" S6 z) m1 t
// Throttle State 0 Definition – T0 3 h. m' j5 S' g4 ]- H+ \5 E; L5 ~
0 p8 I, g: @  M6 d& ^
{  y; G. A6 h5 p# n2 ^
  w9 r4 r9 Q/ D
4 r5 c2 c2 u1 z' ]. I# m
FreqPercentageOfMaximum,( v" c( h4 z- z& ?+ R0 N
// DWordConst
& E, G0 ~; P' N. Y/ h
0 m) F) |: p, S! _) ?' Q  B# KPower,
2 c0 z. g+ [6 b; a' L1 W5 Z// DWordConst
# [0 ~. T- j* p/ @2 m/ e
. x. l+ F0 s9 o7 w) a: lTransitionLatency," G2 t% F& D8 l% z% O7 V+ `0 P
// DWordConst 0 k4 }' |$ z& K, Y  o3 [

" c, b5 }1 w5 \' i7 h( G1 |& }Control,/ Z4 P, A$ U$ `: H4 @, D$ p7 q* X; l
// DWordConst / p: y: K1 A9 d" y; q( |7 L2 V

4 o) n( S- i3 D6 ^' o0 PStatus9 p% n; q, P8 K5 n' ^8 J
// DWordConst
3 L- M7 C) Y8 ?" L},+ R9 Q6 [* K1 u8 ^  S
……
' \3 O3 M/ I) ?& Z1 S1 ^5 j}
9 g3 X7 S4 n0 B( j: S
% X, l& n& ]  ^0 o" Y. ], s4 b) tExample code 如下所示:" B! y- _! W- e# }! ?

8 V& e! P# f! P, QMethod(_TSS, 0)6 a' _/ }$ a* u# h+ o! c2 m- ?

! C# L/ ]. F, V- k{
9 Y/ T( L$ O$ W& U8 _2 G8 o, ^% @
# \7 c7 ^( y3 L4 M2 H( e1 d$ |Package(){100, 1000, 0, 0x00, 0},
: W, n0 ^- d2 _& C! O" y9 M/ k* V4 e' F) G# P: C% A6 ]
Package(){ 88,' L4 f' h$ @& J' ]) v: M
875, 0, 0x1E, 0},
. M7 _# U0 Z/ A2 F' ^6 G2 @3 {$ n
3 N5 P8 k4 @( n( q0 ~2 `Package(){ 75,
0 j+ |" a' B+ h1 V; y, T750, 0, 0x1C, 0},
& }) Z6 {5 |: f  T1 a) ~6 T) B
5 @9 |# V/ k3 b9 x' kPackage(){ 63,
9 z6 A5 U# C' ?! c+ y+ @625, 0, 0x1A, 0},
/ s$ G7 b! L& q' W% I, n+ V
9 y- A1 C6 S$ [+ hPackage(){ 50,
: j( }1 J. X) q1 n; I500, 0, 0x18, 0},+ r  E8 T2 Y7 B# \

0 W- {0 F% D( QPackage(){ 38,
- a. o0 y( Q# s' i& m375, 0, 0x16, 0},
( k4 G; c3 A( J: ?$ X, q, Y! ^$ k. Q4 G
Package(){ 25,% e1 T) r9 R3 l& N) u
250, 0, 0x14, 0},
# p; ^3 D7 T4 z: J1 h. i. j
0 P1 @( |; t. x( @% G& ?Package(){ 13,5 K7 u* {1 p: ~5 `) K
125, 0, 0x12, 0}/ i& `) C2 Z9 G) V. Y

; c# H, \! ^. {; P) Z; i5 C0 E! J9 U}
1 }+ ~  \1 b5 }; J9 H* F  K5 `' G' \; F$ w
7 j) d# W' K  j5 e# u
l
& y5 H) p9 U* x/ |& q
_TPC) P% Z' m# k3 K' @6 `
9 \" M" l& G+ g4 F# }- g- w' O
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC0 J1 \5 H: |) N* s, q) w: p  k

) Q; b+ n1 c. _* Y8 M  @. p* T! b* vl9 C0 m1 f: B0 a" d- V
_TSD% o. l8 q8 I6 t) x* o# j
  m! X5 O4 _- M' ?5 N
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code# l) T' J; q% v# a
8 G9 B# L" W8 y: X2 u* e
Name (_TSD, Package()
7 Y" B. p, F+ u3 R* Z, [+ M# r% E0 E. p: P; ^: F. Q! e' Y
{
+ ~' V. B: g  W7 o0 O5 k# s
% I. [  ?0 Z- X  S! NPackage(){5, 0, 0, 0xFD, 2}$ @/ O3 `: _. y  I; l8 a! h0 ]4 p
// 5 entries, Revision 0, Domain 0, OSPM # C% @1 f7 e4 R
Coordinate, 2 Procs " G5 Y; V6 @8 h5 K) O7 J( h

7 f2 I, j' h: }  ~' A7 ?2 q' X6 e
& x2 {0 t' _* D& @}) // End of _TSD object$ n3 `/ @8 ]$ @4 s

( |4 l: r4 {6 b' U- ZREFF:
6 O. j5 H5 z+ Z6 Z1.
9 Q5 C6 ]9 O' R8 n3 rACPI Spec 3.0
& y0 w6 J9 u: I( k# H+ t+ R7 @2.. b4 P) h4 E3 Z& _8 R- i5 C6 ?
Intel Processor vendor-Specific ACPI
: u. b+ D* U  X3 p5 t' ]0 s# { . \1 e3 q$ f8 Q! b! \4 k4 z
& h. f9 v9 r  i1 m. f; H
That’s all!4 I2 v5 k2 J& [( \& b% `# g+ t" F+ ?
1 ~* z# T7 k# ]4 i/ s1 z* m
Peter- p& V- _% ~1 |# x

# L/ k% `% ^# W2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 23:52 , Processed in 0.112745 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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