xref: /openbmc/linux/arch/x86/kvm/ioapic.h (revision 9dba4d24)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
26ef768faSPaolo Bonzini #ifndef __KVM_IO_APIC_H
36ef768faSPaolo Bonzini #define __KVM_IO_APIC_H
46ef768faSPaolo Bonzini 
56ef768faSPaolo Bonzini #include <linux/kvm_host.h>
6af669ac6SAndre Przywara #include <kvm/iodev.h>
788197e6aS彭浩(Richard) #include "irq.h"
86ef768faSPaolo Bonzini 
96ef768faSPaolo Bonzini struct kvm;
106ef768faSPaolo Bonzini struct kvm_vcpu;
116ef768faSPaolo Bonzini 
126ef768faSPaolo Bonzini #define IOAPIC_NUM_PINS  KVM_IOAPIC_NUM_PINS
13b053b2aeSSteve Rutherford #define MAX_NR_RESERVED_IOAPIC_PINS KVM_MAX_IRQ_ROUTES
146ef768faSPaolo Bonzini #define IOAPIC_VERSION_ID 0x11	/* IOAPIC version */
156ef768faSPaolo Bonzini #define IOAPIC_EDGE_TRIG  0
166ef768faSPaolo Bonzini #define IOAPIC_LEVEL_TRIG 1
176ef768faSPaolo Bonzini 
186ef768faSPaolo Bonzini #define IOAPIC_DEFAULT_BASE_ADDRESS  0xfec00000
196ef768faSPaolo Bonzini #define IOAPIC_MEM_LENGTH            0x100
206ef768faSPaolo Bonzini 
216ef768faSPaolo Bonzini /* Direct registers. */
226ef768faSPaolo Bonzini #define IOAPIC_REG_SELECT  0x00
236ef768faSPaolo Bonzini #define IOAPIC_REG_WINDOW  0x10
246ef768faSPaolo Bonzini 
256ef768faSPaolo Bonzini /* Indirect registers. */
266ef768faSPaolo Bonzini #define IOAPIC_REG_APIC_ID 0x00	/* x86 IOAPIC only */
276ef768faSPaolo Bonzini #define IOAPIC_REG_VERSION 0x01
286ef768faSPaolo Bonzini #define IOAPIC_REG_ARB_ID  0x02	/* x86 IOAPIC only */
296ef768faSPaolo Bonzini 
306ef768faSPaolo Bonzini /*ioapic delivery mode*/
316ef768faSPaolo Bonzini #define	IOAPIC_FIXED			0x0
326ef768faSPaolo Bonzini #define	IOAPIC_LOWEST_PRIORITY		0x1
336ef768faSPaolo Bonzini #define	IOAPIC_PMI			0x2
346ef768faSPaolo Bonzini #define	IOAPIC_NMI			0x4
356ef768faSPaolo Bonzini #define	IOAPIC_INIT			0x5
366ef768faSPaolo Bonzini #define	IOAPIC_EXTINT			0x7
376ef768faSPaolo Bonzini 
386ef768faSPaolo Bonzini #define RTC_GSI 8
396ef768faSPaolo Bonzini 
409e4aabe2SJoerg Roedel struct dest_map {
419daa5007SJoerg Roedel 	/* vcpu bitmap where IRQ has been sent */
42*a1c42ddeSJuergen Gross 	DECLARE_BITMAP(map, KVM_MAX_VCPU_IDS);
439daa5007SJoerg Roedel 
449daa5007SJoerg Roedel 	/*
459daa5007SJoerg Roedel 	 * Vector sent to a given vcpu, only valid when
469daa5007SJoerg Roedel 	 * the vcpu's bit in map is set
479daa5007SJoerg Roedel 	 */
48*a1c42ddeSJuergen Gross 	u8 vectors[KVM_MAX_VCPU_IDS];
499e4aabe2SJoerg Roedel };
509e4aabe2SJoerg Roedel 
519e4aabe2SJoerg Roedel 
526ef768faSPaolo Bonzini struct rtc_status {
536ef768faSPaolo Bonzini 	int pending_eoi;
549e4aabe2SJoerg Roedel 	struct dest_map dest_map;
556ef768faSPaolo Bonzini };
566ef768faSPaolo Bonzini 
57cb5281a5SPaolo Bonzini union kvm_ioapic_redirect_entry {
58cb5281a5SPaolo Bonzini 	u64 bits;
59cb5281a5SPaolo Bonzini 	struct {
60cb5281a5SPaolo Bonzini 		u8 vector;
61cb5281a5SPaolo Bonzini 		u8 delivery_mode:3;
62cb5281a5SPaolo Bonzini 		u8 dest_mode:1;
63cb5281a5SPaolo Bonzini 		u8 delivery_status:1;
64cb5281a5SPaolo Bonzini 		u8 polarity:1;
65cb5281a5SPaolo Bonzini 		u8 remote_irr:1;
66cb5281a5SPaolo Bonzini 		u8 trig_mode:1;
67cb5281a5SPaolo Bonzini 		u8 mask:1;
68cb5281a5SPaolo Bonzini 		u8 reserve:7;
69cb5281a5SPaolo Bonzini 		u8 reserved[4];
70cb5281a5SPaolo Bonzini 		u8 dest_id;
71cb5281a5SPaolo Bonzini 	} fields;
72cb5281a5SPaolo Bonzini };
73cb5281a5SPaolo Bonzini 
746ef768faSPaolo Bonzini struct kvm_ioapic {
756ef768faSPaolo Bonzini 	u64 base_address;
766ef768faSPaolo Bonzini 	u32 ioregsel;
776ef768faSPaolo Bonzini 	u32 id;
786ef768faSPaolo Bonzini 	u32 irr;
796ef768faSPaolo Bonzini 	u32 pad;
806ef768faSPaolo Bonzini 	union kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
816ef768faSPaolo Bonzini 	unsigned long irq_states[IOAPIC_NUM_PINS];
826ef768faSPaolo Bonzini 	struct kvm_io_device dev;
836ef768faSPaolo Bonzini 	struct kvm *kvm;
846ef768faSPaolo Bonzini 	spinlock_t lock;
856ef768faSPaolo Bonzini 	struct rtc_status rtc_status;
866ef768faSPaolo Bonzini 	struct delayed_work eoi_inject;
876ef768faSPaolo Bonzini 	u32 irq_eoi[IOAPIC_NUM_PINS];
885bda6eedSWincy Van 	u32 irr_delivered;
896ef768faSPaolo Bonzini };
906ef768faSPaolo Bonzini 
916ef768faSPaolo Bonzini #ifdef DEBUG
926ef768faSPaolo Bonzini #define ASSERT(x)  							\
936ef768faSPaolo Bonzini do {									\
946ef768faSPaolo Bonzini 	if (!(x)) {							\
956ef768faSPaolo Bonzini 		printk(KERN_EMERG "assertion failed %s: %d: %s\n",	\
966ef768faSPaolo Bonzini 		       __FILE__, __LINE__, #x);				\
976ef768faSPaolo Bonzini 		BUG();							\
986ef768faSPaolo Bonzini 	}								\
996ef768faSPaolo Bonzini } while (0)
1006ef768faSPaolo Bonzini #else
1016ef768faSPaolo Bonzini #define ASSERT(x) do { } while (0)
1026ef768faSPaolo Bonzini #endif
1036ef768faSPaolo Bonzini 
ioapic_in_kernel(struct kvm * kvm)10449df6397SSteve Rutherford static inline int ioapic_in_kernel(struct kvm *kvm)
10549df6397SSteve Rutherford {
10688197e6aS彭浩(Richard) 	return irqchip_kernel(kvm);
10749df6397SSteve Rutherford }
10849df6397SSteve Rutherford 
1096ef768faSPaolo Bonzini void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu);
1106ef768faSPaolo Bonzini void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector,
1116ef768faSPaolo Bonzini 			int trigger_mode);
1126ef768faSPaolo Bonzini int kvm_ioapic_init(struct kvm *kvm);
1136ef768faSPaolo Bonzini void kvm_ioapic_destroy(struct kvm *kvm);
1146ef768faSPaolo Bonzini int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,
1156ef768faSPaolo Bonzini 		       int level, bool line_status);
1166ef768faSPaolo Bonzini void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id);
11733392b49SDavid Hildenbrand void kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
11833392b49SDavid Hildenbrand void kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
1196308630bSAndrey Smetanin void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu,
1206308630bSAndrey Smetanin 			   ulong *ioapic_handled_vectors);
1216308630bSAndrey Smetanin void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
1226308630bSAndrey Smetanin 			    ulong *ioapic_handled_vectors);
1236ef768faSPaolo Bonzini #endif
124