| /* |
| * 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 |
| |