blob: 2c38c6d801769be469348fa80f4ef3283aab44e2 [file] [log] [blame]
Michal Simek4dbdc9a2009-03-27 14:25:35 +01001/*
2 * Copyright (C) 2006 Atmark Techno, Inc.
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 */
8
9#ifndef _ASM_MICROBLAZE_IRQFLAGS_H
10#define _ASM_MICROBLAZE_IRQFLAGS_H
11
12#include <linux/irqflags.h>
Michal Simeka3cd6132009-10-30 12:26:53 +010013#include <asm/registers.h>
Michal Simek4dbdc9a2009-03-27 14:25:35 +010014
15# if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
16
Michal Simeka3cd6132009-10-30 12:26:53 +010017# define raw_local_irq_save(flags) \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010018 do { \
Michal Simeka3cd6132009-10-30 12:26:53 +010019 asm volatile (" msrclr %0, %1; \
20 nop;" \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010021 : "=r"(flags) \
22 : "i"(MSR_IE) \
23 : "memory"); \
24 } while (0)
25
Michal Simeka3cd6132009-10-30 12:26:53 +010026# define raw_local_irq_disable() \
27 do { \
28 asm volatile (" msrclr r0, %0; \
29 nop;" \
30 : \
31 : "i"(MSR_IE) \
32 : "memory"); \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010033 } while (0)
34
Michal Simeka3cd6132009-10-30 12:26:53 +010035# define raw_local_irq_enable() \
36 do { \
37 asm volatile (" msrset r0, %0; \
38 nop;" \
39 : \
40 : "i"(MSR_IE) \
41 : "memory"); \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010042 } while (0)
43
44# else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */
45
Michal Simeka3cd6132009-10-30 12:26:53 +010046# define raw_local_irq_save(flags) \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010047 do { \
48 register unsigned tmp; \
Michal Simeka3cd6132009-10-30 12:26:53 +010049 asm volatile (" mfs %0, rmsr; \
50 nop; \
51 andi %1, %0, %2; \
52 mts rmsr, %1; \
53 nop;" \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010054 : "=r"(flags), "=r" (tmp) \
55 : "i"(~MSR_IE) \
56 : "memory"); \
57 } while (0)
58
Michal Simeka3cd6132009-10-30 12:26:53 +010059# define raw_local_irq_disable() \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010060 do { \
61 register unsigned tmp; \
Michal Simeka3cd6132009-10-30 12:26:53 +010062 asm volatile (" mfs %0, rmsr; \
63 nop; \
64 andi %0, %0, %1; \
65 mts rmsr, %0; \
66 nop;" \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010067 : "=r"(tmp) \
68 : "i"(~MSR_IE) \
69 : "memory"); \
70 } while (0)
71
Michal Simeka3cd6132009-10-30 12:26:53 +010072# define raw_local_irq_enable() \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010073 do { \
74 register unsigned tmp; \
Michal Simeka3cd6132009-10-30 12:26:53 +010075 asm volatile (" mfs %0, rmsr; \
76 nop; \
77 ori %0, %0, %1; \
78 mts rmsr, %0; \
79 nop;" \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010080 : "=r"(tmp) \
81 : "i"(MSR_IE) \
82 : "memory"); \
83 } while (0)
84
85# endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
86
Michal Simeka3cd6132009-10-30 12:26:53 +010087#define raw_local_irq_restore(flags) \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010088 do { \
Michal Simeka3cd6132009-10-30 12:26:53 +010089 asm volatile (" mts rmsr, %0; \
90 nop;" \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010091 : \
Michal Simeka3cd6132009-10-30 12:26:53 +010092 : "r"(flags) \
Michal Simek4dbdc9a2009-03-27 14:25:35 +010093 : "memory"); \
94 } while (0)
95
Michal Simeka3cd6132009-10-30 12:26:53 +010096static inline unsigned long get_msr(void)
Michal Simek4dbdc9a2009-03-27 14:25:35 +010097{
98 unsigned long flags;
Michal Simeka3cd6132009-10-30 12:26:53 +010099 asm volatile (" mfs %0, rmsr; \
100 nop;" \
101 : "=r"(flags) \
102 : \
103 : "memory"); \
104 return flags;
Michal Simek4dbdc9a2009-03-27 14:25:35 +0100105}
106
Michal Simeka3cd6132009-10-30 12:26:53 +0100107#define raw_local_save_flags(flags) ((flags) = get_msr())
108#define raw_irqs_disabled() ((get_msr() & MSR_IE) == 0)
109#define raw_irqs_disabled_flags(flags) ((flags & MSR_IE) == 0)
Michal Simek4dbdc9a2009-03-27 14:25:35 +0100110
111#endif /* _ASM_MICROBLAZE_IRQFLAGS_H */