diff options
| -rw-r--r-- | Documentation/DocBook/genericirq.tmpl | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/Documentation/DocBook/genericirq.tmpl b/Documentation/DocBook/genericirq.tmpl index 1448b33fd222..fb10fd08c05c 100644 --- a/Documentation/DocBook/genericirq.tmpl +++ b/Documentation/DocBook/genericirq.tmpl | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | </authorgroup> | 28 | </authorgroup> |
| 29 | 29 | ||
| 30 | <copyright> | 30 | <copyright> |
| 31 | <year>2005-2006</year> | 31 | <year>2005-2010</year> |
| 32 | <holder>Thomas Gleixner</holder> | 32 | <holder>Thomas Gleixner</holder> |
| 33 | </copyright> | 33 | </copyright> |
| 34 | <copyright> | 34 | <copyright> |
| @@ -100,6 +100,10 @@ | |||
| 100 | <listitem><para>Edge type</para></listitem> | 100 | <listitem><para>Edge type</para></listitem> |
| 101 | <listitem><para>Simple type</para></listitem> | 101 | <listitem><para>Simple type</para></listitem> |
| 102 | </itemizedlist> | 102 | </itemizedlist> |
| 103 | During the implementation we identified another type: | ||
| 104 | <itemizedlist> | ||
| 105 | <listitem><para>Fast EOI type</para></listitem> | ||
| 106 | </itemizedlist> | ||
| 103 | In the SMP world of the __do_IRQ() super-handler another type | 107 | In the SMP world of the __do_IRQ() super-handler another type |
| 104 | was identified: | 108 | was identified: |
| 105 | <itemizedlist> | 109 | <itemizedlist> |
| @@ -153,6 +157,7 @@ | |||
| 153 | is still available. This leads to a kind of duality for the time | 157 | is still available. This leads to a kind of duality for the time |
| 154 | being. Over time the new model should be used in more and more | 158 | being. Over time the new model should be used in more and more |
| 155 | architectures, as it enables smaller and cleaner IRQ subsystems. | 159 | architectures, as it enables smaller and cleaner IRQ subsystems. |
| 160 | It's deprecated for three years now and about to be removed. | ||
| 156 | </para> | 161 | </para> |
| 157 | </chapter> | 162 | </chapter> |
| 158 | <chapter id="bugs"> | 163 | <chapter id="bugs"> |
| @@ -217,6 +222,7 @@ | |||
| 217 | <itemizedlist> | 222 | <itemizedlist> |
| 218 | <listitem><para>handle_level_irq</para></listitem> | 223 | <listitem><para>handle_level_irq</para></listitem> |
| 219 | <listitem><para>handle_edge_irq</para></listitem> | 224 | <listitem><para>handle_edge_irq</para></listitem> |
| 225 | <listitem><para>handle_fasteoi_irq</para></listitem> | ||
| 220 | <listitem><para>handle_simple_irq</para></listitem> | 226 | <listitem><para>handle_simple_irq</para></listitem> |
| 221 | <listitem><para>handle_percpu_irq</para></listitem> | 227 | <listitem><para>handle_percpu_irq</para></listitem> |
| 222 | </itemizedlist> | 228 | </itemizedlist> |
| @@ -233,33 +239,33 @@ | |||
| 233 | are used by the default flow implementations. | 239 | are used by the default flow implementations. |
| 234 | The following helper functions are implemented (simplified excerpt): | 240 | The following helper functions are implemented (simplified excerpt): |
| 235 | <programlisting> | 241 | <programlisting> |
| 236 | default_enable(irq) | 242 | default_enable(struct irq_data *data) |
| 237 | { | 243 | { |
| 238 | desc->chip->unmask(irq); | 244 | desc->chip->irq_unmask(data); |
| 239 | } | 245 | } |
| 240 | 246 | ||
| 241 | default_disable(irq) | 247 | default_disable(struct irq_data *data) |
| 242 | { | 248 | { |
| 243 | if (!delay_disable(irq)) | 249 | if (!delay_disable(data)) |
| 244 | desc->chip->mask(irq); | 250 | desc->chip->irq_mask(data); |
| 245 | } | 251 | } |
| 246 | 252 | ||
| 247 | default_ack(irq) | 253 | default_ack(struct irq_data *data) |
| 248 | { | 254 | { |
| 249 | chip->ack(irq); | 255 | chip->irq_ack(data); |
| 250 | } | 256 | } |
| 251 | 257 | ||
| 252 | default_mask_ack(irq) | 258 | default_mask_ack(struct irq_data *data) |
| 253 | { | 259 | { |
| 254 | if (chip->mask_ack) { | 260 | if (chip->irq_mask_ack) { |
| 255 | chip->mask_ack(irq); | 261 | chip->irq_mask_ack(data); |
| 256 | } else { | 262 | } else { |
| 257 | chip->mask(irq); | 263 | chip->irq_mask(data); |
| 258 | chip->ack(irq); | 264 | chip->irq_ack(data); |
| 259 | } | 265 | } |
| 260 | } | 266 | } |
| 261 | 267 | ||
| 262 | noop(irq) | 268 | noop(struct irq_data *data)) |
| 263 | { | 269 | { |
| 264 | } | 270 | } |
| 265 | 271 | ||
| @@ -278,12 +284,27 @@ noop(irq) | |||
| 278 | <para> | 284 | <para> |
| 279 | The following control flow is implemented (simplified excerpt): | 285 | The following control flow is implemented (simplified excerpt): |
| 280 | <programlisting> | 286 | <programlisting> |
| 281 | desc->chip->start(); | 287 | desc->chip->irq_mask(); |
| 282 | handle_IRQ_event(desc->action); | 288 | handle_IRQ_event(desc->action); |
| 283 | desc->chip->end(); | 289 | desc->chip->irq_unmask(); |
| 284 | </programlisting> | 290 | </programlisting> |
| 285 | </para> | 291 | </para> |
| 286 | </sect3> | 292 | </sect3> |
| 293 | <sect3 id="Default_FASTEOI_IRQ_flow_handler"> | ||
| 294 | <title>Default Fast EOI IRQ flow handler</title> | ||
| 295 | <para> | ||
| 296 | handle_fasteoi_irq provides a generic implementation | ||
| 297 | for interrupts, which only need an EOI at the end of | ||
| 298 | the handler | ||
| 299 | </para> | ||
| 300 | <para> | ||
| 301 | The following control flow is implemented (simplified excerpt): | ||
| 302 | <programlisting> | ||
| 303 | handle_IRQ_event(desc->action); | ||
| 304 | desc->chip->irq_eoi(); | ||
| 305 | </programlisting> | ||
| 306 | </para> | ||
| 307 | </sect3> | ||
| 287 | <sect3 id="Default_Edge_IRQ_flow_handler"> | 308 | <sect3 id="Default_Edge_IRQ_flow_handler"> |
| 288 | <title>Default Edge IRQ flow handler</title> | 309 | <title>Default Edge IRQ flow handler</title> |
| 289 | <para> | 310 | <para> |
| @@ -294,20 +315,19 @@ desc->chip->end(); | |||
| 294 | The following control flow is implemented (simplified excerpt): | 315 | The following control flow is implemented (simplified excerpt): |
| 295 | <programlisting> | 316 | <programlisting> |
| 296 | if (desc->status & running) { | 317 | if (desc->status & running) { |
| 297 | desc->chip->hold(); | 318 | desc->chip->irq_mask(); |
| 298 | desc->status |= pending | masked; | 319 | desc->status |= pending | masked; |
| 299 | return; | 320 | return; |
| 300 | } | 321 | } |
| 301 | desc->chip->start(); | 322 | desc->chip->irq_ack(); |
| 302 | desc->status |= running; | 323 | desc->status |= running; |
| 303 | do { | 324 | do { |
| 304 | if (desc->status & masked) | 325 | if (desc->status & masked) |
| 305 | desc->chip->enable(); | 326 | desc->chip->irq_unmask(); |
| 306 | desc->status &= ~pending; | 327 | desc->status &= ~pending; |
| 307 | handle_IRQ_event(desc->action); | 328 | handle_IRQ_event(desc->action); |
| 308 | } while (status & pending); | 329 | } while (status & pending); |
| 309 | desc->status &= ~running; | 330 | desc->status &= ~running; |
| 310 | desc->chip->end(); | ||
| 311 | </programlisting> | 331 | </programlisting> |
| 312 | </para> | 332 | </para> |
| 313 | </sect3> | 333 | </sect3> |
| @@ -342,9 +362,9 @@ handle_IRQ_event(desc->action); | |||
| 342 | <para> | 362 | <para> |
| 343 | The following control flow is implemented (simplified excerpt): | 363 | The following control flow is implemented (simplified excerpt): |
| 344 | <programlisting> | 364 | <programlisting> |
| 345 | desc->chip->start(); | ||
| 346 | handle_IRQ_event(desc->action); | 365 | handle_IRQ_event(desc->action); |
| 347 | desc->chip->end(); | 366 | if (desc->chip->irq_eoi) |
| 367 | desc->chip->irq_eoi(); | ||
| 348 | </programlisting> | 368 | </programlisting> |
| 349 | </para> | 369 | </para> |
| 350 | </sect3> | 370 | </sect3> |
| @@ -375,8 +395,7 @@ desc->chip->end(); | |||
| 375 | mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when | 395 | mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when |
| 376 | you want to use the delayed interrupt disable feature and your | 396 | you want to use the delayed interrupt disable feature and your |
| 377 | hardware is not capable of retriggering an interrupt.) | 397 | hardware is not capable of retriggering an interrupt.) |
| 378 | The delayed interrupt disable can be runtime enabled, per interrupt, | 398 | The delayed interrupt disable is not configurable. |
| 379 | by setting the IRQ_DELAYED_DISABLE flag in the irq_desc status field. | ||
| 380 | </para> | 399 | </para> |
| 381 | </sect2> | 400 | </sect2> |
| 382 | </sect1> | 401 | </sect1> |
| @@ -387,13 +406,13 @@ desc->chip->end(); | |||
| 387 | contains all the direct chip relevant functions, which | 406 | contains all the direct chip relevant functions, which |
| 388 | can be utilized by the irq flow implementations. | 407 | can be utilized by the irq flow implementations. |
| 389 | <itemizedlist> | 408 | <itemizedlist> |
| 390 | <listitem><para>ack()</para></listitem> | 409 | <listitem><para>irq_ack()</para></listitem> |
| 391 | <listitem><para>mask_ack() - Optional, recommended for performance</para></listitem> | 410 | <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem> |
| 392 | <listitem><para>mask()</para></listitem> | 411 | <listitem><para>irq_mask()</para></listitem> |
| 393 | <listitem><para>unmask()</para></listitem> | 412 | <listitem><para>irq_unmask()</para></listitem> |
| 394 | <listitem><para>retrigger() - Optional</para></listitem> | 413 | <listitem><para>irq_retrigger() - Optional</para></listitem> |
| 395 | <listitem><para>set_type() - Optional</para></listitem> | 414 | <listitem><para>irq_set_type() - Optional</para></listitem> |
| 396 | <listitem><para>set_wake() - Optional</para></listitem> | 415 | <listitem><para>irq_set_wake() - Optional</para></listitem> |
| 397 | </itemizedlist> | 416 | </itemizedlist> |
| 398 | These primitives are strictly intended to mean what they say: ack means | 417 | These primitives are strictly intended to mean what they say: ack means |
| 399 | ACK, masking means masking of an IRQ line, etc. It is up to the flow | 418 | ACK, masking means masking of an IRQ line, etc. It is up to the flow |
| @@ -458,6 +477,7 @@ desc->chip->end(); | |||
| 458 | <para> | 477 | <para> |
| 459 | This chapter contains the autogenerated documentation of the internal functions. | 478 | This chapter contains the autogenerated documentation of the internal functions. |
| 460 | </para> | 479 | </para> |
| 480 | !Ikernel/irq/irqdesc.c | ||
| 461 | !Ikernel/irq/handle.c | 481 | !Ikernel/irq/handle.c |
| 462 | !Ikernel/irq/chip.c | 482 | !Ikernel/irq/chip.c |
| 463 | </chapter> | 483 | </chapter> |
