• 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目录;

     

  • 相关阅读:
    运行obotframework-ride控制台报错module ‘urllib‘ has no attribute ‘Request‘
    S7-200SMART通过循环移位实现MODBUS RTU轮询的具体方法示例
    CXP 协议中upconnection 与downconnection的说明及其区别
    项目前的知识回顾
    硬件科普系列之硬盘——总线、协议、接口和固态硬盘篇
    常见面试题整理(2022-11)
    如何批量图片重命名不同名字?
    递归算法学习——有效的数独,解数独
    【华为上机真题 2022】字符串比较
    门级建模—学习笔记
  • 原文地址:https://blog.csdn.net/flyingnosky/article/details/127562650