上图就是SMMU Level 1 Stream Table Descriptor的数据格式,简称Level1 STD。
[4:0] Span(跨度)
描述Level2 STE数组的大小和L2Ptr的有效性。
如上图,当
Span为0,表明该STD是无效的,需要上报异常。
Span为1-11,表明该STD底下的Level STE包含2^(Span-1)个STEs
Span为12-31,Reserved,也需要上报异常。
Span必须在0到(SMMU_STRTAB_BASE_CFG.SPLIT + 1)的范围内,即它必须保持在Stream table split point的范围内。
传入事务StreamID所对应的STD Span如果设置为
Span == 0
Span == Reserved value
Span out of bounds value given the split point
select a valid Level 1 descriptor but are outside of the level 2 range
都会视为无效。
[51:6] L2Ptr
指向Level-2 STE的起始位置。L2Ptr[N:0]被SMMU视为0,其中
N == 5 + (Span - 1)
因此,SMMU将Level-2 STE的起始地址对齐到其大小。在SMMUv3.0中,L2Ptr[51:48]是RES0。超出OAS或物理地址的行为是会上报异常的。
所有导致 Stream table lookup未到达有效STE的事务都会终止,上报异常并可以记录事件C_BAD_STREAMID(根据SMMU_(S_)CR2.RECINVSID设置)
当L1STD更改时, non-leaf CMD_CFGI_STE是使L1STD条目失效所需的最小范围invalidate命令。根据更改情况,也可能需要其他STE失效,例如:
将Span == 0的inactive L1STD更改为non-zero active Span(引入新的部分Level-2 STE)仅需要使L1STD失效。
将Span != 0的active L1STD更改为inactive L1STD需要使L1STD以及受影响的缓存的STE失效。需要多个non-leaf CMD_CFGI_STE命令或更广泛的命令,如CMD_CFGI_STE_RANGE或CMD_CFGI_ALL。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !