mvebu: backport mainline patches from kernel 3.12
[openwrt.git] / target / linux / mvebu / patches-3.10 / 0070-PCI-use-weak-functions-for-MSI-arch-specific-functio.patch
1 From 4fb403ed86e78027a5b85333fa1491d5a0e68ae9 Mon Sep 17 00:00:00 2001
2 From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
3 Date: Wed, 19 Jun 2013 09:42:32 +0200
4 Subject: [PATCH 070/203] PCI: use weak functions for MSI arch-specific
5  functions
6
7 Until now, the MSI architecture-specific functions could be overloaded
8 using a fairly complex set of #define and compile-time
9 conditionals. In order to prepare for the introduction of the msi_chip
10 infrastructure, it is desirable to switch all those functions to use
11 the 'weak' mechanism. This commit converts all the architectures that
12 were overidding those MSI functions to use the new strategy.
13
14 Note that we keep two separate, non-weak, functions
15 default_teardown_msi_irqs() and default_restore_msi_irqs() for the
16 default behavior of the arch_teardown_msi_irqs() and
17 arch_restore_msi_irqs(), as the default behavior is needed by x86 PCI
18 code.
19
20 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
21 Acked-by: Bjorn Helgaas <bhelgaas@google.com>
22 Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
23 Tested-by: Daniel Price <daniel.price@gmail.com>
24 Tested-by: Thierry Reding <thierry.reding@gmail.com>
25 Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
26 Cc: Paul Mackerras <paulus@samba.org>
27 Cc: linuxppc-dev@lists.ozlabs.org
28 Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
29 Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
30 Cc: linux390@de.ibm.com
31 Cc: linux-s390@vger.kernel.org
32 Cc: Thomas Gleixner <tglx@linutronix.de>
33 Cc: Ingo Molnar <mingo@redhat.com>
34 Cc: H. Peter Anvin <hpa@zytor.com>
35 Cc: x86@kernel.org
36 Cc: Russell King <linux@arm.linux.org.uk>
37 Cc: Tony Luck <tony.luck@intel.com>
38 Cc: Fenghua Yu <fenghua.yu@intel.com>
39 Cc: linux-ia64@vger.kernel.org
40 Cc: Ralf Baechle <ralf@linux-mips.org>
41 Cc: linux-mips@linux-mips.org
42 Cc: David S. Miller <davem@davemloft.net>
43 Cc: sparclinux@vger.kernel.org
44 Cc: Chris Metcalf <cmetcalf@tilera.com>
45 ---
46  arch/mips/include/asm/pci.h    |  5 -----
47  arch/powerpc/include/asm/pci.h |  5 -----
48  arch/s390/include/asm/pci.h    |  4 ----
49  arch/x86/include/asm/pci.h     | 30 --------------------------
50  arch/x86/kernel/x86_init.c     | 24 +++++++++++++++++++++
51  drivers/pci/msi.c              | 48 +++++++++++++++++++++---------------------
52  include/linux/msi.h            |  8 ++++++-
53  7 files changed, 55 insertions(+), 69 deletions(-)
54
55 --- a/arch/mips/include/asm/pci.h
56 +++ b/arch/mips/include/asm/pci.h
57 @@ -137,11 +137,6 @@ static inline int pci_get_legacy_ide_irq
58         return channel ? 15 : 14;
59  }
60  
61 -#ifdef CONFIG_CPU_CAVIUM_OCTEON
62 -/* MSI arch hook for OCTEON */
63 -#define arch_setup_msi_irqs arch_setup_msi_irqs
64 -#endif
65 -
66  extern char * (*pcibios_plat_setup)(char *str);
67  
68  #ifdef CONFIG_OF
69 --- a/arch/powerpc/include/asm/pci.h
70 +++ b/arch/powerpc/include/asm/pci.h
71 @@ -113,11 +113,6 @@ extern int pci_domain_nr(struct pci_bus
72  /* Decide whether to display the domain number in /proc */
73  extern int pci_proc_domain(struct pci_bus *bus);
74  
75 -/* MSI arch hooks */
76 -#define arch_setup_msi_irqs arch_setup_msi_irqs
77 -#define arch_teardown_msi_irqs arch_teardown_msi_irqs
78 -#define arch_msi_check_device arch_msi_check_device
79 -
80  struct vm_area_struct;
81  /* Map a range of PCI memory or I/O space for a device into user space */
82  int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
83 --- a/arch/s390/include/asm/pci.h
84 +++ b/arch/s390/include/asm/pci.h
85 @@ -21,10 +21,6 @@ void pci_iounmap(struct pci_dev *, void
86  int pci_domain_nr(struct pci_bus *);
87  int pci_proc_domain(struct pci_bus *);
88  
89 -/* MSI arch hooks */
90 -#define arch_setup_msi_irqs    arch_setup_msi_irqs
91 -#define arch_teardown_msi_irqs arch_teardown_msi_irqs
92 -
93  #define ZPCI_BUS_NR                    0       /* default bus number */
94  #define ZPCI_DEVFN                     0       /* default device number */
95  
96 --- a/arch/x86/include/asm/pci.h
97 +++ b/arch/x86/include/asm/pci.h
98 @@ -100,29 +100,6 @@ static inline void early_quirks(void) {
99  extern void pci_iommu_alloc(void);
100  
101  #ifdef CONFIG_PCI_MSI
102 -/* MSI arch specific hooks */
103 -static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
104 -{
105 -       return x86_msi.setup_msi_irqs(dev, nvec, type);
106 -}
107 -
108 -static inline void x86_teardown_msi_irqs(struct pci_dev *dev)
109 -{
110 -       x86_msi.teardown_msi_irqs(dev);
111 -}
112 -
113 -static inline void x86_teardown_msi_irq(unsigned int irq)
114 -{
115 -       x86_msi.teardown_msi_irq(irq);
116 -}
117 -static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
118 -{
119 -       x86_msi.restore_msi_irqs(dev, irq);
120 -}
121 -#define arch_setup_msi_irqs x86_setup_msi_irqs
122 -#define arch_teardown_msi_irqs x86_teardown_msi_irqs
123 -#define arch_teardown_msi_irq x86_teardown_msi_irq
124 -#define arch_restore_msi_irqs x86_restore_msi_irqs
125  /* implemented in arch/x86/kernel/apic/io_apic. */
126  struct msi_desc;
127  int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
128 @@ -130,16 +107,9 @@ void native_teardown_msi_irq(unsigned in
129  void native_restore_msi_irqs(struct pci_dev *dev, int irq);
130  int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
131                   unsigned int irq_base, unsigned int irq_offset);
132 -/* default to the implementation in drivers/lib/msi.c */
133 -#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
134 -#define HAVE_DEFAULT_MSI_RESTORE_IRQS
135 -void default_teardown_msi_irqs(struct pci_dev *dev);
136 -void default_restore_msi_irqs(struct pci_dev *dev, int irq);
137  #else
138  #define native_setup_msi_irqs          NULL
139  #define native_teardown_msi_irq                NULL
140 -#define default_teardown_msi_irqs      NULL
141 -#define default_restore_msi_irqs       NULL
142  #endif
143  
144  #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
145 --- a/arch/x86/kernel/x86_init.c
146 +++ b/arch/x86/kernel/x86_init.c
147 @@ -107,6 +107,8 @@ struct x86_platform_ops x86_platform = {
148  };
149  
150  EXPORT_SYMBOL_GPL(x86_platform);
151 +
152 +#if defined(CONFIG_PCI_MSI)
153  struct x86_msi_ops x86_msi = {
154         .setup_msi_irqs         = native_setup_msi_irqs,
155         .compose_msi_msg        = native_compose_msi_msg,
156 @@ -116,6 +118,28 @@ struct x86_msi_ops x86_msi = {
157         .setup_hpet_msi         = default_setup_hpet_msi,
158  };
159  
160 +/* MSI arch specific hooks */
161 +int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
162 +{
163 +       return x86_msi.setup_msi_irqs(dev, nvec, type);
164 +}
165 +
166 +void arch_teardown_msi_irqs(struct pci_dev *dev)
167 +{
168 +       x86_msi.teardown_msi_irqs(dev);
169 +}
170 +
171 +void arch_teardown_msi_irq(unsigned int irq)
172 +{
173 +       x86_msi.teardown_msi_irq(irq);
174 +}
175 +
176 +void arch_restore_msi_irqs(struct pci_dev *dev, int irq)
177 +{
178 +       x86_msi.restore_msi_irqs(dev, irq);
179 +}
180 +#endif
181 +
182  struct x86_io_apic_ops x86_io_apic_ops = {
183         .init                   = native_io_apic_init_mappings,
184         .read                   = native_io_apic_read,
185 --- a/drivers/pci/msi.c
186 +++ b/drivers/pci/msi.c
187 @@ -30,20 +30,21 @@ static int pci_msi_enable = 1;
188  
189  /* Arch hooks */
190  
191 -#ifndef arch_msi_check_device
192 -int arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
193 +int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
194 +{
195 +       return -EINVAL;
196 +}
197 +
198 +void __weak arch_teardown_msi_irq(unsigned int irq)
199  {
200 -       return 0;
201  }
202 -#endif
203  
204 -#ifndef arch_setup_msi_irqs
205 -# define arch_setup_msi_irqs default_setup_msi_irqs
206 -# define HAVE_DEFAULT_MSI_SETUP_IRQS
207 -#endif
208 +int __weak arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
209 +{
210 +       return 0;
211 +}
212  
213 -#ifdef HAVE_DEFAULT_MSI_SETUP_IRQS
214 -int default_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
215 +int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
216  {
217         struct msi_desc *entry;
218         int ret;
219 @@ -65,14 +66,11 @@ int default_setup_msi_irqs(struct pci_de
220  
221         return 0;
222  }
223 -#endif
224  
225 -#ifndef arch_teardown_msi_irqs
226 -# define arch_teardown_msi_irqs default_teardown_msi_irqs
227 -# define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
228 -#endif
229 -
230 -#ifdef HAVE_DEFAULT_MSI_TEARDOWN_IRQS
231 +/*
232 + * We have a default implementation available as a separate non-weak
233 + * function, as it is used by the Xen x86 PCI code
234 + */
235  void default_teardown_msi_irqs(struct pci_dev *dev)
236  {
237         struct msi_desc *entry;
238 @@ -86,14 +84,12 @@ void default_teardown_msi_irqs(struct pc
239                         arch_teardown_msi_irq(entry->irq + i);
240         }
241  }
242 -#endif
243  
244 -#ifndef arch_restore_msi_irqs
245 -# define arch_restore_msi_irqs default_restore_msi_irqs
246 -# define HAVE_DEFAULT_MSI_RESTORE_IRQS
247 -#endif
248 +void __weak arch_teardown_msi_irqs(struct pci_dev *dev)
249 +{
250 +       return default_teardown_msi_irqs(dev);
251 +}
252  
253 -#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS
254  void default_restore_msi_irqs(struct pci_dev *dev, int irq)
255  {
256         struct msi_desc *entry;
257 @@ -111,7 +107,11 @@ void default_restore_msi_irqs(struct pci
258         if (entry)
259                 write_msi_msg(irq, &entry->msg);
260  }
261 -#endif
262 +
263 +void __weak arch_restore_msi_irqs(struct pci_dev *dev, int irq)
264 +{
265 +       return default_restore_msi_irqs(dev, irq);
266 +}
267  
268  static void msi_set_enable(struct pci_dev *dev, int enable)
269  {
270 --- a/include/linux/msi.h
271 +++ b/include/linux/msi.h
272 @@ -50,12 +50,18 @@ struct msi_desc {
273  };
274  
275  /*
276 - * The arch hook for setup up msi irqs
277 + * The arch hooks to setup up msi irqs. Those functions are
278 + * implemented as weak symbols so that they /can/ be overriden by
279 + * architecture specific code if needed.
280   */
281  int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
282  void arch_teardown_msi_irq(unsigned int irq);
283  int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
284  void arch_teardown_msi_irqs(struct pci_dev *dev);
285  int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);
286 +void arch_restore_msi_irqs(struct pci_dev *dev, int irq);
287 +
288 +void default_teardown_msi_irqs(struct pci_dev *dev);
289 +void default_restore_msi_irqs(struct pci_dev *dev, int irq);
290  
291  #endif /* LINUX_MSI_H */