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