2. drm_info 工具介绍:安装、基本用法与输出格式概览
drm_info 是 DRM 子系统调试工具链中最轻量、最直接的诊断工具。它通过读取内核 DRM 核心导出的 /sys/kernel/debug/dri/ 调试接口,将显卡设备、CRTC、Encoder、Connector、Plane 以及 Framebuffer 的拓扑关系与状态以结构化文本输出。与 modetest 偏重模式测试不同,drm_info 专注于“静态拓扑快照”,是性能计数器分析前必须掌握的基线工具。
适用场景:驱动开发初期验证设备枚举是否完整、排查 Connector 未连接、Plane 数量不足、Framebuffer 格式不支持等常见问题。在性能调优阶段,
drm_info 输出的 CRTC 与 Plane 关联关系是理解合成流水线的基础。
2.1 安装方式
drm_info 是 drm-utils 工具集的一部分,主流发行版可直接通过包管理器安装:
| 发行版 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu / Debian | sudo apt install drm-info |
20.04+ 可用 |
| Fedora / RHEL | sudo dnf install drm-info |
EPEL 仓库 |
| Arch Linux | sudo pacman -S drm-info |
AUR 亦可 |
| 源码编译 | git clone https://gitlab.freedesktop.org/emersion/drm-info.git && cd drm-info && meson build && ninja -C build && sudo ninja -C build install |
依赖 libdrm、meson |
注意:部分旧发行版包名可能为
drm-info 或 drm_info,安装后请使用 which drm_info 确认。若使用源码编译,确保内核已开启 CONFIG_DEBUG_FS 和 CONFIG_DRM_DEBUG,否则输出可能为空。
2.2 基本用法
drm_info 的命令行接口非常简洁,核心参数不超过 5 个:
# 查看所有 DRM 设备(默认行为)
drm_info
# 指定具体设备节点(如 card0)
drm_info /dev/dri/card0
# 仅输出拓扑结构,不显示详细属性
drm_info --topology
# 输出 JSON 格式,便于脚本解析
drm_info --json
# 显示帮助信息
drm_info --help
最常用的调试场景是直接运行 drm_info 不加参数,它会枚举系统中所有 DRM 设备并打印完整拓扑。对于多 GPU 系统(如笔记本集显+独显),可通过 /dev/dri/card0、card1 分别查看。
性能调优提示:在分析性能计数器之前,先用
drm_info --json 将当前拓扑导出为 JSON,然后与性能数据做关联分析。例如,若某个 Plane 的 format 列表不包含 NV12,则视频播放场景无法使用硬件合成,性能计数器中的合成延迟会偏高。
2.3 输出格式概览
drm_info 的输出采用缩进层级结构,每个层级对应 DRM 子系统的核心对象。以下是一个典型输出片段(以 Intel i915 驱动为例):
DRM device 0: /dev/dri/card0
driver: i915
version: 1.6.0
description: Intel Graphics
date: 20230101
capabilities: [RENDER, PRIME, ATOMIC]
props:
- EDID: blob
- DPMS: enum {On, Standby, Suspend, Off}
CRTC 0:
id: 32
mode: 1920x1080@60Hz
props:
- ACTIVE: 1
- MODE_ID: 42
Encoder 0:
id: 33
type: TMDS
possible_crtcs: 0x1
Connector 0:
id: 34
type: HDMI-A-1
status: connected
modes:
- 1920x1080@60Hz
- 1280x720@60Hz
props:
- CRTC_ID: 32
Plane 0:
id: 35
type: PRIMARY
formats: XR24, AR24, XR30, AR30, NV12
props:
- CRTC_ID: 32
- FB_ID: 0
Plane 1:
id: 36
type: OVERLAY
formats: XR24, AR24, NV12
props:
- CRTC_ID: 0
- FB_ID: 0
输出结构可归纳为以下层级关系:
| 层级 | 对象 | 关键字段 | 调试意义 |
|---|---|---|---|
| 1 | DRM device | driver, version, capabilities | 确认驱动加载、原子操作支持 |
| 2 | CRTC | id, mode, ACTIVE | 当前显示模式、是否激活 |
| 3 | Encoder | id, type, possible_crtcs | 编码器类型、与 CRTC 的绑定关系 |
| 3 | Connector | id, type, status, modes | 物理连接状态、支持的分辨率列表 |
| 2 | Plane | id, type, formats, CRTC_ID | 合成层类型、像素格式、绑定到的 CRTC |
| 2 | Framebuffer | id, width, height, format | 当前帧缓冲的尺寸与格式(需结合 --fb 参数) |
2.4 DRM 拓扑关系 SVG 图
下图展示了 drm_info 输出的核心对象拓扑关系,帮助理解 CRTC、Encoder、Connector、Plane 之间的连接与绑定:
2.5 关键输出字段解读
以下字段在性能计数器分析中需要重点关注:
- capabilities:若包含
ATOMIC,表示驱动支持原子操作,这是现代合成流水线的基础。若缺少此标志,性能计数器中的合成延迟可能不准确。 - CRTC 的 mode:当前显示分辨率与刷新率。高分辨率高刷新率场景下,Plane 合成压力增大,性能计数器中的
vblank间隔会缩短。 - Plane 的 formats:列出该层支持的像素格式。若目标格式不在列表中,合成将回退到 GPU 渲染,导致性能计数器中的
gpu_cycles飙升。 - Connector 的 status:
connected表示物理连接正常;disconnected表示无显示器接入,此时 CRTC 可能处于空闲状态。 - props 中的 CRTC_ID:标识 Plane 当前绑定到哪个 CRTC。若多个 Plane 绑定到同一 CRTC,合成器需要做硬件合成或合成回退。
实战案例:某嵌入式设备上运行
drm_info 发现 Plane 0 的 formats 仅包含 XR24,缺少 NV12。这意味着视频播放时无法使用硬件叠加层,所有视频帧必须通过 GPU 转换为 XR24 后再合成。性能计数器显示 gpu_cycles 比正常值高 3 倍,确认是格式不匹配导致的性能瓶颈。
2.6 输出格式对比:文本 vs JSON
| 特性 | 文本格式(默认) | JSON 格式(--json) |
|---|---|---|
| 可读性 | 高,缩进清晰,适合人工查看 | 中等,适合程序解析 |
| 解析难度 | 需正则或逐行解析 | 标准 JSON 解析器即可 |
| 信息完整性 | 完整,包含所有属性 | 完整,且保留数值类型 |
| 性能计数器关联 | 需手动对照 | 可自动关联,推荐脚本使用 |
| 调试效率 | 快速查看拓扑 | 适合批量对比与自动化 |