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

[原创]BIOS知识点滴Follow Bini系列之--ACPI _GPE & _Q方法

[复制链接]
发表于 2007-12-7 12:11:21 | 显示全部楼层 |阅读模式
--易祝兵 2007-12-7

4 ~' n( H$ d5 L3 a; r在BIOS初始化platform PM寄存器后,支持ACPI的操作系统会开启ACPI模式,一般同时开启SCI事件的响应。
4 ~. g1 [5 n- i2 l) |( @, a, E9 C- s
/ T1 v, P2 t: C; n% p什么是SCI?什么是SMI?
! s6 c! M6 f  r/ Y! E; c7 h这里如您不知道,我只大致解释一下:% U. j' X0 r) I4 n2 B  Q2 B
SCI:系统控制中断,会由产生一个IRQ x(此x号码,一般可由平台的寄存器设定)中断请求,操作系统的ACPI驱动会响应此中断。
0 F4 ^# R+ }  }3 n1 c( FSMI:系统管理中断,由各设备或软件需要SMM服务时,下拉CPU的SMI Pin所产生,系统不论在做什么,都会挂起现执行的操作,跳至一个特殊的模式,叫系统管理模式(SMM)(当然是比操作系统有更高的优先权啦,才不管你0/3 level什么的。)$ t7 B% S9 _* a+ N* I3 g1 U
& P# d; }% E& H+ J6 v& A
当你配置了一个GPIO产生events后,又打开了ACPI和SCI。那么系统在此GPIO Status发生变化的时候,ACPI驱动就会捕捉到。即:一般就执行一个ACPI里_GPE()内的一个方法。这是普通的。
4 g/ ]2 V2 {" |' D. @* c' O% _5 t7 K  W: q0 S; O# E1 y
ICH7 GPIO Status的寄存器如下:
# W; X( ~% h  {: ] 1.JPG
  W1 [1 q4 M$ q' @# E8 V! n+ ^. B, K5 p$ `  ?" y
让GPIO产生SCI或SMI的Switch寄存器:
4 ]; C, Z: a0 D, g 3.JPG 3 }- ?! d4 [* O$ b' P
! V4 b: h7 o4 J
一种机器所用到的的GPIO:& ~; y' D+ S. Z6 F, u
2.JPG ; `& s* b0 V$ i  z  r* c- b
- T2 Z. M. o6 [# U- f
处理这些事件的方法如下:7 J$ N7 H' z2 M: {6 f- o
4.JPG / [, U+ o/ l1 w- b
注意上面,的_L04是指你GPEx_STS的PM寄存器的第4个bit位发生变化时,所执行的ACPI事件方法,并不一定是指第4个GPIO所生产的方法,各平台有各平台的Chipset手册,注意看好。
# `* a- |9 F/ {
7 l8 ?4 k& r2 I1 A那什么是Q方法?
+ H6 `' |( [2 m; T) ?! N. E当你的平台定义了ACPI嵌入式控制器(EC,PNPID:PNP0C09[PNPID的文档,见本站内的贴子:http://www.ufoit.com/bbs/thread-97-1-1.html]),并指定了EC所使用的GPIO,那么,此GPIO的事件(状态发生变化)产生时,就会产生一个Q事件,处理此事件的,就叫Q方法,可以有从0到FF个,即: _Q00() ~ Q255()。
2 Q( E) m% J( q  Y
' g2 v1 C) o' L4 ^既然有256个,哪如何区分Q事件呢?
7 ^9 W! _; j: R- h8 N9 C' T. ]当Q事件产生时,OSPM会向ACPI EC发出一个命令去查询此Q事件的号码。EC会响应并回复一个号码给OSPM,然后OSPM就会执行ACPI里的某个Q方法。$ p" w5 A5 G. x; [' b' {3 D
5 R! l* b1 c2 R
如EC发现温度发生变化,就会向ACPI Thermal驱动发出通知,更新ACPI Thermal,以便系统按要求处理散热方案,如下图:
( \$ A, R% ^9 \1 _8 b/ SMethod(_Q34) { // embedded controller event for thermal Notify) ]7 h: N' h: h( G* O4 A
    (\_SB.TZ0.THM1, 0x80)
# o5 m6 x! Y( S) M; ]+ Q+ c- P/ D}
' g0 N6 v6 m& B3 g- y5 u7 j' Z( C% k$ x5 {( H: o
详见文档: ACPI 3.0b -> 5.6.2.2.3 Queuing the Matching Control Method for Execution.+ X/ T7 s4 d( W9 D# h+ [/ b
如找不到ACPI 3.0b请到:http://www.ufoit.com/bbs/thread-7-1-1.html 处或 http://www.acpi.info 下载。
发表于 2007-12-8 09:17:47 | 显示全部楼层
嗯,多谢分享
回复

使用道具 举报

发表于 2007-12-24 11:22:01 | 显示全部楼层

wake event

看spec,GPE 事件产生后除了会发 SCI/SMI#,有时候还会发 wake event.1 Y( b5 o' e, i- u" o, `
SCI --> IRQ --> ACPI driver。
, V6 Y. J6 B; a' V+ J" ]SMI# --> SMM。
' e$ i% C- l1 h/ P- R那 wake event 的工作机制又是怎样的呢?
回复

使用道具 举报

发表于 2007-12-24 12:09:51 | 显示全部楼层
Wake Event, 就是可以把系统唤醒的事件, 例如网络的唤醒方式, 是通过 PME# 产生 Wake 事件, 把机器从S1/S3/S4/S5唤醒, 返回到S0.
回复

使用道具 举报

 楼主| 发表于 2007-12-26 14:31:54 | 显示全部楼层
你看Host的Datasheet,看平台支持哪些唤醒,如你平台支持GPI[0..n]的 wake up,那就应该有个开关,让某个GPI[0..n]产生Wake event(注意是在S1~S5,看你的平台说明),如果在S0,那么就可能只产生SCI/SMI。所以,当此GPI产生Wake event时,HOST就会启用wake up上电时序进行平台上电。8 {4 H; `5 Y1 l( e( v" i3 a

) s) Z7 r# M/ z; @多翻平台的Datasheet,查找wake event,应该一目了然。
回复

使用道具 举报

发表于 2008-1-2 14:58:31 | 显示全部楼层
看了快一个月的ACPI了,总算知道大家的讨论什么了。
9 H2 v4 ~7 t* |* J0 j
2 R" R9 }8 A. P& C% O   ^    ^
# \' q. p" f; h, U (   。 。  )% o7 M+ K& Q, }4 @  M4 [9 I# |
     (  )
回复

使用道具 举报

发表于 2008-1-14 16:04:06 | 显示全部楼层
讲得不错。& E6 b0 R: [; X( h4 S+ y" g; o
其实一切均按apci规范进行,考验大家英语阅读和领会能力啊
回复

使用道具 举报

发表于 2008-5-19 20:16:16 | 显示全部楼层
"让GPIO产生SCI或SMI的Switch寄存器"
) x) B9 w) k' Q  ^) ~/ [6 F6 ~+ r2 S% P1 r; h- p/ s9 ?
谢谢!
回复

使用道具 举报

发表于 2008-5-19 20:31:28 | 显示全部楼层
请教一个问题
) w, W* y, e" W) @
, o8 o2 B- Y6 M) E1 NSMM里面还可以在发SMI吗?
回复

使用道具 举报

 楼主| 发表于 2008-5-20 00:54:48 | 显示全部楼层
SMI是不可重入的.具体见IA64 & IA32 AS, Volume 3B 第24章.
回复

使用道具 举报

发表于 2008-7-8 17:54:14 | 显示全部楼层
请楼主解释一下,' h, S$ R! N; D% d1 j; D
RST_CNT—Reset Control Register ; y! g1 Y1 n, ^$ X  r' d( y
I/O Address: CF9h Attribute: R/W% C. @! l* {% N; O
' Q' Y8 ]3 }3 z) n* Y" }
ICH9在这之后都使用offset表示 Register Address(PMBASE + OFFSET, 这里的PMBASE是指 CF9吗??)
4 v  A3 E: o1 p9 d- u比如:: n! z7 _0 o8 P: q2 [$ u7 g$ L3 S
GEN_PMCON_1—General PM Configuration 1 Register
% }. K7 B# `' s, Z- D4 v  WOffset Address: A0h4 M; c8 y8 M% ^2 C$ k8 d

( ?* C1 \! d. U4 k! a6 _如果我要对该register操作,该怎么做呢? I/O Address = 0x0CF9* 16 + 0xA0 = 0xd030 ??????
- l/ N8 M' a8 \' P% I# x: h( L& I+ V  n8 r$ I
还有,您上面所写的
: o( D4 r$ ?6 h8 ]2 Lmov al, 0Eh
; j  N/ K% G+ f7 fmov dx, 0CF9h+ c0 l1 u3 a1 r: e! z5 K0 ]
out dx, al9 C2 j8 a( j! ]
jmp $8 k9 \/ U6 L% y8 D8 d8 y

4 r- A3 _- J9 L最后的jmp $ 是跳到哪了?
回复

使用道具 举报

 楼主| 发表于 2008-7-9 09:44:43 | 显示全部楼层
PMBASE,请查找ICH的spec,即可找到答案。
+ X/ p9 W" l, V7 |# p4 \  c) N' K0 v" [6 ]
Jmp $,就是Jmp到自己,也就相当于一个死循环。
回复

使用道具 举报

发表于 2009-12-4 17:25:54 | 显示全部楼层
哥哥,有些复杂
回复

使用道具 举报

发表于 2010-7-19 19:53:15 | 显示全部楼层
mark,等我先看看spec,再来领会先,多谢
回复

使用道具 举报

发表于 2011-1-4 14:26:46 | 显示全部楼层
mark,等我先看看spec,再来领会先,多谢
回复

使用道具 举报

发表于 2012-7-20 10:53:39 | 显示全部楼层
Bini,怎麼看不到你最近的動態了呢?什麽時候再出江湖,為我們指點迷津呀?
回复

使用道具 举报

发表于 2013-9-4 00:25:20 | 显示全部楼层
暂时还在学习中,很多看不懂
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 22:01 , Processed in 0.071090 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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