1. 为何PCIe需要ATS?
✨1.1 为何需要DMA地址转换?
为节省CPU资源,IO function常采用DMA方式访问内存。虽说在诸多实现方案中IO function看到的物理地址空间与CPU无异,但也不乏例外。在有些方案中,IO function看到的地址空间只是真实物理空间的handle,需要RC将DMA请求进行一次地址转换才能将访问到真实物理存储地址,此外还涉及到DMA访问地址空间的合法性检查。幸好,目前绝大部分系统结构都支持对来自IO function的DMA请求进行地址转换。
✨1.2 DMA地址转换的益处
确认IO function DMA 请求的合法性,防止非法DMA请求产生破环;
支持scatter-gater,通过地址转换,scatter-gather DMA一次传输访问多个物理上不连续的地址块;
通过改变传输地址,RC无需与IO function协调即可实现消息信号中断的重定向;
可以将32bit位宽的IO funtion映射到更大的系统地址空间;
易于实现虚拟化传输。
✨1.3 DMA地址转换的不良影响及解决方案
RC进行DMA地址转换是需要时间的,相较于不进行地址转换,显然进行DMA地址转换会增加DMA访问的时间。尤其是访问驻留内存转换表时,采用地址转换的方案会大大增加DMA访问的时间。当单次传输需要多次内存访问时,地址转换无疑会大大降低传输效率。
为了减小地址转换的以上不良影响,设计人员常常在需要进行地址转换的地方添加地址转换缓存(Address Translation Cache, ATC)。在CPU中,这种地址转换缓存通常是指转译后备缓冲区(Translation Look-aside Bufer, TLB);在IO地址转换中,我们常用ATC来跟CPU的TLB加以区分。TLB与ATC的区别:TLB一次只服务于CPU的单个线程,而ATC服务于PCIe设备的多个IO function,每个IO function都相当于一个独立的线程。
✨1.4 设备采用ATC的益处
设备端的ATC能够减轻地址转换代理(Translation Agent, TA)的地址转换压力;
开启了ATC使设备对系统ATC size的依赖更小;
发往中心复合体的地址都是预先转换过的,潜在减小了访问时延,增加传输效率。
❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️
🔥 2. ATS协议介绍
PCIe设备及根复合体RC之间采用请求-完成协议来实现地址转换服务ATS。ATS主要包括两部分:
地址转换(Translation):用以将ATPT中的转换地址缓存到本地ATC,包括地址转换请求及地址转换完成。
地址作废(Invalidation):用以当ATPT中地址转换发生变化时,将ATC中的对应转换地址作废,包括地址转换作废请求及地址转换作废完成。
✨2.1 ATS地址转换协议(ATS Translation)
PCIe Device/Function发送存储器读写请求前,首先在本地ATC查找是否有该地址的Entry。该地址为转换前地址,是DMA看到的虚地址;该地址在ATC中的Entry是指该虚地址经过地址转化后的真实物理地址。若在ATC内查找成功,直接采用转换后地址进行访问,否则给TA发送该虚地址的地址转换请求。
上图展示了一个基本的ATS转换请求-完成的操作。其动态工作流程如下:
Device/Function产生ATS转换请求,经PCIe拓扑路由到达RC,RC将该请求推给TA;
TA在收到地址转换请求后,查找其本地ATPT,并给Device/Function反馈查找结果(成功或失败)。
2.1.1 ATS地址转换请求
为了实现ATS,存储器读写TLP头标中新定义了地址类型(Address Type, AT)域来表征Device发给RC的地址是否经过了地址转换、是否为地址转换请求。AT域是存储器读请求、AtomicOp及ATS地址转换请求的专属域,在其他事务中该域为Reserved预留。
AT域值解释如下:00b->未转换的地址;01b->地址转换请求;10b->已转换的地址;11b->预留。TA检测到AT=11b时会当成UR处理。
1)ATS地址转换请求帧格式
带有ATC的Device可以选择发送经过/未经地址转换的存储器访问请求。 存储器访问请求的TLP头标(64bit)格式如下图所示。ATS地址转换请求的TLP头标格式与存储器读请求TLP头标格式相似,ATS地址转换请求头标格式如下图所示。
比较可见,地址转换请求与ATS地址转换请求TLP头标的主要区别在于以下3点:
① 地址转换请求的AT=01b,存储器读请求的AT=00b或10b;
② 地址转换请求的地址位[11:0]预留,存储器读请求的地址为[1:0]预留;
③ 地址转换请求有NW域,存储器读请求没有NW域。
地址转换请求头标中其他各域补充解释如下:
- Attr: 转换请求及转换完成没有排序要求,设置该域开启宽松排序,开启宽松排序后TA可根据实际情况决定是否对其收到的事务进行重排,此时发起请求的Device不能依赖TA保序。
- Length: 该域用以表明当前转换请求需要返回多少笔转换完成包,每一笔转换完成包长8Byte,多笔转换完成包的地址间STU(最小转换单位)对齐地址递增。需要注意的是,length值需为偶数,最大值为RCB(读完成边界)。若length超出最大值或为奇数,TA会将该TLP当成畸形包进行处理。
- Untranslated Address: 需要进行转换的地址,支持32bit及64bit,该地址域不含地址比特[11:0],TA依据该地址判断转换请求的有效性。对于请求多笔地址转换的情况,若ATPT中的转换后地址不满足转换请求的范围(2^(STU+12)*length/2),TA不会反馈该笔转换包。如果请求者未设置了页对齐,转换请求地址位比特[11:2]可以是任意值,否则必须为0,TA中也必须忽略[11:2]。
- NW: 非写标志位,若该位置一,表明该转换后的地址只读,Device不能往该地址发送写请求。若需要写该地址,需要Device重新发送地址转换请求将该位清除。
2)PCIe系统对ATS地址转换请求的处理
为了减小设计复杂度、简化PCIe系统ATS的集成工作,ATS地址转换请求/完成的处理过程与PCIe读请求/读完成极其相似,在某些方面甚至完全相同,具体表现为:
- ATS组件兼容PCIe-1.1组件;
- ATS通过新的能力及关联结构进行开启,软件在发送ATS TLP之前需确认该设备具有ATS能力且已开启,否则不能发送ATS TLP,DMA 读写请求中的AT域也应置为0,即未转换的地址。
- ATS TLP路由方式为地址或RID路由;
- ATS TLP事务排序方式最寻PCIe的事务排序方式;
- ATS TLP流经PCIe-1.1交换节点时需保持不变;
- Device/Function可以混合发送转换即未转换请求。
TA收到地址转换请求后会进行如下判断及操作:
- 判断Device/Function是否开启了ATS能力;
- 判断Device/Function发送的ATS地址转换请求地址是否合法、该Device/Function是否有权限访问该地址;
- 判断TA自身是否能够响应该ATS请求;
- 发送转换成功或失败信号给RC,RC产生请求完成TLP回复给发起转换请求的Device/Function。
3)ATS地址转换请求注意事项
⚠️⚠️📢📢
- Device/Function可以一次连续发送多个地址转换请求,TC可以相同也可以不同。一笔ATS转换请求对应一笔或多笔转换完成,RC一次可以连续返回多笔请求完成TLP,某地址的转换完成TLP的TC需与其转换请求的TC保持一致。
- 若某虚地址在ATC中没有对应Entry,Device/Function在发送其ATS转换请求并收到转换完成(成功)之前,不能发送标记为translated的该地址存储器访问请求。
- ATC只能通过ATS协议进行填充,即发送ATS地址转换请求并收到该地址的转换完成(成功)。
- ATC只能通过ATS协议进行修改,主机系统软件只能通过ATS转换作废操作对ATC内容进行修改,其他任何操作都不能修改ATC内容。即使是系统复位、Device/Function的复位操作,也只能更改invalidate entry不能更改ATC内容;
ATS有转换请求超时退出机制,若发出地址转换请求后迟迟等不到转换完成,会超时退出。ATS转换请求的请求超时设置与存储器读请求相同。