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

CPU Power States

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

* m; N, y" H/ n, L8 K8 }! e1. Overview
$ W1 M& q" V$ p9 v5 D, L6 p6 |# ~0 W% l" q* Q8 y

, a9 p: G7 ?/ q3 n$ l4 x" @  q" t: h4 ]; uC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
8 b  D( Q& \, I0 w. a. F% N1 J降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
7 W( j3 c* S* t) S4 J, F- z比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。4 S5 g/ j6 C5 l
3 {2 m+ u! a# ?6 w+ ~0 `
cstate1.jpg

: [2 ^( v0 h' ]! o' }! T" `7 g
1

6 j9 z& d3 d: m7 E2. C-state Control+ i1 d% l# X& Y6 E

+ Q- o2 t: f- d0 ?  ^1)
4 G2 {* L1 O& e1 K& ^$ F% s: jDetect & Enable C-state
' m  p$ e; R- l( W7 [  L: |3 v' O5 T" s! `3 X. z8 ^
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 N: s9 G0 a8 }8 c. V# q

! d. O4 @. M7 b! m2)
/ k  f+ U7 v$ |" L% iC-state Basic Configuration
/ v( s( I, f: D# n5 H9 n: \; V通常情况下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)。
' a& H- w4 V! n: o" N2 x
. Z5 y$ K7 N3 h. S* g( C$ O3)
5 L  H; W# b: @ACPI Structure For C-state
- @$ e1 A1 d1 @! k; ^. c5 |
+ L5 B- y& V1 h, e1 I( d) B8 I# ^l
3 J! l) F4 J, H3 p* V9 @
_OSC & _PDC
" h- T( V% l6 z' ^$ O9 i_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures3 R, h2 ?7 S2 G% y6 e+ P5 U  G
l: i* {/ E( C/ X% L% k
_CST
# j; u- y( x) b' K7 Q8 s_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:3 H8 _' G% i3 g5 ]* T, U7 `
CSTPackage : Package ( Count ,0 \$ y2 G3 k9 s, U9 f& \( B/ V" t
CState ,…,
- A2 c4 _4 m+ j& {6 NCState )
* Y  j0 d  I+ {* K' j  o其中Count表示所支持的C-state的个数
7 _4 f. c1 b0 `, J0 ?# M6 S( VCState: Package ( Register ,
* j! z" u8 H5 \) `" x* v: O3 N# QType ,4 D3 @3 {2 u0 M+ Y" m. r
Latency ,
: x' H6 D: D9 i# t! H/ [, C0 DPower )
% W* Q. T2 ?# ?% I3 ?$ N+ Y5 s7 e) J- ~9 o8 i! `3 L
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
" n/ l; u' B( F: v1 w
* [& D% l% s4 X' k; v. PName(_CST, Package()- E: t) b' A! k5 G8 X2 ?

) |" n& C0 f8 P9 L' I5 i+ H{ 8 W/ n1 n4 C3 F
4,7 q, @4 O" d$ B  G4 Y( u
// There are four C-states defined here with three semantics

( x8 G2 w5 q) M$ c
$ ~2 f1 t0 U' m. Y' t// The third and fourth C-states defined have the same C3 entry semantics7 ?9 I2 W4 Z/ P0 k5 d. o* Y3 C
" `8 l1 D6 D1 V% U) ]* C; U
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
5 k+ k4 l3 e, x: Y1,: x# S- d& b- s+ F/ U' i/ ?6 h: y4 J
20, 1000},- |7 B2 \+ f8 ]1 k
, K7 `6 d# E. W- ]. a  C2 h) k/ s( y
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
; }1 U& ~: {6 U! P9 c  A$ i5 F. [40,
* l. q+ _5 m/ _+ \/ a* }+ u750},

/ Z& Y4 z. }% Z" W4 N  ?, ~Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
  P* y+ Y! v  U60,, o: u7 o" f# V2 S
500},
8 n; M1 Y+ k7 n7 j* J) c
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
: @! R' m) _) U& `; A+ s4 W250}
/ I* h$ W# F: H" D) R3 \" b. c

/ ^/ a* m) y2 Y! z) A6 ]) o% r}) ; m0 |  _, X( j0 S' m+ a

" \. s, U2 y5 K) x5 Z2 kl. w2 _0 I+ R; P) ?  G' c
_CSD
  Z8 I5 \- C# d: S
5 v, Z" o6 s' nC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
& o! e6 l+ F; `! W# @! B' F, ~( ?; B+ G: V* k
9 t/ y" \- Q7 M( b, L, c

. \/ d5 l$ K. q9 b8 O8 b
- F& @* R, I% h& `( n6 c4 j4 o, H& @3. P_LVL VS FFH( r. L, L7 i4 R9 s/ f. r1 a
/ B% p( f5 X2 D
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2), V3 I3 X1 w% j, F
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所示:! R3 L1 y* w6 r/ W5 m* Q

  S& ~  d3 O" Y: ]
gas2.jpg
  c- C5 }/ M/ g# f5 a" i. H
2
; k) M) c( Z; y1 {0 F3 N
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的一个例子:; W0 k* M0 H% H5 r! [
Name(_CST, Package()
' Q) q7 n; T6 X: q
% r! G, H) R  i( T- ~3 _
{
4 b$ n$ w% h+ h% \) Y2,
1 r0 B0 p$ o: T1 f// There are four C-states defined here with three semantics
  o3 u7 x" J. X) O) `* _
) g  D* U3 j. r! b" ^6 l* O! L4 ?
// The third and fourth C-states defined have the same C3 entry semantics4 @& p$ c7 ^! F" |2 H6 h$ O3 ]+ E

# B# U* n+ V2 UPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
3 d- ^. f2 u1 k( Z0x01,5 g# r6 N. I/ y/ [
0x03, 0x000003e8},
- ^- e3 e" k* O. b
6 ?( p+ a( e+ {' @! E7 _
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},9 J% x7 K8 x, v$ d0 ]
0x01,
  b* k8 Y$ ~( h" Z4 R0xf5, 0x0000015e}
+ }- Y2 _# Y4 K: f1 X8 c
})
# ^, |! y5 ~% l5 O" v; M& u) I6 `" H7 q. p
2 ^8 t5 }) O" T2 x7 m$ L$ K; A
REFF:5 Z% t/ B9 A) e* Q* ~) z7 a% Z
1.
, T; _6 G( a" k- WACPI Spec 3.0
" v; }, a( t' p& v2.
2 W% R8 W- f; ]" cIntel Processor vendor-Specific ACPI
8 m  E- m8 \/ C6 U, g" q4 Q  j4 E8 i  e

- Q; l$ x" L8 u1 l3 ?& ~$ ^That’s all!" W' n6 _+ c( F6 L0 C$ m

* \7 \$ d$ M/ u9 m% iPeter
- O. z  s$ T/ ~6 x( \7 N  L4 f/ V7 {. n% M) k
2010/9/20' g8 V' X9 C7 \& ^! a

) R2 h% u0 d! C- y5 ^[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview+ ]: f$ Z/ P. z' e7 v3 d# q7 ^

9 m6 R" ?4 B" |" i1 q2 K% dCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST4 ]5 M! _: M4 m
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
$ g4 v+ J. @" Y& D3 {& }+ J$ q
# W' s# y; p$ n! ]' O% s3 W/ V1 I2. P-state Control. y1 b2 Z8 s* q. m0 H3 c
; P. H, F  S8 _7 d' Y5 q
1)
1 d: b! M2 u& N: d$ f4 a( K& RDetect & Enable P-state& p2 M' n/ T! ?  l
1 g0 \% Z3 A3 N1 `( ^; T% Q) a% v
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state" U- R7 V( s1 ?3 i
5 _: B- {( i( K; R
2)" Z* j% F4 ?9 \+ n& m
Supported P-states( g" H: A4 o/ ?

9 h4 n" J8 L# v$ DBIOS 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
! O+ d, E# a0 M/ X+ T2 J
& v* p% X) W" @2 |& Q8 ?8 @MinRatio = PLATFORM_INFO
' ^% {# U/ \4 ^# n0 |9 MMaxRatio = PLATFORM_INFO
; }% x# Q+ B3 Z8 zRatioStepSize = 0x01
$ a- Z2 Z- m9 @  ENumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
3 D2 [" U  t+ T8 [6 m' Z9 s 6 J, U5 t, D8 g. M# D3 N3 W' `$ ^9 [0 ]  E
If(NumStates > 0x10)
4 G" Q9 I) l/ r( ?{1 q9 n& @/ A5 K* C) D7 t& q6 x& Y
RatioStepSize += 1& p* Y0 U/ j+ h, d1 M
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 16 n; I& M4 h- U6 o# i0 h1 C5 w4 o
}
: D, S/ y: L) s$ G; `2 t ! u/ n8 t/ o& K3 g% n
3)
$ I9 ^( _9 m( s9 W( [, ^9 Z- RTurbo Mode
  O6 d( a3 O5 c# `* \ 2 i3 _% L: r$ v, c) \
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
) c, Z1 o0 J. F& c9 M2 Y' J
" c8 q2 o, x9 N8 ]1 q; c4)
. r, \5 Q# m) I8 uOver Clock
0 H# l/ A5 x! A9 Q# u8 n
7 A& o0 d: p& ?5 P0 P/ Z某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
- p; d; N( A4 A5 `- t0 R9 _/ q/ N. P
5 h2 A) H* C1 G8 l* ~! L# J5)
& w# m) r& x- L5 ^+ bACPI Structure For P-state
$ ^% ^1 X( t% ]% \* j/ @% o & g5 s; i$ t  g4 y
l" e5 X; b* }- T0 u$ P6 ?9 W
_OSC & _PDC& F: e9 e) R% N% l' I7 R

. z/ ~: a6 D$ E2 @$ H_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
2 g( f# [1 g' d1 R2 h; V- Y1 o ! m( K+ d  s) ]" O, x) z
l) Q! h% U" p& E
_PSS& u6 d# u& r- A  n" d2 ~0 M
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量+ {. {$ X7 P8 w' x! d
并且通过一个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做比较
4 u6 g9 R3 [6 y) K以确定P-state切换是否已经完成。
$ [% J$ Y" P9 H! L3 ? ' ^/ U' u( d* Z9 n( T
Name (_PSS, Package() 6 ~( q$ J2 o" ]" e( o6 u- ]
{
9 E1 ?3 A$ k3 |, l8 f5 G2 j// Field Name
+ k( e8 X) G  A3 q8 AField Type
% D! F/ V" O  h
: a$ a& r& _% o* T% R4 j3 }/ D* _* M8 ]: a; @3 F7 M5 |: q; W
, i' T, w. R; {+ ]
Package ()- q$ ^: U* W) \: X. C
// Performance State 0 Definition – P0 / H# a) P: ^* H7 n( G  n

$ O3 p; V2 L+ ]' I0 v. y{+ B: Y1 Z5 R) _2 {' [$ y# m

8 h7 s4 f& k0 H: j# J
9 p+ Q- s8 i9 `) }3 i+ G0 S: iCoreFreq," ], |& z6 g% U% E+ N
// DWordConst
0 `! [6 `; U, c. u: F
; {( }9 i" K: t7 F6 k5 r  i0 ?3 `1 T" X" `4 C
Power,
" K" h9 B8 R0 T0 C1 p! b// DWordConst 0 A& w; V1 j5 c" O% Q- Q
6 X0 ]" W2 ^! O8 G, ?8 {
TransitionLatency,2 d: `, o$ e3 u. O% W4 x
// DWordConst " h3 Z* I0 [) S) g! R+ s

- D& i3 I: y5 WBusMasterLatency,) h1 d7 n# f' w/ _" A7 q7 J9 ?
// DWordConst
; ^/ q" P. B$ \% g) o0 D6 x! `8 o0 p  y+ j
Control,
! ?2 N+ r: R4 \# `" f1 F4 i// DWordConst ' `$ S" e& l9 z& ]) n% s: K3 ~! J
; I0 [9 r; N$ H# t5 S
Status# ]# W7 g. g3 u% v( t$ S0 u

& w/ u& i7 E6 s3 p// DWordConst ' E" T: u; s& j/ R

8 T! s; N" x4 p},
. Y7 j1 V" p# H9 Y& ^1 d( z5 L' q$ d! \/ F
.
8 n1 {7 y: e4 a" P+ b# s4 r. p3 s# I: r" I& V
. ) A) C0 q& k1 j: Z6 p" z$ f! R
$ U3 _* W; f# j7 k. G+ ^; j
.
# N, X- [  Q6 w6 S# n! y7 r9 H1 @. K/ O}) // End of _PSS object
: }. W- L/ h( r( J6 b7 g6 j6 `前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 2 b! R: f) h" {1 D7 C% |
/ y: _- X% z9 m/ x2 ^8 w' K
Name (_PSS, Package() 6 m) X! B) H; X' G# z* _

2 D  D* P2 D! b/ L* j0 G8 Z, o! L# ?{
) a1 u- o8 |' b. C4 z% A5 @
, b: q; F) Y; u' ~Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
/ J* a( {! j) k5 C5 p) B" H- `& b: h& K; Z
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
  @$ ~2 `7 t0 w) @* ~
1 E# _8 |8 q9 B- ?Package(){1400, 8200,! b2 x% u- J1 z% u
10, 10, 0x000E, 0x000E}+ }8 t/ z! m8 y5 q) q
// Performance State two (P2)
. s+ G6 i- Z* ^3 O, J1 ePackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 2 X$ S. w$ G  S! v9 q( C5 G. T
Performance State one (P3)
* g% m1 A  I% m0 _: ^% a
. Q( C( ~! Q! g# c  T" iPackage(){1200, 8200,
3 x) ]* q! I/ u/ d2 L1 Q& r4 ]/ V8 Z10, 10, 0x000C, 0x000C}
. M8 ?$ Q$ n# Z( e1 P- R# v  ?; ^// Performance State two (P4)
7 c; q$ n0 K" m8 D. @: P. Q
/ q2 V, a& l! N' K9 A# A}) // End of _PSS object: J* u( Z" O9 B4 h

1 S2 L/ F) L5 X8 X8 d另外当该平台支持Turbo Mode P0将会reportTurbo Mode
: W; w# w6 V' F2 s 3 w" h7 Y6 M0 T0 @# p
l2 _+ m( V8 Q* w* \  Y
_PCT+ D6 v/ P) R" H  \; \# `

3 _, `9 d% c9 G* ]# L- dPerformance 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的方式来进行。5 [8 O6 K% H$ |$ }) H2 e! `
$ B( N5 \0 E* x. r' P# I9 F
Name(_PCT, Package ()
1 W! k- B# d" Z, O# ~1 O( n// Performance Control object 1 C) u! F6 _, W  q) K' ]) X% N
2 |: n9 u/ R" a
{
% q7 X* K, m1 J, y4 [* x; E5 l- [
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
$ F; S! f' `! u) t// PERF_CTRL
, K8 B9 y+ L2 m& Q- {5 ?) \, }/ w& i/ t7 F
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}- Z: C# w, `+ v0 v
// PERF_STATUS
1 ?2 ^  x/ X% j& c' Z9 d& d8 z) M9 _
}) // End of _PCT object7 z, C# {* R4 Y; R  G3 ?
& d8 I, B7 d8 Q$ T$ }% A! G" V, u) x
l
( ?+ x) e/ l8 ^6 _
_PPC; `; ]& J! M4 k* q- V

* p! Y: a; a+ T+ N9 lPerformance 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
! {3 a7 d8 E6 b8 l
! n% O1 v! r' r4 D. [* r& h8 ~7 j: ?Method (_PPC, 0)# g2 _* \* p1 J, e! V7 }5 t
// Performance Present Capabilities method $ `) @1 {, P$ N& S7 G5 V

/ L: a. r; T4 n, n2 s( G{
& Z- Z; [! \4 ~
( F8 g1 I4 T& g7 A; J5 Q9 W% aIf (\_SB.DOCK) : n9 V8 n5 Y( W+ G

! R1 `% g9 c" f- G6 B{
. b7 p, T" P! T4 E) R" k9 G: D7 t5 r8 n
Return(0) // All _PSS states available' x" S1 F, K' g/ n! s

8 J3 E% M2 {$ L+ B7 B/ C& v- m9 m
+ q* w  U$ V- w! P} : p+ d$ s; i( Y9 M3 G( o
* i% y( }1 U& }1 v: ^/ H" W
If (\_SB.AC) ; a5 H1 k: D7 e4 T

  {/ M; |9 B, y  Q- d: V# u, i{ & g5 v2 w2 a7 h6 q+ x0 q; c

+ i; B; n: W) X* D6 b' rReturn(1)! w1 t4 j( {1 E- K" J
// States 1 and 2 available " ~$ R/ a5 ^! [8 T- D4 I" V% C% i
, P' ~3 [& S& q; m
} ; R! X: y  n  U1 G7 L) c* A  s
+ g: u4 g/ m) b( [! S( ?
Else # C. I% `: E. s. i/ G9 _
% I* z7 X6 E. p! Q& C
{ " y: G8 H" @7 B% W+ U; i

- b9 N/ w+ X: `9 W% s) d( D; ZReturn(2)' L2 w2 I3 C8 e4 N
// State 2 available
/ W" L/ _1 r) N: d# l0 m
" l; \9 Y. w( Z! U/ k4 O}
& x+ [8 \8 @7 {- h1 m2 T
9 g! F. a; |8 m+ w" p* [. t1 }} // End of _PPC method
2 t9 u, `. D! i3 C7 |! b8 }
2 V9 ]! L, G5 J6 L+ y) j- El
' R) o3 m9 `( X+ k0 R
_PSD2 N4 U( R# Z4 I7 b% D
" C2 ^7 g% Y; V1 N" _
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
/ N8 l: Q- w+ _4 g6 W6 G9 K1 j
+ O% w* N1 q- V& jREFF:
/ M; ]- `% k4 p) s4 E6 |4 n1., m3 I# k' M; {+ E# ~; y
ACPI Spec 3.0
" m0 A6 T% t5 s+ i2.4 Z' G/ K) m. U' y* ?, P6 c6 F; Y
Intel Processor vendor-Specific ACPI
% d1 G# e9 g- C% E. a' w6 C
+ c1 @3 U, m' @1 u( i" J( J! C 6 l* F* b  x+ w
That’s all!
" ]3 r8 {3 [, z6 I
% G# g4 M3 q) S, I, p1 yPeter! S" R) Z( E, a

; w5 o& I9 l3 v+ A" \0 O2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
; Q+ `( N. V9 m- l ! V' x) O, |4 A% a" d& u
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工作时间的占空比)的方式
  E7 W5 V( z3 p,影响系统的功耗和温度。+ e# m* X/ Q7 Y- o6 m! i

# B' p# W8 C1 S4 i( l2. T-state Control& d9 e: u# `. D9 |: @

* o5 O% s: R7 y& W1)
# ^- \; ^- S$ u* C0 fMSR Based Control2 P6 S! a# n! J+ c# c) _: Y1 ]
$ }9 d& h2 p1 s/ a9 x8 L4 s; g2 ]3 g
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。   A9 j1 b6 o8 u6 x
( L7 B8 F( |6 h' \! l
2)
) D" y6 ]2 m: C! ^; QI/O Based Control
, x' \6 J/ a* x& o" L  m, m* P
, a% p" z: c/ B! c6 |* J1 F除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
6 \6 r! R  S3 W
  ^& S8 T$ x: A' F0 O" O5 m3)
  }5 M& |2 b2 ~% M3 T/ @3 kACPI Structure For P-state8 K: V: F0 ?$ g' W7 R
l3 o- U3 v; H  C' Y) C. X, r
_PTC& A' x8 L4 _8 y' z1 E* g

! w" {6 n7 s" \Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:+ ~9 i0 q5 ^3 f; D# c

% B. @( K" i( Z$ a5 O) NName (_PTC, Package()
" D; R# y' o( `" F% a{ - K/ i. B- n- N8 n: l- \
) m6 T# F# U; p9 l8 l  X
ResourceTemplate(){Throttling_Control_Register},5 s0 ^# Q5 M3 s4 i/ o) R  q# x
//Generic Register Descriptor & C1 r5 D" U( _7 t4 y7 Z/ s" y! g

4 S2 r$ b- W$ g7 r! L  @. jResourceTemplate(){Throttling_Status_Register}
! g2 k: L  y/ t5 W4 Q- A4 Z7 |//Generic Register Descriptor
: \! u# q2 ^. S% x# f}) // End of _PTC/ l! c7 L9 M. t8 @

% O$ W3 C1 T5 _; j下述是一个sample code
" B  W( z- o$ o0 h# e % b2 e6 u, l  N
! k8 C0 a+ i' E* e; b
//
2 t4 z* v. m4 q0 k2 r( i( q
5 ^+ J" d; q, J$ w- `: C# U' ?// T-State Control/Status interface" U: L  H( \6 U% |7 ]' a1 P
6 k, \1 l: ?& F/ S; r7 x8 R
//
' J5 \& _6 p' I' i6 g. w! X/ r5 f- ^  D
Method(_PTC, 0)
9 T. A1 `/ }2 U; n! ^; x, _4 p. c3 E0 P" |, a( C! x9 k) t
{5 `) k# a2 o/ d* ~4 i/ x: V
; ]+ }" a% N; y+ l% M( y
//7 @) a! b& N% T
4 A; m4 j2 u. C! D# a. w7 n
// IF OSPM is capable of direct access to MSR4 V9 P$ \" K/ A" U4 p" g: A& [

* ~, A# {7 g7 k) a5 O, J/ l) c8 c//
1 e+ w# e+ [: ^2 k( [. sReport MSR interface' h/ |6 R2 J# G6 D2 J: Z

0 ]  N0 t$ Y6 K' U// ELSE
8 d0 |2 d3 ~$ J2 t; ^6 n) L/ c$ H& z
//0 E% f0 x9 Y/ _( F) O' S& j
Report I/O interface
4 x6 }9 d- N$ \  }9 i
8 W* z) m) U5 t* {# }, o; g//
% h5 _' p$ D8 l! p0 r0 F$ O1 t: t4 A" e8 }! p  v( m
//# O( _# {+ K1 C
PDCx[2] = OSPM is capable of direct access to On- {1 b) M3 |) R, v8 g' L

5 N! n+ p9 w/ s0 t$ K9 |//* E# V) I, w  l! }0 k, _- g$ k
Demand throttling MSR
. C0 h) Q( I- Z8 `3 k/ t$ N' ], Z
//
( b0 B4 _4 ^. o6 A/ K; h
9 ^0 B$ h( U% o, m9 D$ O0 WIf(And(PDC0, 0x0004)) {
$ `) `7 `8 H. H# i2 o' \# D2 q% d; {  }1 c; W
Return(Package() {
# R/ ?8 e/ Z. P, ]: q+ C: T, p. }3 q
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},- [3 g) \/ B; I* y8 W

" [* E5 R. v& gResourceTemplate(){Register(FFixedHW, 0, 0, 0)}/ e5 `$ k" k1 A% M
/ J+ L5 v6 D4 _
})
, E1 @6 ^2 e! O7 v
7 s. U( d7 L3 h+ @$ {}
; l, [$ s" t, t* d3 j+ D
: i/ m7 g% M5 w8 kReturn(Package() {
' i/ z& o1 C  r! b" e( O1 i3 P4 t  D% Y! K
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
* p2 o5 k6 p$ v" e& M) Q0 r5 I. r' t( M
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
0 Q, Z" w! P. w( H9 S1 A/ r% R8 l- E% b9 U, O5 }3 g( J; W+ I5 G
})
. r( Y- U$ G: B$ o1 a( U+ L% t! o+ A' k
}5 o( W+ K7 P. ^9 z3 s' x- G, {0 Z
# O1 R  O' J- D, Q$ E: G8 P

2 c- C# _" X( J# A
- S9 e! H3 e" f- {& ql) \3 J" V3 m7 c: V+ [) t
_TSS1 U" ~# y3 E+ W+ e& }% i

0 \* v" {2 A% TThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
) g+ V# W; i, H; bName (_TSS, Package() * Y/ ?1 d5 Q& w8 ~
{
# `! }5 O1 U2 F$ o; U+ d// Field Name# t2 ~3 [! [, P* A+ P
Field Type % K, j6 g" E2 j. `

# \1 x) H2 ~2 G  U# s: K) R* F  e$ X+ C  `5 ^0 e

" p7 F: Y$ C7 K4 B9 I, TPackage ()) [1 S, K( w# i* `4 N. m
// Throttle State 0 Definition – T0 % j6 f2 _, \2 Q1 z

6 V$ x# a' |  _6 h, D" o* [  u{
! H* l! n1 v6 T5 w- }- @  s  Z& f
5 q: [6 j3 l' P0 `$ Q8 c* ]% c: k* P0 k/ A! E9 j
FreqPercentageOfMaximum,
8 l& s2 R# F  {7 z2 _1 Q" B// DWordConst 9 o8 i+ S) Y/ O* @& |1 m$ k
. x* _0 f* v% w# J# `! [
Power,& L- r' Y) u4 e
// DWordConst 3 P! j: W  c, f9 H' ]# p( k

0 s5 R) G% D/ I- m4 c& ZTransitionLatency,
! l. @" E& @* U0 L$ `: ]// DWordConst 1 [+ U; V/ W! g7 m4 S$ o
  z! c7 u; p2 ~( b5 c
Control,7 Q6 a* E9 o! P4 t# D
// DWordConst
5 [: u( N& }9 r  x3 k, T/ m" ]' c1 r7 }, e. u- S+ H
Status0 K2 [4 C. [9 I: A, u  G; d
// DWordConst & C# [4 u  N+ r) |9 t, f- B; L
},
. }! D: K/ r- I# C  d……
5 m6 j% P2 i2 `" V3 w* h6 W" D, e9 T}! z3 b/ D0 _! M* e- T! q& k  h% m

1 X4 q9 Y* ?/ }8 @( hExample code 如下所示:
3 r! g: N1 c9 j7 k: U' U1 y, y; U4 ]( `7 h9 J. s$ l
Method(_TSS, 0)
8 K& a) ?+ x9 m. W
$ b" P5 I1 |7 M2 e" Q; _/ Z! v{8 l! p! P% h0 Q+ P( P' k- }

7 ?  j& ]' l! u* R- m& j1 lPackage(){100, 1000, 0, 0x00, 0},
' {- ~- h& \6 Q$ V- |! {# r9 f: j- N/ B! G- ~
Package(){ 88,
! }1 ^, E/ I: S, _" ]* q+ m: ^875, 0, 0x1E, 0},
7 A; v# e% }  \6 Q  b) p. G' D" U! D5 w( F: U) N1 ]
Package(){ 75,2 i7 H4 s- N+ C
750, 0, 0x1C, 0},: O) \. C- g2 W5 Q$ p. W
1 Z4 T% L  X# {
Package(){ 63,1 h5 @+ R. ~. q" p8 }2 m9 w+ a
625, 0, 0x1A, 0},1 n8 J2 w( T, t$ S" l
- S. M) I+ }+ v# x% M
Package(){ 50,
# U! {3 k8 [$ O3 d8 a500, 0, 0x18, 0},
1 J7 j; [! D9 y3 b' D: k7 t: F7 ~4 t" T* _4 @- y
Package(){ 38,
5 U/ h2 {1 E# g" d/ x375, 0, 0x16, 0},0 Q) H  \1 W: g: Q' b. `) J. ]

1 U( e8 ^! Z! W2 D5 Z, M5 F. j0 dPackage(){ 25,% R4 b, P* c( I2 l. T& d- A4 i7 A/ K
250, 0, 0x14, 0},( X7 d$ @/ H4 c* d* @
5 A# n/ T  ^  l6 q
Package(){ 13,
) o$ a1 h, F8 z! i9 s125, 0, 0x12, 0}  O8 a- C" h- U! P  M

' d- O+ f/ c$ X0 Z2 I# Z( a}
/ O0 v5 [2 M4 C5 z! Q6 V( H5 D2 ^- [/ n" T( {
3 |! R% c5 z6 M4 O& J$ S5 q! i; Q
l( l0 B& A4 w9 _
_TPC
" x' y- {9 H' J
" [# ]0 N/ v% t( Z4 U- {/ qThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
( p( I  x7 m" r+ P- r ' p9 R/ {1 J8 s% O/ H, g$ m
l
& l; w  B# c8 ^9 \4 l) v) Z  I
_TSD% x7 X! a% _8 K+ a5 Z& N* r

' ?. p( @+ B% H$ X( c4 ~T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code9 G! J& ~/ `( D% w+ T( D
- A, q/ B$ f" ?# L2 c; _2 o5 |5 y5 n- O; E
Name (_TSD, Package() & B# d) }# s' c) Z
8 G! V9 Y# z0 @( ?
{
0 b+ f" c3 G7 o$ W
7 C0 b5 J4 X- ZPackage(){5, 0, 0, 0xFD, 2}
/ E$ {; `5 C' @# N// 5 entries, Revision 0, Domain 0, OSPM . c  [3 C1 V) q. ?$ d
Coordinate, 2 Procs
9 {+ s. a% J+ x% m9 z, m5 J7 R3 F0 ^$ L

' _( @, y; c; a7 q}) // End of _TSD object
$ `0 Y  w; h. n& |8 Q 9 ^3 O* j9 \  k; `3 x- j* }/ V
REFF:/ n( _; n, _7 z4 p
1.
5 I- R: d5 w! L0 v# EACPI Spec 3.0. H" b% O+ z) _7 a+ F* H5 E* {' C
2.
% A, y, \% a8 c4 s  D+ dIntel Processor vendor-Specific ACPI
! c8 E3 E& S- H' x4 I" U8 S 1 M8 C5 J- t4 f7 D
8 B/ T3 T1 [- r' E1 i! {$ P4 T
That’s all!
5 E5 F, B5 f  D/ L7 w & ]3 O- P& f. m, q4 c/ n: Q9 i
Peter
6 @+ O: p7 y2 v' `( W  a4 n0 y0 v ! o6 `5 o' I5 f% @0 m" F
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 06:53 , Processed in 0.262460 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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