diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-03-14 01:39:27 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-03-14 01:39:27 +0000 |
commit | ce1a9d7d9ebf3bc87c544d06542a3d30f604dca5 (patch) | |
tree | 7e1c263dc7b02602aa730654465bca583883d9dd /include/asm-mips64/hardirq.h | |
parent | f8dfaf80bdc1a29fba2da8e1abc61a30da7ba6ab (diff) |
MIPS64 SMP, compile only edition. Don't use yet ...
Diffstat (limited to 'include/asm-mips64/hardirq.h')
-rw-r--r-- | include/asm-mips64/hardirq.h | 59 |
1 files changed, 53 insertions, 6 deletions
diff --git a/include/asm-mips64/hardirq.h b/include/asm-mips64/hardirq.h index 29d780328..1c2d1e868 100644 --- a/include/asm-mips64/hardirq.h +++ b/include/asm-mips64/hardirq.h @@ -1,11 +1,11 @@ -/* $Id: hardirq.h,v 1.5 2000/03/02 02:37:13 ralf Exp $ +/* $Id: hardirq.h,v 1.6 2000/03/07 15:45:42 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1997, 1998, 1999 by Ralf Baechle - * Copyright (C) 1999 Silicon Graphics, Inc. + * Copyright (C) 1997 - 2000 by Ralf Baechle + * Copyright (C) 1999, 2000 Silicon Graphics, Inc. */ #ifndef _ASM_HARDIRQ_H #define _ASM_HARDIRQ_H @@ -40,14 +40,61 @@ extern irq_cpustat_t irq_stat [NR_CPUS]; #define hardirq_trylock(cpu) (local_irq_count(cpu) == 0) #define hardirq_endlock(cpu) do { } while (0) -#define irq_enter(cpu) (local_irq_count(cpu)++) -#define irq_exit(cpu) (local_irq_count(cpu)--) +#define irq_enter(cpu, irq) (local_irq_count(cpu)++) +#define irq_exit(cpu, irq) (local_irq_count(cpu)--) #define synchronize_irq() barrier(); #else -#error No habla MIPS SMP +#include <asm/atomic.h> +#include <linux/spinlock.h> +#include <asm/smp.h> + +extern int global_irq_holder; +extern spinlock_t global_irq_lock; + +static inline int irqs_running (void) +{ + int i; + + for (i = 0; i < smp_num_cpus; i++) + if (local_irq_count(i)) + return 1; + return 0; +} + +static inline void release_irqlock(int cpu) +{ + /* if we didn't own the irq lock, just ignore.. */ + if (global_irq_holder == cpu) { + global_irq_holder = NO_PROC_ID; + spin_unlock(&global_irq_lock); + } +} + +static inline int hardirq_trylock(int cpu) +{ + return !local_irq_count(cpu) && !spin_is_locked(&global_irq_lock); +} + +#define hardirq_endlock(cpu) do { } while (0) + +static inline void irq_enter(int cpu, int irq) +{ + ++local_irq_count(cpu); + + while (spin_is_locked(&global_irq_lock)) + barrier(); +} + +static inline void irq_exit(int cpu, int irq) +{ + --local_irq_count(cpu); +} + +extern void synchronize_irq(void); #endif /* __SMP__ */ + #endif /* _ASM_HARDIRQ_H */ |