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

Commit df87ef55 authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras
Browse files

[POWERPC] PowerPC MSI infrastructure



This provides the architecture specific hooks to support MSI on
powerpc.  We implement the newly added arch_setup_msi_irqs() and
arch_teardown_msi_irqs(), and then delegate to ppc_md routines.

Platforms that don't implement MSI will leave the ppc_md calls blank,
arch_msi_check_device() will detect this and return ENOSYS. Drivers
should detect this error and continue to use LSI.

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent f728b5c3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -682,6 +682,7 @@ config PCI
		&& !PPC_85xx && !PPC_86xx
	default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
	default PCI_QSPAN if !4xx && !CPM2 && 8xx
	select ARCH_SUPPORTS_MSI
	help
	  Find out whether your system includes a PCI bus. PCI is the name of
	  a bus system, i.e. the way the CPU talks to the other stuff inside
+1 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ obj-$(CONFIG_MODULES) += $(module-y)
pci64-$(CONFIG_PPC64)		+= pci_64.o pci_dn.o
pci32-$(CONFIG_PPC32)		:= pci_32.o
obj-$(CONFIG_PCI)		+= $(pci64-y) $(pci32-y)
obj-$(CONFIG_PCI_MSI)		+= msi.o
kexec-$(CONFIG_PPC64)		:= machine_kexec_64.o
kexec-$(CONFIG_PPC32)		:= machine_kexec_32.o
obj-$(CONFIG_KEXEC)		+= machine_kexec.o crash.o $(kexec-y)
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright 2006-2007, Michael Ellerman, IBM Corporation.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/msi.h>

#include <asm/machdep.h>

int arch_msi_check_device(struct pci_dev* dev, int nvec, int type)
{
	if (!ppc_md.setup_msi_irqs || !ppc_md.teardown_msi_irqs) {
		pr_debug("msi: Platform doesn't provide MSI callbacks.\n");
		return -ENOSYS;
	}

	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);
}

void arch_teardown_msi_irqs(struct pci_dev *dev)
{
	return ppc_md.teardown_msi_irqs(dev);
}
+8 −0
Original line number Diff line number Diff line
@@ -120,6 +120,14 @@ struct machdep_calls {
	/* To setup PHBs when using automatic OF platform driver for PCI */
	int		(*pci_setup_phb)(struct pci_controller *host);

#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 nvec, int type);
	void		(*teardown_msi_irqs)(struct pci_dev *dev);
#endif

	void		(*restart)(char *cmd);
	void		(*power_off)(void);
	void		(*halt)(void);