首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GIC代码分析(2)

GIC代码分析(2)

2、GIC-V2的内部逻辑
        (1)GIC的block diagram
        GIC的block diagram如下图所示:
         
        GIC可以清晰的划分成两个block,一个block是Distributor(上图的左边的block),一个是CPU interface。CPU interface有两种,一种就是和普通processor接口,另外一种是和虚拟机接口的。Virtual CPU interface在本文中不会详细描述。

        (2)Distributor 概述
        Distributor的主要的作用是检测各个interrupt source的状态,控制各个interrupt source的行为,分发各个interrupt source产生的中断事件分发到指定的一个或者多个CPU interface上。虽然Distributor可以管理多个interrupt source,但是它总是把优先级最高的那个interrupt请求送往CPU interface。Distributor对中断的控制包括:
        (1)中断enable或者disable的控制。Distributor对中断的控制分成两个级别。一个是全局中断的控制(GIC_DIST_CTRL)。一旦disable了全局的中断,那么任何的interrupt source产生的interrupt event都不会被传递到CPU interface。另外一个级别是对针对各个interrupt source进行控制(GIC_DIST_ENABLE_CLEAR),disable某一个interrupt source会导致该interrupt event不会分发到CPU interface,但不影响其他interrupt source产生interrupt event的分发。
        (2)控制将当前优先级最高的中断事件分发到一个或者一组CPU interface。当一个中断事件分发到多个CPU interface的时候,GIC的内部逻辑应该保证只assert 一个CPU。
        (3)优先级控制。
        (4)interrupt属性设定。例如是level-sensitive还是edge-triggered
        (5)interrupt group的设定
        Distributor可以管理若干个interrupt source,这些interrupt source用ID来标识,我们称之interrupt ID。

        (3)CPU interface
        CPU interface这个block主要用于和process进行接口。该block的主要功能包括:
        (a)enable或者disable CPU interface向连接的CPU assert中断事件。对于ARM,CPU interface block和CPU之间的中断信号线是nIRQCPU和nFIQCPU。如果disable了中断,那么即便是Distributor分发了一个中断事件到CPU interface,但是也不会assert指定的nIRQ或者nFIQ通知processor。
        (b)ackowledging中断。processor会向CPU interface block应答中断(应答当前优先级最高的那个中断),中断一旦被应答,Distributor就会把该中断的状态从pending状态修改成active或者pending and active(这是和该interrupt source的信号有关,例如如果是电平中断并且保持了该asserted电平,那么就是pending and active)。processor ack了中断之后,CPU interface就会deassert nIRQCPU和nFIQCPU信号线。
        (c)中断处理完毕的通知。当interrupt handler处理完了一个中断的时候,会向写CPU interface的寄存器从而通知GIC CPU已经处理完该中断。做这个动作一方面是通知Distributor将中断状态修改为deactive,另外一方面,CPU interface会priority drop,从而允许其他的pending的interrupt向CPU提交。
        (d)设定priority mask。通过priority mask,可以mask掉一些优先级比较低的中断,这些中断不会通知到CPU。
        (e)设定preemption的策略
        (f)在多个中断事件同时到来的时候,选择一个优先级最高的通知processor

        (4)实例
        我们用一个实际的例子来描述GIC和CPU接口上的交互过程,具体过程如下:
       
        (注:图片太长,因此竖着放,看的时候有点费劲,就当活动一下脖子吧)
        首先给出前提条件:
        (a)N和M用来标识两个外设中断,N的优先级大于M
        (b)两个中断都是SPI类型,level trigger,active-high
        (c)两个中断被配置为去同一个CPU
        (d)都被配置成group 0,通过FIQ触发中断
继承事业,薪火相传
返回列表