AMD IOMMU 介绍

主要功能

  • I/O DMA 访问权限检查和地址翻译
  • 可选:支持用户VM的地址翻译
  • 一个Device Table可以允许 I/O设备被分配给以个指定的domain并且包含一个指针指向Device Page Table
  • 中断重映射并提供权限检查
  • 可选:支持AMD64 vAPIC
  • 基于内存的命令和状态交互在处理器和iommu设备之间
  • 可选:支持 Peripheral Page request (PPR) Log
  • 可以减轻PPR 和 Event Log Overflow
  • 可选:基于硬件的允许特权I/O设备访问预定义的系统内存

系统拓扑图

使用模型

  • 替换GART(Graphic Access Remote Table)
  • 替换DEV (Device Exclusion Vector)
  • 对32bit设备访问64bit控制提供支持
  • 用户态设备的直接访问
  • 虚拟机访问设备支持
  • 虚拟的IOMMU (vIOMMU)
  • 虚拟化的用户态设备访问支持

IOMMU可选功能支持

  • Guest virtual to guest physical address translation capability
  • AMD64 long mode page table compatibility
  • Support for PCI ATS
  • Support for PCI-SIG PRI and PASID TLP prefix ECN
  • Support for a guest virtual APIC (e.g., AVIC)
  • Enhanced performance and error logging features
  • Guest page table User/Supervisor access privilege checking
  • Guest page table Global Supervisor-level access protection
  • Guest page table non-executable page protection
  • Segmentation of the Device Table
  • PPR and Event Log dual buffers with optional autoswap
  • PPR Auto Response with Always-on feature
  • PPR Log early overflow warning
  • Device-specific feature reporting registers
  • MMIO access to MSI setup and mapping configuration space fields
  • Memory Access Routing and Control (MARC)
  • Automatic Block StopMark Message Handling
  • Guest I/O Protection
  • x2APIC
  • Hardware Accelerated Virtualized IOMMU (vIOMMU)
  • Secure ATS
  • Secure Nested Paging

DRM GPU Scheduler

DRM GPU Scheduler 背景

调度器 顾名思义是用来分配某种有限资源的一种算法。

从CPU的视角来看,CPU的核心数目是远少于线程数目的,所以在某一个时刻只有一部分线程才可以得到执行,控制这些这些线程执行的时机和时长的一种算法,我们称之为CPU的调度算法。同样的在GPU领域也是同理的,在现代的操作系统中,每一个进程都期望可以使用GPU资源进行某种计算,所以GPU的调度器也就有所必要,但是与CPU相比GPU的调度器还是相对来说比较简单的。

阅读更多

AMD GPU VMID

本文所讨论的均为AMD公司的显卡产品

显卡:AMD Radeon RX 5500 - 8GB 显存

Linux:Linux-5.4.y (fc944ddc0b4a)

AMD GPU HUB

在AMD GPU内部有很多种类的IP,这些不同种类的IP硬件一起构成了完整的GPU硬件,这些子IP在运行的时候也需要访问VRAM或者sysMem的资源,但是不同的是,这些IP并没有与实际的Memroy Controler(MC) 相连,而是汇总到一个称作为“HUB”的硬件单元上,由这个硬件单元代理进行统一的寻址,这个硬件和我们在计算机上看到南桥(PCH: Platfrom Controller Hub)很类似,计算机将一些低速的设备(NIC, SATA, USB ..) 连接到南桥,再由南桥芯片统一和CPU进行通信。

由于GPU硬件设计的需要,在AMD GPU内部集成了一个或者多个HUB硬件,系统将不同种类的IP硬件连接到不同的HUB上,由HUB代理IP进行IO访问,GPU内部IP大多数设备都是基于HUB来进行内存访问的。

HUB IP Note
GFX HUB (1个) GC (Graphic Core), sDMA 主要计算单元: SE/SH/CU/SIMD
MM HUB (1个或者多个) UVD, VCE, VCN, JPEG, DCN 多媒体: 编码解码等IP
阅读更多

AMD GPU Ring Buffer

本文所讨论的均为AMD公司的显卡产品

显卡:AMD Radeon RX 5500 - 8GB 显存

Linux:Linux-5.4.y (fc944ddc0b4a)

背景

现代的驱动模型中,一般有2种方式来操作硬件:

  • PUSH:CPU通过读写寄存器的方式来控制GPU硬件。
  • PULL:CPU将命令写到一块buffer中,并通知硬件,由硬件来解析命令并执行。

2种模式各有优劣,使用PUSH的方式一般都为同步操作,需要占用CPU时间,并且在GPU领域有大量的寄存器是不方便用户直接读写的,所以GPU大多数采用的是PULL方式。因此本文主要介绍AMD KMD Ring Buffer的原理和实现。

AMD GPU Ring Buffer

AMD GPU Ring Buffer

阅读更多

AMD GPU 虚拟内存

本文所讨论的均为AMD公司的显卡产品

显卡:AMD Radeon RX 5500 - 8GB 显存

Linux:Linux-5.4.y (fc944ddc0b4a)

Arch: X86_64

AMD GPU 虚拟内存

现代的GPU内部都包含有一个类似MMU的内存管理单元,负责GPU侧的虚拟地址到物理的翻译。和CPU类似,GPU也有一个多级页表的数据结构来管理GPU页表的映射,每一个GPU进程有一份GPU页表,在提交Command的时候GPU驱动会把进程对应的GPU页表设置到硬件寄存器中,在细节上GPU的地址分配和映射和CPU稍有不同。

阅读更多