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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
: F. m* k5 o( z$ C4 }/ }5 Y
1. Overview
' Q+ {4 E5 h; V! V
5 i3 n% j. _! p7 k7 Y0 s" v: ]
* L( @: C2 x- |- }5 `- u4 u% @! p# fC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
: |8 o6 u! C5 q+ S: _降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看* T2 f4 E: \6 S1 T$ Z
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。) A; O" H$ f1 M0 K- s6 h
1 j* R4 d+ b, u5 V
cstate1.jpg

- Z2 x4 b& R: ~& P& Y3 ^$ c+ L0 o: u
1
6 j  i. l) {0 @3 B" F6 }# \
2. C-state Control
% j3 U4 z5 b/ m' x( |( z
! n+ [, h, [5 n* {' F8 Z1)
8 L% c% p& _  I( J7 |. jDetect & Enable C-state/ j* |0 C2 ]/ [6 B9 m
5 D  ~6 \& M* m, c4 ]
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的支持。: W( k8 P$ w1 P1 U! Y8 i: H4 W9 W$ o
+ e; P& Y5 M% |/ \. }3 K+ M- m' L
2)" E9 j: a( d* |5 N! @
C-state Basic Configuration
6 f5 Y  j6 ^% f! m! [, }; V0 Z通常情况下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)。! }6 Z! C/ c; m/ }1 m$ }2 F
; V+ \$ q8 A) k# ]5 v; y$ C$ Q& k
3)! d. C! u, V6 \6 n3 W
ACPI Structure For C-state
6 @  f% i. [* v6 j# z) `$ ^! w: E
l
& n# Z8 U7 U( \8 F1 g7 J
_OSC & _PDC; _+ [5 q, l5 p( C
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures5 K. ]9 ?; s9 I
l
' @! `, c# _+ f: I1 N) y2 H- f: c) }& Y
_CST
, ]) F, c, ?+ {- D- i/ J_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:, Q4 b( u( `* k% V1 \9 m- z& x; c
CSTPackage : Package ( Count ,0 W& h$ L+ F1 F; Y
CState ,…,
; s& o* n4 I. ]6 }5 ]6 H& zCState )
( G( L8 D3 |$ O; e& R' }% f其中Count表示所支持的C-state的个数
- N/ @% o! o$ s+ h7 x. w) CCState: Package ( Register ,* o- d+ q% M4 }* k& V) L: d# f$ V
Type ,& X/ T- ~+ ~& H$ n) E; H
Latency ,3 h' H2 i6 s. }' j
Power )
& k6 ]7 H- l) b# E
7 I3 v. }2 h$ ^) i& I# `  ?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 C31 c" N* i: N. n7 ]( H9 _2 q
6 f+ W& }  d& h% c$ Y2 R
Name(_CST, Package()" N" `8 U2 d2 h' d

! [, k9 l) l- z! V8 e2 ~0 O{ 1 j7 X) f: i5 X' e( c3 }2 X2 ^
4,
+ n3 _. @- W9 S6 ~4 J; H  ^// There are four C-states defined here with three semantics
9 j( \  S8 g' J! L$ K  X, }8 ?

2 ^4 p9 H8 y- n: b4 T9 W// The third and fourth C-states defined have the same C3 entry semantics. L5 c. E9 C  t, L) s
, i: U9 p" T$ @7 s4 a4 I9 L
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. J8 U% D* R* H9 Q" H5 v9 p; j1,' s$ \6 R' S. o1 F& }
20, 1000},
2 f0 o3 l3 I' H3 Y9 h5 p- V' r5 Y

: b# q" J% G, p7 t) `: kPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,; T- t: [$ r9 W
40,
9 v9 _8 G% l' b8 {- S  L! F9 `. B750},
: u+ ^. w9 C% K# |
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
9 D) P/ h" [- T- a2 k4 w! N60,9 r: M9 l! i. i: R4 I: K
500},
; j' P9 Z8 j( F' k& E( Q, c& B
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,( D2 F1 Z. S% }( P+ U1 X
250}3 R2 Y8 M2 V, i! a% p

/ P  N. l  Q3 U; j})
- E5 {# ~' z& a: |$ t% f5 Z+ u( O/ ^( ]* _, K8 p
l" Y8 N/ H2 t3 @- d* J4 D6 y$ P
_CSD3 Q( K& k" G/ l- K+ [6 `9 {

9 V7 s" T7 g7 J4 X4 K6 PC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
9 w: @! r/ Y2 V2 p
+ k+ f- B6 y5 t$ ^: s9 `; U( |; X) `
2 j# s& c2 a# r/ x8 a0 g& d
# g: |5 C; K1 ?, I, |" P
# B$ N0 ^) y6 y* _! y3. P_LVL VS FFH
/ Y% _  {8 o9 p- A
* g' S% S/ L4 J9 l' d8 m4 L% `P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
) y1 _* m# u% Q  ~& J, UFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:2 a" I5 j, r5 f# L, s& u

3 O. C& q! c# t, t
gas2.jpg

: `" x  U4 W+ v
2

, h7 t6 z) ]9 g5 rOSPM解析到该_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的一个例子:
2 r: v0 G. b( ~8 [Name(_CST, Package()
! C2 z( Q5 q! c8 ?3 G- e- ^5 _

6 u. h0 P+ h: j7 p) j{ ' t5 w& Z1 B8 X$ I% H* c' V
2,& w- c, L2 Y* H
// There are four C-states defined here with three semantics

$ Z4 e% {. z, w2 s$ n+ a5 I
( G# u) [3 F/ x5 O3 j  \/ @: A// The third and fourth C-states defined have the same C3 entry semantics$ e! v4 E) y0 J8 ]: w# `& T. S% W

" m6 _! @) U/ c+ D$ g% w1 xPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},% R3 o: u8 D) `" u: |6 ^" e
0x01,( B% B9 q  |/ `$ }, z
0x03, 0x000003e8},
- x) n# t; B8 [, n& Y

* ^" f# P' ~0 K5 yPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
3 ]% H7 l' q9 f0x01,
2 F% L1 Q/ h; Q$ T) d3 K0xf5, 0x0000015e}
) U4 j- Y  E. F1 |6 Z  ^  L
}) ! L" R' s* x/ N, [  @; E! S4 O

# x6 w9 i0 ~4 U9 u/ q: @4 Z
: j- W5 Z, D5 ^) R/ N& c7 tREFF:8 E4 T% }2 D2 H( }1 G5 X
1.0 V! C- d6 Q; v$ }
ACPI Spec 3.0) C: D, q8 B) D6 h/ L
2.. j) {/ Z' m. C5 h# z3 z8 D
Intel Processor vendor-Specific ACPI' ]) S; P% I  L: x* h# H
! {' ]: L4 D9 q( w& {: X
8 J0 r9 k# g- `1 f# g
That’s all!
3 |' e* t3 W: a+ S+ y2 [
/ F! y9 |' p9 _& ^( @Peter
9 N' [$ A4 E- Y8 i6 e7 S* w: G: H3 G; F3 C% k' Q( F+ n, y
2010/9/20
6 K5 `+ Z+ f6 K' c* T: F) t# r% u' I( |* _+ b. ?
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
; m) H& H2 q- Y, T6 W8 K ! J; [/ B% k( M8 {8 c, g! d
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST3 e( j+ P+ O1 s# n" M1 v- t- E
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
( Q4 U3 {, Y' J3 [
8 S5 _+ v- b6 l3 R" L2. P-state Control
: h9 e3 T! [# a 0 G: n8 o4 m6 W" q3 Q5 C
1)4 g+ T" r0 L4 P" U  ?7 `8 {0 f
Detect & Enable P-state
, o. L# K& |8 }  I/ t" Q7 u; Y
! G; A4 C. R0 |% RBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state: ~$ d& N6 r5 t5 F

) K$ }3 q! }3 M, ~  @5 Q) J2); L6 [7 f2 i4 l6 q6 U
Supported P-states
: b  N8 S" B( R0 J
3 B( l3 K% a# v: Y/ nBIOS 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" I6 G6 `/ x# L

- i/ W2 v. p) y( r% `' i/ L0 mMinRatio = PLATFORM_INFO. _2 I% c2 a$ Q: L; L" R
MaxRatio = PLATFORM_INFO9 I" t' `" _3 m$ `. l
RatioStepSize = 0x011 L$ Z  ~9 s7 D" {) [! A: j  N
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1( I  g2 C! M8 r8 O  R

1 B0 ?2 p- R3 {' y/ tIf(NumStates > 0x10)
2 z& U0 c( N! B$ ?# V{
/ ~! ^0 X- z3 e; {, v4 lRatioStepSize += 1* R5 ~$ Z% m- G; N
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
6 J, w! s: t- g' |}
( L( P1 N& C$ R8 r4 f7 V
' N. x, K: w$ l3 V: J, i3)8 t' l: F4 ^1 ?6 Q
Turbo Mode( ~$ H& j" l* ^! a- V
% v& Z7 G+ _" K( s: e0 u; m# P
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
& O5 m- N8 x; Z5 a* M
2 w' c- h4 o' f, o) [4)8 T( o+ E' z8 G* d: ?8 h
Over Clock
$ L* K) @$ E& d9 C
; e0 v9 v4 ^/ ?某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。' {; |4 W) v# G! m* @2 H+ |6 ^

: u/ e8 F. g7 s5)6 ?4 J. Z) d2 m8 C
ACPI Structure For P-state6 L& l9 C& p1 I

6 I! X7 l8 X& x6 R& t2 Tl; A2 k) a# U* c6 `0 k
_OSC & _PDC- J8 x1 y! k4 X) q4 {' M- i8 `
: M& ?5 b+ E( H/ M6 ]# d
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures/ g& T# A/ c* P- w/ f1 R4 X

) F' S( M0 |- T$ W) Hl3 b" U/ r5 ~# V) p4 d
_PSS
) I; V0 q8 t8 n4 o" JPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
& M9 V& {% E9 ]并且通过一个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做比较$ q) ~  m3 p  {& G# M% [0 a
以确定P-state切换是否已经完成。4 r: s# k( X  O  W" A% y, E9 A

6 {2 L% u$ H1 r2 o8 ^Name (_PSS, Package()
) U1 S- L  E; }7 R0 L" `9 O{4 M% Y4 w% r6 _- i& N) o
// Field Name
! m7 h5 L/ }# A6 A3 E% JField Type
6 Y0 Y2 ^3 }$ A$ Z% W  ~/ w, p  v
: r) {% c3 t( b( M8 |  D2 B. K+ U

+ f5 E/ |0 o3 X8 LPackage ()
- r+ k- Y! |* y. u// Performance State 0 Definition – P0 ! Q) g  c: k2 Q  }

7 v! c4 Z2 O* O& h, [{* ?2 m( n& \  E: b/ B1 v0 ~

9 U; o$ d  g3 z/ Z- k7 K* d' }2 a# ]
0 e  q/ n0 n9 F# s* x% [CoreFreq,
6 e0 ^( @" S+ b. j. _6 K// DWordConst ' Y  b# m; o- ?
) d7 L# y9 ^$ L1 Q
# O0 e$ m( `5 s" h* X' n
Power,
+ l1 W- B. y  {8 j; R8 d9 f; w* v* C* O! ~// DWordConst 5 e$ w+ I6 n5 ]* Z
) x9 y% v$ y3 N2 M! d4 g4 A
TransitionLatency,
) H! i4 J- F. n: }) p0 S" I// DWordConst 5 J' o( b( L( M0 f

0 S% V7 _9 T* N1 b% z$ U  D$ HBusMasterLatency,
8 V" o3 `0 ^% }+ d0 W. l( _# B// DWordConst
+ U) w6 h5 @. |$ M* j0 Y) R/ W3 H. S" c
Control,1 F  A& Q' d6 `, s) B$ \  ~% E
// DWordConst
8 T: u9 q3 O" k* C8 W" @  I2 D$ u1 @2 j
Status0 H/ u! }! t0 X% @3 v

( h' i5 D# [$ F" E// DWordConst
+ J' m+ R# p( K- _) T; N
0 ^* B$ Y4 C- H# v* Y% U; Z, v( }}, 2 C7 ~$ s1 C. i# Q4 r

) Z2 r7 D) g7 S$ {& D3 @. 0 q6 t$ M9 N' S7 _- }8 Y+ |

8 b2 \! B& O8 E.
8 Z% `3 g1 z( M  U5 Y9 `
4 T- x( @6 j7 G5 L2 e) w. 2 X( Z$ w0 \. d+ ^1 h
}) // End of _PSS object
9 K8 A; X* d  N, m前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
4 z. }9 H: f  \( B1 z
5 t/ {, d" b4 j1 B: g, y4 zName (_PSS, Package()
! a8 H2 c& S; I1 l- v& \3 M/ F  v2 \0 w8 z
{ * ]# n5 J6 J5 ^+ J, v% W
* U% L2 ?/ y: P, P9 O1 Q
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) $ v* b, n4 F0 l: \& O0 q# w
$ |' W% Q- P" A" q# o/ U# r# a
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) / l  ?' I3 z1 L6 q/ q6 f+ L$ @9 J
8 ]) L9 r1 H* G; L# V, V
Package(){1400, 8200,: q/ h( ~; ^! i8 U
10, 10, 0x000E, 0x000E}' c2 r. d6 c" W* u# Z" n% \
// Performance State two (P2)
/ V4 X$ C$ S0 s$ K/ p( g- h# uPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
) B4 J3 Q8 ]; s  s8 m9 APerformance State one (P3) 3 F4 }! Z: {; v$ N7 S, I7 H8 n! l
4 h4 l* d4 {) J
Package(){1200, 8200,
( Y2 h5 n* L9 F4 d/ V10, 10, 0x000C, 0x000C}; M! J. e  U1 `) {) w1 C7 ^- i
// Performance State two (P4)
' j5 g: {* E' Y7 g
- ~) L6 q2 }5 s9 u) W8 P9 B0 b}) // End of _PSS object3 G$ [8 |4 X' w% u0 i) X+ ~0 B2 m5 S, B

5 ?+ @7 m8 f- V+ E; ~另外当该平台支持Turbo Mode P0将会reportTurbo Mode
: _! d/ _$ j* \! ?
, J% L2 ]: q" g2 n1 Y0 Ml
, n. @0 }9 G3 T1 p2 d1 D0 B$ }2 {
_PCT- d% E0 d1 w! O

' o. F8 a/ Q! b, J9 s4 b9 _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的方式来进行。
) j  }  n1 ?7 S1 ~ , H: r% C# B) J" f5 q/ W$ Z. B
Name(_PCT, Package ()
' M9 t5 d* @1 v- k/ z: t4 p/ {4 B! U// Performance Control object
8 N' ?' t! x- b0 D
7 P' Z, h8 O; E0 e{
3 a+ `8 Q/ P. }- P* e
( J% Z- V' o& i: F! vResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
- i+ x& R+ |1 p# ?// PERF_CTRL
) L3 @) w1 A# p: h5 a
; Q3 l$ p7 B9 L+ r/ NResourceTemplate(){Register(FFixedHW, 0, 0, 0)}: E. x- f$ b" M) B/ X* b# Q) j3 C
// PERF_STATUS
% N  x) M8 E% r( z3 p
' b1 N" m7 e' t6 ?% e6 v& Q}) // End of _PCT object
) ~0 Z5 m; N- w) \% c
6 U5 |0 K4 `) k) {7 ~l
! J/ W* Q- P' L3 ?. E
_PPC. ]4 Q4 ~( t) ~- M& M9 r4 q
+ ^" k8 w& T2 m+ 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-states. [+ A, f/ {$ f( N. x

! o! U3 u! k( T) FMethod (_PPC, 0)& I7 {: ~! e. D0 k6 V/ b
// Performance Present Capabilities method
4 |* Z" S% U0 D
4 x, C+ W! o. T4 E{ 2 V$ Q. p$ Z; d
' I( e5 d: c+ T* {
If (\_SB.DOCK)
0 ?, y4 {$ W8 ]/ v4 h3 B5 H6 b1 o; ]$ o" J6 c
{
( J! }4 S: O9 l. }( G
# K, s* q5 U7 uReturn(0) // All _PSS states available
2 V- E& m& B/ f: M9 y  l) _
1 ]+ f1 D: j' V$ k2 P6 S- k: d" m! `2 r9 u$ w! M
}
0 P4 {4 X+ S2 ^" g/ Z0 j5 i7 t& ?" L- Y3 W
If (\_SB.AC)
0 s4 o( }+ R& C7 F
8 k# z! X2 C' o: \{ 9 [, Q4 y+ N6 Y9 W  C8 B7 l) V# ?

/ S& k% @4 ~& p0 \: w- yReturn(1)9 c, X/ @" M5 _: H  U; `
// States 1 and 2 available
: u! S3 ?1 N$ ^. Y& ^! \& I+ k6 o% m  O8 e
} : g5 g: V! e; X
7 Y; J& p' V3 G8 I# p
Else 7 p7 w+ y- u) i( U6 [: o
4 m: Y( `4 }* b, |% ?
{ & l( S# X+ R0 D% @/ m2 I
1 I. m7 l6 {6 J% y9 e  n
Return(2)
6 i0 W- e$ S' P2 L) C6 _5 c// State 2 available- W' }6 m" I- n1 F' Q3 E" m+ X

. Q; Q4 k# _& b2 O, Y}
0 L6 m$ R9 d6 U: c; m6 }! C$ f2 ^' N9 V, u: g
} // End of _PPC method
2 M0 K$ X- h! E7 A& Z: Y
* T# f) f; L' ]) Ml
) O4 }% ]% x, v) |! r9 R
_PSD" y( N6 k7 P* n
& J7 K: o7 ^2 U9 v8 G. c
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。' k) r  `  d5 X8 d) g

4 h. t' g& \4 M; ^. g. CREFF:
* h$ }6 f0 h1 D: ~$ k) C9 K' d1.# C5 C2 X6 E  z
ACPI Spec 3.0: V# X; S6 j. y  K3 k1 ~4 U
2.& j+ X, d. I' u: ]4 w8 s& N
Intel Processor vendor-Specific ACPI
2 F# K! l) G9 M0 K3 S& }* z $ b9 A0 o1 @$ f( k; @7 T3 v

, c) [: A4 e$ P# Y/ ?That’s all!
. j4 a2 Q* H# f& |. _
0 l" U! I. E" v7 U6 ^Peter- `. [) Y( Y- w6 `8 u3 d
9 L+ V5 o" h' |2 {' k( j$ x* d
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
3 K6 U4 d% ]2 U: Y* r8 V 3 v$ Y* A" l9 C& Q+ B7 L
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工作时间的占空比)的方式
/ P+ ^, R2 I- ]! v, N! x2 M,影响系统的功耗和温度。7 K" [2 v+ C& h9 ?6 `- L: N
5 _8 H5 f% [* Z0 Y: q5 }, y
2. T-state Control
6 U* t" j) D, ~5 j6 o
0 y  S4 ~% M! |9 m! x1)7 b+ a  t) [( A2 T3 [$ F7 e
MSR Based Control
1 ]' X. l6 l# B& r8 F2 S6 v  m- z
4 f: V: @; C$ K2 {& aBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
  }$ M% m. |: C: |& ?% @# j; q
; U0 h; g! _$ c. _; N2)
) p' ^. R3 |! _. uI/O Based Control" Z0 ~8 G, R; K$ i8 K- o
* t0 k$ ]+ T6 z
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
2 n9 G& i' y/ p% ~
2 r4 g% y) K! k4 m3)% t/ q" a+ i% u8 m, V% W/ Y6 z
ACPI Structure For P-state' s: f+ J! }3 V2 _6 Z5 ~
l9 ^+ h) x. ^2 M" n$ ]' h
_PTC' @9 w' e9 u  b  C& p
* {) p4 Q# g. o8 ]6 i5 F0 o* L+ G
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
. N5 g: S6 C9 N3 G* t , [  i; H* F# S( K* _; p
Name (_PTC, Package()
2 k# ?  s# }0 f* x& f1 H{ 3 D( H$ T0 ~1 [
' ^, Q% z2 L1 [# w
ResourceTemplate(){Throttling_Control_Register},
6 H. @* H& B1 X1 ^//Generic Register Descriptor & i, R: Z, `4 n) H+ v

+ }5 N$ }5 t" @( N1 O, U. OResourceTemplate(){Throttling_Status_Register}
6 a% ?- C7 ?: |* X4 Y) R2 C6 P& e//Generic Register Descriptor 9 {( `7 O& ]# q! y+ W
}) // End of _PTC
9 E# W$ i2 Z3 n$ N6 ^; M
# K) N/ }' O$ z" i1 N. n0 ^下述是一个sample code
: @' W/ H8 `: r0 n. b / [  V! J3 `4 a7 A8 \4 [+ I

- h' e. K/ F% K4 x' r+ g
//* j! [# _+ }2 Q$ l: q8 X/ {
" J" U" s2 k& q" i& P. v1 b
// T-State Control/Status interface2 P" t9 h- {4 @
/ D" r8 K" n  t/ `3 a5 q0 T
//5 s6 g& B5 o$ u. |
) X& K0 }# m9 v- e) k( s- }
Method(_PTC, 0)
. Z/ x' b. c' {" x* Z
% p- W3 Z* G0 `$ R- C{
9 F: N/ S" G$ e7 X2 _7 k% m$ V, E8 m; a0 T: \# L; x
//
# Z8 M1 g2 H% b3 ?1 K6 m: t# u. C* ?7 a) @% ~
// IF OSPM is capable of direct access to MSR
$ n8 D/ ]5 p$ i1 f
; ]4 R  B: k* E0 [" j# a//: K2 k% E* o4 x3 B- C
Report MSR interface/ Z6 |! \6 k+ K2 u. ~
9 n% p" p3 \  j7 W- l
// ELSE& t% u. J2 s# |% U% k$ z( A

$ r9 e& }; b2 M0 @9 {1 i//9 O5 h% i* F6 f
Report I/O interface
: G) r7 j2 A2 K6 ]- n7 h
1 k+ x6 h) {/ P: x; C" M( O) W//
7 K0 v3 X" Q+ @+ S" D% p5 H. [
6 y" e8 _8 D  p//
! R7 ^0 @  ]. ?$ W( }- \7 V$ b* wPDCx[2] = OSPM is capable of direct access to On
: I! \% X. M- ~% I5 f. N4 T
% k$ h7 w" i' W! @8 O7 o! R/ P//
1 ]& P! P9 ~$ o# S" M& D8 }Demand throttling MSR
* d9 l; n+ O* W) K6 W$ g/ Q, D& y1 s! p: F: o, R
//9 L) n1 D" {: l% Q3 r

% Z; q3 P  ^7 E: o  M" zIf(And(PDC0, 0x0004)) {5 ^0 z' J8 |% l, q+ u3 u

8 r$ j- `# @) w3 sReturn(Package() {" w0 [# Z0 f. W% {
/ e' L$ N) [8 y, W' S( R: _
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# R( @  p$ l9 i* h% w1 `! x
2 p5 J: S( N" V* ?6 n- JResourceTemplate(){Register(FFixedHW, 0, 0, 0)}  e2 o+ V6 P8 v: e5 {6 S3 @' S; R& Q

7 o7 d1 w8 }2 q& J: V})+ u) P2 d6 w6 u9 H# d1 i
- n, Y" D9 K9 o% a2 ?* d" p
}5 r$ ?: M6 K7 ~

, V' c8 R  d0 h0 e0 i2 jReturn(Package() {9 o  y5 _: P# s

1 b" I7 j* ~) o: ^+ Q; ?9 A- O' VResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},! b" w" w# B+ O( R+ d/ h

6 T& ]0 a( P. M  O( w3 S/ \9 ]ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}2 H- V/ o6 ]# Z% B( i

6 \6 ]  p' a3 I) [' R+ y})& w$ H- m" U0 d+ h7 D

2 C: A) w5 H9 h3 b8 h}
9 ^8 s4 u# P7 {  s* N/ @  m2 y8 i
3 `% w* s4 X' q$ s( [! A' _
" W8 ?1 e6 h0 @
+ x! B% g1 w9 F3 Bl
7 o# h7 o& D8 a4 T
_TSS
! w/ d) P% q) A% Y; A" w# S: u6 [
" D2 y. R+ k: B1 GThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
9 _" _. X( Y( d. ]- ^0 gName (_TSS, Package() # h. J4 t5 E3 t# m$ x: E4 Z
{* u6 \# W; Z+ r$ W, M
// Field Name
% V8 e1 X  K7 b& c" T& P( rField Type
& @+ i. U' n3 u7 Q1 C
& _, c. a. n3 P: a
' A6 |, t" A( L+ e1 ?2 I3 A5 c* \" ^6 a+ `: h
Package ()
# i; k0 }8 T2 `+ `// Throttle State 0 Definition – T0
( C3 n- o; e; N5 v& Y* Z7 w" }% p3 z" w+ f8 g, R! L4 T$ A; K
{
* d- `& W7 c2 ~9 p; I; Z" i: p$ r5 D& N+ K& h  c' }: a0 _5 s6 J

8 n7 \# ]# I7 GFreqPercentageOfMaximum,) [; f* q. p8 ]5 ^% \2 O. g- l
// DWordConst - Y! g2 [7 O; [- o" K, U' M  J3 m6 H

. Q1 v) ~; ?0 s/ Q9 [Power,8 G& e- k0 W8 p" G
// DWordConst 6 i( m9 s4 N7 K8 k* k' X9 m$ Q
  m9 ^0 R( k% i0 @5 c
TransitionLatency,
* N4 h! X- j' p- g& f; o4 H// DWordConst ( B, `+ G# w7 |( w
. w- D+ A2 `; s/ W1 a! i. g7 b& n
Control,
1 ?% Y# z! |" {7 u// DWordConst 3 F3 [0 t7 d/ `5 O0 O

) T7 Z4 T* i# {Status
- ?/ D; n" q" ^// DWordConst 0 \) p$ ~8 L, S" V
},% F4 Y. ~4 y1 P+ l! A& Q/ J3 P
……
7 {* O. ?: C$ v4 |}  s0 }" K; F1 b. c
% B& _6 c4 r8 p) C: `
Example code 如下所示:
( z0 v( o: U" j( T' R4 b; z. z6 x' ?/ Y# }, |; L
Method(_TSS, 0)/ f7 @# w8 d2 D* a7 {
6 ]1 `3 X( C+ J* a
{
1 l3 g% {- d. M: z$ B, G
% N8 _. w3 ~  x3 B( p- m0 sPackage(){100, 1000, 0, 0x00, 0},
3 _' |4 Z* s7 \1 E+ N/ j
+ u) a, V5 S- I- E: sPackage(){ 88,4 W: Q/ ]! K% S3 G0 R6 B
875, 0, 0x1E, 0},
+ x; L' k3 X4 f( ~! G9 v! ]
  c* |7 s( h& y$ z' X0 JPackage(){ 75,
2 S% z( b  j, o7 ~750, 0, 0x1C, 0},  ~, {7 U$ V8 a; P+ B
# S5 J& q; E+ m5 L/ S9 E' g
Package(){ 63,
/ s8 M, ?2 @+ ?; p625, 0, 0x1A, 0},
; N# j& Q3 N! H" J
% L( a  U+ v5 BPackage(){ 50,
4 P7 u* U4 U, Y5 f) i/ E7 \3 f500, 0, 0x18, 0},; h" i3 p0 h& t8 G) c2 c
# [9 R" u( T0 k% k
Package(){ 38,
. ^! q( h- m7 s; _3 u375, 0, 0x16, 0},6 q6 h7 e8 }* f' g

& ?$ _- k6 D5 ^4 M  uPackage(){ 25,, N. ]% v4 b  Y. o4 F
250, 0, 0x14, 0},
4 R* z& |0 u9 u! I) L1 f6 E9 i/ D; ^( B* A
Package(){ 13,
2 C7 _) E' V- z' Q% D9 ]) w& y4 x125, 0, 0x12, 0}8 }9 x# w7 v% c4 r, `; \
& G, r2 J( J5 H+ e! d( g" ^: D* Z6 z
}
4 |4 ~4 a1 `% ?" o7 K% }, o1 f: X$ M; Q2 [6 l/ [
, f- C8 g/ z# @
l
& i9 q3 m; z8 q: S. _# r' m% S
_TPC9 a. T! |8 x) x) l4 H  @5 u

8 u" {6 Q+ q4 T1 ^# a% ZThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
* k& D* D7 \  h& t+ }  |
4 o2 ?) ?* A" B7 {  P- ~l
1 A; x6 e( q' N1 D% A/ k% b
_TSD
) m1 H- C# P: h5 B: Q 5 s; `/ P1 B' `+ d' [! |
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
' N4 h. Y: d' e2 i' Y+ j. T
3 f5 E# d$ Z& WName (_TSD, Package()
7 a5 [0 R1 ~/ y. g+ {
: n5 {$ V" k% q+ E# K6 v' k1 g7 C{ 7 g& {7 K1 W& F) t! S
6 _: q! z7 q* F9 L, _  s5 v4 f
Package(){5, 0, 0, 0xFD, 2}5 Z: t4 c9 [) j3 e* h) l5 ^1 l- b
// 5 entries, Revision 0, Domain 0, OSPM & [: X/ p7 f  V- f- b, O2 k4 {
Coordinate, 2 Procs + o  }$ n: r. E# |& ~

8 E, W) Q% o7 E( U& W7 ?( k! }7 e( ]/ U
}) // End of _TSD object* v; U8 |  h& i$ J7 v: G
( S& }7 Y$ @: l* x0 h  _  l
REFF:
5 y# X( |$ `$ j5 O! H1." e7 J. _4 m+ c) ], b
ACPI Spec 3.0
+ u  R- j; S+ v. V, s1 O" U2.2 b2 H- u" q- E- L& J( x
Intel Processor vendor-Specific ACPI
! p  S  u) b0 I , A/ L0 v0 R3 k. \! f0 d1 g. [

8 X1 v, O; |5 }+ r0 N5 W  KThat’s all!
3 i5 J/ }9 p  R' Q4 _ ; n; Z; A6 ]0 \6 r1 B# T* @+ k
Peter
, u8 J1 C! [4 G, S7 T; ]2 K ; t% Z# q! A5 }3 S$ y4 b
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 12:44 , Processed in 0.661648 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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