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

CPU Power States

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

8 {4 s4 }& n1 G1 Q/ i. u4 k9 v( X1. Overview0 ?& ^5 U1 h7 z3 x4 H5 v

% B* g5 @" l: k( ^5 p# e/ r/ C; l' p
% B  N  g  w9 ~4 uC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
) ~  R' k( E0 b3 t降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看/ ^9 L# L1 U# J8 F8 v
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。6 N% c( s  i9 a: {# p! o

# R) i, P+ w: ^) U, Q" `
cstate1.jpg
& M0 V$ {! {0 C. B, s/ l2 f
1

/ L1 P3 p0 t) q2 f: m2. C-state Control2 f, b5 H. ]  \& e. q4 F% S, w
. c5 h; ]/ R# y2 a: E2 |
1)' N# N: S- d4 v- K/ D' @+ J
Detect & Enable C-state( K  c0 B* N* Q' a: t/ |2 L' U
+ m) F+ M1 i; Q+ [5 z& _0 d( F/ |: V
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的支持。, c& x3 B4 S! O# b1 ~

& |0 x, _) c' C: A2)
1 o4 L3 m4 l8 ]- B( {C-state Basic Configuration* N6 ?! h; ]7 q$ |4 t
通常情况下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)。
* ^. U  ?, X5 t/ S, v) u6 s" L4 g# |% \
3)
/ L7 L: E  @* Y  D* n4 ~ACPI Structure For C-state
, t% m$ u# L' ~4 g( w" P" d
9 x6 E- i6 }; \6 Wl& @: G0 H5 H- ?7 l& ~
_OSC & _PDC8 [6 r7 G% W: p3 E
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures. R0 e4 @  v1 U* h. b% W
l
! k' f4 ^2 X! m8 b' U+ Q; w
_CST
9 ~+ k; h8 f* ]; T) C' N6 U% h_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
$ t5 R4 S& x# g' b  |! uCSTPackage : Package ( Count ,
% L1 ~- v+ ?+ y8 D3 W# R/ Q% }CState ,…,0 _6 _  I/ c- w3 I) q& i
CState )
, q8 h5 j/ D' e- ]: \其中Count表示所支持的C-state的个数
8 o1 s" C  v/ A" `' oCState: Package ( Register ,
$ f2 H. M) Q. j  j6 v. ]- NType ,
" T" w- E' T# D! V! d' f% \Latency ,
. f& ]! W& x5 h+ J+ ]6 {% ~Power ). c( k7 l- S' \, w- Q. P5 p$ k# s- q
* C6 k2 Q" B5 i7 ~# Z- \
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 C36 t( `( |$ Z5 r. F- d

! B& j' V' U9 L6 H8 F" D- QName(_CST, Package()
8 _, \" s4 {1 A: j# a5 E
8 d+ ?/ Z- i# w8 r: i& y% V
{ ! O% R& M9 q. t; {/ r
4,
) G/ ~2 {+ [- ?; Q! [. f// There are four C-states defined here with three semantics

' u8 U7 B4 O- N' W/ P% D) h- H; ]3 m; Q6 k) ~9 }+ r: Z6 _( q& A
// The third and fourth C-states defined have the same C3 entry semantics" t5 ~, u! D" N* M# r+ N6 v, t
3 ?: l% K% y7 d$ J0 S; M
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
1 A2 i. ~( s; r, X1,: U5 z& D* h: S7 z% S
20, 1000},
5 x- H  {  f/ F' z$ j3 ~

, a5 j; s2 I5 k8 \" Q' I# U1 hPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
% c) _" f3 {7 _' T40,. i) E* _4 K8 c( G4 a
750},
+ A7 n4 M& F8 P3 ?- _
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
/ _8 `2 @$ h7 x6 H" v( |60,% _9 N: w) ?' T$ J6 \+ V9 C
500},

2 K. R1 F& L, xPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
2 Y* \- Z/ c9 J250}
4 w% V, y  R, o$ f' Z0 v
' S. A# K9 U0 T, z- i
}) 0 P: v- U/ H  j6 N, u
, A5 h, u. t4 y! [' U$ \& x0 Y* u
l
, n4 l: b: k6 J8 b0 d
_CSD
8 }3 f; K: C) t; K% u+ ?# J- {( K9 G5 m
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。& s% g$ G6 N, c1 v9 U% V# g

/ c5 W+ M3 }$ p) K" w) C& |! d
/ u! @8 {0 w4 F) U7 ~5 s/ B$ s1 }5 j( |+ p; F0 G
8 G- b3 L. ~' U
3. P_LVL VS FFH% ^! ~' j% Z- }3 F; y) U* q' Z
( e- X+ P5 Y, Q5 t6 J" J. H
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)  Z% P6 h8 n; \
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所示:+ H& p: k9 ?: m! |) v
. ?* D  R5 |5 k( ]; g* I
gas2.jpg
+ Y, ^2 H( G7 [# i3 m( C6 D
2
% ]. c# J1 M( k( p$ q1 l: w
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的一个例子:3 |' }: M  }( R# Z" i7 O- _
Name(_CST, Package()
0 C! x) i" [& L1 s" j* Y7 X

7 c9 N* ~! N' `: ?, P1 C0 R{ ; G8 z  j, S- s( E0 `# V4 W: A
2,
, R) b  P/ O6 Z, u! P: i// There are four C-states defined here with three semantics
( o3 r. U/ J+ ?6 q

0 e1 }6 K+ U0 h// The third and fourth C-states defined have the same C3 entry semantics) W+ l, f' r0 T) m# o

4 q6 g3 L( D2 a4 l' jPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
/ S! X/ ?! F. X9 y# [; m% G, y0x01,
" N9 _, \' _2 d8 Z* C' C, r- A0 d0x03, 0x000003e8},/ C2 \6 X' W+ B& \% r

* V& T1 @; _, g+ LPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},1 e7 f1 X* P5 P- L
0x01,
/ u1 Q" L# E9 \# r0xf5, 0x0000015e}
" W* s/ \( I( J
})
8 v5 W8 t  V2 R) ]$ [( i
0 u) D" V' D1 w
9 Z7 a% K6 i/ h" i* H9 W; `REFF:2 N! A7 k( Y& b% ?; ?2 D$ C
1.
) A; O4 @* p& ~4 t' i0 a' yACPI Spec 3.0
" H# d9 p! [: p; P5 e2.; }) I' h9 t" E3 C
Intel Processor vendor-Specific ACPI: c1 ?' V0 {7 @3 w

2 H* x" R  g* ?7 V2 p+ z/ k8 z( u/ `3 m4 [/ R$ J& b( o' \
That’s all!
3 K4 f; m+ U) x& @& B" V7 [7 h% L6 u7 ]
Peter) C+ Q' F. A  n% v+ ~' {: J' J
! B4 F4 {; p3 s2 y
2010/9/208 i: g  A  w/ k7 T6 h
8 v* e8 {6 d  b3 {; y' n, h
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
- a! l: q+ h" G- x3 Q8 p3 p* f. _9 o, H
) w) E( f  e) c# eCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
0 @* x" W- W, p! [4 xEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
1 s; u8 Z- [- l8 K& k 8 X$ j9 i7 Z9 o
2. P-state Control/ G* B0 s- ?. @

0 Q; y- E  K3 R: B: R+ ?" c& J+ M  J1 @1)+ v; A+ Q5 V' I! b8 v! |) b
Detect & Enable P-state
  P% _! n- R' j/ D7 r  w
  R  D$ \7 a7 H! _3 P9 W1 b' l. YBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
( Q' ^& |8 f% b1 ]' q( [* ]
& s! h4 c( B6 j1 Y( D2)
! `% y  R# J4 E  v5 X7 ~: NSupported P-states
$ r5 Y" H& @8 a: q+ I $ Z$ [$ c- E4 |' Y0 P' M3 L, I
BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) MaxRatioRatioStepSizeNumStates,所有这些信息都可以通过CPU MSR直接或者间接的获得,其中MinRatio MaxRatio都可以从PLATFORM_INFO中获得(不同的bits),NumStates就是二者的差,有一点需要注意的是如果NumStates > 16,RatioStepSize就会加1直至NumStates <= 16为止。CPU的工作频率 = BCLK * Ratio,旧架构的CPU BCLK通常是由clock gen给出的,通常上是100/200 MHZ。新架构下CPU clock gen是内置的,BCLK固定是100MHZ
8 V5 I: e7 R6 r1 I6 ]( E) P- M' B2 ?
8 Y' P2 h8 @# B$ k+ M$ yMinRatio = PLATFORM_INFO! ^7 U; S; c, ~4 i. I
MaxRatio = PLATFORM_INFO4 w2 s4 S# C0 Q+ Q! d5 Q
RatioStepSize = 0x011 I6 B8 z$ F' T- t
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
  j8 J0 m9 z! Z, G- o$ z# B  w( F ) E) r, g  o$ S. G! [0 A# a
If(NumStates > 0x10)
$ E/ S# g: G, h  n/ B# }0 x{
& p( D" ^/ T& R& g: c3 wRatioStepSize += 1' I  `$ ?* W* o* Y) C. T3 Q/ R/ U
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
. a- S( _  E' ]; x' l. r; u, \}+ e4 ?, u( V2 i, b, v

% _) C9 l6 {+ s4 c2 h3)
) n4 }7 _. `# }- eTurbo Mode% d5 {) Y1 v& {2 g+ F- k. S

; g' Q% r* d# O! ~' }) V- b; wTurbo 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: X+ C1 f! k& ?9 ~1 m5 @* Y" \

; j* ]6 o2 S" y+ f7 S$ p4)
) s$ D- N5 I! I: aOver Clock
$ k# r- W5 f  V+ [! \3 ?   W* [" O8 v- {
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
* d+ B" j, z' j# c3 c
; p" v8 c7 S7 s5)
, b& E0 ~% c& oACPI Structure For P-state4 q6 j" [7 `# F9 @9 U

1 o7 e6 z+ T! q- [1 _  E9 Il: Y1 D% z( G2 |- [
_OSC & _PDC
* J6 t- Y" D" p! P& s+ R ) O7 T% g+ l/ g& C; P
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
: k3 ^- @0 {$ b; h: d+ d! B& V3 @
& Y6 h  J7 e  ^7 Y( k! dl; X2 q" E8 q- [0 I( H
_PSS
  O1 {' p+ g; K  LPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量( P  u7 u6 o5 k4 Q: i
并且通过一个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做比较+ ^2 x7 M6 T4 ^$ h4 o
以确定P-state切换是否已经完成。( m7 K7 }' f, Q( ]. D3 P

; u: k% {$ f' o& \5 mName (_PSS, Package()
( v) \7 V& F( X, Y0 Z: c{
8 _% [# W8 ?. n6 a// Field Name
1 r4 ?) W( y7 ~6 Q4 y( k8 {Field Type
/ i. v7 n. \; A+ S( N$ T6 r! X6 W; e) c5 m' R) o, F0 q' Z
  T5 |3 w4 @: f6 u$ @

+ l: i. T% X+ j' I- h" L# }Package ()
9 T/ J6 T* w+ \6 g+ p// Performance State 0 Definition – P0 # `' X; j+ [: P9 S

, A0 R8 U+ K9 n8 g{* V' e' T* M0 q

. g9 b1 }* G! a8 ?8 c  ~0 K& P7 T5 V. H/ q
CoreFreq," E7 G, |# b; a# \; `5 y( T/ f
// DWordConst * O0 O( G9 y; {4 ?  t3 f2 y9 Q

+ ?3 q. y! T; v3 d+ ^3 Q) d$ W1 i6 `! b
Power,0 P  G3 |8 e; N' @+ N; R/ Y6 {, h
// DWordConst
/ i& n. N1 m# e  T+ X8 U8 u, R% p9 R4 b2 U4 z
TransitionLatency,
; ^- e% _7 w6 X9 S7 y, D1 E  Z// DWordConst
& C9 L; z: z3 V1 y! i1 B1 Z0 [" _3 |. X* F
BusMasterLatency,3 c8 x/ S+ C' f, i6 K7 P1 P/ [
// DWordConst
( O- Q/ D  r) X* w" J- r% J. }+ A* q8 \' H
Control,9 u7 H! U* g8 k3 E
// DWordConst 7 ]$ v( m& s  T

8 e4 s$ r, [, D: j3 ]4 p. yStatus% E1 N, J3 v; k3 r1 |) G. j
9 v, O" q- m9 z/ D, ]  a- ]
// DWordConst   W& y& @% g! |
5 g: q& a5 z: D8 H5 y8 M
}, 7 y8 n- G, s0 B! {+ a( Z& I

- Z$ |. D- b8 O  K5 |. 3 x* p. G$ H( [. [
3 T! x  s  S+ y; I$ Y; o8 j* v
. 5 W. X5 A( ^& P1 b
2 d& w6 L6 X  m, v
. 8 k3 `  n. {8 o) u' Z, I( `
}) // End of _PSS object
& ~2 l% W9 I0 ~. U4 v. U( A' R前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
" c4 @" t) ^2 ~; N5 [! D, D
  \0 D9 N: m+ O4 `7 R0 m" Y8 ~Name (_PSS, Package()
4 C' H1 o/ X& r" S
! T. P# T5 Q' h{ 6 c* O7 V9 b$ D" d7 s" K' U! ^
8 x1 ^, E, z5 P! A  W# A
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) , V; M5 {, u8 R5 D3 v6 u# \
$ c; c8 e6 U7 K$ l
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) * P& E* C( L" Y( |' d+ m
' Z  j- q! E& D
Package(){1400, 8200,
: J8 s! t% n; R1 ~10, 10, 0x000E, 0x000E}
1 _* j/ W, b& D// Performance State two (P2)! L! x3 q6 w% [, w1 ^8 d
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
3 A7 J& W7 T6 r6 `/ dPerformance State one (P3) 4 f7 d3 Y  `8 O1 E3 V* ?7 }. v
1 j! |" r1 X# |/ q  K
Package(){1200, 8200,6 W; W* |* B/ S' k
10, 10, 0x000C, 0x000C}
0 x# |2 P7 v6 Y# n" _+ S" T  B* \, o// Performance State two (P4), X' @* I2 a7 S1 Q5 |# g! z
  m) t( t, q( {; X, [- y0 K
}) // End of _PSS object/ S1 o. ~9 i' a  ^0 C& j
$ }5 ~/ p  E+ W" _4 _
另外当该平台支持Turbo Mode P0将会reportTurbo Mode$ E# D6 m' r! r/ v- ]* [7 i1 E) L

+ s: @7 J* _9 x+ z9 Kl
7 G  x: b; N: A, w& ?
_PCT
/ d! a! E% n: J , I* b( b* F0 X- l  N5 a
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的方式来进行。' m  n" C6 B3 P- {4 C

! I9 J7 b# D) k6 G2 a; d1 K9 zName(_PCT, Package ()
+ ^1 B/ H- K' w; H/ h( p5 P// Performance Control object
! f6 M6 C+ b+ H% q
( \- M- B+ _" [: E4 B% {{   G4 I- j! I7 T+ Z  F( b, b

# Q! y. F- e( k4 W2 O$ \- l! hResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% V- m, e7 }3 D; d% u! P- `: C, o// PERF_CTRL % M7 ?- A  X: _2 b5 m/ `

6 N% l" L& W" Y" i4 P# t, RResourceTemplate(){Register(FFixedHW, 0, 0, 0)}; k# D1 k% x' R$ h6 t
// PERF_STATUS
# z1 M# v3 M' `! ^8 v9 d
8 u5 ?- y( b9 G: ~- _# D, Q9 N}) // End of _PCT object
/ f" B# w  g' c* w
) E5 y# ?3 U1 `' O2 w3 A8 H+ P4 Ql
# ~) h" _6 S" {6 l
_PPC
5 G( m  w' l) h
) B/ m: y6 |% ]* m' r2 nPerformance 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-states1 B' Y% F1 R$ r/ {3 `: l

5 |, q) N# E# W" oMethod (_PPC, 0)
: F! f7 k: W1 q+ s- p; _// Performance Present Capabilities method & M3 m5 V# a+ U0 x4 U0 Q* F$ e- ~; Y- i
: F7 L) H( y1 q  p6 i
{ ; i2 U& k0 \! ?6 A8 Z6 i5 g) n
1 R" n. _$ f, S+ @* r
If (\_SB.DOCK)   {3 Y5 N; j' U0 n

; u$ r4 ?( B' R# c& V( `{ 6 j, @6 J5 c4 L2 q- C5 L- M9 s

; g4 H0 a% e* Q/ z+ ]Return(0) // All _PSS states available9 U7 E5 Z  @& _( |9 R  u
) a) t4 |6 q  \( `1 [) c
3 C* K+ `6 o+ `$ q# i
}
* t! j: E/ a- V
7 @& r. O- b/ k1 G8 N. IIf (\_SB.AC)
( c  }% k4 B2 d: p; f9 ?$ H4 E1 Q& O. S! b. [1 |5 u
{
- @- [/ a: i, ~. Y, p4 a; M* y$ ~5 I
" ^, Z8 H+ u7 X6 n- b* WReturn(1)
( G+ v* H: D% A8 c4 N// States 1 and 2 available ' a9 ~% n: `) U- Z, |) F0 S2 E# a' G

, `0 M; F$ a5 D}
2 |8 B% p4 W) f4 m) o, Z- J! I0 G$ G- Y
Else
% M& ?( V( i  I1 c, I3 [% h4 k9 V
/ r2 B& i; h" u' h! S. o{
  g9 \' N9 [  D) ^- {+ }8 V% m; f1 I
Return(2)7 s& y+ a6 W& ^2 I4 K  j
// State 2 available+ i* ^  E) T6 o% x% {
) S; A+ X1 B0 x. E
} ! f" R! G; t: M) p. F

/ A7 O( K3 Y# g: H} // End of _PPC method
0 ~2 e2 S+ F# g% J6 f7 I2 J. _
3 }% E) O( b/ N# Y+ B$ B" F& ^9 [l) [( D+ h, [% Q0 {' R
_PSD
' Z# K$ p$ k- s* H; o) H7 ]' \4 D% c) ~ 4 h! g- k" V3 u8 O! w% D5 ^
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
/ @9 h" D( J4 P2 E! d3 N# J3 k
& H4 Z4 L  v( {+ d) c/ \# a2 m7 GREFF:' U. |" J0 a+ K4 E. Z
1.! b! [. K* F6 t8 e# Q
ACPI Spec 3.0
$ K+ @. R4 d9 g3 ^2.- n6 @. Y4 b$ a( {
Intel Processor vendor-Specific ACPI5 B- q4 x) o- [( L1 \$ j6 v
5 q; o* u8 s1 q/ m$ M& c) d6 O
( ~3 d0 J! Z6 i& C* W. A
That’s all!2 M8 A# d0 k8 S! i
: l) h2 i8 r/ ]  G5 S7 d; m- Q
Peter
: k+ u! Q3 v0 t9 @0 x+ S) O : I5 S6 x5 A" g/ J
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
1 R, w/ u3 B0 A/ [ 7 t4 B1 c8 v5 E1 N' g
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工作时间的占空比)的方式
) I: ]0 V# c3 o8 K/ j+ G8 s6 t0 N,影响系统的功耗和温度。" C6 }9 y' |- Z1 A
( B) u7 i2 b& o' N
2. T-state Control
% c$ c6 g9 @- Y( K ) Q9 z! A9 ~, F1 E+ I7 h% g& Y
1)
6 o; W, Z& S+ P6 {MSR Based Control9 Z- U4 }" F3 x% @& e) z, X
! O7 \% b$ r7 s2 |
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 8 [* D: q7 {. @9 E8 c2 B$ z7 B7 v

1 R5 j$ A7 {3 [# e4 I/ M2)* w, {3 O3 d$ @5 l
I/O Based Control* Z/ k! r8 m" N0 r; E
, X8 @$ _8 H# V
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
1 w7 I) t2 _8 M: b2 W9 p  H
( M- A" _  ?  O) S3)
$ C' ^, n4 P$ G1 I$ fACPI Structure For P-state
7 w4 g) O4 a1 D7 t* ml
9 W8 R" W6 s. e$ v4 k
_PTC5 o, i6 Q. J1 f- W! F- s

% F6 Q7 r% H2 w  h9 S( {' T) fProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
% ^9 z% f" ?* O 6 t2 A; \$ o; K% A
Name (_PTC, Package() % u6 C. w6 l/ o9 v' g
{ - P  x" }4 c; }+ s1 r1 O, U4 v
8 Z8 |$ O$ R  M# j3 y7 a
ResourceTemplate(){Throttling_Control_Register},
0 K9 i! S% I+ h: ]' O1 D. n' ]//Generic Register Descriptor
4 g: |/ ~1 j/ Q( R+ _; b' b+ i5 `( R, ~! I5 }- I
ResourceTemplate(){Throttling_Status_Register}/ M  P. c9 c+ o) q
//Generic Register Descriptor
5 w$ V0 j3 F5 @; _3 f: ?}) // End of _PTC
. m  l  f2 y- d" h# T9 Z 1 O6 G" @: m+ g& k2 x- H
下述是一个sample code2 d. I' S: F, `+ M; e9 |1 Z
& C, W& S# c* ]  f. s  V$ ?
; U1 L" a# q$ v, S& o0 U; ~
//
5 l" i9 g& S( h0 N
0 s% m/ W8 G0 y: }( o* T1 T! h; j// T-State Control/Status interface
' ^8 b, |! u) ~$ b3 ^
: \) F0 K9 c0 R5 \0 L//% t6 `& p+ o& Y7 K7 b& `, O

- x, z* |7 l6 n$ v0 f6 tMethod(_PTC, 0)
+ ?6 G: Y2 w+ L/ v  q2 H! N# R- L
{
4 T: v$ G4 b! O, i
8 D1 M! N, O# j1 t* h//
" Y0 G* J4 w: f4 V# h" s" @! h% U
( Z- a* y4 @6 l% ~// IF OSPM is capable of direct access to MSR# O' O+ J# \% l, O) F' G  q: f

. }& N& E* U( B5 ], L//
4 j5 o6 C( d! [Report MSR interface
/ V9 ^$ q1 v7 v2 z3 T+ o- F" `3 Y3 W$ X8 y" y
// ELSE
  U1 U% D# t+ D- x
, C3 a2 Q5 ]' W  k" G5 r//
2 @# t( ^4 y5 @  r" LReport I/O interface  t9 }, L+ o, ?# k& D0 w: C
2 t1 {) F# F& D6 T. i" F+ ?; O
//. L% k- W& z2 H+ K2 C
  X; C: k3 A6 ^5 _& W
/// D: V9 `6 K- _9 D& q" D
PDCx[2] = OSPM is capable of direct access to On. C7 w, j& o! x0 Z5 I2 \$ E! `

8 Q4 y' X7 m4 E  }5 ]//
0 s- I) J  y' n* a( |( F- }4 CDemand throttling MSR
: [  _0 \5 k" Y. J, P/ u, M4 Z% \  E3 d. N/ p
//
. u/ K+ O( m" w% n
  W& p/ c) Z5 q* @( M3 C5 `6 QIf(And(PDC0, 0x0004)) {
2 W1 h$ D9 T3 p2 X! Q
7 [8 h  Q* `, t3 x- D+ A3 q0 D- ZReturn(Package() {
1 d: R8 i/ a+ d) i: I* N" K4 s! j3 C: O  P% H! e- u4 z( e4 }9 g
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 Q9 U' K$ k/ C  ]9 k& o0 J2 s7 Y7 s& p  V8 U
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
( L0 J$ A& D7 G% e4 h3 y
( ?" N) |: e0 X& D0 Y9 y6 ?  ^4 R})
1 Y# P1 L) n7 k/ \* m( \
0 D/ r) r" Q+ r( h7 u}
. ^: D6 l& }" z0 u5 m: R6 M/ a9 x  Z" Q0 V0 l+ r4 t# k
Return(Package() {
  F% [: F* I' ?& T  R! d: W$ v% w
9 `) _' `% o- D  {% I, Z+ t; `% IResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},7 M, a5 n4 X* O) |: p
7 b0 j: R$ `5 ?5 ~' t, t; p
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
" H2 K. r8 z6 ~) }( o1 P, j8 [8 h# A4 c( ~# t1 \' c1 {5 t. u
}); ?7 _4 X& U4 w; S2 g5 n
1 a( i! S5 a! C! N- j" I
}8 }0 T6 i* n0 r- z. H! i

3 u7 D+ g: E4 \% S& n3 T
" J3 W7 f! {5 k5 B
3 |0 T4 E7 m$ Q8 s. z* Sl
7 j* _, c% v& P, N( w/ s
_TSS
! t: x2 Q* P% z# G . o& E' ^/ [6 e$ B1 c
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
  d5 b% L! l. F2 rName (_TSS, Package() * y5 _3 _% C# I1 J% y' s
{# a, k4 P) x: Y: _, E
// Field Name
4 X4 t0 @% ~" W( W; k4 BField Type * v+ K8 n; H  |- G

( f0 V; E- N  h" |6 g5 _& I8 ]6 b' Y! P) K& \! P8 o

- d5 c/ v1 h' _9 k0 JPackage ()6 I7 H8 p8 G0 Z) u
// Throttle State 0 Definition – T0 # s; H4 k8 s  h" h6 H( |4 E; A
& `, x0 W5 G, f9 P% q, ~
{
, l+ d) R$ i/ \
$ {) S+ y$ W3 ^3 E0 v, Q" A
# f. r- M& I2 m3 ]' SFreqPercentageOfMaximum,7 t5 d/ x( r) O/ b' x3 [
// DWordConst
  }& d2 ?9 j, n9 ]
9 ]# n$ ?6 u  N! m! o8 {Power,
8 K) X0 ?  k$ J4 Z) B5 Q+ j  z// DWordConst
9 V$ ]% e# `6 Q' g9 M' l+ l8 {$ @7 d
9 }: p6 Q1 r  d( ITransitionLatency,+ E, G0 r1 \7 `+ ^
// DWordConst & a& i4 `: y* D! g

& R. d0 J. a: x. |) B/ ]" [Control,  }7 r: I) B9 H% K1 x$ C* y
// DWordConst
6 \" y5 V- R8 q+ e$ {
6 t. H& L- e# a$ |Status. Y( y; r8 H0 y1 K8 ~# B
// DWordConst ) {/ P8 P+ w; v/ a
},
) X/ Q; F# [& S' ?……1 x. m  r9 |' w' }+ \8 h
}
  A' d8 u' N6 s! A# A% ^0 o: c3 J
; `6 i& L5 Y9 O: b& R3 l8 y: uExample code 如下所示:% M% {. P. K; m- r7 B) Y- v1 x

4 j( {4 v2 K' s; v% d+ t7 FMethod(_TSS, 0)$ Q7 d. y# X8 k$ {' p7 i
! z* Q- B+ ~1 |! b
{
+ ?* K( t8 @8 w0 `$ ?5 |! s2 Z
) L/ x: e& A. mPackage(){100, 1000, 0, 0x00, 0},
% |/ h- y) r  d3 a. C0 r  b0 d. o: H/ T% K5 i( s
Package(){ 88,& _0 n  [# g. G" ^& O/ J
875, 0, 0x1E, 0},9 |  C6 I! H- Q' Y

0 c- U) L8 |7 v& D3 e% Q! `9 J+ _) MPackage(){ 75,; v3 o. N, A( A4 r
750, 0, 0x1C, 0},
: l4 G" t6 \: z4 H8 r( X9 s1 y) F4 f3 p
Package(){ 63,& s5 a9 J2 C. ]7 a. q
625, 0, 0x1A, 0},
3 p7 A3 D! d$ L6 ^6 A1 J# W) J! j0 _4 C% }8 l: Z
Package(){ 50,
. B8 U& X5 H. R/ V5 s# X% O- z/ h500, 0, 0x18, 0},
3 f4 b  V, t5 ~7 R- W9 C. o3 e* u6 _, ?9 B. u9 g3 G1 x' `
Package(){ 38,
7 P! J% j7 v3 u375, 0, 0x16, 0},
9 y9 r) z  t* {
% K2 l) _& _, h% s6 |+ JPackage(){ 25,
. I; }1 v% g" [* h$ Q3 Y6 a250, 0, 0x14, 0},
; o# Y4 }4 r0 K: q! N4 ~0 Z& l) Q$ S! k, p
Package(){ 13,
  B9 G# R; V$ B# `) Z* v125, 0, 0x12, 0}; E+ P* G. c; s
2 `* L2 z) h' h5 j8 E) i+ P
}. t1 m( l% \! z  V" V9 K  V

: U6 X% Q! A6 h' Q" J& y9 x( C  I3 O8 }& B, C2 g6 F
l4 v$ m5 {/ t! u* o# D" x6 R
_TPC
% {# o5 P8 K* [4 y0 A
! Y5 a% q4 }( c3 w' D8 E/ N6 [4 FThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC, t+ Z1 ?" l2 f  ^
3 h4 a- s' {. j* O
l
+ B6 U2 ^4 D  f, [& H- U. g
_TSD5 d" E# k; I% n
  E! |: F8 h4 `0 N, d* `4 N7 N1 P
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code2 i+ I! j: `, R  u5 F" d3 N  Z
6 F' q' |( r$ A! F' _
Name (_TSD, Package()
+ [$ t* j4 ?" p. u& R- i5 v7 N8 C4 j6 K" V, X- e! C3 B! _
{ , E2 ]* j! i3 O3 T1 R

7 d1 [6 }6 L) Q$ m' h, h# ^Package(){5, 0, 0, 0xFD, 2}. e5 e  _* a& F6 W) y( Y* d
// 5 entries, Revision 0, Domain 0, OSPM ) I$ v- Y- f6 g, V) Z! m$ V
Coordinate, 2 Procs
5 v: H. m+ j. n# _4 l0 `& C- I- \
; C0 Z8 \# O% ^6 e
- J. T8 @8 U# F& z2 o! r, i  s) ?' S}) // End of _TSD object, c& f- p: A8 c0 j7 o
$ X* Z+ K! B. e$ e" a2 U
REFF:
4 f' n& W8 s/ v' s1 F( M2 d6 J1.. J4 H, W5 ~" L! [& K& C" f3 |1 F1 P
ACPI Spec 3.0
: l+ n& f2 I5 q3 `* B8 p2.
& K! Y) P: p. G: B7 A: _Intel Processor vendor-Specific ACPI
6 B9 s4 q; R  s1 _3 u
3 J0 B1 ]6 g- ^7 @# _
2 U& j; e* d. w. e( xThat’s all!
* ~8 P1 T; [( A9 o/ e8 ^: \
( ^" h+ y6 m1 O% i, x2 KPeter2 j' c% o1 q( k

8 S! {  S& K4 g2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 04:24 , Processed in 0.064237 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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