1*c767ef45SYanteng Si.. include:: ../disclaimer-zh_CN.rst 2*c767ef45SYanteng Si 3*c767ef45SYanteng Si:Original: Documentation/core-api/genericirq.rst 4*c767ef45SYanteng Si 5*c767ef45SYanteng Si:翻译: 6*c767ef45SYanteng Si 7*c767ef45SYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn> 8*c767ef45SYanteng Si 9*c767ef45SYanteng Si:校译: 10*c767ef45SYanteng Si 11*c767ef45SYanteng Si 吴想成 Wu XiangCheng <bobwxc@email.cn> 12*c767ef45SYanteng Si 13*c767ef45SYanteng Si.. include:: <isonum.txt> 14*c767ef45SYanteng Si 15*c767ef45SYanteng Si.. _cn_core-api_genericirq: 16*c767ef45SYanteng Si 17*c767ef45SYanteng Si================ 18*c767ef45SYanteng SiLinux通用IRQ处理 19*c767ef45SYanteng Si================ 20*c767ef45SYanteng Si 21*c767ef45SYanteng Si:版权: |copy| 2005-2010: Thomas Gleixner 22*c767ef45SYanteng Si:版权: |copy| 2005-2006: Ingo Molnar 23*c767ef45SYanteng Si 24*c767ef45SYanteng Si简介 25*c767ef45SYanteng Si==== 26*c767ef45SYanteng Si 27*c767ef45SYanteng Si通用中断处理层是为了给设备驱动程序提供一个完整的中断处理抽象(层)。它能够处 28*c767ef45SYanteng Si理所有不同类型的中断控制器硬件。设备驱动程序使用通用API函数来请求、启用、禁 29*c767ef45SYanteng Si用和释放中断。驱动程序不需要知道任何关于硬件处理中断的细节,所以它们可以在不同的 30*c767ef45SYanteng Si平台上使用而不需要修改代码。 31*c767ef45SYanteng Si 32*c767ef45SYanteng Si本文档提供给那些希望在通用IRQ处理层的帮助下实现基于其架构的中断子系统的开发 33*c767ef45SYanteng Si者。 34*c767ef45SYanteng Si 35*c767ef45SYanteng Si理论依据 36*c767ef45SYanteng Si======== 37*c767ef45SYanteng Si 38*c767ef45SYanteng SiLinux中中断处理的原始实现使用__do_IRQ()超级处理程序,它能够处理每种类型的 39*c767ef45SYanteng Si中断逻辑。 40*c767ef45SYanteng Si 41*c767ef45SYanteng Si最初,Russell King确定了不同类型的处理程序,以便为Linux 2.5/2.6中的ARM中 42*c767ef45SYanteng Si断处理程序实现建立一个相当通用的集合。他区分了以下几种类型: 43*c767ef45SYanteng Si 44*c767ef45SYanteng Si- 电平触发型 45*c767ef45SYanteng Si 46*c767ef45SYanteng Si- 边沿触发型 47*c767ef45SYanteng Si 48*c767ef45SYanteng Si- 简单型 49*c767ef45SYanteng Si 50*c767ef45SYanteng Si在实现过程中,我们发现了另一种类型: 51*c767ef45SYanteng Si 52*c767ef45SYanteng Si- 响应EOI(end of interrupt)型 53*c767ef45SYanteng Si 54*c767ef45SYanteng Si在SMP的__do_IRQ()超级处理程序中,还需定义一种类型: 55*c767ef45SYanteng Si 56*c767ef45SYanteng Si- 每cpu型(针对CPU SMP) 57*c767ef45SYanteng Si 58*c767ef45SYanteng Si这种高层IRQ处理程序的拆分实现使我们能够为每个特定的中断类型优化中断处理的流 59*c767ef45SYanteng Si程。这减少了该特定代码路径的复杂性,并允许对特定类型进行优化处理。 60*c767ef45SYanteng Si 61*c767ef45SYanteng Si最初的通用IRQ实现使用hw_interrupt_type结构体及其 ``->ack`` ``->end`` 等回 62*c767ef45SYanteng Si调来区分超级处理程序中的流控制。这导致了流逻辑和低级硬件逻辑的混合,也导致了 63*c767ef45SYanteng Si不必要的代码重复:例如i386中的 ``ioapic_level_irq`` 和 ``ioapic_edge_irq`` , 64*c767ef45SYanteng Si这两个IRQ类型共享许多低级的细节,但有不同的流处理。 65*c767ef45SYanteng Si 66*c767ef45SYanteng Si一个更自然的抽象是“irq流”和“芯片细节”的干净分离。 67*c767ef45SYanteng Si 68*c767ef45SYanteng Si分析一些架构的IRQ子系统的实现可以发现,他们中的大多数可以使用一套通用的“irq 69*c767ef45SYanteng Si流”方法,只需要添加芯片级的特定代码。这种分离对于那些需要IRQ流本身而不需要芯 70*c767ef45SYanteng Si片细节的特定(子)架构也很有价值——以提供了一个更透明的IRQ子系统设计。 71*c767ef45SYanteng Si 72*c767ef45SYanteng Si每个中断描述符都被分配给它自己的高层流程处理程序,这通常是一个通用的实现。(这 73*c767ef45SYanteng Si种高层次的流程处理程序的实现也使得提供解复用处理程序变得简单,这可以在各种架 74*c767ef45SYanteng Si构的嵌入式平台上找到。) 75*c767ef45SYanteng Si 76*c767ef45SYanteng Si这种分离使得通用中断处理层更加灵活和可扩展。例如,一个(子)架构可以使用通用 77*c767ef45SYanteng Si的IRQ流实现“电平触发型”中断,并添加一个(子)架构特定的“边沿型”实现。 78*c767ef45SYanteng Si 79*c767ef45SYanteng Si为了使向新模型的过渡更容易,并防止破坏现有实现,__do_IRQ()超级处理程序仍然 80*c767ef45SYanteng Si可用。这导致了一种暂时的双重性。随着时间的推移,新的模型应该在越来越多的架构中 81*c767ef45SYanteng Si被使用,因为它能使IRQ子系统更小更干净。它已经被废弃三年了,即将被删除。 82*c767ef45SYanteng Si 83*c767ef45SYanteng Si已知的缺陷和假设 84*c767ef45SYanteng Si================ 85*c767ef45SYanteng Si 86*c767ef45SYanteng Si没有(但愿如此)。 87*c767ef45SYanteng Si 88*c767ef45SYanteng Si抽象层 89*c767ef45SYanteng Si====== 90*c767ef45SYanteng Si 91*c767ef45SYanteng Si中断代码中主要有三个抽象层次: 92*c767ef45SYanteng Si 93*c767ef45SYanteng Si1. 高级别的驱动API 94*c767ef45SYanteng Si 95*c767ef45SYanteng Si2. 高级别的IRQ流处理器 96*c767ef45SYanteng Si 97*c767ef45SYanteng Si3. 芯片级的硬件封装 98*c767ef45SYanteng Si 99*c767ef45SYanteng Si中断控制流 100*c767ef45SYanteng Si---------- 101*c767ef45SYanteng Si 102*c767ef45SYanteng Si每个中断都由一个中断描述符结构体irq_desc来描述。中断是由一个“无符号整型”的数值来 103*c767ef45SYanteng Si引用的,它在描述符结构体数组中选择相应的中断描述符结构体。描述符结构体包含状态 104*c767ef45SYanteng Si信息和指向中断流方法和中断芯片结构的指针,这些都是分配给这个中断的。 105*c767ef45SYanteng Si 106*c767ef45SYanteng Si每当中断触发时,低级架构代码通过调用desc->handle_irq()调用到通用中断代码中。 107*c767ef45SYanteng Si这个高层IRQ处理函数只使用由分配的芯片描述符结构体引用的desc->irq_data.chip 108*c767ef45SYanteng Si基元。 109*c767ef45SYanteng Si 110*c767ef45SYanteng Si高级驱动程序API 111*c767ef45SYanteng Si--------------- 112*c767ef45SYanteng Si 113*c767ef45SYanteng Si高层驱动API由以下函数组成: 114*c767ef45SYanteng Si 115*c767ef45SYanteng Si- request_irq() 116*c767ef45SYanteng Si 117*c767ef45SYanteng Si- request_threaded_irq() 118*c767ef45SYanteng Si 119*c767ef45SYanteng Si- free_irq() 120*c767ef45SYanteng Si 121*c767ef45SYanteng Si- disable_irq() 122*c767ef45SYanteng Si 123*c767ef45SYanteng Si- enable_irq() 124*c767ef45SYanteng Si 125*c767ef45SYanteng Si- disable_irq_nosync() (SMP only) 126*c767ef45SYanteng Si 127*c767ef45SYanteng Si- synchronize_irq() (SMP only) 128*c767ef45SYanteng Si 129*c767ef45SYanteng Si- irq_set_irq_type() 130*c767ef45SYanteng Si 131*c767ef45SYanteng Si- irq_set_irq_wake() 132*c767ef45SYanteng Si 133*c767ef45SYanteng Si- irq_set_handler_data() 134*c767ef45SYanteng Si 135*c767ef45SYanteng Si- irq_set_chip() 136*c767ef45SYanteng Si 137*c767ef45SYanteng Si- irq_set_chip_data() 138*c767ef45SYanteng Si 139*c767ef45SYanteng Si详见自动生成的函数文档。 140*c767ef45SYanteng Si 141*c767ef45SYanteng Si.. note:: 142*c767ef45SYanteng Si 143*c767ef45SYanteng Si 由于文档构建流程所限,中文文档中并没有引入自动生成的函数文档,所以请读者直接 144*c767ef45SYanteng Si 阅读源码注释。 145*c767ef45SYanteng Si 146*c767ef45SYanteng Si电平触发型IRQ流处理程序 147*c767ef45SYanteng Si----------------------- 148*c767ef45SYanteng Si 149*c767ef45SYanteng Si通用层提供了一套预定义的irq-flow方法: 150*c767ef45SYanteng Si 151*c767ef45SYanteng Si- handle_level_irq() 152*c767ef45SYanteng Si 153*c767ef45SYanteng Si- handle_edge_irq() 154*c767ef45SYanteng Si 155*c767ef45SYanteng Si- handle_fasteoi_irq() 156*c767ef45SYanteng Si 157*c767ef45SYanteng Si- handle_simple_irq() 158*c767ef45SYanteng Si 159*c767ef45SYanteng Si- handle_percpu_irq() 160*c767ef45SYanteng Si 161*c767ef45SYanteng Si- handle_edge_eoi_irq() 162*c767ef45SYanteng Si 163*c767ef45SYanteng Si- handle_bad_irq() 164*c767ef45SYanteng Si 165*c767ef45SYanteng Si中断流处理程序(无论是预定义的还是架构特定的)由架构在启动期间或设备初始化期间分配给 166*c767ef45SYanteng Si特定中断。 167*c767ef45SYanteng Si 168*c767ef45SYanteng Si默认流实现 169*c767ef45SYanteng Si~~~~~~~~~~ 170*c767ef45SYanteng Si 171*c767ef45SYanteng Si辅助函数 172*c767ef45SYanteng Si^^^^^^^^ 173*c767ef45SYanteng Si 174*c767ef45SYanteng Si辅助函数调用芯片基元,并被默认流实现所使用。以下是实现的辅助函数(简化摘录):: 175*c767ef45SYanteng Si 176*c767ef45SYanteng Si default_enable(struct irq_data *data) 177*c767ef45SYanteng Si { 178*c767ef45SYanteng Si desc->irq_data.chip->irq_unmask(data); 179*c767ef45SYanteng Si } 180*c767ef45SYanteng Si 181*c767ef45SYanteng Si default_disable(struct irq_data *data) 182*c767ef45SYanteng Si { 183*c767ef45SYanteng Si if (!delay_disable(data)) 184*c767ef45SYanteng Si desc->irq_data.chip->irq_mask(data); 185*c767ef45SYanteng Si } 186*c767ef45SYanteng Si 187*c767ef45SYanteng Si default_ack(struct irq_data *data) 188*c767ef45SYanteng Si { 189*c767ef45SYanteng Si chip->irq_ack(data); 190*c767ef45SYanteng Si } 191*c767ef45SYanteng Si 192*c767ef45SYanteng Si default_mask_ack(struct irq_data *data) 193*c767ef45SYanteng Si { 194*c767ef45SYanteng Si if (chip->irq_mask_ack) { 195*c767ef45SYanteng Si chip->irq_mask_ack(data); 196*c767ef45SYanteng Si } else { 197*c767ef45SYanteng Si chip->irq_mask(data); 198*c767ef45SYanteng Si chip->irq_ack(data); 199*c767ef45SYanteng Si } 200*c767ef45SYanteng Si } 201*c767ef45SYanteng Si 202*c767ef45SYanteng Si noop(struct irq_data *data)) 203*c767ef45SYanteng Si { 204*c767ef45SYanteng Si } 205*c767ef45SYanteng Si 206*c767ef45SYanteng Si 207*c767ef45SYanteng Si 208*c767ef45SYanteng Si默认流处理程序的实现 209*c767ef45SYanteng Si~~~~~~~~~~~~~~~~~~~~ 210*c767ef45SYanteng Si 211*c767ef45SYanteng Si电平触发型IRQ流处理器 212*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^^ 213*c767ef45SYanteng Si 214*c767ef45SYanteng Sihandle_level_irq为电平触发型的中断提供了一个通用实现。 215*c767ef45SYanteng Si 216*c767ef45SYanteng Si实现的控制流如下(简化摘录):: 217*c767ef45SYanteng Si 218*c767ef45SYanteng Si desc->irq_data.chip->irq_mask_ack(); 219*c767ef45SYanteng Si handle_irq_event(desc->action); 220*c767ef45SYanteng Si desc->irq_data.chip->irq_unmask(); 221*c767ef45SYanteng Si 222*c767ef45SYanteng Si 223*c767ef45SYanteng Si默认的需回应IRQ流处理器 224*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^^^^ 225*c767ef45SYanteng Si 226*c767ef45SYanteng Sihandle_fasteoi_irq为中断提供了一个通用的实现,它只需要在处理程序的末端有一个EOI。 227*c767ef45SYanteng Si 228*c767ef45SYanteng Si实现的控制流如下(简化摘录):: 229*c767ef45SYanteng Si 230*c767ef45SYanteng Si handle_irq_event(desc->action); 231*c767ef45SYanteng Si desc->irq_data.chip->irq_eoi(); 232*c767ef45SYanteng Si 233*c767ef45SYanteng Si 234*c767ef45SYanteng Si默认的边沿触发型IRQ流处理器 235*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^^^^^^^^ 236*c767ef45SYanteng Si 237*c767ef45SYanteng Sihandle_edge_irq为边沿触发型的中断提供了一个通用的实现。 238*c767ef45SYanteng Si 239*c767ef45SYanteng Si实现的控制流如下(简化摘录):: 240*c767ef45SYanteng Si 241*c767ef45SYanteng Si if (desc->status & running) { 242*c767ef45SYanteng Si desc->irq_data.chip->irq_mask_ack(); 243*c767ef45SYanteng Si desc->status |= pending | masked; 244*c767ef45SYanteng Si return; 245*c767ef45SYanteng Si } 246*c767ef45SYanteng Si desc->irq_data.chip->irq_ack(); 247*c767ef45SYanteng Si desc->status |= running; 248*c767ef45SYanteng Si do { 249*c767ef45SYanteng Si if (desc->status & masked) 250*c767ef45SYanteng Si desc->irq_data.chip->irq_unmask(); 251*c767ef45SYanteng Si desc->status &= ~pending; 252*c767ef45SYanteng Si handle_irq_event(desc->action); 253*c767ef45SYanteng Si } while (status & pending); 254*c767ef45SYanteng Si desc->status &= ~running; 255*c767ef45SYanteng Si 256*c767ef45SYanteng Si 257*c767ef45SYanteng Si默认的简单型IRQ流处理器 258*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^^^^ 259*c767ef45SYanteng Si 260*c767ef45SYanteng Sihandle_simple_irq提供了一个简单型中断的通用实现。 261*c767ef45SYanteng Si 262*c767ef45SYanteng Si.. note:: 263*c767ef45SYanteng Si 264*c767ef45SYanteng Si 简单型的流处理程序不调用任何处理程序/芯片基元。 265*c767ef45SYanteng Si 266*c767ef45SYanteng Si实现的控制流程如下(简化摘录):: 267*c767ef45SYanteng Si 268*c767ef45SYanteng Si handle_irq_event(desc->action); 269*c767ef45SYanteng Si 270*c767ef45SYanteng Si 271*c767ef45SYanteng Si默认的每CPU型流处理程序 272*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^^^^ 273*c767ef45SYanteng Si 274*c767ef45SYanteng Sihandle_percpu_irq为每CPU型中断提供一个通用的实现。 275*c767ef45SYanteng Si 276*c767ef45SYanteng Si每个CPU中断只在SMP上可用,该处理程序提供了一个没有锁的简化版本。 277*c767ef45SYanteng Si 278*c767ef45SYanteng Si以下是控制流的实现(简化摘录):: 279*c767ef45SYanteng Si 280*c767ef45SYanteng Si if (desc->irq_data.chip->irq_ack) 281*c767ef45SYanteng Si desc->irq_data.chip->irq_ack(); 282*c767ef45SYanteng Si handle_irq_event(desc->action); 283*c767ef45SYanteng Si if (desc->irq_data.chip->irq_eoi) 284*c767ef45SYanteng Si desc->irq_data.chip->irq_eoi(); 285*c767ef45SYanteng Si 286*c767ef45SYanteng Si 287*c767ef45SYanteng SiEOI边沿型IRQ流处理器 288*c767ef45SYanteng Si^^^^^^^^^^^^^^^^^^^^ 289*c767ef45SYanteng Si 290*c767ef45SYanteng Sihandle_edge_eoi_irq提供了一个异常的边沿触发型处理程序,它只用于拯救powerpc/cell 291*c767ef45SYanteng Si上的一个严重失控的irq控制器。 292*c767ef45SYanteng Si 293*c767ef45SYanteng Si坏的IRQ流处理器 294*c767ef45SYanteng Si^^^^^^^^^^^^^^^ 295*c767ef45SYanteng Si 296*c767ef45SYanteng Sihandle_bad_irq用于处理没有真正分配处理程序的假中断。 297*c767ef45SYanteng Si 298*c767ef45SYanteng Si特殊性和优化 299*c767ef45SYanteng Si~~~~~~~~~~~~ 300*c767ef45SYanteng Si 301*c767ef45SYanteng Si通用函数是为“干净”的架构和芯片设计的,它们没有平台特定的IRQ处理特殊性。如果一 302*c767ef45SYanteng Si个架构需要在“流”的层面上实现特殊性,那么它可以通过覆盖高层的IRQ-流处理程序来实 303*c767ef45SYanteng Si现。 304*c767ef45SYanteng Si 305*c767ef45SYanteng Si延迟中断禁用 306*c767ef45SYanteng Si~~~~~~~~~~~~ 307*c767ef45SYanteng Si 308*c767ef45SYanteng Si每个中断可选择的功能是由Russell King在ARM中断实现中引入的,当调用disable_irq() 309*c767ef45SYanteng Si时,不会在硬件层面上屏蔽中断。中断保持启用状态,而在中断事件发生时在流处理器中被 310*c767ef45SYanteng Si屏蔽。这可以防止在硬件上丢失边沿中断,因为硬件上不存储边沿中断事件,而中断在硬件 311*c767ef45SYanteng Si级被禁用。当一个中断在IRQ_DISABLED标志被设置时到达,那么该中断在硬件层面被屏蔽, 312*c767ef45SYanteng SiIRQ_PENDING位被设置。当中断被enable_irq()重新启用时,将检查挂起位,如果它被设置, 313*c767ef45SYanteng Si中断将通过硬件或软件重发机制重新发送。(当你想使用延迟中断禁用功能,而你的硬件又不 314*c767ef45SYanteng Si能重新触发中断时,有必要启用CONFIG_HARDIRQS_SW_RESEND。) 延迟中断禁止功能是不可 315*c767ef45SYanteng Si配置的。 316*c767ef45SYanteng Si 317*c767ef45SYanteng Si芯片级硬件封装 318*c767ef45SYanteng Si-------------- 319*c767ef45SYanteng Si 320*c767ef45SYanteng Si芯片级硬件描述符结构体 :c:type:`irq_chip` 包含了所有与芯片直接相关的功能,这些功 321*c767ef45SYanteng Si能可以被irq流实现所利用。 322*c767ef45SYanteng Si 323*c767ef45SYanteng Si- ``irq_ack`` 324*c767ef45SYanteng Si 325*c767ef45SYanteng Si- ``irq_mask_ack`` - 可选的,建议使用的性能 326*c767ef45SYanteng Si 327*c767ef45SYanteng Si- ``irq_mask`` 328*c767ef45SYanteng Si 329*c767ef45SYanteng Si- ``irq_unmask`` 330*c767ef45SYanteng Si 331*c767ef45SYanteng Si- ``irq_eoi`` - 可选的,EOI流处理程序需要 332*c767ef45SYanteng Si 333*c767ef45SYanteng Si- ``irq_retrigger`` - 可选的 334*c767ef45SYanteng Si 335*c767ef45SYanteng Si- ``irq_set_type`` - 可选的 336*c767ef45SYanteng Si 337*c767ef45SYanteng Si- ``irq_set_wake`` - 可选的 338*c767ef45SYanteng Si 339*c767ef45SYanteng Si这些基元的意思是严格意义上的:ack是指ACK,masking是指对IRQ线的屏蔽,等等。这取决 340*c767ef45SYanteng Si于流处理器如何使用这些基本的低级功能单元。 341*c767ef45SYanteng Si 342*c767ef45SYanteng Si__do_IRQ入口点 343*c767ef45SYanteng Si============== 344*c767ef45SYanteng Si 345*c767ef45SYanteng Si最初的实现__do_IRQ()是所有类型中断的替代入口点。它已经不存在了。 346*c767ef45SYanteng Si 347*c767ef45SYanteng Si这个处理程序被证明不适合所有的中断硬件,因此被重新实现了边沿/级别/简单/超高速中断 348*c767ef45SYanteng Si的拆分功能。这不仅是一个功能优化。它也缩短了中断的代码路径。 349*c767ef45SYanteng Si 350*c767ef45SYanteng Si在SMP上的锁 351*c767ef45SYanteng Si=========== 352*c767ef45SYanteng Si 353*c767ef45SYanteng Si芯片寄存器的锁定是由定义芯片基元的架构决定的。每个寄存器的结构通过desc->lock,由 354*c767ef45SYanteng Si通用层保护。 355*c767ef45SYanteng Si 356*c767ef45SYanteng Si通用中断芯片 357*c767ef45SYanteng Si============ 358*c767ef45SYanteng Si 359*c767ef45SYanteng Si为了避免复制相同的IRQ芯片实现,核心提供了一个可配置的通用中断芯片实现。开发者在自 360*c767ef45SYanteng Si己实现相同的功能之前,应该仔细检查通用芯片是否符合他们的需求,并以稍微不同的方式实 361*c767ef45SYanteng Si现相同的功能。 362*c767ef45SYanteng Si 363*c767ef45SYanteng Si该API在以下内核代码中: 364*c767ef45SYanteng Si 365*c767ef45SYanteng Sikernel/irq/generic-chip.c 366*c767ef45SYanteng Si 367*c767ef45SYanteng Si结构体 368*c767ef45SYanteng Si====== 369*c767ef45SYanteng Si 370*c767ef45SYanteng Si本章包含自动生成的结构体文档,这些结构体在通用IRQ层中使用。 371*c767ef45SYanteng Si 372*c767ef45SYanteng Si该API在以下内核代码中: 373*c767ef45SYanteng Si 374*c767ef45SYanteng Siinclude/linux/irq.h 375*c767ef45SYanteng Si 376*c767ef45SYanteng Siinclude/linux/interrupt.h 377*c767ef45SYanteng Si 378*c767ef45SYanteng Si提供的通用函数 379*c767ef45SYanteng Si============== 380*c767ef45SYanteng Si 381*c767ef45SYanteng Si这一章包含了自动生成的内核API函数的文档,这些函数被导出。 382*c767ef45SYanteng Si 383*c767ef45SYanteng Si该API在以下内核代码中: 384*c767ef45SYanteng Si 385*c767ef45SYanteng Sikernel/irq/manage.c 386*c767ef45SYanteng Si 387*c767ef45SYanteng Sikernel/irq/chip.c 388*c767ef45SYanteng Si 389*c767ef45SYanteng Si提供的内部函数 390*c767ef45SYanteng Si============== 391*c767ef45SYanteng Si 392*c767ef45SYanteng Si本章包含自动生成的内部函数的文档。 393*c767ef45SYanteng Si 394*c767ef45SYanteng Si该API在以下内核代码中: 395*c767ef45SYanteng Si 396*c767ef45SYanteng Sikernel/irq/irqdesc.c 397*c767ef45SYanteng Si 398*c767ef45SYanteng Sikernel/irq/handle.c 399*c767ef45SYanteng Si 400*c767ef45SYanteng Sikernel/irq/chip.c 401*c767ef45SYanteng Si 402*c767ef45SYanteng Si鸣谢 403*c767ef45SYanteng Si==== 404*c767ef45SYanteng Si 405*c767ef45SYanteng Si感谢以下人士对本文档作出的贡献: 406*c767ef45SYanteng Si 407*c767ef45SYanteng Si1. Thomas Gleixner tglx@linutronix.de 408*c767ef45SYanteng Si 409*c767ef45SYanteng Si2. Ingo Molnar mingo@elte.hu 410