1*4726dd60SMichal Simek /* SPDX-License-Identifier: GPL-2.0 */ 24dbdc9a5SMichal Simek /* 34dbdc9a5SMichal Simek * Copyright (C) 2006 Atmark Techno, Inc. 44dbdc9a5SMichal Simek */ 54dbdc9a5SMichal Simek 64dbdc9a5SMichal Simek #ifndef _ASM_MICROBLAZE_IRQFLAGS_H 74dbdc9a5SMichal Simek #define _ASM_MICROBLAZE_IRQFLAGS_H 84dbdc9a5SMichal Simek 9df9ee292SDavid Howells #include <linux/types.h> 10a3cd613bSMichal Simek #include <asm/registers.h> 114dbdc9a5SMichal Simek 1212dfc73eSMichal Simek #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR 134dbdc9a5SMichal Simek 14a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_irq_save(void) 154dbdc9a5SMichal Simek { 164dbdc9a5SMichal Simek unsigned long flags; 17df9ee292SDavid Howells asm volatile(" msrclr %0, %1 \n" 18df9ee292SDavid Howells " nop \n" 19df9ee292SDavid Howells : "=r"(flags) 20df9ee292SDavid Howells : "i"(MSR_IE) 21df9ee292SDavid Howells : "memory"); 22a3cd613bSMichal Simek return flags; 234dbdc9a5SMichal Simek } 244dbdc9a5SMichal Simek 25a2f52699SSteven Rostedt static inline notrace void arch_local_irq_disable(void) 26df9ee292SDavid Howells { 27df9ee292SDavid Howells /* this uses r0 without declaring it - is that correct? */ 28df9ee292SDavid Howells asm volatile(" msrclr r0, %0 \n" 29df9ee292SDavid Howells " nop \n" 30df9ee292SDavid Howells : 31df9ee292SDavid Howells : "i"(MSR_IE) 32df9ee292SDavid Howells : "memory"); 33df9ee292SDavid Howells } 34df9ee292SDavid Howells 35a2f52699SSteven Rostedt static inline notrace void arch_local_irq_enable(void) 36df9ee292SDavid Howells { 37df9ee292SDavid Howells /* this uses r0 without declaring it - is that correct? */ 38df9ee292SDavid Howells asm volatile(" msrset r0, %0 \n" 39df9ee292SDavid Howells " nop \n" 40df9ee292SDavid Howells : 41df9ee292SDavid Howells : "i"(MSR_IE) 42df9ee292SDavid Howells : "memory"); 43df9ee292SDavid Howells } 44df9ee292SDavid Howells 45df9ee292SDavid Howells #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ 46df9ee292SDavid Howells 47a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_irq_save(void) 48df9ee292SDavid Howells { 49df9ee292SDavid Howells unsigned long flags, tmp; 50df9ee292SDavid Howells asm volatile (" mfs %0, rmsr \n" 51df9ee292SDavid Howells " nop \n" 52df9ee292SDavid Howells " andi %1, %0, %2 \n" 53df9ee292SDavid Howells " mts rmsr, %1 \n" 54df9ee292SDavid Howells " nop \n" 55df9ee292SDavid Howells : "=r"(flags), "=r"(tmp) 56df9ee292SDavid Howells : "i"(~MSR_IE) 57df9ee292SDavid Howells : "memory"); 58df9ee292SDavid Howells return flags; 59df9ee292SDavid Howells } 60df9ee292SDavid Howells 61a2f52699SSteven Rostedt static inline notrace void arch_local_irq_disable(void) 62df9ee292SDavid Howells { 63df9ee292SDavid Howells unsigned long tmp; 64df9ee292SDavid Howells asm volatile(" mfs %0, rmsr \n" 65df9ee292SDavid Howells " nop \n" 66df9ee292SDavid Howells " andi %0, %0, %1 \n" 67df9ee292SDavid Howells " mts rmsr, %0 \n" 68df9ee292SDavid Howells " nop \n" 69df9ee292SDavid Howells : "=r"(tmp) 70df9ee292SDavid Howells : "i"(~MSR_IE) 71df9ee292SDavid Howells : "memory"); 72df9ee292SDavid Howells } 73df9ee292SDavid Howells 74a2f52699SSteven Rostedt static inline notrace void arch_local_irq_enable(void) 75df9ee292SDavid Howells { 76df9ee292SDavid Howells unsigned long tmp; 77df9ee292SDavid Howells asm volatile(" mfs %0, rmsr \n" 78df9ee292SDavid Howells " nop \n" 79df9ee292SDavid Howells " ori %0, %0, %1 \n" 80df9ee292SDavid Howells " mts rmsr, %0 \n" 81df9ee292SDavid Howells " nop \n" 82df9ee292SDavid Howells : "=r"(tmp) 83df9ee292SDavid Howells : "i"(MSR_IE) 84df9ee292SDavid Howells : "memory"); 85df9ee292SDavid Howells } 86df9ee292SDavid Howells 87df9ee292SDavid Howells #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ 88df9ee292SDavid Howells 89a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_save_flags(void) 90df9ee292SDavid Howells { 91df9ee292SDavid Howells unsigned long flags; 92df9ee292SDavid Howells asm volatile(" mfs %0, rmsr \n" 93df9ee292SDavid Howells " nop \n" 94df9ee292SDavid Howells : "=r"(flags) 95df9ee292SDavid Howells : 96df9ee292SDavid Howells : "memory"); 97df9ee292SDavid Howells return flags; 98df9ee292SDavid Howells } 99df9ee292SDavid Howells 100a2f52699SSteven Rostedt static inline notrace void arch_local_irq_restore(unsigned long flags) 101df9ee292SDavid Howells { 102df9ee292SDavid Howells asm volatile(" mts rmsr, %0 \n" 103df9ee292SDavid Howells " nop \n" 104df9ee292SDavid Howells : 105df9ee292SDavid Howells : "r"(flags) 106df9ee292SDavid Howells : "memory"); 107df9ee292SDavid Howells } 108df9ee292SDavid Howells 109a2f52699SSteven Rostedt static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) 110df9ee292SDavid Howells { 111df9ee292SDavid Howells return (flags & MSR_IE) == 0; 112df9ee292SDavid Howells } 113df9ee292SDavid Howells 114a2f52699SSteven Rostedt static inline notrace bool arch_irqs_disabled(void) 115df9ee292SDavid Howells { 116df9ee292SDavid Howells return arch_irqs_disabled_flags(arch_local_save_flags()); 117df9ee292SDavid Howells } 1184dbdc9a5SMichal Simek 1194dbdc9a5SMichal Simek #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */ 120