|
我所知道的EC====>KBSMI&KBSCI , O, X1 B. j! p
4 ?" R2 C& D9 \( f1. Introduction o$ u$ S7 f* q) |2 J: P* q% N
7 F4 g2 S- Q# X1 y# j. C
SCI是指系统控制中断, 为支持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。
9 ^8 |- K7 k4 W7 f" r
' o: y" x% E1 B% S- a6 }2. KBSMI#$ e2 I2 M& X$ D
其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的
& P8 z4 q/ S+ b' p/ p3 _9 l% b8 kstatus就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。5 b. v# ~+ z* U J; j7 O! E! X% U) J
6 d- T% H. F6 m/ L. Y: W
3. KBSCI#
9 o0 X, F: g, @# I7 r; DØQ_EVENT
& S- { s2 n' v8 H; D所谓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 ...4 T6 u P! m8 @6 E5 B \9 Q+ i% O+ b
' x9 u: l! j- K+ W1 a+ _8 M; p+ V7 h H// AC Status Changed
' T b$ h! r# m
( s# E9 j% ~! i, wMethod(_Q83)
5 }, u: F% m6 E {' T5 s9 T) H) D+ r. y
{
& ?3 k6 z+ W9 S$ X* ^6 f& k* m, T$ v/ o; L" V
Store(0x83, DBG8)
h9 U) i( A+ X
* e' z# |1 z% @8 {" D# p+ U( c
c! ^7 _; z! B: o: J$ l: rStore(0x00, Local0)
# ]& g6 E+ W. y n2 U- R2 Z; x% W0 A* Q: V# X* `2 @0 w9 {
Store(POWS, Local0)* ]* O0 W5 R9 Z. S) W2 {
9 O }& S' [$ }If(LEqual(Local0,1))1 b: F1 d1 }: S. ^2 h8 N: r3 j. ?
3 X8 _1 F: s7 G* d, n
/ c) o' O: V) N2 S- `& Y$ {) l{
2 G1 e' B; d6 k6 P; x6 X8 f* [7 }9 o; L/ h/ Q6 {' k
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
2 g# B- h1 n _# V! a* h1 ~: U3 Z7 {, R3 Y; W2 B
}
6 a7 y/ l3 L* k6 K9 Q7 o# v7 M- t0 S& F3 u+ R5 O# e' m. j& W8 T
else p3 x" s* C5 g( K$ x
! Z4 Q% _5 N) K1 v
{
* n8 }7 `' e0 n7 p$ S
, n" u) u1 o0 Z% R5 K1 |Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)$ Y8 }1 \$ {+ z" H) l/ X
4 M: H5 t' |8 A0 m! f' G}( i( P @0 e3 N
1 [: \, Q2 n" D& b, K a, v
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
! o P* z% X2 k- d$ E4 u7 U7 I" Z2 p9 W. Z, ], |
Notify(\_PR.P001,0x80)) i! `( b$ P& w+ p% x
% P1 T1 d. t) R4 p UNotify(\_PR.P002,0x80)- G7 G2 w$ m! r$ l' o, ?& u; J% s
7 T3 w' {. [9 F. t R% p0 {5 T
}
' n( e% D! ~3 l那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J
0 Z. `# N$ x# h3 ~8 ?& v& [Device(EC)5 J* ^9 Q' ]( s, k' H1 D2 ?
{ ]8 m e# N+ ~8 @8 I1 h. a
( b5 \* Q* L1 y0 c7 h1 l; ?; XName(_HID,EISAID("PNP0C09"))
9 z" t' M; Q; \9 b: D+ h+ h2 b5 F; d3 R
Name(_GPE,0x06)
# z7 [, |& `5 ^: I* Q7 m7 P// KB_SCI # M3 i1 w! A7 K' _$ U2 d
& H; t- z8 N6 i6 l8 b5 i! I
...
& Q ?' Z0 A0 h# X- j}
' p/ }* N+ g" y/ a# U0 H在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:1 a) e' `* L& V' U( {. w0 T h3 Y
a.OS polling GPE register status bit。
/ W/ ^" T* a! e$ Eb.SCI通过8259或者APIC,产生IRQ。
/ T! j* H2 w( L+ yChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:& l% x M+ N6 x& l+ M& p8 x6 T4 w, C
, q d8 T" a2 t# b0 I7 E
1 T/ P4 K( K0 {3 m+ ^
. g+ I$ @& y1 a/ T& j. l. b0 v4 \$ R9 d2 {' z1 x0 N
5 g+ e" Z' \6 H0 y5 I
2 q7 \. R5 U: C/ \% H
8 D; ~/ I* I r
图 1 ) u" g0 i1 J$ b; m$ f
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。
! i- R2 _8 T) `2 r' Y0 K
, q5 V4 B q9 i$ W X( q3 W$ `% d& G' ~) w5 ]2 p
2 Z9 M+ B6 P$ e( E/ p) z
2 U4 L- X. u9 V7 Y, Q; r+ Q2 V* h图 2
, p/ L/ ~. K9 k2 Z& C; I, \# X
" S0 _* X3 ]5 ?3 }* M+ u; CØ
( `2 i/ |2 a+ P( s) O YGPE+ b! j: H0 i. I% b# s9 \1 g
GPE其实是属于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(),就会被调用了。0 Z; g4 w3 K+ |9 C. g
9 T. t+ Q& B. A$ E* j/ f V- ]That’s all!2 q- k- N ^" H, t9 I
) Y! q) v1 ~8 q% R# LPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|