1. 输入Address Size和虚拟Address Size
架构上SMMU输入地址size为64bit。如果client设备输出一个小于64bit,或在client设备和SMMU输入之间的中间size小于64bit,小于64bit的地址会被转化为64bit SMMU输入地址。这种转换不是本文档的范围。
ARMv8.0 和 ARMv8.1在AArch64上支持最大49bit,这意味着49bit地址要符号扩展为64bit地址。ARMv8.2支持最大53bit VA或49bit,这意味着53bit或49bit也要符号扩展为64bit地址。AArch64配置的stage1 转换内容有可配的达到最大的输入VA范围(通过TTB0和TTB1转换)。
术语VAS表示SMMU实现的VA size。当SMMU_IDR5.VAX=0表示49bit。当SMMU_IDR5.VAX=1表示53bit。
NOTE:在SMMUv3.0上SMMU_IDR5.VAX保留,因此VAS一般为49bit。
如果VAS地址的高位为SMMU的符号扩展,stage1高转换表TTB1被选择。如果应用要求同时使用TTB0和TTB1,系统设计必须发送至少端到端的地址,通过与SMMU连接的设备地址寄存器,从输入的MSB产生符号扩展。
AArch32配置的stage1转换内容有32bit。在这种情况下,输入地址的bits[31:0]直接用着VA。若输入地址的高32位非全0,产生转换fault。从输入高bit[31:n]中的TxSZ域用来选择TTB0或TTB1。
若VA[addrtop: N-1]不相同,对输入范围的N个重要位的stage1 AArch64转换表的输入范围检查失败。
(1)当TBI不使用时,AddrTop=63;
(2)当TBI使能时,AddrTop=55,意味着VA[63:56]忽略。
当使能TBI,只有VA[55:N-1]必须相同,VA[63:56]为了转换目的需要符号扩展VA[55]位。
NOTE: TBI配置是CD的一部分,因此当stage1转换被使能。当stage1 bypass和disable,CD不会使用且TBI也会disable。
术语UAS表示从client设备发送给SMMU的地址有效bit的数目。
(1)若57<=UAS<=64,TBI有意义,因为VA[63:56]可能不同于VA[55:VAS-1]。如果不相同,TBI决定是否产生转换fault;
(2)若VAS<=UAS<=57,TBI无意义,输入符号扩展意味着VA[63:56]不能与VA[55]不一样;
(3)若UAS<=VAS,若转换表范围被T0SZ或T1SZ配置(若UAS=49),小于需要的地址大小,范围检查会失败。stage1转换表的最大配置覆盖所有输入地址。
对于AArch64,stage1转换表TTB0和TTB1从最高位来选择。最高地址位当TBI=0时由VA[63]决定,当TBI=1由VA[55]位决定。因此,从client设备的地址size小于或等于VAS,需要0扩展到64位,着意味着VA[63]=VA[55]=0,TTB1不会被选择。
如果对外设编程的64bit地址的任何高位不适用于SMMU的符号检查逻辑,是否被截断,在SMMU软件不能依赖于编程错误来产生转换fault。若系统要求这种检查,软件必须检查DMA地址的有效性。
所有输入的地址位没有修改的记录到SMMU fault event中。
2. 地址对齐检查
SMMU架构不会检查传入的地址的对齐。
NOTE: 对于PE,对齐检查基于访问的size。这种语义不会直接应用于client设备访问。