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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
7 L, t2 D* ^: c% c$ a
1. Overview
/ R) W$ X% h1 U- P, C
# @) D5 ~5 s9 n6 |: F( r- l$ Z  D+ }. o
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换: C3 w7 F; ?% _; _  v
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
( E; p  |& x# f9 o比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
! l) s9 |1 b/ C% H- Y; |( D; {- A+ {
cstate1.jpg
9 b# f  g& `0 A+ g1 G* o9 F- ~+ e
1
: q6 d# }1 c/ Z5 I: [3 l$ s7 K* q
2. C-state Control; ~$ s4 e( z5 f2 G' o& ?
4 r2 X0 O1 \4 h$ N5 r" j& {& m; g
1)
! J, ~, y4 a5 B6 ~4 ADetect & Enable C-state# r& Z) b5 a0 F& g+ `; w

/ H* y- H: O( D' DBIOS可以通过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的支持。
% ^9 v% ~* H" Y8 m
  ?' \) \+ M( ^2)
6 B8 |7 ?# s/ A7 @3 U$ ]5 C! v( dC-state Basic Configuration
; V+ [! ~- `( F4 c  G' W) Y! P通常情况下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)。/ }  F. w+ C3 w% G/ ^# I8 Y
7 B5 C, z* }, M( d' C
3)
1 Z, E5 Z/ V4 u, T' A  D2 ^ACPI Structure For C-state
" S# ~; `% E3 @5 \; a3 V
) k2 _$ ?/ ]& o8 bl0 P3 `- h$ Q; V
_OSC & _PDC0 h, r2 T& T' v
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures& ?( ~! j8 ?/ ]
l
, u8 V1 t2 C- s9 s! A
_CST7 W/ R2 M; {* i6 k
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
) S# w" w9 K! QCSTPackage : Package ( Count ,4 a0 T: Q* c" w. S
CState ,…,) v2 K; {; E9 R: Q
CState )
- f; f, v) C% X- S% y' q" u其中Count表示所支持的C-state的个数
7 B6 w1 V. L( L4 e5 ]9 I6 eCState: Package ( Register ,- ~! V" p0 x( b0 n& C' E
Type ,
' |, S8 Z5 x3 K7 D# iLatency ,# b9 j7 @1 ?: N
Power )1 O1 R; w* p% H% C
$ q5 m2 e) G1 H7 U1 A5 y6 {* F
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 C30 z' B: I' L  H2 p" l. q
8 s8 P3 \; T; j9 ^8 y# k! `/ m
Name(_CST, Package()
$ J9 I2 h1 e3 W* Q  {! z' o) X

( J$ Z0 I; f1 c% R{ $ \3 ?. B3 n- q8 J
4,
2 E  l% w+ f# A6 r// There are four C-states defined here with three semantics
5 }4 j8 I6 H! g8 K" U1 E7 R
' }) E* L, P' C2 X% S
// The third and fourth C-states defined have the same C3 entry semantics
8 q' C+ N+ j" i& d4 R* M

& S, S2 n# k5 U0 V& z" K$ ^Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},* L+ d9 B/ w! q1 ^4 G% [
1,
  C9 I, }6 g! o2 e$ B( r' u2 `20, 1000},
1 H5 ?% x) D+ q* M& M1 K3 T
- g, u% G' Z2 J5 m0 i4 @
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
$ @$ H. F' ~1 ^, @8 G& m40,
7 m# F# K+ q$ }4 X( Q, W/ \9 m750},

6 R$ x- |0 @& ^/ b# ^Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,# u, P& s5 @8 |: A  `* q
60,% g# O: F2 H7 s" c+ }; I; p+ K5 K
500},
' O& u4 o- _0 U5 q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
4 {8 _7 _- p1 a! b2 e250}& K) ^7 @& e) V

# N& a9 l" x! }3 Z- d}) 3 v0 ~- K1 b* O4 R: m( N

* O3 V* J3 v# k/ E0 A; W+ ^4 _5 o4 fl
" r: H* K  x+ j3 [
_CSD+ p* h! d& G' V( p5 ]% u4 p

' K6 T3 ^$ v( }  t- K* K7 L' `C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。& Z& B: x" j; m0 c

2 Y$ [& r4 b: ~1 m+ }4 S$ _( d' |
8 M0 P& y: M0 t, g9 c: W  G+ z  K  g/ O" l) w$ C+ ^

8 H0 T7 z. E" O; ~' @3. P_LVL VS FFH4 J$ ~9 Z: S( G- p# ~

6 A  Z1 |2 |! f' \3 O* kP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)( e5 q9 c/ G5 e( n6 I
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 R5 w# d, V4 t* h; m/ ]

6 X3 k$ o9 t8 ^/ f9 s
gas2.jpg

( d, T8 j) K. b) S1 _, ~' b
2
( e$ x/ w5 i/ ?6 S
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的一个例子:+ M" u4 |) `8 w1 ~/ Y
Name(_CST, Package()
/ G, L1 i3 I1 a" X
$ d: O! `- `# v  d6 v3 H
{
0 x# j4 K& X$ z, ?2,
2 a+ f6 W$ \: @8 Z9 B/ l// There are four C-states defined here with three semantics

$ ^! R& W" r' e* i6 [
* |/ M, ]$ E/ R+ ^$ E* I0 [& R// The third and fourth C-states defined have the same C3 entry semantics' i  r( `3 j8 o: g/ ^7 X: `4 d
9 N6 B  n$ a( _! ]* u# F
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},3 Y& n% R' @1 p7 V! q' T* u$ M
0x01,; ]! q4 X1 ~9 ]* I
0x03, 0x000003e8},
+ }5 c  f6 `8 J& F9 \' |+ Y

' y+ f7 A- x4 e' f& {Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},: [2 b! c2 H, ~
0x01,
9 _1 r  E8 b  m8 X8 ]0xf5, 0x0000015e}

4 {# Y+ @" Z, A1 ^}) $ ^& @8 U- }  \& Q

, M. F8 b8 b. |/ _# l) l& E: q* _! O4 F) k
REFF:
2 Z/ ?( ?7 E7 H; f1.
0 ^5 |$ M1 E/ U6 |. J: OACPI Spec 3.0
6 b1 {6 L! J) E2.
% Y; L( q- A/ {0 f0 t5 WIntel Processor vendor-Specific ACPI
. u. q; N! O0 |$ ]5 ?$ b/ S6 s
4 Y! N3 X: X/ o- k* ~8 N- U& {5 A8 j
That’s all!- d3 s5 n! K/ i, o% M3 W
( w+ F; b$ H5 \, A
Peter) h4 `3 ]. [  E, v. C
4 `6 J" B/ p& s! F* X% J- P" X' F
2010/9/20
  X/ F( e$ }7 T* ~5 g, z2 l! z- B0 z3 w) F7 T2 C; B
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
9 }* K+ Z% U, y' @) F
, q9 ?) z. s: ?$ M4 ]( Z9 ]CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST# W" ]: B) w( Y) Q$ Q
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
( Y8 O/ R: y. Z0 H% C
3 e5 z4 _4 r' {( {1 Z+ l2. P-state Control
& q5 h6 L. ]. H, o+ u 7 T; W- ?  L( i
1)
7 K6 B  y4 \+ T, d* X/ {Detect & Enable P-state
$ x9 P2 g2 A. Y( K7 m1 @+ m% A
6 F$ a  U$ N) f  R+ T% E1 y: qBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
! R% g, b# c2 M+ K* ^  V6 |% U - W! d8 x6 a2 v
2)
# Y* e% R! e6 n0 [7 Z3 mSupported P-states
2 r5 K/ P. U: e3 }8 T- `/ n/ ?) G 2 e( Z2 l& q9 M; Z* a) P
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
2 H9 P/ y7 m$ }1 R / Y0 u* X+ \% b% u7 @
MinRatio = PLATFORM_INFO
9 P! i9 D1 ~. x+ l3 @MaxRatio = PLATFORM_INFO
# ~# L/ h; ~% c$ v2 O6 D+ DRatioStepSize = 0x01* ?+ |9 T' N! k9 t8 j8 Y, e3 H. V
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
; y# D- i) b+ U/ I  X# g
; Y+ H( p9 h3 \5 A7 K% u/ H2 z) W5 ^If(NumStates > 0x10)0 D) h/ @' g% M1 W0 B$ y) A1 X9 K
{) R1 u) O+ F9 u& M) s9 u0 Z
RatioStepSize += 1
( g7 {# z. J; V' F; x& tNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 10 C$ K. W5 F2 R( F* Y6 }
}
( d- m: ~: j. G- x ; a) r+ D1 g% k* P
3)5 ~" m. Z9 U; N8 _5 m$ I
Turbo Mode& J& l* [( M1 I- @# e- L

( t; H( I7 t2 {- 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
1 x( S: Q* M/ f$ @% D0 y% T 5 e% n8 A+ {+ o0 a' ?7 z" @' I
4)
6 E% |+ r) \8 Z8 S* t5 t" SOver Clock
8 U) m5 `( v2 h' ~; L
7 ^7 K- P% |) T2 q' ?某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。9 ?5 ^3 {. [' B% G+ P  a2 Q
3 _" x7 |7 P  P3 [% {
5)
5 P/ D$ O( Y0 H. e8 V& C* GACPI Structure For P-state
- D# u- A+ d) p+ L. u1 R6 c5 Y
4 f' i6 T- @5 k% Gl7 V: r( w& b, W# `. z
_OSC & _PDC3 Z3 K5 K9 j) U! T2 g# w/ U
( x4 E1 y3 L/ l5 }. v
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
& w  s- x; h- l. P1 C5 Z ! Y1 t1 Q% ]$ L* w8 a
l+ |& h7 r9 a( j1 X7 @! J* w+ t
_PSS
8 Q7 O$ g$ m; s3 HPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
& Z$ z& }5 d$ u% V6 |+ J并且通过一个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 o" O. ?5 ~. o9 x以确定P-state切换是否已经完成。
8 a- c: W( \6 e* G% U" l1 w5 Y
8 H* S: m2 T; B# e6 f+ pName (_PSS, Package()
4 K$ e  e0 H* a/ y8 {" J8 x{
9 b' J/ l, a* \! K) A# R// Field Name
) S$ N6 T. B% ?Field Type 9 N# U$ Y' Y) @

/ B0 n* A8 u- c$ J# y
1 L0 w. V4 R. Y( H5 Y! E* U5 e
- [8 L0 J+ {& NPackage ()
* [& D3 @, s* \$ R6 w: D// Performance State 0 Definition – P0 / F0 O) s& C# v( G

2 L8 ], ^0 D6 Y7 [! I, O! O- C{
' W1 U7 _. A7 \& D
0 [5 e" l( H$ g; K& ~) c: T8 k# d2 S  y6 Q, {2 A6 l( B; E
CoreFreq,# ^8 t! D# ?# j. i+ l2 p
// DWordConst - Y1 P/ ]& P8 ^3 {( D
! P  a! m4 a: ^! L+ ^: ?7 v( Y
% s, N0 z* U% I; k' o( b* ~
Power,
5 i4 E$ }3 q6 A, I5 G# @// DWordConst ) H8 ^& ]/ R) O# q* }7 G2 H: {
/ K! U& g/ Y* U, v
TransitionLatency,
  S# \4 ^# n3 n; h7 u* E4 @; z// DWordConst ( D4 `% t& u0 I8 x/ m( W
! w: G& e5 P* R. ~& d9 E
BusMasterLatency,; ^7 ~6 c6 e9 g- ?. Z0 Z
// DWordConst 8 k+ ?, l- K& |5 t
/ B6 a$ \( C. b$ N+ {5 e0 v  t" ]
Control,
, W' R# g* X8 m1 U// DWordConst . K8 Y( i5 N1 |
7 U% G7 d# g( N- F
Status
* J" L2 E/ u& q, t* w8 X; C5 Y! n# ^  U# I, D
// DWordConst
! S) u: t; I. s. x$ j- k$ v6 P2 v
! \4 a5 _# z, h5 |( [# u: K6 U}, : b( ?; D! ~8 c" p* E
5 |& y9 A1 V! I/ ?3 R! l
.
$ H4 G/ n6 \5 W: K
$ P! y) z9 r, t$ y.
# s3 V. b4 c: P: {. Q% L! q* B7 X
. f) T. `2 [2 o* ?  I( j.
4 a  A' Q; {' M0 s0 U3 Y" m2 `}) // End of _PSS object
' R- H% w9 p. k* L4 E/ A8 p前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
" x; Z$ b1 B* T) x2 l' m5 U
5 P( J! h1 P- u0 L3 ]Name (_PSS, Package()   }( j5 a/ F1 j& a8 ]* ~
+ w3 K  l1 A6 V" j
{ . d1 e8 y9 v$ F5 a

0 l2 ?' \7 a% X' C% r$ V) U8 VPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ( u# m2 V6 y3 Y/ y; v( G1 F. r0 u7 C
3 g( N9 q0 n: i7 L5 A+ E
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) " P* }) \, g! x

" Q* e" O! [" a: {% r3 v" j; T+ ]Package(){1400, 8200,0 p- G$ T: K" Y/ a) v
10, 10, 0x000E, 0x000E}
" {- g$ D" R. ~/ L: W$ Z2 x// Performance State two (P2)
5 S, O; u- F/ |" L- RPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // ' @- M7 i, ^4 T. S+ L' e: c
Performance State one (P3) 4 U1 A4 Y6 r7 ~

- P. s- z2 ~5 N$ `! a2 U3 TPackage(){1200, 8200,
& E, q4 ^& z+ F0 K. _* l4 ^10, 10, 0x000C, 0x000C}, K% d1 X. f0 s. y/ B/ ^
// Performance State two (P4)8 S5 e+ S  J6 M5 \8 K

* P, \  \4 K6 v  @- J8 C/ ^4 T& A}) // End of _PSS object
# g, G+ D* Z' |9 ~1 \% E9 F* E
5 W3 [' n- F1 m5 }) d1 v另外当该平台支持Turbo Mode P0将会reportTurbo Mode) ?2 ?1 [6 {5 M$ N$ m
. g  ?& ^( o, |( o0 x, j" l9 F5 }
l
- i4 c  j1 k5 E; N$ s5 |
_PCT
  L* z! e1 r% A1 A1 {8 t6 l 6 }' R& q* g6 P4 r" j
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的方式来进行。
! O: y0 ^& _# B& s: N. F( L 7 x  s: w8 x8 T
Name(_PCT, Package ()$ p' R- H5 p! n5 [- r$ \% K7 G( D( e6 w
// Performance Control object
5 P! j  w  S7 X  A- f
2 }# A4 V. {5 V* U" H! b+ S{ 4 P& ^& a& _' @

& u$ @6 K& o/ E: e; _' W, K. E0 X. tResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. b4 Y1 B: s" ~4 t. Q7 {// PERF_CTRL
7 C3 r0 `, Y8 I1 C  S0 Y4 Y, v
" k8 C3 k+ _; Y" c3 M7 S0 a% KResourceTemplate(){Register(FFixedHW, 0, 0, 0)}; L: X3 n7 M2 t' D7 Y6 y, T
// PERF_STATUS
% I% \+ n8 Z+ c# v+ K( _
: `( h" F' t$ K; d$ \( I+ l( ]/ j}) // End of _PCT object5 A! {, E7 F( j5 U. t
: E) i+ O! r, t: t4 z
l
3 i  w% g" t* G  W, t" J
_PPC
. H5 h3 R: n  r. f. N6 b- v& g . ?" `& U7 {$ L& |: w( R! G0 o! g0 `
Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSSreport的所有的P-state [p0,pn] return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states
( Q8 j* M3 t+ _: o   U) J5 ^# r0 O$ j5 s/ t" o
Method (_PPC, 0)
3 {8 Z8 D3 V" s( i/ Y  [// Performance Present Capabilities method
& h8 K" S- O7 F$ G- h$ `: y* T! N% m: G% w5 _8 y
{ : y$ j: `9 G+ k- k% \6 I: N, @
) T4 x9 O+ J! T3 ^1 p9 i7 U
If (\_SB.DOCK)
( t7 ^% K/ v4 Y( x, M2 p  Q  u. J3 o2 ~/ F" {% L  e8 a* Q
{ ; h1 y$ q9 P0 N3 x9 v! f

9 [) z0 J* S' e9 |1 j- ]6 Y1 yReturn(0) // All _PSS states available
/ ^& o. ]8 b7 M# c6 \/ L/ q- T
( w- m! j; N& A. l( {, S" ^) m, [; f/ O$ d. S
}
- `7 o8 _1 ]3 @, I* c
+ Q0 G5 f  ?+ O: Z& B# EIf (\_SB.AC)
$ L: }$ c5 D/ @
, j8 J" c4 K  u0 W{ 4 }8 G! h: g; f( ^# \: Z
/ G& Y; M% M/ r% [$ n2 w+ x
Return(1)
% z5 z# w$ Y5 Z// States 1 and 2 available ( _( |9 A! s' x/ D" R  e
' |  `& T2 }: C6 @, Z, _. G
}
- ]& T3 ]$ j) K: [% h+ X4 n
- u9 u3 L3 \0 X/ bElse
% o" I6 b: r, s, j. q$ n" r3 B( j* p8 m7 i7 n- j
{ 0 [: ^8 h8 J, t; w; l$ z

) J# ], V" n( p! O- sReturn(2)& y0 }( f% j: _- P
// State 2 available% q8 h$ Y9 S  P9 v  d; x) T: l5 S

+ r( A- d' X: N+ U( T} / t2 P- x5 r( O& t( `* o: n
4 H1 m2 X3 E/ c+ e( R1 z  h4 f* Y  n
} // End of _PPC method
3 L0 l" X* N7 z" g9 z. z2 \   k. m' h3 ~- ^/ D
l
5 t, B- a! B/ v: Z+ o! V
_PSD
( B- k. p, V% f5 g5 F- ?
* ]) R  P  I3 xP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。6 P. s$ m/ p# E
6 T' Q2 j8 Z) V
REFF:
* s4 n  ], I/ @0 a$ O1.; m1 K' ~& c5 _% {6 n" V
ACPI Spec 3.0# {( _" J5 e# [% g% G* i" |
2.) p& e/ e5 U1 c* r1 m; x( |
Intel Processor vendor-Specific ACPI3 R+ l* W- i, A* E9 V

4 ?. m! S/ l8 z' T % z; }* Y" ?% L9 m
That’s all!
7 s8 y3 p6 |; m" p " e8 _, J7 O+ \; h( u/ H) @
Peter- y# S5 u# f0 c  y4 z  O: _

) X6 m; @8 e# ~" u6 @6 a2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview3 r) R( ?; ?( U. H" E

: b/ g/ D9 Q) S- K  C$ RCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
0 L+ A5 f% ~! ~& V,影响系统的功耗和温度。
5 t% K% \, o) J0 j- j5 z% j   y* m$ ~: }! D" K4 X" W3 W3 ^  `
2. T-state Control1 }; x- E/ J; Q) Q" i

# W, q( T7 ?, l; i1)
$ E' C7 |; |8 p/ K  uMSR Based Control4 L  ^8 H; b. R: w$ k& J
- z1 |/ X- n6 Z. ^
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ( ?& q) r* ^3 b; c! e( ~" n. |6 y2 R2 T

: }& A3 `+ u3 n* h0 c$ c, }2)6 }) Y( x; n, P1 R% a( C% i/ A( X2 C
I/O Based Control
' U7 c" G; W- i8 d
1 _9 F- e; x3 q9 {. X除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
, O" Z8 M! Q7 F" U9 } " b9 f5 l. Z$ a& x# g
3)
; o3 X" j' ]& p* f7 i9 nACPI Structure For P-state
- p6 ?  |6 I1 V4 W0 Q* M2 nl
& j: B" F5 J6 f
_PTC$ _/ @8 ?! O$ L

0 j* E8 ?' m& j. S: n  cProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:2 P$ `1 s' J- h+ V
; Z; I. {& Q& v" ~9 G) E
Name (_PTC, Package() % y) q4 q3 |7 i6 H4 p4 Z! Y
{
! R/ F/ d+ E4 w; D; m4 \* E4 l; a- O1 h3 O4 M3 u: _+ x1 a* [
ResourceTemplate(){Throttling_Control_Register},
6 o/ h5 a; ^6 G$ U//Generic Register Descriptor + S7 z7 N$ r5 o$ W
3 v! S% V0 n1 D6 R$ ]6 c: `
ResourceTemplate(){Throttling_Status_Register}
9 p6 \' j; e9 a" u3 k: v2 S9 Z3 e//Generic Register Descriptor 8 l% a, |  ~: N, R" ~* P
}) // End of _PTC
! B5 J. a# x. o1 l* P# D ! i' r9 a/ D% M5 W. ]4 W1 C
下述是一个sample code
: V% i% i& L4 X$ q/ U   I/ H: w& u' D# v+ }' A

! U; g: E- L/ |- y- K; i/ L
//6 p; ~% z4 h: Y, Y. l

' U* Y2 I  M) \/ R& D( J0 f// T-State Control/Status interface: V# U" ~/ s0 s5 l! C% i5 Z
( Y1 w. H4 E( F
//
% o% }# E' ]' A( a/ z8 d# w( m6 z( @  Y3 i
Method(_PTC, 0)
7 z. a& |4 B1 s
5 F( T9 _8 w4 Z1 q+ {1 g{
& _; z0 U) t/ s& F. Y& x9 h% [7 l! W" P7 B0 m/ S' g. ?" B$ \$ r1 a4 @
//
$ a3 v( i% U$ }' A- H4 Z" j
$ a6 }" B: r9 {& {& q// IF OSPM is capable of direct access to MSR
4 H7 X5 c7 [% P: _$ {
; ~, Q" \6 y" A+ U9 a//
3 `$ h3 M- t& ?/ m4 u- IReport MSR interface  m& a2 s& G' D5 H

: [3 e, Q" P1 l* N2 K' J8 d9 j// ELSE; `2 B# X! L, S5 F
& D) `4 Y" H# @- m1 O
//
- L: @; d/ `$ q! ~; ]Report I/O interface; r$ b# d/ v1 Q: v$ [8 _/ b  Z3 Q

  [5 }( ^# y0 C- P' S1 @//7 i7 b$ W3 F. J/ h7 F  K- }. S4 ?
. Q3 ?1 m8 W; R+ V" w3 ^/ C/ C
//
, o5 U* h1 J$ yPDCx[2] = OSPM is capable of direct access to On
) x! E% p# F: z6 |. A" S( h0 {( ~* _. L& m
//# m& e9 i( o* C+ ?7 s
Demand throttling MSR- _. G$ G+ n. p' _1 ~' ?2 z5 ^- k# z
6 \2 D$ o/ ], ~8 h
//( k1 G0 _- x, q

! ~, Q: z$ k2 EIf(And(PDC0, 0x0004)) {
1 `  c3 L, ~3 ]: v6 I2 M5 N) F* d/ M4 {" C
Return(Package() {, U' B# q  k2 {
: f/ d$ f- @( p+ Z/ `  y
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
8 }6 f+ Q7 {0 c0 b, z
( D& o" q& `+ Z, W& \6 ~  A' DResourceTemplate(){Register(FFixedHW, 0, 0, 0)}4 x, O5 L% l" u+ A( D/ F. I

9 Q  _& W! _  I. ^! p3 H: s% y})
( c9 P# b/ n& M; ?; D5 x" ~
( J* B( k; e. k9 o: l}( N1 u! F2 j* A4 w* |# Z

( \/ [4 N3 Y2 _. o; JReturn(Package() {! t: f# r* H" e* K, {

2 C% A+ L1 B% @  @8 M3 WResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
7 p, V) E7 Z/ Z& c
4 n; z7 [* G( l. W, r% h! |" [* N. RResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}6 N! _# X$ k& w9 E- p
7 M7 E: o7 R' C
})
4 `- X9 ~* R% O- u* z/ u( f  v. _* M; r" n. l6 \
}
: h4 l# N: r$ I- X& Q/ S
: Q3 _$ j- R# X9 A, U6 _: k. b, c5 E+ \: W

5 b* b! x' F8 Yl: L; A& f! A. n- P
_TSS
6 \6 v6 B# _, H% D
7 o. F. n) B7 x* V2 tThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
% T& }0 o! J% t1 P" n+ Z8 ^Name (_TSS, Package()
" D/ M& E+ Z3 ]/ V; E. B{: J: R$ `7 w; f; Z3 ~  B
// Field Name
, Q) v8 u; x" a2 |" f9 eField Type
1 X' ~) W  I8 ~0 {1 L& A; y) w/ z7 w6 _2 W) Q) ?5 D
# ?  u/ |! V( _  e7 N  s$ ?
+ J2 p) n0 e  M/ J; g# n  b2 f
Package ()1 }" }, G* [: k7 {8 z5 _! O" Z) l2 r1 Z
// Throttle State 0 Definition – T0 6 D6 h' X6 j$ V4 m, p- D# O1 Y# U) U

% T3 `) [2 [# r, w9 s{
) k! B+ p3 P1 h: h$ @! Z$ L+ e: n0 I3 j1 H1 C% c* J. v

1 v* T: o1 ]3 a3 O1 dFreqPercentageOfMaximum,. C- O# i" [0 t9 M9 o5 X+ A
// DWordConst
1 n5 I1 b- s: {/ n1 N
% {3 ~2 {7 P9 f+ OPower," M6 L' x4 \1 w) H, F3 j8 r
// DWordConst
* j8 A2 o% b& R" N* N) o
0 h) w3 M2 v' ZTransitionLatency,
6 e- p3 b, ^* @7 W// DWordConst
1 j+ N( t, z; I% |$ @" f' K
' d: K" @2 [7 i- BControl,$ W) v" g8 I% {" @$ \( X# F
// DWordConst 5 h. u5 C: g$ |) B6 Y7 {

$ i3 d4 ^0 _3 L' a7 A4 z" PStatus
; q+ k) z1 J* z1 V7 p// DWordConst ) @5 i  J* A" k8 v/ |
},
' y3 w; `& l& N% n……5 Z2 \! ?6 x- M- i# x6 w
}" I; ^6 {5 P) _% q, d+ g2 u
( w9 W; M3 T. ]' P$ q
Example code 如下所示:
8 T9 \' E5 @' ?- d
: ?) K5 c6 f) G3 p8 E+ ~Method(_TSS, 0)4 V" H9 r* W. b6 `) d: g! l3 @
. O, Z3 S3 g$ ^9 T. {
{
" l" M9 L4 g5 u' {' @# J  |& ^' q$ d& `
Package(){100, 1000, 0, 0x00, 0},* P, L) Z0 i: V" k( s

; a* ~  w4 M+ H! iPackage(){ 88,8 m* Q1 x7 h$ S6 z$ q
875, 0, 0x1E, 0},
2 Z0 I  N0 d2 }8 P; l  d, g3 y7 F6 Y1 u& a+ O7 m
Package(){ 75,
6 K3 _# |9 @, n750, 0, 0x1C, 0},
, q9 L8 g4 g% u) |$ q: Y* ^/ [3 N) ~- P
Package(){ 63,
0 S! ^; t% p. @9 L% C625, 0, 0x1A, 0},& u' ]/ B1 w  Y! ?+ A
) }5 Y8 m3 N! }/ A
Package(){ 50,8 {: f+ P! z% ]5 _4 R. A
500, 0, 0x18, 0},
, @# O5 x7 i9 g1 q( e- O, I( G$ p" O
Package(){ 38,
6 P9 T; V8 X3 g5 }! E  x7 z375, 0, 0x16, 0},
7 e* I2 l3 g/ M5 X8 S- c& }3 ?' T, k6 E
Package(){ 25,
- b- [. Z  r: R! o: o( y. Y$ v250, 0, 0x14, 0},
' @- F' i; q" j* \4 g+ e
+ k! ]! P3 }8 BPackage(){ 13,
5 |9 k8 B4 h5 z' Q125, 0, 0x12, 0}8 ~% G1 ?" [) S9 H+ g
/ T6 v% n: \  v0 _+ M! C' @
}
: I/ G) Q, R% \# K) m5 X
' k0 W( L: a7 |* _  \
7 _  R0 k5 f0 t# al* w% O) \; s0 I; n! c$ W
_TPC5 p7 }0 x) I. o, C! B. j2 S
- g4 C6 ]$ [2 Z% r* q9 w# A
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& K0 p: I  x# o: P5 z0 p
5 L: c. m( u* _$ S% b6 H; vl! h3 ^; c1 u: J0 ]
_TSD& I' f0 M; ^: k2 J6 o8 q
( L/ G& B  H9 E: C3 l6 {( E
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
2 ]) c3 N! z* j7 f2 z) |' y
$ m) o# ?. y- t0 c5 WName (_TSD, Package() & w1 S' w+ A2 E+ M3 i$ W; H) ?1 R: n
6 k7 U4 R& O0 M/ M! \$ F
{ % e. w3 z5 Y* [, W/ M
* V( |% N4 B# i/ B2 h5 m
Package(){5, 0, 0, 0xFD, 2}$ B8 y/ t  |$ C: X, K4 ?$ H
// 5 entries, Revision 0, Domain 0, OSPM . v, `5 V2 V- j1 _% P
Coordinate, 2 Procs 3 [( }* V+ y4 `9 W3 o+ J7 m
0 Z, ~0 A8 Y+ Z

7 v. g3 O  L/ [}) // End of _TSD object. I. M" m' h6 p

7 h' I  L6 b+ [1 }' A: zREFF:
1 }4 q) y* k. Y, `# A' w1.
  e+ H: p7 C. KACPI Spec 3.0
9 U( E4 _+ V- h  ^( f2./ j. ~: o! y, a" v3 m# K
Intel Processor vendor-Specific ACPI1 I' K( ]& f0 ^4 ?. ~
4 s) R7 g; g+ `. q
' P/ _* H' A  a- r* F
That’s all!% |2 c) h2 V% Y  h* J

% I- J6 y1 x3 t/ e/ i6 G% c2 H6 ^Peter4 f4 N1 @# d) h+ \' s2 U1 V

) ], n: q# m, l; O0 j2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 17:37 , Processed in 0.080156 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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