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
39 * A queue of IPI messages
43 struct smtc_ipi *head;
45 struct smtc_ipi *tail;
49 static inline void smtc_ipi_nq(struct smtc_ipi_q *q, struct smtc_ipi *p)
53 spin_lock_irqsave(&q->lock, flags);
55 q->head = q->tail = p;
62 p->sender = read_c0_tcbind();
63 p->stamp = read_c0_count();
64 #endif /* SMTC_IPI_DEBUG */
65 spin_unlock_irqrestore(&q->lock, flags);
68 static inline struct smtc_ipi *smtc_ipi_dq(struct smtc_ipi_q *q)
73 spin_lock_irqsave(&q->lock, flags);
78 q->head = q->head->flink;
80 /* Arguably unnecessary, but leaves queue cleaner */
84 spin_unlock_irqrestore(&q->lock, flags);
88 static inline void smtc_ipi_req(struct smtc_ipi_q *q, struct smtc_ipi *p)
92 spin_lock_irqsave(&q->lock, flags);
93 if (q->head == NULL) {
94 q->head = q->tail = p;
101 spin_unlock_irqrestore(&q->lock, flags);
104 static inline int smtc_ipi_qdepth(struct smtc_ipi_q *q)
109 spin_lock_irqsave(&q->lock, flags);
111 spin_unlock_irqrestore(&q->lock, flags);
115 extern void smtc_send_ipi(int cpu, int type, unsigned int action);
117 #endif /* __ASM_SMTC_IPI_H */