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

CPU Power States

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

8 G" @1 `5 B. y: e$ u6 q1. Overview
% W7 A" s8 v9 l; u5 M) j7 I
$ j% p% J$ ]: H# G/ Q" I4 w  g+ Q+ U1 M7 i3 ?+ k
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
0 @# i* t1 U* v. K" j5 }; b/ W降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看7 \; Z' U$ l! p' _! o. V) }
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
, O- R- f5 y& ]/ S1 Y
3 |5 S& t& q/ u' x, {$ |, O
cstate1.jpg

% w  r  C; D( H" I
1
9 O9 U, G$ C: {' \: z
2. C-state Control% ]: n4 e6 q! Q

( H. H# u3 ^( F- t2 p8 I1)
+ H& T" E1 g' K( E& o9 DDetect & Enable C-state
) {2 F# ]% [( n& N
$ M6 Y: c$ B# o2 O* u8 i) M* l- {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的支持。% a' h5 U& Z* j8 o* t

% Z- k6 ?  f" U$ y$ p2)% ^2 j" a( g) i2 y6 C; e4 n
C-state Basic Configuration8 }$ r* L& e8 p/ ]; K/ F
通常情况下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)。. p3 Z: e8 B, x% u1 X
1 c9 q0 F# d+ Z
3)
: j- }% C" r& L) v+ O& c0 f! c- j8 k9 XACPI Structure For C-state3 V0 R! o4 G& F' Q- x
7 m9 i8 s3 K: _$ U% b9 E
l
2 [: i0 K& W7 X9 _3 [: a8 q/ d$ I
_OSC & _PDC
% G% y+ W% ~! P: ^_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures) [. w9 X2 m$ Y1 w) V; H
l
0 P, [: f* R5 t$ ~% F: B
_CST
: d) |, _9 n$ P6 ]2 y8 [_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
! i1 D9 I. \2 _. JCSTPackage : Package ( Count ,
$ c& L; W6 y6 BCState ,…,
6 Y4 ~9 E0 M1 A* ?! O' H; oCState )
4 }% l" K$ F5 A2 |& q2 Z8 N其中Count表示所支持的C-state的个数- r4 @! s0 T5 C" N  g0 N/ t+ ?
CState: Package ( Register ,
# I2 T* ?6 ?' y3 kType ,9 v( n$ L# Q4 j& Z
Latency ,
) W1 `" [6 p6 L) Q) T0 hPower )
# G2 F) E/ t9 m1 G6 E5 w2 c
) c& N& ~) k+ z, NRegister表示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
* C0 X& b4 b3 j: ^9 [- o
% o9 w: L, `0 I  o7 aName(_CST, Package()
% T3 B4 w, p  @; d! t5 ?

& F* M; ~6 f0 Z# i* X3 W2 [$ N5 o{
7 [6 A1 R" u2 Z; p" A4,- ]& f( G9 O9 E4 t* ~1 D- r
// There are four C-states defined here with three semantics
- ~5 j) O" M  n1 q5 G6 f
4 V7 b) K/ p2 k7 z9 ^5 l
// The third and fourth C-states defined have the same C3 entry semantics3 {! n2 I! |' E' b( m" T

5 b3 O! a2 b9 ZPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
& d8 W  I' [* s  S0 z1,% k+ a  E% q9 U
20, 1000},8 U9 }; U4 ]9 ^

+ t, M. I  i/ f* }Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
  Q# D! O- C4 o8 K$ ?. I40,9 b) {# J+ ?: Y- ?" |5 E& H
750},
& {$ J' t. p2 @4 P. d7 _: c% `
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
9 X; h6 P; ]* L* ?% w60,
  e' D4 k/ R& O, }1 m3 V! ?& ]500},

! j$ j2 A4 O5 m& x$ dPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,6 g) W5 S1 L( S* G  p8 {% `4 k" S& _
250}
: R' v" L0 W  M: K& Y  u9 T" g

" p  u9 v7 C" U; b- z  b2 E})
) R) F4 n5 N* _% G
7 L) F9 z) Z# H# H& R) t: |7 W6 [l8 E  w4 `  U! l( Q8 E9 W  l
_CSD, `# ^2 z/ j5 M% g( i1 P  ?

# L5 W. Y* ~0 V  t3 C* SC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
) |8 f" j8 u; X9 x
' S7 H% @% ^' M$ e9 h
' q3 a- I5 z' g- [4 [2 A5 p& p
* I7 |# y5 Y3 v2 g5 {3 ^* C! W6 Z( x1 A
3. P_LVL VS FFH  t/ g) w7 X1 y
9 r2 O. k7 f# G- D* e
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)( R' ?: R' }8 \" }: J
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所示:
  ~  z; O) W- r; v* w( T* R& I* r5 q+ o
gas2.jpg

" e; \" A8 V* E/ _5 N$ _
2

3 P, F5 i/ ^$ OOSPM解析到该_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的一个例子:
# A) t$ _1 w3 ^* ^Name(_CST, Package()
' A; H8 N1 m4 ]- g: m& |

, L% r. g. Y# X( B4 z{ 8 o9 y* q; ~7 M1 T0 m$ o0 ^' d
2,5 I0 \1 E6 Z" A' R6 V" C
// There are four C-states defined here with three semantics

1 i2 K! S2 Q: V- B  n. o6 F9 B: B. \8 u: d3 p: S8 [/ T
// The third and fourth C-states defined have the same C3 entry semantics
) [6 t  ?- R; z" O

& Y/ a4 b1 o) ^  x/ ]2 G- SPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},0 O, p4 _7 H! s0 t
0x01,
/ c' ^# x. g; M0 e* P! c0x03, 0x000003e8},9 A$ q4 C) J7 Z: X! `$ l

% C3 q! u; o9 w) }Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},9 h, k2 c$ n9 o6 O, A3 Q
0x01,
# j+ w. e$ d6 A" K: Q0xf5, 0x0000015e}

4 y* [7 ^: F3 m1 N}) . S; R$ y6 y- W8 `; K, I: E

5 V& W8 T2 E7 H1 y" Y/ i7 Q% _5 z. `3 D# R! U1 P, z# t8 j  N
REFF:
# S3 {# q6 a- Q3 C" g* I  {1.! |( F5 Q9 C$ q7 l- X
ACPI Spec 3.0
* B' w+ A' l; Y; u- v. d+ X7 @2.& Q6 t! j: N9 L7 l7 G/ X4 Y
Intel Processor vendor-Specific ACPI
& G5 M( S8 g' @+ A
4 Q4 \8 {+ A& M! H6 D% M" `  _
  n2 q1 a" W) M& A4 pThat’s all!& E& Y" J8 |4 h: w  l& E3 t6 r/ k
7 c. G, R, w9 Q& P5 w
Peter
0 J! p% B: J: ]1 O
6 V2 v! k/ U9 g3 S( t8 F2010/9/20
0 J/ `# {$ H# b- L# X& X5 Z: g# F. O
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview8 R- e0 J2 E3 j7 X
, _) `3 r9 W% K: X1 n
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST0 f- F- E3 _6 ]9 \
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
( N, T  j# ^: n2 Y 0 E* ?& o$ |7 O. x; H# c
2. P-state Control
) b* b5 T, U+ m
6 N1 ]5 c% n' ^: b1)
8 {: R  Y; h0 |0 E- CDetect & Enable P-state
$ B. Q- a5 r6 T1 E
5 Y7 Y6 V5 I. bBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state8 J& S% F+ s$ h5 B4 K

) q: D" S5 e) `4 x' v/ [! h2)
9 T; n+ e% i. `$ E, z( rSupported P-states
2 L4 Z2 ]  ^( a/ l" x# ~ ! g  u8 C, X0 y0 G
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
& C0 D% R& m% Q% Z( J9 V" W
3 ^+ m4 f. K0 r3 c1 GMinRatio = PLATFORM_INFO
" ]+ o$ G) r/ }1 iMaxRatio = PLATFORM_INFO( g  @& [. b; B# Q5 ~
RatioStepSize = 0x01. |4 k9 }- o+ t. _9 H7 e, c
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
  y, T3 b3 D: g , m- I: w: _5 j& o9 M
If(NumStates > 0x10)
. @7 h' m# d/ q/ A5 \8 ~5 p{5 l. r) W. T9 c* B1 A
RatioStepSize += 19 Q# d" |. A0 J, U* H. |) N) v9 S
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
" J( _% ]# e2 u( }: `! d}
6 u# ?8 C4 S, K " A) _+ w/ }9 Z% `9 z: L# u
3)7 a. @9 x, l2 k% Y& v
Turbo Mode, O0 t$ F7 {6 q
3 d) f5 u" ~4 E9 a
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
6 I+ p$ c. {) f# b, h
: @8 s! x9 u- {, H  s9 i4)
2 x9 r. x4 S; |' Z+ x( KOver Clock/ D% T- I, G# L. K( _

& F* ?) N! Q: L& u7 }6 G某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。/ ?' H- |& v: y

. b; k1 `  W) V- \, ^' [4 Q# z/ b5)4 n1 l9 |0 W" R+ |6 Y
ACPI Structure For P-state: _$ \" J$ W' K2 C& M$ ]* k& L8 _

- Z" C$ @- l& T; l2 t. L  al
! {2 |2 a0 L1 s( K" q
_OSC & _PDC5 }  Z. [9 o+ J5 o# q/ F# D

& y! `, h: b% l" o( Z7 f- d. v_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures% G, T* I& r* ]5 @# w
7 \" M' Y# o; Z9 m0 o+ W9 `
l, e" e7 D9 F5 x3 o
_PSS
" p8 h, c+ g5 OPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
& t5 r" u  @1 i+ b2 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做比较  }& k  n1 Y* W# M2 X1 x4 S
以确定P-state切换是否已经完成。
. ~/ j& _! ~5 E2 |2 R5 h4 } # F$ x! S6 U( `: i4 s) B/ a3 t0 ~
Name (_PSS, Package()
, H3 ~' C& ?( ]( C: N{/ ?: W# H+ m( g7 ~0 {! l
// Field Name
% Y: Z# L/ G5 C$ |Field Type
; f/ I" n$ `' U# p2 A! P! b% ^' T7 p& g0 W- x# ^
- m2 n% l, v2 a$ t9 j! i% B3 b; Q
" N: B  M8 _! H5 z. k
Package ()
, W& k: N8 a' m) ~4 D// Performance State 0 Definition – P0
' q# F; T4 O# v* r7 s- X
% [8 p8 {+ f7 v$ d' R( J{
8 |* o6 ^: S# X- Q' N- g" Y8 r8 ]8 Q8 V. X8 x1 g, u0 r

) f. s# K  k5 `6 e3 N9 \, PCoreFreq,5 f. D! z8 f5 G6 ?
// DWordConst
3 }( j9 C5 _, n* U/ w6 w/ I* w" K8 U5 w7 a6 w7 a+ U) j5 X- z. a

* r) A, W. F, N  a  n5 z& x9 WPower,' U7 N$ d6 T3 U8 V6 ~4 ?$ M+ D
// DWordConst
( x2 ^+ Z. b& N! e" O0 T) e7 P- ?' R  h4 j) R3 J* _2 J6 ^2 n$ n% O
TransitionLatency,
, n+ N4 k- b- b* L. J) ~! t+ \* |, ]// DWordConst
2 X4 Z+ Z) k! s& Z' p. r+ `1 C( `/ }% J  _
BusMasterLatency,
% `$ a) e. z8 I$ k0 i' Q// DWordConst ( C2 W0 [4 [! {( P
( B4 Z( E9 r8 Q
Control,
4 w# A; g# w$ l5 w9 J$ K" |// DWordConst 6 U" y2 J7 h* T* `" j
0 j2 a% @( U" Y
Status
! F; @' @# _' P* g% s1 D4 |$ Q
; }. F' k' m8 U1 w3 f// DWordConst ! x' U, n2 }$ }$ h

9 s; b( J0 X/ O. M  e1 w+ M) m  E4 Y},
8 T3 K( n( ]2 c1 x0 i% e! m
' o: B3 b1 d) o# }) k( k/ v. # }% ^/ @! |7 d! H/ c

- l+ c3 `, a+ ]7 F# Z) \# }. 6 R3 M/ h% J+ z: s. r- K2 x+ h
" t* }, ~4 e) H' q5 z  N# R
.
' A/ ~6 J% q) v/ m) Z3 u}) // End of _PSS object
! H0 \7 c& T2 `/ q. G1 Y前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
0 g) _9 C: M% J3 F* N5 ?
2 T" R& \% ?: N3 m: e; I0 LName (_PSS, Package() 1 p- E# ]) j& u8 I. k
7 M+ J& l6 Q0 Z: r% n" Q5 U6 V, M
{ " g4 E' [1 q; ?  f# W/ d
  w8 y4 _+ m) x
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 5 D( ]" q* U1 `

$ A) A' P) I* I) O2 E4 ZPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
1 F0 [  U. ^1 v; m# {# M5 s, V; k. A  d$ t6 ]& a, V
Package(){1400, 8200,) u# C9 T) U) j7 |$ C4 r# c& `
10, 10, 0x000E, 0x000E}  `* s; ?! ~3 B( p
// Performance State two (P2)' r! O3 H0 W' u* u3 ^7 K' @5 ?
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
" L: D3 U, e# cPerformance State one (P3) ! O" p* i% q) m0 ]; A. H
3 X0 R& y/ t3 J; {% K/ t8 h- I
Package(){1200, 8200,
2 q1 I1 w6 ~. Q3 W/ _6 j4 F4 V10, 10, 0x000C, 0x000C}! P3 i+ |* y" {) l! D
// Performance State two (P4)4 R  W, Z, u) P) J: Q  w$ j
1 F$ Z: u+ n! \( w8 c
}) // End of _PSS object
4 [- h- c+ g, p; X# } 0 M; _/ s" d' a4 o/ ]. d
另外当该平台支持Turbo Mode P0将会reportTurbo Mode) p7 Q7 B) l5 K5 _5 l. H1 N# q# E0 l

5 J9 I% \" l& M, v3 G# Pl
/ b& F" @% W( i7 C+ c/ P2 g
_PCT+ K* S8 h$ `( I) @1 R6 Z
  e% N# \% Q- V2 \+ S0 i5 d2 A: a. l/ z
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的方式来进行。
6 ~) e: E% Y8 D' H
3 d% J5 |) K8 b$ E4 WName(_PCT, Package ()4 t" u. L6 j7 s# H- x$ i& w
// Performance Control object
2 h! E% E* J- l6 ?1 \. `+ @, m% @5 F+ _6 d
{
. X0 F- w5 K5 a; O0 Q/ ~7 D9 r) g% B# j$ r! D2 {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},/ ]4 R$ Q$ h' U/ s- z( x; ?
// PERF_CTRL
4 [' m0 u: @  H: b& Z9 j7 E& ]: m. ~+ c5 _6 |
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}; E2 |2 A; e# ?( g( v. ~* {) ^
// PERF_STATUS
7 i' l7 C5 j) p% N0 Z
+ v6 l' s% E- P8 E}) // End of _PCT object1 g( Y( U; \1 g9 H
" B8 V: \2 s  v, W" y
l, j5 B# n8 ^% m9 O5 I
_PPC
" V; K% I) ~2 F8 X
- ]* E( m- J' A  A, y5 L3 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
& I  w& d: K& i: Z2 _/ K 3 U# j9 \- J* }. W7 U
Method (_PPC, 0)
3 J' d1 H+ h% N9 h8 L  p6 h) \% [  K// Performance Present Capabilities method ; l3 F) v2 `. N1 n' |. P. R  y& o
3 a& Q! H' z: F4 Y, D+ q+ H
{
+ \+ A5 \0 H7 ?+ ~: K* B& a  V( J. H5 j
If (\_SB.DOCK) ; v/ N7 {7 V+ O# P& E

% c) @$ d) F$ y3 L& |{ % P/ ?5 _( d1 b+ W
% L; g1 p) c+ J- |, k
Return(0) // All _PSS states available0 T* d: [& u0 Z- g9 g4 y

' D6 m3 ]( m, N% K5 I3 a
+ C+ X7 i5 [$ W! N: S}
* i0 l" R' q5 J7 H+ a' l
+ z% d4 m) k% B- n9 K( mIf (\_SB.AC)
8 E3 [" x* ]1 Q, \* ]' p
: b- p. I0 c, f: s* N{
. s" U; @5 b+ s( \3 v) q) W/ a  h( q% t* i, D: q* p  ~
Return(1)
2 f: B: z0 z* _// States 1 and 2 available
* A  ~' z1 V* \8 h) Z
- U- P- _2 X! o: `" m} ; M" R% w$ W0 ~9 t
" `$ A9 U& w6 a
Else ( {4 R3 D# {/ o4 {
1 Z+ I  d& I0 h7 i" i' v% M
{
& g2 I) O8 z/ b+ t0 _0 S, l1 H$ o
" h+ r% j+ N1 eReturn(2)# L8 n2 \" Y9 h% R& c0 u
// State 2 available
' E4 ]* |* Y* e% a5 {8 J. s- o) ^2 z
}
: O' ^1 U( q3 K* R, j+ ?$ m+ ?) i8 ~* [7 u" x. n9 @
} // End of _PPC method$ ?  i; M$ s& [' \7 e
9 `1 N  d+ c. \* i' b) V" U6 b7 E
l
# O7 x' n: v" J$ w, r& l3 F
_PSD& B( r. C4 o7 H8 Z" v( x, r! Q( Q
; N5 v! G* u( q0 _3 V5 ^7 K
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
6 X" f" s% {3 ?2 m0 t . E$ P% R$ i+ k0 s
REFF:
( G7 z( {4 T6 a0 }1./ B, X6 I! ?$ D3 H& [$ C
ACPI Spec 3.06 `2 a& f" U! H3 m/ e
2., g1 f9 h( D6 B- J
Intel Processor vendor-Specific ACPI  B# r2 S- p. @& u

2 [$ K# |  s6 P& s4 x/ V2 A * [2 i/ D5 u0 K7 [% u1 A" R) z
That’s all!
5 H& K* n6 O  r
; y3 a# H+ G5 DPeter
: n6 L! j$ `; m7 }; _4 B% z 7 u3 T5 k1 L  I  c  o( e0 s
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
; k* Q" G$ z: Q$ y; a' ~& X 0 a  f) S. p& R6 L0 S+ _! [
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工作时间的占空比)的方式
# j+ ^2 K8 M) V,影响系统的功耗和温度。
# _! T7 Q2 y3 q. T* \' v 5 Q1 O' s0 m* S' l/ b
2. T-state Control! r9 D; F" c  `4 n6 B6 J# P8 @2 k

, n+ q, h$ Z  F$ [+ x% J1). a" `4 _0 j$ ?, E3 H
MSR Based Control5 S' k, d# x+ L  W8 W
1 @8 h2 y$ k/ V1 }) I$ k6 o* ~
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
9 a; d! Q8 d8 b8 o) O8 b, M
! D' C, _# u5 Z2)
7 Y; @1 z: t8 e. w* i; S( n* ^I/O Based Control
' ?# c. ^0 P6 r # j/ u0 x. H8 P: K+ d7 E# g, C; a; m. n- ~
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
9 `1 U; q4 X) p; z7 g 9 C; T; X( Q$ _4 N/ J2 Q& b
3)
# N* j9 _. x- O( d6 R+ k; [" EACPI Structure For P-state+ \( n# `6 m  {9 {
l
; S1 v7 |# P3 W! d6 s; z0 N
_PTC! A. p0 |% C. A3 W9 g7 |  I+ X2 z- j
) u, S) G/ _, [$ o( y8 i! g' g
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
* V1 Y5 b9 [% j2 i/ ? " Z  o( X* x3 [% u" j6 A  e
Name (_PTC, Package() 2 k9 k& T( j, @' M) H1 L
{ 0 v& K9 n' Q; D" v
, A: \, g0 E$ u$ S. \
ResourceTemplate(){Throttling_Control_Register},
6 ?# a5 V5 B+ k$ m" F$ {5 B- c: M2 ?//Generic Register Descriptor & x( `5 P8 z7 G3 G6 ?% D
; F0 v' ^* k5 G: S3 J
ResourceTemplate(){Throttling_Status_Register}4 k& h0 d% R' B$ f2 A$ N
//Generic Register Descriptor - r8 V( }: Z2 A- ^  b$ K
}) // End of _PTC
' f  ~( w8 r; m$ Z + Z/ C6 b9 Q" t6 \1 s6 @
下述是一个sample code
, d6 |2 o1 _. l5 B
& J& B! s* @% C8 B% Z( k4 T. W4 f! X* j$ E$ `
//
+ M  C; h- u' b0 z0 y" u1 j9 l+ P4 n( Q# l) ?  h
// T-State Control/Status interface
. w  [4 p( S0 g1 Z" J1 R6 ~# w# D; k) k4 F1 P2 h4 N6 D) m
//
0 H  ~" F+ ]; P5 M; [* y0 s4 S6 y. C& ~, p
Method(_PTC, 0)
& [. ?8 Y" b! S* J% v$ h8 a' M5 V1 `
{* Y1 S4 {2 N7 x0 Y6 T
. {/ D% j* W$ z" o. ~1 z2 k0 B- f# }
//" F& X7 c* S4 w
8 c2 a7 M$ b( j( [5 s
// IF OSPM is capable of direct access to MSR
0 G/ {! g- w' {) o' ]# n% i! K4 a9 k. e' f& H- W& @
//
+ L5 @  g& w) V% a  t' GReport MSR interface
# }- B" t; C$ e8 r$ H( S  Q( }4 u6 n, R# M( v' _
// ELSE: w- q2 Y# i( O6 f" l

7 T' T% F" w& c5 v4 M" r9 b% @//
6 w# L5 a/ _  \  I( Y* d; R/ yReport I/O interface3 O1 A8 {- H0 }# r, Y" J1 c4 F
9 W1 {7 r# e0 v2 M; e
//
5 \2 }9 s  l* y  }, z* x* D+ V0 D; Y7 X- t2 S$ X9 _3 `: o
//
5 E! f* w$ o9 M# A0 z# X0 |PDCx[2] = OSPM is capable of direct access to On* c3 J1 }. ^) B( j. {& @8 j
6 B4 f2 U& l! Y: g" W9 m4 {  D1 y
//
" h  D5 R1 a7 pDemand throttling MSR5 ]1 q$ y& D9 r. @3 x

! d0 M1 w- S  O4 D8 ]0 ?& o//
1 A7 n4 f( H4 e! Q/ q% [6 g8 T( _$ `0 b
If(And(PDC0, 0x0004)) {
& @9 v% Y' m( v& s
. D, O. C. W8 Y+ |  Z& hReturn(Package() {- n1 B& m8 T/ }7 ^8 E% P/ V

! L1 Y5 L5 n7 s, x) M1 T+ E% c( QResourceTemplate(){Register(FFixedHW, 0, 0, 0)},( Q7 |5 R" y/ Y3 b4 r- M" m9 J

, C9 j/ e/ _5 {$ ^5 R9 SResourceTemplate(){Register(FFixedHW, 0, 0, 0)}" m8 W) g9 p1 L4 ^% p7 g
5 {4 i$ G9 |" }+ r: g6 a
})
. W% g6 a* k, J2 V1 u
2 v9 o  n, D& ]5 Q3 d3 h}
) v# O, y0 Y) |7 B# E6 z
) b1 S$ m1 H' P' nReturn(Package() {  f) ]: U9 b: G# s

  C  B6 w3 @$ {4 @& \$ \ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}," p8 c- Y5 {/ I

$ U) c& @2 _  rResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
1 v9 I1 P, j8 V. m+ }6 V9 c2 A; i. O7 r8 V
})
" N( q; `1 M" y0 {
" ]& K+ z8 V- K4 |- Z+ C" g}
' `2 a  a% l6 ?$ g4 g/ V8 {& _5 i5 S' k" u: A# r6 T

4 {( A8 Z9 A- o
# x& e& U' k8 q5 Il
; P& T* j9 H9 I, p
_TSS) Z* E' G2 w+ F

' g6 _, d  A; ^# i% h! OThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:1 N2 r% K$ w) {. t! w& ]
Name (_TSS, Package()
3 t) p4 O% I$ S4 [8 k# s1 S% f{3 A7 g# L$ R! z; e  D  r: a1 Y( _
// Field Name7 K6 T- ]  H6 a( M$ L& N
Field Type
, C* u7 ]* M# P. f
1 W1 k- J# |8 U/ S2 u6 X/ n
/ H& M% U, G; `* |6 N4 T  I! ?5 \$ q0 R- M9 m
Package (), O- g, b$ Y! _) q4 m% p
// Throttle State 0 Definition – T0
1 L0 {; L# A9 o( Y5 y$ |9 d! y  B& K' h* c( o
{
% i, ~% V2 Z- i
. O; A2 k2 `* X% T7 j$ ~* ~- [: x1 X3 S7 T8 ]2 \4 Z' H+ E6 I
FreqPercentageOfMaximum,
1 S$ e1 z3 F% j9 H// DWordConst
( x, I1 j2 G" {# n0 U! d, }3 T% r: Q* Z  ]( q( ~7 X
Power,
6 B1 [! r, u8 t+ [7 q8 j6 `' |* I( j4 m// DWordConst
: @+ F' f. ]* t7 o. X4 @& @7 U
* Q% x& J7 {* CTransitionLatency,( _. D+ a! F" s" d6 ~0 }/ H
// DWordConst
  |! G, c( \& H; v% h0 D) t9 ^* r7 R  T& i
Control,. Q7 S. L  ^/ H
// DWordConst : W" `+ |, M: y. x
% f6 X3 S" d' B: F9 M+ A' Z2 ^6 L
Status" K( e! s% e* r, R# ~
// DWordConst
. R  m, ]! _' e" x8 K},/ [7 h9 C5 T( W6 a3 @" w& G
……
- D& _( {( `/ _! ?7 q' y! U}) F, E* M# F9 C( n

, ~7 d! o+ t* J5 C! |* eExample code 如下所示:
  T6 R$ {, k2 l& s: i/ Y# W+ q$ r6 }5 J8 E, {5 S
Method(_TSS, 0)% x. l3 h0 z/ X2 ^+ c" K

3 J# U, P" z8 A2 f0 J{/ N! Q# ~9 g. X3 _( i8 j3 s( x: u7 c

6 r- h- a3 O6 @! ?1 LPackage(){100, 1000, 0, 0x00, 0},2 i. Z# Z# I& {" b( U8 S
. n, P  l- o9 ?! V7 i* r" u6 R7 k
Package(){ 88,
3 N. W6 N) y0 I/ P875, 0, 0x1E, 0},1 X; B7 W+ d- d
+ ?4 d2 p. J# V5 w9 N8 M- g
Package(){ 75,
& t2 @2 g' r# B+ i" g750, 0, 0x1C, 0},# G& q* }/ Q, n- a" F0 U

. n* d; U- q( v6 v8 h8 nPackage(){ 63,  L9 _7 o: O2 S* }- |/ Q. H' F
625, 0, 0x1A, 0},2 i4 B* T6 E. l" B" b
7 u4 e  ^7 j# _7 i
Package(){ 50,
% c* ~. U; d4 e500, 0, 0x18, 0},1 C  H. i3 ]  t) i: W6 `
, m9 L3 r1 L; q+ m" e" T3 e% B
Package(){ 38,
7 x% a" G8 E" w4 }, u/ D375, 0, 0x16, 0},) j: X! Q# D1 g8 l6 x
$ T; n( v) R/ z1 v3 o
Package(){ 25,
7 I$ ?3 g' N2 ~4 J250, 0, 0x14, 0},* i5 Y; j* B+ P/ l
% ~' D& L/ e1 i6 i6 |
Package(){ 13,
3 n! G4 n0 H2 [+ y( T; y125, 0, 0x12, 0}
" \, N* p% m% t/ |- Y4 \
3 }- z9 u6 Z: c& b5 _* v6 [$ Y5 Q; d}
) F( b9 e/ O4 b; J4 W
. ~. R* [" Q2 N5 B6 C& m! G& Z8 c  H) Q2 B1 O. Z; }* M9 T; T
l
1 e4 W5 \, ?( S) j5 E+ P8 W" p- x8 C1 [
_TPC9 C. ~& c0 ^, s+ b  }

( ~' V- L% p3 ^, O! JThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
- f, a/ l* m9 s# ^7 M$ e 6 V. V% Q/ P: ]+ z( P$ _
l
3 Y6 T$ X: n! F, C
_TSD
; g" |& j: X8 h1 K 1 m% U, ^+ d8 V$ Q3 K" {/ s
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
. c) m- o  h4 z3 ~$ \% _   L5 ~7 G( h+ Q7 t# k( k- l" |% M5 ~  Q/ @
Name (_TSD, Package()
( C4 y* d- j; ?; j1 i8 {/ |8 A! b7 h/ e. E: U8 E5 M
{
2 I% Z1 k4 z; y( o. {
# O& c9 Z3 F- U9 [$ h3 E' x* j+ C0 YPackage(){5, 0, 0, 0xFD, 2}
" V( O0 G: E& J* x0 K// 5 entries, Revision 0, Domain 0, OSPM
( g7 l9 p7 o$ [( i" YCoordinate, 2 Procs
  f& P1 A; Y  Q7 u8 X/ }. g- h3 V0 a6 G# f; E

7 I+ g; K8 N1 @7 I1 H}) // End of _TSD object
1 B# i: k8 K+ y5 G# ~) N- J% M& f# N
  p5 A% X* B: Z. \; SREFF:
/ }3 N4 O' I6 H3 ~% C2 g1.
0 `+ V$ C3 _" jACPI Spec 3.0
% q8 V+ C. [% I, |3 g* n* e2.
$ U' g7 r4 q+ a, l1 [Intel Processor vendor-Specific ACPI1 F4 G7 {6 Z; H: {0 N# v

  }, d2 @2 P, I' n; `* Y 6 s& M" @) h' t' e% r0 m( h
That’s all!
9 h# y$ N; v7 l% M# W% L  ~ # j9 u7 d4 ]* x6 J. Y
Peter! Y6 {8 N& _% ^- d6 g
1 F# F* {4 C  r& e3 L
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 05:39 , Processed in 0.287112 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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