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