|
IGD Display Switch ( g( B2 p* j. \/ ^9 L
/ [ l; J: \% E" V5 e F) [
1. Introduction
- U5 `1 w$ D) u2 H7 H
: O! Y6 [: Y6 ?" ?* LIGD OpRegion是intel为了改善传统的Integrated Graphics Driver和BIOS之间的通信机制即SMI、INT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。
, j5 w' I$ `. f" s% `OpRegion被加载时BIOS会透过GMCH的ASLS register写入OpRegion的base address。OpRegion的Memory layout如下图1所示:6 r* b. m Z2 s0 _
: K7 n! V* i- P; m# d
$ R5 z. F! N4 l
图1
% g3 j! F q- a$ ^OpRegion是System BIOS和Driver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driver和System BIOS之间co-work的一些问题。
/ d) U6 |2 J& o
; q. K& k$ S( u" P2. Mailbox#1 About Display Switch
$ k+ Y* ^% \ p- P
) i+ M0 |! y0 Q, _ W, fMailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:, ?, e P' t9 R
. z: M1 {9 e& A
6 q& L6 {8 x0 U, ]( y
: `, o) I1 @6 L( D; T; f
图2 / I$ r$ {+ l6 g, F0 m/ d
其中与切屏相关的变量有如下几个:
/ d( r0 s7 D6 I4 G0x120h DIDL
. F+ d5 W- s+ z) j- [' J0x140h CPDL - u/ a" f1 L, q* S
0x160h CADL
5 E9 Z& ?3 E/ M9 j0x180h NADL % N# ]3 l1 n9 w* n2 H+ f
0x1A4h TIDX 6 }7 O. N6 |: v: A5 q% f
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。
: f! C: r" ? \5 J8 ]CPDL表示当前接在VGA上的所有设备。Graphics Driver会detect当前连接的设备,每当hotplug、remove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device的_DGS function用于决定下一轮的显示设备列表。 " O+ ?" l& p& d- q1 t0 u
CADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)。BIOS可以使用这个位置的值去支援 % L3 C0 s9 L* s& Z
! u. v" H: [# j1 Y9 X& J_DCS Function。
; l: F/ J) z: e v4 nNADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于
7 t3 \) G1 ]& _- RVBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。 5 i" k7 W6 s+ I k. |6 P- k
TIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。 7 l( w+ Y) V$ G
Video driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。
" v! d( ]- C8 \, S; }" W3. ACPI Extensions For Display Adapters7 W8 v* N1 M& c2 I4 m. [6 L) W0 b2 ]
. J- N( ?) J; n/ w+ `+ v& {( I: n: k
另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function:+ l0 G( n4 j6 M) E5 F' ^9 o
_DOD 该function Graphics Driver会在初始化时会call该funciton获取该平台所支持的所有的device id。在windows xp下Debug发现如果使用hotkey切屏时,每次按下hotkey,Graphics Driver都会call一次该function。该function返回的数据格式如下图所示:
8 O) b* K" u% d. l3 ^* e: |+ A7 Y. t" U# j
) E# d0 c% @8 k# |7 x) \. i0 @" h7 `7 Q. z9 t& f5 x/ ~8 z) \
, T7 l6 h& x# a$ K) d, Y, b
图 3
3 @/ V) P. J! Q7 c5 g `_ADR 用于返回设备的唯一的ID。 y0 l/ d: a! c/ M/ z& ]* J
_DCS 该function用于返回当前device的状态,windows xp下面debug发现
( e, n2 s3 e1 u6 a. v6 I \. r* I; C该function并不会被call。
* }0 f& G' p N+ |_DGS 该function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:
/ J8 Q9 }, R, ]0 Z% x9 X5 N r. r7 ~) M- L+ W& k
: h- @2 _7 F9 e
图 4
/ t+ Q, S' z% y0 x_DOS 该function用于决定是否支持输出设备切换。
! Y' g( F) a# a" N' V4 Z_DSS 当设备的显示状态已经确定之后,OSPM会call该function。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:
5 l5 m+ |, ]4 ^4 Z7 t" P; j8 k% W |0 _# [# t- s0 q
) n: h' m, z) _, ^5 Z
图 5
& Z" j2 C1 |! I2 b# V" S: G5 e
9 Y" I8 s* a& b& q: n4. Hot Key display switch Process3 P8 C, S+ A! @; h! a1 }$ n' O
( M1 r! V1 h+ c' {+ K1 t# [8 `
有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>对display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。
" q' M1 \% M$ b2 K) z# A- p; P5 k f, K
( S8 V6 t2 G% `5 \! W
6 ~5 h# ]5 {! |- d8 e
图 6 * j3 i6 y5 L; y
当我们按下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。
0 c w; X6 _0 P* `# ^/ ~4 p以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。( ]/ G; D$ |! O7 q" S% o
参考资料:; N: V. A' [: X/ b9 u9 ?
1. 《ACPI SPEC 4.0》
5 ~1 J* T5 B6 u: Q6 [2. 《Intel IGD OpRegion spec 1.0》
) i: _8 m: c! e- U3 @. k; r) Q+ F' z) f0 _
Peter$ M' T$ c; w0 H2 c9 z9 x
2009-11-22 |