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

CPU Power States

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

! c) W5 W$ z+ J* |1. Overview  g: m9 o( Q% d3 D

% [& ?- t& V3 _: F" \+ m+ C/ y" e, S' {' e
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换, F" T. ]/ M( W4 `- g
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看8 r% ?# v; ]0 Q% j$ N
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。5 h" A5 v; R. W+ p

5 z( u* {0 ], _& a
cstate1.jpg

2 x* H0 ?- C' C
1

6 H6 p; t4 |( Z$ W5 P2. C-state Control+ t5 V& l7 S) l: I9 P- g

' s  ?2 O4 L  S3 ~5 c1)
3 ^; }& q; M0 k0 S8 MDetect & Enable C-state
$ V6 ^6 k- z# J  R& \, q: e2 R7 Z# d; }+ @& f, j
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的支持。
+ S: w) T) w& V6 \$ |% I2 v
( Q. S+ U+ `% ~5 B+ M/ i0 @3 ^2)4 u6 D( t/ X5 I( X: q' I( L  B' @
C-state Basic Configuration" [& i6 ?+ S( 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)。' I# f9 d4 ]. o  G. i% ]) M
% g/ r0 R/ @* U% y
3)! V  Y3 K; p9 c" k1 ^' v
ACPI Structure For C-state  J% M* A7 t+ K9 o& x* i: V% A& g

$ s5 k% ?- c) e+ f" m& Vl% @) H* ~. N2 i( q/ s$ ~' z2 O
_OSC & _PDC
- L% X3 l% d$ O/ Z7 G_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures' m- o* D6 e, ?. @" @' S
l& p- D" W3 l: ~( c
_CST/ O* U9 _" {  G) G- x7 N, Q3 {& f
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
4 N. b* ~" y. R* tCSTPackage : Package ( Count ,
0 c7 e+ a; k0 l3 b$ H) fCState ,…,
/ y; B4 I# n4 T% y4 k" q  g& @CState )
7 q/ u) ?  c) L6 J8 T5 a其中Count表示所支持的C-state的个数$ p; K- m: t" O' O" Z; h
CState: Package ( Register ,% x8 B, @6 u2 G( @
Type ,  ^; E5 R6 @: D9 O0 S% \9 A
Latency ,
/ _+ y& E5 y: p0 W  W- [2 v: W  iPower )8 X6 t1 T/ T3 Z$ p1 t$ G

3 \) x" X( y, k% I: s) yRegister表示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 C39 o+ g6 _4 k; I; q( e
5 p5 K. b9 y, X8 e' j# y4 \
Name(_CST, Package()/ N  g" q! k0 W( s) m

3 C0 ^9 q* U) A( j# a{
/ G6 E) W. Y$ I4,4 ]( Z" S2 l& _) [
// There are four C-states defined here with three semantics
7 @% D, u3 v1 g! K3 \: i
. M/ e7 ?0 P4 d4 h
// The third and fourth C-states defined have the same C3 entry semantics
$ F) p# o  X7 Q6 o

6 \& K2 O  u8 f9 xPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
8 V# E" P  a2 J, Y. W9 T1,8 Z, N7 q: z( H0 I3 _1 w% q
20, 1000},+ ]2 D/ h) |6 N" p- t/ i6 e
8 E1 k) a. e" M# Q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
2 F9 M( r" a* J$ g# D$ J+ j40,9 |% s  J) o$ L) A* w
750},

# _" w; t" w5 ^% w2 vPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,) O# e( Q5 N$ b
60,
* S1 N2 G3 j  ^: H! M8 V6 F, T$ p. L+ A6 b500},

" x# ]& Y: c' Y. E: @, [Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,# U* t1 o$ i" C5 J$ Y+ X: R
250}0 |* P& k# ^, m6 g1 z
* z# D* x: e' r3 U2 P
})
3 J, X6 Q* j+ t5 A, {" [$ j& \& y4 u# a- }
l
1 N2 L" }* {0 \( }
_CSD
! Z2 s) E! {% R: ]; @. |
3 u) J* F1 B" RC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
* m, L1 m: z3 Q% o
# y3 |, B, }& z6 u0 \% w3 M' O
9 o1 e8 _" r0 g' A8 z+ q& k
) F( `9 J% i, B9 c& m; q7 ?" s0 Y8 H0 {
3. P_LVL VS FFH0 J) T/ m: R2 X/ _4 P* D6 E

  G% Q+ F, i4 o+ Z  dP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)" [( R% j8 x: |
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所示:9 e# u. ?+ s' U& s5 \% M8 z5 v
$ P7 l- ]4 \7 _0 v$ D) z
gas2.jpg
% C7 d/ O, G4 B
2

& |6 n$ _) ]: \: x! B5 i& _( H6 SOSPM解析到该_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的一个例子:
- H  r* D+ M( UName(_CST, Package()
9 Q' f9 C6 O, p

" O, s" G) M/ g+ N0 h{
# P; N4 I- a+ R2,  O: B, i9 q8 g7 }
// There are four C-states defined here with three semantics
* f: r' R- _5 b( c6 a
' D3 |, D# q7 {. b
// The third and fourth C-states defined have the same C3 entry semantics
% }8 S) r( @7 ?5 i6 o( [

" g  P/ i4 A) h  mPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},+ ^8 s: [8 m+ d3 W# O! J/ o& q' y
0x01,
4 B( u  h0 B4 u/ m0x03, 0x000003e8},( S; w4 `* S" q* T

4 B5 S1 h  R$ B7 y) Y8 Q! kPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},) y8 [2 }" o& z* T0 h( ?
0x01,
4 x! e; t- @' ~  @. }' X' Q! [0xf5, 0x0000015e}
4 x, x. R, K& Z; l
})
4 ]4 Z3 N/ Y4 L
7 P& F! q7 ~  O3 l9 Q- V5 F! t, O
- X/ w6 v) Y9 v0 b% N0 gREFF:
9 c* ^- c  u3 ]6 C1.
( i% \# |% K! z  L8 jACPI Spec 3.02 s% \0 J3 K  A5 R6 L! Y& s
2.
( v' o1 o" G2 x. GIntel Processor vendor-Specific ACPI1 }5 U) |9 J3 h# L9 y
( k: y7 j. T+ _8 z
; _* ]/ d# A/ h% I& ^# o& ?! u$ w
That’s all!
1 `  b+ r& N' A3 d0 \
$ H# ]; O7 X/ M2 k  }; MPeter
$ p  C' V& D0 B6 \
2 n' M4 o) [4 P& S) l! y- U2010/9/203 f- `  u7 C. e1 A9 |% ?3 O3 \
9 B( R& s3 g/ L0 p, A" u) J
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
2 w4 ~# z. I4 m# k& R# k4 s# c' `
9 a% f$ F: c4 Y  ^9 ?/ gCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST' _7 u0 g/ ]- O% \, ?
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
" X' S% p& P" ^5 R# l$ d . ~$ u7 c$ Q, `& }9 o- Z
2. P-state Control+ E  p3 S$ o* F6 V% z" m4 S% h  ?

& x! M3 [9 U, a; G$ M' S1)
; y4 j! ^2 y( ]  K- e0 _3 MDetect & Enable P-state
# N% J. `$ j% P% \! b
" s0 C3 J" H+ sBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
. H8 D6 w4 _1 F) l8 G
: s0 G3 M3 f; b# k2 I2). Q- j( X' h( Z! A4 _
Supported P-states
6 {. L5 i: B. w5 F; q- s & v5 o0 W3 \6 v( O
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) s2 o) d3 T: [$ r  J6 Z( y8 @( o
  H5 |; U/ F% U2 e
MinRatio = PLATFORM_INFO, E0 u& Z  \1 `% u. `- s; N/ B
MaxRatio = PLATFORM_INFO; c: ?1 l) z2 M+ P7 b: s$ Y
RatioStepSize = 0x01# h6 D- U# [, u8 |7 D7 i8 Z; Y
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
) V0 E- K, P4 n$ b
% h" o/ x8 b- b( v5 P; H  oIf(NumStates > 0x10)9 o8 e& K+ c5 S$ I) o
{
) p( r6 W3 W: d' ?6 i1 x  b, B9 vRatioStepSize += 1* G/ y, i( P  \; ~, r; q: t
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
+ W. u" _' [* _3 i# R3 d& ?}. R/ P. c* w# x
+ C$ `7 }, u3 G+ p$ d0 x
3)
' b) }' C3 ?. L9 Q, T, J5 T3 e5 jTurbo Mode
2 v4 D9 R8 O* S- P( x% O 4 @( R2 ]9 [  g$ G2 B
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 ModePerformance1 z+ L+ c; h! M- Y& ~
/ x- S3 S/ m- p$ S
4)0 |( \& i# @1 a5 e
Over Clock
0 j* e9 P; q! o, p+ u6 J " f# U) F& \- y& i9 ?" G/ }, j
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 @. F! s) t& N) Z  {, a$ ^

% Q( p# J+ }9 Q5)
: P7 O0 H- L, X6 _ACPI Structure For P-state: {+ |5 c' L( ~7 T5 ~9 _# L7 H

$ C- n, f! W5 Y* i3 Zl
0 k* c+ s5 c- |2 D$ m
_OSC & _PDC
" G' A  t; V/ R: O4 ~, G/ L - }/ O. c& b8 W, @$ j/ X( K
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
9 P- U- V$ b( h" o7 t6 r9 [ 9 C9 ^9 Q* l. M, d% `/ A
l& J) C, g% m* ^+ U2 K. n
_PSS' a5 ^3 k" x: p9 ]4 X3 C4 }0 k
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
, s, P( W4 q  }5 h) K并且通过一个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做比较( [/ V$ d! w8 \4 @) c
以确定P-state切换是否已经完成。
- z% }* ?. P7 m7 u 8 J& l  }' {+ H, ]" k6 M
Name (_PSS, Package()
0 Z2 H% y# z$ ^# |9 t{, G0 \6 b3 V8 q
// Field Name5 d* w8 c( i! D: H' o% B
Field Type $ }4 \4 z0 D" _. r" I  [* R
2 \5 ]& y/ F9 h% u( \8 a( J3 u
* f! F5 }/ k0 A) u) z

+ k: _  i2 k1 n9 `/ O. pPackage ()
( c( r. |$ h6 ~6 a3 K" B3 t, q// Performance State 0 Definition – P0 # ]- W5 w' N  U0 Q* K8 y
1 C2 e# E9 `: E3 F% Z( I
{- a6 }8 ~9 L8 S$ {0 \

4 _3 _, t3 ]2 Z1 @; l+ v
! Y/ ~6 h1 l/ p  l. bCoreFreq,/ B. u. g1 g8 _
// DWordConst
+ r8 y* T$ \0 ]( M
9 W' E8 ^3 T% d7 ^" T8 Z3 ]
2 r, d- E5 @- L8 C) z7 hPower,  [; G$ A2 d- a0 \6 N$ |7 C7 E7 r) f
// DWordConst   p* c6 b. l6 K$ l4 d$ B! K8 _0 Z
2 @# t! o  g9 V! s' C/ i
TransitionLatency,! O9 H! J" p) `# H
// DWordConst " S" ?& d) y: D% n) Z0 e# F

. D/ j( }. {7 @; l; z: M* PBusMasterLatency,
3 V7 E1 t$ n! a% \// DWordConst ; ^( z! P( }2 D# f

: {$ S. D0 N' Z. O3 P0 uControl,
( L/ W1 Q: q, p: c" ?# _8 s- }// DWordConst 6 O+ {. o. ]% p! Y: ^

) m0 Y8 a0 ]/ P- O. w+ I+ tStatus: o+ y( G: N$ l

9 [3 h  r. l  o! y( J9 c// DWordConst : f% z. |5 x. ]$ d

$ j- \( D/ V/ ?! j) q' ^' v},
- b  d+ M* ?* ]" l* j3 ~8 D: y0 u& Z1 h6 N6 t8 O3 J
.
; H: o& x. c4 Q! u2 d* k8 T; a5 P
  T$ M8 b$ g1 C! G7 N7 |) l% {, k.
# u4 R2 W9 k( s7 C' M7 ?8 H
2 ?/ o$ g; T; }  a, F( n4 [3 Q. 1 l* @6 b. O$ M
}) // End of _PSS object4 ~# t; G: F) i9 G
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
9 b# D6 s7 v3 |2 x . R5 p: z$ b% l& N$ [8 m
Name (_PSS, Package() # b6 a5 D6 q$ Z; Q+ r: ]+ n
; }* K! s. w- g' s7 w+ F  c
{ 7 p9 o$ l: F3 m+ n2 q- {* v

9 A$ W; V# N  l- k7 d9 c- hPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ( j9 S3 g- w: U/ w4 b# M( F1 o2 |1 }
/ ]2 U  \. Z5 W5 M# z* O& m1 L9 Z8 l4 ?
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
0 _( G4 w, T* W/ v/ B2 j1 E, K  t  r2 a5 C& ~( D0 v2 H
Package(){1400, 8200,% W6 V: Q$ `; O+ m' J
10, 10, 0x000E, 0x000E}0 n& \& X1 W+ D! h; q
// Performance State two (P2)
  R! F' O7 |1 e; }% ]. L2 oPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // ; d8 ]- s( F& b
Performance State one (P3)
1 W5 f2 J* f# g5 h5 @6 a/ |# T/ i% ]; D& m0 q" |
Package(){1200, 8200,
8 g, f; Q9 {! o0 T- {# w8 ~6 e! Q10, 10, 0x000C, 0x000C}
$ G; T8 ^0 B, K: @1 }4 x! ]2 p// Performance State two (P4)
/ Q9 x' ?" }- ]& G/ s- ~; X3 b2 m) r8 B1 c) K( c
}) // End of _PSS object0 @0 e) {( e6 L% q  T9 l

2 y0 `# i. e. [  u另外当该平台支持Turbo Mode P0将会reportTurbo Mode
' U$ U1 l" ]; U4 N3 u ! k/ l% }: z( b$ Y
l1 Z- j; u6 o# _( L$ l  Q) [
_PCT; w+ h. ]1 X- `% k- ?- Y5 V
& D) T" d! z: v& \  \9 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的方式来进行。( ]: r7 l- u8 O9 W

' i  e" z# M0 R; [* h, AName(_PCT, Package ()
2 s0 s0 f7 Q  J( @' b// Performance Control object : t" P4 _8 L. z0 E, [3 T9 z, ?" H

. N+ P2 ~0 \' B, ?; B{ ' n, _* A( V" w6 G4 }
  B; r7 }+ B+ v4 \, m; w
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 e2 R' ?7 j& B+ \7 H& f4 @# A// PERF_CTRL * z1 H6 A- B. v2 |, j7 |

+ s$ t6 n  W' Z4 @3 i3 |9 zResourceTemplate(){Register(FFixedHW, 0, 0, 0)}; F9 B7 b5 e2 }3 k% {; X6 j3 o
// PERF_STATUS ! {0 M0 S& F" H

3 Z" [) z9 f! e* e" K}) // End of _PCT object6 c" T3 s0 Y& y6 C  {3 m

4 {0 W% M* ]7 u: Xl* v, }$ W- _/ X% o0 i
_PPC) J# Y5 h8 c1 |! U- |/ b
5 h/ \' r; f; T' _
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-states2 |/ N5 Z  l0 f5 ?5 h8 w

. o- A1 Z! k4 l) u+ I2 e9 r3 K* {Method (_PPC, 0)  Q. O- x, M- q, H; [7 @9 u
// Performance Present Capabilities method
% Z/ L. c8 H3 ?& T, J3 J; I% F) T8 g6 x5 x1 L4 Q4 y* o$ a
{ ; X- f, s/ ~7 R( [! p
7 f, O6 J$ `6 g' I5 K. M* r
If (\_SB.DOCK)
: q  m0 {! G( P2 E# t! \4 {* ~5 u) m5 P  h6 C9 h' T; F* N
{
* g6 R  ?& V1 H, z% q9 Z; u
2 l6 R0 c; b9 C% k8 q6 {% VReturn(0) // All _PSS states available' Z7 ?- o( G! E( e1 V" F
: |4 i/ |: J' n; m

2 ?1 j- [! r: U7 r* C: k}
8 d1 O5 Z1 t3 o* p4 E
' y$ I( I: _. o* L2 aIf (\_SB.AC)
( f! O8 f2 O5 i# N9 t4 b& p( W. ]
9 ^6 q+ _7 i! O4 c+ B2 B& I0 D{
$ l# l: \$ y% @6 c' `! s
" m. c) B7 r3 u: h4 D0 w9 EReturn(1)# p! j' ~! ~5 }* \
// States 1 and 2 available
3 Q' e4 u7 t5 i7 X0 }$ F8 J
9 I9 P0 p0 `2 N, {& T8 @2 L}
( ^: J7 f4 K7 l& k
  G+ l4 O7 E; p( o: m6 xElse
: _, Z" u+ @# \
# u- P1 J0 B/ d: P: V& V( |{
" r+ ]0 Z- h0 Z4 ?) i) T8 n: i5 B! V% u7 {' w1 u( V  B+ V
Return(2)+ \, \! \7 U5 X( E+ N  k
// State 2 available0 }+ N$ h: o3 |( a# J
$ I6 I' z0 V- H0 g# {) w
} 5 n' C& u1 U0 P( c  P, P& y9 v: c

" d  X* p# A8 v9 r" Z} // End of _PPC method  u8 u; n6 g6 T  x0 r: v0 L; J6 |

3 ~2 D5 d( r! C0 H' Z# s- ~& Tl% d, ]; ~) m& [
_PSD3 l. ?6 h1 E  P3 s* X  ?
* Z8 j; W# M# S" P, ~, l  N
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。! B/ `0 b1 p& j

& X& S: ~& b  S7 {% r  R( oREFF:
. H6 S: t, i5 h* T1.
( b" I! d" A6 }9 {9 c0 ~9 {! [ACPI Spec 3.0& A  m+ c  P& d" H" B  Y& Y6 C
2.
: |4 q( ]+ e  }! }% N" W3 PIntel Processor vendor-Specific ACPI! m& l7 O+ A3 q9 W# O
# E# Z, q! U, [. o1 W
# {1 E) g2 }+ y2 Z# o& P; n, i+ ?
That’s all!
8 t. e$ v) d! C9 `8 |1 ] 3 Z' R, I( j0 {! l' N: ?
Peter
3 U! _) C- }- a5 \
* \2 D, V# {; ~. f/ [2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview- d; V  H$ ]# P  N. C1 }
9 n! ]9 ^  t  e4 x, X' n- ]& y
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工作时间的占空比)的方式
/ r2 v9 c1 i+ c" S5 }$ @$ P: \,影响系统的功耗和温度。
& l4 [$ n& A2 W( x  J
+ O' F/ q  u/ K# M3 _. b2. T-state Control
$ g6 F- ]3 B) F, ] 4 O  g- @, g7 a
1)
/ I! N+ J7 @6 }7 ?  _MSR Based Control9 B1 E; N' r# ]2 J1 G1 X5 m/ w

; D8 Y! n( [. z. a: Z9 f; }BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 : Y. m$ k% \/ ]3 c  U& e% G

3 }& V% f* J" x$ b3 X+ M+ T2)/ Z, `( @3 X% e- B5 c
I/O Based Control
; S& z- Q6 c  L) G1 P- C/ I ! I2 b: g7 E# b5 R/ v
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
$ Y" {4 w" t4 A* ~4 s; H# P7 U ' {. Q1 j$ y+ D  B3 _
3)
( ]# o' L" g; X$ }ACPI Structure For P-state
7 c" H1 l( h# U) l9 Cl
1 {% I1 j' c1 \
_PTC
1 v7 I; k+ B9 ]% R7 j # T) J( v6 O: v! {
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
* z( h) b8 a4 y & q5 X" z3 z9 c$ ^* `% z- b
Name (_PTC, Package() 9 I9 m: }+ }% Z5 c) u
{   e* q2 z- Z% _4 j6 N
( I: Q% v1 O7 K$ z5 H
ResourceTemplate(){Throttling_Control_Register},+ U' L& }' Y9 A( E  i
//Generic Register Descriptor
. m7 U" v2 Y1 c' j; T  f# p6 W# E* z% o2 E9 Q  Y& k0 J
ResourceTemplate(){Throttling_Status_Register}
! }$ u3 A5 ?& b5 ]& R, I8 K5 \  O//Generic Register Descriptor
+ ~; J$ P% v( t( `* e1 F; P3 W& ?}) // End of _PTC3 T; Z- R4 A5 b& m$ Z( S5 u
, j% J# b) N& b: u( e6 |6 p$ [
下述是一个sample code
: |) }2 w" n+ v& v: S- O7 j3 J
* W" e" G9 V+ b
  B" b1 q4 i* T! v  g5 x" E
//6 b2 x& }; Z( T6 b

$ _/ h0 r4 v( m/ z! N; m+ n( C6 v// T-State Control/Status interface% e2 B- a) |$ u5 u/ Z* I7 H
4 }0 @0 t" r: \& W/ m& W6 \
//
$ P+ L6 |0 J7 Z( L3 ^$ G) R5 r( z5 D; X7 l$ n, s
Method(_PTC, 0)' W$ L% i$ x  F* K: i4 n+ t/ r

- ]# D# J: ?9 x. [{$ s+ e% X6 j7 A! A1 W9 H
5 s1 n' ~9 h% |4 S' n
//
# m# G" R8 T5 A8 K# h  |9 Q
1 l: v) B7 s8 o4 W! `// IF OSPM is capable of direct access to MSR
& u( M( d1 y+ L4 t! D; I/ m/ t3 k
3 y! S( W7 B, ?4 H//
; P' m2 b# T1 D; J. }' J/ KReport MSR interface
8 \/ [8 q4 ^7 Q) i+ `  c7 u9 ^/ r% k1 Z5 w; o$ J9 I
// ELSE
6 l. J3 t- N  q% K2 H
3 K3 t/ `( S' n//! v/ V! G! B7 C: {
Report I/O interface
; X. r- ~/ c, R7 ^4 X8 f6 i2 j3 ]+ t7 a3 b; x; Z
//
) B( ], A3 h, D" {! r/ t' y/ q7 z# z( [8 G+ ?+ n
//
: I; `7 B6 {5 d2 i' ?PDCx[2] = OSPM is capable of direct access to On; R) g/ M2 i6 X4 g

+ e( O5 C. ?5 G  f//
7 H" [* Z) e9 E2 V5 F( zDemand throttling MSR
$ I# U' A& n6 `% t( ?8 ?) R4 F4 j
! a8 h* l$ B7 G: Z& C//+ r/ X1 Y* a7 [7 G1 q: l

. \0 E4 R* \  [4 yIf(And(PDC0, 0x0004)) {
9 m2 m. c$ I) ~# d4 [: V* P% b
& W( D' ~5 V0 c6 MReturn(Package() {( e  E* Q8 P2 |1 B" T

  ?% F7 V$ S" |  j4 nResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
, c( m, A3 x' }1 W' r, {& l
5 }# i7 O+ Z* r5 |5 qResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
4 R# B2 ~8 c& x1 ^! P5 I6 T8 @5 X
})
- C* `- [' V% R( I" P, C# l" B* {+ [! C) g, _! P
}2 ~7 Z* u& O6 B/ p+ W
, u6 \: ]# z0 |: F% A
Return(Package() {0 A$ z' y  Z$ o8 u5 e
( @: S$ R- B  w, f0 m5 t+ A& e
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},3 w& O! T; D# M* L1 B! B1 m
& L& u; z  X* {' R' S( a
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
( s; F9 P" p2 b
) a7 B$ E; |; G' K6 p})! V) A; D- q8 `) f0 {
; {1 J9 u) G$ \% b
}8 E% ]$ \) O- A8 c4 p# }
: _# w9 y0 o0 d" }" `3 O1 \; u

; }7 Q9 _3 r; I
8 {; p0 ?3 Q$ K# c  \, Xl
+ k3 w1 V+ A( p8 \/ N0 H+ h8 h
_TSS: y, U. u4 i4 v; R0 Q! c
& R2 s  I3 w& V- d
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:/ _( \# f- b% o* C1 Y! a
Name (_TSS, Package()
+ E2 X7 o, x  t{
$ F9 e  C  [* R5 o// Field Name
! O3 i/ d5 @/ dField Type # r$ s1 h" Y* ]2 h, E  S

- R6 m6 A/ \; w5 o% F6 T$ }  y' I+ |& U

: E9 O8 T' P( q0 u) m  h) f( e4 {Package ()
3 j% H  t2 {# {// Throttle State 0 Definition – T0 4 v4 N! v$ y; ?
. `( Z. r. k- z( O2 A
{. F  O" |* l# d9 n: t
* a5 ~" N4 d) N2 C  u
" {9 x1 ~* o! n
FreqPercentageOfMaximum,! X0 Y: ~* @( b: T0 G/ l+ B5 ]2 I6 w
// DWordConst . V+ I9 z; y9 x" A" e# i
! E0 O" y  m4 s
Power,% e9 O% c& @) Z" ?  }7 w
// DWordConst
9 z; m& e/ X( c6 v& Y% k& [: d4 V5 b
+ L/ w0 m/ S6 RTransitionLatency,& o! _9 n; S& o8 B
// DWordConst
  O' O7 c, L* {9 t1 {/ X. T
) z! G  b' \# F6 L2 b* F* HControl,
: Q* z! C" R* J+ D  U4 Y0 `2 m) _5 p// DWordConst 3 @" W4 A+ _1 `3 o+ h

) x+ [$ {; j3 V8 I1 c. h: T. F1 p4 kStatus
# w. r/ p) e+ R8 R4 y// DWordConst
% R  I; V9 Z6 h2 L# T8 O/ J6 B7 U. D7 L}," a! d- X' j% a- P
……
2 f  a9 ?' G) j5 v; H2 K}* E; Q, J7 D; F) K" X7 A* X4 A

& j; {1 y* }" t7 B7 `1 RExample code 如下所示:  b- q# Y& f& r3 J$ ?! r

" j5 K% s0 P9 ]. AMethod(_TSS, 0)" x" E! }2 z; v) ?& i) b
  I8 [$ |- s2 L9 D: P, H( e
{/ V  N+ }  Y9 \* g

" q5 }6 ]0 N7 H! zPackage(){100, 1000, 0, 0x00, 0},4 J1 k2 C7 x; e, w

4 K( ?4 o6 o# d+ t% \" }6 ?5 I" V6 o3 vPackage(){ 88,
/ h* \! Q$ i+ ]/ r' }875, 0, 0x1E, 0},
4 e. m" T8 M* w! ~+ v8 z- {$ ]- \4 }& Z. v6 l
Package(){ 75,; w2 K! a( k: N# e) `) y4 l
750, 0, 0x1C, 0},+ c& {- C/ Q% z5 b4 I- I
! ~/ N% G4 f$ P4 p6 n
Package(){ 63,0 B7 R$ L' |: \5 u" i
625, 0, 0x1A, 0},. m2 z2 Z# Z4 M' ]# s' U

! i. M3 V2 K1 LPackage(){ 50,0 A$ q) g" x8 p
500, 0, 0x18, 0},
+ g% _7 x& F+ o7 r* N7 `$ ]) T- w3 q
Package(){ 38,
- i# M2 l. s! l: l$ {, x375, 0, 0x16, 0},5 T6 ]7 s* o/ ~7 n3 j

+ C# X3 M7 g* Y5 JPackage(){ 25,
" U) \) X/ G. w1 f, N% g250, 0, 0x14, 0},
1 v8 ]  H: [4 p7 C* `+ {
+ x1 R: \4 w* x; `/ m  Z8 o# u4 SPackage(){ 13,; C* M9 [" q0 T' D5 Q+ _
125, 0, 0x12, 0}
! b- G) E- f$ x  D0 V
" u, W- ]0 ^* }) K}
0 u6 z5 o" R0 M& C# q# E" E  v! j7 Y4 E% `" o
/ M" l8 z* E7 X4 q6 n
l
6 W& U6 Z& u8 \4 N$ v9 Y9 w2 g
_TPC
2 N- o/ ^- C0 ~+ k% |, P# Y
; m  g' x# x5 ]$ Z$ d: pThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
6 q! q. x+ m( O, v; ]* }) u5 `   B5 W8 ~2 Q% g8 D' i5 G
l& o& q1 |8 Z9 v2 g
_TSD
* ?: ]; \- p( b- r ; V2 c% w, ?# t# |
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
5 f7 [. w* n8 I
2 D( x0 q, j- n4 z( O/ i9 y* yName (_TSD, Package() 4 P$ W. p( H) s" V4 Z- l- {
1 J6 M) D" G3 ]& J
{
2 `, ^' I1 {  K7 X+ S8 P! k& c9 ?) z+ w0 k! n! i
Package(){5, 0, 0, 0xFD, 2}
+ u% n2 G7 W' r! [# }) U: r// 5 entries, Revision 0, Domain 0, OSPM ! n) L4 K1 U& D2 W
Coordinate, 2 Procs 6 ]8 P, [# g! E: A( B

. o7 r# {. G9 u# f3 w2 ]1 {
2 c3 j+ D8 R" o! d}) // End of _TSD object/ U; @' F; d4 K3 b* @: Q
6 V, x* X) n' @( g# o
REFF:. Z/ {- i; m* O8 u1 l" ?3 @0 z% r
1.
: |$ E( R& R7 _# g* zACPI Spec 3.0
, e1 q: F8 g$ l" U: d2.
4 v% ]+ O7 ^- x7 D2 v" `Intel Processor vendor-Specific ACPI. K; G( m7 K4 r1 j5 U5 k

, ]! N( |; U4 u; O2 J( S  Q3 y' Z
9 y5 x8 e  j2 O. u! YThat’s all!; P3 n3 r% ^" }2 a5 E: c) j
7 o; ^1 R" u4 A8 x
Peter
4 |0 d% o' i0 H4 X; u* a; e
6 a' I  c2 }8 s* c5 c6 z2010/10/01
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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