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