Linux唤醒系统irq处理流程(1/2)

    

目录

正常模式下中断函数处理流程

唤醒系统的irq handle处理流程

怎样做中断的可运行性判断?

check_irq_resend怎样再次触发中断执行?


 

    

           本文主要从软件的角度介绍唤醒系统中断的中断处理函数的执行流程,本文会分为三部分。第一部分介绍正常模式下系统中断处理函数的执行流程,第二部分介绍系统休眠状态时,唤醒系统的irq handle处理流程,第三部分介绍怎样配置irq中断可唤醒功能及注意事项。

  • 正常模式下中断函数处理流程

        如下图,是MTK平台eint中断处理过程。系统处理处于中正常模式(非安全及其他异常模式)时,CPU会从el1_irq函数进入irq handle的处理流程,经过irq现场的保护后切入中断的处理、进入到GIC中断控制的gic_handle_irq 中断处理函数。

        gic_handle_irq 函数会获取GIC register中的触发中断的硬件中断号,将硬件中断号转化为软件中断号,然后根据软件中断号找到该中断对应的domain和handle_irq。

        对于mtk eint domian对应的domian handle_irq为mtk_eint_irq_handler,mtk_eint_irq_handl-er函数会获取eint register中触发中断的硬件中断号,根据eint的硬件中断号找到对应virq(软件中断号),再根据该virq进入handle_level_irq处理函数,进而调用handle_irq_event处理具体的设备注册的中断函数,在执行设备注册的中断函数前会根据注册中断时设置的中断属性,决定是创建thread来执行设备中断处理函数,还是直接调用handle。

        b8db6943687349ae83c57e9a03cf15d6.png

 

  • 唤醒系统的irq handle处理流程

        之前文章讲到Linux系统resume的流程,上面又讲了Linux系统常规中断的处理流程,有了上面的基础后在去看唤醒系统的irq handle处理过程,就会好理解很多。

        步入本节正题,如下图是irq wake up system flow,是将irq flow 与 resume flow结合。休眠状态的系统收到可唤醒系统中断时,会退出arm硬件级休眠状态,进行必要的sys级唤醒后在使能boot cpu的中断,当boot cup中断被使能(标记1)后会立即响应唤醒系统的中断进入中断的处理流程(标记2),中断处理函数执行到handle_level_irq时会做中断的可运行性判断,由于此时中断不可执行,所以会退出唤醒系统的中断执行流程进而继续执行系统唤醒流程(标记3);当唤醒系统流程执行到resume_irq(标记4)时,由于该函数会触发check_irq_resend来检测是否需要再次resend irq 。

d1ae278307d4481f806285b0ba0d1df8.png

        1.怎样做中断的可运行性判断?

7c2118306560454aa362054bd18ce97a.png

        如图是handle_level_irq函数处理流程,其中irq_may_run函数进行中断处理函数可执行性判定,与唤醒系统相关的中断可执行性判定主要由irq_pm_check_wakeup来实现。irq_pm_check_wakeup函数通过判断当前中断状态是否带有IRQS_WAKEUP_ARMED标记来判定唤醒系统中断的可执行性,如果带有该标记则中断处理函数不可执行会退出该中断的执行,否则继续执行中断处理函数。

        当中断状态中带有IRQS_WAKEUP_ARMED标记时要退出此次中断执行程序前,会对该中断做特殊标识:a.首先取消了该中断IRQS_WAKEUP_ARMED的标识,将该中断标记为IRQS_SUSPEND & IRQS_PENDING(标识系统休眠、中断被挂起),b.将中断depth变量+1,表示中断深度;然后调用irq_disable关闭该中断。

        中断状态带有IRQS_WAKEUP_ARMED标识说明该中断可唤醒系统。当系统休眠过程调用suspend_device_irq函数做设备中断关闭时,判断到该中断已被标记为可唤醒系统中断(IRQD_

WAKEUP_STATE)情况下会将该中断标识为IRQS_WAKEUP_ARMED,表示该中断具有唤醒系统功能、系统将进入待机状态,且不会关闭此中断。

 

        2.check_irq_resend怎样再次触发中断执行?

a9a8c2668db84e468c776409c99bc21c.png

        如图是resume_irq函数处理流程,该函数经过一系列判断后最终调用desc->handle_irq实现了再次触发唤醒系统中断的执行。重要判断有两处:a. depth == 1, 前文有讲到在suspend阶段可唤醒系统的中断的depth会被+1,所以在系统唤醒过程中可唤醒系统中断函数会有机会被执行;b.中断IRQD_PENDING状态判断,此状态也是在susped过程时标记给可唤醒系统中断的;经过这两种的判断后即认定为此中断需要重新触发,会调用desc->handle_irq执行对应中断处理函数。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值