forked from Minki/linux
c1b8d45db4
The FreeScale PowerQUICC-III-compatible (mpc85xx/mpc86xx) MPICs do not correctly report the number of hardware interrupt sources, so software needs to override the detected value with "256". To avoid needing to write custom board-specific code to detect that scenario, allow it to be easily overridden in the device-tree. Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
232 lines
7.3 KiB
Plaintext
232 lines
7.3 KiB
Plaintext
=====================================================================
|
|
Freescale MPIC Interrupt Controller Node
|
|
Copyright (C) 2010,2011 Freescale Semiconductor Inc.
|
|
=====================================================================
|
|
|
|
The Freescale MPIC interrupt controller is found on all PowerQUICC
|
|
and QorIQ processors and is compatible with the Open PIC. The
|
|
notable difference from Open PIC binding is the addition of 2
|
|
additional cells in the interrupt specifier defining interrupt type
|
|
information.
|
|
|
|
PROPERTIES
|
|
|
|
- compatible
|
|
Usage: required
|
|
Value type: <string>
|
|
Definition: Shall include "fsl,mpic". Freescale MPIC
|
|
controllers compatible with this binding have Block
|
|
Revision Registers BRR1 and BRR2 at offset 0x0 and
|
|
0x10 in the MPIC.
|
|
|
|
- reg
|
|
Usage: required
|
|
Value type: <prop-encoded-array>
|
|
Definition: A standard property. Specifies the physical
|
|
offset and length of the device's registers within the
|
|
CCSR address space.
|
|
|
|
- interrupt-controller
|
|
Usage: required
|
|
Value type: <empty>
|
|
Definition: Specifies that this node is an interrupt
|
|
controller
|
|
|
|
- #interrupt-cells
|
|
Usage: required
|
|
Value type: <u32>
|
|
Definition: Shall be 2 or 4. A value of 2 means that interrupt
|
|
specifiers do not contain the interrupt-type or type-specific
|
|
information cells.
|
|
|
|
- #address-cells
|
|
Usage: required
|
|
Value type: <u32>
|
|
Definition: Shall be 0.
|
|
|
|
- pic-no-reset
|
|
Usage: optional
|
|
Value type: <empty>
|
|
Definition: The presence of this property specifies that the
|
|
MPIC must not be reset by the client program, and that
|
|
the boot program has initialized all interrupt source
|
|
configuration registers to a sane state-- masked or
|
|
directed at other cores. This ensures that the client
|
|
program will not receive interrupts for sources not belonging
|
|
to the client. The presence of this property also mandates
|
|
that any initialization related to interrupt sources shall
|
|
be limited to sources explicitly referenced in the device tree.
|
|
|
|
- big-endian
|
|
Usage: optional
|
|
Value type: <empty>
|
|
If present the MPIC will be assumed to be big-endian. Some
|
|
device-trees omit this property on MPIC nodes even when the MPIC is
|
|
in fact big-endian, so certain boards override this property.
|
|
|
|
- single-cpu-affinity
|
|
Usage: optional
|
|
Value type: <empty>
|
|
If present the MPIC will be assumed to only be able to route
|
|
non-IPI interrupts to a single CPU at a time (EG: Freescale MPIC).
|
|
|
|
- last-interrupt-source
|
|
Usage: optional
|
|
Value type: <u32>
|
|
Some MPICs do not correctly report the number of hardware sources
|
|
in the global feature registers. If specified, this field will
|
|
override the value read from MPIC_GREG_FEATURE_LAST_SRC.
|
|
|
|
INTERRUPT SPECIFIER DEFINITION
|
|
|
|
Interrupt specifiers consists of 4 cells encoded as
|
|
follows:
|
|
|
|
<1st-cell> interrupt-number
|
|
|
|
Identifies the interrupt source. The meaning
|
|
depends on the type of interrupt.
|
|
|
|
Note: If the interrupt-type cell is undefined
|
|
(i.e. #interrupt-cells = 2), this cell
|
|
should be interpreted the same as for
|
|
interrupt-type 0-- i.e. an external or
|
|
normal SoC device interrupt.
|
|
|
|
<2nd-cell> level-sense information, encoded as follows:
|
|
0 = low-to-high edge triggered
|
|
1 = active low level-sensitive
|
|
2 = active high level-sensitive
|
|
3 = high-to-low edge triggered
|
|
|
|
<3rd-cell> interrupt-type
|
|
|
|
The following types are supported:
|
|
|
|
0 = external or normal SoC device interrupt
|
|
|
|
The interrupt-number cell contains
|
|
the SoC device interrupt number. The
|
|
type-specific cell is undefined. The
|
|
interrupt-number is derived from the
|
|
MPIC a block of registers referred to as
|
|
the "Interrupt Source Configuration Registers".
|
|
Each source has 32-bytes of registers
|
|
(vector/priority and destination) in this
|
|
region. So interrupt 0 is at offset 0x0,
|
|
interrupt 1 is at offset 0x20, and so on.
|
|
|
|
1 = error interrupt
|
|
|
|
The interrupt-number cell contains
|
|
the SoC device interrupt number for
|
|
the error interrupt. The type-specific
|
|
cell identifies the specific error
|
|
interrupt number.
|
|
|
|
2 = MPIC inter-processor interrupt (IPI)
|
|
|
|
The interrupt-number cell identifies
|
|
the MPIC IPI number. The type-specific
|
|
cell is undefined.
|
|
|
|
3 = MPIC timer interrupt
|
|
|
|
The interrupt-number cell identifies
|
|
the MPIC timer number. The type-specific
|
|
cell is undefined.
|
|
|
|
<4th-cell> type-specific information
|
|
|
|
The type-specific cell is encoded as follows:
|
|
|
|
- For interrupt-type 1 (error interrupt),
|
|
the type-specific cell contains the
|
|
bit number of the error interrupt in the
|
|
Error Interrupt Summary Register.
|
|
|
|
EXAMPLE 1
|
|
/*
|
|
* mpic interrupt controller with 4 cells per specifier
|
|
*/
|
|
mpic: pic@40000 {
|
|
compatible = "fsl,mpic";
|
|
interrupt-controller;
|
|
#interrupt-cells = <4>;
|
|
#address-cells = <0>;
|
|
reg = <0x40000 0x40000>;
|
|
};
|
|
|
|
EXAMPLE 2
|
|
/*
|
|
* The MPC8544 I2C controller node has an internal
|
|
* interrupt number of 27. As per the reference manual
|
|
* this corresponds to interrupt source configuration
|
|
* registers at 0x5_0560.
|
|
*
|
|
* The interrupt source configuration registers begin
|
|
* at 0x5_0000.
|
|
*
|
|
* To compute the interrupt specifier interrupt number
|
|
*
|
|
* 0x560 >> 5 = 43
|
|
*
|
|
* The interrupt source configuration registers begin
|
|
* at 0x5_0000, and so the i2c vector/priority registers
|
|
* are at 0x5_0560.
|
|
*/
|
|
i2c@3000 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
cell-index = <0>;
|
|
compatible = "fsl-i2c";
|
|
reg = <0x3000 0x100>;
|
|
interrupts = <43 2>;
|
|
interrupt-parent = <&mpic>;
|
|
dfsrr;
|
|
};
|
|
|
|
|
|
EXAMPLE 3
|
|
/*
|
|
* Definition of a node defining the 4
|
|
* MPIC IPI interrupts. Note the interrupt
|
|
* type of 2.
|
|
*/
|
|
ipi@410a0 {
|
|
compatible = "fsl,mpic-ipi";
|
|
reg = <0x40040 0x10>;
|
|
interrupts = <0 0 2 0
|
|
1 0 2 0
|
|
2 0 2 0
|
|
3 0 2 0>;
|
|
};
|
|
|
|
EXAMPLE 4
|
|
/*
|
|
* Definition of a node defining the MPIC
|
|
* global timers. Note the interrupt
|
|
* type of 3.
|
|
*/
|
|
timer0: timer@41100 {
|
|
compatible = "fsl,mpic-global-timer";
|
|
reg = <0x41100 0x100 0x41300 4>;
|
|
interrupts = <0 0 3 0
|
|
1 0 3 0
|
|
2 0 3 0
|
|
3 0 3 0>;
|
|
};
|
|
|
|
EXAMPLE 5
|
|
/*
|
|
* Definition of an error interrupt (interrupt type 1).
|
|
* SoC interrupt number is 16 and the specific error
|
|
* interrupt bit in the error interrupt summary register
|
|
* is 23.
|
|
*/
|
|
memory-controller@8000 {
|
|
compatible = "fsl,p4080-memory-controller";
|
|
reg = <0x8000 0x1000>;
|
|
interrupts = <16 2 1 23>;
|
|
};
|