Linux之arm SMMUv3命令和事件队列分析(13)

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值会变化。
 

  1. PROD.WR == CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,此时队列空。
  2. PROD.WR > CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,生产者写入任务。
  3. PROD.WR == CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,消费者读取任务,此时队列空。
  4. PROD.WR < CONS.RD and PROD.WR_WRAP != CONS.RD_WRAP,生产者写入任务,PROD指针跳到了队列头。
  5. PROD.WR == CONS.RD and PROD.WR_WRAP != CONS.RD_WRAP,生产者继续写入任务,此时队列满。
  6. PROD.WR > CONS.RD and PROD.WR_WRAP == CONS.RD_WRAP,消费者读取任务,CONS指针跳到了队列头。
  7. 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,具体的作用如下。
 

  1. Prefetch:将STE和CD等数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值