mirror of https://gitee.com/openkylin/linux.git
PCI/MSI/PPC: Remove arch_msi_check_device()
Move MSI checks from arch_msi_check_device() to arch_setup_msi_irqs(). This makes the code more compact and allows removing arch_msi_check_device() from generic MSI code. Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
52addcf9d6
commit
6b2fd7efeb
|
@ -136,8 +136,6 @@ struct machdep_calls {
|
||||||
int (*pci_setup_phb)(struct pci_controller *host);
|
int (*pci_setup_phb)(struct pci_controller *host);
|
||||||
|
|
||||||
#ifdef CONFIG_PCI_MSI
|
#ifdef CONFIG_PCI_MSI
|
||||||
int (*msi_check_device)(struct pci_dev* dev,
|
|
||||||
int nvec, int type);
|
|
||||||
int (*setup_msi_irqs)(struct pci_dev *dev,
|
int (*setup_msi_irqs)(struct pci_dev *dev,
|
||||||
int nvec, int type);
|
int nvec, int type);
|
||||||
void (*teardown_msi_irqs)(struct pci_dev *dev);
|
void (*teardown_msi_irqs)(struct pci_dev *dev);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
|
||||||
int arch_msi_check_device(struct pci_dev* dev, int nvec, int type)
|
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||||
{
|
{
|
||||||
if (!ppc_md.setup_msi_irqs || !ppc_md.teardown_msi_irqs) {
|
if (!ppc_md.setup_msi_irqs || !ppc_md.teardown_msi_irqs) {
|
||||||
pr_debug("msi: Platform doesn't provide MSI callbacks.\n");
|
pr_debug("msi: Platform doesn't provide MSI callbacks.\n");
|
||||||
|
@ -24,16 +24,6 @@ int arch_msi_check_device(struct pci_dev* dev, int nvec, int type)
|
||||||
if (type == PCI_CAP_ID_MSI && nvec > 1)
|
if (type == PCI_CAP_ID_MSI && nvec > 1)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (ppc_md.msi_check_device) {
|
|
||||||
pr_debug("msi: Using platform check routine.\n");
|
|
||||||
return ppc_md.msi_check_device(dev, nvec, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
|
||||||
{
|
|
||||||
return ppc_md.setup_msi_irqs(dev, nvec, type);
|
return ppc_md.setup_msi_irqs(dev, nvec, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -199,14 +199,6 @@ static struct axon_msic *find_msi_translator(struct pci_dev *dev)
|
||||||
return msic;
|
return msic;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int axon_msi_check_device(struct pci_dev *dev, int nvec, int type)
|
|
||||||
{
|
|
||||||
if (!find_msi_translator(dev))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
|
static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
|
||||||
{
|
{
|
||||||
struct device_node *dn;
|
struct device_node *dn;
|
||||||
|
@ -416,7 +408,6 @@ static int axon_msi_probe(struct platform_device *device)
|
||||||
|
|
||||||
ppc_md.setup_msi_irqs = axon_msi_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = axon_msi_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = axon_msi_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = axon_msi_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = axon_msi_check_device;
|
|
||||||
|
|
||||||
axon_msi_debug_setup(dn, msic);
|
axon_msi_debug_setup(dn, msic);
|
||||||
|
|
||||||
|
|
|
@ -46,29 +46,21 @@
|
||||||
//#define cfg_dbg(fmt...) printk(fmt)
|
//#define cfg_dbg(fmt...) printk(fmt)
|
||||||
|
|
||||||
#ifdef CONFIG_PCI_MSI
|
#ifdef CONFIG_PCI_MSI
|
||||||
static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
|
||||||
struct pnv_phb *phb = hose->private_data;
|
|
||||||
struct pci_dn *pdn = pci_get_pdn(pdev);
|
|
||||||
|
|
||||||
if (pdn && pdn->force_32bit_msi && !phb->msi32_support)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
return (phb && phb->msi_bmp.bitmap) ? 0 : -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||||
{
|
{
|
||||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||||
struct pnv_phb *phb = hose->private_data;
|
struct pnv_phb *phb = hose->private_data;
|
||||||
|
struct pci_dn *pdn = pci_get_pdn(pdev);
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
struct msi_msg msg;
|
struct msi_msg msg;
|
||||||
int hwirq;
|
int hwirq;
|
||||||
unsigned int virq;
|
unsigned int virq;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (WARN_ON(!phb))
|
if (WARN_ON(!phb) || !phb->msi_bmp.bitmap)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (pdn && pdn->force_32bit_msi && !phb->msi32_support)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
list_for_each_entry(entry, &pdev->msi_list, list) {
|
list_for_each_entry(entry, &pdev->msi_list, list) {
|
||||||
|
@ -860,7 +852,6 @@ void __init pnv_pci_init(void)
|
||||||
|
|
||||||
/* Configure MSIs */
|
/* Configure MSIs */
|
||||||
#ifdef CONFIG_PCI_MSI
|
#ifdef CONFIG_PCI_MSI
|
||||||
ppc_md.msi_check_device = pnv_msi_check_device;
|
|
||||||
ppc_md.setup_msi_irqs = pnv_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = pnv_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = pnv_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = pnv_teardown_msi_irqs;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -336,26 +336,6 @@ static int msi_quota_for_device(struct pci_dev *dev, int request)
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtas_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
int quota, rc;
|
|
||||||
|
|
||||||
if (type == PCI_CAP_ID_MSIX)
|
|
||||||
rc = check_req_msix(pdev, nvec);
|
|
||||||
else
|
|
||||||
rc = check_req_msi(pdev, nvec);
|
|
||||||
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
quota = msi_quota_for_device(pdev, nvec);
|
|
||||||
|
|
||||||
if (quota && quota < nvec)
|
|
||||||
return quota;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int check_msix_entries(struct pci_dev *pdev)
|
static int check_msix_entries(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
|
@ -397,15 +377,24 @@ static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev)
|
||||||
static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
|
static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
|
||||||
{
|
{
|
||||||
struct pci_dn *pdn;
|
struct pci_dn *pdn;
|
||||||
int hwirq, virq, i, rc;
|
int hwirq, virq, i, quota, rc;
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
struct msi_msg msg;
|
struct msi_msg msg;
|
||||||
int nvec = nvec_in;
|
int nvec = nvec_in;
|
||||||
int use_32bit_msi_hack = 0;
|
int use_32bit_msi_hack = 0;
|
||||||
|
|
||||||
pdn = pci_get_pdn(pdev);
|
if (type == PCI_CAP_ID_MSIX)
|
||||||
if (!pdn)
|
rc = check_req_msix(pdev, nvec);
|
||||||
return -ENODEV;
|
else
|
||||||
|
rc = check_req_msi(pdev, nvec);
|
||||||
|
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
quota = msi_quota_for_device(pdev, nvec);
|
||||||
|
|
||||||
|
if (quota && quota < nvec)
|
||||||
|
return quota;
|
||||||
|
|
||||||
if (type == PCI_CAP_ID_MSIX && check_msix_entries(pdev))
|
if (type == PCI_CAP_ID_MSIX && check_msix_entries(pdev))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -416,12 +405,14 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
|
||||||
*/
|
*/
|
||||||
if (type == PCI_CAP_ID_MSIX) {
|
if (type == PCI_CAP_ID_MSIX) {
|
||||||
int m = roundup_pow_of_two(nvec);
|
int m = roundup_pow_of_two(nvec);
|
||||||
int quota = msi_quota_for_device(pdev, m);
|
quota = msi_quota_for_device(pdev, m);
|
||||||
|
|
||||||
if (quota >= m)
|
if (quota >= m)
|
||||||
nvec = m;
|
nvec = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdn = pci_get_pdn(pdev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try the new more explicit firmware interface, if that fails fall
|
* Try the new more explicit firmware interface, if that fails fall
|
||||||
* back to the old interface. The old interface is known to never
|
* back to the old interface. The old interface is known to never
|
||||||
|
@ -526,7 +517,6 @@ static int rtas_msi_init(void)
|
||||||
WARN_ON(ppc_md.setup_msi_irqs);
|
WARN_ON(ppc_md.setup_msi_irqs);
|
||||||
ppc_md.setup_msi_irqs = rtas_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = rtas_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = rtas_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = rtas_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = rtas_msi_check_device;
|
|
||||||
|
|
||||||
WARN_ON(ppc_md.pci_irq_fixup);
|
WARN_ON(ppc_md.pci_irq_fixup);
|
||||||
ppc_md.pci_irq_fixup = rtas_msi_pci_irq_fixup;
|
ppc_md.pci_irq_fixup = rtas_msi_pci_irq_fixup;
|
||||||
|
|
|
@ -109,14 +109,6 @@ static int fsl_msi_init_allocator(struct fsl_msi *msi_data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsl_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
if (type == PCI_CAP_ID_MSIX)
|
|
||||||
pr_debug("fslmsi: MSI-X untested, trying anyway.\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fsl_teardown_msi_irqs(struct pci_dev *pdev)
|
static void fsl_teardown_msi_irqs(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
|
@ -173,6 +165,9 @@ static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||||
struct msi_msg msg;
|
struct msi_msg msg;
|
||||||
struct fsl_msi *msi_data;
|
struct fsl_msi *msi_data;
|
||||||
|
|
||||||
|
if (type == PCI_CAP_ID_MSIX)
|
||||||
|
pr_debug("fslmsi: MSI-X untested, trying anyway.\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the PCI node has an fsl,msi property, then we need to use it
|
* If the PCI node has an fsl,msi property, then we need to use it
|
||||||
* to find the specific MSI.
|
* to find the specific MSI.
|
||||||
|
@ -527,7 +522,6 @@ static int fsl_of_msi_probe(struct platform_device *dev)
|
||||||
if (!ppc_md.setup_msi_irqs) {
|
if (!ppc_md.setup_msi_irqs) {
|
||||||
ppc_md.setup_msi_irqs = fsl_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = fsl_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = fsl_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = fsl_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = fsl_msi_check_device;
|
|
||||||
} else if (ppc_md.setup_msi_irqs != fsl_setup_msi_irqs) {
|
} else if (ppc_md.setup_msi_irqs != fsl_setup_msi_irqs) {
|
||||||
dev_err(&dev->dev, "Different MSI driver already installed!\n");
|
dev_err(&dev->dev, "Different MSI driver already installed!\n");
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
|
|
|
@ -63,14 +63,6 @@ static struct irq_chip mpic_pasemi_msi_chip = {
|
||||||
.name = "PASEMI-MSI",
|
.name = "PASEMI-MSI",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
if (type == PCI_CAP_ID_MSIX)
|
|
||||||
pr_debug("pasemi_msi: MSI-X untested, trying anyway\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
|
static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
|
@ -97,6 +89,8 @@ static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||||
struct msi_msg msg;
|
struct msi_msg msg;
|
||||||
int hwirq;
|
int hwirq;
|
||||||
|
|
||||||
|
if (type == PCI_CAP_ID_MSIX)
|
||||||
|
pr_debug("pasemi_msi: MSI-X untested, trying anyway\n");
|
||||||
pr_debug("pasemi_msi_setup_msi_irqs, pdev %p nvec %d type %d\n",
|
pr_debug("pasemi_msi_setup_msi_irqs, pdev %p nvec %d type %d\n",
|
||||||
pdev, nvec, type);
|
pdev, nvec, type);
|
||||||
|
|
||||||
|
@ -169,7 +163,6 @@ int mpic_pasemi_msi_init(struct mpic *mpic)
|
||||||
WARN_ON(ppc_md.setup_msi_irqs);
|
WARN_ON(ppc_md.setup_msi_irqs);
|
||||||
ppc_md.setup_msi_irqs = pasemi_msi_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = pasemi_msi_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = pasemi_msi_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = pasemi_msi_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = pasemi_msi_check_device;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,22 +105,6 @@ static u64 find_u4_magic_addr(struct pci_dev *pdev, unsigned int hwirq)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int u3msi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
if (type == PCI_CAP_ID_MSIX)
|
|
||||||
pr_debug("u3msi: MSI-X untested, trying anyway.\n");
|
|
||||||
|
|
||||||
/* If we can't find a magic address then MSI ain't gonna work */
|
|
||||||
if (find_ht_magic_addr(pdev, 0) == 0 &&
|
|
||||||
find_u4_magic_addr(pdev, 0) == 0) {
|
|
||||||
pr_debug("u3msi: no magic address found for %s\n",
|
|
||||||
pci_name(pdev));
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void u3msi_teardown_msi_irqs(struct pci_dev *pdev)
|
static void u3msi_teardown_msi_irqs(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
|
@ -146,6 +130,17 @@ static int u3msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||||
u64 addr;
|
u64 addr;
|
||||||
int hwirq;
|
int hwirq;
|
||||||
|
|
||||||
|
if (type == PCI_CAP_ID_MSIX)
|
||||||
|
pr_debug("u3msi: MSI-X untested, trying anyway.\n");
|
||||||
|
|
||||||
|
/* If we can't find a magic address then MSI ain't gonna work */
|
||||||
|
if (find_ht_magic_addr(pdev, 0) == 0 &&
|
||||||
|
find_u4_magic_addr(pdev, 0) == 0) {
|
||||||
|
pr_debug("u3msi: no magic address found for %s\n",
|
||||||
|
pci_name(pdev));
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
list_for_each_entry(entry, &pdev->msi_list, list) {
|
list_for_each_entry(entry, &pdev->msi_list, list) {
|
||||||
hwirq = msi_bitmap_alloc_hwirqs(&msi_mpic->msi_bitmap, 1);
|
hwirq = msi_bitmap_alloc_hwirqs(&msi_mpic->msi_bitmap, 1);
|
||||||
if (hwirq < 0) {
|
if (hwirq < 0) {
|
||||||
|
@ -202,7 +197,6 @@ int mpic_u3msi_init(struct mpic *mpic)
|
||||||
WARN_ON(ppc_md.setup_msi_irqs);
|
WARN_ON(ppc_md.setup_msi_irqs);
|
||||||
ppc_md.setup_msi_irqs = u3msi_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = u3msi_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = u3msi_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = u3msi_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = u3msi_msi_check_device;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,12 @@ static int hsta_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||||
int irq, hwirq;
|
int irq, hwirq;
|
||||||
u64 addr;
|
u64 addr;
|
||||||
|
|
||||||
|
/* We don't support MSI-X */
|
||||||
|
if (type == PCI_CAP_ID_MSIX) {
|
||||||
|
pr_debug("%s: MSI-X not supported.\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
list_for_each_entry(entry, &dev->msi_list, list) {
|
list_for_each_entry(entry, &dev->msi_list, list) {
|
||||||
irq = msi_bitmap_alloc_hwirqs(&ppc4xx_hsta_msi.bmp, 1);
|
irq = msi_bitmap_alloc_hwirqs(&ppc4xx_hsta_msi.bmp, 1);
|
||||||
if (irq < 0) {
|
if (irq < 0) {
|
||||||
|
@ -117,17 +123,6 @@ static void hsta_teardown_msi_irqs(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hsta_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
/* We don't support MSI-X */
|
|
||||||
if (type == PCI_CAP_ID_MSIX) {
|
|
||||||
pr_debug("%s: MSI-X not supported.\n", __func__);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hsta_msi_probe(struct platform_device *pdev)
|
static int hsta_msi_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
|
@ -178,7 +173,6 @@ static int hsta_msi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ppc_md.setup_msi_irqs = hsta_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = hsta_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = hsta_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = hsta_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = hsta_msi_check_device;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out2:
|
out2:
|
||||||
|
|
|
@ -85,8 +85,12 @@ static int ppc4xx_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
struct ppc4xx_msi *msi_data = &ppc4xx_msi;
|
struct ppc4xx_msi *msi_data = &ppc4xx_msi;
|
||||||
|
|
||||||
msi_data->msi_virqs = kmalloc((msi_irqs) * sizeof(int),
|
dev_dbg(&dev->dev, "PCIE-MSI:%s called. vec %x type %d\n",
|
||||||
GFP_KERNEL);
|
__func__, nvec, type);
|
||||||
|
if (type == PCI_CAP_ID_MSIX)
|
||||||
|
pr_debug("ppc4xx msi: MSI-X untested, trying anyway.\n");
|
||||||
|
|
||||||
|
msi_data->msi_virqs = kmalloc((msi_irqs) * sizeof(int), GFP_KERNEL);
|
||||||
if (!msi_data->msi_virqs)
|
if (!msi_data->msi_virqs)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -134,16 +138,6 @@ void ppc4xx_teardown_msi_irqs(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppc4xx_msi_check_device(struct pci_dev *pdev, int nvec, int type)
|
|
||||||
{
|
|
||||||
dev_dbg(&pdev->dev, "PCIE-MSI:%s called. vec %x type %d\n",
|
|
||||||
__func__, nvec, type);
|
|
||||||
if (type == PCI_CAP_ID_MSIX)
|
|
||||||
pr_debug("ppc4xx msi: MSI-X untested, trying anyway.\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ppc4xx_setup_pcieh_hw(struct platform_device *dev,
|
static int ppc4xx_setup_pcieh_hw(struct platform_device *dev,
|
||||||
struct resource res, struct ppc4xx_msi *msi)
|
struct resource res, struct ppc4xx_msi *msi)
|
||||||
{
|
{
|
||||||
|
@ -259,7 +253,6 @@ static int ppc4xx_msi_probe(struct platform_device *dev)
|
||||||
|
|
||||||
ppc_md.setup_msi_irqs = ppc4xx_setup_msi_irqs;
|
ppc_md.setup_msi_irqs = ppc4xx_setup_msi_irqs;
|
||||||
ppc_md.teardown_msi_irqs = ppc4xx_teardown_msi_irqs;
|
ppc_md.teardown_msi_irqs = ppc4xx_teardown_msi_irqs;
|
||||||
ppc_md.msi_check_device = ppc4xx_msi_check_device;
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
error_out:
|
error_out:
|
||||||
|
|
Loading…
Reference in New Issue