3. 设备树GPU节点必备属性详解

设备树(Device Tree)是描述硬件拓扑与资源的关键数据结构。对于GPU节点,必须准确描述其寄存器地址、中断信号、时钟与复位依赖以及兼容性标识。本节逐一剖析每个必备属性的语义、格式与典型值,并给出完整示例。

核心原则:设备树中的GPU节点必须与SoC参考手册、时钟树、中断控制器及复位控制器严格对齐。任何属性缺失或值错误都会导致驱动无法probe或运行时崩溃。

3.1 必备属性总览

下表列出GPU节点必须包含的5个属性及其作用:

属性名 类型 作用 是否必须
compatible string / string list 匹配驱动与硬件 是
reg u32 / u64 数组 描述寄存器地址范围 是
interrupts u32 数组 指定中断号与触发类型 是
clocks phandle + specifier 引用时钟源 是
resets phandle + specifier 引用复位控制器 是
补充说明:部分SoC可能还需要 power-domains、iommus、dma-coherent 等属性,但上述5项是所有GPU节点的基础骨架。

3.2 compatible —— 驱动匹配的钥匙

compatible 属性是设备树与驱动绑定的核心。格式为 "厂商,型号",按从具体到通用的顺序排列。

  • 第一项:精确的SoC/GPU型号,如 "rockchip,rk3588-mali"
  • 第二项:兼容的通用型号,如 "arm,mali-valhall"
compatible = "rockchip,rk3588-mali", "arm,mali-valhall";
常见错误:只写通用型号而不写具体SoC型号,可能导致驱动无法正确识别SoC特有的时钟/电源策略。务必保留最精确的匹配项。

3.3 reg —— 寄存器空间描述

reg 属性定义GPU的物理地址基址与长度。对于64位地址空间,使用 reg = <0x0 0xfdab0000 0x0 0x10000> 格式(高32位 + 低32位 + 长度高32位 + 长度低32位)。

reg = <0x0 0xfdab0000 0x0 0x10000>;

若GPU包含多个地址区域(如控制寄存器 + 显存窗口),可依次列出:

reg = <0x0 0xfdab0000 0x0 0x10000>,
      <0x0 0xfdac0000 0x0 0x20000>;

3.4 interrupts —— 中断信号配置

GPU通常需要多个中断线(作业完成、MMU错误、电源管理)。中断描述格式依赖 #interrupt-cells(通常为2:中断号 + 触发类型)。

interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
             <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,
             <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
  • GIC_SPI:共享外设中断类型(值为0)
  • 89/90/91:中断号(需查SoC手册)
  • IRQ_TYPE_LEVEL_HIGH:高电平触发(值为4)

3.5 clocks —— 时钟依赖

GPU需要多个时钟源:核心时钟、总线时钟、内存接口时钟。使用 clocks 属性引用时钟控制器输出,配合 clock-names 标识用途。

clocks = <&cru CLK_GPU>,
         <&cru CLK_GPU_BUS>,
         <&cru CLK_GPU_MEM>;
clock-names = "core", "bus", "mem";
命名规范:驱动通常通过 devm_clk_get(dev, "core") 获取指定时钟,clock-names 必须与驱动代码中的字符串完全一致。

3.6 resets —— 复位依赖

GPU在初始化前必须解除复位。使用 resets 属性引用复位控制器,reset-names 标识复位线用途。

resets = <&cru SRST_GPU>,
         <&cru SRST_GPU_BUS>;
reset-names = "core", "bus";

3.7 完整GPU节点示例

以下是一个基于Rockchip RK3588的Mali GPU完整设备树节点:

gpu: gpu@fdab0000 {
    compatible = "rockchip,rk3588-mali", "arm,mali-valhall";
    reg = <0x0 0xfdab0000 0x0 0x10000>;
    interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
                 <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,
                 <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
    interrupt-names = "job", "mmu", "gpu";
    clocks = <&cru CLK_GPU>,
             <&cru CLK_GPU_BUS>,
             <&cru CLK_GPU_MEM>;
    clock-names = "core", "bus", "mem";
    resets = <&cru SRST_GPU>,
             <&cru SRST_GPU_BUS>;
    reset-names = "core", "bus";
    power-domains = <&power RK3588_PD_GPU>;
    status = "okay";
};

3.8 GPU节点资源依赖关系图

下图展示了GPU节点与SoC各子系统的资源连接关系:

GPU节点资源依赖关系图 GPU 设备节点 gpu@fdab0000 GIC 中断控制器 SPI 89/90/91 CRU 时钟控制器 CLK_GPU / BUS / MEM CRU 复位控制器 SRST_GPU / BUS PMU 电源域 RK3588_PD_GPU DMA / IOMMU 地址转换 & 访问 interrupts clocks resets power-domains iommus 说明:GPU节点通过设备树属性与中断控制器、时钟、复位、电源域及内存系统建立连接 驱动在probe阶段解析这些属性,完成硬件初始化

3.9 属性配置检查清单

在提交设备树前,请逐项核对以下清单:

检查项 验证方法 常见问题
compatible 顺序 最具体在前,通用在后 颠倒顺序导致匹配失败
reg 地址范围 与SoC手册寄存器映射表一致 地址偏移或长度错误
interrupts 数量 与GPU驱动期望的中断数一致 缺少MMU中断导致缺页异常无法处理
clocks 命名 与驱动中 clock-names 字符串完全匹配 大小写或下划线不一致
resets 依赖 确认复位控制器已使能且序号正确 复位序号与SoC头文件定义不符
调试技巧:使用 dtc -I dtb -O dts 反编译设备树二进制,检查GPU节点是否被正确解析。内核启动时通过 clk_summary 和 interrupts 文件系统接口验证时钟与中断状态。