s390/pci: Refactor arch_setup_msi_irqs()
Factor out adapter interrupt allocation from arch_setup_msi_irqs() in preparation for enabling registration of multiple MSIs. Code movement only, no change of functionality intended. Signed-off-by: Gerd Bayer <gbayer@linux.ibm.com> Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
57e29f4c89
commit
5fd11b96b4
@ -268,33 +268,20 @@ static void zpci_floating_irq_handler(struct airq_struct *airq,
|
||||
}
|
||||
}
|
||||
|
||||
int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||
static int __alloc_airq(struct zpci_dev *zdev, int msi_vecs,
|
||||
unsigned long *bit)
|
||||
{
|
||||
struct zpci_dev *zdev = to_zpci(pdev);
|
||||
unsigned int hwirq, msi_vecs, cpu;
|
||||
unsigned long bit;
|
||||
struct msi_desc *msi;
|
||||
struct msi_msg msg;
|
||||
int cpu_addr;
|
||||
int rc, irq;
|
||||
|
||||
zdev->aisb = -1UL;
|
||||
zdev->msi_first_bit = -1U;
|
||||
if (type == PCI_CAP_ID_MSI && nvec > 1)
|
||||
return 1;
|
||||
msi_vecs = min_t(unsigned int, nvec, zdev->max_msi);
|
||||
|
||||
if (irq_delivery == DIRECTED) {
|
||||
/* Allocate cpu vector bits */
|
||||
bit = airq_iv_alloc(zpci_ibv[0], msi_vecs);
|
||||
if (bit == -1UL)
|
||||
*bit = airq_iv_alloc(zpci_ibv[0], msi_vecs);
|
||||
if (*bit == -1UL)
|
||||
return -EIO;
|
||||
} else {
|
||||
/* Allocate adapter summary indicator bit */
|
||||
bit = airq_iv_alloc_bit(zpci_sbv);
|
||||
if (bit == -1UL)
|
||||
*bit = airq_iv_alloc_bit(zpci_sbv);
|
||||
if (*bit == -1UL)
|
||||
return -EIO;
|
||||
zdev->aisb = bit;
|
||||
zdev->aisb = *bit;
|
||||
|
||||
/* Create adapter interrupt vector */
|
||||
zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | AIRQ_IV_BITLOCK, NULL);
|
||||
@ -302,10 +289,33 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Wire up shortcut pointer */
|
||||
zpci_ibv[bit] = zdev->aibv;
|
||||
zpci_ibv[*bit] = zdev->aibv;
|
||||
/* Each function has its own interrupt vector */
|
||||
bit = 0;
|
||||
*bit = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||
{
|
||||
struct zpci_dev *zdev = to_zpci(pdev);
|
||||
unsigned int hwirq, msi_vecs, cpu;
|
||||
struct msi_desc *msi;
|
||||
struct msi_msg msg;
|
||||
unsigned long bit;
|
||||
int cpu_addr;
|
||||
int rc, irq;
|
||||
|
||||
zdev->aisb = -1UL;
|
||||
zdev->msi_first_bit = -1U;
|
||||
|
||||
if (type == PCI_CAP_ID_MSI && nvec > 1)
|
||||
return 1;
|
||||
msi_vecs = min_t(unsigned int, nvec, zdev->max_msi);
|
||||
|
||||
rc = __alloc_airq(zdev, msi_vecs, &bit);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Request MSI interrupts */
|
||||
hwirq = bit;
|
||||
|
Loading…
Reference in New Issue
Block a user