1
2#ifndef LINUX_MSI_H
3#define LINUX_MSI_H
4
5#include <linux/kobject.h>
6#include <linux/list.h>
7
8struct msi_msg {
9 u32 address_lo;
10 u32 address_hi;
11 u32 data;
12};
13
14extern int pci_msi_ignore_mask;
15
16struct irq_data;
17struct msi_desc;
18struct pci_dev;
19struct platform_msi_priv_data;
20void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
21#ifdef CONFIG_GENERIC_MSI_IRQ
22void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
23#else
24static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
25{
26}
27#endif
28
29typedef void (*irq_write_msi_msg_t)(struct msi_desc *desc,
30 struct msi_msg *msg);
31
32
33
34
35
36
37struct platform_msi_desc {
38 struct platform_msi_priv_data *msi_priv_data;
39 u16 msi_index;
40};
41
42
43
44
45
46struct fsl_mc_msi_desc {
47 u16 msi_index;
48};
49
50
51
52
53
54struct ti_sci_inta_msi_desc {
55 u16 dev_index;
56};
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85struct msi_desc {
86
87 struct list_head list;
88 unsigned int irq;
89 unsigned int nvec_used;
90 struct device *dev;
91 struct msi_msg msg;
92 struct irq_affinity_desc *affinity;
93#ifdef CONFIG_IRQ_MSI_IOMMU
94 const void *iommu_cookie;
95#endif
96
97 void (*write_msi_msg)(struct msi_desc *entry, void *data);
98 void *write_msi_msg_data;
99
100 union {
101
102 struct {
103 u32 masked;
104 struct {
105 u8 is_msix : 1;
106 u8 multiple : 3;
107 u8 multi_cap : 3;
108 u8 maskbit : 1;
109 u8 is_64 : 1;
110 u8 is_virtual : 1;
111 u16 entry_nr;
112 unsigned default_irq;
113 } msi_attrib;
114 union {
115 u8 mask_pos;
116 void __iomem *mask_base;
117 };
118 };
119
120
121
122
123
124
125
126
127 struct platform_msi_desc platform;
128 struct fsl_mc_msi_desc fsl_mc;
129 struct ti_sci_inta_msi_desc inta;
130 };
131};
132
133
134#define msi_desc_to_dev(desc) ((desc)->dev)
135#define dev_to_msi_list(dev) (&(dev)->msi_list)
136#define first_msi_entry(dev) \
137 list_first_entry(dev_to_msi_list((dev)), struct msi_desc, list)
138#define for_each_msi_entry(desc, dev) \
139 list_for_each_entry((desc), dev_to_msi_list((dev)), list)
140#define for_each_msi_entry_safe(desc, tmp, dev) \
141 list_for_each_entry_safe((desc), (tmp), dev_to_msi_list((dev)), list)
142
143#ifdef CONFIG_IRQ_MSI_IOMMU
144static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc)
145{
146 return desc->iommu_cookie;
147}
148
149static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc,
150 const void *iommu_cookie)
151{
152 desc->iommu_cookie = iommu_cookie;
153}
154#else
155static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc)
156{
157 return NULL;
158}
159
160static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc,
161 const void *iommu_cookie)
162{
163}
164#endif
165
166#ifdef CONFIG_PCI_MSI
167#define first_pci_msi_entry(pdev) first_msi_entry(&(pdev)->dev)
168#define for_each_pci_msi_entry(desc, pdev) \
169 for_each_msi_entry((desc), &(pdev)->dev)
170
171struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
172void *msi_desc_to_pci_sysdata(struct msi_desc *desc);
173void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
174#else
175static inline void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
176{
177 return NULL;
178}
179static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
180{
181}
182#endif
183
184struct msi_desc *alloc_msi_entry(struct device *dev, int nvec,
185 const struct irq_affinity_desc *affinity);
186void free_msi_entry(struct msi_desc *entry);
187void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
188void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
189
190u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag);
191u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
192void pci_msi_mask_irq(struct irq_data *data);
193void pci_msi_unmask_irq(struct irq_data *data);
194
195
196
197
198
199
200
201
202
203
204#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
205int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
206void arch_teardown_msi_irq(unsigned int irq);
207int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
208void arch_teardown_msi_irqs(struct pci_dev *dev);
209void default_teardown_msi_irqs(struct pci_dev *dev);
210#else
211static inline int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
212{
213 WARN_ON_ONCE(1);
214 return -ENODEV;
215}
216
217static inline void arch_teardown_msi_irqs(struct pci_dev *dev)
218{
219 WARN_ON_ONCE(1);
220}
221#endif
222
223
224
225
226
227void arch_restore_msi_irqs(struct pci_dev *dev);
228void default_restore_msi_irqs(struct pci_dev *dev);
229
230struct msi_controller {
231 struct module *owner;
232 struct device *dev;
233 struct device_node *of_node;
234 struct list_head list;
235
236 int (*setup_irq)(struct msi_controller *chip, struct pci_dev *dev,
237 struct msi_desc *desc);
238 int (*setup_irqs)(struct msi_controller *chip, struct pci_dev *dev,
239 int nvec, int type);
240 void (*teardown_irq)(struct msi_controller *chip, unsigned int irq);
241};
242
243#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
244
245#include <linux/irqhandler.h>
246#include <asm/msi.h>
247
248struct irq_domain;
249struct irq_domain_ops;
250struct irq_chip;
251struct device_node;
252struct fwnode_handle;
253struct msi_domain_info;
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293struct msi_domain_ops {
294 irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
295 msi_alloc_info_t *arg);
296 int (*msi_init)(struct irq_domain *domain,
297 struct msi_domain_info *info,
298 unsigned int virq, irq_hw_number_t hwirq,
299 msi_alloc_info_t *arg);
300 void (*msi_free)(struct irq_domain *domain,
301 struct msi_domain_info *info,
302 unsigned int virq);
303 int (*msi_check)(struct irq_domain *domain,
304 struct msi_domain_info *info,
305 struct device *dev);
306 int (*msi_prepare)(struct irq_domain *domain,
307 struct device *dev, int nvec,
308 msi_alloc_info_t *arg);
309 void (*msi_finish)(msi_alloc_info_t *arg, int retval);
310 void (*set_desc)(msi_alloc_info_t *arg,
311 struct msi_desc *desc);
312 int (*handle_error)(struct irq_domain *domain,
313 struct msi_desc *desc, int error);
314 int (*domain_alloc_irqs)(struct irq_domain *domain,
315 struct device *dev, int nvec);
316 void (*domain_free_irqs)(struct irq_domain *domain,
317 struct device *dev);
318};
319
320
321
322
323
324
325
326
327
328
329
330
331struct msi_domain_info {
332 u32 flags;
333 struct msi_domain_ops *ops;
334 struct irq_chip *chip;
335 void *chip_data;
336 irq_flow_handler_t handler;
337 void *handler_data;
338 const char *handler_name;
339 void *data;
340};
341
342
343enum {
344
345
346
347
348 MSI_FLAG_USE_DEF_DOM_OPS = (1 << 0),
349
350
351
352
353 MSI_FLAG_USE_DEF_CHIP_OPS = (1 << 1),
354
355 MSI_FLAG_MULTI_PCI_MSI = (1 << 2),
356
357 MSI_FLAG_PCI_MSIX = (1 << 3),
358
359 MSI_FLAG_ACTIVATE_EARLY = (1 << 4),
360
361
362
363
364 MSI_FLAG_MUST_REACTIVATE = (1 << 5),
365
366 MSI_FLAG_LEVEL_CAPABLE = (1 << 6),
367};
368
369int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
370 bool force);
371
372struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
373 struct msi_domain_info *info,
374 struct irq_domain *parent);
375int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
376 int nvec);
377int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
378 int nvec);
379void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
380void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
381struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
382
383struct irq_domain *platform_msi_create_irq_domain(struct fwnode_handle *fwnode,
384 struct msi_domain_info *info,
385 struct irq_domain *parent);
386int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
387 irq_write_msi_msg_t write_msi_msg);
388void platform_msi_domain_free_irqs(struct device *dev);
389
390
391int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
392 int nvec, msi_alloc_info_t *args);
393int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
394 int virq, int nvec, msi_alloc_info_t *args);
395struct irq_domain *
396__platform_msi_create_device_domain(struct device *dev,
397 unsigned int nvec,
398 bool is_tree,
399 irq_write_msi_msg_t write_msi_msg,
400 const struct irq_domain_ops *ops,
401 void *host_data);
402
403#define platform_msi_create_device_domain(dev, nvec, write, ops, data) \
404 __platform_msi_create_device_domain(dev, nvec, false, write, ops, data)
405#define platform_msi_create_device_tree_domain(dev, nvec, write, ops, data) \
406 __platform_msi_create_device_domain(dev, nvec, true, write, ops, data)
407
408int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
409 unsigned int nr_irqs);
410void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
411 unsigned int nvec);
412void *platform_msi_get_host_data(struct irq_domain *domain);
413#endif
414
415#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
416void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg);
417struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
418 struct msi_domain_info *info,
419 struct irq_domain *parent);
420int pci_msi_domain_check_cap(struct irq_domain *domain,
421 struct msi_domain_info *info, struct device *dev);
422u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
423struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
424bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
425#else
426static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
427{
428 return NULL;
429}
430#endif
431
432#endif
433