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

[原创]IGD Display Switch

[复制链接]
发表于 2009-12-27 13:52:30 | 显示全部楼层 |阅读模式
IGD Display Switch

1 Q; H' }2 C  M

) X4 g# S6 r; q4 E  c& q: O7 ]1. Introduction
4 o) `8 l' q" u9 g& D: I7 X" {6 _9 d$ ?3 i, K
IGD OpRegionintel为了改善传统的Integrated Graphics DriverBIOS之间的通信机制即SMIINT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。" n, [; r8 n' I  K
OpRegion被加载时BIOS会透过GMCHASLS register写入OpRegionbase addressOpRegionMemory layout如下图1所示:5 m% ]; S7 Z, f7 {" |5 R

% W( X1 T3 Z+ S! A" q( `' D: D, p# X IGD1.JPG                      * S3 ^7 w# D1 k& Q$ F
                          1" j$ q3 D" @* E$ C2 b
OpRegionSystem BIOSDriver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driverSystem BIOS之间co-work的一些问题。: s) H$ \7 |( v& M3 O
6 ?- [& ^- g- Z, {8 t
2. Mailbox#1 About Display Switch
# R5 s, D& q" h& `& a& K" J1 C. a5 D6 {9 V& m* l- `
Mailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:
- z( x& S! Y; Y7 c3 D) S8 ~0 \( w

& x+ ~; i1 ^# u0 W- N( }8 _

$ a+ Q7 Y9 \! d$ F2 V. X: n IGD2.JPG
+ Q6 y; n6 N. t% W& `" @* K4 H
2
: }9 m) \! e% g" H& [
其中与切屏相关的变量有如下几个:
6 m- w% F: S: K) f" d; _. G' ?
0x120h DIDL
. E- M' `* @- A
0x140h CPDL
7 y* v0 f( Y5 A# a
0x160h CADL

. |* e* I, L' p& ^$ \5 V
0x180h NADL
( x; h% ^9 o# ]- [7 Z
0x1A4h TIDX
8 Z* W' U2 D0 C2 K% M1 {/ j  @
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。
1 E1 B% ]4 J! B: Q5 P
CPDL表示当前接在VGA上的所有设备。Graphics Driverdetect当前连接的设备,每当hotplugremove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device_DGS function用于决定下一轮的显示设备列表。
0 |4 B$ t3 h. Z0 @) q& J
CADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)BIOS可以使用这个位置的值去支援

) H3 Y4 {% u1 d3 g
$ s$ d# n. l  h' N: u% t- I
_DCS Function
+ z- f, ~" F8 I5 d3 O, T
NADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于

2 `# e9 g9 d$ Y
VBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。

: f$ |( ?* I! c2 N& B7 i. ?
TIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。

8 b" r3 h  |/ k0 R( n% p
Video driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。

  P$ b9 O& o4 |6 C" Y) N3. ACPI Extensions For Display Adapters
/ z2 f* d; r- d' X5 s
1 ]/ Q# N3 d9 S9 d' ?另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function
( U' X& }$ w) a2 e0 s3 S; k; a. I9 r_DOD function Graphics Driver会在初始化时会callfunciton获取该平台所支持的所有的device id。在windows xpDebug发现如果使用hotkey切屏时,每次按下hotkeyGraphics Driver都会call一次该function。该function返回的数据格式如下图所示:, X/ X9 V" _8 d' l4 L4 S" L- |

% U/ Q7 k, |/ Q8 E. }5 `
IGD6.JPG

" q; |8 O& T) x5 P8 N
* q4 O! T, e! U, Y) U$ v9 z
! ^1 H* \" P0 [/ M
3
: |* S) N4 W) X/ _% m) L8 o
_ADR 用于返回设备的唯一的ID
; j1 Z2 a, e6 L% z* N4 a; K_DCS function用于返回当前device的状态,windows xp下面debug发现
3 o, i' c; }: j# pfunction并不会被call

  k  O7 t( N; N" Y- c) c$ Z_DGS function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:
3 w8 f+ f, K& i% G; W4 X8 u) E3 s* k( V8 a( ]6 ?( v
IGD3.JPG

" i* q( Z/ Y% }; v' X9 k/ s$ S% _
4
; u, V/ D( a& S9 t' E
_DOS function用于决定是否支持输出设备切换。
, ~$ o" f1 {- R& ^( {; S2 T_DSS 当设备的显示状态已经确定之后,OSPMcallfunction。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:
8 G! y! _, [# A6 Q0 m/ F
8 J* q2 G$ E% F9 P
IGD4.JPG
% z. |5 H5 ]) V* A  r6 V$ U4 j5 P( s
5

, V# ?" o0 S6 m# ]7 ~" x9 w9 d- L
4. Hot Key display switch Process# A5 n! g* ^# O" Y+ U# Y% \1 x

( |  i$ b4 |1 o: j6 X! C' z* D有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。! }# Z! t2 m( u2 \6 N+ s

* C8 j9 Y/ O+ p! b) [& h: Q IGD5.JPG 7 o% R5 [  M' D1 K
* Y6 r* W9 z  f$ ~2 r9 Y( q& V5 w; i
6

( e& c( v& g5 ?, b当我们按下hotkey时,EC会透过Q_EVENT通知BIOSBIOS收到该Q_EVENT后会call IGD.GHDS() functionGHDScall GNOT function,而GNOT最终会call Notify(VGA,0x00)去扫出所有的显示设备,这时_DOS=0会被调用表示始能切屏的功能;然后再call Notify(VGA,0x80)去做切屏的动作。在win xp & 2k下,_DOS=2将会被调用到,表示暂时禁用掉切屏功能(因为现在正在切屏),接下来是然后BIOS会透过_DOD获得支持的所有device idcall对应CPDL 对应的device _ADR fucntion 获得该device的唯一的ID。然后会call _DOS设置输出设备切换始能,下来会用OpRegion中的NADScall _DGS用于决定下一组显示组合。最后再call _DSS确定显示组合,再后来就是Graphics Driver sets new mode
3 M4 g/ A  r+ A5 B以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。
% X1 E2 l* o& i参考资料:
" e" @4 p1 D( F- \/ H0 w0 [1. ACPI SPEC 4.0
0 [- ^, {7 N) k1 L% \2. Intel IGD OpRegion spec 1.0
0 E% f: a: n. H( w. a$ W2 `  V; |" v6 y# e! d) Q4 R( Z: u
Peter
5 B+ i7 G- l2 ?" T2009-11-22
发表于 2009-12-27 19:38:09 | 显示全部楼层
看来你在Insyde学到不少啊
回复

使用道具 举报

发表于 2009-12-28 19:07:26 | 显示全部楼层
謝謝分享,學習一下。
回复

使用道具 举报

发表于 2010-2-22 17:37:38 | 显示全部楼层

回复 1# peterhu 的帖子

不错,总结的很好。刚开始接触mailbox的时候也花了很多时间看code去了解每个box有什么用
5 L* P2 d$ ]# U- r3 V) u0 n" Y但是楼主提到的只是WinXP而已,到Win7就基本用不上那些mailbox了,而且在Win7下还跟regedit上的一个feature扯上关系了,具体也不是很清楚,希望楼主能够研究分享一下
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 01:00 , Processed in 0.041735 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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