4. SA8155 SMMU硬件特性
SA8155 平台集成的系统内存管理单元(SMMU)基于 ARM MMU-500 架构,是 GPU 与显示子系统进行虚拟地址翻译和内存保护的核心硬件。本章深入解析其版本特性、Context Bank 配置逻辑以及 Stream ID 匹配原理,为后续 IOMMU 驱动初始化与显存分配奠定硬件认知基础。
关键认知:SA8155 的 SMMU 并非简单的地址翻译器,而是一个支持多个独立“上下文”的硬件防火墙。每个 GPU 进程或硬件模块通过 Stream ID 绑定到特定的 Context Bank,实现隔离的页表与权限控制。
4.1 SMMU 版本与 MMU-500 架构概览
SA8155 使用的 SMMU 版本基于 ARM 的 MMU-500 架构,支持 VMSAv8-64 地址翻译,具备以下核心特性:
- 多级页表支持:支持 4KB、64KB 页粒度,以及 1GB/2MB 大页映射,减少 TLB 缺失。
- 安全与非安全空间隔离:通过 NS(Non-Secure)位区分 GPU 与安全世界的内存访问。
- TBU 与 TCU 分离:Translation Buffer Unit(TBU)靠近主控,Translation Control Unit(TCU)集中管理配置,形成分布式翻译架构。
架构要点:MMU-500 支持最多 128 个 Stream ID 输入,每个 Stream ID 可独立映射到 32 个 Context Bank 之一。SA8155 实际配置通常启用 8~16 个 Context Bank 供 GPU 与显示控制器使用。
4.2 Context Bank 配置与隔离机制
Context Bank 是 SMMU 中保存页表基地址、ASID(Address Space ID)以及权限控制的硬件单元。每个 Context Bank 对应一个独立的虚拟地址空间。
| Context Bank 寄存器 | 位宽 | 功能描述 |
|---|---|---|
| SMMU_CBn_TTBR0 | 64 位 | 存储 0 级页表基地址(TTBR0),用于用户空间映射 |
| SMMU_CBn_TTBR1 | 64 位 | 存储 1 级页表基地址(TTBR1),用于内核空间映射 |
| SMMU_CBn_SCTLR | 32 位 | 控制寄存器,使能翻译、配置缓存策略与共享属性 |
| SMMU_CBn_ACTLR | 32 位 | 辅助控制寄存器,用于性能监控与调试 |
| SMMU_CBn_PAR | 64 位 | 物理地址寄存器,记录翻译后的物理地址及错误状态 |
配置陷阱:Context Bank 的 TTBR0 与 TTBR1 必须与 GPU 驱动使用的页表层级一致。若 GPU 驱动使用 4 级页表(L0~L3),而 SMMU 配置为 3 级,将导致翻译异常。SA8155 通常配置为 4 级页表,与 ARMv8.1 VMSA 兼容。
在 SA8155 的 GPU 驱动初始化流程中,Context Bank 的分配策略如下:
- 静态预留:Bank 0~1 预留给显示控制器与安全世界。
- 动态分配:Bank 2~15 由 GPU 驱动管理,每个 GPU 进程或硬件队列绑定一个独立的 Context Bank。
- ASID 复用:每个 Context Bank 关联一个 8 位 ASID,用于 TLB 标记,避免不同进程的页表冲突。
4.3 Stream ID 与 Stream Match 机制
Stream ID 是 SMMU 识别不同主控(Master)的唯一标识。在 SA8155 中,GPU、显示控制器、视频编解码器等每个硬件模块都分配了固定的 Stream ID。Stream Match 单元负责将输入的 Stream ID 映射到对应的 Context Bank。
匹配流程:当 GPU 发起内存访问时,SMMU 的 Stream Match 逻辑根据 Stream ID 查找 Stream Match Table(SMT),获取对应的 Context Bank 编号,然后使用该 Bank 的页表进行翻译。
Stream Match Table 的典型配置如下:
| Stream ID 范围 | 主控设备 | 映射 Context Bank | 安全属性 |
|---|---|---|---|
| 0x00 ~ 0x0F | GPU Core 0~15 | Bank 2 ~ Bank 17 | Non-Secure |
| 0x10 ~ 0x1F | 显示控制器 | Bank 0 | Non-Secure |
| 0x20 ~ 0x2F | 视频编解码器 | Bank 1 | Secure |
| 0x30 ~ 0x3F | 其他外设 | Bank 18 ~ Bank 31 | Non-Secure / Secure |
Stream Match 的硬件实现包含两个关键寄存器:
- SMMU_SMRn(Stream Match Register):配置 Stream ID 的匹配掩码与值,支持精确匹配或通配符匹配。
- SMMU_S2CRn(Stream to Context Register):指定匹配成功后映射的 Context Bank 编号,以及访问权限(可读、可写、可执行)。
/* Stream Match 配置示例:将 Stream ID 0x05 映射到 Context Bank 3 */
/* 设置 SMR:匹配 Stream ID 0x05,掩码 0xFF(精确匹配) */
writel(0x000500FF, SMMU_BASE + SMMU_SMR5);
/* 设置 S2CR:映射到 Context Bank 3,允许非安全读写 */
writel(0x00030003, SMMU_BASE + SMMU_S2CR5);
调试要点:若 Stream ID 未匹配任何 SMR 条目,SMMU 将触发 Stream ID 未匹配错误(StreamID Unmatched Fault)。驱动初始化时必须确保所有活跃的 Stream ID 都有对应的 SMR/S2CR 配置。
4.4 实战要点:SMMU 初始化检查清单
在 SA8155 的 GPU 驱动中,SMMU 初始化需按以下步骤验证:
- 读取 SMMU 版本寄存器:确认 MMU-500 的架构版本与实现 ID。
- 配置 Stream Match Table:为 GPU 的每个 Stream ID 写入 SMR 与 S2CR,确保映射到正确的 Context Bank。
- 初始化 Context Bank:设置 TTBR0/TTBR1 为有效的页表基地址,配置 SCTLR 使能翻译。
- 验证隔离性:通过访问不同 Context Bank 的地址空间,确认页表隔离生效。
- 错误处理:注册 SMMU 中断处理函数,捕获并记录 Stream ID 未匹配或页表错误。
性能建议:SA8155 的 SMMU 支持 TLB 预取(TLB Prefetch),可在 Context Bank 的 SCTLR 中使能。对于 GPU 这种大内存带宽场景,建议开启预取以减少页表遍历开销。