SMMU架构手册之中断和通知

        event被记录到event队列,PRI请求和全局error有相关中断来允许异步通知给PE。

        实现可能支持MSI中断,该中断以32位数据写一个配置值到配置寄存器中,在GICv3系统中,为GITS_TRANSLATER或GICD_SETSPI_NSR寄存器。当SMMU_S_IDR1.SECURE_IMPL=1时,ARM希望安全event产生的notification在系统中使用GICD_SETSPI_SR寄存器来设置安全SPI。

        实现必须支持一个,或选择性两个都支持,线中断和MSI。是否一个实现支持MSI由SMMU_IDR0.MSI和SMMU_S_IDR0.MSI决定。一个实现可能支持边沿触发的线中断。支持线中断的发现时实现定义的。

        支持两个安全状态的实现,即SMMU_S_IDR1.SECURE_IMP=1,可能为一个安全状态实现MSI。ARM建议在不支持非安全MSI时,也不支持安全MSI。

        在新信息被看到之前,不允许新信息的中断通知被看见。这使用于MSI和线中断,当:

(1)全局error条件发起。对全局error寄存器GERROR可见如果中断可见;

(2)新entry被写入到输出队列。如果中断可见,新的entry必须可见来读取队列index寄存器;

(3)CMD_SYNC完成。如果中断可见,CMD_SYNC的徐奥好必须可见来读取队列index寄存器;

        每个MSI可独立的配置内存类型和shareability。这使得将设备MSI目标寄存器放到正常内存中变成可能。SMMU_IDR0.COHACC域表明SMMU和系统是否支持一致性访问,包括MSI写。

NOTE: PE也可以轮询地址,比如在ARMv8-A PE。在这个例子中,PE和由共享CACHE访问的SMMU可以在没有线信号时完成相同的行为WFE唤醒event通知,使用MSI在共享内存位置。

NOTE: 若MSI写的目的时另一个设备的寄存器,ARM建议它被配置为Device-nGnRnE或Device-nGnRE属性。

        SMMU由于错误的配置而不输出非连续的属性。当Device或Normal Inner Non-cacheable Outer Non-cacheable被配置时Outer Shareablity被使用。

        由安全源产生的MSI由安全访问发起,NS=0。由非安全源产生的MSI由非安全访问发起,NS=1。除了中断的内存类型,可共享性和NS属性,MSI写其他属性都是定义实现的。

        GICv3 ITS使用DeviceID来区分中断源。为支持它,SMMU做如下:

(1)传递传入的client设备事务的streamID。以系统相关的方式产生DeviceID;

(2)产生一个独一无二的DeviceID,这不会与以及产生的重叠。与其他的MSI产生方式,这将静态的以系统定义的方式设置。

        SMMU MSI被几个单独的寄存器状态被配置。MSI目的地址,数据负载,shareability,内存类型,组成MSI写。

        边沿中断可以在系统中断控制器中聚合。SMMU可以聚合event和相同的中断,之发送最新的中断,但聚合不能明显延迟通知。这也应用于MSI和边沿的线中断。

        当MSI不支持时,中断配置域中配置MSI地址和数据的不再用。仅中断使能域被使用。

1. MSI同步

        SMMU保证之前的MSI写在下列同步点完成:

(1)对于寄存器位基础的MSI配置,通过SMMU_S_IRQ_CTRL禁用MSI;

(2)CMD_SYNC保证MSI的完成,这些MSI来源于之前来自于相同command队列的CMD_SYNC的完成;

        MSI的完成保证了MSI的写对shareability domain可见,或者如果abort返回,保证在GERROR中SMMU_S_GERROR.MSI_*ABT_ERR标志可见。

NOTE: 以abort中止的MSI的完成设置GERROR标志但不能保证后续的由标志的设置所引起的GERROR中断的完成。

        这两个同步点对相关中断源定义了一个时间点t。若MSI在这个点之前发生,它们在这个点之前不可见。

        对于寄存器为基础的MSI配置,在MSI使能后被触发的MSI将使用新的配置。

2. 中断源

        SMMU有下列中断源。依赖实现,每个输入中断源发出一个对中断源唯一的线中断或MSI中断,或者两者都实现。

source触发原因NOTE
Event queueEvent列队转换从空到非空
安全Event queue
PRI队列PRI队列中断条件
命令队列CMD_SYNC同步完成,保证中断的选项存在命令中的MSI配置(目的,数据)
安全命令队列CMD_SYNC
GERROR在SMMU_GERROR寄存器中全局ERROR的激活
S_GERROR在SMMU_S_GERROR寄存器中安全全局ERROR的激活

        如果存在,可以通过SMMU_IRQ_CTRL和SMMU_S_IRQ_CTRL来单独使能每个中断源。如果实现可使能,可以发送一个pulse给唯一的线中断输出。如果使能,MSI支持时发送MSI,若中断源的MSI配置通过ADDR值使能MSI的发送。

        这允许实现支持同时使用MSI和线中断。比如,安全编程接口使用线中断(中断源可以使能,但MSI ADDR=0禁用MSI)和非安全编程接口使用MSI(中断源使能且包含MSI地址和数据配置)。

        造成一个中断触发的条件为短暂的event和有效边沿触发的中断输出。没有设备来复位中断源的pending状态。

        当实现支持RAS特性时,其他的中断需要存在。这些中断的操作,配置和发起不会对上述所列的中断没有效果。后面章节再介绍RAS特性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值