|
IGD Display Switch + P. h, Q* w a8 B3 P( ^+ B
{9 W9 S9 i9 U4 G4 P) @5 d; o( @
1. Introduction
3 A; y3 }1 A8 v% v
5 @6 r2 l9 W/ w# y. jIGD OpRegion是intel为了改善传统的Integrated Graphics Driver和BIOS之间的通信机制即SMI、INT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。
E+ c9 l( ]; [( l. cOpRegion被加载时BIOS会透过GMCH的ASLS register写入OpRegion的base address。OpRegion的Memory layout如下图1所示:
b- {4 `' K$ c$ L2 j( `2 l7 A/ L
7 ~- A- z) _5 g9 l+ T$ ], T! u& z 图1. i+ K U3 f% i$ k6 a6 W
OpRegion是System BIOS和Driver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driver和System BIOS之间co-work的一些问题。8 r$ s! J* X6 k& M+ N/ L
; |5 [6 [8 g) h3 p2. Mailbox#1 About Display Switch
+ ~5 a8 ~1 X6 _: h4 D" ?5 t: ~; a$ }" L; @* r; c
Mailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:) U2 {+ j7 T2 @. x- h2 S) N' F
1 r( y8 \' L1 K3 ]! v: P, G* a+ C7 e) `
8 C, y @! _/ v) H: J, ?9 s图2
. E8 X+ m& I5 G5 P* J其中与切屏相关的变量有如下几个:
( q( j" Y1 o- Z) ]! I( D0x120h DIDL : t4 p- s: x2 E# f. x" s
0x140h CPDL
N0 g8 D% A9 F0x160h CADL ( l- d4 U3 j2 M9 D( _' P! W" B
0x180h NADL
: v( t" ^7 N5 J0x1A4h TIDX 4 t% }4 E' V9 k$ {+ Q* a/ V
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。
- {# ~, i3 Y% Y5 JCPDL表示当前接在VGA上的所有设备。Graphics Driver会detect当前连接的设备,每当hotplug、remove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device的_DGS function用于决定下一轮的显示设备列表。
6 R+ }( b' \; v$ uCADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)。BIOS可以使用这个位置的值去支援 * |$ P0 |: n0 u0 h( ^; k
" g) {( R2 X v6 F6 M1 Z1 f; l4 [6 w
_DCS Function。 . S; t( G: n8 d A m" i' O. i
NADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于 # R9 L! ?/ i* a7 ?7 d
VBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。 ( v: @! @# H6 _1 |
TIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。
- e) L, {( Z6 ^' T' Y0 k) GVideo driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。 0 P7 ?. a( o8 a5 v; Z
3. ACPI Extensions For Display Adapters
; ?+ l: P1 ~4 p" d/ @
; W- y, S G E" W9 O; ?另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function:
6 U7 @: d- u& o2 o9 \_DOD 该function Graphics Driver会在初始化时会call该funciton获取该平台所支持的所有的device id。在windows xp下Debug发现如果使用hotkey切屏时,每次按下hotkey,Graphics Driver都会call一次该function。该function返回的数据格式如下图所示:2 ?0 k6 d1 r; V, O2 c
# S7 r( c0 E# `8 ?4 t5 B( A! a9 Z- f' y
8 V+ F! f9 w, R8 b
& N! k) A m, [1 F/ I6 p+ Q( E4 U图 3 1 v0 F' c/ B2 _# K; a. I; L* r
_ADR 用于返回设备的唯一的ID。
( M, @6 Y$ z$ M8 K L_DCS 该function用于返回当前device的状态,windows xp下面debug发现
" L# X+ B5 |. i: _+ t. i该function并不会被call。7 m5 m/ q# Q1 ?/ J) O/ x* Q
_DGS 该function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:
3 W. y* I8 Z+ u7 {( k
; G8 l0 u2 Q% L4 |- |* @2 }$ j$ V' O, ` E
图 4 : H: j9 s# @0 Y7 d$ Z" L! G; H
_DOS 该function用于决定是否支持输出设备切换。
H1 G+ {( u% K/ O# }9 s_DSS 当设备的显示状态已经确定之后,OSPM会call该function。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:& \4 O+ l! l, g2 H% k Z- M
! s7 o; `. B- w3 a
4 O3 ^ c( u7 j图 5 ' A& Q) ^% U6 W8 v# z
3 u. {3 a! a$ y, O8 f: t }/ I4. Hot Key display switch Process
/ G' i; e' h9 h N0 y, R: \% G6 y- c$ X. z0 N/ s8 r+ W
有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>对display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。
4 ~( Z" Z) q% }9 \2 Q
$ L, h8 @' h% e+ L. W7 W0 T' X
R3 r8 s( e2 I
5 p( `8 H" A5 ~6 z t8 L/ B
图 6
7 K9 C6 U" l) \. [4 s+ L4 U当我们按下hotkey时,EC会透过Q_EVENT通知BIOS,BIOS收到该Q_EVENT后会call IGD.GHDS() function,GHDS会call GNOT function,而GNOT最终会call Notify(VGA,0x00)去扫出所有的显示设备,这时_DOS=0会被调用表示始能切屏的功能;然后再call Notify(VGA,0x80)去做切屏的动作。在win xp & 2k下,_DOS=2将会被调用到,表示暂时禁用掉切屏功能(因为现在正在切屏),接下来是然后BIOS会透过_DOD获得支持的所有device id,call对应CPDL 对应的device的 _ADR fucntion 获得该device的唯一的ID。然后会call _DOS设置输出设备切换始能,下来会用OpRegion中的NADS去call _DGS用于决定下一组显示组合。最后再call _DSS确定显示组合,再后来就是Graphics Driver sets new mode。
^) [- w" t) w3 \* s以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。6 L* E* _3 j3 J
参考资料:! S4 J6 B5 h1 n
1. 《ACPI SPEC 4.0》& e% |7 r% D: D% H& J& Z5 D9 ~
2. 《Intel IGD OpRegion spec 1.0》
' m( l( r4 K0 r$ r: n D
* {. ^: [; p3 W* K) X! L: x0 ~Peter
* @' v [. E6 V& h: I2009-11-22 |