1*418b791dSBob Badour /** 2*418b791dSBob Badour * Copyright (c) 2019, The Linux Foundation. All rights reserved. 3*418b791dSBob Badour * 4*418b791dSBob Badour * Redistribution and use in source and binary forms, with or without 5*418b791dSBob Badour * modification, are permitted provided that the following conditions are 6*418b791dSBob Badour * met: 7*418b791dSBob Badour * * Redistributions of source code must retain the above copyright 8*418b791dSBob Badour * notice, this list of conditions and the following disclaimer. 9*418b791dSBob Badour * * Redistributions in binary form must reproduce the above 10*418b791dSBob Badour * copyright notice, this list of conditions and the following 11*418b791dSBob Badour * disclaimer in the documentation and/or other materials provided 12*418b791dSBob Badour * with the distribution. 13*418b791dSBob Badour * * Neither the name of The Linux Foundation nor the names of its 14*418b791dSBob Badour * contributors may be used to endorse or promote products derived 15*418b791dSBob Badour * from this software without specific prior written permission. 16*418b791dSBob Badour * 17*418b791dSBob Badour * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18*418b791dSBob Badour * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*418b791dSBob Badour * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20*418b791dSBob Badour * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21*418b791dSBob Badour * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*418b791dSBob Badour * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*418b791dSBob Badour * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24*418b791dSBob Badour * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25*418b791dSBob Badour * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26*418b791dSBob Badour * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*418b791dSBob Badour * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*418b791dSBob Badour */ 29*418b791dSBob Badour 30*418b791dSBob Badour #ifndef AEEATOMIC_H 31*418b791dSBob Badour #define AEEATOMIC_H 32*418b791dSBob Badour /* 33*418b791dSBob Badour ======================================================================= 34*418b791dSBob Badour 35*418b791dSBob Badour FILE: AEEatomic.h 36*418b791dSBob Badour 37*418b791dSBob Badour SERVICES: atomic 38*418b791dSBob Badour 39*418b791dSBob Badour DESCRIPTION: Fast Atomic ops 40*418b791dSBob Badour 41*418b791dSBob Badour ======================================================================= 42*418b791dSBob Badour */ 43*418b791dSBob Badour 44*418b791dSBob Badour #include "AEEStdDef.h" 45*418b791dSBob Badour 46*418b791dSBob Badour #ifdef __cplusplus 47*418b791dSBob Badour extern "C" { 48*418b791dSBob Badour #endif /* #ifdef __cplusplus */ 49*418b791dSBob Badour 50*418b791dSBob Badour uint32 atomic_Add(uint32 * volatile puDest, int nAdd); 51*418b791dSBob Badour uint32 atomic_Exchange(uint32 * volatile puDest, uint32 uVal); 52*418b791dSBob Badour uint32 atomic_CompareAndExchange(uint32 * volatile puDest, uint32 uExchange, uint32 uCompare); 53*418b791dSBob Badour uint32 atomic_CompareOrAdd(uint32 * volatile puDest, uint32 uCompare, int nAdd); 54*418b791dSBob Badour 55*418b791dSBob Badour uint64 atomic_CompareAndExchange64(uint64 * volatile puDest, uint64 uExchange, uint64 uCompare); 56*418b791dSBob Badour uintptr_t atomic_CompareAndExchangeUP(uintptr_t * volatile puDest, uintptr_t uExchange, uintptr_t uCompare); 57*418b791dSBob Badour #ifdef __cplusplus 58*418b791dSBob Badour } 59*418b791dSBob Badour #endif /* #ifdef __cplusplus */ 60*418b791dSBob Badour 61*418b791dSBob Badour /*===================================================================== 62*418b791dSBob Badour INTERFACE DOCUMENTATION 63*418b791dSBob Badour ======================================================================= 64*418b791dSBob Badour atomic Interface 65*418b791dSBob Badour 66*418b791dSBob Badour The atomic interface provides fast "atomic" operations. The 67*418b791dSBob Badour operations are defined to be atomic with respect to each other. 68*418b791dSBob Badour 69*418b791dSBob Badour ======================================================================= 70*418b791dSBob Badour 71*418b791dSBob Badour ======================================================================= 72*418b791dSBob Badour 73*418b791dSBob Badour atomic_Add() 74*418b791dSBob Badour 75*418b791dSBob Badour Description: 76*418b791dSBob Badour 77*418b791dSBob Badour Performs an atomic sum operation. 78*418b791dSBob Badour 79*418b791dSBob Badour Prototype: 80*418b791dSBob Badour 81*418b791dSBob Badour uint32 atomic_Add(uint32* puDest, int nInc); 82*418b791dSBob Badour 83*418b791dSBob Badour Parameters: 84*418b791dSBob Badour puDest [in|out] : Points to unsigned number to add nInc and save 85*418b791dSBob Badour nInc : increment 86*418b791dSBob Badour 87*418b791dSBob Badour Return Value: 88*418b791dSBob Badour result. 89*418b791dSBob Badour 90*418b791dSBob Badour Comments: 91*418b791dSBob Badour None 92*418b791dSBob Badour 93*418b791dSBob Badour Side Effects: 94*418b791dSBob Badour None 95*418b791dSBob Badour 96*418b791dSBob Badour See Also: 97*418b791dSBob Badour None 98*418b791dSBob Badour 99*418b791dSBob Badour ======================================================================= 100*418b791dSBob Badour 101*418b791dSBob Badour atomic_Exchange() 102*418b791dSBob Badour 103*418b791dSBob Badour Description: 104*418b791dSBob Badour 105*418b791dSBob Badour Atomic exchange of 32bit value. Performs an atomic operation of : 106*418b791dSBob Badour write uVal to *puDest 107*418b791dSBob Badour return the previous value in *puDest 108*418b791dSBob Badour 109*418b791dSBob Badour Prototype: 110*418b791dSBob Badour 111*418b791dSBob Badour uint32 atomic_Exchange(uint32* puDest, uint32 uVal); 112*418b791dSBob Badour 113*418b791dSBob Badour Parameters: 114*418b791dSBob Badour puDest [in|out] : Points to unsigned number to be exchanged 115*418b791dSBob Badour uVal : new value to write. 116*418b791dSBob Badour 117*418b791dSBob Badour Return Value: 118*418b791dSBob Badour previous value at *puDest. 119*418b791dSBob Badour 120*418b791dSBob Badour Comments: 121*418b791dSBob Badour None 122*418b791dSBob Badour 123*418b791dSBob Badour Side Effects: 124*418b791dSBob Badour May cause exception if puDest is not a 32 bit aligned address. 125*418b791dSBob Badour 126*418b791dSBob Badour See Also: 127*418b791dSBob Badour None 128*418b791dSBob Badour ======================================================================= 129*418b791dSBob Badour 130*418b791dSBob Badour atomic_CompareAndExchange() 131*418b791dSBob Badour 132*418b791dSBob Badour Description: 133*418b791dSBob Badour 134*418b791dSBob Badour Performs an atomic operation of : 135*418b791dSBob Badour if (*puDest == uCompare) { 136*418b791dSBob Badour *puDest = uExchange; 137*418b791dSBob Badour } 138*418b791dSBob Badour 139*418b791dSBob Badour returns the previous value in *puDest 140*418b791dSBob Badour 141*418b791dSBob Badour Prototype: 142*418b791dSBob Badour 143*418b791dSBob Badour uint32 atomic_CompareAndExchange(uint32 *puDest, uint32 uExchange, 144*418b791dSBob Badour uint32 uCompare); 145*418b791dSBob Badour 146*418b791dSBob Badour Parameters: 147*418b791dSBob Badour puDest [in|out] : Points to unsigned number. 148*418b791dSBob Badour uExchange : A new value to write to *puDest 149*418b791dSBob Badour uCompare : Comparand 150*418b791dSBob Badour 151*418b791dSBob Badour Return Value: 152*418b791dSBob Badour previous value at *puDest. 153*418b791dSBob Badour 154*418b791dSBob Badour Comments: 155*418b791dSBob Badour None 156*418b791dSBob Badour 157*418b791dSBob Badour Side Effects: 158*418b791dSBob Badour May cause exception if puDest is not a 32 bit aligned address. 159*418b791dSBob Badour 160*418b791dSBob Badour See Also: 161*418b791dSBob Badour None 162*418b791dSBob Badour 163*418b791dSBob Badour ======================================================================= 164*418b791dSBob Badour atomic_CompareOrAdd() 165*418b791dSBob Badour 166*418b791dSBob Badour Description: 167*418b791dSBob Badour 168*418b791dSBob Badour Performs an atomic operation of : 169*418b791dSBob Badour if (*puDest != uCompare) { 170*418b791dSBob Badour *puDest += nAdd; 171*418b791dSBob Badour } 172*418b791dSBob Badour 173*418b791dSBob Badour returns the new value in *puDest 174*418b791dSBob Badour 175*418b791dSBob Badour Prototype: 176*418b791dSBob Badour 177*418b791dSBob Badour uint32 atomic_CompareOrAdd(uint32 *puDest, uint32 uCompare, int nAdd); 178*418b791dSBob Badour 179*418b791dSBob Badour Parameters: 180*418b791dSBob Badour puDest [in|out] : Points to unsigned number. 181*418b791dSBob Badour uCompare : Comparand 182*418b791dSBob Badour nAdd : Add to *puDest 183*418b791dSBob Badour 184*418b791dSBob Badour Return Value: 185*418b791dSBob Badour new value at *puDest. 186*418b791dSBob Badour 187*418b791dSBob Badour Comments: 188*418b791dSBob Badour None 189*418b791dSBob Badour 190*418b791dSBob Badour Side Effects: 191*418b791dSBob Badour May cause exception if puDest is not a 32 bit aligned address. 192*418b791dSBob Badour 193*418b791dSBob Badour See Also: 194*418b791dSBob Badour None 195*418b791dSBob Badour =======================================================================*/ 196*418b791dSBob Badour 197*418b791dSBob Badour #endif /* #ifndef AEEATOMIC_H */ 198*418b791dSBob Badour 199