patch-2.1.92 linux/include/asm-alpha/hardirq.h

Next file: linux/include/asm-alpha/hwrpb.h
Previous file: linux/include/asm-alpha/cia.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.91/linux/include/asm-alpha/hardirq.h linux/include/asm-alpha/hardirq.h
@@ -17,7 +17,65 @@
 
 #else
 
-#error No habla alpha SMP
+/* initially just a straight copy if the i386 code */
+
+#include <asm/atomic.h>
+#include <asm/spinlock.h>
+#include <asm/system.h>
+#include <asm/smp.h>
+
+extern unsigned char global_irq_holder;
+extern spinlock_t global_irq_lock;
+extern atomic_t global_irq_count;
+
+static inline void release_irqlock(int cpu)
+{
+	/* if we didn't own the irq lock, just ignore.. */
+	if (global_irq_holder == (unsigned char) cpu) {
+		global_irq_holder = NO_PROC_ID;
+		spin_unlock(&global_irq_lock);
+        }
+}
+
+/* Ordering of the counter bumps is _deadly_ important. */
+static inline void hardirq_enter(int cpu)
+{
+	++local_irq_count[cpu];
+        atomic_inc(&global_irq_count);
+}
+
+static inline void hardirq_exit(int cpu)
+{
+	atomic_dec(&global_irq_count);
+        --local_irq_count[cpu];
+}
+
+static inline int hardirq_trylock(int cpu)
+{
+	unsigned long flags;
+	int ret = 1;
+
+        __save_and_cli(flags);
+        if ((atomic_add_return(1, &global_irq_count) != 1) ||
+	    (global_irq_lock.lock != 0)) {
+		atomic_dec(&global_irq_count);
+                __restore_flags(flags);
+                ret = 0;
+        } else {
+		++local_irq_count[cpu];
+                __sti();
+        }
+        return ret;
+}
+
+#define hardirq_endlock(cpu) \
+	do { \
+	       __cli(); \
+		hardirq_exit(cpu); \
+		__sti(); \
+	} while (0)
+
+extern void synchronize_irq(void);
 
 #endif /* __SMP__ */
 #endif /* _ALPHA_HARDIRQ_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov