1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _X86_POSTED_INTR_H 3 #define _X86_POSTED_INTR_H 4 5 #define POSTED_INTR_ON 0 6 #define POSTED_INTR_SN 1 7 8 #define PID_TABLE_ENTRY_VALID 1 9 10 /* Posted-Interrupt Descriptor */ 11 struct pi_desc { 12 u32 pir[8]; /* Posted interrupt requested */ 13 union { 14 struct { 15 /* bit 256 - Outstanding Notification */ 16 u16 on : 1, 17 /* bit 257 - Suppress Notification */ 18 sn : 1, 19 /* bit 271:258 - Reserved */ 20 rsvd_1 : 14; 21 /* bit 279:272 - Notification Vector */ 22 u8 nv; 23 /* bit 287:280 - Reserved */ 24 u8 rsvd_2; 25 /* bit 319:288 - Notification Destination */ 26 u32 ndst; 27 }; 28 u64 control; 29 }; 30 u32 rsvd[6]; 31 } __aligned(64); 32 33 static inline bool pi_test_and_set_on(struct pi_desc *pi_desc) 34 { 35 return test_and_set_bit(POSTED_INTR_ON, (unsigned long *)&pi_desc->control); 36 } 37 38 static inline bool pi_test_and_clear_on(struct pi_desc *pi_desc) 39 { 40 return test_and_clear_bit(POSTED_INTR_ON, (unsigned long *)&pi_desc->control); 41 } 42 43 static inline bool pi_test_and_clear_sn(struct pi_desc *pi_desc) 44 { 45 return test_and_clear_bit(POSTED_INTR_SN, (unsigned long *)&pi_desc->control); 46 } 47 48 static inline bool pi_test_and_set_pir(int vector, struct pi_desc *pi_desc) 49 { 50 return test_and_set_bit(vector, (unsigned long *)pi_desc->pir); 51 } 52 53 static inline bool pi_is_pir_empty(struct pi_desc *pi_desc) 54 { 55 return bitmap_empty((unsigned long *)pi_desc->pir, NR_VECTORS); 56 } 57 58 static inline void pi_set_sn(struct pi_desc *pi_desc) 59 { 60 set_bit(POSTED_INTR_SN, (unsigned long *)&pi_desc->control); 61 } 62 63 static inline void pi_set_on(struct pi_desc *pi_desc) 64 { 65 set_bit(POSTED_INTR_ON, (unsigned long *)&pi_desc->control); 66 } 67 68 static inline void pi_clear_on(struct pi_desc *pi_desc) 69 { 70 clear_bit(POSTED_INTR_ON, (unsigned long *)&pi_desc->control); 71 } 72 73 static inline void pi_clear_sn(struct pi_desc *pi_desc) 74 { 75 clear_bit(POSTED_INTR_SN, (unsigned long *)&pi_desc->control); 76 } 77 78 static inline bool pi_test_on(struct pi_desc *pi_desc) 79 { 80 return test_bit(POSTED_INTR_ON, (unsigned long *)&pi_desc->control); 81 } 82 83 static inline bool pi_test_sn(struct pi_desc *pi_desc) 84 { 85 return test_bit(POSTED_INTR_SN, (unsigned long *)&pi_desc->control); 86 } 87 88 #endif /* _X86_POSTED_INTR_H */ 89