14dbdc9a5SMichal Simek /* 24dbdc9a5SMichal Simek * Copyright (C) 2006 Atmark Techno, Inc. 34dbdc9a5SMichal Simek * 44dbdc9a5SMichal Simek * This file is subject to the terms and conditions of the GNU General Public 54dbdc9a5SMichal Simek * License. See the file "COPYING" in the main directory of this archive 64dbdc9a5SMichal Simek * for more details. 74dbdc9a5SMichal Simek */ 84dbdc9a5SMichal Simek 94dbdc9a5SMichal Simek #ifndef _ASM_MICROBLAZE_IRQFLAGS_H 104dbdc9a5SMichal Simek #define _ASM_MICROBLAZE_IRQFLAGS_H 114dbdc9a5SMichal Simek 124dbdc9a5SMichal Simek #include <linux/irqflags.h> 134dbdc9a5SMichal Simek 144dbdc9a5SMichal Simek # if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR 154dbdc9a5SMichal Simek 164dbdc9a5SMichal Simek # define local_irq_save(flags) \ 174dbdc9a5SMichal Simek do { \ 184dbdc9a5SMichal Simek asm volatile ("# local_irq_save \n\t" \ 194dbdc9a5SMichal Simek "msrclr %0, %1 \n\t" \ 204dbdc9a5SMichal Simek "nop \n\t" \ 214dbdc9a5SMichal Simek : "=r"(flags) \ 224dbdc9a5SMichal Simek : "i"(MSR_IE) \ 234dbdc9a5SMichal Simek : "memory"); \ 244dbdc9a5SMichal Simek } while (0) 254dbdc9a5SMichal Simek 264dbdc9a5SMichal Simek # define local_irq_disable() \ 274dbdc9a5SMichal Simek do { \ 284dbdc9a5SMichal Simek asm volatile ("# local_irq_disable \n\t" \ 294dbdc9a5SMichal Simek "msrclr r0, %0 \n\t" \ 304dbdc9a5SMichal Simek "nop \n\t" \ 314dbdc9a5SMichal Simek : \ 324dbdc9a5SMichal Simek : "i"(MSR_IE) \ 334dbdc9a5SMichal Simek : "memory"); \ 344dbdc9a5SMichal Simek } while (0) 354dbdc9a5SMichal Simek 364dbdc9a5SMichal Simek # define local_irq_enable() \ 374dbdc9a5SMichal Simek do { \ 384dbdc9a5SMichal Simek asm volatile ("# local_irq_enable \n\t" \ 394dbdc9a5SMichal Simek "msrset r0, %0 \n\t" \ 404dbdc9a5SMichal Simek "nop \n\t" \ 414dbdc9a5SMichal Simek : \ 424dbdc9a5SMichal Simek : "i"(MSR_IE) \ 434dbdc9a5SMichal Simek : "memory"); \ 444dbdc9a5SMichal Simek } while (0) 454dbdc9a5SMichal Simek 464dbdc9a5SMichal Simek # else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */ 474dbdc9a5SMichal Simek 484dbdc9a5SMichal Simek # define local_irq_save(flags) \ 494dbdc9a5SMichal Simek do { \ 504dbdc9a5SMichal Simek register unsigned tmp; \ 514dbdc9a5SMichal Simek asm volatile ("# local_irq_save \n\t" \ 524dbdc9a5SMichal Simek "mfs %0, rmsr \n\t" \ 534dbdc9a5SMichal Simek "nop \n\t" \ 544dbdc9a5SMichal Simek "andi %1, %0, %2 \n\t" \ 554dbdc9a5SMichal Simek "mts rmsr, %1 \n\t" \ 564dbdc9a5SMichal Simek "nop \n\t" \ 574dbdc9a5SMichal Simek : "=r"(flags), "=r" (tmp) \ 584dbdc9a5SMichal Simek : "i"(~MSR_IE) \ 594dbdc9a5SMichal Simek : "memory"); \ 604dbdc9a5SMichal Simek } while (0) 614dbdc9a5SMichal Simek 624dbdc9a5SMichal Simek # define local_irq_disable() \ 634dbdc9a5SMichal Simek do { \ 644dbdc9a5SMichal Simek register unsigned tmp; \ 654dbdc9a5SMichal Simek asm volatile ("# local_irq_disable \n\t" \ 664dbdc9a5SMichal Simek "mfs %0, rmsr \n\t" \ 674dbdc9a5SMichal Simek "nop \n\t" \ 684dbdc9a5SMichal Simek "andi %0, %0, %1 \n\t" \ 694dbdc9a5SMichal Simek "mts rmsr, %0 \n\t" \ 704dbdc9a5SMichal Simek "nop \n\t" \ 714dbdc9a5SMichal Simek : "=r"(tmp) \ 724dbdc9a5SMichal Simek : "i"(~MSR_IE) \ 734dbdc9a5SMichal Simek : "memory"); \ 744dbdc9a5SMichal Simek } while (0) 754dbdc9a5SMichal Simek 764dbdc9a5SMichal Simek # define local_irq_enable() \ 774dbdc9a5SMichal Simek do { \ 784dbdc9a5SMichal Simek register unsigned tmp; \ 794dbdc9a5SMichal Simek asm volatile ("# local_irq_enable \n\t" \ 804dbdc9a5SMichal Simek "mfs %0, rmsr \n\t" \ 814dbdc9a5SMichal Simek "nop \n\t" \ 824dbdc9a5SMichal Simek "ori %0, %0, %1 \n\t" \ 834dbdc9a5SMichal Simek "mts rmsr, %0 \n\t" \ 844dbdc9a5SMichal Simek "nop \n\t" \ 854dbdc9a5SMichal Simek : "=r"(tmp) \ 864dbdc9a5SMichal Simek : "i"(MSR_IE) \ 874dbdc9a5SMichal Simek : "memory"); \ 884dbdc9a5SMichal Simek } while (0) 894dbdc9a5SMichal Simek 904dbdc9a5SMichal Simek # endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ 914dbdc9a5SMichal Simek 924dbdc9a5SMichal Simek #define local_save_flags(flags) \ 934dbdc9a5SMichal Simek do { \ 944dbdc9a5SMichal Simek asm volatile ("# local_save_flags \n\t" \ 954dbdc9a5SMichal Simek "mfs %0, rmsr \n\t" \ 964dbdc9a5SMichal Simek "nop \n\t" \ 974dbdc9a5SMichal Simek : "=r"(flags) \ 984dbdc9a5SMichal Simek : \ 994dbdc9a5SMichal Simek : "memory"); \ 1004dbdc9a5SMichal Simek } while (0) 1014dbdc9a5SMichal Simek 1024dbdc9a5SMichal Simek #define local_irq_restore(flags) \ 1034dbdc9a5SMichal Simek do { \ 1044dbdc9a5SMichal Simek asm volatile ("# local_irq_restore \n\t"\ 1054dbdc9a5SMichal Simek "mts rmsr, %0 \n\t" \ 1064dbdc9a5SMichal Simek "nop \n\t" \ 1074dbdc9a5SMichal Simek : \ 1084dbdc9a5SMichal Simek : "r"(flags) \ 1094dbdc9a5SMichal Simek : "memory"); \ 1104dbdc9a5SMichal Simek } while (0) 1114dbdc9a5SMichal Simek 1124dbdc9a5SMichal Simek static inline int irqs_disabled(void) 1134dbdc9a5SMichal Simek { 1144dbdc9a5SMichal Simek unsigned long flags; 1154dbdc9a5SMichal Simek 1164dbdc9a5SMichal Simek local_save_flags(flags); 1174dbdc9a5SMichal Simek return ((flags & MSR_IE) == 0); 1184dbdc9a5SMichal Simek } 1194dbdc9a5SMichal Simek 1204dbdc9a5SMichal Simek #define raw_irqs_disabled irqs_disabled 1214dbdc9a5SMichal Simek #define raw_irqs_disabled_flags(flags) ((flags) == 0) 1224dbdc9a5SMichal Simek 1234dbdc9a5SMichal Simek #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */ 124