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 与显示控制器使用。
SA8155 MMU-500 架构概览 SA8155 MMU-500 架构概览 GPU Core Display Video Codec TBU0 TBU1 TBU2 TCU Context Bank 管理 DDR 内存 TBU 负责缓存 TLB,TCU 负责全局配置与页表遍历,两者通过 Stream ID 关联

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 的分配策略如下:

  1. 静态预留:Bank 0~1 预留给显示控制器与安全世界。
  2. 动态分配:Bank 2~15 由 GPU 驱动管理,每个 GPU 进程或硬件队列绑定一个独立的 Context Bank。
  3. ASID 复用:每个 Context Bank 关联一个 8 位 ASID,用于 TLB 标记,避免不同进程的页表冲突。
SA8155 Context Bank 分配示意图 SA8155 Context Bank 分配示意图 Bank 0 显示 Bank 1 安全 Bank 2 GPU 进程 A Bank 3 GPU 进程 B Bank 4 GPU 进程 C Bank 5~15 动态分配 GPU 驱动:动态分配与 ASID 绑定 每个 Context Bank 拥有独立的 TTBR0/TTBR1,GPU 驱动通过写寄存器完成页表切换 Bank 0~1 为静态预留,Bank 2~15 由 GPU 驱动动态管理

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 配置。
Stream ID 匹配与 Context Bank 映射流程 Stream ID 匹配与 Context Bank 映射流程 GPU 发起访问 Stream ID = 0x05 Stream Match SMR 匹配 + S2CR 映射 Context Bank 3 TTBR0 = 页表基地址 物理地址 DDR 访问 未匹配?触发 Fault Stream Match 是 SMMU 地址翻译的第一级查找,必须保证所有活跃 Stream ID 都有对应配置 SMR 支持掩码匹配,可合并多个 Stream ID 到同一 Context Bank

4.4 实战要点:SMMU 初始化检查清单

在 SA8155 的 GPU 驱动中,SMMU 初始化需按以下步骤验证:

  1. 读取 SMMU 版本寄存器:确认 MMU-500 的架构版本与实现 ID。
  2. 配置 Stream Match Table:为 GPU 的每个 Stream ID 写入 SMR 与 S2CR,确保映射到正确的 Context Bank。
  3. 初始化 Context Bank:设置 TTBR0/TTBR1 为有效的页表基地址,配置 SCTLR 使能翻译。
  4. 验证隔离性:通过访问不同 Context Bank 的地址空间,确认页表隔离生效。
  5. 错误处理:注册 SMMU 中断处理函数,捕获并记录 Stream ID 未匹配或页表错误。
性能建议:SA8155 的 SMMU 支持 TLB 预取(TLB Prefetch),可在 Context Bank 的 SCTLR 中使能。对于 GPU 这种大内存带宽场景,建议开启预取以减少页表遍历开销。