GVT对显示引擎的虚拟(2)

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

  • 1. GVT对显示中断的模拟
ISR
中断能打断普通线程的执行

显示引擎定义的中断大部分都是通用型的,不同设备厂商开发的不同代产品在工作的时候,都会不断产生这些中断。比如同步中断(v-sync和h-sync)、vblank中断、扫描中断,这些中断和终端显示器对帧囊(FrameBuffer)的处理相关,在数据处理过程中不断地实时产生;以及插拔检测(hot plug detection)中断,当显示器插入或拔出Port的时候产生。显示引擎也可能会定义一些私有类型的中断,因不同的显卡设备而异,比如一些错误检测中断,其实是硬件和软件驱动之间的一种简单的通信机制。

GVT虚拟的显示设备只实现了最基本的功能,所以模拟通用型中断就足够了。实际上,GVT现在的代码只模拟了vblank和flip done两种中断,发现已经能够满足系统驱动和大部分应用软件的需求了。当然这是不够的,已经发现了一些应用软件,依赖于线扫描中断和垂直同步中断,不久的将来,GVT会陆续加入对它们的支持。理想的情况是GVT把所有的通用型显示中断都模拟好,我们不能假设形形色色的应用软件永远不会使用某种通用型中断。

我们可以参考Linux内核中IGD设备的i915驱动代码,函数gen8_de_irq_handler处理了所有系统需要的显示中断。IGD设备的中断实在太多,用一两个寄存器的比特位都不足以容纳,所以被设计成了简单的双层结构。第一层是中断寄存器MASTER_IRQ(地址0x44200),它定义哪一类(Group)中断被触发了;第二层是类的中断寄存器,举例来说,MASTER_IRQ中显示管道X的对应位被置成1,表示管道X有中断发生,于是就需要读取管道X的中断寄存器(DE_PIPE_IIR_X)来查看发生了哪些具体的PIPE中断,以便进行具体的处理。

MASTER_IRQ寄存器定义了四种显示相关的中断类型,它们是: PCH中断(PCH被通俗地称为南桥芯片,集成了对各种外设IO的管理)、Port中断(此处的Port即显示端口,终端显示器通过它和显示引擎连接)、PIPE中断(PIPE即显示管道,将软件提交的原始内容转成适合终端显示器使用的编码格式)和零碎中断(英文为MISC。MISC怎么翻译成中文,没有定论,上下文太多,不容易统一。我这里译成“零碎”)。GVT所模拟的vblank和flip done都术语pipe中断类,IGD有三个PIPE——PIPE-A/PIPE-B/PIPE-C,每个PIPE在MASTER_IRQ寄存器上有一个状态位,并拥有独立的中断寄存器。

  • 1.1 GVT对vblank的模拟

vblank和vsync中断很类似,显示设备在处理一个帧囊(Frame Buffer)的过程中,会先产生一个vsync中断,开始对第一行可视内容的扫描,结束最后一行可视内容的处理后,会产生一个vblank中断,此后的一段时间内(占据若干行内容的扫描时间),不会有任何可视内容被更新到显示器上。此后开始下一个帧囊的处理,周而复始地产生vsync和vblank中断。这种有序的周而复始——只要保持电力供应,就永无止境——形成了神奇的硬件timing(时序)。当我们通过软件来模拟这种时序的时候,只要通过内核timer就能实现。GVT定义了一个16ms周期的timer(代码中定义的变量名可读性很强,叫vblank_timer),每个周期产生一次vblank中断事件,模拟硬件对一个帧囊的处理。这样,每秒钟能处理的帧囊数量是1000/16=62.5个,这个数据很重要,因为它可以被翻译成实际的刷新率——也就是说,GVT模拟的DP显示器的实际刷新率是62.5Hz。

vga_timing

470 total views, 1 views today

《GVT对显示引擎的虚拟(2)》有一个想法

  1. 请教几个问题
    1. glmark2测试发现客户机性能大概是主机glmark2性能一半,这个效率有些低,不知道你们测试的效率如何?
    2. 电脑的集成显卡aperture bios里面不能更改,是否有其他方式可以更改gpu aperture 大小?
    3. intel研发的kvmgvt技术现在作为内核一部分,以后是否有其他厂家(如amd)的gpu支持?

发表评论

电子邮件地址不会被公开。 必填项已用*标注