一笔输入的transaction会经过以下几个逻辑步骤:
1. 如果SMMU全局禁用(例如,刚结束复位SMMU_CR0.SMMUEN == 0),则transaction将通过SMMU而不进行任何地址转换。全局属性,例如 memory type或Shareability,可能从SMMU的SMMU_GBPA寄存器应用,或者SMMU_GBPA寄存器可以配置为abort所有transactions。
2. 如果SMMU没有全局禁用或者全局bypass,则首先确定VA->PA转换的配置:
• 索引到STE。
• 如果STE启用了stage2转换,则STE包含stage2 translation table base。
• 如果STE启用了stage1转换,则继续索引CD。如果STE启用了stage2转换,则从IPA空间获取CD,否则从PA空间获取CD。
3. 如果配置有效(STE+CD),则执行VA->PA转换。
• 如果配置了stage1转换,则CD包含一个translation table base,否则bypass stage1转换,并将输入地址直接提供给stage2。
• 如果配置了stage2转换,则STE包含一个translation table base用于stage2(输入可能是VA,也可能是stage1的输出IPA)。如果没有配置stage2,则输入就会直接作为输出地址(bypass)。
4. 具有有效配置且在VA->PA转换过程中未发生fault的transaction将输出地址以及memory attributes。
上面步骤展示了Non-secure stream transaction 处理的流程,如果支持 Secure stream,则流程也是类似的。过程中使用到的寄存器有所区别:
SMMU_S_CR0.SMMUEN
SMMU_S_GBPA
实现可能会根据需要cache这些步骤中的任何数据。此外,在处理过程中的几个stage可能会发生 fault。如果transaction未能找到有效配置,则会
terminated with an abort, and an event might be recorded。
如果transaction进展到transaction(已经找到了有效的配置),则fault可能出现在transaction的任一stage。如果发生了fault,其后的行为取决于使用的CD和STE的配置,确定是否terminated或者stalled。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !