/* --- Version 4.0 --- 12-Feb-1999 --- */
/*
 * Include the following routines :
 *		atomic_or()
 *		scaledtimestamp()
 *
 *	Updated the copyright.
 */

/*
 *	unsigned int atomic_or(unsigned int *area, unsigned int mask)
 *
 *		Atomically or the mask into *area.
 *		Returns the old value.
 */
/*
 *	long long scaledtimestamp(double scale)
 *
 *		Read the PPC timebase. Convert the time base value based on
 *		scale.
 *
 *		Caveat: scale can not be 0, NaN, Inf. It's upto the caller
 *				to validate scale before calling this.
 */

/* --- Version 3.0 --- 23-Oct-1998 --- */
/*
 * Made the headers c++ friendly
 * Build a static library with dynamic code generation.
 * If you make a copy of the libatomic.a do not forget to run "ranlib".
 */

/* --- Version 2.0 --- 23-Oct-1998 --- */
/*
 * Added routines described in timestamp.h
 * Test program for these is in hmi.c
 */

/* --- Version 1.0 --- 12-Oct-1998 --- */
/*
 *	void spin_lock_init(spin_lock_t)
 *
 *		Initialize a spin lock.
 *		These locks should be cache aligned and a multiple of cache size.
 */

/*
 *	void spin_lock_unlock(spin_lock_t)
 *
 *		Unconditionally release lock.
 */

/*
 *	unsigned int spin_lock_lock(spin_lock_t)
 *
 *		Try to acquire spin-lock. Return success (1).
 */

/*
 *	unsigned int spin_lock_bit(spin_lock_t, unsigned int bits)
 *
 *		Try to acquire spin-lock. The second parameter is the bit mask to 
 *		test and set. multiple bits may be set.
 *		Return success (1).
 */

/*
 *	unsigned int spin_unlock_bit(spin_lock_t, unsigned int bits)
 *
 *		Release bit based spin-lock. The second parameter is the bit mask to 
 *		clear. Multiple bits may be cleared.
 */

/*
 *	unsigned int spin_lock_try(spin_lock_t)
 *
 *		Try to acquire spin-lock. Return success (1) or failure (0).
 */

/*
 *	unsigned int spin_lock_held(spin_lock_t)
 *
 *      Return 1 if lock is held
 *      N.B.  Racy, of course.
 */

/*
 *	unsigned int compare_and_store(unsigned int oval,
 *									unsigned int nval, unsigned int *area)
 *
 *		Compare oval to area if equal, store nval, and return true
 *		else return false and no store
 *		This is an atomic operation
 */

/*
 *	unsigned int atomic_add(unsigned int *area, int val)
 *
 *		Atomically add the second parameter to the first.
 *		Returns the result.
 */

/*
 *	unsigned int atomic_sub(unsigned int *area, int val)
 *
 *		Atomically subtract the second parameter from the first.
 *		Returns the result.
 */

/*
 *	void queue_atomic(unsigned int * anchor,
 *						unsigned int * elem, unsigned int disp)
 *
 *		Atomically inserts the element at the head of the list
 *		anchor is the pointer to the first element
 *		element is the pointer to the element to insert
 *		disp is the displacement into the element to the chain pointer
 */

/*
 *	void queue_atomic_list(unsigned int * anchor,
 *							unsigned int * first, unsigned int * last,
 *							unsigned int disp)
 *
 *		Atomically inserts the list of elements at the head of the list
 *		anchor is the pointer to the first element
 *		first is the pointer to the first element to insert
 *		last is the pointer to the last element to insert
 *		disp is the displacement into the element to the chain pointer
 */

/*
 *	unsigned int *dequeue_atomic(unsigned int *anchor, unsigned int disp)
 *
 *		Atomically removes the first element in a list and returns it.
 *		anchor is the pointer to the first element
 *		disp is the displacement into the element to the chain pointer
 *		Returns element if found, 0 if empty.
 */
