1/* 2 * Based on arch/arm/lib/bitops.h 3 * 4 * Copyright (C) 2013 ARM Ltd. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19#include <linux/linkage.h> 20#include <asm/assembler.h> 21#include <asm/lse.h> 22 23/* 24 * x0: bits 5:0 bit offset 25 * bits 31:6 word offset 26 * x1: address 27 */ 28 .macro bitop, name, llsc, lse 29ENTRY( \name ) 30 and w3, w0, #63 // Get bit offset 31 eor w0, w0, w3 // Clear low bits 32 mov x2, #1 33 add x1, x1, x0, lsr #3 // Get word offset 34alt_lse " prfm pstl1strm, [x1]", "nop" 35 lsl x3, x2, x3 // Create mask 36 37alt_lse "1: ldxr x2, [x1]", "\lse x3, [x1]" 38alt_lse " \llsc x2, x2, x3", "nop" 39alt_lse " stxr w0, x2, [x1]", "nop" 40alt_lse " cbnz w0, 1b", "nop" 41 42 ret 43ENDPROC(\name ) 44 .endm 45 46 .macro testop, name, llsc, lse 47ENTRY( \name ) 48 and w3, w0, #63 // Get bit offset 49 eor w0, w0, w3 // Clear low bits 50 mov x2, #1 51 add x1, x1, x0, lsr #3 // Get word offset 52alt_lse " prfm pstl1strm, [x1]", "nop" 53 lsl x4, x2, x3 // Create mask 54 55alt_lse "1: ldxr x2, [x1]", "\lse x4, x2, [x1]" 56 lsr x0, x2, x3 57alt_lse " \llsc x2, x2, x4", "nop" 58alt_lse " stlxr w5, x2, [x1]", "nop" 59alt_lse " cbnz w5, 1b", "nop" 60alt_lse " dmb ish", "nop" 61 62 and x0, x0, #1 63 ret 64ENDPROC(\name ) 65 .endm 66 67/* 68 * Atomic bit operations. 69 */ 70 bitop change_bit, eor, steor 71 bitop clear_bit, bic, stclr 72 bitop set_bit, orr, stset 73 74 testop test_and_change_bit, eor, ldeoral 75 testop test_and_clear_bit, bic, ldclral 76 testop test_and_set_bit, orr, ldsetal 77