blob: ce8543ae43b02c93f646538d3dff512f8b0d82fc [file] [log] [blame]
/*
* Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
* SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
* INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
* OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
* BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
* COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
* DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
* TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
*/
#define locked 1
#define unlocked 0
.global spin_lock
spin_lock:
LDR w1, =locked
mux1: LDXR w2, [x0]
CMP w2, w1 // Test if mutex is locked or unlocked
BEQ mux2 // If locked - wait for it to be released, from 2
STXR w2, w1, [x0] // Not locked, attempt to lock it
CMP w2, #1 // Check if Store-Exclusive failed
BEQ mux1 // Failed - retry from 1
// Lock acquired
DMB sy // Required before accessing protected resource
RET
mux2: // Take appropriate action while waiting for mutex to become unlocked
// WAIT_FOR_UPDATE
B mux1 // Retry from 1
// void spin_unlock(&lock)
.global spin_unlock
spin_unlock:
LDR w1, =unlocked
DMB sy // Required before releasing protected resource
STR w1, [x0] // Unlock mutex
RET
// void spin_lock_init(&lock)
.global spin_lock_init
spin_lock_init:
LDR w1, =unlocked
DMB sy // Required before releasing protected resource
STR w1, [x0] // Unlock mutex
RET
/*
unsigned long long arm_get_CNTPCT();
*/
.global arm_get_CNTPCT
arm_get_CNTPCT:
MRS x0, CNTPCT_EL0 // Physical Count
RET
/*
void RestoreIRQ(unsigned int DAIF_save);
*/
.global RestoreIRQ
RestoreIRQ:
AND x0, x0, #(1<<7)
MRS x1, DAIF
BIC x1, x1, #(1<<7)
ORR x0, x1, x0
MSR DAIF, x0
RET
/*
// return DAIF_save
unsigned int DisableIRQ();
*/
.global DisableIRQ
DisableIRQ:
MRS x0, DAIF
MSR DAIFSET, #2
RET
/*
void RestoreFIQ(unsigned int DAIF_save);
*/
.global RestoreFIQ
RestoreFIQ:
AND x0, x0, #(1<<6)
MRS x1, DAIF
BIC x1, x1, #(1<<6)
ORR x0, x1, x0
MSR DAIF, x0
RET
/*
// return DAIF_save
unsigned int DisableFIQ();
*/
.global DisableFIQ
DisableFIQ:
MRS x0, DAIF
MSR DAIFSET, #1
RET