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

CPU Power States

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

2 c" s9 a" v7 W+ U, g( a- Z1. Overview
3 m2 d4 M; @9 A# `$ i. [* F4 l* q% S
) ^( ~, N- A9 n* p4 v# ^
" Q, r/ Q3 Z, @5 k) z; XC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
7 d) q, t! h/ b1 w& V3 D* z$ D降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
1 X( }  k. h8 s2 `9 V" y) n7 O' @比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。6 `  W" r3 h( }, S1 }5 ?1 ?

: V$ z) m; p8 G( r( F0 ~
cstate1.jpg

+ `* L8 m: o  b/ v; Y
1

; R7 h. J' x! ]0 _" w2. C-state Control# k1 x: e3 ]' A6 J# q% j/ W8 @6 H
, G6 [! k, L" j0 g/ ?7 b9 j1 [1 g
1)
/ W: P& F% G7 @) K9 r. j' uDetect & Enable C-state
& Z* @8 {9 u% w3 T2 T+ L1 o6 |( _" I. ~6 F" V5 ^
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的支持。, J1 _# H# O9 G9 w
2 N5 r  I* v. P) a
2)* q3 _) o4 g) V( r
C-state Basic Configuration
/ U! g( ]& _' D; s1 R5 \+ O+ 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)。( l3 T  O$ y. W/ m9 F

! O8 U* M( k' m4 e1 W3)1 ?$ |) ?. J! r/ {; n. Z, K
ACPI Structure For C-state% o+ p% k& B8 ~4 `$ \
1 e1 e. h: L/ |- u. S1 ^
l2 `% S* [, c2 M& ^) d9 a
_OSC & _PDC& t* \0 I) N8 t
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 c9 ~1 {; Z( Q! q! Ul, D. j) }% _5 Z, w' Z( l1 m
_CST# f4 X" z- J1 E. o* e+ ^
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:8 }  C4 @5 w5 G9 L/ z" m1 P
CSTPackage : Package ( Count ,' J5 y* M8 J* X1 y- H7 @0 ~
CState ,…,
& w* @9 X- G0 s$ z1 c" FCState )
% B1 q7 ]! q8 S' R. p4 O其中Count表示所支持的C-state的个数
/ X# R# E, M- ~/ {( N- TCState: Package ( Register ,
+ i% J) ]) H9 y  VType ,
, t- ^! M: k! D# |& _2 v4 ^) u$ r8 YLatency ,
, W8 ^+ K( ~8 Y: x3 rPower )6 W- T  {2 _# V

  x6 x: `  Q# L- I- c1 ~% ZRegister表示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
. ~7 D) v5 Q0 m2 {; A! R; }
9 m; w7 T# o. }7 E$ N( i) `# AName(_CST, Package()
, B/ X* T! F6 N+ h# X
, d, d( X7 k; v5 E0 Q" C) F
{
4 e8 d3 {; b4 Z) N2 I- d4,
2 ^. s0 ?+ ?& f5 S// There are four C-states defined here with three semantics
% D  O+ |4 h. T" X
) L6 N8 w8 y; Y1 ?
// The third and fourth C-states defined have the same C3 entry semantics
+ z  H5 F! r9 N) Q! q! X
3 o/ J* V( W7 V. u1 K  K
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},1 V+ ~( l% s! N; q# `1 T0 L- V
1,5 q' w: X& h; }/ O- r
20, 1000},
8 P% U: z! E6 \6 k: c
1 E% V* W3 T) ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
/ m( v2 j5 ?1 \! n9 h40,
4 f! S7 }- E9 T" g750},
7 [" b1 b& z- T/ |2 i& e, u7 `
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
/ Z" V* p7 i- u: E' M  _& e60,
0 j; G. B( [, S* `; Y500},
3 }) S1 D3 m& b* Y+ W  \2 N
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,* _4 H) o1 f; c
250}8 ?$ S! H- e$ E; R. p9 R

& s; ]; H, C& x- i2 s* j})
. W) G; x+ t6 ^" o0 e
$ Z* W+ i2 \$ ml
5 `7 B% u2 ?* O' E  m
_CSD; U9 [9 g9 `0 k
. f" ]' ]( b  J. x/ Q
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
* E$ q4 f1 t9 ~, A
2 A! T8 m" d3 z0 P7 ^
3 q. p6 z# X' P9 I( q* v0 s7 w/ x5 w# g1 U

- S5 N: J6 o# l& [, B; O" ~3. P_LVL VS FFH. g! \# K) S- a3 X3 K+ T0 H
7 H2 |( \$ w/ z* @' }, n4 H4 c- j
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)% `# u& Q1 O4 O+ k' J: |2 ^* q
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所示:7 w2 }4 }- v1 }, s, X6 k

" f+ C5 m. R9 ?% I1 }
gas2.jpg
/ X3 t* P0 x: t- W- r+ ^& y
2
0 @) Z$ s/ q( _- |% I/ \9 \: e
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的一个例子:
8 B) P: p2 o0 g% B8 B* B  IName(_CST, Package()0 s9 y% H" x. ~3 K+ C

& L3 `+ n+ z; X5 p( _* V: y- T5 U- d{ / ?" ^6 l2 x5 [. w# e
2,% L3 w9 T' ]1 S4 r$ R
// There are four C-states defined here with three semantics
  ]$ r$ y. H# ~# c3 u* A3 \7 e5 F

6 `, W) t1 a1 L$ @// The third and fourth C-states defined have the same C3 entry semantics% N! d/ I. Y0 u  g

7 H* G5 B* @4 U$ @' p" Z1 n4 UPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
$ R; i: P' T8 M% j; J0 |0x01,
, i/ T: b( ~1 S" d0x03, 0x000003e8},( a6 @* o2 j' f8 U8 P
# ~& Q: b3 g6 B7 d3 u) P
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
2 D; \) y6 {' x, T& X1 n5 c0x01,
* w7 r; H9 }* r& }) ^, k4 a0xf5, 0x0000015e}
* K4 s2 r; H6 u5 ~
})
) l# E- p. h7 \
8 T6 G  c' t7 s4 m' `, ?
3 ^5 o8 U( W! X4 C) @  V9 I- _9 G( oREFF:4 n6 J0 |8 N  ~7 ~6 [( t" ?. z$ j+ @/ s+ S
1., S/ \5 r; y* F2 {% V
ACPI Spec 3.0
/ H7 Y. p! R9 V( v3 _2.( G* K- b! B/ c# o0 e
Intel Processor vendor-Specific ACPI8 {2 R6 G6 |( U7 M/ t* i! d
6 `8 |" J/ Y( O8 l7 \

  i; [" i2 c5 @* n$ I# XThat’s all!: n' ?3 d, n6 u# j
; f' |& r$ g3 v1 }/ X% I& D
Peter
8 ~6 B& I/ a0 C( `1 l) V8 a2 _" A
2010/9/20  v  H, G" o; z2 ~; u! T

& s1 T- @; J. @3 o# S[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview6 \! [% W+ J$ D4 X) p& f, U( P. u

5 v8 G2 x+ T5 o; p; u; b; B: h  xCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST+ G: E  N( c6 r) T3 k, e. u+ G5 T
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。& q2 |8 t3 m) O  b' j, [

* O6 [& J) _% Z" k, r' c7 i* i2. P-state Control
) e" P: [6 u- J: \0 h
0 h# t3 {  R2 Y/ \4 a1)3 o5 V' a" H3 l
Detect & Enable P-state
, w8 L0 z$ d2 L 4 U6 X& O/ @9 B& J: R$ k$ j
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
6 a. K$ D: w( q9 K* s) L6 b3 J ) s9 O+ w" q- Z2 W; R! Z+ q
2)' B' c7 \7 }6 U6 W' j
Supported P-states  Y$ r! d4 J5 d: W$ u$ w) W0 ~  T

- S% N9 A; ^+ c& L7 E! WBIOS 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* W5 ?, e% E4 }: n, u
- {" Z# z% D; q- j8 L" i
MinRatio = PLATFORM_INFO$ o+ S7 D4 Q5 D; _. \
MaxRatio = PLATFORM_INFO/ d' o; |& w4 g: t3 y/ H; |! u( ?( U
RatioStepSize = 0x01. X; X* [) i% C! p+ Z
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
2 u8 u2 _! Y3 H1 y$ K0 V
2 p* W* G" H! UIf(NumStates > 0x10). o1 f" y) ^% J0 Y' F3 s: ^
{
8 e; Y+ |# y7 sRatioStepSize += 1
$ N/ R* P1 ~4 }! f% W+ NNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
3 T/ H% c& x6 e/ n# e}
2 H& ~1 p' g* \3 r6 f # E- `0 |3 t- x) @
3)
; o; b. Y/ n# w: KTurbo Mode5 d$ ?6 B* O# t: n

2 J7 V! W! {) ^) Z/ T: _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
& a0 C( Z# K4 `! H * K3 c* @* Z9 L, n$ _, R' T: O/ {
4)8 _% R5 {, ], ]& @/ j% z1 M
Over Clock' c1 q' {1 H+ y2 w
# _; N# N- \" e: U$ A9 x+ ^
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。3 z* h6 Z+ G2 l/ g3 r# V) A
7 v% p# H& Q; }
5)
3 s- c8 W1 w! e+ i' Z2 z0 WACPI Structure For P-state
; V  v) k: U8 \4 c3 X& Z& r 2 E4 r% Y% x8 ]: J. z
l( Q5 z2 D6 n0 ]. ]: e6 E; p
_OSC & _PDC
. ]' i3 T4 v+ H4 r4 m
3 r0 {  a1 M( V- W6 t_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures8 M, c8 p% O# {& o

' n2 i6 r2 Q. L  y8 A% P# bl
  W! w/ E* ~$ u
_PSS
* w7 y2 I/ z: Q) J7 d0 ~Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
1 _1 f2 z0 k& e0 J- B/ a/ B: I$ Y并且通过一个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做比较
, `, |6 A: K5 A8 s以确定P-state切换是否已经完成。  ]7 [  m4 h% x$ i( i) T3 X

% W) o  q* p9 yName (_PSS, Package()
% e. g' D% P7 `# B. T- w2 F{5 }) F6 M  ]+ G, D* m" }" t
// Field Name
+ {9 o+ `+ V4 B' B! }Field Type
/ f; ^! Q8 Z# W4 M- E
, k+ o3 v. v- c: z" [. j. `- W; C, c- Y" ]7 W5 W5 }7 A

2 G; S. J8 R. o9 }Package ()
. E) t; F6 K8 ]8 N// Performance State 0 Definition – P0
* l9 k, m& x! ]! l6 Y+ C6 V3 h5 k0 V: J; F
{, t+ Z& T4 b1 J. I; X: N7 G" l

3 z# r( K. P) |* H* M# \
; l, c- _+ d$ ?- KCoreFreq,. n* X+ q' l6 R  u  j, R2 G
// DWordConst
: `$ s! y& M$ D4 @' [" G- x% a
" y& J  o8 k+ j! F+ ^2 ], r; P; K& P" r8 i3 E/ q' Q
Power,
2 h" S0 p5 C* ~( V9 l$ \// DWordConst 4 {8 W% F6 g; C/ @

+ W' ], V8 F% ]" {TransitionLatency,; e+ C: w2 t+ R; X
// DWordConst
4 r, c, l: d$ ]2 Y# z9 @
! d0 a2 B& e- i- f; u! T7 ~BusMasterLatency,
( j5 w8 v) J- [3 _7 [. H5 l- ~// DWordConst : @  n$ Q, f' {& F# B& V2 Z; V) ~

1 n0 A0 n; R  aControl,
$ X/ U0 Q7 ?0 U9 k6 M// DWordConst
" ?0 a7 w; M, o( k" c: h+ z3 i$ E1 R! q
Status, Q& R$ t; g; q6 E3 d

: n; {  |$ |* h// DWordConst
# {6 y% l: S  P! H
. W2 A* E0 z  Y/ a}, # g2 r& a3 `8 i6 j* ^
7 z( L) k9 O/ C# z2 \7 m+ Y. K4 o
. % `) W* c7 d. M. A1 G# G. D

3 \" m1 m$ e- m1 `( I.
- S0 X; |8 P( w+ u: W3 V0 g( f# ^- E9 i& H# G0 x7 t" v
.
) @$ a0 u2 U; z4 n% P/ o  }) W}) // End of _PSS object! Z  \: o3 d7 r4 q& |* x1 r
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 , V. B6 U8 [- E. L* |. J0 l/ p; X

1 E6 v$ |" k0 U  ~Name (_PSS, Package()
- ~; d/ \+ W, l+ l; |8 z' U' ?8 `0 k3 N! S
{
$ O2 }5 N2 o, U/ {  U4 B
# w) \' P1 f4 F1 G, E  ]) Y" V, wPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
" R4 f: ~6 l8 Z* E: M2 y$ V) o' v/ v6 ?) X% ~
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
# l1 m) u* g- L2 O! a) l! n" p& r1 v) z5 D
Package(){1400, 8200,
% E, U2 M3 }, v0 u( D10, 10, 0x000E, 0x000E}$ Z0 G9 W6 `% h! @
// Performance State two (P2)
3 a  b" n: w- m: _& oPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // . a& H4 b* V, z  Q7 w  T4 x# I
Performance State one (P3)
/ u0 h4 ?/ X* V( C2 M/ ]
) h# d2 @, k( g/ PPackage(){1200, 8200,
. A! q: @5 K7 \! X  `, X8 u. Z10, 10, 0x000C, 0x000C}
: J8 y; d. d2 q7 n9 f" X: i: B2 i// Performance State two (P4)8 V- z& `# w/ J7 ]

$ b" d) `# w4 o0 W}) // End of _PSS object
1 m5 X+ o0 a' F# A# F % B4 ?) l7 n+ `4 o& S: l
另外当该平台支持Turbo Mode P0将会reportTurbo Mode- a# R8 C0 D: z; @$ E
$ W. `6 y6 u. z5 t
l+ |# V; y% m7 X: U+ S  Y# Y
_PCT9 r/ U5 a2 C! T* u: ?+ n% ]# M

6 E7 J5 C+ f- A9 s# YPerformance 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的方式来进行。/ B" v. \7 V; I9 }' M2 @  G. S; W

. Y/ M; u3 w. V2 ?' DName(_PCT, Package ()
6 h$ x" D6 a6 p" ~// Performance Control object
3 [/ L3 f: F0 J  N% \" [! l
1 M; u- W, k0 g0 R{ - j  i# }- z) I" W1 U

2 x% n9 j* K) u5 TResourceTemplate(){Register(FFixedHW, 0, 0, 0)},* _. D7 N2 |8 S+ K( m/ @6 k
// PERF_CTRL
7 g8 V) w, \; a( y* r+ J1 U
9 d: y" c$ |- A* C. ]( I" e, Q+ zResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
- x4 _) O: m. |4 F- [) o: R& O  @// PERF_STATUS 9 W$ l& M- p5 G2 Q: x% o7 U3 j( J

5 [& G9 @1 e. O* Q6 r}) // End of _PCT object7 Y# s" [- }  X( E: ~2 d

3 |6 ^+ M0 k( c+ r4 nl5 A6 M2 Q& {# ~8 y$ S$ e! R1 h
_PPC- l% t) B/ K3 H: L/ t: o% a# p
' _" R) s& S9 f. {' ^
Performance 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-states3 r& `- V4 t8 m" \2 f

7 e; A- N2 r5 K% C5 A: _; _, x2 ^Method (_PPC, 0)
( v+ K! |4 X5 q8 J4 y// Performance Present Capabilities method
9 ~  l6 I: f+ A8 G. ~( J
0 @* o- r' e/ d$ C% N: u{
$ i5 e! ]) X$ h% d
7 R) F1 S- S; n2 M% u( Z+ K: RIf (\_SB.DOCK)
7 q% m( o' `. ?
/ z  h1 h: k* E& m( m( q9 t, z3 k{ 7 f* P9 z- W. Q8 b' l$ X8 B! Y
# w- ^2 }, x% W) F" e
Return(0) // All _PSS states available
1 e  i) [) ]# n& h5 N, t' b
8 m9 C" M8 n! V/ m4 T, s  l. i
} ' i" s3 x5 ?  C  \

6 O/ C, V. A" M/ u* w# rIf (\_SB.AC) : f  S4 |. j6 F7 j4 ?- w% j

9 l! V' L% L9 H& S" J$ \6 j{ 9 M) z$ a( ]) T1 s
5 K; O; G3 g- p5 _
Return(1)- K  e% y7 J' H; i( J/ i
// States 1 and 2 available
* R/ f: S6 @! C2 G
2 Z- L- i# q  O}
2 X- `0 O8 _: d: {: k% o  V& ^7 [: k) C
Else
3 O0 N9 m$ O. ?$ I$ p
' `* T/ L- T8 j: c4 V1 w  u. W8 x: C{
) ?, g; W: O0 A  g, V0 g. M9 _' B
+ V8 U( Z7 A+ _+ FReturn(2)5 G; l$ H" `# @9 N( D; P* V/ C9 P
// State 2 available
/ H1 t& l7 \. W
: W$ f. c, m9 O1 r+ g( X} % {# L) p  Q. D: [: l, W! T

( D3 j! S. O# n. r} // End of _PPC method
& d$ l' \* u- z# G/ C
2 q& J$ u0 f' b3 C# \* S$ m7 Sl6 j0 ?) J% u" h/ D
_PSD
+ @9 |; ]& I$ w: f6 Y# L! m 3 X  b) k3 o7 I
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。# {, ]9 Y& B0 b0 V) T$ a
: |" E" |1 l; h* [; V  m
REFF:+ b  g7 T7 l# y) t; J5 X
1.- v- P+ {# K2 V) f. c: m4 W+ ^
ACPI Spec 3.0) j2 a" F, U8 D* f# f5 Y5 c# b
2.4 Y+ P5 B7 ~, P. T7 K1 |
Intel Processor vendor-Specific ACPI
, _# l5 [% ~0 h( ` , d; _, w2 o) Y5 }3 c( v# K
( d! c7 Z+ Y) g' j% ~& b# V
That’s all!6 R3 k- V/ h' E
: u$ c6 L8 U1 I7 k4 X3 c
Peter3 ?1 f! v2 ?- r. o; R  i

( _6 W) R2 `7 X2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview3 Z6 x- Q8 {7 }$ I" {, V8 U

& ^3 S4 d& M# H% qCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式9 M/ r) Z5 {: {9 S
,影响系统的功耗和温度。
% S2 c* W- v9 K: \
  L1 |& X/ [' I; {& p4 i  F+ O2. T-state Control
/ C& \0 i: s' f- g: R $ r7 }  d; R* E7 `  s6 b! W
1)7 J& a1 k% |" m6 D6 |( g. Y5 B
MSR Based Control  o" b" Q  o2 o; ?! g8 H! I

; i$ M0 q8 B) L! LBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
0 ?; }6 M& n. e; \5 d - S$ q* }7 \$ T* v+ [
2)
7 O5 `9 e/ Q2 ~8 @: W2 NI/O Based Control' ^6 ]) t- }/ ]- I3 x5 [+ I: B

% K2 J- e; |, t1 T; o+ u( A4 I2 s* T除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
: x  q0 Y/ h) k5 d5 G4 f( E: ]5 B 8 ?) I( J. ]8 p
3)
* a! _" H7 k( r* Z+ w- L3 UACPI Structure For P-state
- ~0 r7 Q: }+ X4 h' gl
% i* I0 D, Z! q  A% F$ l5 w& r
_PTC
5 R" w$ z9 }7 M$ q ; g, _/ U2 l0 Z. R7 I, \" i2 \
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
6 B7 ?. I( k. S0 H' p# _: G* G! ]/ L 1 j$ ~$ k8 O& D
Name (_PTC, Package() . C/ k7 g4 l. t  U. }! V) G
{ 0 H& `( O* x7 X4 u
6 h1 ]2 e5 c5 y+ S" `/ h
ResourceTemplate(){Throttling_Control_Register},+ |* n1 j4 k: @7 X/ V& h  n
//Generic Register Descriptor
, [1 T; Y0 Q. R  {1 d
0 Z9 ~, e0 w* |6 M$ IResourceTemplate(){Throttling_Status_Register}
, O) [! t6 T) e$ D; T# W//Generic Register Descriptor
9 x9 }. y& }& y5 {}) // End of _PTC9 }6 P+ Z+ e9 |: O/ z* B

' H/ S' x+ y* x& e0 V下述是一个sample code
7 t9 s  v% h$ Y* s
- E* \) Y/ ]  S6 d8 H( ?$ [) n# U+ M2 e. x% I# \
//
  p2 P$ c8 x- x$ q5 A' l3 }' z% g' ^1 T5 [7 F( @2 ]
// T-State Control/Status interface0 e3 \1 x/ D* Y- p8 W+ L1 P' O. J

0 f  e" X! L6 E) h7 ]& U( u' }//
2 C" _) z4 E* X& x8 F# V
" Z& M" ]- d$ s5 v; f* i/ X9 eMethod(_PTC, 0)
* I3 a) k6 S$ i" m6 s# _' L& x/ E6 q$ l, R& D; R. b
{
# I4 T/ a! n& N1 L* p+ u2 q- L
' b* W6 B4 p  D; B. j9 A//
& r7 Q& c4 [# _
$ B5 l: C8 D+ W) |// IF OSPM is capable of direct access to MSR
/ W7 C/ [; r$ K9 s: {& q; s: X5 s/ ?  ~9 Q# s1 @5 x/ T2 f
//
, a. ]" _: m1 zReport MSR interface
: V# R; f) \% v. t# Y0 ]# h# G8 V. P/ H3 [! J9 }
// ELSE
7 O2 n" W' o8 @. h$ P% C  U+ t8 t3 v0 y# t! Q4 Q
//
2 V$ N5 f, P2 l6 c& v5 xReport I/O interface* O! p. |& Y  m5 q. `

7 M' r0 M7 X) D$ A//' f5 ?4 j7 O$ Q7 I- i
7 G3 z( h; p' [* |+ ?4 `
//
) d7 H6 z5 v+ l; f, o6 EPDCx[2] = OSPM is capable of direct access to On
8 {. m# ~4 G; ~: b9 F% t) N" b
3 v/ w; {' j/ i+ k+ j/ H! |//
/ `$ C, E% `/ O( @4 \+ ]Demand throttling MSR$ Z8 z  t0 v7 I3 V# k% C# o
2 k+ j5 o2 R7 M6 Q  j
//. o6 k$ P2 M, P. B4 X9 g. R

% S9 a! R7 H0 Q' WIf(And(PDC0, 0x0004)) {
/ ]/ {) X- X) b9 j6 E3 F8 N9 f8 J0 v$ j# h% Y* Q9 I, q) x
Return(Package() {. y. i. j: P$ q- a$ c- G7 ~
: l; r; c' s% N/ c. C; R
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},6 _. W, s$ x, u

' a/ [# b# R, G' D8 PResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
' L  k1 k; T9 S: N  i# r% n$ }# o. s5 u8 ]
}), Z5 H$ t% b! }) x# L* d' K
0 x( K" r' |3 ]$ D  p. U$ t
}8 |9 d4 h/ s9 Y) [& ?; j: t4 V

' N* j1 O8 _  |5 M7 q, H; w& SReturn(Package() {
' c8 T, P& b2 ~% m0 m) \! r  r) |! t+ V- m/ ]; J, q
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},# q0 t  y: W; c5 o- ^- W

" L- F- |( x/ T: ?. aResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}# x3 f2 O; W5 {2 K/ S$ S
. [% q; _. `2 O0 d; o
})
  a+ Y8 R0 g8 C* t  M8 D8 b; n
1 {; H, D4 [( P3 t9 r/ }}
$ T, |7 h  V/ d- Z
8 i5 h" ?6 n: |  [. P- Y# W1 Q- j9 w! z1 k2 m: b

% I; o" H, n" y. B& _* el
6 n, N. E: h/ b3 h8 i: p) P0 N6 C
_TSS8 ]/ K  D' E( y. X3 z$ H( f

$ z2 m, G# S% f/ r! v3 a/ i  ZThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:# m: F: Z* f1 L1 U0 q( v/ {
Name (_TSS, Package() # l6 a* ^: B1 C$ W; T
{: ?7 c5 X" q1 X' w+ q& g
// Field Name
8 B' F& r& F, C% Z6 i$ W8 W+ Q& EField Type
9 ]# u" ?$ \/ q" [+ y+ P( J
- O- m  \- w. Z  t6 g$ x
% G7 s; L" i; [1 f6 B
4 m% `( n$ Q, M% g* r4 RPackage ()& b8 M# X2 u) t' o8 S
// Throttle State 0 Definition – T0
& h5 t/ @+ Z1 e7 I. k2 w% N$ m6 }/ F3 N; N4 @; I& p5 r. C/ v
{9 T) o8 O' b5 I$ n4 d, h
0 E: y5 u, `' _0 j0 z
5 F) L" L0 V  c
FreqPercentageOfMaximum,
& Z6 U1 p# @& h7 Q9 F// DWordConst
; j7 Z4 Y$ h8 J% T2 `  c/ ]: M8 _* Z4 V, G% t* J( e) T
Power,+ p- [$ x! L  U7 B8 T( [9 T
// DWordConst
: ?# k6 N8 N, ?8 S: F8 r6 f- Y/ K
TransitionLatency,
9 a6 W0 F+ o& |// DWordConst ) K" \" c" I/ Z2 l

3 {" }; E/ e4 l7 e! R3 FControl," c4 D9 E+ ?# t# T0 o# n
// DWordConst & h! v* G) n' v, [( U
9 j8 [. }9 M0 g6 ~! P
Status
( I) f8 N/ s& O) g2 h// DWordConst , Y3 x- K* C% `5 Q1 A6 L; m
},' ^8 z1 j; z( o; G$ u/ t0 }. s8 S
……' i1 Q9 a8 X7 v! P# s+ [
}  u) m9 E1 s, n: W; M' `7 S, h1 W* l
% Q7 M0 o' ~1 N
Example code 如下所示:
# w$ J, e- l- l7 u' A1 j9 M- O6 K7 c6 P8 g
Method(_TSS, 0)
& o+ \" x3 C) D% ~1 R+ R! K0 R, T) z
{
& s2 o. \1 ~, A& L0 K4 B- J3 l3 W- t/ p, U, t
Package(){100, 1000, 0, 0x00, 0},  j: Z5 `1 d8 w/ ^$ v  h9 N
8 _+ f- f, G3 q
Package(){ 88,
! z/ c# k7 Q" C: q0 y7 ~875, 0, 0x1E, 0},5 L) W& |% b1 B0 ?- {8 Q
% K4 T/ A# x& x0 }
Package(){ 75,& j! h4 g, G6 C# g# a6 \  s+ i; Y
750, 0, 0x1C, 0},
5 r. i4 e/ E3 |1 ~0 I$ L/ t: g" P* B  X% G: c' Z- ^$ B
Package(){ 63," U4 H! X6 G  L% X# {
625, 0, 0x1A, 0},
/ s8 t2 U' G/ v0 z! X3 s
1 W. G' v; u1 F7 V7 g9 FPackage(){ 50,
6 C+ b+ e6 U$ D# I' Z5 }/ @500, 0, 0x18, 0},
' r* A$ U- t  {' J, e4 o/ C! Z- w- s" ]: A
Package(){ 38,
7 W8 A' P; I! j375, 0, 0x16, 0},, m" q, K7 ?$ l  k  E9 S
% Y& b: }( f7 N
Package(){ 25,
# y/ Q/ U/ n. c250, 0, 0x14, 0},
  ~+ k1 B2 {" i1 W0 M
- Y$ M5 V! v  ?8 k/ bPackage(){ 13,
% N7 W8 t- w/ k# K125, 0, 0x12, 0}
4 q7 |4 E3 f6 p% G) l  \  U* T( ~7 C2 W3 B
}
; M6 O3 t0 E% V
6 g( U; }1 }6 ?) _' {$ q2 D" r5 u" V9 t
l# W7 y3 ]$ R- w9 F
_TPC  G; D; I9 g+ U
% @0 [3 O" [% `: N3 b
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& _( z2 B( c: d1 W: @+ z! |
. I; I- t0 K. l9 |# m) V$ ^1 R. vl
% T" {2 h3 }/ p! w
_TSD8 w1 L8 y2 G) E" u3 c: v4 P

: w$ Q; u: L$ b/ E5 X* ZT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
. O0 U5 f% h2 |% z  U$ S - R/ O( F* d: t# [" ]
Name (_TSD, Package() ( F3 q* s) p+ g5 Z8 Q& r' X

/ P" m+ L2 c+ O8 t1 w{ 9 x+ B" c* Q: a3 t

% I" m& N$ m; S! pPackage(){5, 0, 0, 0xFD, 2}
( }& f3 A. ^7 J- L' G- F// 5 entries, Revision 0, Domain 0, OSPM ; T4 R7 }! M3 ^: j2 l- x, F: K
Coordinate, 2 Procs
7 l: ?; H8 w& b* C; A
7 F* A( ?  q9 i4 R8 g0 X, S1 N! a, ], P& t7 j
}) // End of _TSD object, C9 i$ j1 _' m1 J

3 w8 t, Z5 I, \' vREFF:
% y  q' g& L- I3 M; N& \  k1.
/ m2 N. D8 d3 b. O! a3 t0 aACPI Spec 3.0
2 L$ }4 U% G: i8 \, a& f1 @. a. `2.
* L/ k" q( Z% t! N& jIntel Processor vendor-Specific ACPI) t* L- c! K; K6 o
& E0 O6 O' t8 }9 F- T2 S

: v  V+ Q! J+ K* k' {" b- BThat’s all!# _2 R$ P5 q3 D/ u0 F! H: W

0 N" {9 J) ]) v: W. OPeter
/ Z" o; H! x% C, s9 D8 a* A
8 Q% q# Y: y8 o5 D- Z: J$ \3 Z2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:09 , Processed in 0.050122 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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