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 之间的连接与绑定:

drm_info 输出拓扑关系图 DRM Device (card0) CRTC 0 (1920x1080) CRTC 1 (1280x720) Encoder 0 (TMDS) Encoder 1 (eDP) Connector 0 (HDMI-A-1) Connector 1 (eDP-1) Plane 0 (PRIMARY) formats: XR24, NV12 Plane 1 (OVERLAY) formats: AR24, NV12 说明: 实线表示 CRTC → Encoder → Connector 的显示管道绑定;虚线表示 Plane 与 CRTC 的合成层关联。

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 解析器即可
信息完整性 完整,包含所有属性 完整,且保留数值类型
性能计数器关联 需手动对照 可自动关联,推荐脚本使用
调试效率 快速查看拓扑 适合批量对比与自动化