多片设备

不同的供应商对“片(tile)”的用法略有不同,但在英特尔的世界里,“片(tile)”与大多数人认为的完整 GPU 非常接近。当多个 GPU 放置在一个 PCI 设备后面时,这就是所谓的“多片设备”。在这种情况下,几乎所有硬件都是按片复制的,尽管某些职责(如 PCI 通信、向操作系统报告中断等)仅由“根片”处理。多片平台负责以某种方式将这些片连接在一起,使得来自远程片的中断通知被转发到根片,每个片的显存被组合成一个单一的地址空间等等。

相比之下,“GT”(官方称为“图形技术”)是 GPU/片中负责实现图形和/或媒体操作的子集。GT 是驱动程序实现的主要部分,因为硬件引擎、执行单元和 GuC 都驻留在此处。

历史上,大多数英特尔设备都是包含单个 GT 的单片设备。PVC 是一个基于多片设计的英特尔平台示例(即,单个 PCI 设备后面有多个 GPU);每个 PVC 片只有一个 GT。相比之下,像 MTL 这样的平台,其渲染和媒体 IP 有单独的芯片,仍然只是一个逻辑 GPU,但图形和媒体 IP 模块都作为该单个 GPU 内的单独 GT 公开。这从软件的角度来看很重要,因为像 MTL 这样的多 GT 平台只复制了 GPU 硬件的子集,其行为与像 PVC 这样的几乎所有内容都被复制的多片平台不同。

每片功能(由片内的所有 GT 共享)
  • 完整的 4MB MMIO 空间(包含 SGunit/SoC 寄存器、GT 寄存器、显示寄存器等)

  • 全局 GTT

  • 显存 (如果为独立显卡)

  • 中断流

  • 迁移上下文

  • 内核批处理缓冲池

  • 主 GT

  • 媒体 GT(如果媒体版本 >= 13)

每个 GT 的功能
  • GuC

  • 硬件引擎

  • 可编程硬件单元(子切片、EU)

  • GSI 寄存器子集(这些寄存器的多个副本驻留在片提供的完整 MMIO 空间内,但在不同的偏移量处 --- 渲染为 0,媒体为 0x380000)

  • 多播寄存器引导

  • 用于缓存页表转换的 TLB

  • 重置能力

  • 低级电源管理(例如,C6)

  • 时钟频率

  • MOCS 和 PAT 编程

内部 API

int xe_tile_alloc(struct xe_tile *tile)

执行每片的内存分配

参数

struct xe_tile *tile

要为其执行分配的片

描述

使用 DRM 管理的分配来分配各种每片数据结构。不会接触硬件。

如果分配失败,则返回 -ENOMEM,否则返回 0。

int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id)

初始化片和主 GT

参数

struct xe_tile *tile

要初始化的片

struct xe_device *xe

父 Xe 设备

u8 id

片 ID

描述

初始化不需要与硬件进行任何交互或了解图形/媒体 IP 版本的每片资源。

返回

成功时返回 0,错误时返回负错误代码。

int xe_tile_init_noalloc(struct xe_tile *tile)

初始化片,直到可以进行分配为止。

参数

struct xe_tile *tile

要初始化的片。

描述

此函数准备该片以允许向显存分配内存,但不允许自身分配内存。此状态对于显示读取很有用,因为继承的显示帧缓冲器通常会覆盖显存的开头。

请注意,由于这是片初始化,因此它不应执行任何 GT 特定操作,因此不需要保持 GT 强制唤醒。

返回

成功时返回 0,错误时返回负错误代码。