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

CPU Power States

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

# g% G! O8 J+ s5 r' u1. Overview/ S( q3 e5 O& @' v7 A* m" t0 B
' I7 y1 J# K  B) @  J
1 ^+ O- b/ S( ~7 H7 z
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
% s; K" W8 ]: x) k8 X! ]/ V降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看: ~3 c' X$ L( F1 h. t2 i
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
% Z9 s4 ~/ W% p# r* Z9 T9 n- b! f/ L- O
cstate1.jpg
. g, w4 E9 F* _9 c# q" k# K
1

: b8 D# ?9 F0 K% e$ ^2. C-state Control* }* K& _% Q$ z$ ^1 n1 x  c

5 e) o, C; i: N; R' L  A1)' D7 ]! y4 e* F
Detect & Enable C-state9 i6 V2 g% Q: B) U  x, h
: _1 K3 H) m7 N1 @
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的支持。) r! d) @" W2 L+ p; S3 G8 I8 A, l
# e3 v. y) f% f9 G
2)# i" Y) e. P6 G4 R  @
C-state Basic Configuration
7 g+ d" q( M( O$ N9 K; Y4 G通常情况下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)。
$ J$ I/ `- f2 V9 ?$ u) G) }( O  b5 _, M+ d
3)
3 f- [$ X- i* r0 ZACPI Structure For C-state; P% U( g5 G, B" C! L& j" ~

+ h9 W8 \, v* ~+ g. Nl
7 ~) e- ^2 p5 ~- k6 O: [" ^
_OSC & _PDC6 Q1 e$ n& c* Q+ b; l
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 E& I1 ^9 |0 l. D) L; L7 m8 a/ Fl
9 p2 @, Z! A4 }: ~" Y1 ~
_CST
: ^8 T7 @( Y/ V& W0 ]% e* [5 F_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
8 J1 A% b, O% \/ I2 iCSTPackage : Package ( Count ,
0 Z4 M, @5 T% Y( P7 d; B3 ^CState ,…,$ i& \% Z7 S: `# ?2 h1 k. M
CState )
+ `3 M& p! X' G其中Count表示所支持的C-state的个数
8 s4 T! n% B% R4 ?3 ZCState: Package ( Register ,0 U3 P" ]+ ?% N
Type ,, E8 D# L" O; S7 Z
Latency ,
; q1 |; j% e' L7 o; x  PPower )( [0 N, y, r, a/ u* n
* Q2 N" F& n! _7 c! a
Register表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4C-state,其中C1使用FFixedHW的方式访问,其它3C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3
; n1 \4 Y$ D. j
+ I( B5 K' Y. Z7 B- i  w# NName(_CST, Package()
# l7 w# ]$ }2 Y6 o% Y5 p3 M* p/ B
8 }, h; S1 ~. O+ T: I1 R
{ $ g; B" t% m; w! p' L3 o
4,
$ k9 s% j. L& ^% l; s; e$ p: X# P// There are four C-states defined here with three semantics
8 z0 d; }/ O, D8 X# e4 Z

% {4 Z; G/ ]" p0 }9 C4 B, F// The third and fourth C-states defined have the same C3 entry semantics, a3 `/ H$ q$ N
* B/ T, D: D  t$ j: v6 Y3 z
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},  U7 j( W  q( A
1,
1 ?' e% g. K' ?20, 1000},
( P8 g/ @1 y& p1 r7 M

' M; @' O& f) ~" O# @Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
5 s6 y1 F) H' U" K# u; c40,: C. q# u, u5 b/ N# ?
750},
9 r5 ?& D* C$ p; C; }) z
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,+ ~& U& }' p$ g; }4 `
60,
0 h* a+ w# Z) ~$ a4 a500},
7 `# Y$ x( n- W. K2 W; ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,9 v' z( {4 S* p  o8 O" c
250}7 Y6 Z& ?( M( \! d) s5 ~

: L4 M/ ?$ _0 z' g})
# q) a3 ]! J0 C4 B2 B
, P# I! R2 d3 [l& I( o2 k- [% i9 l$ j
_CSD
+ M# h! N8 z( A+ Z/ S! o& i6 e% N7 s3 O
1 H  N* G4 z0 C# p9 \4 q# c: ~2 f3 c$ RC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
5 K1 m- U5 N; v7 C3 n) E$ Z$ l3 W1 J6 y7 l, S) c( u( O
) {, X" i! P4 H3 x

" |. m/ O6 Z2 E% d% z# l+ p8 Z7 g6 V* z0 \* B1 B
3. P_LVL VS FFH
4 `' ^* ~- }( i# G" I, x+ ]. A
+ F8 y0 n1 ]# Z# m# n+ h: F1 W" x$ d& ZP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
6 e- c$ w8 I! V6 _6 d2 }# eFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
" A. P  X( q& X% s5 @2 Z
4 f/ e0 E  A& R5 P$ u: l
gas2.jpg
2 n/ V! s8 y0 t1 Q4 i+ }$ k: p
2

9 \' _$ S  {" w, a# gOSPM解析到该_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的一个例子:
5 U$ ?8 ~4 K5 _5 m+ PName(_CST, Package()2 E$ `% i# @+ |8 l) r
, W# P4 C7 {( s& I& B5 R: _
{
# w4 c9 A$ f9 a; s1 W7 e2,# M. o. p  q! @1 N
// There are four C-states defined here with three semantics
* `* ^1 A7 r0 K. i) y7 I2 \
) b2 k: G) x5 M5 D6 E5 b
// The third and fourth C-states defined have the same C3 entry semantics
) u. m" V; l9 e7 b

" c: z/ z+ F7 cPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},. B3 w) n4 E' q% I8 y) j# A
0x01,
) F4 g2 h7 G- E- S0x03, 0x000003e8},
0 Z0 _" h$ N) Y
/ ]' d2 ~0 y0 H# Z9 p
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},' l, ^6 \* P& n5 ~, n0 J
0x01,
  V# ^4 T# p- v5 m* k! |0xf5, 0x0000015e}
( ]3 Y  S8 _, t9 Z9 v7 _- W5 i
})
  B2 B0 s5 p1 I, d) u  T0 e9 y: w/ Q9 d& S7 |7 ?& t

4 _/ T( ^& u1 n' X- OREFF:, C( Y0 X& b6 Q+ m# i
1.& H+ u& q4 |. J4 M
ACPI Spec 3.0
  q/ V9 J' n9 g2.
& E0 _" s( o2 j/ P. U) jIntel Processor vendor-Specific ACPI. F( f5 P. t. g5 C& A2 R5 Q' {

& T2 \/ [/ W* X  s5 n/ ^+ J
. W2 `7 R- ]/ a/ }) B9 E) {3 ~4 J) uThat’s all!
* s; c5 h6 D' e5 x: m6 C. f2 j8 R" U: U3 Y1 }) Y% H9 w# W
Peter
: E3 }0 Q, j7 M$ T/ f4 ^( n  z( g0 P6 V/ \: j3 p
2010/9/20  V; [2 @' ]  y2 R

, ^) Z+ b2 M! z[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview+ V/ w2 j0 w- Y7 r, y
' F6 i+ `3 D+ m# P
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
7 T8 b. v0 `2 N5 x5 X3 ?2 QEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
/ @: c& G: ?  L* s; H
6 J. L* z7 ]" B2. P-state Control& q4 ~+ G6 i2 Y, K  S

2 ?8 _/ ]1 D% a, C. e( F9 `( w1)* @6 P7 z* @! t; L; z& m
Detect & Enable P-state
: Q% k7 O1 I* O" C1 N - E% J: \8 ~/ d- k
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state% Z  K" v3 C& @" Q  ]% d* g2 R
( ?  {  K3 J/ }6 {
2)3 Z, m/ ?& |5 t/ v" _* j
Supported P-states+ m4 e7 m3 ^+ B
3 P0 D" G6 c' j( V9 {7 u3 y' c5 _; ?
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( f" q+ ]5 f4 J- x: L- J0 q" X; ~* E. v
$ k6 Y- R1 D5 e5 z1 l
MinRatio = PLATFORM_INFO
" c3 E: X- [4 i/ ~MaxRatio = PLATFORM_INFO& T- V; @5 R1 d7 q/ ?! p
RatioStepSize = 0x01
$ ~4 [5 M) g* f0 O( cNumStates = (MaxRatio – MinRatio) / RatioStepSize + 12 d; `$ e) i" `9 _

) @: J, j2 s: Q( V9 f1 o" s0 T; V2 C" dIf(NumStates > 0x10)
$ i2 ~( `# ]" G0 n( |7 Y{6 S' G, ]8 U; [# V, Y
RatioStepSize += 1( F" t: g2 g4 `4 A# b/ d
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
( N) [8 l  z4 U( ^) y}
! r7 m. l: I0 a; Y7 e! O , I: ]1 U$ C& W: Q/ y
3)
  J8 u/ r) F7 _. [7 qTurbo Mode
% L! l, R) f( E. f7 J; ^" w
+ h- ]: E! m, fTurbo 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
7 Y' \/ h% B& B" D # o6 ~1 i+ P" X" L' E+ O
4)
2 d, I3 ?  L* o0 p- y; TOver Clock2 F: o3 L3 c# d* v- A3 U# E. D

. \$ l9 k1 t/ V  x4 @6 j- j( L. W某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。2 f2 ^. h+ E+ x! k( {& t
( S5 T2 U6 s, a. J* ^# n. r
5)
8 h. l6 o+ J5 ~2 k* ]- Z8 YACPI Structure For P-state( N2 `- y9 a8 u9 T  P
+ @, k0 Z1 y+ T
l
7 t. j) \0 ]6 i3 E& q( k
_OSC & _PDC5 V0 N- Z8 g. l" `- h
- j7 h0 B8 O/ V
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
0 B9 {% D4 p! p ' n1 [7 t+ W8 l( s* y
l
1 W* j2 S* }! o1 G( L1 U
_PSS$ U$ G  s- P6 o; a% }" ^6 C7 j
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
! ?% P  A6 g: V0 l并且通过一个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做比较3 q4 u6 ^' K7 e* z* {, k: O3 u, D* }
以确定P-state切换是否已经完成。
5 U* Y- E# a6 D ( t; i- c6 ~* y- {/ V0 i7 u
Name (_PSS, Package()
( g. l0 C! `! H$ Z+ R: E9 Y{
: H& G. ?0 ]/ v# a/ y1 x3 h7 C# E// Field Name
* a% b- p& k' r/ `Field Type
4 s  E# w$ v7 n0 S+ q
9 Z6 a5 b! {& V% V; T- u- k3 A6 j6 `

( `, ]& H$ l7 I3 Y$ R$ d! B/ TPackage ()
  ^& Q7 j* \$ }2 a3 ?// Performance State 0 Definition – P0   ~' X, m0 P# F1 |( F  A1 M
, K+ f- r$ b; o$ h: ]
{
, h8 ]0 G( B1 e% o# f) g6 y% x5 @" W% n# f* {3 e  ~4 q. [7 ]
8 x% h- I$ @* Z& i! R8 H+ w( U% Y
CoreFreq,- E, B1 a9 q% W5 Q7 c, y! Q3 r
// DWordConst 2 ~  y1 |' F* h: j; @+ I# k
+ v( T! A+ |* {; ^2 w

+ E; z5 d1 G; xPower,
6 m6 z5 ~# U; S7 {// DWordConst
, R* W4 z- a9 r4 @% \, P) A% R  h! q
TransitionLatency,
: Y) h6 ?! o5 k2 o1 _/ y. t// DWordConst . M' E5 a8 o5 O6 ~, c  }4 P; R0 [

" i  R. h# n% x: iBusMasterLatency,6 E$ ~$ V1 S) }$ _3 I2 t8 c! F& N
// DWordConst 5 v2 b( \* i! s/ N: l( n

/ x- y# n, F8 ]! IControl,
: t) K# s2 v8 _// DWordConst # ~0 d! L/ Z) O$ H/ B3 K; {% _- U
$ ~% W! t9 O2 I7 K8 i; W
Status1 @* ^! b2 R( m

3 x) G& J# }7 b3 y" g// DWordConst
. k. _. H% ]. ^+ R4 j, `
2 G- V+ X4 X' r8 |. {0 Z}, ) n& }, x* T3 v( V$ C

' Q. t! b& v9 q$ _1 h.
; |( S% d& j: s5 D! e/ n6 }% [$ s+ n6 X( m5 P, }- r" c
. $ I( v  g, G* P& i
( ]( e% `; U/ h% V3 ^' j% M% [
.
3 N& K: k- f8 \  r- L( e! \}) // End of _PSS object8 v2 ?& W+ U- y
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 7 k* q2 x/ x" \2 M: J

* U4 ~6 m4 _. {7 i4 x' m  dName (_PSS, Package()
( G  }: Y* K) V, Q$ N% i0 f6 I5 D- f' c8 }+ q  i
{ 8 Q5 V. k7 m+ {; p
! x, Y& k  F: o
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) - w% m: y( l( x. c$ I
2 r) o! R8 L2 u7 ?1 e& A4 @
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
$ w- e4 m1 O3 Z. }: X3 y. ~& q* m. I7 r9 L; j
Package(){1400, 8200,
0 {) O' V' T3 q8 M10, 10, 0x000E, 0x000E}& m/ T2 x: C4 m; d
// Performance State two (P2)
; F" x+ y& |' w( [( e5 J( r# kPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
/ \7 e& w2 j% G$ Z2 ePerformance State one (P3)
% f' \( Z- y/ g5 F: U6 \' j! g. W0 p9 M4 v9 b% v
Package(){1200, 8200,
  [# u, _0 d, X/ }4 [' Z2 R  }" D$ v6 [1 G10, 10, 0x000C, 0x000C}, |9 L# \  j5 H6 m+ ?: R! V
// Performance State two (P4); H  E% |! m8 s  O5 L
$ h7 S$ w- j* @" _! h4 q  U
}) // End of _PSS object" s8 _  n8 R0 K5 ~5 F! j6 r' s; t
- g6 }* B- @! G6 c! U
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
' ]) Y+ L- Q+ ?5 ~% K
. h* h$ H) f2 V1 sl
! G! E) B, ?- V
_PCT3 V, o% m" G: \: X( D

# y( f. F9 \9 e7 |) Q7 M/ ^4 J1 r0 v( nPerformance 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的方式来进行。/ x( f- K! G* c* Z5 b8 F! u# B* S  ^. b

9 f5 }; S# h6 ], |" g7 j0 zName(_PCT, Package (), m9 m8 Z% J" ^" v
// Performance Control object . t% `9 T3 K3 O- G' p: n* U4 Q

7 C+ q! ~8 [3 m8 P" \% e{ * W0 W& E* @/ B9 }1 u/ a$ r
- {4 m' h, F, Q( Y
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},/ b8 T8 |; ?* F
// PERF_CTRL , f% l: i& p& w! x

2 v1 [% [) ?# YResourceTemplate(){Register(FFixedHW, 0, 0, 0)}/ ?& `3 M- _1 m$ E  E! W# l
// PERF_STATUS ' m8 o; R$ G' }- Y# |4 g# a
4 ^' P8 M" |% B9 a4 p
}) // End of _PCT object
& Y7 W4 W  m% F9 p # _$ A& S* t3 F' F( @5 \
l9 z/ A  K& w+ T: A/ v8 X$ s
_PPC8 B+ r: A1 [3 G: ^

0 `' g* H$ R' z- ePerformance 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
1 U9 m: I) @; v 4 T9 {! D; ~, ?6 y
Method (_PPC, 0)
2 O' z6 d, k5 ^! x+ d// Performance Present Capabilities method   ?9 d/ e/ n& \9 P& K9 D
) A, d* r4 s5 H1 H( V
{ + _+ ^6 S7 f  M( t$ ?
# w6 o  y  m8 o. A* ]
If (\_SB.DOCK) / O0 m% i* K4 f& |/ D

+ \+ `' U5 N2 _* |+ q2 G  s- k{
+ `* v! T1 Q& v8 w
  U/ g" i+ h* s" A5 k  NReturn(0) // All _PSS states available! m+ s  E/ b) a# K
, `; |5 D8 g% c) b9 r

, B7 X; n  M/ w9 [} # E9 f% q$ }! |/ ~6 P8 G8 b+ h
$ `/ J3 f& ~& T3 J/ s) [
If (\_SB.AC)
4 y( S5 N6 {8 f) T0 U
& G/ b# Q( L1 O- p) h* z# k{ ( k+ B2 j, e  t8 g! Z9 T: h/ _: @( Z

! l  ~2 ^" N2 ~. J, ?9 i+ D7 hReturn(1)# |7 q1 t- ~: B& s4 ]! B& p
// States 1 and 2 available
6 }4 W" Y1 t; E1 X# V/ l; A' T3 x. x4 @5 u5 h
} 2 c5 B# c6 o) E5 F% O/ A7 R' U/ G

' X+ ^* O1 F( c% JElse 8 G9 p3 C, N# S0 O

* y1 I8 T9 e8 V5 v{
% N' d' J, h% y* W3 v% {  `2 p9 {5 l, o* W
Return(2)
+ }1 f# l% Z1 n' L// State 2 available1 b4 X4 c/ J* q9 m6 t* J: T) j3 z2 `

! Z# q" u+ o/ n} # t( f6 f( j" Z& u( i

3 T" W% m2 d& s6 U# [* c# @& B! V8 q} // End of _PPC method
7 U6 I( X( `! g7 ?
5 Y( l. \2 k9 B! |/ dl
  a! ?9 N8 |2 S3 n; g
_PSD. p( b' M, q, [
9 J6 A4 {& @1 f5 T( ^. S& ]
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。; k( L) m& S8 F. R! t5 N
7 }& a" h& X) c
REFF:8 P8 ?8 J% @- z" J8 ]: |+ h
1./ n8 i4 t- O5 [% k. D
ACPI Spec 3.0, |& x8 e1 N' d# }9 j& p
2.
9 y& |0 M5 l' j8 t0 U- zIntel Processor vendor-Specific ACPI  a/ j1 p. G3 b+ [. H  U! t
" J4 ^5 t# [- _$ D

/ Z/ J. ]% R0 g) F3 rThat’s all!6 z, C) Z9 X3 }* G8 b; [+ u* j. Y
5 o0 o- P  ~/ n. z4 M$ p- T
Peter) f1 Q& s2 I  J& T: W8 a$ |% g" H
9 q, Q' L) w  o  m
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
2 |4 R; q+ ~$ |0 T
0 _$ W# }; j: @6 x9 g" g& Q" F( `% ~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工作时间的占空比)的方式
4 S6 ~  l7 p# m# k  [,影响系统的功耗和温度。) f8 I' z9 [$ _) _/ a  E' g2 z

% P& Y7 m. c& A  p2. T-state Control
; G$ l4 J- ?8 ^4 X* Z
% w+ |5 H; ]1 v: S2 W1)
$ N% }; T+ Y& \0 Z. e( Q. s/ JMSR Based Control; W$ _, _1 a0 h$ G

5 e- n" L: l" IBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 4 G0 l9 L' g+ d7 r' \4 ~

2 V' a. n4 @% d2); }; N- p$ l# r* v
I/O Based Control- j. U8 B0 N6 v) g

- y1 q% d- M# b! f除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。' _( w. n! W8 f: B7 w  I
' T/ i: L6 C2 U3 P& O. i/ f
3)
/ X" B- R5 {1 f1 F/ e- _( rACPI Structure For P-state
6 [! q& k' e! s( T; t/ l6 F1 Cl
& B4 C" k! y% e. @" J8 a
_PTC5 G+ {1 ^  Z- Y8 l, t2 H
  L+ ?7 X- i4 M- E- _' a) g
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:- s* r% u2 w' c7 G" y, Z& F

$ B* w  y5 t8 X; n% ZName (_PTC, Package() 6 I% {. V  M1 J. \  p) C
{ * k2 m, O2 }3 \) `/ K
1 `: @$ L, ~% M2 p! j
ResourceTemplate(){Throttling_Control_Register},2 M% _8 \' T1 G  ~+ J+ t  ^) Z
//Generic Register Descriptor
) x/ ]5 V/ D: |$ t, w
8 e6 u9 p; g, ], b( _" BResourceTemplate(){Throttling_Status_Register}$ J; X8 W6 A3 G! {4 R7 [
//Generic Register Descriptor 6 v4 ?+ r+ ?5 I, ^
}) // End of _PTC
: U) |9 V, Y3 P9 u
6 X1 D. ?6 d' E, w% n下述是一个sample code: m  g" z* Q- U9 {+ ?

  h& O( S' B7 J0 n+ G' X3 |3 F& ~/ z6 f4 K; `6 f0 P
//( k5 n- e. {9 ?( H

; A. a3 P9 A: l  Q) E/ g// T-State Control/Status interface; x9 T$ C& L+ l: X# J$ H. k( h2 E5 N

0 G- Q# n# _! I7 i+ j3 n4 R% B) n( V//
1 J$ p& {* R: d& g* Y& s; P
5 U! u0 V% K& t" E2 G" u5 OMethod(_PTC, 0)' B& ]7 E/ P9 B0 w8 F9 h  s

' s+ T) L1 K$ k. q' r{
$ b% H" t# @2 g2 B) z3 x- f7 s
! v( d# g6 _5 {) q' C4 a/ G//5 [8 K; V; `$ C6 k
  d' |" y7 W1 o9 C% C" v0 C! I
// IF OSPM is capable of direct access to MSR& A2 b" u- U- @+ b: L
7 I; z8 N: C5 c7 [# Z- M
//* w+ t8 j' a0 f& W; B1 C8 H7 w3 J
Report MSR interface0 ^) F7 o, q4 C, M* r

# s; j$ d7 |+ S3 k6 [; U# Q// ELSE! p2 a9 m0 E& M6 \7 D

& ?# \! ^2 n9 D1 _1 ?- g//
6 u5 t' x7 t( v' `Report I/O interface
+ E4 M* u0 f6 q5 n* v. h8 G5 A% h5 ^
//
' s- c6 F8 v$ T1 }# r
" a8 T& T8 U# b) }4 Y1 y7 T9 ^//
: u, M! V& u" MPDCx[2] = OSPM is capable of direct access to On- q0 f1 u/ \1 t( M' M2 `
1 D6 Y+ }% j8 g  x$ j8 N& n7 K
//
, q5 m! H( v8 |4 s" F7 d6 X. NDemand throttling MSR/ E+ m/ O; y% m% ~! V& Z
6 a) i7 S, A4 S/ R8 u( b/ B
//
2 S$ b. M6 O" w( E: C2 j5 h7 C
. S0 l: c* q1 T/ H. C( CIf(And(PDC0, 0x0004)) {0 G% e% c! a; t

- n8 l3 {. j. Q2 B% RReturn(Package() {9 F+ s" J% C3 D1 _7 K# H4 z8 j6 R
( k  V* J7 p: A/ e2 Q5 c9 B
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 }. k  G: l9 Q: M& n+ s

; b" j# R6 S: Y" _% wResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
: I$ O8 `5 [) C' W% {! m/ J
/ j1 \8 F8 k( r, N" n  y})
% W" ~" u1 i5 _, c0 u- F% H
! X! ], c* @! f9 \}5 C# B' n7 U8 v$ U0 ?4 o

+ J( n2 l, ]9 F: p* Y+ JReturn(Package() {
' p8 [/ y! @5 {  o2 M9 l
" U* b$ b; T' f4 _; Z& AResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},0 j4 e( c. ^; @5 @% b, i

4 }0 W  a3 ?* e7 LResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
& C4 J  @2 }  D/ B6 V, H5 e6 G% @* M3 E! R0 E
})& Z' w/ ^2 \' p. M9 \$ d

6 r+ W$ b, K% v! p9 H8 W6 i}
  J& n; B! y& J) L' a* V: |4 e" L- ^$ W

8 q" G) V4 P5 j) Y8 d: i, h' l9 ^- p4 W8 K1 s
l* Y( X5 j$ a4 W2 ~# [, P3 M7 u) l9 z
_TSS: j# E  M( d! m% a; T9 t8 @
6 @" M( ?5 l. F% Q) D% k2 B  p. T
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
: J' f  @; G: z0 Y0 |- K$ |: c: _Name (_TSS, Package()
3 `8 x( u# K% i, p( b{
, ?% \1 T" v% x* }0 a// Field Name
5 j6 b, }' v' b+ R; XField Type
4 D1 V; U. y- V6 u+ T+ \; o+ Y! O3 d. |* W! W& ~

8 b. e! L" h4 s9 o4 p
$ r* H; k: h: K  P/ r. o4 R# UPackage ()4 @4 y1 k3 t& z% M7 T$ s
// Throttle State 0 Definition – T0
8 `: j$ i0 x2 _. a2 F( r2 t& w
3 C6 z: Y' S" X$ S{3 ]- J' t. h5 q* t6 n( `9 h; Z" m; `
% @$ _* \' h8 k( s, p$ z! ~

/ W" M7 o% S, M6 `0 dFreqPercentageOfMaximum,) X5 ?& F7 K. b: @' n' R. ^
// DWordConst
# b2 B; y7 n( `4 W, @0 G' D
9 i% X, [+ r5 W$ pPower,
* H- O/ V& h+ [+ Y' v1 u: e* d// DWordConst % x, z7 \2 F  m# d+ g5 q, i

& U) H/ N3 ?6 A. }TransitionLatency,/ h, W  a2 _4 g& `! L* C! }
// DWordConst
0 b5 a* E6 g5 z6 ?; N" v# ?* `
# _2 N; T. F5 ~5 a* ?Control,
4 g7 f( r# S( s' D+ M// DWordConst
8 z) q) H- R( W: [/ }8 P) I& H; S
; v4 [; g) U4 b* PStatus
- g3 }# N: [, h6 q: t// DWordConst , n# B7 N7 |# \" G$ G, u
},
8 G6 A; K8 y% s% T……
, f5 f  T6 _( F/ p+ T0 g* n}; N! \6 z% U% I' ]% m  c" M9 S5 C7 E
- F8 g  ~* Z2 ^" x3 |3 @+ f- A
Example code 如下所示:
: @. N3 Z% I$ W. u9 W/ @- a6 E: x, S) M; g
Method(_TSS, 0)4 y, r; H- z2 j8 J
8 R6 e% d# H3 ]* Z" p
{
% ~" Z- C8 n+ s4 ^  p1 ^
( [; }/ K1 e/ c; e5 i/ MPackage(){100, 1000, 0, 0x00, 0},9 i! V' F9 M; X) ^
3 ?8 v& J5 @% R, Y% n
Package(){ 88,
9 D( {* E, \# n( T7 |875, 0, 0x1E, 0},2 @' T7 L+ B9 N8 R( J+ I0 Q( F
. U7 w: ^( e& C
Package(){ 75,1 ~' C6 k7 Q" ?* K* f
750, 0, 0x1C, 0},( m! o7 c  Y2 u3 r4 n7 Q
2 L( r7 V$ D/ S
Package(){ 63,/ ~; w; m3 P5 E; F5 P
625, 0, 0x1A, 0},
. J8 R* s% e' D' _- D
6 ~$ m& b5 R. a0 JPackage(){ 50,
  o, d7 L  G, r; X* v% q! |; D& e500, 0, 0x18, 0},/ ~0 ^2 e  m' x4 d9 w
. _8 \9 a( |+ Q8 s6 i2 L9 ~5 \
Package(){ 38,( T( }0 `- e- @: I( q4 ?
375, 0, 0x16, 0},
: R8 G+ n$ ?! ^: A
2 `2 Z( c; g+ \" c* k- N9 \Package(){ 25,
+ W( U3 X! G: M1 Q  Y; k! e250, 0, 0x14, 0},$ O' F& v1 S+ N/ J: F( Q( S

6 `& Q! I2 B# x$ U: _# xPackage(){ 13,' F/ x5 I5 Y: \% k  k
125, 0, 0x12, 0}0 _7 ~1 i4 J% m) x

% z1 s2 _2 O6 A" a& e, t* a}$ H! a* w0 O6 c& K% W
6 _% D+ j9 b( d6 B/ ^

8 [/ J) L% X7 ?  Ul$ G% z$ ?* w9 g- d! A( L
_TPC
* j8 f& w# C6 y8 R( d2 V5 M
* l/ F6 C! |4 H1 u4 @. ^/ l; d3 oThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC) m! J2 B0 [, c: t  a
) V4 u* P5 m" ^% l
l/ e7 T7 L& z' T% |5 v* m$ U
_TSD0 k& h, p) J" \8 M$ y
5 H! |" S8 j* c* j; _& J# v
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
, T  t2 |: j) T& s6 x( \ 4 J& M; t" v) @7 P3 x6 f; s( A
Name (_TSD, Package()
% L' Y' R5 d3 X3 T: {( ?
2 U3 h; p! U1 y2 T{
) G: \  ^/ W, h' [' I: ?0 H& {7 e4 U/ c
Package(){5, 0, 0, 0xFD, 2}  H0 w, w. I8 I( S9 n5 A: d$ N
// 5 entries, Revision 0, Domain 0, OSPM   E' F( ]: s. B/ q
Coordinate, 2 Procs , K$ k, p' `% l; c' i' t
% V8 w  X$ @% r% u+ `! M  Z

$ a6 }' q" v- Z}) // End of _TSD object
3 L4 L; F3 g$ a ' [7 `9 {4 I# G4 ^8 v- ?: P
REFF:
% j& W& v% C; N  T- _, ?1.5 u* x/ g5 D2 o2 T- a' F* E9 o4 \
ACPI Spec 3.0
: t8 I( w/ E" C. u% Y- |2.' M, |* d& ?# f
Intel Processor vendor-Specific ACPI
4 d( `$ I/ p3 N$ J/ q; | + _% ]; G: c: e2 P5 I$ r( L- S/ `

+ F# X+ r# m% }* p/ p! v% kThat’s all!( q- a9 f" c3 N. K  }

4 e$ l0 x- B% m+ S! d2 f0 YPeter
" L' I- w% |9 Y9 R7 X" d
+ h  {  `) g0 T& S2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-23 07:12 , Processed in 0.125679 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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