mpic_msi.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright 2006-2007, Michael Ellerman, IBM Corporation.
  4. */
  5. #include <linux/irq.h>
  6. #include <linux/bitmap.h>
  7. #include <linux/msi.h>
  8. #include <asm/mpic.h>
  9. #include <asm/prom.h>
  10. #include <asm/hw_irq.h>
  11. #include <asm/ppc-pci.h>
  12. #include <asm/msi_bitmap.h>
  13. #include <sysdev/mpic.h>
  14. void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
  15. {
  16. /* The mpic calls this even when there is no allocator setup */
  17. if (!mpic->msi_bitmap.bitmap)
  18. return;
  19. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
  20. }
  21. #ifdef CONFIG_MPIC_U3_HT_IRQS
  22. static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
  23. {
  24. irq_hw_number_t hwirq;
  25. const struct irq_domain_ops *ops = mpic->irqhost->ops;
  26. struct device_node *np;
  27. int flags, index, i;
  28. struct of_phandle_args oirq;
  29. pr_debug("mpic: found U3, guessing msi allocator setup\n");
  30. /* Reserve source numbers we know are reserved in the HW.
  31. *
  32. * This is a bit of a mix of U3 and U4 reserves but that's going
  33. * to work fine, we have plenty enugh numbers left so let's just
  34. * mark anything we don't like reserved.
  35. */
  36. for (i = 0; i < 8; i++)
  37. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
  38. for (i = 42; i < 46; i++)
  39. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
  40. for (i = 100; i < 105; i++)
  41. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
  42. for (i = 124; i < mpic->num_sources; i++)
  43. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
  44. np = NULL;
  45. while ((np = of_find_all_nodes(np))) {
  46. pr_debug("mpic: mapping hwirqs for %pOF\n", np);
  47. index = 0;
  48. while (of_irq_parse_one(np, index++, &oirq) == 0) {
  49. ops->xlate(mpic->irqhost, NULL, oirq.args,
  50. oirq.args_count, &hwirq, &flags);
  51. msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
  52. }
  53. }
  54. return 0;
  55. }
  56. #else
  57. static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
  58. {
  59. return -1;
  60. }
  61. #endif
  62. int mpic_msi_init_allocator(struct mpic *mpic)
  63. {
  64. int rc;
  65. rc = msi_bitmap_alloc(&mpic->msi_bitmap, mpic->num_sources,
  66. irq_domain_get_of_node(mpic->irqhost));
  67. if (rc)
  68. return rc;
  69. rc = msi_bitmap_reserve_dt_hwirqs(&mpic->msi_bitmap);
  70. if (rc > 0) {
  71. if (mpic->flags & MPIC_U3_HT_IRQS)
  72. rc = mpic_msi_reserve_u3_hwirqs(mpic);
  73. if (rc) {
  74. msi_bitmap_free(&mpic->msi_bitmap);
  75. return rc;
  76. }
  77. }
  78. return 0;
  79. }