• GIC/ITS代码分析(4)中断的分配/映射及注册


            本章节分析常用的中断分配/映射及注册函数,对这个过程有个基本的理解。后续针对不同的中断使用实例作更详细介绍。

    1 中断的分配/映射

            它主要根据硬件中断号hwirq,分配virq,建立起映射,然后请求中断,设置中断处理函数及irq_chip(与中断硬件相关的操作)。这些操作在不同类型或平台上使用的操作函数大致类似。以acpi_register_gsi()为例,它可以完成上述操作。

    1. 根据设备和中断号找到irq_domain;
    2. 调用d->ops->translate(),作gsi与hwirq之间的转换(hwirq=gsi);
    3. 判断中断是否hierarchy类型,若是调用irq_domain_alloc_irqs()分配irq_desc及virq,并调用d->ops->alloc()设置中断处理函数及irq_chip(像ITS还会调用自身的irq_chip对应的回调),将中断插入到revmap->tree中;
    4. 若不是hierarchy类型,如同上述一样调用irq_domain_alloc_irqs(),然后调用d->ops->map();

    对于GICv3,d->ops->alloc = gic_irq_domain_alloc(),详细过程如下:

    1. 根据中断类型,获取硬件中断号;
    2. 根据EOI模式,若支持EOI模式,irq_chip设置为gic_eoimode_chip,若不支持,irq_chip设置为gic_chip;
    3. 对于SGI/PPI/EPPI中断,中断处理函数handler设置为handle_percpu_devid_irq;
    4. 对于SPI/ESPI/LPI,中断处理函数handler设置为handle_fasteoi_iq;

    后续在中断处理章节对这些中断处理函数作更详细介绍。

    2 中断的注册

            对于IPI/SGI中断是通过函数request_percpu_irq()进行注册,对于SPI/LPI中断是通过函数request_irq()request_threaded_irq()进行注册。PERCPU中断只会产生在特定的CPU上。虽然不同调用,但过程大体类似。

     (1)IPI/SGI设置handler回调,而LPI/SPI中断如果支持中断线程化,同时也会设置线程回调thread_fn;

    (2)调用__setup_irq()设置中断,将异常情况及共享中断情况忽略,过程如下:

    - 若支持中断线程化,创建中断线程,设置亲和性;

    - 调用irq_activate()激活中断(domain->ops->activate()),注意对于LPI中断,在ITS的irq_chip对应的回调激活中断,对于SPI/PPI/SGI为空;

    - 唤醒中断线程并等待线程ready;

    - 创建中断及中断handler的PROC目录;

     

  • 相关阅读:
    防蓝光护眼灯哪个牌子比较好?目前比较好用的护眼灯推荐
    Linux 权限
    汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)
    讲解一下docker和docker常用命令
    (更新中)数据结构开发实战教程
    想学设计模式、想搞架构设计,先学学 UML 系统建模吧
    【6-Git安装与配置过程、Gitee码云上创建项目、IDEA关联克隆的项目】
    [MRCTF2020]套娃
    抖音小店怎么做自然流量?
    QT将数据写入文件,日志记录
  • 原文地址:https://blog.csdn.net/flyingnosky/article/details/127562650