|
|
|
我所知道的EC====>KBSMI&KBSCI
. Q- L* A G0 B' x n" z& l
$ P# G$ G$ e8 J. i" u( ~5 x1 C1. Introduction
3 ]" V3 ^& o4 A9 a* H, {. c9 K( _0 w' I0 D, \
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。/ P! L" G4 @8 H
( m/ ?% A/ A9 U* I4 r, h H- m- s, d
2. KBSMI#
7 t" ]/ Z" G+ R5 x& B8 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的
6 q; d2 \ d, x4 D4 f3 }2 W3 k% Ostatus就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。) w0 k8 C2 k8 t& W5 ^
$ w2 D' a; j L5 ?' w- p3. KBSCI#
. h& M/ R7 C7 |" S+ ~! O; b8 c3 z9 SØQ_EVENT0 k! G4 X W% a1 @6 J
所谓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 ...2 T e! d3 m4 g* m7 h4 T; ?. d0 S) V
: w t1 T6 K- |% W7 |
// AC Status Changed
8 R8 ^7 d3 s4 M5 R# | F \) U) k! }1 p, S* Q6 [% B9 `
Method(_Q83)% ~9 Z W, x5 K1 |0 I& m
/ d: L2 w( E5 Z' P{
8 l" R: K/ _- v# y' {+ i
: r! R3 M! f& q$ O8 T6 j) i; sStore(0x83, DBG8)
7 }6 u k2 }; \3 U! {- T. w# a# \! a. h& K( O
% U+ e0 n) _. NStore(0x00, Local0)
2 w/ {5 ~; [% P) E/ f4 Z" ^2 H7 [
4 ` P( i: a' O% `8 nStore(POWS, Local0)
8 [# C8 M0 {6 Z8 _) [- I0 B9 F8 O+ J8 `! s$ J2 n/ x z5 q
If(LEqual(Local0,1))3 i' P3 t/ p( A- f' B# Q
; N1 I$ ?" i! o3 y. D
( f) j' K6 V. t5 o9 y, G{4 X8 c$ b4 ]/ m' Z* ]. B2 z6 g1 _ B
9 ^ N9 k% w6 ` l
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
g3 {- y5 V: ~5 z
' O( X, | Y, D4 c}
5 C; |0 ]; R' n; B4 h) {
# ~1 ]) r. c! p( y: relse
2 s% Q7 c+ p; e! s, t$ D( s7 q6 ^: ]! @) R
{5 |% ]) ]: e1 W Y$ L
) u m$ H" G. W' B7 dStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
+ Q4 I$ ]* D) Y C6 [
+ ?% E5 O E7 H! G}
- c% Q( v: N5 ?+ r+ p' I6 E' i2 C
/ q i+ l T5 Z" s# o. oNotify(\_SB.PCI0.SBRG.EC.ADP1,0x80)3 N8 k" i7 K- x- s
2 f' c1 \/ z7 Z& y" t
Notify(\_PR.P001,0x80)% Q' \( w9 ~6 u8 N
( N4 c' h2 U$ p. \ j2 M* g
Notify(\_PR.P002,0x80)& ]% y( L* R& x: E7 M2 z' W7 |
3 ]$ \# ]7 R1 S7 ?}& A# B: `* O( ~1 Q! H% w0 E. u, C* F
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J9 {. J9 Y& Q$ _# I7 f0 k' e
Device(EC)
: Q0 D$ G, h% [ l% o# o, e# e{
5 R& Z7 y z( o4 q# Q- J3 f0 i$ D7 N" o& }; J3 ]4 H8 F/ A% j
Name(_HID,EISAID("PNP0C09"))
, O! R$ M$ Q: ?' I( G( q
9 E5 L. m! b) U( h6 X4 lName(_GPE,0x06)
- a( A! E8 ?% b: ~0 \// KB_SCI
4 E5 j$ O6 D% D% s7 L- d8 |- P% f6 j# H6 d
...
1 f* z% o' V F$ s( S; t}1 W7 K8 L* e! ]. V3 q* |1 G
在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能:+ n5 \# v6 ?5 Q# i* n0 p0 T9 h+ n
a.OS polling GPE register status bit。
4 U" {, O* M% ?1 C& X8 H( C# ~4 s) Vb.SCI通过8259或者APIC,产生IRQ。) T, u8 {# X2 F0 g' I
Chipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:
# X0 U2 a, r' w% |7 a8 t- d9 _( F
. ?$ h4 v V" T4 E g }4 d: r3 [: i) w- ^7 v; z
; D, P4 ~" w1 i
$ Q; E4 q" d6 F
+ m( p$ {; i# d9 E
, ~5 w' i+ g2 K7 z: B4 L" u; y9 P$ V0 t h$ b& I" T
图 1 ( E' Z% }, X7 I
BIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。
& G, J; F" v( x: u% h- V( B% f: @
: f& u# A2 K' Y; z2 K) v; p
# E6 l3 i. R2 j5 ]. c9 V8 z1 ~( C' t' k
A' j$ V( H1 q图 2 5 l' l, \/ z/ v! X
4 Q2 a7 X. l) a% nØ
7 d5 d, G- ^: z- X, h4 iGPE
% s2 O4 ?9 O. B$ F7 DGPE其实是属于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(),就会被调用了。
) g% N. n* x: Q7 [; `% J& Y/ ?+ J0 W" T9 I
That’s all!$ a0 p1 D/ f, S$ K
2 k2 h) h0 x) S1 C9 z9 a$ tPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|