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

[原创]AC In/Out OS Slow Response

[复制链接]
发表于 2009-5-19 08:11:52 | 显示全部楼层 |阅读模式
AC In/Out OS Slow Response

: ?$ Z5 X# d  I/ f) N$ U
  • Phenomenon4 O: E  H9 L) U% A! M6 v

7 a* O! Z3 D- B, H' A" M* N手上一个超薄NB的案子DQA报了这样一条bug:频繁的插拔ACvista右下角的power icon有时反应很慢,AC插拔过后有时需要等几秒或十几秒才发现power icon有变化。Power icon指的是下图红色圆圈标出的部分:
' I7 G, S0 x/ i0 W* \" M
1
  • Why???1 B% r# o- a+ ~4 z: a/ Q

9 r# X4 G) D0 Q+ f  y" z
2 G8 P5 r) q  e0 Q/ y" D# ^$ V
刚看到这条bug时,我有点不以为然,因为有些机种也有这样的状况,所以我以为这个有可能是不同的测试人员认知上差异。而且超薄NB为了解决好功耗、导热的问题都使用比较低的配置,我最初还觉得可能跟配置有关。但是他们找了个相同chipset的机器去试,反应很流畅没有这样的现象L!我的猜测站不住脚了,这时我觉得应该是FW有些地方没有处理好导致的了。随后我们开始debug,首先我们要理清AC in/out 过程中ECBIOSOS都做了哪些动作,我所知道的状况是这样:1. EC检测到AC in/out的中断,更新EC ram中的AC状态并引发SCI IRQ通知OS2.OS收到SCI IRQ后调用BIOS中的_Q method并通过Notify function通知OS power source change3.OS调用_PSR function获取AC的状态并据此更新power icon显示。上述過程sample code 如下述所示:

6 B( k) B% g+ q, X3 [: K. g; I// AC Change event
; X* h; F. J/ M( P
$ C) B4 u: a* I! `" rMethod(_QXX)
2 c5 w$ f% s6 d8 F, v9 g
5 R/ [% D1 g) l( ~. b* _8 ^
{

. L: J3 ]$ n# P6 t; E* C2 M4 ~7 N/ t3 a7 S9 J' b" T
Store(0x09, DBG8)
& g- [1 r$ a( O( l! ~' V0 W" I9 C

) N) U, D( a; m' h- |Notify(\_SB. ADP,0x80)0 \5 U  a" u* y# u9 S8 M
//Power Source status changed
% [  n( z2 f$ [+ H% }! d5 B
# j5 b7 x- ]9 u
Store(0x0A, DBG8)
7 g$ ^$ C% W3 {

2 j, F& c& X1 i* A/ Y
5 m& ^! r8 V- \7 f8 r* n}

7 [! `8 r! J$ h2 T- X; Q8 V, z( ^( F6 o" a; o" f
7 Q+ r# }) ]& J* D: \2 S" e
, Y  y6 b4 s/ {* _! O5 g
Method(_PSR,0)
  I5 j& r! ]& X6 c; _5 n) N

( _% e; {; M  o% V- P$ N1 ]0 @6 A
0 H/ |  p4 u; H6 \+ y{/ M/ F& b; U, }/ b; O7 \

9 B: w9 s4 D. g  h: M/ ]
$ Z. Y# U* x) K$ B0 b% D. cStore(0x0B, DBG8)% S' q0 o" i! |1 r* o5 X. b( K5 u( l8 W

% A7 @1 k7 V( B2 w$ ]) R& w
$ g, i2 y0 Q+ y  E' n+ k5 eIf(ACST)3 S6 H: c& Y6 s" V* V  J6 e5 j2 f
//check AC status
; T  ^2 l( L! F" {1 ]3 Z
: p. m. m# X/ \
{

. s3 }4 t, R/ B' n: f9 C# }0 q2 T" A) I" u  \  a% ~( J

1 K% L6 v; h: U( T9 `( Sreturn(One)
7 i6 x; M0 Q  `" G5 S% g9 r// AC Present

+ Z$ z4 o& W, L% ?) _. N4 ?1 S( }5 g% r) A- w
}
: h$ u% z" m+ A4 f: ^1 L3 K
( R6 L  w2 C& G! @' p% ^
else

6 g3 J- A2 t7 {/ E  I) G* a# E2 m( U
{

5 G9 G1 w5 V- o9 j  M7 j$ C
' s$ S5 ~4 w5 j4 O- s& [* i& [return(Zero)6 ?$ E) [1 F6 b( b4 Y. G+ y' Z6 @
// AC Not Present
, ^' a" y. t8 b: n4 H1 n
2 S6 k0 c, f, m
}
$ G' i. u( A6 q% Q5 |2 W
7 S2 |5 i4 J" C2 H
Store(0x0C, DBG8)

5 s% |3 r) H8 e' g! Q% ~: Q& X2 ]% V  x
}! M/ J7 ^. U8 A' Y1 ?8 c# f
1 [* c% N) _* p" ^

+ v& |, @  n# Q) ?  o' V我能猜到的大概的流程应该就是这样了。那我们就从头开始追,先在AC change qevent中抛点,可是发现AC change对应的_Q method反应很快,一旦AC in/out debug card马上就会有显示。那么说明什么呢?跟EC没有关系吗?接着抛,又发现有时停在’0x0A’比较久才会出现,有时’0x0C’比较久。3 u) u) a2 M7 H1 v2 B. b
状况不太一致;没感觉就把网撒大点,在几乎所有的ACPI method中都抛上点然后再try,试了几个回合以后有感觉了,我们发现一旦现象出现在Device Battery _BST method中停的久的几率非常高,也就是说AC in/out OS还会更新battery的信息。这段代码最明显的特征就是它会从EC ram中获取非常多的电池信息,sample code如下所示:2 u9 o. _& e3 r6 ~: S! K
Method(_BST)
) t* I% p8 y$ D! r{
" [0 w5 L# E5 z( M
( B# `+ a2 @& n/ I  r4 H7 w% RStore(BSTS,Local0)
6 k7 e( k! j2 l' M
" D" f1 {; N6 z6 U' S* w# L

3 }9 K0 k* s# [) G/ SIf(LEqual(Local0,1)) //Check Battery Present Bit
+ x8 A8 U1 w: r0 f% G$ Y$ W0 B
3 f, v/ e. ~5 M; Q- q. Y$ O
{
" j) B2 h1 k, [: a2 [  T
3 S- Z3 `/ {5 i/ p' @. m* Y
7 x" w9 Z. W( k3 J
, y3 v  J2 l, Z' ^% n# Y7 R. B; J
. x5 U% E! g7 _" q3 G5 o# Y( }
! ^: I  d  y1 l4 Q) y//Read Battery information from EC

: O* Z  ^% J3 o" f7 j) x
" M, e- k' ~$ z1 `. E. E9 T… …

' e4 q9 r7 y+ ]$ r- S6 D+ P3 b
% e7 u- l6 U* J( Z, A" ^, m9 W1 x0 \2 ^% v
}

/ v) _* g& x5 [) o& [2 Y! T8 \
* v$ i, d/ }, Z( E' s2 \Store(0x0D, DBG8)

: ]4 _- e6 [' ~% }# c) \6 k# ]}
$ {3 A) o6 F4 j4 _那么问题好像是由读EC ram导致的,ACPI中读取EC内容的方式是发0x80 cmdox66 port,随后EC产生一个SCI通知OS,接着OSEC ram index发给0x62 portEC将数据送给0x62 port再产生一个SCI通知0S,接着OS0x62 port就获得了EC ram指定位置的数据了。我在EC 端加入debug信息,发现出现状况时0x80 cmd EC很晚才收到,0x80 cmdOS发的,所以貌似和EC也没什么关系吗?继续思考,EC产生一个SCI的目的应该是产生一个IRQACPI driver获悉前面的指令已经完成,ACPI driver可以继续送指令下来了。如果某一条指令慢则有可能是前一个SCI IRQ通知 ACPI drive driver还没有处理好导致,也有可能ACPI driver已经处理好但是EC没有ready所致。4 ^9 I% D5 {6 q( n: c
那么SCI中断机制是怎样的呢?EC SCICFG register通常将SCI IRQ配置成HLHpulse trigger,而且L的时间通常设置成64us,如下图2所示:
& B# I* p- `# |- k4 E/ d: W
" [3 l% x$ z# r& B; b; p2 z  ]
" B- I2 {) O. P1 }& n: k- @2 s
BIOSSB SCI pin通常配置成low edge trig SCIpulse trig有个优点就是它能够自动复位,产生一个中断后SCI pinpull high。可是因为BIOS是下降沿触发,所以EC SCI保持64us低电平会不会太长呢?会不会导致ACPI driver收到IRQ后下命令给EC,EC SCI pin还没有复位而太久才收到?又或者说EC SCI pin保持低会影响到ACPI driver IRQ latency?有了这个想法以后,我就开始放大它,修改EC SCICFGSCI IRQ配置成128 us pulse trig,然后再做AC in/out的实验,嘿嘿病情加重了,fail率接近了80%之前只有10%;那我再将pulse width调整为16us再试,结果200次竟然没有一次出现症状J.
/ D  l0 P4 h7 u1 ^0 W: T   u; y- e3 B6 L# c! E
  • Solution
- p6 X) b- E- m
+ Q# a* u1 }$ q; g6 y7 r
经过上面的分析,大概的原因已经清楚了。所以解决问题的方法应该是调整SCI IRQ pulse width,将保持低电平的时间调短,这样就可以有效的避免这条bug。通过这条bug我发现在分析问题的过程中需要理清问题的各个环节,并且对各个环节所涉及到的细节也要深入分析。不能够看到现象就轻易的下结论,更不能想当然,正确的态度是不放过任何蛛丝马迹,大胆假设多方求证!
$ t- @' i' B& z  e% a
) z3 v0 z9 o0 k6 g) N

7 _% i! m- j  k9 K( Q4 v0 z

. s0 x/ v0 T& Y% V# X 1 M# b$ J5 q+ Z, x+ e4 A
That’s all!) M6 c3 i4 b9 r6 j$ ~! H0 X3 t

0 n( ?/ `5 I0 ~, APeter

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
发表于 2009-5-19 18:31:57 | 显示全部楼层
原来如此!!!
/ E+ {8 h5 [+ r3 l: [
' S) D4 A7 Q0 g4 x) E. ]9 h8 U谢谢!
回复

使用道具 举报

发表于 2009-5-20 08:52:57 | 显示全部楼层
Bug起因为本
回复

使用道具 举报

发表于 2009-5-21 14:42:55 | 显示全部楼层
好帖,学习了 谢谢!!!!!
回复

使用道具 举报

发表于 2009-5-21 22:48:47 | 显示全部楼层

好贴

感谢分享!真的很有用,以前我也遇到这个问题,还以为是OS的问题呢!真的好贴啊!! \; A4 _  e& `# j
我看了您的分析代码,好像不是EC的代码吧!我现在就是OS-BIOS-EC三者的关系有点迷糊,版主能否指点一下!谢谢
回复

使用道具 举报

 楼主| 发表于 2009-5-22 07:53:35 | 显示全部楼层
hehe...5 V* y2 ?* G. O8 K' }( T# ~
很高心这篇文章能够对你有帮助。
& @) t5 c, U3 r7 c9 S* e上述代码是BIOS中的ASL code,理清OS-BIOS-EC之间的关系的最好途径就是7 i# A7 _8 n  @
ACPI spec,没事翻翻ACPI spec会有不少收获的。
回复

使用道具 举报

发表于 2009-5-23 09:04:24 | 显示全部楼层

谢谢

感谢指导!谢谢!有时间经常关注你帖子。
回复

使用道具 举报

发表于 2009-5-23 09:18:01 | 显示全部楼层

请教一下,关于oemmain.c中的几毫秒中断问题

您好!我现在手上有一个小本项目!用的是华邦的代码!我发现在oemmain.c中的几毫秒中断中是不是不能添加太多的代码啊!打个比方我就在一毫秒中断里加的代码,而这些代码是执行时间加入超过了一毫秒,是不是会造成EC死掉啊!因为在我修改后的代码发现有时很不稳定!我想了想是不是问题出现在这!请指教一下
回复

使用道具 举报

 楼主| 发表于 2009-5-23 10:43:26 | 显示全部楼层
中断的处理通常分顶半部和底半部,很多driver都是这样处理的.0 t- ?- n1 E! Y3 H
简单来讲就是在中断到来时置flag,后续再处理(DPC).
回复

使用道具 举报

发表于 2009-5-23 13:09:50 | 显示全部楼层

感谢回复

谢谢了!刚才我又仔细的查看了一下我的代码!终于找到了!EC死掉的原因了,就是我在上电时序那加了一个类似看门狗的小程序!来保证开机的效率。结果硬件始终有一个S电没有上来才导致我EC死在那里。
/ B9 z+ ?, q% Q' R+ V/ T对于您的解释我还是有点迷糊!对winbond的EC他的oemmain.c中的1MS,10MS,100MS,500MS,1000MS。它用的是中断还是轮询!!中断和轮询是不是没有什么太大的区别啊!我现在就是担心我在比如1MS的函数里加的代码太多,会不会出现在这段代码执行一半的时候,1MS的中断又来了。那代码不就不能完全执行了吗?
回复

使用道具 举报

发表于 2009-5-23 13:59:00 | 显示全部楼层

回复 10# zhanghmjm 的帖子

oemmain.c的是service,是具体的执行处理过程,而实际的中断呢,是由Timer 来触发的(有定时1ms),只要不在中断的Routine 里加太多东西,在 service 里加,应该没事。个人看法,呵呵
回复

使用道具 举报

发表于 2009-5-24 10:02:18 | 显示全部楼层
谢谢了!明天有时间我做个小的实验!我想就应该清楚了,到时与您分享!呵呵
回复

使用道具 举报

发表于 2009-5-26 18:20:08 | 显示全部楼层
为啥你们的是C,我的是汇编啊,
回复

使用道具 举报

发表于 2009-5-27 13:48:06 | 显示全部楼层

回复 13# amty.wang 的帖子

用汇编写才牛呢,呵呵
回复

使用道具 举报

发表于 2009-6-5 10:35:35 | 显示全部楼层
文章很精采,分析很透彻!
; a& S8 D( n# X! y
回复

使用道具 举报

 楼主| 发表于 2009-6-5 11:17:59 | 显示全部楼层
conol你也來這里了
9 l* V: k; P/ i% p2 A呵呵...
回复

使用道具 举报

发表于 2009-6-9 22:12:26 | 显示全部楼层

请教一个关于重启的问题

您好!$ m+ s" B: i* `3 G9 W
     不好意思又打扰你了,我现在遇到一个问题就是在重启电脑时EC为什么会几率性的死掉!在重启的时候我们EC都做什么啊!现在真的有点头痛了!!!
回复

使用道具 举报

 楼主| 发表于 2009-6-10 07:53:53 | 显示全部楼层
之前有追过reboot它的大致过程是这样的:
3 i, |& J8 y4 X$ I1.BIOS发FE给KBC,KBC pull low KBRST#一段时间,然后sb会将init# pin pull low 16个pci clock' {& Q/ c) w7 C% T2 ^2 m" y
chipset reset pci reset系统重启。
' |6 s0 F9 n+ P: X# z: M' ~2.一旦重启后面的动作看上去正常开机没多少差别,对ec来讲无非是keyboard init、进出idle(update escd)
$ D8 Z" a' A' l; J等等一些琐碎的动作。
7 @$ J7 B& S3 H3 b( X( @# N之前碰到问题比较多的地方就在idle这部分了。
' j% ?9 L3 L8 G* ?) R6 F你所说的EC死掉指的是所有的function 都失效吗?keyboard能不能用,hot key能用吗,四秒关机呢...
* ^/ g* i3 S! ]3 P& D还有如果单台fail几率比较高,建议你接串口debug去看EC死在哪里。
4 Y, \; p% I; e以上希望对你有所帮助。
回复

使用道具 举报

发表于 2009-6-10 21:45:30 | 显示全部楼层

重启死机

谢谢您的答复!1 H: V& I1 `# f1 J$ |: A
    我在做重启的时候EC是死掉的,四秒不能关机。键盘和热键无效!至于死机的原因真的很难找的。因为串口debug调试的功能我还没有弄呢!! q5 W. K% r0 `: W3 Q
     对了您说的BIOS发FE给我们EC应该是通过SCI吧!请指教一下!
回复

使用道具 举报

 楼主| 发表于 2009-6-11 08:15:47 | 显示全部楼层
to zhanghmjm:
* g- {7 ^- ?5 oBIOS发FE不是通过SCI,而是透过60h,64h port。
' M. K3 \; G/ z* H% Y  IBIOS应该没有办法发SCI给EC,而EC是可以发SCI给BIOS的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 18:54 , Processed in 0.025164 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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