diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-06-03 09:23:20 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-06-03 09:23:20 +0000 |
commit | ac5ff8f4a72f7b4e66f73c3c6cb9fe7758cf6f12 (patch) | |
tree | 9fc7f8ce32e0d9a4aa055b2a58a05a5d727b333c /include/asm-sparc64/hardirq.h | |
parent | 52662ff3e66770fd7e4fc508c91056d29c08bff0 (diff) |
Sync with Linux 2.1.42.
Diffstat (limited to 'include/asm-sparc64/hardirq.h')
-rw-r--r-- | include/asm-sparc64/hardirq.h | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/include/asm-sparc64/hardirq.h b/include/asm-sparc64/hardirq.h index b7cd278e7..4680a4095 100644 --- a/include/asm-sparc64/hardirq.h +++ b/include/asm-sparc64/hardirq.h @@ -10,11 +10,8 @@ extern unsigned int local_irq_count[NR_CPUS]; #define in_interrupt() (local_irq_count[smp_processor_id()] != 0) -#define hardirq_depth() (local_irq_count[smp_processor_id()]) -#ifdef __SMP__ -#error SMP not supported on sparc64 -#else /* !(__SMP__) */ +#ifndef __SMP__ #define hardirq_trylock(cpu) (++local_irq_count[cpu], (cpu)==0) #define hardirq_endlock(cpu) (--local_irq_count[cpu]) @@ -24,6 +21,62 @@ extern unsigned int local_irq_count[NR_CPUS]; #define synchronize_irq() do { } while(0) +#else /* (__SMP__) */ + +#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); + } +} + +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; + + __save_and_cli(flags); + if(atomic_add_return(1, &global_irq_count) != 1 || + *(((unsigned char *)(&global_irq_lock)))) { + atomic_dec(&global_irq_count); + __restore_flags(flags); + return 0; + } + ++local_irq_count[cpu]; + return 1; +} + +static inline void hardirq_endlock(int cpu) +{ + __cli(); + hardirq_exit(cpu); + __sti(); +} + +extern void synchronize_irq(void); + #endif /* __SMP__ */ #endif /* !(__SPARC64_HARDIRQ_H) */ |