Author: cieciwa                      Date: Mon Jan  2 09:53:38 2006 GMT
Module: SOURCES                       Tag: LINUX_2_6
---- Log message:
- last rt for 1.6.14.5.
Checking required.

---- Files affected:
SOURCES:
   patch-2.6.14-rt22 (NONE -> 1.1.2.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/patch-2.6.14-rt22
diff -u /dev/null SOURCES/patch-2.6.14-rt22:1.1.2.1
--- /dev/null   Mon Jan  2 10:53:38 2006
+++ SOURCES/patch-2.6.14-rt22   Mon Jan  2 10:53:33 2006
@@ -0,0 +1,61717 @@
+Index: linux/Documentation/DocBook/Makefile
+===================================================================
+--- linux.orig/Documentation/DocBook/Makefile
++++ linux/Documentation/DocBook/Makefile
+@@ -10,7 +10,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mc
+           kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
+           procfs-guide.xml writing_usb_driver.xml \
+           sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
+-          gadget.xml libata.xml mtdnand.xml librs.xml
++          gadget.xml libata.xml mtdnand.xml librs.xml genericirq.xml
+ 
+ ###
+ # The build process is as follows (targets):
+Index: linux/Documentation/DocBook/genericirq.tmpl
+===================================================================
+--- /dev/null
++++ linux/Documentation/DocBook/genericirq.tmpl
+@@ -0,0 +1,560 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
++      "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"; []>
++
++<book id="Generic-IRQ-Guide">
++ <bookinfo>
++  <title>Linux generic IRQ handling</title>
++
++  <authorgroup>
++   <author>
++    <firstname>Thomas</firstname>
++    <surname>Gleixner</surname>
++    <affiliation>
++     <address>
++      <email>[EMAIL PROTECTED]</email>
++     </address>
++    </affiliation>
++   </author>
++   <author>
++    <firstname>Ingo</firstname>
++    <surname>Molnar</surname>
++    <affiliation>
++     <address>
++      <email>[EMAIL PROTECTED]</email>
++     </address>
++    </affiliation>
++   </author>
++  </authorgroup>
++
++  <copyright>
++   <year>2005</year>
++   <holder>Thomas Gleixner</holder>
++  </copyright>
++  <copyright>
++   <year>2005</year>
++   <holder>Ingo Molnar</holder>
++  </copyright>
++
++  <legalnotice>
++   <para>
++     This documentation is free software; you can redistribute
++     it and/or modify it under the terms of the GNU General Public
++     License version 2 as published by the Free Software Foundation.
++   </para>
++
++   <para>
++     This program is distributed in the hope that it will be
++     useful, but WITHOUT ANY WARRANTY; without even the implied
++     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++     See the GNU General Public License for more details.
++   </para>
++
++   <para>
++     You should have received a copy of the GNU General Public
++     License along with this program; if not, write to the Free
++     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++     MA 02111-1307 USA
++   </para>
++
++   <para>
++     For more details see the file COPYING in the source
++     distribution of Linux.
++   </para>
++  </legalnotice>
++ </bookinfo>
++
++<toc></toc>
++
++  <chapter id="intro">
++    <title>Introduction</title>
++    <para>
++      The generic interrupt handling layer is designed to provide a
++      complete abstraction of interrupt handling for device drivers
++      and is able to handle all different types of interrupt controller
++      hardware. Device drivers use generic API function to request, enable,
++      disable and free interrupts. The drivers do not have to know anything
++      about interrupt hardware, so they can be used on different hardware
++      platforms without code changes.
++    </para>
++    <para>
++      This documentation is provided for developers who want to implement
++      architecture interrupt support based on the Generic IRQ handling layer.
++    </para>
++  </chapter>
++
++  <chapter id="rationale">
++    <title>Rationale</title>
++      <para>
++      The original implementation of interrupt handling in Linux is using
++      the __do_IRQ() super-handler, which must be able to deal with every
++      type of interrupt logic. This is achieved by an 'interrupt type'
++      structure and runtime flags to handle special cases.
++      Furthermore the superhandler assumed a certain type of interrupt
++      handling hardware and turned out to be not capable of handling all
++      kind of interrupt controller hardware which can be found through
++      the architectures. The all in one approach also adds unnecessary
++      complexity for every user.
++      </para>
++      <para>
++      Originally, Russell King identified different types of handlers to
++      build a quite universal set for the ARM interrupt handler
++      implementation in Linux 2.5/2.6. He distiguished between:
++      <itemizedlist>
++        <listitem><para>Level type</para></listitem>
++        <listitem><para>Edge type</para></listitem>
++        <listitem><para>Simple type</para></listitem>
++      </itemizedlist>
++      In the SMP world of the __do_IRQ() super-handler another type
++      was identified:
++      <itemizedlist>
++        <listitem><para>Per CPU type</para></listitem>
++      </itemizedlist>
++      </para>
++      <para>
++      This split implementation of handlers allows to optimize the flow
++      of the interrupt handling for each specific interrupt type.
++      This reduces complexitiy in that particular code path and allows
++      the optimized handling of a given type.
++      </para>
++      <para>
++      The original general implementation uses interrupt_type structures
++      to differentiate the flow control in the super-handler. This
++      leads to a mix of flow logic and code related to hardware details.
++      Russell Kings ARM implementation which replaced the type by a chip
++      abstraction did the mix the other way around.
++      </para>
++      <para>
++      The natural conclusion was a clean seperation of the 'type flow'
++      and the 'chip'. Analysing a couple of architecture implementations
++      reveals that many of them can use a generic set of 'type flow'
++      implementations and only need to add the chip level specific code.
++      The seperation is also valuable for the (sub)architectures,
++      which need specific quirks in the type flow itself, because it
++      provides a more transparent design.
++      </para>
++      <para>
++      Each interrupt type implementation has assigned its own flow
++      handler, which should be normally one of the generic
++      implementations. The flow handler implementation makes it
++      simple to provide demultiplexing handlers which can be found in
++      embedded platforms on various architectures.
++      </para>
++      <para>
++      The seperation makes the generic interrupt handling more flexible
++      and extensible. An (sub)architecture can use a generic type flow
++      implementation for e.g. 'level type' interrupts and add a
++      (sub)architecture specific 'edge type' implementation.
++      </para>
++      <para>
++      To make the transition to the new model easier and prevent the
++      breakage of existing implementations the __do_IRQ() super-handler
++      is still available. This leads to a kind of duality for the time
++      being. Over time the new model should achieve a homogeneous
++      implementation scheme over all architectures with enhanced
++      maintainability and cleanliness.
++      </para>
++  </chapter>
++  <chapter id="bugs">
++    <title>Known Bugs And Assumptions</title>
++    <para>
++      None (hopefully).
++    </para>
++  </chapter>
++
++  <chapter id="Abstraction">
++    <title>Abstraction layers</title>
++    <para>
++      There are three main levels of abstraction in the interrupt code:
++      <orderedlist>
++        <listitem><para>Highlevel driver API</para></listitem>
++        <listitem><para>Abstract interrupt type</para></listitem>
++        <listitem><para>Chiplevel hardware encapsulation</para></listitem>
++      </orderedlist>
++    </para>
++    <para>
++      The seperation of interrupt type and chip level functionality
++      provides the most flexible design. This implementation can handle
++      all kinds of interrupt hardware and the necessary workarounds for
++      the interrupt types without the need of redundant implementations.
++      The seperation handles also edge and level type interrupts
++      on the same hardware chip.
++    </para>
++    <sect1>
++      <title>Interrupt control flow</title>
++      <para>
++      Each interrupt is described by an interrupt description structure
++      irq_desc. The interrupt is referenced by an 'unsigned int' numeric
++      value which selects the corresponding interrupt decription structure
++      in the description structures array.
++      The description structure contains status information and pointers
++      to the interrupt type structure and the interrupt chip structure
++      which are assigned to this interrupt.
++      </para>
++      <para>
++      Whenever an interrupt triggers, the lowlevel arch code calls into
++      the generic interrupt code by calling desc->handler->handle_irq().
++      This highlevel IRQ handling function only uses other
++      desc->handler primitives which describe the control flow operation
++      necessary for the interrupt type. These operations are calling
++      the chip primitives referenced by the assigned chip description
++      structure.
++      </para>
++    </sect1>
++    <sect1>
++      <title>Highlevel Driver API</title>
++      <para>
++        The highlevel Driver API consists of following functions:
++        <itemizedlist>
++        <listitem><para>request_irq()</para></listitem>
++        <listitem><para>free_irq()</para></listitem>
++        <listitem><para>disable_irq()</para></listitem>
++        <listitem><para>enable_irq()</para></listitem>
++        <listitem><para>disable_irq_nosync() (SMP only)</para></listitem>
++        <listitem><para>synchronize_irq() (SMP only)</para></listitem>
++        <listitem><para>set_irq_type()</para></listitem>
++        <listitem><para>set_irq_wake()</para></listitem>
++        <listitem><para>set_irq_data()</para></listitem>
++        <listitem><para>set_irq_chip()</para></listitem>
++        <listitem><para>set_irq_chip_data()</para></listitem>
++          </itemizedlist>
++        See the autogenerated function documentation for details.
++      </para>
++    </sect1>
++    <sect1>
++      <title>Abstract interrupt type</title>
++      <para>
++        The 'interrupt type' (struct irq_type) abstraction mainly consists of
++        methods which implement the 'interrupt handling flow'. The generic
++        layer provides a set of pre-defined types:
++        <itemizedlist>
++        <listitem><para>default_level_type</para></listitem>
++        <listitem><para>default_edge_type</para></listitem>
++        <listitem><para>default_simple_type</para></listitem>
++        <listitem><para>default_percpu_type</para></listitem>
++        </itemizedlist>
++        The default type implementations use the generic type handlers.
++        <itemizedlist>
++        <listitem><para>handle_level_type</para></listitem>
++        <listitem><para>handle_edge_type</para></listitem>
++        <listitem><para>handle_simple_type</para></listitem>
++        <listitem><para>handle_percpu_type</para></listitem>
++        </itemizedlist>
++        The interrupt types (either predefined or architecture specific) are
++        assigned to specific interrupts by the architecture either during
++        bootup or during device initialization.
++      </para>
++      <sect2>
++      <title>Default type implementations</title>
++          <sect3>
++              <title>Helper functions</title>
++              <para>
++              The helper functions call the chip primitives and
++              are used by the default type implementations.
++              Following helper functions are implemented (simplified excerpt):
++              <programlisting>
++default_enable(irq)
++{
++      desc->chip->unmask(irq);
++}
++
++default_disable(irq)
++{
++      desc->chip->mask(irq);
++}
++
++default_ack(irq)
++{
++      chip->ack(irq);
++}
++
++default_mask_ack(irq)
++{
++      if (chip->mask_ack) {
++              chip->mask_ack(irq);
++      } else {
++              chip->mask(irq);
++              chip->ack(irq);
++      }
++}
++
++noop(irq)
++{
++}
++
++default_set_type(irq, type)
++{
++      if (desc->chip->set_type) {
++              if (desc->chip->set_type(irq, type))
++                      return NULL;
++      }
++
++      return default_handler for type;
++}
++              </programlisting>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default Level IRQ type</title>
++              <para>
++              The default Level IRQ type implements the functions
++              <simplelist type="horiz" columns="2">
++              <member>enable</member><member>default_enable</member>
++              <member>disable</member><member>default_disable</member>
++              <member>start</member><member>default_mask_ack</member>
++              <member>end</member><member>default_enable</member>
++              <member>handle_irq</member><member>handle_level_irq</member>
++              <member>set_type</member><member>default_set_type</member>
++              </simplelist>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default Edge IRQ type</title>
++              <para>
++              The default Edge IRQ type implements the functions
++              <simplelist type="horiz" columns="2">
++              <member>enable</member><member>default_enable</member>
++              <member>disable</member><member>default_disable</member>
++              <member>start</member><member>default_ack</member>
++              <member>hold</member><member>default_mask_ack</member>
++              <member>end</member><member>noop</member>
++              <member>handle_irq</member><member>handle_edge_irq</member>
++              <member>set_type</member><member>default_set_type</member>
++              </simplelist>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default simple IRQ type</title>
++              <para>
++              The default simple IRQ type implements the functions
++              <simplelist type="horiz" columns="2">
++              <member>enable</member><member>noop</member>
++              <member>disable</member><member>noop</member>
++              <member>handle_irq</member><member>handle_simple_irq</member>
++              </simplelist>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default per CPU IRQ type</title>
++              <para>
++              The default per CPU IRQ type implements the functions
++              <simplelist type="horiz" columns="2">
++              <member>enable</member><member>default_enable</member>
++              <member>disable</member><member>default_disable</member>
++              <member>start</member><member>default_ack</member>
++              <member>end</member><member>default_enable</member>
++              <member>handle_irq</member><member>handle_percpu_irq</member>
++              </simplelist>
++              </para>
++          </sect3>
++      </sect2>
++      <sect2>
++      <title>Default type handler implementations</title>
++          <sect3>
++              <title>Default Level IRQ type handler</title>
++              <para>
++              handle_level_type provides a generic implementation
++              for level type interrupts.
++              </para>
++              <para>
++              Following control flow is implemented (simplified excerpt):
++              <programlisting>
++desc->handler->start();
++handle_IRQ_event(desc->action);
++desc->handler->end();
++              </programlisting>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default Edge IRQ type handler</title>
++              <para>
++              handle_edge_type provides a generic implementation
++              for edge type interrupts.
++              </para>
++              <para>
++              Following control flow is implemented (simplified excerpt):
++              <programlisting>
++if (desc->status &amp; running) {
++      desc->handler->hold();
++      desc->status |= pending | masked;
++      return;
++}
++desc->handler->start();
++desc->status |= running;
++do {
++      if (desc->status &amp; masked)
++              desc->handler->enable();
++      desc-status &amp;= ~pending;
++      handle_IRQ_event(desc->action);
++} while (status &amp; pending);
++desc-status &amp;= ~running;
++desc->handler->end();
++              </programlisting>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default simple IRQ type handler</title>
++              <para>
++              handle_simple_type provides a generic implementation
++              for simple type interrupts.
++              </para>
++              <para>
++              Note: The simple type handler does not call any
++              handler/chip primitives.
++              </para>
++              <para>
++              Following control flow is implemented (simplified excerpt):
++              <programlisting>
++handle_IRQ_event(desc->action);
++              </programlisting>
++              </para>
++          </sect3>
++          <sect3>
++              <title>Default per CPU type handler</title>
++              <para>
++              handle_percpu_type provides a generic implementation
++              for per CPU type interrupts.
++              </para>
++              <para>
++              Per CPU interrupts are only available on SMP and
++              the handler provides a simplified version without
++              locking.
++              </para>
++              <para>
++              Following control flow is implemented (simplified excerpt):
++              <programlisting>
++desc->handler->start();
++handle_IRQ_event(desc->action);
++desc->handler->end();
++              </programlisting>
++              </para>
++          </sect3>
++      </sect2>
++      <sect2>
++      <title>Architecture specific type implementation</title>
++      <para>
++        If an architecture needs to implement its own type structures, then
++        the following primitives have to be implemented:
++        <itemizedlist>
++        <listitem><para>handle_irq() - The handle_irq function pointer should 
preferably point to
++        one of the generic type handler functions</para></listitem>
++        <listitem><para>startup() - Optional</para></listitem>
++        <listitem><para>shutdown() - Optional</para></listitem>
++        <listitem><para>enable()</para></listitem>
++        <listitem><para>disable()</para></listitem>
++        <listitem><para>start()</para></listitem>
++        <listitem><para>hold() - For edge type interupts 
only</para></listitem>
++        <listitem><para>end()</para></listitem>
++        <listitem><para>set_type - Optional</para></listitem>
++        <listitem><para>set_affinity - SMP only</para></listitem>
++        </itemizedlist>
++      </para>
++      </sect2>
++      <sect2>
++      <title>Quirks and optimizations</title>
++      <para>
++      The generic functions are intended for 'clean' architectures and chips,
++      which have no platform-specific IRQ handling quirks. If an architecture
++      needs to implement quirks on the 'flow' level then it can do so by
++      overriding the irqtype. This is also done for compatibility reasons, as
++      most architectures use irqtypes only at the moment.
++      </para>
++      <para>
++      An architecture could implement all of its IRQ logic via pushing
++      chip handling details into the irqtype's ->start()/->end()/->hold()
++      functions. This is only recommended when the underlying primitives
++      are pure chip primitives without additional quirks. The direct pointer
++      to the chip functions reduces the indirection level by one.
++      </para>
++      </sect2>
++    </sect1>
++    <sect1>
++      <title>Chiplevel hardware encapsulation</title>
++      <para>
++      The chip level hardware description structure irq_chip
++      contains all the direct chip relevant functions, which
++      can be utilized by the irq_type implementations.
++        <itemizedlist>
++        <listitem><para>ack()</para></listitem>
++        <listitem><para>mask_ack() - Optional, recommended for 
performance</para></listitem>
++        <listitem><para>mask()</para></listitem>
++        <listitem><para>unmask()</para></listitem>
++        <listitem><para>retrigger() - Optional</para></listitem>
++        <listitem><para>set_type() - Optional</para></listitem>
++        <listitem><para>set_wake() - Optional</para></listitem>
++        </itemizedlist>
++      These primitives are strictly intended to mean what they say: ack means
++      ACK, masking means masking of an IRQ line, etc. It is up to the flow
++      handler(s) to use these basic units of lowlevel functionality.
++      </para>
++    </sect1>
++  </chapter>
++
++  <chapter id="doirq">
++     <title>__do_IRQ entry point</title>
++     <para>
++      The original implementation __do_IRQ() is an alternative entry
++      point for all types of interrupts.
++     </para>
++     <para>
++      This handler turned out to be not suitable for all
++      interrupt hardware and was therefor reimplemented with split
++      functionality for egde/level/simple/percpu interrupts. This is not
++      only a functional optimization. It also shortenes code pathes for
++      interrupts.
++      </para>
++      <para>
++      To make use of the split implementation, replace the call to
++      __do_IRQ by a call to desc->handler->handle_irq() and associate
++        the appropriate handler function to desc->handler->handle_irq().
++      In most cases the generic type and handler implementations should
++      be sufficient.
++     </para>
++  </chapter>
++
++  <chapter id="locking">
++     <title>Locking on SMP</title>
++     <para>
++      The locking of chip registers is up to the architecture that
++      defines the chip primitives. There is a chip->lock field that can be 
used
++      for serialization, but the generic layer does not touch it. The per-irq
++      structure is protected via desc->lock, by the generic layer.
++     </para>
++  </chapter>
++  <chapter id="structs">
++     <title>Structures</title>
++     <para>
++     This chapter contains the autogenerated documentation of the structures 
which are
++     used in the generic IRQ layer.
++     </para>
++!Iinclude/linux/irq.h
++  </chapter>
++
++  <chapter id="pubfunctions">
++     <title>Public Functions Provided</title>
++     <para>
++     This chapter contains the autogenerated documentation of the kernel API 
functions
++      which are exported.
++     </para>
++!Ekernel/irq/manage.c
++  </chapter>
++
++  <chapter id="intfunctions">
++     <title>Internal Functions Provided</title>
++     <para>
++     This chapter contains the autogenerated documentation of the internal 
functions.
++     </para>
++!Ikernel/irq/handle.c
++  </chapter>
++
++  <chapter id="credits">
++     <title>Credits</title>
++      <para>
++              The following people have contributed to this document:
++              <orderedlist>
++                      <listitem><para>Thomas Gleixner<email>[EMAIL 
PROTECTED]</email></para></listitem>
++                      <listitem><para>Ingo Molnar<email>[EMAIL 
PROTECTED]</email></para></listitem>
++              </orderedlist>
++      </para>
++  </chapter>
++</book>
+Index: linux/Documentation/DocBook/kernel-api.tmpl
+===================================================================
+--- linux.orig/Documentation/DocBook/kernel-api.tmpl
++++ linux/Documentation/DocBook/kernel-api.tmpl
+@@ -54,6 +54,11 @@
+ !Ekernel/sched.c
+ !Ekernel/timer.c
+      </sect1>
++     <sect1><title>High-precision timers</title>
++!Iinclude/linux/ktime.h
++!Iinclude/linux/ktimer.h
++!Ekernel/ktimers.c
++     </sect1>
<<Diff was trimmed, longer than 597 lines>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to