* Freescale MSI interrupt controller 
 | 
  
 | 
Required properties: 
 | 
- compatible : compatible list, may contain one or two entries 
 | 
  The first is "fsl,CHIP-msi", where CHIP is the processor(mpc8610, mpc8572, 
 | 
  etc.) and the second is "fsl,mpic-msi" or "fsl,ipic-msi" or 
 | 
  "fsl,mpic-msi-v4.3" depending on the parent type and version. If mpic 
 | 
  version is 4.3, the number of MSI registers is increased to 16, MSIIR1 is 
 | 
  provided to access these 16 registers, and compatible "fsl,mpic-msi-v4.3" 
 | 
  should be used. The first entry is optional; the second entry is 
 | 
  required. 
 | 
  
 | 
- reg : It may contain one or two regions. The first region should contain 
 | 
  the address and the length of the shared message interrupt register set. 
 | 
  The second region should contain the address of aliased MSIIR or MSIIR1 
 | 
  register for platforms that have such an alias, if using MSIIR1, the second 
 | 
  region must be added because different MSI group has different MSIIR1 offset. 
 | 
  
 | 
- interrupts : each one of the interrupts here is one entry per 32 MSIs, 
 | 
  and routed to the host interrupt controller. the interrupts should 
 | 
  be set as edge sensitive.  If msi-available-ranges is present, only 
 | 
  the interrupts that correspond to available ranges shall be present. 
 | 
  
 | 
Optional properties: 
 | 
- msi-available-ranges: use <start count> style section to define which 
 | 
  msi interrupt can be used in the 256 msi interrupts. This property is 
 | 
  optional, without this, all the MSI interrupts can be used. 
 | 
  Each available range must begin and end on a multiple of 32 (i.e. 
 | 
  no splitting an individual MSI register or the associated PIC interrupt). 
 | 
  MPIC v4.3 does not support this property because the 32 interrupts of an 
 | 
  individual register are not continuous when using MSIIR1. 
 | 
  
 | 
- msi-address-64: 64-bit PCI address of the MSIIR register. The MSIIR register 
 | 
  is used for MSI messaging.  The address of MSIIR in PCI address space is 
 | 
  the MSI message address. 
 | 
  
 | 
  This property may be used in virtualized environments where the hypervisor 
 | 
  has created an alternate mapping for the MSIR block.  See below for an 
 | 
  explanation. 
 | 
  
 | 
  
 | 
Example: 
 | 
    msi@41600 { 
 | 
        compatible = "fsl,mpc8610-msi", "fsl,mpic-msi"; 
 | 
        reg = <0x41600 0x80>; 
 | 
        msi-available-ranges = <0 0x100>; 
 | 
        interrupts = < 
 | 
            0xe0 0 
 | 
            0xe1 0 
 | 
            0xe2 0 
 | 
            0xe3 0 
 | 
            0xe4 0 
 | 
            0xe5 0 
 | 
            0xe6 0 
 | 
            0xe7 0>; 
 | 
        interrupt-parent = <&mpic>; 
 | 
    }; 
 | 
  
 | 
    msi@41600 { 
 | 
        compatible = "fsl,mpic-msi-v4.3"; 
 | 
        reg = <0x41600 0x200 0x44148 4>; 
 | 
        interrupts = < 
 | 
            0xe0 0 0 0 
 | 
            0xe1 0 0 0 
 | 
            0xe2 0 0 0 
 | 
            0xe3 0 0 0 
 | 
            0xe4 0 0 0 
 | 
            0xe5 0 0 0 
 | 
            0xe6 0 0 0 
 | 
            0xe7 0 0 0 
 | 
            0x100 0 0 0 
 | 
            0x101 0 0 0 
 | 
            0x102 0 0 0 
 | 
            0x103 0 0 0 
 | 
            0x104 0 0 0 
 | 
            0x105 0 0 0 
 | 
            0x106 0 0 0 
 | 
            0x107 0 0 0>; 
 | 
    }; 
 | 
  
 | 
The Freescale hypervisor and msi-address-64 
 | 
------------------------------------------- 
 | 
Normally, PCI devices have access to all of CCSR via an ATMU mapping.  The 
 | 
Freescale MSI driver calculates the address of MSIIR (in the MSI register 
 | 
block) and sets that address as the MSI message address. 
 | 
  
 | 
In a virtualized environment, the hypervisor may need to create an IOMMU 
 | 
mapping for MSIIR.  The Freescale ePAPR hypervisor has this requirement 
 | 
because of hardware limitations of the Peripheral Access Management Unit 
 | 
(PAMU), which is currently the only IOMMU that the hypervisor supports. 
 | 
The ATMU is programmed with the guest physical address, and the PAMU 
 | 
intercepts transactions and reroutes them to the true physical address. 
 | 
  
 | 
In the PAMU, each PCI controller is given only one primary window.  The 
 | 
PAMU restricts DMA operations so that they can only occur within a window. 
 | 
Because PCI devices must be able to DMA to memory, the primary window must 
 | 
be used to cover all of the guest's memory space. 
 | 
  
 | 
PAMU primary windows can be divided into 256 subwindows, and each 
 | 
subwindow can have its own address mapping ("guest physical" to "true 
 | 
physical").  However, each subwindow has to have the same alignment, which 
 | 
means they cannot be located at just any address.  Because of these 
 | 
restrictions, it is usually impossible to create a 4KB subwindow that 
 | 
covers MSIIR where it's normally located. 
 | 
  
 | 
Therefore, the hypervisor has to create a subwindow inside the same 
 | 
primary window used for memory, but mapped to the MSIR block (where MSIIR 
 | 
lives).  The first subwindow after the end of guest memory is used for 
 | 
this.  The address specified in the msi-address-64 property is the PCI 
 | 
address of MSIIR.  The hypervisor configures the PAMU to map that address to 
 | 
the true physical address of MSIIR. 
 |