• Thomas Gleixner's avatar
    PCI/MSI: Provide IMS (Interrupt Message Store) support · 0194425a
    Thomas Gleixner authored
    IMS (Interrupt Message Store) is a new specification which allows
    implementation specific storage of MSI messages contrary to the
    strict standard specified MSI and MSI-X message stores.
    
    This requires new device specific interrupt domains to handle the
    implementation defined storage which can be an array in device memory or
    host/guest memory which is shared with hardware queues.
    
    Add a function to create IMS domains for PCI devices. IMS domains are using
    the new per device domain mechanism and are configured by the device driver
    via a template. IMS domains are created as secondary device domains so they
    work side on side with MSI[-X] on the same device.
    
    The IMS domains have a few constraints:
    
      - The index space is managed by the core code.
    
        Device memory based IMS provides a storage array with a fixed size
        which obviously requires an index. But there is no association between
        index and functionality so the core can randomly allocate an index in
        the array.
    
        System memory based IMS does not have the concept of an index as the
        storage is somewhere in memory. In that case the index is purely
        software based to keep track of the allocations.
    
      - There is no requirement for consecutive index ranges
    
        This is currently a limitation of the MSI core and can be implemented
        if there is a justified use case by changing the internal storage from
        xarray to maple_tree. For now it's single vector allocation.
    
      - The interrupt chip must provide the following callbacks:
    
      	- irq_mask()
    	- irq_unmask()
    	- irq_write_msi_msg()
    
       - The interrupt chip must provide the following optional callbacks
         when the irq_mask(), irq_unmask() and irq_write_msi_msg() callbacks
         cannot operate directly on hardware, e.g. in the case that the
         interrupt message store is in queue memory:
    
         	- irq_bus_lock()
    	- irq_bus_unlock()
    
         These callbacks are invoked from preemptible task context and are
         allowed to sleep. In this case the mandatory callbacks above just
         store the information. The irq_bus_unlock() callback is supposed to
         make the change effective before returning.
    
       - Interrupt affinity setting is handled by the underlying parent
         interrupt domain and communicated to the IMS domain via
         irq_write_msi_msg(). IMS domains cannot have a irq_set_affinity()
         callback. That's a reasonable restriction similar to the PCI/MSI
         device domain implementations.
    
    The domain is automatically destroyed when the PCI device is removed.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232326.904316841@linutronix.de
    0194425a
irqdomain.c 14.3 KB