100f892fcSMacpaul Lin /* 200f892fcSMacpaul Lin * Copyright (C) 2011 Andes Technology Corporation 300f892fcSMacpaul Lin * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> 400f892fcSMacpaul Lin * 5*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 600f892fcSMacpaul Lin */ 700f892fcSMacpaul Lin 800f892fcSMacpaul Lin #ifndef __ASM_NDS_SYSTEM_H 900f892fcSMacpaul Lin #define __ASM_NDS_SYSTEM_H 1000f892fcSMacpaul Lin 1100f892fcSMacpaul Lin /* 1200f892fcSMacpaul Lin * Interrupt configuring macros. 1300f892fcSMacpaul Lin */ 1400f892fcSMacpaul Lin 1500f892fcSMacpaul Lin extern int irq_flags; 1600f892fcSMacpaul Lin 1700f892fcSMacpaul Lin #define local_irq_enable() \ 1800f892fcSMacpaul Lin __asm__ __volatile__ ( \ 1900f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 2000f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 2100f892fcSMacpaul Lin "setgie.e\n\t" \ 2200f892fcSMacpaul Lin : \ 2300f892fcSMacpaul Lin : "r" (irq_flags) \ 2400f892fcSMacpaul Lin ) 2500f892fcSMacpaul Lin 2600f892fcSMacpaul Lin #define local_irq_disable() \ 2700f892fcSMacpaul Lin do { \ 2800f892fcSMacpaul Lin int __tmp_dummy; \ 2900f892fcSMacpaul Lin __asm__ __volatile__ ( \ 3000f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 3100f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 3200f892fcSMacpaul Lin "setgie.d\n\t" \ 3300f892fcSMacpaul Lin "dsb\n\t" \ 3400f892fcSMacpaul Lin : "=r" (__tmp_dummy) \ 3500f892fcSMacpaul Lin ); \ 3600f892fcSMacpaul Lin } while (0) 3700f892fcSMacpaul Lin 3800f892fcSMacpaul Lin #define local_irq_save(x) \ 3900f892fcSMacpaul Lin __asm__ __volatile__ ( \ 4000f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 4100f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 4200f892fcSMacpaul Lin "setgie.d\n\t" \ 4300f892fcSMacpaul Lin "dsb\n\t" \ 4400f892fcSMacpaul Lin : "=&r" (x) \ 4500f892fcSMacpaul Lin ) 4600f892fcSMacpaul Lin 4700f892fcSMacpaul Lin #define local_save_flags(x) \ 4800f892fcSMacpaul Lin __asm__ __volatile__ ( \ 4900f892fcSMacpaul Lin "mfsr %0, $psw\n\t" \ 5000f892fcSMacpaul Lin "andi %0, %0, 0x1\n\t" \ 5100f892fcSMacpaul Lin "setgie.e\n\t" \ 5200f892fcSMacpaul Lin "setgie.d\n\t" \ 5300f892fcSMacpaul Lin : "=r" (x) \ 5400f892fcSMacpaul Lin ) 5500f892fcSMacpaul Lin 5600f892fcSMacpaul Lin #define irqs_enabled_from_flags(x) ((x) != 0x1f) 5700f892fcSMacpaul Lin 5800f892fcSMacpaul Lin #define local_irq_restore(x) \ 5900f892fcSMacpaul Lin do { \ 6000f892fcSMacpaul Lin if (irqs_enabled_from_flags(x)) \ 6100f892fcSMacpaul Lin local_irq_enable(); \ 6200f892fcSMacpaul Lin } while (0) 6300f892fcSMacpaul Lin 6400f892fcSMacpaul Lin /* 6500f892fcSMacpaul Lin * Force strict CPU ordering. 6600f892fcSMacpaul Lin */ 6700f892fcSMacpaul Lin #define nop() asm volatile ("nop;\n\t" : : ) 6800f892fcSMacpaul Lin #define mb() asm volatile ("" : : : "memory") 6900f892fcSMacpaul Lin #define rmb() asm volatile ("" : : : "memory") 7000f892fcSMacpaul Lin #define wmb() asm volatile ("" : : : "memory") 7100f892fcSMacpaul Lin 7200f892fcSMacpaul Lin #endif /* __ASM_NDS_SYSTEM_H */ 73