mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-28 15:13:55 +08:00
4287d824f2
Until now, the MSI architecture-specific functions could be overloaded using a fairly complex set of #define and compile-time conditionals. In order to prepare for the introduction of the msi_chip infrastructure, it is desirable to switch all those functions to use the 'weak' mechanism. This commit converts all the architectures that were overidding those MSI functions to use the new strategy. Note that we keep two separate, non-weak, functions default_teardown_msi_irqs() and default_restore_msi_irqs() for the default behavior of the arch_teardown_msi_irqs() and arch_restore_msi_irqs(), as the default behavior is needed by x86 PCI code. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Tested-by: Daniel Price <daniel.price@gmail.com> Tested-by: Thierry Reding <thierry.reding@gmail.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: linuxppc-dev@lists.ozlabs.org Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: linux390@de.ibm.com Cc: linux-s390@vger.kernel.org Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: x86@kernel.org Cc: Russell King <linux@arm.linux.org.uk> Cc: Tony Luck <tony.luck@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: linux-ia64@vger.kernel.org Cc: Ralf Baechle <ralf@linux-mips.org> Cc: linux-mips@linux-mips.org Cc: David S. Miller <davem@davemloft.net> Cc: sparclinux@vger.kernel.org Cc: Chris Metcalf <cmetcalf@tilera.com> Signed-off-by: Jason Cooper <jason@lakedaemon.net>
69 lines
2.1 KiB
C
69 lines
2.1 KiB
C
#ifndef LINUX_MSI_H
|
|
#define LINUX_MSI_H
|
|
|
|
#include <linux/kobject.h>
|
|
#include <linux/list.h>
|
|
|
|
struct msi_msg {
|
|
u32 address_lo; /* low 32 bits of msi message address */
|
|
u32 address_hi; /* high 32 bits of msi message address */
|
|
u32 data; /* 16 bits of msi message data */
|
|
};
|
|
|
|
/* Helper functions */
|
|
struct irq_data;
|
|
struct msi_desc;
|
|
void mask_msi_irq(struct irq_data *data);
|
|
void unmask_msi_irq(struct irq_data *data);
|
|
void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
|
|
void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
|
|
void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
|
|
void read_msi_msg(unsigned int irq, struct msi_msg *msg);
|
|
void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
|
|
void write_msi_msg(unsigned int irq, struct msi_msg *msg);
|
|
|
|
struct msi_desc {
|
|
struct {
|
|
__u8 is_msix : 1;
|
|
__u8 multiple: 3; /* log2 number of messages */
|
|
__u8 maskbit : 1; /* mask-pending bit supported ? */
|
|
__u8 is_64 : 1; /* Address size: 0=32bit 1=64bit */
|
|
__u8 pos; /* Location of the msi capability */
|
|
__u16 entry_nr; /* specific enabled entry */
|
|
unsigned default_irq; /* default pre-assigned irq */
|
|
} msi_attrib;
|
|
|
|
u32 masked; /* mask bits */
|
|
unsigned int irq;
|
|
unsigned int nvec_used; /* number of messages */
|
|
struct list_head list;
|
|
|
|
union {
|
|
void __iomem *mask_base;
|
|
u8 mask_pos;
|
|
};
|
|
struct pci_dev *dev;
|
|
|
|
/* Last set MSI message */
|
|
struct msi_msg msg;
|
|
|
|
struct kobject kobj;
|
|
};
|
|
|
|
/*
|
|
* The arch hooks to setup up msi irqs. Those functions are
|
|
* implemented as weak symbols so that they /can/ be overriden by
|
|
* architecture specific code if needed.
|
|
*/
|
|
int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
|
|
void arch_teardown_msi_irq(unsigned int irq);
|
|
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
|
|
void arch_teardown_msi_irqs(struct pci_dev *dev);
|
|
int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);
|
|
void arch_restore_msi_irqs(struct pci_dev *dev, int irq);
|
|
|
|
void default_teardown_msi_irqs(struct pci_dev *dev);
|
|
void default_restore_msi_irqs(struct pci_dev *dev, int irq);
|
|
|
|
#endif /* LINUX_MSI_H */
|