1 /* Generic barrier definitions, based on MN10300 definitions. 2 * 3 * It should be possible to use these on really simple architectures, 4 * but it serves more as a starting point for new ports. 5 * 6 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 7 * Written by David Howells (dhowells@redhat.com) 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public Licence 11 * as published by the Free Software Foundation; either version 12 * 2 of the Licence, or (at your option) any later version. 13 */ 14 #ifndef __ASM_GENERIC_BARRIER_H 15 #define __ASM_GENERIC_BARRIER_H 16 17 #ifndef __ASSEMBLY__ 18 19 #define nop() asm volatile ("nop") 20 21 /* 22 * Force strict CPU ordering. 23 * And yes, this is required on UP too when we're talking 24 * to devices. 25 * 26 * This implementation only contains a compiler barrier. 27 */ 28 29 #define mb() asm volatile ("": : :"memory") 30 #define rmb() mb() 31 #define wmb() asm volatile ("": : :"memory") 32 33 #ifdef CONFIG_SMP 34 #define smp_mb() mb() 35 #define smp_rmb() rmb() 36 #define smp_wmb() wmb() 37 #else 38 #define smp_mb() barrier() 39 #define smp_rmb() barrier() 40 #define smp_wmb() barrier() 41 #endif 42 43 #define set_mb(var, value) do { var = value; mb(); } while (0) 44 #define set_wmb(var, value) do { var = value; wmb(); } while (0) 45 46 #define read_barrier_depends() do {} while (0) 47 #define smp_read_barrier_depends() do {} while (0) 48 49 #define smp_store_release(p, v) \ 50 do { \ 51 compiletime_assert_atomic_type(*p); \ 52 smp_mb(); \ 53 ACCESS_ONCE(*p) = (v); \ 54 } while (0) 55 56 #define smp_load_acquire(p) \ 57 ({ \ 58 typeof(*p) ___p1 = ACCESS_ONCE(*p); \ 59 compiletime_assert_atomic_type(*p); \ 60 smp_mb(); \ 61 ___p1; \ 62 }) 63 64 #endif /* !__ASSEMBLY__ */ 65 #endif /* __ASM_GENERIC_BARRIER_H */ 66