Blackfin: add support for irqflags
authorMike Frysinger <vapier@gentoo.org>
Mon, 8 Jun 2009 16:49:48 +0000 (12:49 -0400)
committerMike Frysinger <vapier@gentoo.org>
Sat, 13 Jun 2009 11:20:13 +0000 (07:20 -0400)
This converts the irq handling in the Blackfin arch from the old irq.h /
system.h method to the new irqflags.h.  A stepping stone on the way to
other tracing functionality.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/Kconfig
arch/blackfin/include/asm/irq.h
arch/blackfin/include/asm/irqflags.h [new file with mode: 0644]
arch/blackfin/include/asm/system.h

index 6ae9a03..d68cb0d 100644 (file)
@@ -55,6 +55,9 @@ config FORCE_MAX_ZONEORDER
 config GENERIC_CALIBRATE_DELAY
        def_bool y
 
+config TRACE_IRQFLAGS_SUPPORT
+       def_bool y
+
 source "init/Kconfig"
 
 source "kernel/Kconfig.preempt"
index 7645e85..400bdd5 100644 (file)
 #ifndef _BFIN_IRQ_H_
 #define _BFIN_IRQ_H_
 
-/* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h>*/
-#include <mach/irq.h>
-#include <asm/pda.h>
-#include <asm/processor.h>
-
-#ifdef CONFIG_SMP
-/* Forward decl needed due to cdef inter dependencies */
-static inline uint32_t __pure bfin_dspid(void);
-# define blackfin_core_id() (bfin_dspid() & 0xff)
-# define bfin_irq_flags cpu_pda[blackfin_core_id()].imask
-#else
-extern unsigned long bfin_irq_flags;
-#endif
-
-#ifdef CONFIG_IPIPE
-
-#include <linux/ipipe_trace.h>
+#include <linux/irqflags.h>
 
-void __ipipe_unstall_root(void);
-
-void __ipipe_restore_root(unsigned long flags);
-
-#ifdef CONFIG_DEBUG_HWERR
-# define __all_masked_irq_flags 0x3f
-# define __save_and_cli_hw(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               "sti %1;" \
-               : "=&d"(x) \
-               : "d" (0x3F) \
-       )
-#else
-# define __all_masked_irq_flags 0x1f
-# define __save_and_cli_hw(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               : "=&d"(x) \
-       )
-#endif
-
-#define irqs_enabled_from_flags_hw(x)  ((x) != __all_masked_irq_flags)
-#define raw_irqs_disabled_flags(flags) (!irqs_enabled_from_flags_hw(flags))
-#define local_test_iflag_hw(x)         irqs_enabled_from_flags_hw(x)
-
-#define local_save_flags(x)                                     \
-       do {                                                     \
-               (x) = __ipipe_test_root() ?                      \
-                       __all_masked_irq_flags : bfin_irq_flags; \
-               barrier();                                       \
-       } while (0)
-
-#define local_irq_save(x)                                       \
-       do {                                                     \
-               (x) = __ipipe_test_and_stall_root() ?            \
-                       __all_masked_irq_flags : bfin_irq_flags; \
-               barrier();                                       \
-       } while (0)
-
-static inline void local_irq_restore(unsigned long x)
-{
-       barrier();
-       __ipipe_restore_root(x == __all_masked_irq_flags);
-}
-
-#define local_irq_disable()                    \
-       do {                                    \
-               __ipipe_stall_root();           \
-               barrier();                      \
-       } while (0)
-
-static inline void local_irq_enable(void)
-{
-       barrier();
-       __ipipe_unstall_root();
-}
-
-#define irqs_disabled()                __ipipe_test_root()
-
-#define local_save_flags_hw(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               "sti %0;" \
-               : "=d"(x) \
-       )
-
-#define        irqs_disabled_hw()                              \
-       ({                                              \
-               unsigned long flags;                    \
-               local_save_flags_hw(flags);             \
-               !irqs_enabled_from_flags_hw(flags);     \
-       })
-
-static inline unsigned long raw_mangle_irq_bits(int virt, unsigned long real)
-{
-       /* Merge virtual and real interrupt mask bits into a single
-          32bit word. */
-       return (real & ~(1 << 31)) | ((virt != 0) << 31);
-}
-
-static inline int raw_demangle_irq_bits(unsigned long *x)
-{
-       int virt = (*x & (1 << 31)) != 0;
-       *x &= ~(1L << 31);
-       return virt;
-}
-
-#ifdef CONFIG_IPIPE_TRACE_IRQSOFF
-
-#define local_irq_disable_hw()                                         \
-       do {                                                            \
-               int _tmp_dummy;                                         \
-               if (!irqs_disabled_hw())                                \
-                       ipipe_trace_begin(0x80000000);                  \
-               __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : );        \
-       } while (0)
-
-#define local_irq_enable_hw()                                          \
-       do {                                                            \
-               if (irqs_disabled_hw())                                 \
-                       ipipe_trace_end(0x80000000);                    \
-               __asm__ __volatile__ ("sti %0;" : : "d"(bfin_irq_flags));       \
-       } while (0)
-
-#define local_irq_save_hw(x)                           \
-       do {                                            \
-               __save_and_cli_hw(x);                   \
-               if (local_test_iflag_hw(x))             \
-                       ipipe_trace_begin(0x80000001);  \
-       } while (0)
-
-#define local_irq_restore_hw(x)                                \
-       do {                                            \
-               if (local_test_iflag_hw(x)) {           \
-                       ipipe_trace_end(0x80000001);    \
-                       local_irq_enable_hw_notrace();  \
-               }                                       \
-       } while (0)
-
-#define local_irq_disable_hw_notrace()                                 \
-       do {                                                            \
-               int _tmp_dummy;                                         \
-               __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : );        \
-       } while (0)
-
-#define local_irq_enable_hw_notrace() \
-       __asm__ __volatile__( \
-               "sti %0;" \
-               : \
-               : "d"(bfin_irq_flags) \
-       )
-
-#define local_irq_save_hw_notrace(x) __save_and_cli_hw(x)
-
-#define local_irq_restore_hw_notrace(x)                        \
-       do {                                            \
-               if (local_test_iflag_hw(x))             \
-                       local_irq_enable_hw_notrace();  \
-       } while (0)
-
-#else /* CONFIG_IPIPE_TRACE_IRQSOFF */
-
-#define local_irq_enable_hw() \
-       __asm__ __volatile__( \
-               "sti %0;" \
-               : \
-               : "d"(bfin_irq_flags) \
-       )
-
-#define local_irq_disable_hw()                 \
-       do {                                    \
-               int _tmp_dummy;                 \
-               __asm__ __volatile__ (          \
-                       "cli %0;"               \
-                       : "=d" (_tmp_dummy));   \
-       } while (0)
-
-#define local_irq_restore_hw(x) \
-       do { \
-               if (irqs_enabled_from_flags_hw(x)) \
-                       local_irq_enable_hw(); \
-       } while (0)
-
-#define local_irq_save_hw(x)           __save_and_cli_hw(x)
-
-#define local_irq_disable_hw_notrace() local_irq_disable_hw()
-#define local_irq_enable_hw_notrace()  local_irq_enable_hw()
-#define local_irq_save_hw_notrace(x)   local_irq_save_hw(x)
-#define local_irq_restore_hw_notrace(x)        local_irq_restore_hw(x)
-
-#endif  /* CONFIG_IPIPE_TRACE_IRQSOFF */
-
-#else /* !CONFIG_IPIPE */
-
-/*
- * Interrupt configuring macros.
- */
-#define local_irq_disable() \
-       do { \
-               int __tmp_dummy; \
-               __asm__ __volatile__( \
-                       "cli %0;" \
-                       : "=d" (__tmp_dummy) \
-               ); \
-       } while (0)
-
-#define local_irq_enable() \
-       __asm__ __volatile__( \
-               "sti %0;" \
-               : \
-               : "d" (bfin_irq_flags) \
-       )
-
-#ifdef CONFIG_DEBUG_HWERR
-# define __save_and_cli(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               "sti %1;" \
-               : "=&d" (x) \
-               : "d" (0x3F) \
-       )
-#else
-# define __save_and_cli(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               : "=&d" (x) \
-       )
-#endif
-
-#define local_save_flags(x) \
-       __asm__ __volatile__( \
-               "cli %0;" \
-               "sti %0;" \
-               : "=d" (x) \
-       )
-
-#ifdef CONFIG_DEBUG_HWERR
-#define irqs_enabled_from_flags(x) (((x) & ~0x3f) != 0)
-#else
-#define irqs_enabled_from_flags(x) ((x) != 0x1f)
-#endif
-
-#define local_irq_restore(x) \
-       do { \
-               if (irqs_enabled_from_flags(x)) \
-                       local_irq_enable(); \
-       } while (0)
-
-/* For spinlocks etc */
-#define local_irq_save(x) __save_and_cli(x)
-
-#define irqs_disabled()                                \
-({                                             \
-       unsigned long flags;                    \
-       local_save_flags(flags);                \
-       !irqs_enabled_from_flags(flags);        \
-})
-
-#define local_irq_save_hw(x)           local_irq_save(x)
-#define local_irq_restore_hw(x)                local_irq_restore(x)
-#define local_irq_enable_hw()          local_irq_enable()
-#define local_irq_disable_hw()         local_irq_disable()
-#define irqs_disabled_hw()             irqs_disabled()
+/* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h> */
+#include <mach/irq.h>
 
-#endif /* !CONFIG_IPIPE */
+/* Xenomai IPIPE helpers */
+#define local_irq_restore_hw(x) local_irq_restore(x)
+#define local_irq_save_hw(x)    local_irq_save(x)
+#define local_irq_enable_hw(x)  local_irq_enable(x)
+#define local_irq_disable_hw(x) local_irq_disable(x)
+#define irqs_disabled_hw(x)     irqs_disabled(x)
 
 #if ANOMALY_05000244 && defined(CONFIG_BFIN_ICACHE)
 # define NOP_PAD_ANOMALY_05000244 "nop; nop;"
diff --git a/arch/blackfin/include/asm/irqflags.h b/arch/blackfin/include/asm/irqflags.h
new file mode 100644 (file)
index 0000000..139cba4
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * interface to Blackfin CEC
+ *
+ * Copyright 2009 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+#ifndef __ASM_BFIN_IRQFLAGS_H__
+#define __ASM_BFIN_IRQFLAGS_H__
+
+#ifdef CONFIG_SMP
+# include <asm/pda.h>
+# include <asm/processor.h>
+/* Forward decl needed due to cdef inter dependencies */
+static inline uint32_t __pure bfin_dspid(void);
+# define blackfin_core_id() (bfin_dspid() & 0xff)
+# define bfin_irq_flags cpu_pda[blackfin_core_id()].imask
+#else
+extern unsigned long bfin_irq_flags;
+#endif
+
+static inline void bfin_sti(unsigned long flags)
+{
+       asm volatile("sti %0;" : : "d" (flags));
+}
+
+static inline unsigned long bfin_cli(void)
+{
+       unsigned long flags;
+       asm volatile("cli %0;" : "=d" (flags));
+       return flags;
+}
+
+static inline void raw_local_irq_disable(void)
+{
+       bfin_cli();
+}
+static inline void raw_local_irq_enable(void)
+{
+       bfin_sti(bfin_irq_flags);
+}
+
+#define raw_local_save_flags(flags) do { (flags) = bfin_read_IMASK(); } while (0)
+
+#define raw_irqs_disabled_flags(flags) (((flags) & ~0x3f) == 0)
+
+static inline void raw_local_irq_restore(unsigned long flags)
+{
+       if (!raw_irqs_disabled_flags(flags))
+               raw_local_irq_enable();
+}
+
+static inline unsigned long __raw_local_irq_save(void)
+{
+       unsigned long flags = bfin_cli();
+#ifdef CONFIG_DEBUG_HWERR
+       bfin_sti(0x3f);
+#endif
+       return flags;
+}
+#define raw_local_irq_save(flags) do { (flags) = __raw_local_irq_save(); } while (0)
+
+#endif
index a4c8254..294dbda 100644 (file)
 #define _BLACKFIN_SYSTEM_H
 
 #include <linux/linkage.h>
-#include <linux/compiler.h>
+#include <linux/irqflags.h>
 #include <mach/anomaly.h>
+#include <asm/cache.h>
 #include <asm/pda.h>
-#include <asm/processor.h>
 #include <asm/irq.h>
 
 /*