SMMU架构手册之command和event队列(1)

        SMMU所有的输入和输出队列都是内存中的环形buffer。编程接口包括一个输入的command队列和一个输出的event队列(可选一个PRI队列)。每个队列用于producer-consumer方式,一个输出队列包含SMMU产生和软件消耗的数据。输入队列包含软件产生的数据,SMMU来消耗。

1. SMMU环形队列

        一个队列为2^n大小的FIFO环形,带一个基指针和两个index寄存器PROD和CONS,表明队列中的生产者和消耗者的当前位置。对输入和输出情况,仅SMMU维护一个index,软件维护另一个index。

        对于输入队列(command队列),在向一个队列中插入一项时软件来更新PROD index,SMMU读取来决定新的项。每一个项被消耗SMMU更新CONS index,软件读取来决定每一项被消耗,空间被消耗。输出队列正好相反。

        PROD表明由生产者下一个被写的位置的Index,若队列非满。CONS表明若队列非满,下一个被读的位置的index。index必须一致增加,当它超过队列的顶部时卷积到底部。

        队列使用镜像环形buffer安排,它允许所有项同时有效(而不是在其他环形buffer中的N-1个有效项)。每个index由一个wrap标志,下一个更高位临近index值包含PROD和CONS。该位每次反转。由每个index的owner,生产者或消费者,当owner更新index来反转该位。软件读取寄存器,增加或反转index,写回wrap和index域。单个更新阻止index和wrap的非一致性。

(1)若两个index相等且wrap位相同时,队列为空,没有可消耗的内容;

(2)若两个index相等且wrap位不相等时,队列为满,不能在产生内容;

(3)若两个Index不相等或wrap位不相等时,消耗者消耗内容,增加CONS index直到队列为空(index和wrap位都相等)

        因此,当两个index表明同一个位置时,wrap位区分空buffer和满buffer情况。

        在初始化时,在使能队列前,控制SMMU的agent写队列index。队列index必须被初始化位下列连续的状态:

(1)PROD.WR=CONS.RD且PROD.WR_WRAP=CONS.RD_WRAP,表示一个空队列;

NOTE: ARM期望在正常初始化时为此状态。

(2)PROD.WR=CONS.RD且PROD.WR_WRAP!=CONS.RD_WRAP,表示一个满队列;

(3)PROD.WR>CONS.RD且PROD.WR_WRAP=CONS.RD_WRAP,表示部分满队列;

(4)PROD.WR<CONS.RD且PROD.WR_WRAP!=CONS.RD_WRAP,表示部分满队列;

        无论在初始化还是队列使能后控制SMMU的agent不能写队列index到下述不连续的状态:

(1)PROD.WR>CONS.RD且PROD.WR_WRAP!=CONS.RD_WRAP;

(2)PROD.WR<CONS.RD且PROD.WR==CONS.RD_WRAP;

        若队列index被写到非连续的状态,下列不可预测的行为被允许:

(1)SMMU对特定的队列消耗或生产,在队列中队列项在未知的位置;

(2)SMMU对特定的队列不消耗或生产,队列项处于非连续的状态;

        每个环形buffer大小为2^n, 0<=n<=19。实现支持少于19bit的索引。每个PROD和CONS寄存器为20bit,其中19bit用于索引加上wrap bit。实际使用的buffer大小由软件决定,由SMMU实现定义的。wrap位的位置取决于配置index大小。

NOTE: 比如,当一个队列被配置为128项,这意味着:

(1)队列index为7bit;

(2)PROD.WR和CONS.RD域为7bit。队列索引为PROD和CONS的[6:0]位。

(3)PROD和CONS寄存器的位[7]为wrap位,其中位[19:8]被忽略。

        下图呈现了环形buffer的生命周期:

        当生产或消耗entry时,软件必须只增加index(除了当增加会导致wrap)。index不能向后移动。SMMU也需要保证,仅增加index或wrap它的index值。

        每个实现的安全状态有一个命令队列。SMMU命令从队列中被顺序消耗。

        Event队列可以并发的接受evnts,比如从设备流量或配置错误造成的错误记录。在非安全侧,有一个全局event队列接受所有来自非安全stream和配置的事件。

        当SMMU_S_IDR1.SECURE_IMPL=1时,也存在一个安全event队列接受所有来自安全stream和配置的事件。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值