• Thomas Gleixner's avatar
    genirq/msi: Provide msi_domain_alloc_irq_at() · 3d393b21
    Thomas Gleixner authored
    For supporting post MSI-X enable allocations and for the upcoming PCI/IMS
    support a separate interface is required which allows not only the
    allocation of a specific index, but also the allocation of any, i.e. the
    next free index. The latter is especially required for IMS because IMS
    completely does away with index to functionality mappings which are
    often found in MSI/MSI-X implementation.
    
    But even with MSI-X there are devices where only the first few indices have
    a fixed functionality and the rest is freely assignable by software,
    e.g. to queues.
    
    msi_domain_alloc_irq_at() is also different from the range based interfaces
    as it always enforces that the MSI descriptor is allocated by the core code
    and not preallocated by the caller like the PCI/MSI[-X] enable code path
    does.
    
    msi_domain_alloc_irq_at() can be invoked with the index argument set to
    MSI_ANY_INDEX which makes the core code pick the next free index. The irq
    domain can provide a prepare_desc() operation callback in it's
    msi_domain_ops to do domain specific post allocation initialization before
    the actual Linux interrupt and the associated interrupt descriptor and
    hierarchy alloccations are conducted.
    
    The function also takes an optional @icookie argument which is of type
    union msi_instance_cookie. This cookie is not used by the core code and is
    stored in the allocated msi_desc::data::icookie. The meaning of the cookie
    is completely implementation defined. In case of IMS this might be a PASID
    or a pointer to a device queue, but for the MSI core it's opaque and not
    used in any way.
    
    The function returns a struct msi_map which on success contains the
    allocated index number and the Linux interrupt number so the caller can
    spare the index to Linux interrupt number lookup.
    
    On failure map::index contains the error code and map::virq is 0.
    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.501359457@linutronix.de
    3d393b21
msi.c 44.1 KB