hardirq.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* hardirq.h: 32-bit Sparc hard IRQ support.
  2.  *
  3.  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  4.  * Copyright (C) 1998-99 Anton Blanchard (anton@progsoc.uts.edu.au)
  5.  */
  6. #ifndef __PARISC_HARDIRQ_H
  7. #define __PARISC_HARDIRQ_H
  8. #include <linux/config.h>
  9. #include <linux/threads.h>
  10. typedef struct {
  11. unsigned int __softirq_active;
  12. unsigned int __softirq_mask;
  13. unsigned int __local_irq_count;
  14. unsigned int __local_bh_count;
  15. unsigned int __syscall_count;
  16. } ____cacheline_aligned irq_cpustat_t;
  17. #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
  18. /*
  19.  * Are we in an interrupt context? Either doing bottom half
  20.  * or hardware interrupt processing?
  21.  */
  22. #define in_interrupt() ({ int __cpu = smp_processor_id(); 
  23. (local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
  24. #define in_irq() ({ int __cpu = smp_processor_id(); 
  25. (local_irq_count(__cpu) != 0); })
  26. #ifndef CONFIG_SMP
  27. #define hardirq_trylock(cpu) (local_irq_count(cpu) == 0)
  28. #define hardirq_endlock(cpu) do { } while (0)
  29. #define irq_enter(cpu, irq) (local_irq_count(cpu)++)
  30. #define irq_exit(cpu, irq) (local_irq_count(cpu)--)
  31. #define synchronize_irq() barrier()
  32. #else
  33. #include <asm/atomic.h>
  34. #include <linux/spinlock.h>
  35. #include <asm/system.h>
  36. #include <asm/smp.h>
  37. extern unsigned char global_irq_holder;
  38. extern spinlock_t global_irq_lock;
  39. extern atomic_t global_irq_count;
  40. static inline void release_irqlock(int cpu)
  41. {
  42. /* if we didn't own the irq lock, just ignore.. */
  43. if (global_irq_holder == (unsigned char) cpu) {
  44. global_irq_holder = NO_PROC_ID;
  45. spin_unlock(&global_irq_lock);
  46. }
  47. }
  48. static inline void irq_enter(int cpu)
  49. {
  50. ++local_irq_count(cpu);
  51. atomic_inc(&global_irq_count);
  52. }
  53. static inline void irq_exit(int cpu)
  54. {
  55. atomic_dec(&global_irq_count);
  56. --local_irq_count(cpu);
  57. }
  58. static inline int hardirq_trylock(int cpu)
  59. {
  60. return (! atomic_read(&global_irq_count) &&
  61. ! spin_is_locked (&global_irq_lock));
  62. }
  63. #define hardirq_endlock(cpu) do { } while (0)
  64. extern void synchronize_irq(void);
  65. #endif /* CONFIG_SMP */
  66. #endif /* __PARISC_HARDIRQ_H */