|
我所知道的EC====>KBSMI&KBSCI
9 |- ~3 A9 {' _, V d) x% a+ r1 j4 \0 v8 o2 w
1. Introduction
; v8 u% q$ J' F A7 w
+ ~) Q* }! O: W" H. z( KSCI是指系统控制中断, 为支持ACPI的操作系统提供系统管理,客制化功能。SMI是指系统管理中断,由设备或者软件需要呼叫SMM功能产生,使CPU进入SMM mode。基本上进入ACPI mode以后SMI就很少用到了,对于EC来讲SCI和SMI则是互斥的,一旦进入ACPI mode EC 就只会发SCI。通常EC会有两根pin KBSMI&KBSCI连接到SB,EC可以配置这两根pin的属性,决定使用何种方式产生中断,比如level trig,edge trig,pulse trig,我做的案子常常配置成64us低电平的pulse trig。
8 q `% V& I6 F2 ]( O8 E/ [$ v5 z
5 f' a" I: u! X% H# Y' o# E2. KBSMI# q/ V2 G& K1 R+ g6 C1 t$ L ?
其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的
3 A3 K( o1 j2 a1 Ystatus就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
8 a& n6 @' y$ _, ~' f: r6 `) t/ H. `, O7 F8 }% }% C
3. KBSCI#
/ B6 L& l( l+ sØQ_EVENT' V: W" E* x3 p: N2 |2 O
所谓Q_EVENT指的是OS收到EC的SCI后,OS通过发84hcommand 给EC读取EC Ram中的值,这个值被称为Q_EVENT id。这也是Q_EVENT得名的原因(Q是Query的缩写,而84h就是Query Embedded Controller)。然后OS中的asl code会根据该id去调用_QXX()如下面的code所示,这里的XX指的就是EVENT id。那么EC什么时候会发Q_EVENT呢?当AC、Battery in/out,LID open/close ...
& @, C$ H" T" m% b; Z+ I7 k2 c4 C5 l0 F5 L6 R6 }
// AC Status Changed6 a$ W+ |/ c# @
) u" N) V# z' p5 JMethod(_Q83)
$ L2 G0 R" n& B
2 J4 z, P0 K+ y! |8 C8 m0 e8 }{
. I: n- g; Q: ?% i9 D: P4 \, y6 I6 ?+ u3 t- m' q% @
Store(0x83, DBG8)/ u6 v0 y1 D) V% ~$ b
, |' @0 B2 W& Z, _* ^3 ]
, q0 ]5 F0 {2 Z4 h5 t" cStore(0x00, Local0): m- l7 q$ O. z- O3 L
" ?" L: g2 q+ \6 R7 ]4 _5 i% LStore(POWS, Local0)' C4 Q& G; o7 E% F
7 Q0 L r2 _% h' [3 P: kIf(LEqual(Local0,1))
! G8 X% h: [, n4 X/ K+ W
; r4 L& S' R4 f3 N& j- J) F+ J- j8 {5 @0 U# K+ c5 T
{. V3 z; _1 A& V; ?6 q
. M5 d9 y6 u: Q" c) |6 yStore(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)4 D) v% e& D! c6 Q2 W. @, m" K
6 ^9 P( ?0 `! y9 i( A; o& K}4 }0 o2 r& w" N, Q: Y1 [% Y6 j& O6 ]
3 C% j8 M% Y$ k9 A5 uelse9 J g' ^7 f1 u% F' @ `
" w/ o3 o O$ O7 j$ A
{& j+ ?* D5 W; W& i
j" }! r$ L! t EStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)7 j7 V$ t3 C, g; h3 c( m
1 t, [7 ~! T" v" i( @+ V C}( r) |5 F* |* @, r O8 v, N
, E0 h$ E8 g3 I$ n2 m$ }5 s
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
3 P+ l7 u. T& V( t s# M, J
1 E+ S. K# p/ ^8 b, bNotify(\_PR.P001,0x80)1 J+ |' n" _9 Z% T/ x$ p2 r
5 C2 s. s4 A% A1 V# {9 p; z4 W
Notify(\_PR.P002,0x80)
1 L; p2 ?, _; R* x2 `( a# w) e( a+ K4 j6 F
}
3 O* v/ {' K8 n5 i- U$ D那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J' O5 U' P( h1 x6 e" \7 z
Device(EC)
7 N! T1 L6 D2 D{& s$ I ~" ?8 l; n1 u' r
1 j; k; T# P, }; Y
Name(_HID,EISAID("PNP0C09"))
, N) v3 J4 y) s6 B
; {. x4 r) O+ M! \# T5 e. L) ~Name(_GPE,0x06)6 G2 D. O, Z z% v4 m: U$ E$ S' Z
// KB_SCI
, k# T0 t M, s" o! d4 D3 M/ B
# F6 M! z8 f3 M3 w# J& A: f X...
^" c a' G. j2 w( \* |& c: p}
. ^! ?% f F( Y- |& u2 ?在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:7 E D+ Y5 }0 D* f; l* Z
a.OS polling GPE register status bit。
( i8 l6 v; g$ x; b/ p9 _3 ob.SCI通过8259或者APIC,产生IRQ。. \8 U% ], C6 {& j( c
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:: M U7 \0 s+ S; l
0 c& Y% T3 ]- x7 `
. a+ @) D9 w4 H/ o, s
, N2 r& I- H! d" f8 h
1 E z. y' n1 ` d9 O( h3 g( ~( H0 k
; \' U. V4 r: K) h
1 V$ p( C# Q) h+ B图 1
6 } f ~0 d8 @, W C1 p! @- ^" uBIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。, p: A5 a7 ]5 @4 U# Q; S( u( x
6 k6 x! `' C' W( H
, k+ t9 \( r' n0 |- o, u2 a8 h9 y- Q& E" y5 j
4 q( X+ |6 o* Z6 k( Q# C4 y: ?图 2 ) B8 {9 R% e* [8 l; T
8 Q" G$ z( ]; I% @$ eØ) d( G: v4 k8 `' H, v
GPE
; s% p' ?$ D0 a p; Z @6 uGPE其实是属于BIOS的范畴了(当然Q_EVENT也是GPE的一种),其他部分跟EC并没有多少关系,不过既然讲了SCI,就顺便提提GPE。所谓GPE指的是ACPI定义的一个general-purpose event namespace 与SB中的GP registers相对应。GPE register 包括GPE_STS和GPE_EN两个部分对应该GPIO的status和enable Event的触发分Level和edge两种,分别对应ACPI Method _LXX(),_EXX(),XX分别代表具体的GPIO pin。所以当系统在S0一旦相关的GPIO status有变化并且SCI enable了,那么就触发SCI,于是形如_LXX(),_EXX(),就会被调用了。7 p* v* J% V; z1 w9 t: o
' _! u' V' S) N5 ]" VThat’s all!, R- W& G: f5 }% e" Z
6 N& E1 h/ n1 {6 C( t' w- NPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|