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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
) K8 _4 S) E  j# e& F
1. Overview
# m- h8 N& U) _; k2 P* h
0 c  z6 H1 Y, B% q7 V% Y2 ?" F" o* C& D8 J6 k( j5 X7 B
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
9 t0 j* p# W+ I* T: z降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
( [- k$ d' d; s( \比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
  y/ e- E5 @0 k; a3 P" \/ |( @( F$ D
. u# i0 W. V0 W; k" G3 C
cstate1.jpg
6 W& I% K  F2 \% y: @' @
1

$ O% e" j9 Z! k, x2. C-state Control
6 F* l7 ^9 v1 a8 V3 }% `, s+ a- r0 q: g. Q# S
1)
' \# U4 d0 z: {, \. hDetect & Enable C-state) t# b: X3 Y& q9 d+ S6 O. x& U

6 p+ s" F3 ~# f1 v2 LBIOS可以通过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的支持。2 t# b7 ]4 K0 n+ P+ ]1 `$ N) Q

- ]* ^0 E( s0 v; {& T) A2)
* V3 c0 L/ s( I. t5 g0 aC-state Basic Configuration
. X3 O1 Z5 f8 K  h4 l/ D通常情况下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 J( D. \% C6 |. s! j
9 N- Z4 U3 e; u  U* P
3)& F+ ~- c4 T( O7 H) T) \! q; h
ACPI Structure For C-state3 o, C3 \" w8 J  E& h  M7 y

" B+ O. m3 M6 A1 G9 z* zl
6 f5 k9 ?" x+ I
_OSC & _PDC
5 f+ m% }7 w5 T# S5 u_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures- \/ E6 H3 m% W! F
l
2 z# e" E2 T5 Y6 A$ G
_CST
8 s9 y+ p$ N4 i. D_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:4 y5 @8 h( `, z2 d% i: @2 K9 h
CSTPackage : Package ( Count ,' K7 X6 f5 |* N0 g0 g# Z  c
CState ,…,) P! o! p8 R- h. J
CState )
: M1 t% t  j. O" h1 b6 B4 \$ c, ]其中Count表示所支持的C-state的个数
5 @3 [/ m( J$ g) L" ]; B5 T, ACState: Package ( Register ,/ }8 C% u+ A5 W% C: \6 g4 }% D  j
Type ,
! z1 p1 j2 L3 C  T2 I3 zLatency ," [" |; Z4 L9 F* W
Power )
; n7 v; ]6 y" C" @8 L" X, \" x; d: u% M! ^- K! k% ^3 v2 [
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 C34 m( {1 c; _# P: g+ n- @
* [8 S' Q" w* `
Name(_CST, Package(). s! L- w$ [4 o$ E( b

$ q  W; |% ^/ L2 u8 H$ [4 m{
! j3 m$ X0 P  C2 j6 s6 ]0 S4,
3 R" A9 v% Z9 n- l: k- |, L// There are four C-states defined here with three semantics
) E+ Q/ m9 i: |$ n3 H+ W. F' |

4 B6 R9 I3 K4 p, Y" w5 \// The third and fourth C-states defined have the same C3 entry semantics
5 L: I- t% C! a4 G- c2 k
; c- F$ P9 k" \0 ?$ I9 B5 }0 T7 |
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
7 U; P( \: G/ _& }' E3 T1,
( Q" \6 w4 M1 i8 a' k20, 1000},* v" L7 l- [, |9 y, M5 ?# r

0 z1 Q2 A& N' l) l5 I  ~" v' CPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
5 W7 Z" k" I8 h; H7 f5 e40,
6 u( _+ n9 D4 y, K3 \750},

1 h/ `1 c& ~4 k- U! T; A, n5 X7 nPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
% y) n3 T( h* N: ]! F60,
, }8 G, g' I0 u4 F7 _500},
; q! h- D4 K7 q' O% X
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,% ?  K8 n# i! j
250}
# Z* ]  z1 }6 A+ u8 [. R+ u

5 p5 ^3 w+ y* z}) , ]$ `1 q" `8 f+ D9 r9 _

' n$ Z- o4 m  T, b3 }l  L7 E% W1 d: k: v- r( h6 U
_CSD* t# l+ {3 }* V" Z
8 P( @/ R( j+ r' o
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。' H0 A# Q/ O6 Z8 Y

( T  \1 y' \5 o9 P( n" e8 [: m; h
. [; Y# |3 r2 O) z' ?; V
% P; J$ i: P7 z4 X
. S5 J& Y- ?4 \& h6 Y% ]" @4 Z3. P_LVL VS FFH8 R/ o% r% l$ A! E9 F) A/ C

) p$ S3 s& V. s- `% vP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
& r2 e5 U  s- ?$ [& AFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:6 P$ ?8 i( p+ [0 b( R& k
$ E' s" p1 C( C# |* s
gas2.jpg

8 }- g' q  ^* m4 ]/ v) o
2

7 @  e2 n) u: K" w2 COSPM解析到该_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的一个例子:3 m! W! i$ X) ]1 s
Name(_CST, Package()9 X8 ]  [; N, @' S9 B, i9 P

6 S4 K/ ]( w" O/ `) {{ 2 U+ B; Q) ~% C0 V. M1 A
2,
- v" N, O9 H& E0 K2 F* S# L7 s! p% d3 A// There are four C-states defined here with three semantics
$ i$ R) _8 a) n  e

: ]8 w  L' t/ D3 R! O8 O8 S6 ^, J// The third and fourth C-states defined have the same C3 entry semantics! g5 o% u4 f1 D5 j

6 x& l8 a# G- n$ JPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},9 T" t# t0 }& X5 j% i1 T5 J* u! Q
0x01,) x* _9 s+ |4 r4 K$ N
0x03, 0x000003e8},
5 I( q! @! {$ s7 u# B1 X5 G

+ E7 ?6 ?& Q! S# ]! |0 Y5 U* |6 VPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
9 [. r  z2 ?( E; f/ T3 E0 f0x01,
1 Q3 `! M' t9 o0xf5, 0x0000015e}

$ W) o( c$ m# i/ N1 _6 n* w}) 6 l8 }1 h) \1 h9 ?2 H2 d6 Z' q

. x3 t! V$ d) P1 k2 Y3 b* \7 I# f  q$ ?7 Z" R- k) _  k  H
REFF:
' t, F6 i2 }/ v1.8 P# ]# b1 [7 z, j* d: i0 @
ACPI Spec 3.00 e6 ~; ]$ [8 k- [/ ~7 g
2.( c7 y+ N: Y5 o; z9 {' J
Intel Processor vendor-Specific ACPI, ?* S. ~9 R9 A  v3 _3 c; h. \
! O7 b, d: W+ G  X" |' T' Q# n; i
* y) s- A4 X& ^$ K0 K' j8 w
That’s all!7 y- m. n3 q0 w: e3 m" L
. D4 s4 U5 A, E' F8 ^
Peter/ Y: n" b' i1 p; v8 ~0 H

( R  R( W% u  ^2010/9/20
6 m9 t9 L+ e1 m. a. C+ Q1 \: F* H0 T, b2 e" ]6 V
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview7 g  y3 a! Y4 E2 Q
5 f: o/ j: c% _) J, @+ x2 D1 i! }
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
( s, Q* M# k: i2 m6 a0 xEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。( N" ]8 w! W* D, ^- _3 }
9 e$ l: H% ]3 C/ I' Y" Y# e9 X
2. P-state Control7 c: [8 W* F4 s! k* x
8 w8 }# _! ^/ I' V1 Y3 _
1)6 b$ S" s6 c& S+ f) h' ~! J) M) \+ R
Detect & Enable P-state
5 {1 c' I! }" V) ` " Y: a" ~1 n; {$ W/ p$ h
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
) v. m2 U, R& z2 r : p) J5 ]2 L% P0 Z1 t& u* H+ F. m
2)
+ [) l( d; ?$ l( M* x0 O1 ]Supported P-states% H) D3 J+ [3 _

! T4 Y# N4 ^6 w8 zBIOS 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
- S. ^$ k- c# t, ]  G , c3 I, Q8 e/ w0 b- t( z  m5 [( C% [+ ^) R
MinRatio = PLATFORM_INFO
# k* A) D+ E2 a4 n0 L+ b, xMaxRatio = PLATFORM_INFO
7 \. R- g* _8 \7 a3 m7 YRatioStepSize = 0x01& h# L+ s; R2 S1 Y! T0 F9 B
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1# c& O* A) T5 T

' {) h4 G( b8 H  o) O2 j/ W" _If(NumStates > 0x10)' v  {" n4 n6 D' {" j
{8 c1 ?* O9 `0 h* ^
RatioStepSize += 1. J' Q1 A" G1 I+ ]
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 12 Y8 ?# Q% _  b
}
' B9 ~9 f1 n3 A/ M4 [: `3 t/ k
8 |7 t: G& Z3 p  i' O, U% L3)  h1 t2 O5 F! @; e6 n
Turbo Mode% G8 m- F& r/ s! b1 X
5 N2 b7 `; w8 N
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
. w9 t- ~3 `8 b; P  U! Y# Y . W  s  \* V# M$ b
4)* H. F' \" D6 m! g# h( M
Over Clock- R5 O4 v2 N2 R

8 D% y3 M2 }4 ?$ g某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。1 E& h; o! m# r$ D- M
7 `. F2 S+ ~; W
5)
' G. e- l: Y# ^5 B- R, p+ u3 ?* o" eACPI Structure For P-state
9 k0 l( b7 T. ? 4 G4 d7 y( f8 w3 H
l5 m1 ~; A0 W; M5 ?1 ^7 I4 H9 e
_OSC & _PDC0 }3 A; n9 B  N) X! g8 o$ W* ?) `  ^

; L3 y' r' V" _# A_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
) B( G1 J7 O. x% `4 w! f/ i 4 j+ Q) b) z: p1 t
l  Z# m) N. Z7 c$ b2 m
_PSS, p$ M( h: d+ S, l
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量' L: t, O7 G1 D2 U. C, ~" \# P0 [
并且通过一个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做比较; }- ?- d8 n! s7 Y3 n% e# j
以确定P-state切换是否已经完成。
1 p' e5 v% J! |* j! ~! K# {8 c
" e5 S# V/ ]2 C* x; H: CName (_PSS, Package()
1 \2 U4 ^8 l! f: S; \0 i, v+ A9 _{+ i7 y4 i, j3 J: U+ h% C
// Field Name
" B: i! L3 @* wField Type
9 Z& Z4 }, j% z. V6 i; Z* j6 E" D/ y% Q/ t2 ^

( t2 u# \$ \2 j: S
3 A# P3 G9 e9 ^" g1 b, y; IPackage ()
& z0 ?& Z* d4 c! a// Performance State 0 Definition – P0 , k, W! n6 N5 a, r" r
6 O  c9 C" @7 p8 s
{
6 ?0 g0 l: F9 S5 [' ~" y1 E) B  ~/ O" `8 @% A

+ u" ]+ `1 k2 sCoreFreq,
1 A* i* k. v% i: H. ]// DWordConst 1 k3 ~1 ^9 t! ~5 }9 M

8 }7 M* f4 e7 @; s0 K" L+ R
5 Z* w7 J2 B4 X, W& ?Power,
; o$ l" l4 X# n) {7 \! F3 o// DWordConst 4 n3 n" U% X2 t* J( z# d2 I5 t2 P7 F  i

" ^! O0 ]0 k, nTransitionLatency,, _% j1 i2 L, }5 c2 S5 k
// DWordConst 5 d& {7 ?' |% f6 _: U6 D( M" s5 H) x
% L* b1 }/ \! S' M9 {: o, }0 S: h7 K
BusMasterLatency,
* c1 v. d5 C+ w3 z0 ~5 C// DWordConst
- Q) W% P3 o% Q( b& v. I2 g% j
" {  L8 k8 Z5 m+ I6 DControl,
  Z5 y/ P# [1 {5 u// DWordConst
/ w2 D4 p5 O; s* }' D: L) ]0 s9 X) M! B& l' \! W/ h
Status
. a, U9 Z, u/ j
2 j! a; R& g. \( y// DWordConst
- W* ]5 v. _( ?/ ^2 A, l" t# \$ l7 ^, ^% l- O
},
" v9 r! U& ~& J0 u4 t9 t  |0 R& \# r8 W# C% }
. / G  P6 u( H3 j. r3 O6 S

" s5 m9 J4 M! ~) M/ `4 r6 C9 v4 r.
" F2 H( ?: L+ C$ c7 e8 B2 z2 D6 L0 B- D' O4 Q! s8 {; w
.
  ]: j, y4 q5 c' ?0 S0 y}) // End of _PSS object
2 v8 M! `0 V# I9 S5 Q# Z前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 4 k0 e" l. y' |( M+ k# y
/ R7 l/ x- G$ _; t; p% @& c
Name (_PSS, Package()
) @7 N$ N, a* v7 |. j5 e
" {2 z; k! i  f/ Q7 O7 ?{
8 B9 U/ ~/ i  c, t! ~1 B- P3 N3 @6 x% l1 J# Y
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
3 S: W! H( |% `2 g, m' p# M& r) Q/ I8 _6 q  I, h8 T
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
  a5 r; `! A; ]. b
" \3 [$ i1 s2 V$ N8 f  s* J+ HPackage(){1400, 8200,1 ?$ _$ L: D5 h+ j# W' W4 r4 C
10, 10, 0x000E, 0x000E}
+ g8 V2 L' F5 D0 ~3 f' ]// Performance State two (P2)8 B& Q% E- M& I8 [6 P3 F! \' z
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
  F7 }3 L4 S) s( P' KPerformance State one (P3)
2 g9 b$ Y" D$ F+ Y2 p4 u4 T& R. a8 a) j4 e; v% @
Package(){1200, 8200,3 b: `& I6 }. A9 T0 Y  R0 U
10, 10, 0x000C, 0x000C}4 D1 J9 w" H9 ^7 e) j& t" [
// Performance State two (P4)
4 `9 c! L3 z) U# P7 s+ Y& u
5 l# i8 \+ u5 G5 _}) // End of _PSS object" p) p' _4 J# }  _
! D0 i- k/ V7 K2 D
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
0 L  Q% I. z0 P, q4 d
8 m8 n# v7 W. r3 g5 O, ul
& U3 P5 s3 E" P0 {+ i
_PCT
3 N. [7 {8 Z7 J$ ?  E ) k/ W9 ?/ g: k
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的方式来进行。: M6 ~& [" Z7 C& b/ i
0 e+ }) K8 i) {3 E$ |7 L
Name(_PCT, Package ()) }! {( F( i/ a: {: v) ^$ @; `
// Performance Control object 9 M; m. y9 d% T4 y" l
: F( n# ]' v5 W$ C- y; X7 ^
{
- c6 p9 |. s  o; [6 u$ |+ G2 T, g/ v6 j4 i! B
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},! [' M& h, k$ \0 j! q& D# k% G
// PERF_CTRL " d3 U! ~. W, b6 e) P" i+ F+ z

, K! Z: y$ ^5 P, U/ D$ yResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, L0 \" {  j2 x# g7 E: c8 Z( d/ f
// PERF_STATUS + ?! E0 C" k  Q; N& A

9 L$ A5 u- q: @/ ~! f}) // End of _PCT object
+ h$ T3 V* T& u" M
: Y4 n5 f% @! V1 I+ hl
$ t; G% e9 d) o, h# z5 ]
_PPC
, A, M7 u7 ]! V6 j; V2 j
/ T# e. n! F9 X0 O/ ]5 DPerformance 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
6 v& j7 f; V9 A. ?" u& c0 S
1 ?) i* i" B7 b! O5 i  Z  d8 O3 LMethod (_PPC, 0)
; b; k! V+ P9 [7 l. |8 {! X* i// Performance Present Capabilities method 8 ~7 w8 O3 [4 @3 L; U% b# D( J) }

2 V. ^0 Y+ Q& [{
9 N7 O: K% Z9 A* s$ s6 u
$ `' u  e  g- s7 }& bIf (\_SB.DOCK)
0 w0 z  }( o! C- S/ f1 `7 a0 C" g% {) l1 R
{
7 j$ k$ k4 z6 e5 a4 T
! i3 i) {2 [2 C+ sReturn(0) // All _PSS states available1 R' H: I9 p& h. u+ X
. U: b0 X1 m" N3 g- @2 R

8 B4 V4 N& I$ q. l3 U$ b}
& D! I  s( d. U$ a' w
1 |' [$ e- t$ _: k  [$ R; HIf (\_SB.AC)
" v4 O6 U3 e1 T0 t
) T( a  w9 K, v( W+ T{
6 Y9 {) Y7 i0 N2 v# p1 y# b; i* b
Return(1)
7 I( R7 _' o  K3 |+ @& q& J// States 1 and 2 available
4 Z  ^6 m9 }0 }* n8 U
" `* @' L! M( P) ^- E& F}
. b8 ?% w4 M0 G* w) R2 L: m4 x3 y5 O
Else
. x+ m% o! n4 e7 y7 ~1 G& i' @: l! B5 E3 m& {5 k. v
{
/ c- Q8 p. f) J+ L$ P5 G& {5 e
Return(2)5 n  _7 k3 @- i
// State 2 available* O& D* F) c1 `. z+ P! r

9 u7 P/ q: K0 U* l& ?; t} " Q$ z9 G5 T' }1 ?: s  }8 L: z

6 _: k; K' x. D5 z: c} // End of _PPC method
+ d6 N4 k' o- g; C, K0 @ & s& O& D6 b' t/ @: w# j; J0 u
l1 y4 ^% J) a& s: T7 G: H: w6 }; K' z
_PSD; u8 ^/ W" l  o+ ^  F
* w, G: p: I7 C! L; p7 i8 e% X
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。; X! Q! w' O# _1 W7 W0 }2 ]  \

2 Z) V' t7 N! R" YREFF:4 A$ l1 o9 s4 F' \/ F
1.
4 j- ?1 k% c0 n, f; k, G5 F) U& _ACPI Spec 3.0$ {# l) a5 J; N" D$ S( ~. |
2.
, ?. W5 _  a0 I" eIntel Processor vendor-Specific ACPI
5 \$ ]  O5 X9 E3 e; E : E$ T. u- C* }
5 Y9 H; `* q0 T( a
That’s all!
5 ?4 z0 J" ~: W, ]" k6 d7 I
) H$ E$ x( G% S9 M0 \) p& g& b) DPeter
9 Z, a, l2 t6 q% J - ~2 @0 E* h5 s, P& F* R+ ?  E/ b# L) ^
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview6 [2 J! ]% T) _, M" y8 e8 O. }
& v0 v4 I% ?6 ~8 w( N4 @1 b" ]
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工作时间的占空比)的方式
% G; w) ?# S% ],影响系统的功耗和温度。7 Q8 P, {& C7 H3 N( ]7 I% g
  H" j0 e) |, y' q9 k) ]* H; s9 i6 k
2. T-state Control& O* p, p$ z' |7 J7 T6 {6 P5 d
0 M* X5 C9 g, b7 O. D
1)
6 x- ~6 B% j6 Y! {MSR Based Control3 S. V& _/ q# Y: D& k. e1 d  ]
4 i5 a4 ]8 y3 c2 L* `1 P9 G3 E3 `
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
4 E& ~5 Z7 o' h/ Q3 B # Q+ k% i6 J' R2 }1 J: g+ f
2)  o! p5 A1 F$ a
I/O Based Control) @( E9 }' w* r+ B3 L2 |+ T) W9 i
. {4 j8 Y4 g* l2 Y0 C7 a2 M+ g
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。+ q* v# T2 W: y, b9 W. s9 i. {

" J% Q4 ]. Y# B' }7 o0 s; |3); l' C6 s# U/ z
ACPI Structure For P-state
5 L2 Y' Z- g- q. s7 u" w" |4 wl
9 o3 h* K+ N2 u6 E2 ~5 D
_PTC
' l: Z) ~' Z6 \ / `9 ^' z8 q7 G& u7 k
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:& N) ]- F6 x* T4 ^

' k7 a8 }! S$ i+ l- BName (_PTC, Package() 1 }& U+ ^/ x; b5 z
{
7 f7 q- X  H7 l  V7 P
$ h; x. K$ S9 K# V5 S4 l" i% IResourceTemplate(){Throttling_Control_Register},
) `2 [# t" b4 e  \0 O//Generic Register Descriptor   s, E6 U+ b6 c" W

) G% a3 `9 w% T; I# h5 _ResourceTemplate(){Throttling_Status_Register}
% ^" @5 p+ A4 L% E1 N4 n' j//Generic Register Descriptor 1 _! U. U& M3 B2 Q: z3 B
}) // End of _PTC
- B) |7 X- e2 p: C7 M1 y# ~6 }
4 ?  d0 O9 e5 E4 O+ B* w下述是一个sample code
' B+ {6 _# g1 U0 z+ J0 z   C: t6 M! U. b

& p/ @5 Y6 J/ a. T
//
( X1 H/ J/ u! Q8 I8 Y/ b) R6 c+ G1 [) b5 \" v3 P) X$ ^0 p! Z
// T-State Control/Status interface+ U, c6 _# d: f' d8 g
. W: I8 E& K. k0 ]' O& a$ x
//3 D: `4 i: N3 C8 w

/ s+ q8 s, \9 c1 T, h) MMethod(_PTC, 0)
: _$ A) l$ Z2 b0 C, l, i3 }4 o% Q. D- \6 n
{
" ~1 X+ _, a( o" N6 _! I  ?0 j0 }6 n& v( ]
//
5 m8 l, d0 O5 ?+ v8 W7 `+ G. y! a6 z9 j( y7 a; w+ x$ v2 `" `
// IF OSPM is capable of direct access to MSR: R3 W5 v! i* {' `8 c- x; L: c
) U1 ?& r! e3 Y1 o* J3 ^! H. S
//( ~* g, \3 p. k7 K" \7 w
Report MSR interface
3 G" K# P9 z( ]3 W( [: L2 \
0 g; ^3 `6 ^' O8 U' O& `// ELSE9 U8 Q' M$ M# `! E+ t

7 Z+ {. W  o+ |: C1 Z" ?//
, `/ D* t' O* ~- V: |* q; YReport I/O interface
% D5 o+ i0 Q* d, J9 Z
5 |' d5 {0 Q$ v3 e) I//: Y5 s, I: @* V

' y5 p6 j# p4 O. Z4 ?: _//, P3 J& |6 h5 N
PDCx[2] = OSPM is capable of direct access to On4 [9 W# G& W7 C! v- N( a
: D" A! m5 i4 g' T' Q
//5 E8 a, C5 a; L, S8 g% s1 f
Demand throttling MSR
( R% W% F4 B; T8 K0 Q
& a, X" w0 [1 _0 F//5 \; u/ t7 I/ ^# A9 Z
- W- Q4 W+ q" \% Y; ]/ f
If(And(PDC0, 0x0004)) {, N" z5 R1 T8 V

, u7 r, a0 [8 |( T6 r  X& V6 yReturn(Package() {" m/ N: R- Z# I- X9 m( h% x9 g! m
  n" d( p  B' p& x4 m
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
1 b' ~( [( L5 d# X4 E# K9 [: K6 z; u: |' Q
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}+ g; h+ B$ I+ X, g, V3 d
' x% q" c2 {1 v/ v. ?
})7 g) \7 P. b" q4 b& I1 _0 b
/ Z* D+ D& t4 @" Q( l# z' [
}* F! S0 E$ H" [$ H7 U9 o" d

6 W! t& e& B+ w# kReturn(Package() {
3 ?4 L+ p( m. O0 y3 f( ?' W! ?$ h' E. K. _1 ~# {# N
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},( s+ I& j+ T; Z- B( y: F
5 U) ?) k* v( x4 g1 g' v
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}3 o1 H+ L4 I3 N" e! A

# Y( O5 H- P& k; L})
$ ^5 H" |" r. ^' U1 @' x# k5 m0 S# D  B5 x* ?1 k! n
}
' O8 z+ I  {1 F1 q5 R0 q  w& T- v( U- z+ c2 e1 m9 L

0 T0 q" T5 Y* t% }9 z
2 u6 I# _& P$ Z. s, l& gl
1 L' E9 u& U. s8 m2 e! o
_TSS$ K# n! V. O1 S* ?

+ H) X- t6 C" G: E2 iThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:( D! {* I$ E; p
Name (_TSS, Package()
$ s% n) F' ?* N, p{
' P2 v! m1 [& c. z$ d/ k4 U! E// Field Name
  B! X) w* n' f. p9 GField Type
& C: X4 ^4 U! x, i, t
7 I, ]/ q9 \4 }% n- q/ Y
7 Y9 r# [# \- T2 e. M6 t4 G
# W1 R& R9 V! D! T1 M8 H  J0 B7 BPackage ()6 w3 }8 u: G  w: i& `1 ^6 j+ t
// Throttle State 0 Definition – T0 5 e8 z4 x! u) U# G+ o

( H9 J) }& p7 T4 t  N: o' D% t3 \6 }{/ A8 S% V3 E6 g) U, b. d

' \( e( X9 O3 O6 _0 q) T6 W. Q
FreqPercentageOfMaximum,: P* K1 x0 O! x' K& f7 n5 N
// DWordConst ( f( F6 k4 @+ r7 a, i% t

6 j+ `( M2 E/ y) yPower,$ A+ n- T1 G: z! p8 s' h' e3 W
// DWordConst
* f' R2 I6 V' t, G0 W8 f# J( m& x" v* x; k8 e
TransitionLatency,
7 p( e- ~+ d+ G8 M% s) p// DWordConst 5 L# I" G) ?+ J  @7 }; Z8 U
3 g* j3 S7 n2 k
Control,9 H; K% T* L8 K; Z/ }9 J
// DWordConst
  g- v1 O4 q8 U+ m- u* e
& Q$ ]2 s" u' R1 ]Status; v. \+ a% _# Y& @$ N
// DWordConst 7 T/ O4 `0 A( T2 _6 v2 y
},, N' d" B9 R7 {; N2 X  h
……  h% |% w! \* I$ W/ B3 {+ g6 ~; o
}
' ?2 D9 F; K! O% {9 i) b7 N7 S* L8 f0 \
Example code 如下所示:& l: J- K- l2 ]/ d3 _

5 `6 J6 H4 f( G. ^$ \Method(_TSS, 0)5 P. f7 |" c* C
+ q9 s6 a: _  S4 F) m
{
7 ^1 x; |% W% @0 e
. z6 D% @5 M; g0 _Package(){100, 1000, 0, 0x00, 0},
1 f8 ?/ Q, m- h$ O7 I) z8 E% U3 G8 |" B$ u; m: Y
Package(){ 88,9 `# ~  Z" |" ]3 Y. Q
875, 0, 0x1E, 0},
! s- u- f* X7 q
0 Q7 W* T- s4 d! bPackage(){ 75,
7 M+ `$ X* x0 X. o3 B750, 0, 0x1C, 0},+ d* s; C  y  [  g
" V6 a! C2 d. J6 `+ b
Package(){ 63,
9 z' t. F( L0 {5 F8 r625, 0, 0x1A, 0},
1 j7 a  K5 d. ^$ C- g. K$ {9 W
% l1 P' T' j; V( f. D; I" o3 {. |. wPackage(){ 50,
4 ~& N, q2 s/ i: }- U/ {500, 0, 0x18, 0},1 r7 m2 w7 n3 w5 d

' f: j* m$ \3 W7 FPackage(){ 38,
' ~9 ^( B' Z0 C- a" K: C3 N$ l5 ?: Q375, 0, 0x16, 0},
8 @% z" A3 M, n# G+ Q" w
) A: Q" w( K( z$ f- R0 [+ nPackage(){ 25,
+ S. |, s* N: E( r; u, O5 h  [# H250, 0, 0x14, 0},$ w, \1 w4 z" P

- X9 c  p8 w1 OPackage(){ 13,
' A6 {/ Z% {  a1 E125, 0, 0x12, 0}
% J+ x: m5 G. h& n* p  `! h7 ?$ \* p) x9 E0 g8 }
}
7 ~! _% b+ V0 w: C
# r$ @' [  k! w* b2 n* s. l  E/ `; [
l
1 c" G2 G# b  F- `- A: {
_TPC9 Y& K% Q% _. a* i

$ z# I/ s7 P. f2 U; ~; tThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC0 {, u: o# l/ E* i3 F  B
- M, P: O9 A) h! d; [+ O
l
% {3 U5 R) q; R, K" Q- [% V, r
_TSD3 T9 f, J4 o! O) ^7 F# ^+ ?& u( D
! S: R- w. i5 x% }+ [2 x" I
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
, P4 R% P- w( m: p: B 6 [& ^: W: z! W+ r1 Z' s
Name (_TSD, Package() 5 y5 ]- C. ]0 V; j7 e
" D- O8 `7 Y; b! w! g
{ 5 L# v( B( z; b

) I. j  y8 ~, A" iPackage(){5, 0, 0, 0xFD, 2}; e7 R$ _9 o% J* h% x( F
// 5 entries, Revision 0, Domain 0, OSPM ) d6 d. q/ h6 ~1 e5 e" ~& o$ D
Coordinate, 2 Procs
, p/ |6 \! R! e& @  q8 d* F$ N. Y( V' M
" o3 e7 n4 L( Q/ u
}) // End of _TSD object5 l. G5 w4 z  m& v  ^
( f0 L" ~" ^5 T5 T
REFF:
# A. _/ |3 O  l# A: O1.
+ y" x8 c( [' @% [) ^+ `8 KACPI Spec 3.03 b' q! W& i1 X, x3 E! m
2.9 z5 y6 S$ |' j* \" E
Intel Processor vendor-Specific ACPI5 N6 L0 P$ S& k7 U! [& r& L

5 i/ t: U$ F+ m7 Y2 E/ n" r& P 3 ~  m) ?' {9 k8 f* \9 [% Y
That’s all!' r% t  [2 }8 a/ H8 x
7 q# a! @- y: ^! b+ |) m
Peter
9 L' h2 p$ c4 {0 s0 R$ T) h. f ( C; `+ ]* j6 Y3 ]/ y
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 00:47 , Processed in 0.119203 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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