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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
* ]4 r; z/ N1 I0 Q; l, A
1. Overview
; f4 l4 E6 G% f+ L$ J% o$ U
$ T) a9 {; n. @. C1 S4 g2 [8 T  z3 r+ i8 p5 {  ]# Q
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换) W. K" X0 M( c$ Q& |: p7 z
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
& _, u* n( g, f3 G比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
5 M, r" w/ L5 d  u' {  J& J+ F  [9 X& {- X
cstate1.jpg

9 O% l& W. N% F( @  Z4 A) Z$ a
1

7 `; n, R* r9 E0 K2. C-state Control
6 r  G# \, m% j( U9 t5 ~+ |' ~0 q* ~& L" ~4 x/ w( _6 w; Q
1)
  @8 S) t; x, U( {5 e* FDetect & Enable C-state
" ?# t7 e+ l4 \7 B% d$ \4 j% C& l: I# T! l8 d, k+ f
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的支持。4 e1 N2 U9 k: p: B4 D
# o& E9 t$ |$ g$ p4 Y7 _. x
2)
; ^/ |/ B) k) y( E- |. GC-state Basic Configuration! i7 C" H5 E9 V" J
通常情况下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)。
3 l+ Q- T  r, R, M. v2 q/ t  H( i0 d7 @, f
3)( g: }1 L, c1 b- C
ACPI Structure For C-state6 e& V( Q5 W# E5 c

1 e# `( c' ]9 M8 r, o! [: bl& h- b% E, o3 ^' d6 O
_OSC & _PDC
5 B# [& H$ [/ x9 `# z- W% S7 a_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
! I+ R3 O, O4 h2 @2 K  Vl
% B1 N, i' m7 B; H' _
_CST; R9 I1 ]4 n, L( c9 @5 S! k6 K
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:: F, r" A( C, p! w
CSTPackage : Package ( Count ,& h+ u* D) m0 V+ F) A
CState ,…,
! P; {2 u( ~) HCState )' I% b9 E! n4 s; x, g
其中Count表示所支持的C-state的个数
2 @, z7 A; E  r* M3 E# @- xCState: Package ( Register ,
: I0 U. p1 w8 y- x9 _Type ,9 F! l2 h5 i' V3 e. G
Latency ,
8 D5 I7 R+ r' s* iPower )& X: b, j! N! D# X- A! a

1 L) l: ^4 ~0 ]- l4 Z7 @# k# DRegister表示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
/ }, H/ H) u- f8 G' W; b4 w# u7 H' W2 ^9 \2 C5 q
Name(_CST, Package()
: y" P2 P9 b, A- S! @

" `7 b# B. \4 E$ T( t. l{
9 e( V7 ?0 d( Y1 v4,6 _+ A9 I: y. z2 Q
// There are four C-states defined here with three semantics

& V1 M  k/ y# @+ _  T1 Z
* {2 h( h  {- S$ I" |  e// The third and fourth C-states defined have the same C3 entry semantics. e# A% G  T' K( y+ _* B% S

7 K  {5 c# P0 t+ R% pPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# d* l. A+ A/ j8 j1,! W- i$ r! E& [# W- }3 r. H% w7 H
20, 1000},9 W0 y0 c$ i& n5 W9 W) B4 K' O

/ t% n  ]. U* M1 c  e$ `2 \Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,, z5 v/ c; G5 R! ~# w1 p2 t: b
40,$ ^! e6 e6 ~6 |" z4 C) @
750},

/ }" B- I% y0 D2 s1 aPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
1 [, `9 d8 w. m$ |7 K% z60,
* r9 e. [7 S: n( H, E7 x500},
# s6 \# i7 e( V4 ~
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
" ^; e: q, Z2 W# y" @0 K) h- D7 L250}
# L* o# t! q7 i% [6 O- v, H4 n
) ?% \1 z/ |( z7 [/ I
})
6 e4 u: f2 @: V2 r' k7 Z3 Y
& N6 l. i5 p) e+ M- [) i8 ?) yl# w4 V5 W8 g1 R/ i+ g
_CSD- n' R1 h3 S& h8 i9 P

1 F  U# T' i3 MC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
  S/ V% J" h( j& z  K* u
5 X4 G  y: @* R( D% \4 x3 X& T$ ~
( u2 H. E2 s# |& O5 q- I/ v! P9 A: R4 n+ E

! e1 P; Q1 ]/ \" Q3 j3. P_LVL VS FFH; i1 E8 g+ x) ^7 U& s

+ |( k) U, E2 z/ h! k  c- R. ZP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)# T# K) `' L; r# _$ S- e9 q! x4 M
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所示:
# i& Y# z3 }& ~, s
, F5 Y2 C$ p! \# I
gas2.jpg

& Z' Z( S6 ^1 b; `( i5 \
2
. |  C' Q5 @  @/ {/ f8 {
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的一个例子:. x9 Q! t& m3 K5 R
Name(_CST, Package()" f& u3 N4 ^% x  d$ d4 ?) Y  b

$ k( B0 Z0 l5 d1 S{ . @) Q( Q& N1 S0 a& t9 k
2,
; `6 Y; o) O/ N7 W. y3 ^/ d// There are four C-states defined here with three semantics

% o: L1 G6 Q1 M% Z( a
* j6 S4 V% H& k! _1 N9 N: G6 Y1 ~. d2 C) I  }// The third and fourth C-states defined have the same C3 entry semantics/ p1 Y! F. n( F/ i& X" g/ u+ `

, l7 k1 `" l3 yPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},  R1 J: D$ W5 f: d3 f6 ?4 i
0x01,3 Q% w4 f7 }7 @  W) x9 j
0x03, 0x000003e8},
2 }  z. b; o7 q5 ?5 I
/ B' w/ j" L2 X: S" M
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
; g# k! J& O3 C% x7 X; U$ T  H/ d0x01,
0 v. i- ~0 h* q6 ]* E# B" d& z0xf5, 0x0000015e}
+ L  p6 r8 z. \/ o9 l* N
})
4 i; e( P: V* V" o4 s: m' C3 J  I+ Q- B! |

$ R9 n2 t& E/ ~: \" w' o) T" ~9 KREFF:  }) V1 X; t$ P; J" t6 v: a
1.
4 D; @" s" }7 p3 q, v4 i+ MACPI Spec 3.0
" x- I" n' G4 l# j# z" \2.
/ P$ e- ?& I" v/ N7 h9 uIntel Processor vendor-Specific ACPI- w' `5 l  r: F

- V+ ?6 t" Q9 X1 r0 L9 f3 ^- ~$ @
& I8 y; |" V1 V, o- u& bThat’s all!* ]$ [$ o- ^  D1 d1 J; h

2 x- s+ Q# U# L4 DPeter
6 P" L4 i8 w9 @+ |0 y1 K' F4 w+ r' |( X4 _
2010/9/20
. B/ o7 ?5 X) `9 d" y' V6 A6 B) v/ _$ u( y& I5 r, S' z
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview1 Y( a' }0 J) k' a) t, A. Z

- c0 T$ O; N) mCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
! n/ f0 s: z; f7 |0 x" y. ]8 yEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
4 n" R; `$ S  |" D: R1 @ 9 |. k3 x4 j* U. f" y
2. P-state Control3 s9 K" W8 v4 L" Y
  ~' m% ]: a" M9 g9 i
1). \; y* @! E" F9 o5 M. K
Detect & Enable P-state1 W. b$ `$ D, U/ Y; m# r

% N) K" t& X$ S+ Q# X& GBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
) k! t% i! |( Q" V4 b$ ~$ {$ d9 G ! S* o6 |3 Z$ V8 B. L% Z
2)6 |% i) H" g% @* s  c9 J) Z
Supported P-states
9 C1 V: }2 w. l; C ( M3 u5 }8 t0 k" A
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
: ?1 \& j5 \; H) K5 l3 S/ B/ p; H
, Z8 M4 e+ Q2 E! q6 o, ?6 [MinRatio = PLATFORM_INFO
0 D- ~" o1 ~( J/ U6 EMaxRatio = PLATFORM_INFO
! X0 k, d' N9 y/ M: sRatioStepSize = 0x01
2 R7 \* d. j+ n/ T: d* B% XNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
7 ^* \9 q1 Z4 O6 s 1 D2 D; U$ T+ n
If(NumStates > 0x10)
  w5 R1 ^4 Y) G* D* f{0 C: u% m, a* Q
RatioStepSize += 1, i- e' E2 h8 h- N5 h- v
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
- l* h& a% R' Q1 q! q' o% d) r}
1 L) a! M$ Z5 f; x; j6 p 5 i  |) G# m) z; d
3)
  t$ C+ Q0 n4 r1 Q6 A1 G4 {Turbo Mode9 J7 Z1 n5 \! [4 G

* p6 _; B3 h! W. L8 YTurbo 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& M9 Q8 u% X; {8 n  D
5 q, ~( p( o4 N5 C1 T
4)+ u3 {! D4 m& z7 i3 |* V
Over Clock2 `+ J% d  \9 N, N5 Z; l( c

% ~( S0 ]2 N: D, C# V) w6 h  a某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
" y' l- _" Z& c& O
: i! k) I5 k; N/ V) k( Y+ X7 S0 j0 ~7 \# e5)3 W/ @& h8 F5 ^" v
ACPI Structure For P-state- r! ~) q9 Q) ]7 H

5 z0 q+ l" E. Yl% h7 ]  A$ R/ x9 X! w- N) @4 u) \1 \
_OSC & _PDC' p8 p$ X  u* G! E
6 m+ ]6 E! [) K( S; K
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures3 w( |$ d2 T% m8 C" ?

6 s7 Q0 v3 X6 R. U) {0 Kl
& h  I# r2 Q) y0 w$ A6 f5 y' }& D
_PSS) g% }: R0 u. Q: V; G) v1 \
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
% C$ }+ E( j! x( m9 C$ \) i并且通过一个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做比较
+ J7 n% |- D) ?以确定P-state切换是否已经完成。; l) b; r. u6 `% W+ t; y

  I! c+ G. x3 P0 r# T+ [Name (_PSS, Package()
8 V7 B" M: V, |/ V& o' `" @1 p{
" O) _3 g. B# e& f' s% ?; }3 \// Field Name
' S2 W' R( V+ X2 i, Q0 uField Type
. ~" X- m6 G  Z6 k; ~/ `* s" u5 m" O
- |" j5 \3 M8 @/ p2 D) F
# n) k) [/ @4 u/ M+ s2 H
Package ()- G2 u4 ~3 P+ ^1 ~; ]/ y
// Performance State 0 Definition – P0
& }3 r0 I7 c& W# `/ b& d5 l2 F" Q, }2 [' W# p
{
8 p5 X2 v/ w( _5 W# U
5 N/ {/ v8 K2 N7 ?$ o
$ }& e$ b- N8 a$ l* x0 K7 KCoreFreq,* C+ A$ l, X$ h, F% \
// DWordConst
9 N: p3 g' \4 R
1 A4 H- o, {" F  ?& Q( A
) G) a4 \, `  N4 U4 w& L9 l. IPower,  w; e1 F9 X; |* M0 r: B: A
// DWordConst
$ t; ]& n) y9 y6 _. I" u2 X, V: \- m; w) G5 j* R
TransitionLatency,9 ~4 i( p4 l# I  X( @: F; j
// DWordConst
4 X' R. Z- E! C4 n" g5 W& O6 K
: n* H3 ?, p# nBusMasterLatency,* s" @: z- _  O7 `: x) _. ?
// DWordConst 4 e6 r2 R( k6 k1 d$ X* H
; S: d. a# y' k& [% z0 [
Control,$ l5 a9 z# Q1 A$ B, w" |
// DWordConst 7 ~& a: n# w- b" o9 j) r6 @

) L$ u$ j6 ^( G) Q( _) V1 HStatus+ h4 V0 y- ^  q, w! o
& m) |6 z+ S" y! }9 A9 ]
// DWordConst 2 ~8 L1 I6 J+ M! ?' N
$ g7 O2 b  H* t
},
9 F. i% Q! y) y" O  L
9 b7 k2 b0 U% ^.
) J; n: G; y; S: d& O3 L: K9 U* s# D) Z$ z& }
.
, W, b' l! A0 u! {' J' e- R/ q- x( z) p9 e' I* S; E& L
. ) e/ |+ \* [9 _: u7 f, V
}) // End of _PSS object3 I3 T, o# J  g; L( f; v2 m
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 " p+ b4 \& s6 F* i% O
: i1 i0 ~; O% p& w+ H
Name (_PSS, Package() 0 ~' g5 u$ {1 d4 O3 v# E2 g/ \
# ~; s+ A, ^: i( w' ]: S- _6 A2 h
{
0 @  e" G2 D2 d& h+ ~9 a, ?0 w
& T. E8 e4 V3 wPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
2 O1 c& ]& M* x$ [5 Q) U
1 ~9 e& U% K' S9 ]Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 9 f7 ^. g6 K# d, ?- m, ^% U5 A4 \
/ }; M, L9 z2 v. p. _6 h1 k; \
Package(){1400, 8200,
" G! p! B4 T+ X, A' q10, 10, 0x000E, 0x000E}
4 g- o3 w6 a) p3 s- f; r1 S// Performance State two (P2)3 q5 ?& h, Y3 U/ Z
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // * @. L' d& o+ W. }+ W/ c) w
Performance State one (P3)
2 v$ V+ J* _5 \) Z( e
# J* v1 |6 Y- yPackage(){1200, 8200,
+ @! d- C# @# L+ m+ U- v10, 10, 0x000C, 0x000C}
  l. H( \$ N0 F( {  z: b// Performance State two (P4)
* Z5 E. S2 R6 m  D& Q
. g( W1 A& y9 |. v" A1 C! V}) // End of _PSS object0 Y  B( x) U( V/ n9 a

) n" G4 g+ M) \. c1 W; x另外当该平台支持Turbo Mode P0将会reportTurbo Mode
$ k% `9 v: b! a7 I7 W
7 [+ L* r$ M. z+ ~+ y1 Nl
. b/ s6 n) X( j1 ?- m8 Z8 L
_PCT1 d1 d+ O6 p& I# x: _

8 L5 k! |1 B* j6 s' ?) Q: [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的方式来进行。
; H% P* Z, ^1 m" @
  S+ |( u! I/ E0 ]( Z1 o0 r* Y: J* sName(_PCT, Package ()
* I4 M& ^% ?, }0 n% u' Y// Performance Control object ! T+ H) c5 V, L, J0 [9 z. B

# Z' K/ ^; h/ A" c3 F7 x, d0 W{
) t  W2 O$ R* ]& Q
1 f4 N3 d% ]& p6 EResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. [2 B& s5 E; a* t- s// PERF_CTRL 1 v& u4 ?: D8 d" Z

3 p7 h- Y5 f1 T; G# V  wResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
9 N# E* h' W" K& x, C// PERF_STATUS
5 R; W% G6 x0 |1 B9 Q
" s5 r# N" F+ L2 s; k}) // End of _PCT object, x/ y6 D1 ?. l8 m/ A

. T7 Y6 Q, z) O/ Z; ^+ {& C8 yl
) H9 _9 ]3 m1 \* A
_PPC$ `6 F+ y/ W2 W/ n1 u

3 G4 E. {4 V  [; vPerformance 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
6 b3 {8 T$ x7 {7 I7 j6 Y / P3 ?0 I3 g; ?4 R
Method (_PPC, 0)% s" V, E& u' X0 Y
// Performance Present Capabilities method
* R; c  h/ C7 U/ n- o( x' X! |3 I- Q( x! z1 l4 e
{
1 j' ]' N% I* P! v5 g% ~6 \  z* ~1 Y. u5 n) \
If (\_SB.DOCK) * t8 h4 x/ A( ~
! @( L4 C0 k# f, F/ J1 l- ]6 f
{
- P: M3 d5 ^3 K5 p( I) |9 @  j1 L5 ]: }  s# v+ Z
Return(0) // All _PSS states available/ c; D, c  Q% T" I! G# j

/ z8 ^) ?: r  t8 r8 C' ~, ]: R% X6 n/ s
}
: \$ J( \* g5 h: v! c$ d  V. }9 C: D9 R1 @7 f  E8 s
If (\_SB.AC)
7 o; u5 q0 P( J$ c& G
. n& ^6 q" I( f, F7 R6 A: \$ T2 b{ + c$ Q9 ~' d6 ?5 A$ {

( W9 i5 S& u# j/ X# ~  UReturn(1)) G1 x4 r- X3 ], `
// States 1 and 2 available ; D  @9 k/ m7 D& j. @/ L% ?/ W

! G" [! c& M# T3 b; N4 p$ |} / w  q2 ?$ {+ U0 u

, [! l( I( _  Q7 MElse ! ~# V) C, g) i' s- G

% M4 j2 I1 }7 Y{ " F" h5 B+ q& }4 t" ?/ B

# d9 e- o* _0 h; M4 Z1 XReturn(2)
. ~4 g0 a% M- ]: a- l// State 2 available
( v6 C# C# ~% d% e" P
5 h, m. E: g8 k}
! X0 k1 w  Z7 o
$ U3 p* X0 \5 S7 c% n) }7 A& e/ V} // End of _PPC method, D, _: D: y5 ?5 ]) b

/ n& V! r- O% N& e. u" J' [0 ^l- W& {/ R2 @) m  s1 U0 Z
_PSD9 `4 Q) K6 G4 K' f, B
; P2 Q$ w& P- B+ q# ^, \3 ]
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
! `* ^/ Q* i0 m2 c- T4 U+ A$ ^
: G, _# x5 ~: ~) m' w+ N, F" ?REFF:
, F* I0 {( ^5 k9 a1.
: J5 L1 z4 N4 O& oACPI Spec 3.0
- O: c( C; J) i5 ?# T: [4 P# z( L2.7 x% ~& ]2 v4 O
Intel Processor vendor-Specific ACPI8 w/ j* w9 `/ q; e+ E' {
8 U: _& D; H7 t) _7 y
) ~$ v/ s5 G6 O
That’s all!- G# P; ~0 {- G7 E2 Y# ?1 ^& E2 \
8 j) T! L& ?/ U9 v6 |  a) Y
Peter
/ b1 @3 f' k5 j; C! }4 ?/ t6 I
1 ]( y1 v( R/ }# y* j: `# S3 A2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview4 o/ q0 C$ F$ u2 u- b3 p7 X( F

% F% [4 Z& w# C0 Y4 z) TCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式8 b4 H/ R- p: L
,影响系统的功耗和温度。
5 U1 B0 W& W8 L% ~; U* y- [ 8 t' o  ^# t! _5 C2 w; S- j, w& x
2. T-state Control
* k! O+ t6 v3 L
) U; ^& D5 a5 D4 o' ~4 t1)  U1 y( L% L) u  H
MSR Based Control% g8 u6 g$ E- J4 n

  g0 S0 h6 J, x0 OBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 , |, z+ P( H* _9 N4 U
+ `5 G* [+ @, Z- T* I7 K
2)
- }3 f9 W0 R$ }/ u9 E+ mI/O Based Control
$ G+ r( s. ~0 m5 k1 S ) G  i( c$ ]  x* y$ \
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。, q) O  I' b3 u' I& V+ E
' m- Q; f, q5 u0 v* k
3)
' \3 W& S# N" e4 uACPI Structure For P-state3 K# T$ [- \( a0 B
l
+ O" ?% F- j6 ^
_PTC0 m8 D$ Y7 I! ~

3 f. v/ z+ e2 g% J  C! Y* CProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:8 G- z  R- q' ]) |- E: ~% ?( G3 n# W6 P
2 t" M4 k! e- u: I# m( B
Name (_PTC, Package()
0 a  q- ^+ s0 z1 i  @4 p{ . v, F/ _0 v" V* D/ G* `5 h( K$ c" Z

( W4 ]+ X* ^" i' E1 F. d+ J- uResourceTemplate(){Throttling_Control_Register},* j" F! `/ W4 @, P% |$ a; M
//Generic Register Descriptor 3 |2 t9 h' R3 `$ D
  N8 b0 P! T$ B+ E
ResourceTemplate(){Throttling_Status_Register}% p- g$ a, |8 d/ P& x' s
//Generic Register Descriptor
8 J  l2 `) r" j; Y}) // End of _PTC
/ Y! ?9 c3 y( _, @; G! {0 c! u  L % q# e2 |% A" s# y' o) W$ S
下述是一个sample code
; @3 X8 V2 M* S2 g3 [ 7 L* }, P* o6 {  I9 r
+ W  t4 i5 m% ^( Q# A
//
* T+ C: ~1 N9 p) U8 O
) M/ e  x+ r: @1 t8 m. D// T-State Control/Status interface' ]6 ^7 l  L; P

3 j" @' \. J* P& ^  Q" J8 N//8 |3 K4 a& s. [7 c& W5 O; n

+ e7 S% R( ~- \5 l0 JMethod(_PTC, 0)& z6 S/ e9 |% f3 ]) L# B; F
- G' ^: o  t* j# y4 ]7 K0 j
{% M; f7 H# c/ t# u) x0 [

5 D/ W* T; P; ~% b, T7 {//7 c, Z0 I  ^& _0 G1 E8 `
4 n  A2 x$ y" D/ W! g3 D, }: o! R% K0 k
// IF OSPM is capable of direct access to MSR0 s5 l9 D& c* Y4 o1 a7 N0 K9 C
- _* c+ H4 f: D2 y3 @
//
" k8 P/ U6 q- i5 _; d5 X, t' uReport MSR interface7 |( U0 g# R7 t; V
4 [$ t/ L; e: _# o
// ELSE; x! l& X; Q6 D5 }; X7 _
1 e$ s* {  C" G1 e3 {
//
, q, P  L  T; m. Z% @* N. M. }5 hReport I/O interface
  J9 M( p* Q+ k6 ^0 R  N% l
  ~3 k+ b; _( b5 r. @) j//7 e- E6 w' a0 |2 d2 i' w. ]
. M. d- r+ y% r4 w4 H
//0 X( q! V) U/ G
PDCx[2] = OSPM is capable of direct access to On
  H/ X# d+ D" d3 j. t
  C3 u1 r5 r3 [% v1 c( h3 e9 U//
3 _" k7 {9 e5 I2 u; BDemand throttling MSR
+ l+ W/ B4 D& Z5 u
$ C: o8 s9 S0 V4 u4 ?//. E3 @" V$ {/ t, \

+ G1 E% _8 @- q- _; G- OIf(And(PDC0, 0x0004)) {) W" `: f8 t; ?4 ?

+ D" C0 `5 l' ?' vReturn(Package() {- ?9 Y4 Q0 G% x3 d4 n9 Y; m

: c5 w+ k. `) _ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},/ x5 t: h! p0 i' Y
& B6 t0 H- Y2 c7 G* y, z6 F% \
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}$ D' ^# v+ ]; S7 h- Z3 r

7 Z' Z; I: w  O: K; X5 @6 R; _})
% ~" P$ S- Y. K; ]5 |' f! [
8 M6 x+ w  `* I/ d3 F0 `$ E}& O% `$ y# D. _7 \' {7 y  H
8 v  j3 M; e* P/ b/ V' H# u
Return(Package() {$ o+ k: l( q. R! v

& N" f( [# s: A* l& \5 l  z3 ~ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
# G& V! D( V8 V# w4 `
. s- @! T8 p; g7 N* X* lResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}  w) K+ \3 S1 U. h0 m- U0 _
1 }" E$ }6 [$ Y
})5 b' i9 x- D. z* v) U0 d" F/ \2 S

2 v6 J: x. H8 Y: h}! I* R1 w4 _5 Q7 q
3 ~0 l2 H$ P: P; u2 e8 ?
% _$ p/ S4 M' P: r: V
) `' Y" I; ~7 c5 i  H
l2 e9 x; B( |6 X3 ?5 \1 z0 L% Q! |
_TSS' F$ s# i( Z# i  ?

2 }; i) {* P( {! S: L9 \! P  H2 BThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:0 L4 {  M; f$ Z' p* w  y
Name (_TSS, Package()
% t! x. |; n, W+ n{7 \' X# B$ `( m$ J) I( i
// Field Name
5 Z7 W9 Y9 U- A! U2 W$ g- SField Type
0 g6 Y& T4 y6 O( c  K
( Q, J8 e/ b& l! Q
; |9 I$ E' Y/ C0 _) I
. T+ H+ V. P) o& R  v0 gPackage ()( Z: s# z, Y+ P3 n! m3 H! x
// Throttle State 0 Definition – T0 ) h$ f  b7 t& \% D# W

# Y) i8 f- b  |0 G9 D{
, O) E) s/ U4 J/ _2 M7 [6 W
+ E2 G3 p4 [8 V( G5 N; N( F9 Z2 {6 E+ ~& m
FreqPercentageOfMaximum,
0 b# H% h" _' m0 ^' v// DWordConst
2 K$ ?/ ~1 \$ O3 Q9 ~! l; S3 e' y8 ]/ R
Power,: e- ], F! k9 n
// DWordConst
( k9 W& x# g5 `" k4 o: ]3 \" u1 ~) y$ ]
TransitionLatency,. r, P9 r' S- H3 n$ E6 y8 F
// DWordConst
; l# I; S1 e5 D/ q
$ ~% ]. q8 C6 YControl,- ~' Z+ T% x6 ^
// DWordConst
; j/ F4 g! M) o
' l: A7 X* N( P+ NStatus
/ P' F) U& N) }. z3 F+ }4 k( w// DWordConst
8 T  A/ Q) Z, @) C6 @& A},
/ z, Y6 B7 L2 p1 W7 ]/ ]+ ^……* U8 i: j( Q0 C" _/ r/ U
}7 @4 Y0 r* e0 q+ [6 n( ?1 s5 U  B# v( z
4 H+ J2 [5 C' D5 _: J
Example code 如下所示:$ D; m; ^2 e. d( g

3 u/ ?7 W+ L2 a. }1 b& o- mMethod(_TSS, 0)' T" R8 t  I" k4 d. s, i" {

; U5 R, d- z( h* X{6 R, {& }# w! X* S1 Y

9 p  G$ C1 [+ V( _2 ]# k" {Package(){100, 1000, 0, 0x00, 0},
% j! {8 E9 F' Q0 ^8 O1 [# _( V
: h& I; }' ?9 Z  `Package(){ 88,& t2 ^1 P; i1 c
875, 0, 0x1E, 0},6 k# F! o4 z4 O, B- g! ?* w
1 `+ M$ ]0 L5 h  ~
Package(){ 75,  a" M& z& j0 d3 C7 [
750, 0, 0x1C, 0},
7 a( X9 ]0 u+ e6 O$ C4 t
+ t) I( {- {9 y/ n, h8 D. JPackage(){ 63,
! d/ _6 l: m; M2 }( v625, 0, 0x1A, 0},
$ O; `( o" s9 v5 I% q
; j  G- J+ R+ X1 ^8 hPackage(){ 50,& P  U4 T5 c* i0 ^5 L# D
500, 0, 0x18, 0},
+ W2 O0 c# d+ B' v
/ o. n) s. c9 a& X  |' k0 oPackage(){ 38,  _  d5 S9 |6 l1 R2 O2 S3 Q% n$ N
375, 0, 0x16, 0},
/ [# }" i9 i0 o& [% d6 U$ W/ K
6 \0 L$ v) _2 f% T/ Q1 X% IPackage(){ 25,$ z4 c% G3 e" T  ~0 k1 ?' L0 S0 T
250, 0, 0x14, 0},
* T; E) d- R. R! J! `, |
& F/ H* F  p$ C; t# p4 O1 kPackage(){ 13,; {/ f1 w9 k0 f0 Q; P
125, 0, 0x12, 0}1 H8 b1 y4 E& }2 u# ?

5 y9 V# ]( S5 t' S}
( t5 B1 D4 S0 c# \. P
8 s7 I7 l, H9 C  s. C; `7 D) _2 ~4 T" b% T
l. g7 S% b- ~# B& t# T
_TPC
6 d; [# ^$ T( `! f  q3 Q 0 J& b: J% ~7 _" F+ m$ l7 Q
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
8 o0 U) B; @' P' u
3 u9 ?0 H& f- E# ql) d: @6 P+ V% C0 g) ]3 @
_TSD2 K& E& l+ ^7 Z5 r" f+ b4 e

1 w) l: e, I+ I* g& ^" w4 y- q9 V! pT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code5 L6 ~# R8 H9 v! d/ d; M4 E

+ }' f1 z$ p- x& C. X0 OName (_TSD, Package()
  ]1 U! E" M; v7 ~8 a2 q7 u. n7 M; b3 i# m
{ 4 @$ x  N( j0 u7 O

# w' z: v! }: T& _8 R& T( pPackage(){5, 0, 0, 0xFD, 2}
* K0 _) q! a" I, }8 |3 x1 c// 5 entries, Revision 0, Domain 0, OSPM
* S  {+ r+ i0 {" \. R( x; L0 WCoordinate, 2 Procs 4 }5 P. H5 B. e( \- O" T) J: m

& i0 l3 \, p# M; z2 N, R- f) B% w4 ~3 U1 {: R' ^: [2 v
}) // End of _TSD object
7 z2 D, @  V) Y) P  ]# J ( ]. w2 o% j; S# E9 @- x
REFF:
' M7 p1 G0 g+ {+ G1.1 a+ m$ r0 L6 Q5 R& V
ACPI Spec 3.0
) B( Y3 d# P, X0 m& y2 J8 g- J0 Z2.( Q$ `% G5 \1 ~- \9 a& w
Intel Processor vendor-Specific ACPI5 D3 b/ O( u: W6 ~* m4 y) x8 u1 z

( l2 t3 @8 x$ S6 D1 S/ L
8 W, n) f! Y7 ZThat’s all!$ b2 Y2 [+ z% i7 d4 d: O$ w
. D6 ~$ I" n' e; y9 v0 F# O, }
Peter8 c! Q$ F+ N3 Y: |& e& e& R- G
; s4 w4 {; g- r, {. j4 }
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:12 , Processed in 3.423571 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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