1c865f654SCornelia Huck #ifndef _X86_APIC_H_ 2c865f654SCornelia Huck #define _X86_APIC_H_ 37d36db35SAvi Kivity 47d36db35SAvi Kivity #include <stdint.h> 57d36db35SAvi Kivity #include "apic-defs.h" 67d36db35SAvi Kivity 718a34cceSNadav Amit extern u8 id_map[MAX_TEST_CPUS]; 818a34cceSNadav Amit 9f66d11caSArbel Moshe extern void *g_apic; 10f66d11caSArbel Moshe extern void *g_ioapic; 11f66d11caSArbel Moshe 127d36db35SAvi Kivity typedef struct { 137d36db35SAvi Kivity uint8_t vector; 147d36db35SAvi Kivity uint8_t delivery_mode:3; 157d36db35SAvi Kivity uint8_t dest_mode:1; 167d36db35SAvi Kivity uint8_t delivery_status:1; 177d36db35SAvi Kivity uint8_t polarity:1; 187d36db35SAvi Kivity uint8_t remote_irr:1; 197d36db35SAvi Kivity uint8_t trig_mode:1; 207d36db35SAvi Kivity uint8_t mask:1; 217d36db35SAvi Kivity uint8_t reserve:7; 227d36db35SAvi Kivity uint8_t reserved[4]; 237d36db35SAvi Kivity uint8_t dest_id; 247d36db35SAvi Kivity } ioapic_redir_entry_t; 257d36db35SAvi Kivity 260172b95cSPeter Xu typedef enum trigger_mode { 270172b95cSPeter Xu TRIGGER_EDGE = 0, 280172b95cSPeter Xu TRIGGER_LEVEL, 290172b95cSPeter Xu TRIGGER_MAX, 300172b95cSPeter Xu } trigger_mode_t; 310172b95cSPeter Xu 327d36db35SAvi Kivity void mask_pic_interrupts(void); 337d36db35SAvi Kivity 340f187a08SSteve Rutherford void eoi(void); 35e0a5cfcaSPaolo Bonzini uint8_t apic_get_tpr(void); 36e0a5cfcaSPaolo Bonzini void apic_set_tpr(uint8_t tpr); 370f187a08SSteve Rutherford 387d36db35SAvi Kivity void ioapic_write_redir(unsigned line, ioapic_redir_entry_t e); 397d36db35SAvi Kivity void ioapic_write_reg(unsigned reg, uint32_t value); 400f187a08SSteve Rutherford ioapic_redir_entry_t ioapic_read_redir(unsigned line); 410f187a08SSteve Rutherford uint32_t ioapic_read_reg(unsigned reg); 420f187a08SSteve Rutherford 4322207960SLiran Alon void ioapic_set_redir(unsigned line, unsigned vec, 44f66d11caSArbel Moshe trigger_mode_t trig_mode); 45f66d11caSArbel Moshe 460f187a08SSteve Rutherford void set_mask(unsigned line, int mask); 477d36db35SAvi Kivity 48f66d11caSArbel Moshe void set_irq_line(unsigned line, int val); 49f66d11caSArbel Moshe 507d36db35SAvi Kivity void enable_apic(void); 517d36db35SAvi Kivity uint32_t apic_read(unsigned reg); 527c5f3ee9SPaolo Bonzini bool apic_read_bit(unsigned reg, int n); 537d36db35SAvi Kivity void apic_write(unsigned reg, uint32_t val); 547d36db35SAvi Kivity void apic_icr_write(uint32_t val, uint32_t dest); 557d36db35SAvi Kivity uint32_t apic_id(void); 56*d8de5a33SSean Christopherson uint32_t pre_boot_apic_id(void); 57*d8de5a33SSean Christopherson 587d36db35SAvi Kivity 597d36db35SAvi Kivity int enable_x2apic(void); 60e38858bcSJim Mattson void disable_apic(void); 61a222b5e2SRadim Krčmář void reset_apic(void); 6218a34cceSNadav Amit void init_apic_map(void); 637d36db35SAvi Kivity 64268752cdSMarc Orr /* Converts byte-addressable APIC register offset to 4-byte offset. */ 65268752cdSMarc Orr static inline u32 apic_reg_index(u32 reg) 66268752cdSMarc Orr { 67268752cdSMarc Orr return reg >> 2; 68268752cdSMarc Orr } 69268752cdSMarc Orr 702a2546b7SMarc Orr static inline u32 x2apic_msr(u32 reg) 712a2546b7SMarc Orr { 722a2546b7SMarc Orr return APIC_BASE_MSR + (reg >> 4); 732a2546b7SMarc Orr } 742a2546b7SMarc Orr 7519697109SNadav Amit static inline bool apic_lvt_entry_supported(int idx) 7619697109SNadav Amit { 7719697109SNadav Amit return GET_APIC_MAXLVT(apic_read(APIC_LVR)) >= idx; 7819697109SNadav Amit } 7919697109SNadav Amit 802a2546b7SMarc Orr static inline bool x2apic_reg_reserved(u32 reg) 812a2546b7SMarc Orr { 822a2546b7SMarc Orr switch (reg) { 832a2546b7SMarc Orr case 0x000 ... 0x010: 842a2546b7SMarc Orr case 0x040 ... 0x070: 859e2e12c4SNadav Amit case 0x090: 862a2546b7SMarc Orr case 0x0c0: 872a2546b7SMarc Orr case 0x0e0: 882a2546b7SMarc Orr case 0x290 ... 0x2e0: 892a2546b7SMarc Orr case 0x310: 902a2546b7SMarc Orr case 0x3a0 ... 0x3d0: 912a2546b7SMarc Orr case 0x3f0: 922a2546b7SMarc Orr return true; 9319697109SNadav Amit case APIC_CMCI: 9419697109SNadav Amit return !apic_lvt_entry_supported(6); 952a2546b7SMarc Orr default: 962a2546b7SMarc Orr return false; 972a2546b7SMarc Orr } 982a2546b7SMarc Orr } 992a2546b7SMarc Orr 1007d36db35SAvi Kivity #endif 101