f9678735969bd5d3561560f96cc0b7f9b5b79995
[processor-sdk/open-amp.git] / lib / include / openamp / system / generic / machine / zynqmp_r5 / machine_system.h
1 /*
2  * Copyright (c) 2014, Mentor Graphics Corporation
3  * All rights reserved.
4  * Copyright (c) 2015 Xilinx, Inc. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
15  *    may be used to endorse or promote products derived from this software
16  *    without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
31 #ifndef _MACHINE_SYSTEM_H
32 #define _MACHINE_SYSTEM_H
34 /* Memory barrier */
35 #if (defined(__CC_ARM))
36 #define MEM_BARRIER() __schedule_barrier()
37 #elif (defined(__GNUC__))
38 #define MEM_BARRIER() asm volatile("dsb" : : : "memory")
39 #else
40 #define MEM_BARRIER()
41 #endif
43 static inline unsigned int xchg(void* plock, unsigned int lockVal)
44 {
45         volatile unsigned int tmpVal = 0;
46         volatile unsigned int tmpVal1 = 0;
48 #ifdef __GNUC__
50         asm (
51                 "1:                                \n\t"
52                 "LDREX  %[tmpVal], [%[plock]]      \n\t"
53                 "STREX  %[tmpVal1], %[lockVal], [%[plock]] \n\t"
54                 "CMP    %[tmpVal1], #0                     \n\t"
55                 "BNE    1b                         \n\t"
56                 "DMB                               \n\t"
57                 : [tmpVal] "=&r"(tmpVal)
58                 : [tmpVal1] "r" (tmpVal1), [lockVal] "r"(lockVal), [plock] "r"(plock)
59                 : "cc", "memory"
60         );
62 #endif
64         return tmpVal;
65 }
67 #endif                          /* _MACHINE_SYSTEM_H */