Windows 图形显示驱动开发-WDDM 2.7功能-MCDM KM 驱动程序实现指南(二)

CPU 主机调节支持

如果支持 CPU 主机调节,则还必须提供指向以下函数的指针:

  • DxgkDdiMapCpuHostAperture
  • DxgkDdiUnmapCpuHostAperture

CPU 主机调节

CPU 主机孔径

对于 32 位 OS 离散图形处理单元 (GPU) 不支持可调整大小的 BAR,或者当调整帧缓冲区 BAR 的大小失败时,Windows 显示驱动程序模型 (WDDM) v2 将提供一种替代机制,通过该机制可以有效地访问离散 GPU VRAM。 对于支持可编程 BAR 地址空间的 GPU,WDDM v2 中引入了新的 CPU 主机光圈功能来抽象该功能。

公开 CPU 主机调节时,内核模式驱动程序会为每个支持 CPU 主机调节的段填充新的 DXGK_CPUHOSTAPERTURE 上限结构。 这定义了 CPU 主机调节的大小,这允许驱动程序保留一些 BAR 供内部使用。 页大小与内存段的 GPU 页相同。

然后,内核模式驱动程序公开两个新的设备驱动程序接口, (DDI) 来管理 BAR 地址空间,尤其是 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture。

CPU 主机光圈后面的页表的内存由驱动程序管理,并在驱动程序初始化期间提前设置。 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture 预期在段枚举后立即正常运行,并在视频内存管理器初始化期间使用,以在适配器初始化期间将 CPU 虚拟地址映射到系统分页进程的页目录和页表。

当需要 CPU 访问内存段时,视频内存管理器会保留 CPU 主机 Aperture 中的页,并通过它映射内存段页。 下面对此做了演示。

在链接的显示适配器配置中,除以下内容外,内容看起来类似。

  1. 默认 或 LinkMirrored 分配始终映射到 GPU0。
  2. LinkInstanced 分配的虚拟地址范围为 AllocationSize*NumberOfGPUInLink ,这些地址范围与映射到不同 GPU 的分配的各个部分相关联。

下图说明了这一点:

物理寻址支持

如果使用物理寻址,还必须提供指向以下函数的指针:

  • DxgkDdiPatch
  • DxgkDdiRender
  • DxgkDdiSubmitCommand

GPU 虚拟寻址支持

如果使用 GPU 虚拟寻址,还必须提供指向以下函数的指针:

  • DxgkDdiCreateProcess
  • DxgkDdiDestroyProcess
  • DxgkDdiGetRootPageTableSize
  • DxgkDdiSetRootPageTable
  • DxgkDdiSubmitCommandVirtual

IoMmu 隔离支持

如果支持 IoMmu 隔离,还必须提供指向以下函数的指针:

  • DxgkDdiBeginExclusiveAccess
  • DxgkDdiEndExclusiveAccess

链接适配器支持

对于可选的链接适配器支持,还必须提供指向以下函数的指针:

  • DxgkDdiLinkDevice

电源管理支持

对于可选的电源管理支持,还必须提供指向以下函数的指针:

  • DxgkDdiSetPowerComponentFState;如果报告的组件支持 F 状态,则是必需的。
  • DxgkDdiPowerRuntimeControlRequest
  • DxgkDdiPowerRuntimeSetDeviceHandle

注意:新式待机或连接待机系统需要电源管理支持。

空闲状态和活动电源的 GPU 电源管理

GPU 电源管理设备驱动程序接口 (DDI)

这些新的和更新的函数和结构从Windows 8开始可用,以便显示微型端口驱动程序转换电源组件的状态并与 Microsoft DirectX 图形内核子系统通信电源事件。

  • DxgkCbCompleteFStateTransition
  • DxgkCbPowerRuntimeControlRequest
  • DxgkCbSetPowerComponentActive
  • DxgkCbSetPowerComponentIdle
  • DxgkCbSetPowerComponentLatency
  • DxgkCbSetPowerComponentResidency
  • DxgkDdiPowerRuntimeControlRequest
  • DxgkDdiSetPowerComponentFState
  • DXGK_DRIVERCAPS
  • DXGK_POWER_COMPONENT_FLAGS
  • DXGK_POWER_COMPONENT_MAPPING
  • DXGK_POWER_COMPONENT_TYPE
  • DXGK_POWER_RUNTIME_COMPONENT
  • DXGK_QUERYADAPTERINFOTYPE
  • DXGKARG_QUERYADAPTERINFO
  • DXGK_QUERYSEGMENTOUT3

GPU 电源管理方案

GPU 和显示屏幕是笔记本电脑、移动设备和台式电脑中最大的两个电源消耗者。

以下是降低功耗和延长电池使用时间的关键电源管理方案:

  • 移动外形规格设备可以进入空闲状态并省电,因为单个系统组件在不使用时会关闭。
  • 基于芯片 (SoC) 的 Windows 系统设备的行为类似于消费设备和移动电话,即它们在需要时立即打开,从而节省能源。
相关推荐
TangDuoduo00055 天前
【Linux SPI驱动开发】
驱动开发
The️5 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
FserSuN5 天前
AI编程 - 规范驱动开发(SDD)学习
驱动开发·学习·ai编程
TangDuoduo00056 天前
【Linux I2C设备驱动】
linux·驱动开发
The️6 天前
Linux驱动开发之Open_Close函数
linux·运维·驱动开发·mcu·ubuntu
LCG元6 天前
嵌入式GUI设计:STM32F429+LVGL,智能仪表盘界面开发指南
驱动开发·stm32·嵌入式硬件
小龙报7 天前
【51单片机】 给单片机加 “安全锁”!看门狗 WDT:原理 + 配置 + 复位验证全拆解,让程序稳定不跑飞
驱动开发·stm32·单片机·嵌入式硬件·物联网·51单片机·硬件工程
码农编程录7 天前
【notes12】kbuild,内核模块化,字符设备驱动,设备树,platform总线,设备驱动模型
驱动开发
乔碧萝成都分萝7 天前
二十六、IIO子系统 + SPI子系统 + ICM20608
linux·驱动开发·嵌入式
A星空1237 天前
二、交叉编译工具链(arm-linux-gnueabihf-gcc)安装与验证,搭建 TFTP+NFS 服务,调试开发板网络连通性;
linux·c++·驱动开发·单片机·嵌入式硬件