GIC/ITS代码分析(7)中断应用实例之LPI中断

         本节以hisi_sas驱动(drivers/scsi/hisi_sas/hisi_sas_v3_hw.c)的PCIE MSI中断为例,讲叙LPI中断的中断应用实例。

        在开始之前再次对LPI中断的产生作介绍。当外设写GITS_TRANSLATER时,ITS将根据device id和event id将中断路由到特定的GICR上,最后发送到对应的GICC上。

1 中断的分配

        hisi_sas驱动采用函数pci_alloc_irq_vectors()分配中断,这里分成两种情况:MSI中断和MSIX中断。这里我们只关注MSI中断。

对于MSI情况,具体执行情况如下:

步骤如下:

  1. 通过函数pci_msi_vec_count()从PCI_MSI_FLAGS读取MSI中断数目;
  2. 对于设置亲和性的情况,通过irq_calc_affinity_vectors()计算中断的亲和性;
  3. 通过函数pci_msi_enable(dev, 0)禁用MSI中断;
  4. 通过函数irq_create_affinity_mask()创建亲和性mask;
  5. 分配msi_desc,并根据eventid插入;
  6. 调用ops->msi_prepare()接口,对于ITS来说,分配its_device,建立device table表项(即执行MAPD命令);
  7. 调用函数__irq_domain_alloc_irqs()分配分配nr_vector个虚中断virq,这是中断分配的通用流程(实际上分配并映射虚拟中断,调用ops->alloc()设置irq_chip和中断处理函数);
  8. 对每个中断,调用ops->activate()接口对中断进行激活,对于ITS来说,激活中断,在ITT中建立deviceid/eventid与ite的映射(即执行MAPTI命令)。

2 中断请求及处理

        hisi_sas驱动调用函数requeste_threaded_irq()申请中断并设置回调函数。该过程在GIC/ITS代码分析(4)中断的分配/映射及注册 已作详细介绍。

        LPI中断的处理由中断异常发起,最终由函数handle_fasteoi_irq()进行处理,执行驱动注册的回调函数。详细过程见GIC/ITS代码分析(6)中断处理 。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值