2 * Definitions used in MIPS MT SMTC "Interprocessor Interrupt" code.
4 #ifndef __ASM_SMTC_IPI_H
5 #define __ASM_SMTC_IPI_H
7 #include <linux/spinlock.h>
9 //#define SMTC_IPI_DEBUG
12 #include <asm/mipsregs.h>
13 #include <asm/mipsmtregs.h>
14 #endif /* SMTC_IPI_DEBUG */
21 struct smtc_ipi
*flink
;
28 #endif /* SMTC_IPI_DEBUG */
35 #define LINUX_SMP_IPI 1
36 #define SMTC_CLOCK_TICK 2
37 #define IRQ_AFFINITY_IPI 3
40 * A queue of IPI messages
44 struct smtc_ipi
*head
;
46 struct smtc_ipi
*tail
;
48 int resched_flag
; /* reschedule already queued */
51 static inline void smtc_ipi_nq(struct smtc_ipi_q
*q
, struct smtc_ipi
*p
)
55 spin_lock_irqsave(&q
->lock
, flags
);
57 q
->head
= q
->tail
= p
;
64 p
->sender
= read_c0_tcbind();
65 p
->stamp
= read_c0_count();
66 #endif /* SMTC_IPI_DEBUG */
67 spin_unlock_irqrestore(&q
->lock
, flags
);
70 static inline struct smtc_ipi
*__smtc_ipi_dq(struct smtc_ipi_q
*q
)
78 q
->head
= q
->head
->flink
;
80 /* Arguably unnecessary, but leaves queue cleaner */
88 static inline struct smtc_ipi
*smtc_ipi_dq(struct smtc_ipi_q
*q
)
93 spin_lock_irqsave(&q
->lock
, flags
);
95 spin_unlock_irqrestore(&q
->lock
, flags
);
100 static inline void smtc_ipi_req(struct smtc_ipi_q
*q
, struct smtc_ipi
*p
)
104 spin_lock_irqsave(&q
->lock
, flags
);
105 if (q
->head
== NULL
) {
106 q
->head
= q
->tail
= p
;
113 spin_unlock_irqrestore(&q
->lock
, flags
);
116 static inline int smtc_ipi_qdepth(struct smtc_ipi_q
*q
)
121 spin_lock_irqsave(&q
->lock
, flags
);
123 spin_unlock_irqrestore(&q
->lock
, flags
);
127 extern void smtc_send_ipi(int cpu
, int type
, unsigned int action
);
129 #endif /* __ASM_SMTC_IPI_H */