mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 01:04:19 +08:00
PCI/MSI: Move pci_irq_get_affinity() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are now to be grouped in one file, api.c. Move pci_irq_get_affinity() and let its kernel-doc match rest of the file. Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Link: https://lore.kernel.org/r/20221111122015.214792769@linutronix.de
This commit is contained in:
parent
18e1926b8c
commit
be37b8428b
@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
|
|
||||||
@ -250,6 +251,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_irq_vector);
|
EXPORT_SYMBOL(pci_irq_vector);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pci_irq_get_affinity() - Get a device interrupt vector affinity
|
||||||
|
* @dev: the PCI device to operate on
|
||||||
|
* @nr: device-relative interrupt vector index (0-based); has different
|
||||||
|
* meanings, depending on interrupt mode
|
||||||
|
* MSI-X the index in the MSI-X vector table
|
||||||
|
* MSI the index of the enabled MSI vectors
|
||||||
|
* INTx must be 0
|
||||||
|
*
|
||||||
|
* Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
|
||||||
|
* the MSI(-X) vector was allocated without explicit affinity
|
||||||
|
* requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
|
||||||
|
* pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
|
||||||
|
* generic set of CPU IDs representing all possible CPUs available
|
||||||
|
* during system boot if the device is in legacy INTx mode.
|
||||||
|
*/
|
||||||
|
const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
|
||||||
|
{
|
||||||
|
int idx, irq = pci_irq_vector(dev, nr);
|
||||||
|
struct msi_desc *desc;
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(irq <= 0))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
desc = irq_get_msi_desc(irq);
|
||||||
|
/* Non-MSI does not have the information handy */
|
||||||
|
if (!desc)
|
||||||
|
return cpu_possible_mask;
|
||||||
|
|
||||||
|
/* MSI[X] interrupts can be allocated without affinity descriptor */
|
||||||
|
if (!desc->affinity)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MSI has a mask array in the descriptor.
|
||||||
|
* MSI-X has a single mask.
|
||||||
|
*/
|
||||||
|
idx = dev->msi_enabled ? nr : 0;
|
||||||
|
return &desc->affinity[idx].mask;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(pci_irq_get_affinity);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
|
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
|
||||||
* @dev: the PCI device to operate on
|
* @dev: the PCI device to operate on
|
||||||
|
@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pci_irq_get_affinity - return the affinity of a particular MSI vector
|
|
||||||
* @dev: PCI device to operate on
|
|
||||||
* @nr: device-relative interrupt vector index (0-based).
|
|
||||||
*
|
|
||||||
* @nr has the following meanings depending on the interrupt mode:
|
|
||||||
* MSI-X: The index in the MSI-X vector table
|
|
||||||
* MSI: The index of the enabled MSI vectors
|
|
||||||
* INTx: Must be 0
|
|
||||||
*
|
|
||||||
* Return: A cpumask pointer or NULL if @nr is out of range
|
|
||||||
*/
|
|
||||||
const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
|
|
||||||
{
|
|
||||||
int idx, irq = pci_irq_vector(dev, nr);
|
|
||||||
struct msi_desc *desc;
|
|
||||||
|
|
||||||
if (WARN_ON_ONCE(irq <= 0))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
desc = irq_get_msi_desc(irq);
|
|
||||||
/* Non-MSI does not have the information handy */
|
|
||||||
if (!desc)
|
|
||||||
return cpu_possible_mask;
|
|
||||||
|
|
||||||
/* MSI[X] interrupts can be allocated without affinity descriptor */
|
|
||||||
if (!desc->affinity)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MSI has a mask array in the descriptor.
|
|
||||||
* MSI-X has a single mask.
|
|
||||||
*/
|
|
||||||
idx = dev->msi_enabled ? nr : 0;
|
|
||||||
return &desc->affinity[idx].mask;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(pci_irq_get_affinity);
|
|
||||||
|
|
||||||
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
|
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
|
||||||
{
|
{
|
||||||
return to_pci_dev(desc->dev);
|
return to_pci_dev(desc->dev);
|
||||||
|
Loading…
Reference in New Issue
Block a user