vgic-irqfd.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2015, 2016 ARM Ltd.
  4. */
  5. #include <linux/kvm.h>
  6. #include <linux/kvm_host.h>
  7. #include <trace/events/kvm.h>
  8. #include <kvm/arm_vgic.h>
  9. #include "vgic.h"
  10. /**
  11. * vgic_irqfd_set_irq: inject the IRQ corresponding to the
  12. * irqchip routing entry
  13. *
  14. * This is the entry point for irqfd IRQ injection
  15. */
  16. static int vgic_irqfd_set_irq(struct kvm_kernel_irq_routing_entry *e,
  17. struct kvm *kvm, int irq_source_id,
  18. int level, bool line_status)
  19. {
  20. unsigned int spi_id = e->irqchip.pin + VGIC_NR_PRIVATE_IRQS;
  21. if (!vgic_valid_spi(kvm, spi_id))
  22. return -EINVAL;
  23. return kvm_vgic_inject_irq(kvm, 0, spi_id, level, NULL);
  24. }
  25. /**
  26. * kvm_set_routing_entry: populate a kvm routing entry
  27. * from a user routing entry
  28. *
  29. * @kvm: the VM this entry is applied to
  30. * @e: kvm kernel routing entry handle
  31. * @ue: user api routing entry handle
  32. * return 0 on success, -EINVAL on errors.
  33. */
  34. int kvm_set_routing_entry(struct kvm *kvm,
  35. struct kvm_kernel_irq_routing_entry *e,
  36. const struct kvm_irq_routing_entry *ue)
  37. {
  38. int r = -EINVAL;
  39. switch (ue->type) {
  40. case KVM_IRQ_ROUTING_IRQCHIP:
  41. e->set = vgic_irqfd_set_irq;
  42. e->irqchip.irqchip = ue->u.irqchip.irqchip;
  43. e->irqchip.pin = ue->u.irqchip.pin;
  44. if ((e->irqchip.pin >= KVM_IRQCHIP_NUM_PINS) ||
  45. (e->irqchip.irqchip >= KVM_NR_IRQCHIPS))
  46. goto out;
  47. break;
  48. case KVM_IRQ_ROUTING_MSI:
  49. e->set = kvm_set_msi;
  50. e->msi.address_lo = ue->u.msi.address_lo;
  51. e->msi.address_hi = ue->u.msi.address_hi;
  52. e->msi.data = ue->u.msi.data;
  53. e->msi.flags = ue->flags;
  54. e->msi.devid = ue->u.msi.devid;
  55. break;
  56. default:
  57. goto out;
  58. }
  59. r = 0;
  60. out:
  61. return r;
  62. }
  63. static void kvm_populate_msi(struct kvm_kernel_irq_routing_entry *e,
  64. struct kvm_msi *msi)
  65. {
  66. msi->address_lo = e->msi.address_lo;
  67. msi->address_hi = e->msi.address_hi;
  68. msi->data = e->msi.data;
  69. msi->flags = e->msi.flags;
  70. msi->devid = e->msi.devid;
  71. }
  72. /**
  73. * kvm_set_msi: inject the MSI corresponding to the
  74. * MSI routing entry
  75. *
  76. * This is the entry point for irqfd MSI injection
  77. * and userspace MSI injection.
  78. */
  79. int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
  80. struct kvm *kvm, int irq_source_id,
  81. int level, bool line_status)
  82. {
  83. struct kvm_msi msi;
  84. if (!vgic_has_its(kvm))
  85. return -ENODEV;
  86. if (!level)
  87. return -1;
  88. kvm_populate_msi(e, &msi);
  89. return vgic_its_inject_msi(kvm, &msi);
  90. }
  91. /**
  92. * kvm_arch_set_irq_inatomic: fast-path for irqfd injection
  93. */
  94. int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
  95. struct kvm *kvm, int irq_source_id, int level,
  96. bool line_status)
  97. {
  98. if (!level)
  99. return -EWOULDBLOCK;
  100. switch (e->type) {
  101. case KVM_IRQ_ROUTING_MSI: {
  102. struct kvm_msi msi;
  103. if (!vgic_has_its(kvm))
  104. break;
  105. kvm_populate_msi(e, &msi);
  106. return vgic_its_inject_cached_translation(kvm, &msi);
  107. }
  108. case KVM_IRQ_ROUTING_IRQCHIP:
  109. /*
  110. * Injecting SPIs is always possible in atomic context
  111. * as long as the damn vgic is initialized.
  112. */
  113. if (unlikely(!vgic_initialized(kvm)))
  114. break;
  115. return vgic_irqfd_set_irq(e, kvm, irq_source_id, 1, line_status);
  116. }
  117. return -EWOULDBLOCK;
  118. }
  119. int kvm_vgic_setup_default_irq_routing(struct kvm *kvm)
  120. {
  121. struct kvm_irq_routing_entry *entries;
  122. struct vgic_dist *dist = &kvm->arch.vgic;
  123. u32 nr = dist->nr_spis;
  124. int i, ret;
  125. entries = kcalloc(nr, sizeof(*entries), GFP_KERNEL_ACCOUNT);
  126. if (!entries)
  127. return -ENOMEM;
  128. for (i = 0; i < nr; i++) {
  129. entries[i].gsi = i;
  130. entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;
  131. entries[i].u.irqchip.irqchip = 0;
  132. entries[i].u.irqchip.pin = i;
  133. }
  134. ret = kvm_set_irq_routing(kvm, entries, nr, 0);
  135. kfree(entries);
  136. return ret;
  137. }