xref: /linux/Documentation/devicetree/bindings/interrupt-controller/fsl,mpic-msi.yaml (revision 69f2970aad93758bea863432e49b564e0ba649ca)
1*98f79c72SJ. Neuschäfer# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2*98f79c72SJ. Neuschäfer%YAML 1.2
3*98f79c72SJ. Neuschäfer---
4*98f79c72SJ. Neuschäfer$id: http://devicetree.org/schemas/interrupt-controller/fsl,mpic-msi.yaml#
5*98f79c72SJ. Neuschäfer$schema: http://devicetree.org/meta-schemas/core.yaml#
6*98f79c72SJ. Neuschäfer
7*98f79c72SJ. Neuschäfertitle: Freescale MSI interrupt controller
8*98f79c72SJ. Neuschäfer
9*98f79c72SJ. Neuschäferdescription: |
10*98f79c72SJ. Neuschäfer  The Freescale hypervisor and msi-address-64
11*98f79c72SJ. Neuschäfer  -------------------------------------------
12*98f79c72SJ. Neuschäfer
13*98f79c72SJ. Neuschäfer  Normally, PCI devices have access to all of CCSR via an ATMU mapping.  The
14*98f79c72SJ. Neuschäfer  Freescale MSI driver calculates the address of MSIIR (in the MSI register
15*98f79c72SJ. Neuschäfer  block) and sets that address as the MSI message address.
16*98f79c72SJ. Neuschäfer
17*98f79c72SJ. Neuschäfer  In a virtualized environment, the hypervisor may need to create an IOMMU
18*98f79c72SJ. Neuschäfer  mapping for MSIIR.  The Freescale ePAPR hypervisor has this requirement
19*98f79c72SJ. Neuschäfer  because of hardware limitations of the Peripheral Access Management Unit
20*98f79c72SJ. Neuschäfer  (PAMU), which is currently the only IOMMU that the hypervisor supports.
21*98f79c72SJ. Neuschäfer  The ATMU is programmed with the guest physical address, and the PAMU
22*98f79c72SJ. Neuschäfer  intercepts transactions and reroutes them to the true physical address.
23*98f79c72SJ. Neuschäfer
24*98f79c72SJ. Neuschäfer  In the PAMU, each PCI controller is given only one primary window.  The
25*98f79c72SJ. Neuschäfer  PAMU restricts DMA operations so that they can only occur within a window.
26*98f79c72SJ. Neuschäfer  Because PCI devices must be able to DMA to memory, the primary window must
27*98f79c72SJ. Neuschäfer  be used to cover all of the guest's memory space.
28*98f79c72SJ. Neuschäfer
29*98f79c72SJ. Neuschäfer  PAMU primary windows can be divided into 256 subwindows, and each
30*98f79c72SJ. Neuschäfer  subwindow can have its own address mapping ("guest physical" to "true
31*98f79c72SJ. Neuschäfer  physical").  However, each subwindow has to have the same alignment, which
32*98f79c72SJ. Neuschäfer  means they cannot be located at just any address.  Because of these
33*98f79c72SJ. Neuschäfer  restrictions, it is usually impossible to create a 4KB subwindow that
34*98f79c72SJ. Neuschäfer  covers MSIIR where it's normally located.
35*98f79c72SJ. Neuschäfer
36*98f79c72SJ. Neuschäfer  Therefore, the hypervisor has to create a subwindow inside the same
37*98f79c72SJ. Neuschäfer  primary window used for memory, but mapped to the MSIR block (where MSIIR
38*98f79c72SJ. Neuschäfer  lives).  The first subwindow after the end of guest memory is used for
39*98f79c72SJ. Neuschäfer  this.  The address specified in the msi-address-64 property is the PCI
40*98f79c72SJ. Neuschäfer  address of MSIIR.  The hypervisor configures the PAMU to map that address to
41*98f79c72SJ. Neuschäfer  the true physical address of MSIIR.
42*98f79c72SJ. Neuschäfer
43*98f79c72SJ. Neuschäfermaintainers:
44*98f79c72SJ. Neuschäfer  - J. Neuschäfer <j.ne@posteo.net>
45*98f79c72SJ. Neuschäfer
46*98f79c72SJ. Neuschäferproperties:
47*98f79c72SJ. Neuschäfer  compatible:
48*98f79c72SJ. Neuschäfer    oneOf:
49*98f79c72SJ. Neuschäfer      - enum:
50*98f79c72SJ. Neuschäfer          - fsl,mpic-msi
51*98f79c72SJ. Neuschäfer          - fsl,mpic-msi-v4.3
52*98f79c72SJ. Neuschäfer          - fsl,ipic-msi
53*98f79c72SJ. Neuschäfer          - fsl,vmpic-msi
54*98f79c72SJ. Neuschäfer          - fsl,vmpic-msi-v4.3
55*98f79c72SJ. Neuschäfer      - items:
56*98f79c72SJ. Neuschäfer          - enum:
57*98f79c72SJ. Neuschäfer              - fsl,mpc8572-msi
58*98f79c72SJ. Neuschäfer              - fsl,mpc8610-msi
59*98f79c72SJ. Neuschäfer              - fsl,mpc8641-msi
60*98f79c72SJ. Neuschäfer          - const: fsl,mpic-msi
61*98f79c72SJ. Neuschäfer
62*98f79c72SJ. Neuschäfer  reg:
63*98f79c72SJ. Neuschäfer    minItems: 1
64*98f79c72SJ. Neuschäfer    items:
65*98f79c72SJ. Neuschäfer      - description: Address and length of the shared message interrupt
66*98f79c72SJ. Neuschäfer          register set
67*98f79c72SJ. Neuschäfer      - description: Address of aliased MSIIR or MSIIR1 register for platforms
68*98f79c72SJ. Neuschäfer          that have such an alias. If using MSIIR1, the second region must be
69*98f79c72SJ. Neuschäfer          added because different MSI group has different MSIIR1 offset.
70*98f79c72SJ. Neuschäfer
71*98f79c72SJ. Neuschäfer  interrupts:
72*98f79c72SJ. Neuschäfer    minItems: 1
73*98f79c72SJ. Neuschäfer    maxItems: 16
74*98f79c72SJ. Neuschäfer    description:
75*98f79c72SJ. Neuschäfer      Each one of the interrupts here is one entry per 32 MSIs, and routed to
76*98f79c72SJ. Neuschäfer      the host interrupt controller. The interrupts should be set as edge
77*98f79c72SJ. Neuschäfer      sensitive. If msi-available-ranges is present, only the interrupts that
78*98f79c72SJ. Neuschäfer      correspond to available ranges shall be present.
79*98f79c72SJ. Neuschäfer
80*98f79c72SJ. Neuschäfer  msi-available-ranges:
81*98f79c72SJ. Neuschäfer    $ref: /schemas/types.yaml#/definitions/uint32-matrix
82*98f79c72SJ. Neuschäfer    items:
83*98f79c72SJ. Neuschäfer      items:
84*98f79c72SJ. Neuschäfer        - description: First MSI interrupt in this range
85*98f79c72SJ. Neuschäfer        - description: Number of MSI interrupts in this range
86*98f79c72SJ. Neuschäfer    description:
87*98f79c72SJ. Neuschäfer      Define which MSI interrupt can be used in the 256 MSI interrupts.
88*98f79c72SJ. Neuschäfer      If not specified, all the MSI interrupts can be used.
89*98f79c72SJ. Neuschäfer      Each available range must begin and end on a multiple of 32 (i.e. no
90*98f79c72SJ. Neuschäfer      splitting an individual MSI register or the associated PIC interrupt).
91*98f79c72SJ. Neuschäfer
92*98f79c72SJ. Neuschäfer  msi-address-64:
93*98f79c72SJ. Neuschäfer    $ref: /schemas/types.yaml#/definitions/uint64
94*98f79c72SJ. Neuschäfer    description:
95*98f79c72SJ. Neuschäfer      64-bit PCI address of the MSIIR register. The MSIIR register is used for
96*98f79c72SJ. Neuschäfer      MSI messaging.  The address of MSIIR in PCI address space is the MSI
97*98f79c72SJ. Neuschäfer      message address.
98*98f79c72SJ. Neuschäfer
99*98f79c72SJ. Neuschäfer      This property may be used in virtualized environments where the hypervisor
100*98f79c72SJ. Neuschäfer      has created an alternate mapping for the MSIR block.  See the top-level
101*98f79c72SJ. Neuschäfer      description for an explanation.
102*98f79c72SJ. Neuschäfer
103*98f79c72SJ. Neuschäferrequired:
104*98f79c72SJ. Neuschäfer  - compatible
105*98f79c72SJ. Neuschäfer  - reg
106*98f79c72SJ. Neuschäfer  - interrupts
107*98f79c72SJ. Neuschäfer
108*98f79c72SJ. NeuschäferallOf:
109*98f79c72SJ. Neuschäfer  - if:
110*98f79c72SJ. Neuschäfer      properties:
111*98f79c72SJ. Neuschäfer        compatible:
112*98f79c72SJ. Neuschäfer          contains:
113*98f79c72SJ. Neuschäfer            enum:
114*98f79c72SJ. Neuschäfer              - fsl,mpic-msi-v4.3
115*98f79c72SJ. Neuschäfer              - fsl,vmpic-msi-v4.3
116*98f79c72SJ. Neuschäfer    then:
117*98f79c72SJ. Neuschäfer      properties:
118*98f79c72SJ. Neuschäfer        interrupts:
119*98f79c72SJ. Neuschäfer          minItems: 16
120*98f79c72SJ. Neuschäfer          description:
121*98f79c72SJ. Neuschäfer            Version 4.3 implies that there are 16 shared interrupts, and they
122*98f79c72SJ. Neuschäfer            are configured through MSIIR1.
123*98f79c72SJ. Neuschäfer
124*98f79c72SJ. Neuschäfer        # MPIC v4.3 does not support this property because the 32 interrupts of
125*98f79c72SJ. Neuschäfer        # an individual register are not continuous when using MSIIR1.
126*98f79c72SJ. Neuschäfer        msi-available-ranges: false
127*98f79c72SJ. Neuschäfer
128*98f79c72SJ. Neuschäfer        reg:
129*98f79c72SJ. Neuschäfer          minItems: 2
130*98f79c72SJ. Neuschäfer
131*98f79c72SJ. Neuschäfer    else:
132*98f79c72SJ. Neuschäfer      properties:
133*98f79c72SJ. Neuschäfer        interrupts:
134*98f79c72SJ. Neuschäfer          maxItems: 8
135*98f79c72SJ. Neuschäfer          description:
136*98f79c72SJ. Neuschäfer            In versions before 4.3, only 8 shared interrupts are available, and
137*98f79c72SJ. Neuschäfer            they are configured through MSIIR.
138*98f79c72SJ. Neuschäfer
139*98f79c72SJ. NeuschäferunevaluatedProperties: false
140*98f79c72SJ. Neuschäfer
141*98f79c72SJ. Neuschäferexamples:
142*98f79c72SJ. Neuschäfer  - |
143*98f79c72SJ. Neuschäfer    msi@41600 {
144*98f79c72SJ. Neuschäfer            compatible = "fsl,mpc8610-msi", "fsl,mpic-msi";
145*98f79c72SJ. Neuschäfer            reg = <0x41600 0x80>;
146*98f79c72SJ. Neuschäfer            msi-available-ranges = <0 0x100>;
147*98f79c72SJ. Neuschäfer            interrupts = <0xe0 0>, <0xe1 0>, <0xe2 0>, <0xe3 0>,
148*98f79c72SJ. Neuschäfer                         <0xe4 0>, <0xe5 0>, <0xe6 0>, <0xe7 0>;
149*98f79c72SJ. Neuschäfer    };
150*98f79c72SJ. Neuschäfer
151*98f79c72SJ. Neuschäfer  - |
152*98f79c72SJ. Neuschäfer    msi@41600 {
153*98f79c72SJ. Neuschäfer            compatible = "fsl,mpic-msi-v4.3";
154*98f79c72SJ. Neuschäfer            reg = <0x41600 0x200>, <0x44148 4>;
155*98f79c72SJ. Neuschäfer            interrupts = <0xe0 0 0 0>, <0xe1 0 0 0>, <0xe2 0 0 0>, <0xe3 0 0 0>,
156*98f79c72SJ. Neuschäfer                         <0xe4 0 0 0>, <0xe5 0 0 0>, <0xe6 0 0 0>, <0xe7 0 0 0>,
157*98f79c72SJ. Neuschäfer                         <0x100 0 0 0>, <0x101 0 0 0>, <0x102 0 0 0>, <0x103 0 0 0>,
158*98f79c72SJ. Neuschäfer                         <0x104 0 0 0>, <0x105 0 0 0>, <0x106 0 0 0>, <0x107 0 0 0>;
159*98f79c72SJ. Neuschäfer    };
160*98f79c72SJ. Neuschäfer
161*98f79c72SJ. Neuschäfer...
162