Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 694a7a36 authored by Li Yang's avatar Li Yang Committed by Kumar Gala
Browse files

powerpc/fsl_msi: enable msi allocation in all banks



Put all fsl_msi banks in a linked list. The list of banks then can be
traversed when allocating new msi interrupts.  Also fix failing path
of fsl_setup_msi_irqs().

Signed-off-by: default avatarZhao Chenhui <b26998@freescale.com>
Signed-off-by: default avatarLi Yang <leoli@freescale.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 02adac60
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
#include <asm/mpic.h>
#include "fsl_msi.h"

LIST_HEAD(msi_head);

struct fsl_msi_feature {
	u32 fsl_pic_ip;
	u32 msiir_offset;
@@ -138,16 +140,19 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev, int hwirq,

static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
{
	int rc, hwirq = NO_IRQ;
	int rc, hwirq = -ENOMEM;
	unsigned int virq;
	struct msi_desc *entry;
	struct msi_msg msg;
	struct fsl_msi *msi_data;

	list_for_each_entry(entry, &pdev->msi_list, list) {
		msi_data = get_irq_chip_data(entry->irq);

		list_for_each_entry(msi_data, &msi_head, list) {
			hwirq = msi_bitmap_alloc_hwirqs(&msi_data->bitmap, 1);
			if (hwirq >= 0)
				break;
		}

		if (hwirq < 0) {
			rc = hwirq;
			pr_debug("%s: fail allocating msi interrupt\n",
@@ -173,6 +178,7 @@ static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
	return 0;

out_free:
	/* free by the caller of this function */
	return rc;
}

@@ -337,6 +343,8 @@ static int __devinit fsl_of_msi_probe(struct of_device *dev,
		}
	}

	list_add_tail(&msi->list, &msi_head);

	/* The multiple setting ppc_md.setup_msi_irqs will not harm things */
	if (!ppc_md.setup_msi_irqs) {
		ppc_md.setup_msi_irqs = fsl_setup_msi_irqs;
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ struct fsl_msi {
	u32 feature;

	struct msi_bitmap bitmap;

	struct list_head list;          /* support multiple MSI banks */
};

#endif /* _POWERPC_SYSDEV_FSL_MSI_H */