1*00f892fcSMacpaul Lin /* 2*00f892fcSMacpaul Lin * Copyright (C) 2011 Andes Technology Corporation 3*00f892fcSMacpaul Lin * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> 4*00f892fcSMacpaul Lin * 5*00f892fcSMacpaul Lin * See file CREDITS for list of people who contributed to this 6*00f892fcSMacpaul Lin * project. 7*00f892fcSMacpaul Lin * 8*00f892fcSMacpaul Lin * This program is free software; you can redistribute it and/or 9*00f892fcSMacpaul Lin * modify it under the terms of the GNU General Public License as 10*00f892fcSMacpaul Lin * published by the Free Software Foundation; either version 2 of 11*00f892fcSMacpaul Lin * the License, or (at your option) any later version. 12*00f892fcSMacpaul Lin * 13*00f892fcSMacpaul Lin * This program is distributed in the hope that it will be useful, 14*00f892fcSMacpaul Lin * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*00f892fcSMacpaul Lin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*00f892fcSMacpaul Lin * GNU General Public License for more details. 17*00f892fcSMacpaul Lin * 18*00f892fcSMacpaul Lin * You should have received a copy of the GNU General Public License 19*00f892fcSMacpaul Lin * along with this program; if not, write to the Free Software 20*00f892fcSMacpaul Lin * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 21*00f892fcSMacpaul Lin * MA 02110-1301 USA 22*00f892fcSMacpaul Lin */ 23*00f892fcSMacpaul Lin 24*00f892fcSMacpaul Lin #ifndef __ASM_NDS_SYSTEM_H 25*00f892fcSMacpaul Lin #define __ASM_NDS_SYSTEM_H 26*00f892fcSMacpaul Lin 27*00f892fcSMacpaul Lin /* 28*00f892fcSMacpaul Lin * Interrupt configuring macros. 29*00f892fcSMacpaul Lin */ 30*00f892fcSMacpaul Lin 31*00f892fcSMacpaul Lin extern int irq_flags; 32*00f892fcSMacpaul Lin 33*00f892fcSMacpaul Lin #define local_irq_enable() \ 34*00f892fcSMacpaul Lin __asm__ __volatile__ ( \ 35*00f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 36*00f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 37*00f892fcSMacpaul Lin "setgie.e\n\t" \ 38*00f892fcSMacpaul Lin : \ 39*00f892fcSMacpaul Lin : "r" (irq_flags) \ 40*00f892fcSMacpaul Lin ) 41*00f892fcSMacpaul Lin 42*00f892fcSMacpaul Lin #define local_irq_disable() \ 43*00f892fcSMacpaul Lin do { \ 44*00f892fcSMacpaul Lin int __tmp_dummy; \ 45*00f892fcSMacpaul Lin __asm__ __volatile__ ( \ 46*00f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 47*00f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 48*00f892fcSMacpaul Lin "setgie.d\n\t" \ 49*00f892fcSMacpaul Lin "dsb\n\t" \ 50*00f892fcSMacpaul Lin : "=r" (__tmp_dummy) \ 51*00f892fcSMacpaul Lin ); \ 52*00f892fcSMacpaul Lin } while (0) 53*00f892fcSMacpaul Lin 54*00f892fcSMacpaul Lin #define local_irq_save(x) \ 55*00f892fcSMacpaul Lin __asm__ __volatile__ ( \ 56*00f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 57*00f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 58*00f892fcSMacpaul Lin "setgie.d\n\t" \ 59*00f892fcSMacpaul Lin "dsb\n\t" \ 60*00f892fcSMacpaul Lin : "=&r" (x) \ 61*00f892fcSMacpaul Lin ) 62*00f892fcSMacpaul Lin 63*00f892fcSMacpaul Lin #define local_save_flags(x) \ 64*00f892fcSMacpaul Lin __asm__ __volatile__ ( \ 65*00f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 66*00f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 67*00f892fcSMacpaul Lin "setgie.e\n\t" \ 68*00f892fcSMacpaul Lin "setgie.d\n\t" \ 69*00f892fcSMacpaul Lin : "=r" (x) \ 70*00f892fcSMacpaul Lin ) 71*00f892fcSMacpaul Lin 72*00f892fcSMacpaul Lin #define irqs_enabled_from_flags(x) ((x) != 0x1f) 73*00f892fcSMacpaul Lin 74*00f892fcSMacpaul Lin #define local_irq_restore(x) \ 75*00f892fcSMacpaul Lin do { \ 76*00f892fcSMacpaul Lin if (irqs_enabled_from_flags(x)) \ 77*00f892fcSMacpaul Lin local_irq_enable(); \ 78*00f892fcSMacpaul Lin } while (0) 79*00f892fcSMacpaul Lin 80*00f892fcSMacpaul Lin /* 81*00f892fcSMacpaul Lin * Force strict CPU ordering. 82*00f892fcSMacpaul Lin */ 83*00f892fcSMacpaul Lin #define nop() asm volatile ("nop;\n\t" : : ) 84*00f892fcSMacpaul Lin #define mb() asm volatile ("" : : : "memory") 85*00f892fcSMacpaul Lin #define rmb() asm volatile ("" : : : "memory") 86*00f892fcSMacpaul Lin #define wmb() asm volatile ("" : : : "memory") 87*00f892fcSMacpaul Lin 88*00f892fcSMacpaul Lin #endif /* __ASM_NDS_SYSTEM_H */ 89