ioapic.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __KVM_IO_APIC_H
  3. #define __KVM_IO_APIC_H
  4. #include <linux/kvm_host.h>
  5. #include <kvm/iodev.h>
  6. struct kvm;
  7. struct kvm_vcpu;
  8. #define IOAPIC_NUM_PINS KVM_IOAPIC_NUM_PINS
  9. #define MAX_NR_RESERVED_IOAPIC_PINS KVM_MAX_IRQ_ROUTES
  10. #define IOAPIC_VERSION_ID 0x11 /* IOAPIC version */
  11. #define IOAPIC_EDGE_TRIG 0
  12. #define IOAPIC_LEVEL_TRIG 1
  13. #define IOAPIC_DEFAULT_BASE_ADDRESS 0xfec00000
  14. #define IOAPIC_MEM_LENGTH 0x100
  15. /* Direct registers. */
  16. #define IOAPIC_REG_SELECT 0x00
  17. #define IOAPIC_REG_WINDOW 0x10
  18. /* Indirect registers. */
  19. #define IOAPIC_REG_APIC_ID 0x00 /* x86 IOAPIC only */
  20. #define IOAPIC_REG_VERSION 0x01
  21. #define IOAPIC_REG_ARB_ID 0x02 /* x86 IOAPIC only */
  22. /*ioapic delivery mode*/
  23. #define IOAPIC_FIXED 0x0
  24. #define IOAPIC_LOWEST_PRIORITY 0x1
  25. #define IOAPIC_PMI 0x2
  26. #define IOAPIC_NMI 0x4
  27. #define IOAPIC_INIT 0x5
  28. #define IOAPIC_EXTINT 0x7
  29. #ifdef CONFIG_X86
  30. #define RTC_GSI 8
  31. #else
  32. #define RTC_GSI -1U
  33. #endif
  34. struct dest_map {
  35. /* vcpu bitmap where IRQ has been sent */
  36. DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
  37. /*
  38. * Vector sent to a given vcpu, only valid when
  39. * the vcpu's bit in map is set
  40. */
  41. u8 vectors[KVM_MAX_VCPU_ID];
  42. };
  43. struct rtc_status {
  44. int pending_eoi;
  45. struct dest_map dest_map;
  46. };
  47. union kvm_ioapic_redirect_entry {
  48. u64 bits;
  49. struct {
  50. u8 vector;
  51. u8 delivery_mode:3;
  52. u8 dest_mode:1;
  53. u8 delivery_status:1;
  54. u8 polarity:1;
  55. u8 remote_irr:1;
  56. u8 trig_mode:1;
  57. u8 mask:1;
  58. u8 reserve:7;
  59. u8 reserved[4];
  60. u8 dest_id;
  61. } fields;
  62. };
  63. struct kvm_ioapic {
  64. u64 base_address;
  65. u32 ioregsel;
  66. u32 id;
  67. u32 irr;
  68. u32 pad;
  69. union kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
  70. unsigned long irq_states[IOAPIC_NUM_PINS];
  71. struct kvm_io_device dev;
  72. struct kvm *kvm;
  73. void (*ack_notifier)(void *opaque, int irq);
  74. spinlock_t lock;
  75. struct rtc_status rtc_status;
  76. struct delayed_work eoi_inject;
  77. u32 irq_eoi[IOAPIC_NUM_PINS];
  78. u32 irr_delivered;
  79. };
  80. #ifdef DEBUG
  81. #define ASSERT(x) \
  82. do { \
  83. if (!(x)) { \
  84. printk(KERN_EMERG "assertion failed %s: %d: %s\n", \
  85. __FILE__, __LINE__, #x); \
  86. BUG(); \
  87. } \
  88. } while (0)
  89. #else
  90. #define ASSERT(x) do { } while (0)
  91. #endif
  92. static inline int ioapic_in_kernel(struct kvm *kvm)
  93. {
  94. int mode = kvm->arch.irqchip_mode;
  95. /* Matches smp_wmb() when setting irqchip_mode */
  96. smp_rmb();
  97. return mode == KVM_IRQCHIP_KERNEL;
  98. }
  99. void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu);
  100. bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
  101. int short_hand, unsigned int dest, int dest_mode);
  102. int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2);
  103. void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector,
  104. int trigger_mode);
  105. int kvm_ioapic_init(struct kvm *kvm);
  106. void kvm_ioapic_destroy(struct kvm *kvm);
  107. int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,
  108. int level, bool line_status);
  109. void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id);
  110. int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
  111. struct kvm_lapic_irq *irq,
  112. struct dest_map *dest_map);
  113. void kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
  114. void kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
  115. void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu,
  116. ulong *ioapic_handled_vectors);
  117. void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
  118. ulong *ioapic_handled_vectors);
  119. #endif