多 Tile 设备

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

相比之下,“GT”(官方代表“Graphics Technology”)是 GPU/tile 的一个子集,负责实现图形和/或媒体操作。GT 是驱动程序实现发生的地方,因为它位于硬件引擎、执行单元和 GuC 中。

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

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

  • 全局 GTT

  • VRAM(如果是独立显卡)

  • 中断流程

  • 迁移上下文

  • 内核批量缓冲区池

  • 主 GT

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

每个 GT 的功能
  • GuC

  • 硬件引擎

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

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

  • 多播寄存器转向

  • TLB 用于缓存页表转换

  • 重置能力

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

  • 时钟频率

  • MOCS 和 PAT 编程

内部 API

int xe_tile_alloc(struct xe_tile *tile)

执行每个 tile 的内存分配

参数

struct xe_tile *tile

要执行分配的 Tile

描述

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

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

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

初始化 tile 和主 GT

参数

struct xe_tile *tile

要初始化的 Tile

struct xe_device *xe

父 Xe 设备

u8 id

Tile ID

描述

初始化每个 tile 的资源,这些资源不需要与硬件进行任何交互或任何关于图形/媒体 IP 版本的知识。

返回

成功返回 0,出错返回负错误码。

int xe_tile_init_noalloc(struct xe_tile *tile)

初始化 tile 到可以进行分配的点。

参数

struct xe_tile *tile

要初始化的 Tile。

描述

此函数准备 tile 以允许向 VRAM 分配内存,但不允许自己分配内存。此状态对于显示读出很有用,因为继承的显示帧缓冲区通常会被覆盖,因为它通常位于 VRAM 的开头。

请注意,由于这是 tile 初始化,因此不应执行任何 GT 特定的操作,因此不需要保持 GT forcewake。

返回

成功返回 0,出错返回负错误码。