GNU Linux-libre 5.17.9-gnu
[releases.git] / kernel / irq / msi.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2014 Intel Corp.
4  * Author: Jiang Liu <jiang.liu@linux.intel.com>
5  *
6  * This file is licensed under GPLv2.
7  *
8  * This file contains common code to support Message Signaled Interrupts for
9  * PCI compatible and non PCI compatible devices.
10  */
11 #include <linux/types.h>
12 #include <linux/device.h>
13 #include <linux/irq.h>
14 #include <linux/irqdomain.h>
15 #include <linux/msi.h>
16 #include <linux/slab.h>
17 #include <linux/sysfs.h>
18 #include <linux/pci.h>
19
20 #include "internals.h"
21
22 static inline int msi_sysfs_create_group(struct device *dev);
23
24 /**
25  * msi_alloc_desc - Allocate an initialized msi_desc
26  * @dev:        Pointer to the device for which this is allocated
27  * @nvec:       The number of vectors used in this entry
28  * @affinity:   Optional pointer to an affinity mask array size of @nvec
29  *
30  * If @affinity is not %NULL then an affinity array[@nvec] is allocated
31  * and the affinity masks and flags from @affinity are copied.
32  *
33  * Return: pointer to allocated &msi_desc on success or %NULL on failure
34  */
35 static struct msi_desc *msi_alloc_desc(struct device *dev, int nvec,
36                                         const struct irq_affinity_desc *affinity)
37 {
38         struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL);
39
40         if (!desc)
41                 return NULL;
42
43         desc->dev = dev;
44         desc->nvec_used = nvec;
45         if (affinity) {
46                 desc->affinity = kmemdup(affinity, nvec * sizeof(*desc->affinity), GFP_KERNEL);
47                 if (!desc->affinity) {
48                         kfree(desc);
49                         return NULL;
50                 }
51         }
52         return desc;
53 }
54
55 static void msi_free_desc(struct msi_desc *desc)
56 {
57         kfree(desc->affinity);
58         kfree(desc);
59 }
60
61 static int msi_insert_desc(struct msi_device_data *md, struct msi_desc *desc, unsigned int index)
62 {
63         int ret;
64
65         desc->msi_index = index;
66         ret = xa_insert(&md->__store, index, desc, GFP_KERNEL);
67         if (ret)
68                 msi_free_desc(desc);
69         return ret;
70 }
71
72 /**
73  * msi_add_msi_desc - Allocate and initialize a MSI descriptor
74  * @dev:        Pointer to the device for which the descriptor is allocated
75  * @init_desc:  Pointer to an MSI descriptor to initialize the new descriptor
76  *
77  * Return: 0 on success or an appropriate failure code.
78  */
79 int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc)
80 {
81         struct msi_desc *desc;
82
83         lockdep_assert_held(&dev->msi.data->mutex);
84
85         desc = msi_alloc_desc(dev, init_desc->nvec_used, init_desc->affinity);
86         if (!desc)
87                 return -ENOMEM;
88
89         /* Copy type specific data to the new descriptor. */
90         desc->pci = init_desc->pci;
91         return msi_insert_desc(dev->msi.data, desc, init_desc->msi_index);
92 }
93
94 /**
95  * msi_add_simple_msi_descs - Allocate and initialize MSI descriptors
96  * @dev:        Pointer to the device for which the descriptors are allocated
97  * @index:      Index for the first MSI descriptor
98  * @ndesc:      Number of descriptors to allocate
99  *
100  * Return: 0 on success or an appropriate failure code.
101  */
102 static int msi_add_simple_msi_descs(struct device *dev, unsigned int index, unsigned int ndesc)
103 {
104         unsigned int idx, last = index + ndesc - 1;
105         struct msi_desc *desc;
106         int ret;
107
108         lockdep_assert_held(&dev->msi.data->mutex);
109
110         for (idx = index; idx <= last; idx++) {
111                 desc = msi_alloc_desc(dev, 1, NULL);
112                 if (!desc)
113                         goto fail_mem;
114                 ret = msi_insert_desc(dev->msi.data, desc, idx);
115                 if (ret)
116                         goto fail;
117         }
118         return 0;
119
120 fail_mem:
121         ret = -ENOMEM;
122 fail:
123         msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
124         return ret;
125 }
126
127 static bool msi_desc_match(struct msi_desc *desc, enum msi_desc_filter filter)
128 {
129         switch (filter) {
130         case MSI_DESC_ALL:
131                 return true;
132         case MSI_DESC_NOTASSOCIATED:
133                 return !desc->irq;
134         case MSI_DESC_ASSOCIATED:
135                 return !!desc->irq;
136         }
137         WARN_ON_ONCE(1);
138         return false;
139 }
140
141 /**
142  * msi_free_msi_descs_range - Free MSI descriptors of a device
143  * @dev:                Device to free the descriptors
144  * @filter:             Descriptor state filter
145  * @first_index:        Index to start freeing from
146  * @last_index:         Last index to be freed
147  */
148 void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
149                               unsigned int first_index, unsigned int last_index)
150 {
151         struct xarray *xa = &dev->msi.data->__store;
152         struct msi_desc *desc;
153         unsigned long idx;
154
155         lockdep_assert_held(&dev->msi.data->mutex);
156
157         xa_for_each_range(xa, idx, desc, first_index, last_index) {
158                 if (msi_desc_match(desc, filter)) {
159                         xa_erase(xa, idx);
160                         msi_free_desc(desc);
161                 }
162         }
163 }
164
165 void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
166 {
167         *msg = entry->msg;
168 }
169
170 void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
171 {
172         struct msi_desc *entry = irq_get_msi_desc(irq);
173
174         __get_cached_msi_msg(entry, msg);
175 }
176 EXPORT_SYMBOL_GPL(get_cached_msi_msg);
177
178 static void msi_device_data_release(struct device *dev, void *res)
179 {
180         struct msi_device_data *md = res;
181
182         WARN_ON_ONCE(!xa_empty(&md->__store));
183         xa_destroy(&md->__store);
184         dev->msi.data = NULL;
185 }
186
187 /**
188  * msi_setup_device_data - Setup MSI device data
189  * @dev:        Device for which MSI device data should be set up
190  *
191  * Return: 0 on success, appropriate error code otherwise
192  *
193  * This can be called more than once for @dev. If the MSI device data is
194  * already allocated the call succeeds. The allocated memory is
195  * automatically released when the device is destroyed.
196  */
197 int msi_setup_device_data(struct device *dev)
198 {
199         struct msi_device_data *md;
200         int ret;
201
202         if (dev->msi.data)
203                 return 0;
204
205         md = devres_alloc(msi_device_data_release, sizeof(*md), GFP_KERNEL);
206         if (!md)
207                 return -ENOMEM;
208
209         ret = msi_sysfs_create_group(dev);
210         if (ret) {
211                 devres_free(md);
212                 return ret;
213         }
214
215         xa_init(&md->__store);
216         mutex_init(&md->mutex);
217         dev->msi.data = md;
218         devres_add(dev, md);
219         return 0;
220 }
221
222 /**
223  * msi_lock_descs - Lock the MSI descriptor storage of a device
224  * @dev:        Device to operate on
225  */
226 void msi_lock_descs(struct device *dev)
227 {
228         mutex_lock(&dev->msi.data->mutex);
229 }
230 EXPORT_SYMBOL_GPL(msi_lock_descs);
231
232 /**
233  * msi_unlock_descs - Unlock the MSI descriptor storage of a device
234  * @dev:        Device to operate on
235  */
236 void msi_unlock_descs(struct device *dev)
237 {
238         /* Invalidate the index wich was cached by the iterator */
239         dev->msi.data->__iter_idx = MSI_MAX_INDEX;
240         mutex_unlock(&dev->msi.data->mutex);
241 }
242 EXPORT_SYMBOL_GPL(msi_unlock_descs);
243
244 static struct msi_desc *msi_find_desc(struct msi_device_data *md, enum msi_desc_filter filter)
245 {
246         struct msi_desc *desc;
247
248         xa_for_each_start(&md->__store, md->__iter_idx, desc, md->__iter_idx) {
249                 if (msi_desc_match(desc, filter))
250                         return desc;
251         }
252         md->__iter_idx = MSI_MAX_INDEX;
253         return NULL;
254 }
255
256 /**
257  * msi_first_desc - Get the first MSI descriptor of a device
258  * @dev:        Device to operate on
259  * @filter:     Descriptor state filter
260  *
261  * Must be called with the MSI descriptor mutex held, i.e. msi_lock_descs()
262  * must be invoked before the call.
263  *
264  * Return: Pointer to the first MSI descriptor matching the search
265  *         criteria, NULL if none found.
266  */
267 struct msi_desc *msi_first_desc(struct device *dev, enum msi_desc_filter filter)
268 {
269         struct msi_device_data *md = dev->msi.data;
270
271         if (WARN_ON_ONCE(!md))
272                 return NULL;
273
274         lockdep_assert_held(&md->mutex);
275
276         md->__iter_idx = 0;
277         return msi_find_desc(md, filter);
278 }
279 EXPORT_SYMBOL_GPL(msi_first_desc);
280
281 /**
282  * msi_next_desc - Get the next MSI descriptor of a device
283  * @dev:        Device to operate on
284  *
285  * The first invocation of msi_next_desc() has to be preceeded by a
286  * successful invocation of __msi_first_desc(). Consecutive invocations are
287  * only valid if the previous one was successful. All these operations have
288  * to be done within the same MSI mutex held region.
289  *
290  * Return: Pointer to the next MSI descriptor matching the search
291  *         criteria, NULL if none found.
292  */
293 struct msi_desc *msi_next_desc(struct device *dev, enum msi_desc_filter filter)
294 {
295         struct msi_device_data *md = dev->msi.data;
296
297         if (WARN_ON_ONCE(!md))
298                 return NULL;
299
300         lockdep_assert_held(&md->mutex);
301
302         if (md->__iter_idx >= (unsigned long)MSI_MAX_INDEX)
303                 return NULL;
304
305         md->__iter_idx++;
306         return msi_find_desc(md, filter);
307 }
308 EXPORT_SYMBOL_GPL(msi_next_desc);
309
310 /**
311  * msi_get_virq - Return Linux interrupt number of a MSI interrupt
312  * @dev:        Device to operate on
313  * @index:      MSI interrupt index to look for (0-based)
314  *
315  * Return: The Linux interrupt number on success (> 0), 0 if not found
316  */
317 unsigned int msi_get_virq(struct device *dev, unsigned int index)
318 {
319         struct msi_desc *desc;
320         unsigned int ret = 0;
321         bool pcimsi;
322
323         if (!dev->msi.data)
324                 return 0;
325
326         pcimsi = dev_is_pci(dev) ? to_pci_dev(dev)->msi_enabled : false;
327
328         msi_lock_descs(dev);
329         desc = xa_load(&dev->msi.data->__store, pcimsi ? 0 : index);
330         if (desc && desc->irq) {
331                 /*
332                  * PCI-MSI has only one descriptor for multiple interrupts.
333                  * PCI-MSIX and platform MSI use a descriptor per
334                  * interrupt.
335                  */
336                 if (pcimsi) {
337                         if (index < desc->nvec_used)
338                                 ret = desc->irq + index;
339                 } else {
340                         ret = desc->irq;
341                 }
342         }
343         msi_unlock_descs(dev);
344         return ret;
345 }
346 EXPORT_SYMBOL_GPL(msi_get_virq);
347
348 #ifdef CONFIG_SYSFS
349 static struct attribute *msi_dev_attrs[] = {
350         NULL
351 };
352
353 static const struct attribute_group msi_irqs_group = {
354         .name   = "msi_irqs",
355         .attrs  = msi_dev_attrs,
356 };
357
358 static inline int msi_sysfs_create_group(struct device *dev)
359 {
360         return devm_device_add_group(dev, &msi_irqs_group);
361 }
362
363 static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
364                              char *buf)
365 {
366         /* MSI vs. MSIX is per device not per interrupt */
367         bool is_msix = dev_is_pci(dev) ? to_pci_dev(dev)->msix_enabled : false;
368
369         return sysfs_emit(buf, "%s\n", is_msix ? "msix" : "msi");
370 }
371
372 static void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc)
373 {
374         struct device_attribute *attrs = desc->sysfs_attrs;
375         int i;
376
377         if (!attrs)
378                 return;
379
380         desc->sysfs_attrs = NULL;
381         for (i = 0; i < desc->nvec_used; i++) {
382                 if (attrs[i].show)
383                         sysfs_remove_file_from_group(&dev->kobj, &attrs[i].attr, msi_irqs_group.name);
384                 kfree(attrs[i].attr.name);
385         }
386         kfree(attrs);
387 }
388
389 static int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *desc)
390 {
391         struct device_attribute *attrs;
392         int ret, i;
393
394         attrs = kcalloc(desc->nvec_used, sizeof(*attrs), GFP_KERNEL);
395         if (!attrs)
396                 return -ENOMEM;
397
398         desc->sysfs_attrs = attrs;
399         for (i = 0; i < desc->nvec_used; i++) {
400                 sysfs_attr_init(&attrs[i].attr);
401                 attrs[i].attr.name = kasprintf(GFP_KERNEL, "%d", desc->irq + i);
402                 if (!attrs[i].attr.name) {
403                         ret = -ENOMEM;
404                         goto fail;
405                 }
406
407                 attrs[i].attr.mode = 0444;
408                 attrs[i].show = msi_mode_show;
409
410                 ret = sysfs_add_file_to_group(&dev->kobj, &attrs[i].attr, msi_irqs_group.name);
411                 if (ret) {
412                         attrs[i].show = NULL;
413                         goto fail;
414                 }
415         }
416         return 0;
417
418 fail:
419         msi_sysfs_remove_desc(dev, desc);
420         return ret;
421 }
422
423 #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
424 /**
425  * msi_device_populate_sysfs - Populate msi_irqs sysfs entries for a device
426  * @dev:        The device (PCI, platform etc) which will get sysfs entries
427  */
428 int msi_device_populate_sysfs(struct device *dev)
429 {
430         struct msi_desc *desc;
431         int ret;
432
433         msi_for_each_desc(desc, dev, MSI_DESC_ASSOCIATED) {
434                 if (desc->sysfs_attrs)
435                         continue;
436                 ret = msi_sysfs_populate_desc(dev, desc);
437                 if (ret)
438                         return ret;
439         }
440         return 0;
441 }
442
443 /**
444  * msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
445  * @dev:                The device (PCI, platform etc) for which to remove
446  *                      sysfs entries
447  */
448 void msi_device_destroy_sysfs(struct device *dev)
449 {
450         struct msi_desc *desc;
451
452         msi_for_each_desc(desc, dev, MSI_DESC_ALL)
453                 msi_sysfs_remove_desc(dev, desc);
454 }
455 #endif /* CONFIG_PCI_MSI_ARCH_FALLBACK */
456 #else /* CONFIG_SYSFS */
457 static inline int msi_sysfs_create_group(struct device *dev) { return 0; }
458 static inline int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *desc) { return 0; }
459 static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) { }
460 #endif /* !CONFIG_SYSFS */
461
462 #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
463 static inline void irq_chip_write_msi_msg(struct irq_data *data,
464                                           struct msi_msg *msg)
465 {
466         data->chip->irq_write_msi_msg(data, msg);
467 }
468
469 static void msi_check_level(struct irq_domain *domain, struct msi_msg *msg)
470 {
471         struct msi_domain_info *info = domain->host_data;
472
473         /*
474          * If the MSI provider has messed with the second message and
475          * not advertized that it is level-capable, signal the breakage.
476          */
477         WARN_ON(!((info->flags & MSI_FLAG_LEVEL_CAPABLE) &&
478                   (info->chip->flags & IRQCHIP_SUPPORTS_LEVEL_MSI)) &&
479                 (msg[1].address_lo || msg[1].address_hi || msg[1].data));
480 }
481
482 /**
483  * msi_domain_set_affinity - Generic affinity setter function for MSI domains
484  * @irq_data:   The irq data associated to the interrupt
485  * @mask:       The affinity mask to set
486  * @force:      Flag to enforce setting (disable online checks)
487  *
488  * Intended to be used by MSI interrupt controllers which are
489  * implemented with hierarchical domains.
490  *
491  * Return: IRQ_SET_MASK_* result code
492  */
493 int msi_domain_set_affinity(struct irq_data *irq_data,
494                             const struct cpumask *mask, bool force)
495 {
496         struct irq_data *parent = irq_data->parent_data;
497         struct msi_msg msg[2] = { [1] = { }, };
498         int ret;
499
500         ret = parent->chip->irq_set_affinity(parent, mask, force);
501         if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE) {
502                 BUG_ON(irq_chip_compose_msi_msg(irq_data, msg));
503                 msi_check_level(irq_data->domain, msg);
504                 irq_chip_write_msi_msg(irq_data, msg);
505         }
506
507         return ret;
508 }
509
510 static int msi_domain_activate(struct irq_domain *domain,
511                                struct irq_data *irq_data, bool early)
512 {
513         struct msi_msg msg[2] = { [1] = { }, };
514
515         BUG_ON(irq_chip_compose_msi_msg(irq_data, msg));
516         msi_check_level(irq_data->domain, msg);
517         irq_chip_write_msi_msg(irq_data, msg);
518         return 0;
519 }
520
521 static void msi_domain_deactivate(struct irq_domain *domain,
522                                   struct irq_data *irq_data)
523 {
524         struct msi_msg msg[2];
525
526         memset(msg, 0, sizeof(msg));
527         irq_chip_write_msi_msg(irq_data, msg);
528 }
529
530 static int msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
531                             unsigned int nr_irqs, void *arg)
532 {
533         struct msi_domain_info *info = domain->host_data;
534         struct msi_domain_ops *ops = info->ops;
535         irq_hw_number_t hwirq = ops->get_hwirq(info, arg);
536         int i, ret;
537
538         if (irq_find_mapping(domain, hwirq) > 0)
539                 return -EEXIST;
540
541         if (domain->parent) {
542                 ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
543                 if (ret < 0)
544                         return ret;
545         }
546
547         for (i = 0; i < nr_irqs; i++) {
548                 ret = ops->msi_init(domain, info, virq + i, hwirq + i, arg);
549                 if (ret < 0) {
550                         if (ops->msi_free) {
551                                 for (i--; i > 0; i--)
552                                         ops->msi_free(domain, info, virq + i);
553                         }
554                         irq_domain_free_irqs_top(domain, virq, nr_irqs);
555                         return ret;
556                 }
557         }
558
559         return 0;
560 }
561
562 static void msi_domain_free(struct irq_domain *domain, unsigned int virq,
563                             unsigned int nr_irqs)
564 {
565         struct msi_domain_info *info = domain->host_data;
566         int i;
567
568         if (info->ops->msi_free) {
569                 for (i = 0; i < nr_irqs; i++)
570                         info->ops->msi_free(domain, info, virq + i);
571         }
572         irq_domain_free_irqs_top(domain, virq, nr_irqs);
573 }
574
575 static const struct irq_domain_ops msi_domain_ops = {
576         .alloc          = msi_domain_alloc,
577         .free           = msi_domain_free,
578         .activate       = msi_domain_activate,
579         .deactivate     = msi_domain_deactivate,
580 };
581
582 static irq_hw_number_t msi_domain_ops_get_hwirq(struct msi_domain_info *info,
583                                                 msi_alloc_info_t *arg)
584 {
585         return arg->hwirq;
586 }
587
588 static int msi_domain_ops_prepare(struct irq_domain *domain, struct device *dev,
589                                   int nvec, msi_alloc_info_t *arg)
590 {
591         memset(arg, 0, sizeof(*arg));
592         return 0;
593 }
594
595 static void msi_domain_ops_set_desc(msi_alloc_info_t *arg,
596                                     struct msi_desc *desc)
597 {
598         arg->desc = desc;
599 }
600
601 static int msi_domain_ops_init(struct irq_domain *domain,
602                                struct msi_domain_info *info,
603                                unsigned int virq, irq_hw_number_t hwirq,
604                                msi_alloc_info_t *arg)
605 {
606         irq_domain_set_hwirq_and_chip(domain, virq, hwirq, info->chip,
607                                       info->chip_data);
608         if (info->handler && info->handler_name) {
609                 __irq_set_handler(virq, info->handler, 0, info->handler_name);
610                 if (info->handler_data)
611                         irq_set_handler_data(virq, info->handler_data);
612         }
613         return 0;
614 }
615
616 static int msi_domain_ops_check(struct irq_domain *domain,
617                                 struct msi_domain_info *info,
618                                 struct device *dev)
619 {
620         return 0;
621 }
622
623 static struct msi_domain_ops msi_domain_ops_default = {
624         .get_hwirq              = msi_domain_ops_get_hwirq,
625         .msi_init               = msi_domain_ops_init,
626         .msi_check              = msi_domain_ops_check,
627         .msi_prepare            = msi_domain_ops_prepare,
628         .set_desc               = msi_domain_ops_set_desc,
629         .domain_alloc_irqs      = __msi_domain_alloc_irqs,
630         .domain_free_irqs       = __msi_domain_free_irqs,
631 };
632
633 static void msi_domain_update_dom_ops(struct msi_domain_info *info)
634 {
635         struct msi_domain_ops *ops = info->ops;
636
637         if (ops == NULL) {
638                 info->ops = &msi_domain_ops_default;
639                 return;
640         }
641
642         if (ops->domain_alloc_irqs == NULL)
643                 ops->domain_alloc_irqs = msi_domain_ops_default.domain_alloc_irqs;
644         if (ops->domain_free_irqs == NULL)
645                 ops->domain_free_irqs = msi_domain_ops_default.domain_free_irqs;
646
647         if (!(info->flags & MSI_FLAG_USE_DEF_DOM_OPS))
648                 return;
649
650         if (ops->get_hwirq == NULL)
651                 ops->get_hwirq = msi_domain_ops_default.get_hwirq;
652         if (ops->msi_init == NULL)
653                 ops->msi_init = msi_domain_ops_default.msi_init;
654         if (ops->msi_check == NULL)
655                 ops->msi_check = msi_domain_ops_default.msi_check;
656         if (ops->msi_prepare == NULL)
657                 ops->msi_prepare = msi_domain_ops_default.msi_prepare;
658         if (ops->set_desc == NULL)
659                 ops->set_desc = msi_domain_ops_default.set_desc;
660 }
661
662 static void msi_domain_update_chip_ops(struct msi_domain_info *info)
663 {
664         struct irq_chip *chip = info->chip;
665
666         BUG_ON(!chip || !chip->irq_mask || !chip->irq_unmask);
667         if (!chip->irq_set_affinity)
668                 chip->irq_set_affinity = msi_domain_set_affinity;
669 }
670
671 /**
672  * msi_create_irq_domain - Create an MSI interrupt domain
673  * @fwnode:     Optional fwnode of the interrupt controller
674  * @info:       MSI domain info
675  * @parent:     Parent irq domain
676  *
677  * Return: pointer to the created &struct irq_domain or %NULL on failure
678  */
679 struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
680                                          struct msi_domain_info *info,
681                                          struct irq_domain *parent)
682 {
683         struct irq_domain *domain;
684
685         msi_domain_update_dom_ops(info);
686         if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
687                 msi_domain_update_chip_ops(info);
688
689         domain = irq_domain_create_hierarchy(parent, IRQ_DOMAIN_FLAG_MSI, 0,
690                                              fwnode, &msi_domain_ops, info);
691
692         if (domain && !domain->name && info->chip)
693                 domain->name = info->chip->name;
694
695         return domain;
696 }
697
698 int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
699                             int nvec, msi_alloc_info_t *arg)
700 {
701         struct msi_domain_info *info = domain->host_data;
702         struct msi_domain_ops *ops = info->ops;
703         int ret;
704
705         ret = ops->msi_check(domain, info, dev);
706         if (ret == 0)
707                 ret = ops->msi_prepare(domain, dev, nvec, arg);
708
709         return ret;
710 }
711
712 int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
713                              int virq_base, int nvec, msi_alloc_info_t *arg)
714 {
715         struct msi_domain_info *info = domain->host_data;
716         struct msi_domain_ops *ops = info->ops;
717         struct msi_desc *desc;
718         int ret, virq;
719
720         msi_lock_descs(dev);
721         ret = msi_add_simple_msi_descs(dev, virq_base, nvec);
722         if (ret)
723                 goto unlock;
724
725         for (virq = virq_base; virq < virq_base + nvec; virq++) {
726                 desc = xa_load(&dev->msi.data->__store, virq);
727                 desc->irq = virq;
728
729                 ops->set_desc(arg, desc);
730                 ret = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg);
731                 if (ret)
732                         goto fail;
733
734                 irq_set_msi_desc(virq, desc);
735         }
736         msi_unlock_descs(dev);
737         return 0;
738
739 fail:
740         for (--virq; virq >= virq_base; virq--)
741                 irq_domain_free_irqs_common(domain, virq, 1);
742         msi_free_msi_descs_range(dev, MSI_DESC_ALL, virq_base, virq_base + nvec - 1);
743 unlock:
744         msi_unlock_descs(dev);
745         return ret;
746 }
747
748 /*
749  * Carefully check whether the device can use reservation mode. If
750  * reservation mode is enabled then the early activation will assign a
751  * dummy vector to the device. If the PCI/MSI device does not support
752  * masking of the entry then this can result in spurious interrupts when
753  * the device driver is not absolutely careful. But even then a malfunction
754  * of the hardware could result in a spurious interrupt on the dummy vector
755  * and render the device unusable. If the entry can be masked then the core
756  * logic will prevent the spurious interrupt and reservation mode can be
757  * used. For now reservation mode is restricted to PCI/MSI.
758  */
759 static bool msi_check_reservation_mode(struct irq_domain *domain,
760                                        struct msi_domain_info *info,
761                                        struct device *dev)
762 {
763         struct msi_desc *desc;
764
765         switch(domain->bus_token) {
766         case DOMAIN_BUS_PCI_MSI:
767         case DOMAIN_BUS_VMD_MSI:
768                 break;
769         default:
770                 return false;
771         }
772
773         if (!(info->flags & MSI_FLAG_MUST_REACTIVATE))
774                 return false;
775
776         if (IS_ENABLED(CONFIG_PCI_MSI) && pci_msi_ignore_mask)
777                 return false;
778
779         /*
780          * Checking the first MSI descriptor is sufficient. MSIX supports
781          * masking and MSI does so when the can_mask attribute is set.
782          */
783         desc = msi_first_desc(dev, MSI_DESC_ALL);
784         return desc->pci.msi_attrib.is_msix || desc->pci.msi_attrib.can_mask;
785 }
786
787 static int msi_handle_pci_fail(struct irq_domain *domain, struct msi_desc *desc,
788                                int allocated)
789 {
790         switch(domain->bus_token) {
791         case DOMAIN_BUS_PCI_MSI:
792         case DOMAIN_BUS_VMD_MSI:
793                 if (IS_ENABLED(CONFIG_PCI_MSI))
794                         break;
795                 fallthrough;
796         default:
797                 return -ENOSPC;
798         }
799
800         /* Let a failed PCI multi MSI allocation retry */
801         if (desc->nvec_used > 1)
802                 return 1;
803
804         /* If there was a successful allocation let the caller know */
805         return allocated ? allocated : -ENOSPC;
806 }
807
808 #define VIRQ_CAN_RESERVE        0x01
809 #define VIRQ_ACTIVATE           0x02
810 #define VIRQ_NOMASK_QUIRK       0x04
811
812 static int msi_init_virq(struct irq_domain *domain, int virq, unsigned int vflags)
813 {
814         struct irq_data *irqd = irq_domain_get_irq_data(domain, virq);
815         int ret;
816
817         if (!(vflags & VIRQ_CAN_RESERVE)) {
818                 irqd_clr_can_reserve(irqd);
819                 if (vflags & VIRQ_NOMASK_QUIRK)
820                         irqd_set_msi_nomask_quirk(irqd);
821         }
822
823         if (!(vflags & VIRQ_ACTIVATE))
824                 return 0;
825
826         ret = irq_domain_activate_irq(irqd, vflags & VIRQ_CAN_RESERVE);
827         if (ret)
828                 return ret;
829         /*
830          * If the interrupt uses reservation mode, clear the activated bit
831          * so request_irq() will assign the final vector.
832          */
833         if (vflags & VIRQ_CAN_RESERVE)
834                 irqd_clr_activated(irqd);
835         return 0;
836 }
837
838 int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
839                             int nvec)
840 {
841         struct msi_domain_info *info = domain->host_data;
842         struct msi_domain_ops *ops = info->ops;
843         msi_alloc_info_t arg = { };
844         unsigned int vflags = 0;
845         struct msi_desc *desc;
846         int allocated = 0;
847         int i, ret, virq;
848
849         ret = msi_domain_prepare_irqs(domain, dev, nvec, &arg);
850         if (ret)
851                 return ret;
852
853         /*
854          * This flag is set by the PCI layer as we need to activate
855          * the MSI entries before the PCI layer enables MSI in the
856          * card. Otherwise the card latches a random msi message.
857          */
858         if (info->flags & MSI_FLAG_ACTIVATE_EARLY)
859                 vflags |= VIRQ_ACTIVATE;
860
861         /*
862          * Interrupt can use a reserved vector and will not occupy
863          * a real device vector until the interrupt is requested.
864          */
865         if (msi_check_reservation_mode(domain, info, dev)) {
866                 vflags |= VIRQ_CAN_RESERVE;
867                 /*
868                  * MSI affinity setting requires a special quirk (X86) when
869                  * reservation mode is active.
870                  */
871                 if (domain->flags & IRQ_DOMAIN_MSI_NOMASK_QUIRK)
872                         vflags |= VIRQ_NOMASK_QUIRK;
873         }
874
875         msi_for_each_desc(desc, dev, MSI_DESC_NOTASSOCIATED) {
876                 ops->set_desc(&arg, desc);
877
878                 virq = __irq_domain_alloc_irqs(domain, -1, desc->nvec_used,
879                                                dev_to_node(dev), &arg, false,
880                                                desc->affinity);
881                 if (virq < 0)
882                         return msi_handle_pci_fail(domain, desc, allocated);
883
884                 for (i = 0; i < desc->nvec_used; i++) {
885                         irq_set_msi_desc_off(virq, i, desc);
886                         irq_debugfs_copy_devname(virq + i, dev);
887                         ret = msi_init_virq(domain, virq + i, vflags);
888                         if (ret)
889                                 return ret;
890                 }
891                 if (info->flags & MSI_FLAG_DEV_SYSFS) {
892                         ret = msi_sysfs_populate_desc(dev, desc);
893                         if (ret)
894                                 return ret;
895                 }
896                 allocated++;
897         }
898         return 0;
899 }
900
901 static int msi_domain_add_simple_msi_descs(struct msi_domain_info *info,
902                                            struct device *dev,
903                                            unsigned int num_descs)
904 {
905         if (!(info->flags & MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS))
906                 return 0;
907
908         return msi_add_simple_msi_descs(dev, 0, num_descs);
909 }
910
911 /**
912  * msi_domain_alloc_irqs_descs_locked - Allocate interrupts from a MSI interrupt domain
913  * @domain:     The domain to allocate from
914  * @dev:        Pointer to device struct of the device for which the interrupts
915  *              are allocated
916  * @nvec:       The number of interrupts to allocate
917  *
918  * Must be invoked from within a msi_lock_descs() / msi_unlock_descs()
919  * pair. Use this for MSI irqdomains which implement their own vector
920  * allocation/free.
921  *
922  * Return: %0 on success or an error code.
923  */
924 int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device *dev,
925                                        int nvec)
926 {
927         struct msi_domain_info *info = domain->host_data;
928         struct msi_domain_ops *ops = info->ops;
929         int ret;
930
931         lockdep_assert_held(&dev->msi.data->mutex);
932
933         ret = msi_domain_add_simple_msi_descs(info, dev, nvec);
934         if (ret)
935                 return ret;
936
937         ret = ops->domain_alloc_irqs(domain, dev, nvec);
938         if (ret)
939                 msi_domain_free_irqs_descs_locked(domain, dev);
940         return ret;
941 }
942
943 /**
944  * msi_domain_alloc_irqs - Allocate interrupts from a MSI interrupt domain
945  * @domain:     The domain to allocate from
946  * @dev:        Pointer to device struct of the device for which the interrupts
947  *              are allocated
948  * @nvec:       The number of interrupts to allocate
949  *
950  * Return: %0 on success or an error code.
951  */
952 int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec)
953 {
954         int ret;
955
956         msi_lock_descs(dev);
957         ret = msi_domain_alloc_irqs_descs_locked(domain, dev, nvec);
958         msi_unlock_descs(dev);
959         return ret;
960 }
961
962 void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
963 {
964         struct msi_domain_info *info = domain->host_data;
965         struct irq_data *irqd;
966         struct msi_desc *desc;
967         int i;
968
969         /* Only handle MSI entries which have an interrupt associated */
970         msi_for_each_desc(desc, dev, MSI_DESC_ASSOCIATED) {
971                 /* Make sure all interrupts are deactivated */
972                 for (i = 0; i < desc->nvec_used; i++) {
973                         irqd = irq_domain_get_irq_data(domain, desc->irq + i);
974                         if (irqd && irqd_is_activated(irqd))
975                                 irq_domain_deactivate_irq(irqd);
976                 }
977
978                 irq_domain_free_irqs(desc->irq, desc->nvec_used);
979                 if (info->flags & MSI_FLAG_DEV_SYSFS)
980                         msi_sysfs_remove_desc(dev, desc);
981                 desc->irq = 0;
982         }
983 }
984
985 static void msi_domain_free_msi_descs(struct msi_domain_info *info,
986                                       struct device *dev)
987 {
988         if (info->flags & MSI_FLAG_FREE_MSI_DESCS)
989                 msi_free_msi_descs(dev);
990 }
991
992 /**
993  * msi_domain_free_irqs_descs_locked - Free interrupts from a MSI interrupt @domain associated to @dev
994  * @domain:     The domain to managing the interrupts
995  * @dev:        Pointer to device struct of the device for which the interrupts
996  *              are free
997  *
998  * Must be invoked from within a msi_lock_descs() / msi_unlock_descs()
999  * pair. Use this for MSI irqdomains which implement their own vector
1000  * allocation.
1001  */
1002 void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device *dev)
1003 {
1004         struct msi_domain_info *info = domain->host_data;
1005         struct msi_domain_ops *ops = info->ops;
1006
1007         lockdep_assert_held(&dev->msi.data->mutex);
1008
1009         ops->domain_free_irqs(domain, dev);
1010         msi_domain_free_msi_descs(info, dev);
1011 }
1012
1013 /**
1014  * msi_domain_free_irqs - Free interrupts from a MSI interrupt @domain associated to @dev
1015  * @domain:     The domain to managing the interrupts
1016  * @dev:        Pointer to device struct of the device for which the interrupts
1017  *              are free
1018  */
1019 void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
1020 {
1021         msi_lock_descs(dev);
1022         msi_domain_free_irqs_descs_locked(domain, dev);
1023         msi_unlock_descs(dev);
1024 }
1025
1026 /**
1027  * msi_get_domain_info - Get the MSI interrupt domain info for @domain
1028  * @domain:     The interrupt domain to retrieve data from
1029  *
1030  * Return: the pointer to the msi_domain_info stored in @domain->host_data.
1031  */
1032 struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain)
1033 {
1034         return (struct msi_domain_info *)domain->host_data;
1035 }
1036
1037 #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */