xref: /optee_os/lib/libutils/ext/include/atomic.h (revision 4395abf750bad0969bfba603c159eefd494a9fff)
1e17dd72aSJens Wiklander /*
2*4395abf7SJens Wiklander  * Copyright (c) 2016-2017, Linaro Limited
3*4395abf7SJens Wiklander  *
4*4395abf7SJens Wiklander  * SPDX-License-Identifier: BSD-2-Clause
5e17dd72aSJens Wiklander  *
6e17dd72aSJens Wiklander  * Redistribution and use in source and binary forms, with or without
7e17dd72aSJens Wiklander  * modification, are permitted provided that the following conditions are met:
8e17dd72aSJens Wiklander  *
9e17dd72aSJens Wiklander  * 1. Redistributions of source code must retain the above copyright notice,
10e17dd72aSJens Wiklander  * this list of conditions and the following disclaimer.
11e17dd72aSJens Wiklander  *
12e17dd72aSJens Wiklander  * 2. Redistributions in binary form must reproduce the above copyright notice,
13e17dd72aSJens Wiklander  * this list of conditions and the following disclaimer in the documentation
14e17dd72aSJens Wiklander  * and/or other materials provided with the distribution.
15e17dd72aSJens Wiklander  *
16e17dd72aSJens Wiklander  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17e17dd72aSJens Wiklander  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18e17dd72aSJens Wiklander  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19e17dd72aSJens Wiklander  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20e17dd72aSJens Wiklander  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21e17dd72aSJens Wiklander  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22e17dd72aSJens Wiklander  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23e17dd72aSJens Wiklander  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24e17dd72aSJens Wiklander  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25e17dd72aSJens Wiklander  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26e17dd72aSJens Wiklander  * POSSIBILITY OF SUCH DAMAGE.
27e17dd72aSJens Wiklander  */
28e17dd72aSJens Wiklander 
29e17dd72aSJens Wiklander #ifndef __ATOMIC_H
30e17dd72aSJens Wiklander #define __ATOMIC_H
31e17dd72aSJens Wiklander 
32*4395abf7SJens Wiklander #include <compiler.h>
33e17dd72aSJens Wiklander #include <types_ext.h>
34e17dd72aSJens Wiklander 
35e17dd72aSJens Wiklander uint32_t atomic_inc32(volatile uint32_t *v);
36e17dd72aSJens Wiklander uint32_t atomic_dec32(volatile uint32_t *v);
37e17dd72aSJens Wiklander 
38*4395abf7SJens Wiklander static inline bool atomic_cas_uint(unsigned int *p, unsigned int *oval,
39*4395abf7SJens Wiklander 				   unsigned int nval)
40*4395abf7SJens Wiklander {
41*4395abf7SJens Wiklander 	return __compiler_compare_and_swap(p, oval, nval);
42*4395abf7SJens Wiklander }
43*4395abf7SJens Wiklander 
44*4395abf7SJens Wiklander static inline bool atomic_cas_u32(uint32_t *p, uint32_t *oval, uint32_t nval)
45*4395abf7SJens Wiklander {
46*4395abf7SJens Wiklander 	return __compiler_compare_and_swap(p, oval, nval);
47*4395abf7SJens Wiklander }
48*4395abf7SJens Wiklander 
49*4395abf7SJens Wiklander static inline unsigned int atomic_load_uint(unsigned int *p)
50*4395abf7SJens Wiklander {
51*4395abf7SJens Wiklander 	return __compiler_atomic_load(p);
52*4395abf7SJens Wiklander }
53*4395abf7SJens Wiklander 
54*4395abf7SJens Wiklander static inline unsigned int atomic_load_u32(unsigned int *p)
55*4395abf7SJens Wiklander {
56*4395abf7SJens Wiklander 	return __compiler_atomic_load(p);
57*4395abf7SJens Wiklander }
58*4395abf7SJens Wiklander 
59*4395abf7SJens Wiklander static inline void atomic_store_uint(unsigned int *p, unsigned int val)
60*4395abf7SJens Wiklander {
61*4395abf7SJens Wiklander 	__compiler_atomic_store(p, val);
62*4395abf7SJens Wiklander }
63*4395abf7SJens Wiklander 
64*4395abf7SJens Wiklander static inline void atomic_store_u32(uint32_t *p, uint32_t val)
65*4395abf7SJens Wiklander {
66*4395abf7SJens Wiklander 	__compiler_atomic_store(p, val);
67*4395abf7SJens Wiklander }
68*4395abf7SJens Wiklander 
69e17dd72aSJens Wiklander #endif /*__ATOMIC_H*/
70