From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oa0-x22d.google.com (mail-oa0-x22d.google.com [IPv6:2607:f8b0:4003:c02::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 78A2A2C009A for ; Sat, 6 Jul 2013 07:32:37 +1000 (EST) Received: by mail-oa0-f45.google.com with SMTP id j1so3905069oag.4 for ; Fri, 05 Jul 2013 14:32:33 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1372686136-1370-3-git-send-email-thomas.petazzoni@free-electrons.com> References: <1372686136-1370-1-git-send-email-thomas.petazzoni@free-electrons.com> <1372686136-1370-3-git-send-email-thomas.petazzoni@free-electrons.com> From: Bjorn Helgaas Date: Fri, 5 Jul 2013 15:32:13 -0600 Message-ID: Subject: Re: [PATCHv4 02/11] pci: use weak functions for MSI arch-specific functions To: Thomas Petazzoni Content-Type: text/plain; charset=ISO-8859-1 Cc: Lior Amsalem , Andrew Lunn , "linux-ia64@vger.kernel.org" , "linux-mips@linux-mips.org" , "linux-pci@vger.kernel.org" , Heiko Carstens , Thierry Reding , Paul Mackerras , "H. Peter Anvin" , sparclinux@vger.kernel.org, linux-s390@vger.kernel.org, Russell King , "x86@kernel.org" , Ingo Molnar , Ezequiel Garcia , Fenghua Yu , Jason Cooper , Rob Herring , Chris Metcalf , Gregory Clement , Thomas Gleixner , linux-arm , Tony Luck , Ralf Baechle , Maen Suleiman , Martin Schwidefsky , linux390@de.ibm.com, linuxppc-dev , "David S. Miller" List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Mon, Jul 1, 2013 at 7:42 AM, Thomas Petazzoni wrote: > 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 a separate, non-weak, function > default_teardown_msi_irqs() for the default behavior of the > arch_teardown_msi_irqs(), as the default behavior is needed by the Xen > x86 PCI code. > > Signed-off-by: Thomas Petazzoni > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: linuxppc-dev@lists.ozlabs.org > Cc: Martin Schwidefsky > Cc: Heiko Carstens > Cc: linux390@de.ibm.com > Cc: linux-s390@vger.kernel.org > Cc: Thomas Gleixner > Cc: Ingo Molnar > Cc: H. Peter Anvin > Cc: x86@kernel.org > Cc: Russell King > Cc: Tony Luck > Cc: Fenghua Yu > Cc: linux-ia64@vger.kernel.org > Cc: Ralf Baechle > Cc: linux-mips@linux-mips.org > Cc: David S. Miller > Cc: sparclinux@vger.kernel.org > Cc: Chris Metcalf Acked-by: Bjorn Helgaas > --- > arch/mips/include/asm/pci.h | 5 ----- > arch/powerpc/include/asm/pci.h | 5 ----- > arch/s390/include/asm/pci.h | 4 ---- > arch/x86/include/asm/pci.h | 28 -------------------------- > arch/x86/kernel/x86_init.c | 21 ++++++++++++++++++++ > drivers/pci/msi.c | 45 +++++++++++++++++++----------------------- > include/linux/msi.h | 7 ++++++- > 7 files changed, 47 insertions(+), 68 deletions(-) > > diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h > index b8e24fd..031f4c1 100644 > --- a/arch/mips/include/asm/pci.h > +++ b/arch/mips/include/asm/pci.h > @@ -137,11 +137,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) > return channel ? 15 : 14; > } > > -#ifdef CONFIG_CPU_CAVIUM_OCTEON > -/* MSI arch hook for OCTEON */ > -#define arch_setup_msi_irqs arch_setup_msi_irqs > -#endif > - > extern char * (*pcibios_plat_setup)(char *str); > > #ifdef CONFIG_OF > diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h > index 6653f27..95145a1 100644 > --- a/arch/powerpc/include/asm/pci.h > +++ b/arch/powerpc/include/asm/pci.h > @@ -113,11 +113,6 @@ extern int pci_domain_nr(struct pci_bus *bus); > /* Decide whether to display the domain number in /proc */ > extern int pci_proc_domain(struct pci_bus *bus); > > -/* MSI arch hooks */ > -#define arch_setup_msi_irqs arch_setup_msi_irqs > -#define arch_teardown_msi_irqs arch_teardown_msi_irqs > -#define arch_msi_check_device arch_msi_check_device > - > struct vm_area_struct; > /* Map a range of PCI memory or I/O space for a device into user space */ > int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, > diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h > index 6c18012..8641e8d 100644 > --- a/arch/s390/include/asm/pci.h > +++ b/arch/s390/include/asm/pci.h > @@ -21,10 +21,6 @@ void pci_iounmap(struct pci_dev *, void __iomem *); > int pci_domain_nr(struct pci_bus *); > int pci_proc_domain(struct pci_bus *); > > -/* MSI arch hooks */ > -#define arch_setup_msi_irqs arch_setup_msi_irqs > -#define arch_teardown_msi_irqs arch_teardown_msi_irqs > - > #define ZPCI_BUS_NR 0 /* default bus number */ > #define ZPCI_DEVFN 0 /* default device number */ > > diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h > index d9e9e6c..8c61de0 100644 > --- a/arch/x86/include/asm/pci.h > +++ b/arch/x86/include/asm/pci.h > @@ -100,29 +100,6 @@ static inline void early_quirks(void) { } > extern void pci_iommu_alloc(void); > > #ifdef CONFIG_PCI_MSI > -/* MSI arch specific hooks */ > -static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) > -{ > - return x86_msi.setup_msi_irqs(dev, nvec, type); > -} > - > -static inline void x86_teardown_msi_irqs(struct pci_dev *dev) > -{ > - x86_msi.teardown_msi_irqs(dev); > -} > - > -static inline void x86_teardown_msi_irq(unsigned int irq) > -{ > - x86_msi.teardown_msi_irq(irq); > -} > -static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq) > -{ > - x86_msi.restore_msi_irqs(dev, irq); > -} > -#define arch_setup_msi_irqs x86_setup_msi_irqs > -#define arch_teardown_msi_irqs x86_teardown_msi_irqs > -#define arch_teardown_msi_irq x86_teardown_msi_irq > -#define arch_restore_msi_irqs x86_restore_msi_irqs > /* implemented in arch/x86/kernel/apic/io_apic. */ > struct msi_desc; > int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); > @@ -130,11 +107,6 @@ void native_teardown_msi_irq(unsigned int irq); > void native_restore_msi_irqs(struct pci_dev *dev, int irq); > int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, > unsigned int irq_base, unsigned int irq_offset); > -/* default to the implementation in drivers/lib/msi.c */ > -#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS > -#define HAVE_DEFAULT_MSI_RESTORE_IRQS > -void default_teardown_msi_irqs(struct pci_dev *dev); > -void default_restore_msi_irqs(struct pci_dev *dev, int irq); > #else > #define native_setup_msi_irqs NULL > #define native_teardown_msi_irq NULL > diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c > index 45a14db..a2b189c 100644 > --- a/arch/x86/kernel/x86_init.c > +++ b/arch/x86/kernel/x86_init.c > @@ -116,6 +116,27 @@ struct x86_msi_ops x86_msi = { > .setup_hpet_msi = default_setup_hpet_msi, > }; > > +/* MSI arch specific hooks */ > +int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) > +{ > + return x86_msi.setup_msi_irqs(dev, nvec, type); > +} > + > +void arch_teardown_msi_irqs(struct pci_dev *dev) > +{ > + x86_msi.teardown_msi_irqs(dev); > +} > + > +void arch_teardown_msi_irq(unsigned int irq) > +{ > + x86_msi.teardown_msi_irq(irq); > +} > + > +void arch_restore_msi_irqs(struct pci_dev *dev, int irq) > +{ > + x86_msi.restore_msi_irqs(dev, irq); > +} > + > struct x86_io_apic_ops x86_io_apic_ops = { > .init = native_io_apic_init_mappings, > .read = native_io_apic_read, > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index 2c10752..289fbfd 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -30,20 +30,21 @@ static int pci_msi_enable = 1; > > /* Arch hooks */ > > -#ifndef arch_msi_check_device > -int arch_msi_check_device(struct pci_dev *dev, int nvec, int type) > +int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) > { > - return 0; > + return -EINVAL; > } > -#endif > > -#ifndef arch_setup_msi_irqs > -# define arch_setup_msi_irqs default_setup_msi_irqs > -# define HAVE_DEFAULT_MSI_SETUP_IRQS > -#endif > +void __weak arch_teardown_msi_irq(unsigned int irq) > +{ > +} > > -#ifdef HAVE_DEFAULT_MSI_SETUP_IRQS > -int default_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) > +int __weak arch_msi_check_device(struct pci_dev *dev, int nvec, int type) > +{ > + return 0; > +} > + > +int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) > { > struct msi_desc *entry; > int ret; > @@ -65,14 +66,11 @@ int default_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) > > return 0; > } > -#endif > > -#ifndef arch_teardown_msi_irqs > -# define arch_teardown_msi_irqs default_teardown_msi_irqs > -# define HAVE_DEFAULT_MSI_TEARDOWN_IRQS > -#endif > - > -#ifdef HAVE_DEFAULT_MSI_TEARDOWN_IRQS > +/* > + * We have a default implementation available as a separate non-weak > + * function, as it is used by the Xen x86 PCI code > + */ > void default_teardown_msi_irqs(struct pci_dev *dev) > { > struct msi_desc *entry; > @@ -86,15 +84,13 @@ void default_teardown_msi_irqs(struct pci_dev *dev) > arch_teardown_msi_irq(entry->irq + i); > } > } > -#endif > > -#ifndef arch_restore_msi_irqs > -# define arch_restore_msi_irqs default_restore_msi_irqs > -# define HAVE_DEFAULT_MSI_RESTORE_IRQS > -#endif > +void __weak arch_teardown_msi_irqs(struct pci_dev *dev) > +{ > + return default_teardown_msi_irqs(dev); > +} > > -#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS > -void default_restore_msi_irqs(struct pci_dev *dev, int irq) > +void __weak arch_restore_msi_irqs(struct pci_dev *dev, int irq) > { > struct msi_desc *entry; > > @@ -111,7 +107,6 @@ void default_restore_msi_irqs(struct pci_dev *dev, int irq) > if (entry) > write_msi_msg(irq, &entry->msg); > } > -#endif > > static void msi_set_enable(struct pci_dev *dev, int enable) > { > diff --git a/include/linux/msi.h b/include/linux/msi.h > index 20c2d6d..c82ff8d 100644 > --- a/include/linux/msi.h > +++ b/include/linux/msi.h > @@ -50,12 +50,17 @@ struct msi_desc { > }; > > /* > - * The arch hook for setup up msi irqs > + * 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); > > #endif /* LINUX_MSI_H */ > -- > 1.8.1.2 >