1.简介
SMMUv3新增了命令和事件队列(Command and Event queues),可选的PRI队列,用于和软件进行交互。软件将要执行的命令提交到命令队列,比如预取配置、Invalidate STE命令等,SMMU从命令队列取出命令并执行。当命令不正确或配置出错等错误发生时,SMMU将会将这些事件写入到事件队列,软件从事件队列取出事件进行处理。PRI队列用于接收PCIe page requests。
2.循环队列
命令和事件队列基于循环队列(circular queues)。循环队列是基于内存的生产者和消费者循环FIFO。生产者向FIFO中写入任务,消费者从FIFO中读取1任务,生产者的位置由PROD指针确定,表示下一个可以写入的位置,消费者的位置由CONS指针确定,表示下一个可以读取的位置,PROD指针和CONS指针保存在寄存器中。对于命令队列,CPU为生产者,SMMU为消费者。对于事件队列,SMMU为生产者,CPU为消费者。循环队列生命周期如下图所示,当队列指针从队列尾跳到队列头时,wrap值会变化。
- PROD.WR == CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,此时队列空。
- PROD.WR > CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,生产者写入任务。
- PROD.WR == CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,消费者读取任务,此时队列空。
- PROD.WR < CONS.RD and PROD.WR_WRAP != CONS.RD_WRAP,生产者写入任务,PROD指针跳到了队列头。
- PROD.WR == CONS.RD and PROD.WR_WRAP != CONS.RD_WRAP,生产者继续写入任务,此时队列满。
- PROD.WR > CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,消费者读取任务,CONS指针跳到了队列头。
- PROD.WR == CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,消费者继续读取任务,此时队列空。

3.命令
CPU将命令(Command)写入命令队列,SMMU从命令队列中取出命令执行。命令队列中每个元素都为16字节,采用小端字节序,开始的8位表示命令操作码。SMMU总共定义了6种命令,分别为Prefetch、Configuration structure invalidation、TLB invalidation、ATS and PRI、DPT maintenance、Fault response and synchronization commands,具体的作用如下。
- Prefetch:将STE和CD等数据

1811

被折叠的 条评论
为什么被折叠?



