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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
6 B' F0 S7 q! a
1. Overview
+ j* O7 u. V, p- X' M9 b3 m6 V/ u, N) s# k; E1 W! `$ `5 ~3 n
; I9 _( X- [7 M/ N
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
% f, H- h( g- E6 a) _/ W降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看8 V& u! @1 v$ i3 `& n8 n
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。! _; j& m3 l; ~8 @7 @* Q# K
) l& }5 z. F, |: `9 ^! ?* Y
cstate1.jpg

6 y* g" S6 j3 z. [5 u* X
1
1 q% k# q$ ^( {
2. C-state Control0 L% {, b% w* A# a: y/ D

- U9 \& Q& _- w# I' C( J3 D' F1)+ l' q- e& A5 X; i4 {2 D
Detect & Enable C-state7 c, x' Y7 b  q( u

8 t  F$ O- E+ b8 H7 }: ?' W; yBIOS可以通过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的支持。
1 i; a! ]* {4 @- `6 n% g6 J0 p# J# ]6 e8 M* o+ U' c+ a
2)
+ T* d0 W2 Z! v+ lC-state Basic Configuration6 U8 ^+ l" Y, X6 @, ]
通常情况下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)。
& X/ g' t4 _. ?/ x+ N
, {+ ~5 D3 ~! f, X5 T4 R9 P3)
, l* I  ?  C' d9 sACPI Structure For C-state
  i4 z- o7 a9 I) Q  A8 J& j2 d: ~; p( r
l
& z& f; z3 s% Q. s* V
_OSC & _PDC& s* j5 t1 `. h% ?
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
! e/ z; Q/ b- `* yl
; u$ Q7 S# O0 K
_CST
0 G# b/ S0 d! v7 C3 s1 X. q_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:9 U. B/ \. @  D$ N; C
CSTPackage : Package ( Count ,$ p, D4 J% w& q) z& Q* j- a: c
CState ,…,! Z  o! L% B! `4 [2 @5 Z
CState ), ~$ R7 m: H! n) i& c. T( J
其中Count表示所支持的C-state的个数: H/ `2 X3 e7 A$ U+ S
CState: Package ( Register ,7 r, z  d: E/ {& v
Type ," b, F9 x) m; _/ ^0 `
Latency ,
; ?9 \% E3 w/ f0 I3 }: kPower ), Q% \6 E  k% Q, c6 S2 D# O4 F
9 W, e6 i* y/ i" i4 ]
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
9 B/ a3 g0 S% i  G0 @5 B  }+ }# e1 I( _6 E. B1 ?( `7 T9 O/ n
Name(_CST, Package()
/ R6 z0 \+ W  K2 M8 H) M$ A
2 r, g1 ?; o; F8 C# |6 \9 U
{ 4 M6 v1 s/ O/ |- R
4,! T- _9 @/ ^' T, l5 {7 U1 A
// There are four C-states defined here with three semantics

0 A% [+ @8 W- c: H  a* h# t' @
" u% t1 k/ G, L" L# R// The third and fourth C-states defined have the same C3 entry semantics" X8 p( w# b7 [: X7 X
2 p% L6 ], X* T) G' }2 V9 x* B
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) _+ x! n" O) z
1,$ I, O0 O- Z. n; J+ c
20, 1000},
( Z" {1 R  ]" p7 R, p* e# a
. F* H* _4 i+ S# S" j9 j
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
& u* m' U0 l3 L$ M0 M! y40,
3 s. J" p0 G6 f5 C. {750},
; P7 @# D( y4 J) W
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,* w& E& o. ?0 t. j
60,
7 x, \3 s6 v6 f/ F0 A+ W500},

% |; U1 z0 i! q( B* `Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
8 L4 V9 z: G+ P250}$ ?% h& c" S$ A. M
/ K8 R% z* e5 {+ h6 A
})
% n" ]# W/ I+ P+ ]" h9 D
7 h. c/ b& _" K7 I$ Q9 Nl
6 C" }( w2 B* ^2 t: t4 `2 ?
_CSD
( f$ T" i  C- h) B' B6 m
  w3 _, r" e2 C; x) ~, H" VC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。0 F8 N8 L1 U" D- B: B7 n: b

4 U. l/ W  G/ I5 n1 Y' g6 l* R  l8 Y! @$ g5 U
0 t# ]( a9 ~9 |$ b2 d. z4 z5 s3 b
: |% H2 p+ q( D  P/ N$ `: s
3. P_LVL VS FFH
1 X$ r9 b- [% {. x0 |( H5 x" a) b  m7 I, B6 U
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
/ W) W6 d! ~, L& n' k# _7 H# M1 }( @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所示:) |0 i' ]) \3 l& H9 F  Y
& q* m) F; c5 u8 o+ a
gas2.jpg

7 i  f3 s# \2 i1 J
2
- p. x% S* d( d# Z
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的一个例子:" b# i6 k. [+ {: W4 A+ R% [+ Z* G
Name(_CST, Package()
5 z8 Z+ ?: d& y
3 a1 S8 m5 t  I2 w$ V
{
) T4 ]3 c" D+ K* S# D/ t2,  B8 w1 g, P. p. `" H
// There are four C-states defined here with three semantics

# y7 J2 \% A2 @8 o, y1 s* n
% V: C( m+ l0 n* t// The third and fourth C-states defined have the same C3 entry semantics8 z1 o4 n+ I, Y* }
' F( T- I- |* u7 e% W
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},  C# U. f  o; L3 x. i# d
0x01,
  u8 I* ~, ~( |0 E9 ?2 C7 d1 ~0x03, 0x000003e8},
. g$ ?- T8 _1 S7 ^2 ^
- b! U; w9 \8 \2 B/ w3 X
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
" }) R- Y- j" V# Q0x01,; k, T' B* Y3 ^8 t7 Q
0xf5, 0x0000015e}

! g% s. c; I) Y})
6 D& f; A" h* V& D# t: I4 c) a' z3 b) s" O
% [' U/ D( }9 [" L! n
REFF:' Z. z# N9 H) @5 R0 D4 o7 T
1.
. n8 T4 K% V$ ~ACPI Spec 3.0
. }" O* Y$ ~: u" Y" W% X2.
$ M1 [4 N0 q0 q, ZIntel Processor vendor-Specific ACPI. l, G: G& g; V! b; W: p1 h% }

# V( A$ \0 h) L' x( y8 \. d/ W( e6 _$ P8 G, Q5 Y, H7 H
That’s all!( C- A$ F1 @% s7 r5 g' r

3 u% W1 K# h  @, F  CPeter; x" r; X- M& O# q# B6 T
# z$ t8 b7 J% E4 U' ]4 E0 X
2010/9/201 ?5 K) t0 _9 E& M
6 m/ k! ^0 J, P/ A0 |$ O. x
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
/ T3 [4 w* ?7 F/ E* h6 q$ {
7 j  I3 k2 c; Y. g8 P" O4 Q: h$ \CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST$ Z; g/ y. I& S8 N  ^
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。( O( M6 W) n( W8 y  D, g
, S/ l/ h3 f1 g0 e
2. P-state Control; |: q, E9 V" s1 o' H* U3 Y) _$ {# c

% |  e8 `. D! c. o8 m1)
0 X& o* j7 M) H. wDetect & Enable P-state7 B  Z4 m) }( ~& c& h6 h& \0 l

8 W; _  h0 c3 D# h3 TBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
' J% N+ f5 [, Y. ?5 H+ ]
1 h5 z; c( Z8 `3 ]  ~3 h! E8 s* J2)
2 A& r. K  Q6 n0 N# x0 YSupported P-states) x- _9 Y' i. B0 Y
9 B: ?0 |( M) r" Q" w+ X
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
# @5 v: _& e! S& ~
& R8 Q9 Q# W! f# R/ A, zMinRatio = PLATFORM_INFO
8 y( \7 Y$ k( {$ sMaxRatio = PLATFORM_INFO. v* @" s5 f  A+ y  k7 W
RatioStepSize = 0x01
3 \/ L' }) k3 t3 l: tNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
* m, j% }; K/ }' x  ^$ W3 u + f9 z4 C9 r9 I' z9 d0 d- V6 }
If(NumStates > 0x10)
* T& B  \2 E* d" @{" @) Y/ W( [& @- e! z5 i# k
RatioStepSize += 1
5 Q  L* A1 k3 P) B( D3 K5 S) m4 }0 tNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1% ?* Q! O* M8 m+ Q  e# C
}
1 J8 ]1 b, Y! j1 D7 h ( a; Q' h( g3 D: M4 Q# z. t
3)
2 p5 [( H# c9 g: Z5 nTurbo Mode
5 m9 G( j5 d  C3 m. R5 Q : ~3 Z! s: Q4 N0 W
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, c4 l7 P; A+ u- |0 Z7 @
; v# j8 O9 P+ [7 w7 |# M! w7 d
4)4 U1 w4 b* a- c1 H8 M( r5 L8 w% b6 B
Over Clock6 h: j' {' L/ x6 N

7 \5 P" x2 ?7 s某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
. n& c6 q$ H) `9 }. K . s1 P* {9 C  }# l- R0 J% K
5)
" ]0 b4 @) ^; A/ Q! q+ ^. y! ?3 ZACPI Structure For P-state  d- s, d, v3 J/ i' O! q
; M+ t( M$ x; B
l
3 Z. e' O( Z+ l
_OSC & _PDC
4 J( w5 @$ `% F/ }: C ! |) B; J7 d4 K# _3 h! {
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures9 n: l# g6 a4 `+ P# n
( L7 m9 V9 ~; E+ H, S
l
, b5 m' U; I& P5 k. Y3 f
_PSS- \' Y2 k  L0 [! P* t& ^
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
. ^# L. R( \8 X, m, U, a, w5 K并且通过一个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做比较
. J4 `+ z8 l. d) O( I, M% U$ s- n以确定P-state切换是否已经完成。
# r; y. f0 G1 Q/ v3 p; k
3 B8 [1 ]: _" UName (_PSS, Package() ' n' [  ]6 h$ U7 F$ p" t5 O/ v
{  N  G) i3 d- l0 `( O3 X& s
// Field Name
! e7 y+ L8 `. X1 u6 W) ^. |Field Type + b6 `3 \. c2 m# a2 B6 R" F0 \

, s" C" o$ `& O) W. \' P( l
6 i- D% J# M5 l5 S$ I8 k$ \
  z+ a; x& ]4 K* X2 [Package ()7 T5 {) o2 ^/ T! I
// Performance State 0 Definition – P0 . c$ p+ \  {4 p4 I

4 l; E; c) ]6 W+ o{
- g' X4 t! c# S: R4 r  @# m2 ~, u9 [0 D0 \4 i6 c' B

1 X: i- u) i) O: [' RCoreFreq,
  r2 H' d& @8 g% ], a5 G// DWordConst : z) i( A  m* r8 Z- U1 g
! w$ B# P; X- m! a" X
# N) o, g: ~) z% r( W/ ~3 m% i( d7 p
Power,
2 J3 T) w: J2 v* o+ A" d, l// DWordConst
) ]6 o' [/ t. z1 F/ Q7 x* i, |: F, q) W: `1 @: e9 K0 x% n
TransitionLatency,# k' W9 h" m. n5 E/ y9 j  B
// DWordConst " ~/ y& k* Y& g# F, z+ C( H
  x2 M3 P* l" t" q
BusMasterLatency,3 ^- K; ]- m* D
// DWordConst
0 v% M+ A1 p$ [, x
$ C$ p8 z& @2 \7 {Control,
" q" d  [$ g- s% H/ L/ ^// DWordConst 1 \- v" p! q; {
# y2 {( E2 q7 t4 B5 l
Status6 U) O$ A$ q8 S5 F0 P
5 ?  \+ p, X' ?( N7 V7 S
// DWordConst ' X& M0 m) p# y

% y5 V7 p& i' i$ p},
" u1 a* N+ v) H9 E& p% h
# |, }0 I2 x0 Z9 b! ^. ' B5 s  C3 Q& d% S% P# G
6 Y) C! ~! B& W- ~6 |
. ( Z0 v; M3 j; k9 K

' v1 b; p+ n4 ~. 1 _$ P% T; g. _3 e. Y; N" j  d
}) // End of _PSS object) i9 D0 \8 o  e) y6 w* P
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
; `/ z# _  S0 a3 N9 B" I; n% Z
+ S& _5 U6 C0 H" h6 v5 m% w# HName (_PSS, Package()
1 r7 B7 j6 ?8 m8 V6 V, s- Z2 u' L9 {4 e( X" ~9 |. ~+ r3 ]
{   L* v, ~) w  ?7 u" U) V8 K9 b4 q0 F

2 n/ P/ ]0 T6 y0 p9 S/ sPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
" q" `" \+ ?/ z* J7 O
) s0 m2 }4 ^, i  uPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 9 ]) G) P% y' k  v8 F8 q
: C( d- H% ^" n% |' V
Package(){1400, 8200,0 \; T8 x% y6 l8 E# ]
10, 10, 0x000E, 0x000E}$ g. J7 ~& ]+ H# K* j- R
// Performance State two (P2)+ M6 h' [+ t) O  ^* ^
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // / r5 {4 o5 s2 a- s/ ^3 p
Performance State one (P3)
0 u3 R3 B2 I  a' T% V+ `  r. W/ @1 _
  H$ `: d" g! j+ QPackage(){1200, 8200,) C$ R  u8 ^( l- z+ G' `5 T; R
10, 10, 0x000C, 0x000C}
  H5 P+ A( {" W! U  w+ O$ ]) |" b% U// Performance State two (P4)9 @& T/ q$ u$ |1 B0 U$ K/ H8 L
3 t8 _# E4 |" {, N
}) // End of _PSS object9 o  b6 n! H6 o5 Q

3 U1 C6 [- S: _( {1 A  c3 H! Y另外当该平台支持Turbo Mode P0将会reportTurbo Mode/ p- w. f" B4 U

1 g9 K& E  z( [& Tl
2 T& D; b4 a) o# t
_PCT
# Q9 ]0 {  E8 m. a+ F' A: E5 F " h  i! i$ |# Z: j( _- @
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的方式来进行。
0 L. I% Q& s4 ?5 V 7 h7 e1 f: M8 B- c* n  U7 Q
Name(_PCT, Package ()- p* N% ~% M4 V5 I! b7 x5 _
// Performance Control object
: i( u; k. n- x& y$ g3 `, S+ E$ E3 F- A- {' J; Y" ]! E9 y
{
6 d0 r1 V; x( @% u9 [$ Z! V  j; h7 U2 c& F/ c
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
  o& d. s6 x, d0 w// PERF_CTRL - y8 v! A# X4 ]+ X. j/ \. _/ `$ i, Q
  ]! s/ {. @/ |' l: {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
9 U! D' [: R$ h6 X+ f# r6 X- `// PERF_STATUS & k& H8 v3 c# X! x
1 E1 s$ R5 M" e2 }% V. }' {7 d
}) // End of _PCT object* I8 q' Y  d& B9 S! M; {! |
) k* |/ _) Z: t5 z- p
l& R0 m9 w9 }2 e  X. o! `
_PPC
7 q( L9 l7 _2 g: p3 u
( z0 p3 ?5 r7 c  ~3 \$ kPerformance 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
# Q/ L, i2 U. ~3 D4 y# U& L: `0 n
! G  B% k! e; W& ?/ R5 C6 h* VMethod (_PPC, 0)( m* ~+ l1 `2 W5 ]# y1 o
// Performance Present Capabilities method # r2 N0 B9 R2 p* g0 n

+ @% Y) e. C/ @7 `' |- Z* s5 R{
. D8 m+ `* e7 v) A+ w4 I- a% _5 q- f
If (\_SB.DOCK)
4 \  b+ v4 _4 }# j/ B" ]8 a8 U/ }. P$ z! {" u
{ & T/ f7 v1 E0 H. i1 ]8 }
# {" }: ?; O1 q) f* ?2 h
Return(0) // All _PSS states available
4 p$ {5 U9 m7 L1 j  c
9 ~% L5 k6 _- A& c6 e0 e( }, A
) s0 K0 B; V: C. w} * f. p& N- g& Y

% O& U- O1 r3 Y: \5 O) B- IIf (\_SB.AC)
) g1 d$ ~8 R9 a7 [) w! h5 K, d7 B  z& }5 T# D9 w! D' ]2 q, I
{
& B1 D' o/ {8 @. ~% q8 C5 A1 |+ Q$ W! b+ m  m+ U3 C0 |. S
Return(1)
# \; R5 a0 J/ i( |4 o) {9 b// States 1 and 2 available
4 q0 _2 ^. o# o& r  w8 R3 f0 l4 s! d) l9 V2 r# Y
} # H/ m5 @0 ?* K& }9 `: U

1 a3 @8 f  J$ W7 v5 HElse
& e* `0 L2 w! ]3 e' J# X/ R: o; X8 Y) c" K/ _' ?  W* Q' ~& _
{
7 D( X0 h1 o, l1 o# R/ t( K" J* O1 k& p5 T* u3 j
Return(2)
! Z0 P7 O& Z# R$ Q// State 2 available! F3 X/ m; ?! _
: ~( E0 b1 @+ U3 d3 D4 w
} 0 `! a, a8 {3 `! A8 F

% w3 g7 X# _4 S( @+ \) T4 h- A! Q} // End of _PPC method
9 ~5 |  T2 \/ l6 B  V5 }9 R7 x- o
$ T6 U) D5 g4 L% q) w3 ?- Sl
  Z* B4 _* T) _$ r
_PSD
3 B8 k* [9 b, A) T# q8 X
* B0 X4 I1 u1 X1 ^& O$ iP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
( Q+ d2 [" `6 k' N6 N! P* D8 [$ }! X
; Y& J" R) K- ~  E9 O! ?8 YREFF:0 \' S# o- S5 N& Z/ L4 L' G/ y; B
1.7 j* k: _; |; _& y
ACPI Spec 3.0
. \$ m8 i, e5 c! i& x7 w2 O2.
5 s, I1 ?: n: v, i6 U7 j0 `Intel Processor vendor-Specific ACPI+ r- M4 j/ n4 \: D$ K6 J% m
9 {  |7 h3 S1 j, H3 `2 M) I/ \

! u3 B" Y9 l$ [: i- x% }0 oThat’s all!
' A$ H/ s) e  K! f% Q
9 o! R# C8 H% S' uPeter$ b) R& M/ I+ G- Z% p6 t. o
; @2 a$ J$ k6 S9 C
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview5 j- P) K& o! l: t0 U! \

- u; `# E. M$ O# d1 X$ ^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工作时间的占空比)的方式
$ V9 w$ n4 ~- F, z$ W,影响系统的功耗和温度。
5 k7 i) v5 f2 k
, w" L* M' w) R0 v5 F2. T-state Control
' O$ z. t) Q- F4 K1 w3 i& _
5 i; ]+ y$ q( @9 K; J$ v* C1)% ~# a: [0 ?" [/ V7 [3 k
MSR Based Control
. S+ S$ B" y2 C  C! v; Z * T4 N. w) N# o/ V
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
8 j7 o5 X. S0 q9 S3 u, M' N   R9 m1 g2 l" Q4 c
2)
" V  P! ^1 H0 o; N4 c  w0 pI/O Based Control
8 ~2 L0 O1 U) w7 u4 q3 W % g0 x- K$ v/ b, j4 c8 ]
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
/ {* i1 W; V4 r9 {; U8 Z 2 b% S# S: B! j/ Y+ s) v' P
3). j3 L9 z: {6 R+ R4 l7 i# W
ACPI Structure For P-state
8 K7 F+ ?' m/ E+ y# Nl
: |3 f* B8 z" w$ l5 O. M
_PTC
. j: `# P5 o" H; @+ T: P4 m   U8 u- y! ]3 h7 c# j+ V
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:9 p: c+ b! F+ H

$ v/ _! H* ~- ]4 L$ mName (_PTC, Package()
1 J2 R7 Q% L% D5 `9 A: N9 b{
& M* ]( u8 N: h. E0 o7 u0 f& v" H% I3 q; p" H# J" R
ResourceTemplate(){Throttling_Control_Register},
1 z6 ?5 |3 u( q4 R4 Y+ F//Generic Register Descriptor
1 q# q' s9 ^; I: ~$ H1 A& h
" A4 x4 c: h; p/ G) @5 AResourceTemplate(){Throttling_Status_Register}8 q' U2 B7 S& A$ ?
//Generic Register Descriptor
( E, ^3 u5 z+ x+ L& @}) // End of _PTC
% D. K3 j: g  f- `1 E( c) b
9 u! u+ k! }4 _0 \下述是一个sample code
, ^4 R  j3 \6 ~" R
. c4 X, E  G2 e6 d6 O5 d. X  T3 S2 L! H0 Q' h
//
* P0 M6 D* V; N7 `( A  K% x' w) z% y" ~# z6 j. v# p
// T-State Control/Status interface
$ h; a$ m; S: c8 N5 I4 ?. @: d! e+ s
//# t- r% ]2 Q4 z. x

5 e: e# @, E" c: w$ `$ XMethod(_PTC, 0)1 y; J$ k; C  Y4 k! Q

2 M4 Z' e$ Y8 r) g/ Z{
$ ^& t9 }) I) X$ P2 n% ?
3 c3 b4 S. y5 F% F/// G3 L% P+ ]+ Q* z& j% }/ d) {9 E
5 k) a  n8 I# l( J
// IF OSPM is capable of direct access to MSR$ H+ l4 W- i4 z$ E
: f$ p" j$ z; {  U+ q5 _$ |+ f
//
+ @# K* Q: @3 ^: @Report MSR interface
, T$ c: q+ {+ s& {, ]7 n& G' I, E- r& k; v
// ELSE
& v2 _' w( j) A( [% `: W* {  L, A) M1 }0 Y% a3 q* f0 g5 G6 {0 {( y
//8 b5 ?! U1 |) {, s0 g. A" S3 W
Report I/O interface
5 F% \6 V6 o2 C( z
; |3 Y$ Z0 C1 E  \//$ @% y% K$ f' W! d

; z( w. m# h& h; c//( z; D( _  h2 `  u. \( Q. t
PDCx[2] = OSPM is capable of direct access to On
% n- c# o  V$ ~  D* R& ~3 @# b$ }( c
//
( a" o7 u' v! L! b' V1 K9 ?3 ^" d% GDemand throttling MSR
; Y" \7 w. P+ x6 o, n  J$ {/ x4 f+ D# g6 v8 L
//
  T0 {& T% D" z3 y: E3 s5 v2 E4 M7 E* W
If(And(PDC0, 0x0004)) {0 D2 G( l3 o: A8 }) [
* d1 a% d' d/ ]& j
Return(Package() {
* N" A6 C5 j- b% O1 J1 c# \8 e$ w5 v1 e  o* O1 j" `8 {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 R& I5 Y1 k1 m6 S
0 ^/ n! L9 U2 P4 z1 v& V/ {  c) P; J
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}( `) Q: m; b8 @6 d* i* d1 W

% }; l' m7 l8 p3 [. K& c2 p})
, S+ r: W  a: a. I" \
: {) c4 J0 R9 o}
- K* K+ t/ x  F8 w5 O
3 i6 J5 D9 @" o" |Return(Package() {( e' F: E+ F) R; S3 H- f% ]

7 X0 [9 R5 F& s$ x' E4 P) kResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
- ~6 c1 \1 f0 w1 g& t5 z4 s' R- d6 Q6 }- f3 C+ J0 t( |
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}" m. k6 M0 Z6 z; A& r6 T

+ f* \* c5 ?3 v})
; a4 U! Q2 h5 I' Z1 p. g% Y( q7 e9 [6 N4 Q9 t$ `
}
" J! `. |. R. T8 _0 K- @9 ^! ]9 U( X3 W3 ~+ C; t- X) X6 ~) S1 i

( Y3 t- Z' J! H6 K9 G" O8 S; X0 M! u+ F; H1 p
l3 m# J5 S' L, E
_TSS5 H  k4 ^; _" h( W: R0 P9 R( V4 y
, p/ O3 W! g% v7 ?2 ]2 Y
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:* ~! S' M" ~; a1 I% z$ V
Name (_TSS, Package() ; z1 s% Q7 E" }  x* i4 E5 R4 {
{
  D6 f! Y4 [9 c, d# U9 s// Field Name- F6 I3 z# `! P; Z7 M  O: H
Field Type
2 A7 v5 \  ?2 H
/ y4 v4 Z$ `$ S1 d3 C, I2 }9 [9 c7 l- }

/ D' ^6 Y& j- A' p& N  p( \$ }Package ()
3 r" k' ]& R  b1 Z1 P% b( z$ b// Throttle State 0 Definition – T0
- d: x2 u' t7 ?2 e$ G, H* j6 i( _2 ~. ]# l% K, [- l
{
5 M: ~3 W# A0 p! u8 t8 u
6 i; V  H9 C9 o( I6 H
& {: p1 N/ L6 n3 p3 ?FreqPercentageOfMaximum,9 h) ]' V# d$ u3 }+ @4 I1 O
// DWordConst
  o8 T1 n  \7 o4 d3 u% r& a, v; a3 g" [8 X4 S% T4 ]
Power,/ \3 x8 w' x1 n% Y
// DWordConst 9 m- I3 X5 d) j) @

/ U( M- B4 {2 j- f2 _TransitionLatency,  v" }5 R& _, [) v
// DWordConst
  d; I" m# v* j4 i; e1 l+ W
3 I* {+ D7 B( z) ~3 AControl,4 e/ R, b' C3 H6 \
// DWordConst 0 o  `6 N. _+ J2 e

7 e$ k* c: o+ RStatus
2 t. o: w- Z3 C  I; S% i// DWordConst
' D- s( K* _7 t; |" [) A5 I},  ~7 C4 i' e- |: `  Z# l
……. F( S/ h6 `. k2 \6 i) B
}
+ L" Q* X5 W' [, ?* G$ V! K2 f& ^! T5 m3 P
Example code 如下所示:# S/ U0 o) v# |7 A' ]
7 W5 `9 h+ A3 v. n* d& G
Method(_TSS, 0)
$ S6 N" X$ H/ [" b
9 A" r! \, ~; E& T{! \1 K# E7 q8 h8 S6 L

5 x+ `3 E0 @  Z: Z* zPackage(){100, 1000, 0, 0x00, 0},
3 Z- h4 S4 |& U) P+ P5 N" N% H* V$ M% D5 t5 Q
Package(){ 88,$ R6 z  B9 ^2 _+ J; l
875, 0, 0x1E, 0},0 L  [6 H8 O- M  f
' \$ s  X% k- e8 d2 ^' h2 j
Package(){ 75,
4 P: ^7 d, u3 A$ d" N2 a0 \750, 0, 0x1C, 0},7 M- `7 J/ ~( H$ C0 R5 `

- k( E, a& Q  D( {Package(){ 63,6 `2 H7 g5 T6 n) K& R# ]& \0 A+ K- ]
625, 0, 0x1A, 0},
$ ]3 V0 ~$ o. C. q9 d$ }" d4 n  ^3 K+ h( V6 F/ m
Package(){ 50,
; j8 s' b' P& F3 z- D! x" w500, 0, 0x18, 0},
/ ?, i1 x3 @7 D$ N  s# ~3 N( s! G
9 E! j4 l! ~. Z* E2 ^Package(){ 38,! m) \. A: D4 W; N: ~4 v: j
375, 0, 0x16, 0},1 V0 A& |& O& y% C3 _: I) c
+ {2 W& V6 [$ |7 o9 V
Package(){ 25,( p5 X9 R; B8 H" g# n: V% ?1 E
250, 0, 0x14, 0},
# w) m8 q; O: W. J2 k+ n5 B! v8 J! F
Package(){ 13,
* Z- `& C5 {/ |! s$ j125, 0, 0x12, 0}- j* f3 f8 e1 |& C4 }
3 G6 r* y% J+ m; b( E
}
: b# Y4 G2 k% _( c/ v9 v2 i% a
8 b3 y/ G; A# I* O
4 ~- `, F0 I! ~! X1 ?7 S" M5 [l
( p3 v5 V/ V. ^: X  I* h
_TPC$ b1 y3 ]( p4 D0 X2 k

6 f& ]3 C/ N8 ~3 L. s! ?Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC& t$ O* C% X+ P" v# k  i3 H) Y

/ P) R- L4 o7 L8 ^l' Y* a  c- ^6 h- A% w, b, w  K
_TSD- r( _" Y( e; b: G0 ~3 i
8 P- z; n, r8 c, H1 ]
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
  K3 ?, |% B# k/ k  z! w! p ( R* z9 B" o2 G3 B" c! K
Name (_TSD, Package() 8 o% h) X3 Q# Y4 _

) Z% p9 d2 x* J6 E7 m* r{
, R5 u3 E0 J1 _' ?- W6 h! ]+ n
9 j$ X" J, p- w. G: d4 M2 @" ]Package(){5, 0, 0, 0xFD, 2}* ~4 q) K  v, N
// 5 entries, Revision 0, Domain 0, OSPM
2 L0 w( Y' b" n3 V: XCoordinate, 2 Procs ) V* x  h5 j3 x1 ]: w2 p5 s/ r$ Q( y

( W$ K& H$ q* n* b/ O2 p& Z! b; [& U. v
}) // End of _TSD object
& @1 {' ?- e9 a2 h3 j7 C3 U% z 1 z6 P9 n3 P. y' m7 x  {6 {( E
REFF:8 b4 t- m& v# L
1.8 b; O# q% W' I: R2 b8 H
ACPI Spec 3.0* M: `6 p5 {: U" p3 h& ]. X  Q
2.
7 i, x- L5 D$ R) e. D- SIntel Processor vendor-Specific ACPI" b; h; Q( |) Z
6 Z: i& ^2 f$ v' V- W$ ^
4 t- z; a! c1 _; S* }
That’s all!
- u) W! S3 @- g6 ^1 p
3 j' c- z$ k$ V- OPeter0 K- R5 r$ W5 i

* Z5 `+ U! R7 Y: W" [2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 20:32 , Processed in 0.081130 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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