Files
lkl_linux/include/linux/msi_api.h
Thomas Gleixner efd4204965 genirq/msi: Provide msi_desc:: Msi_data
The upcoming support for PCI/IMS requires to store some information related
to the message handling in the MSI descriptor, e.g. PASID or a pointer to a
queue.

Provide a generic storage struct which maps over the existing PCI specific
storage which means the size of struct msi_desc is not getting bigger.

This storage struct has two elements:

  1) msi_domain_cookie
  2) msi_instance_cookie

The domain cookie is going to be used to store domain specific information,
e.g. iobase pointer, data pointer.

The instance cookie is going to be handed in when allocating an interrupt
on an IMS domain so the irq chip callbacks of the IMS domain have the
necessary per vector information available. It also comes in handy when
cleaning up the platform MSI code for wire to MSI bridges which need to
hand down the type information to the underlying interrupt domain.

For the core code the cookies are opaque and meaningless. It just stores
the instance cookie during an allocation through the upcoming interfaces
for IMS and wire to MSI brigdes.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221124232326.385036043@linutronix.de
2022-12-05 22:22:33 +01:00

66 lines
1.7 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef LINUX_MSI_API_H
#define LINUX_MSI_API_H
/*
* APIs which are relevant for device driver code for allocating and
* freeing MSI interrupts and querying the associations between
* hardware/software MSI indices and the Linux interrupt number.
*/
struct device;
/*
* Per device interrupt domain related constants.
*/
enum msi_domain_ids {
MSI_DEFAULT_DOMAIN,
MSI_MAX_DEVICE_IRQDOMAINS,
};
/**
* union msi_instance_cookie - MSI instance cookie
* @value: u64 value store
* @ptr: Pointer to usage site specific data
*
* This cookie is handed to the IMS allocation function and stored in the
* MSI descriptor for the interrupt chip callbacks.
*
* The content of this cookie is MSI domain implementation defined. For
* PCI/IMS implementations this could be a PASID or a pointer to queue
* memory.
*/
union msi_instance_cookie {
u64 value;
void *ptr;
};
/**
* msi_map - Mapping between MSI index and Linux interrupt number
* @index: The MSI index, e.g. slot in the MSI-X table or
* a software managed index if >= 0. If negative
* the allocation function failed and it contains
* the error code.
* @virq: The associated Linux interrupt number
*/
struct msi_map {
int index;
int virq;
};
unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigned int index);
/**
* msi_get_virq - Lookup the Linux interrupt number for a MSI index on the default interrupt domain
* @dev: Device for which the lookup happens
* @index: The MSI index to lookup
*
* Return: The Linux interrupt number on success (> 0), 0 if not found
*/
static inline unsigned int msi_get_virq(struct device *dev, unsigned int index)
{
return msi_domain_get_virq(dev, MSI_DEFAULT_DOMAIN, index);
}
#endif