mirror of
https://github.com/torvalds/linux
synced 2024-09-20 02:57:25 +00:00
genirq/msi: Provide msi_match_device_domain()
Provide an interface to match a per device domain bus token. This allows to query which type of domain is installed for a particular domain id. Will be used for PCI to avoid frequent create/remove cycles for the MSI resp. MSI-X domains. 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/20221124232325.738047902@linutronix.de
This commit is contained in:
parent
27a6dea3eb
commit
26e91b75bf
|
@ -553,6 +553,9 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
|
||||||
void *chip_data);
|
void *chip_data);
|
||||||
void msi_remove_device_irq_domain(struct device *dev, unsigned int domid);
|
void msi_remove_device_irq_domain(struct device *dev, unsigned int domid);
|
||||||
|
|
||||||
|
bool msi_match_device_irq_domain(struct device *dev, unsigned int domid,
|
||||||
|
enum irq_domain_bus_token bus_token);
|
||||||
|
|
||||||
int msi_domain_alloc_irqs_range_locked(struct device *dev, unsigned int domid,
|
int msi_domain_alloc_irqs_range_locked(struct device *dev, unsigned int domid,
|
||||||
unsigned int first, unsigned int last);
|
unsigned int first, unsigned int last);
|
||||||
int msi_domain_alloc_irqs_range(struct device *dev, unsigned int domid,
|
int msi_domain_alloc_irqs_range(struct device *dev, unsigned int domid,
|
||||||
|
|
|
@ -986,6 +986,31 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
|
||||||
msi_unlock_descs(dev);
|
msi_unlock_descs(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* msi_match_device_irq_domain - Match a device irq domain against a bus token
|
||||||
|
* @dev: Pointer to the device
|
||||||
|
* @domid: Domain id
|
||||||
|
* @bus_token: Bus token to match against the domain bus token
|
||||||
|
*
|
||||||
|
* Return: True if device domain exists and bus tokens match.
|
||||||
|
*/
|
||||||
|
bool msi_match_device_irq_domain(struct device *dev, unsigned int domid,
|
||||||
|
enum irq_domain_bus_token bus_token)
|
||||||
|
{
|
||||||
|
struct msi_domain_info *info;
|
||||||
|
struct irq_domain *domain;
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
msi_lock_descs(dev);
|
||||||
|
domain = msi_get_device_domain(dev, domid);
|
||||||
|
if (domain && irq_domain_is_msi_device(domain)) {
|
||||||
|
info = domain->host_data;
|
||||||
|
ret = info->bus_token == bus_token;
|
||||||
|
}
|
||||||
|
msi_unlock_descs(dev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
|
int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
|
||||||
int nvec, msi_alloc_info_t *arg)
|
int nvec, msi_alloc_info_t *arg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue