1f20e2561SAndrew Jones #ifndef _ASMARM64_BITOPS_H_ 2f20e2561SAndrew Jones #define _ASMARM64_BITOPS_H_ 3f20e2561SAndrew Jones /* 449f758b8SAndrew Jones * Adapted from 5f20e2561SAndrew Jones * arch/arm64/lib/bitops.S 6f20e2561SAndrew Jones * 749f758b8SAndrew Jones * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com> 8f20e2561SAndrew Jones * 949f758b8SAndrew Jones * This work is licensed under the terms of the GNU GPL, version 2. 10f20e2561SAndrew Jones */ 11f20e2561SAndrew Jones 126ed97c50SPeter Feiner #ifndef _BITOPS_H_ 136ed97c50SPeter Feiner #error only <bitops.h> can be included directly 146ed97c50SPeter Feiner #endif 156ed97c50SPeter Feiner 16f20e2561SAndrew Jones #define BITS_PER_LONG 64 17f20e2561SAndrew Jones 18*71a6a145SAndrew Jones #define HAVE_BUILTIN_FLS 1 19*71a6a145SAndrew Jones 20f20e2561SAndrew Jones #define ATOMIC_BITOP(insn, mask, word) \ 21f20e2561SAndrew Jones ({ \ 22f20e2561SAndrew Jones unsigned long tmp1, tmp2; \ 23f20e2561SAndrew Jones asm volatile( \ 24f20e2561SAndrew Jones "1: ldxr %0, [%2]\n" \ 25f20e2561SAndrew Jones insn" %0, %0, %3\n" \ 26f20e2561SAndrew Jones " stxr %w1, %0, [%2]\n" \ 27f20e2561SAndrew Jones " cbnz %w1, 1b\n" \ 28f20e2561SAndrew Jones : "=&r" (tmp1), "=&r" (tmp2) \ 29f20e2561SAndrew Jones : "r" (word), "r" (mask) \ 30f20e2561SAndrew Jones : "cc"); \ 31f20e2561SAndrew Jones }) 32f20e2561SAndrew Jones 33f20e2561SAndrew Jones #define ATOMIC_TESTOP(insn, mask, word, old) \ 34f20e2561SAndrew Jones ({ \ 35f20e2561SAndrew Jones unsigned long tmp1, tmp2; \ 36f20e2561SAndrew Jones asm volatile( \ 37f20e2561SAndrew Jones "1: ldxr %0, [%3]\n" \ 38f20e2561SAndrew Jones " and %1, %0, %4\n" \ 39f20e2561SAndrew Jones insn" %0, %0, %4\n" \ 40f20e2561SAndrew Jones " stlxr %w2, %0, [%3]\n" \ 41f20e2561SAndrew Jones " cbnz %w2, 1b\n" \ 42f20e2561SAndrew Jones : "=&r" (tmp1), "=&r" (old), "=&r" (tmp2) \ 43f20e2561SAndrew Jones : "r" (word), "r" (mask) \ 44f20e2561SAndrew Jones : "cc"); \ 45f20e2561SAndrew Jones }) 46f20e2561SAndrew Jones 47f20e2561SAndrew Jones extern void set_bit(int nr, volatile unsigned long *addr); 48f20e2561SAndrew Jones extern void clear_bit(int nr, volatile unsigned long *addr); 49f20e2561SAndrew Jones extern int test_bit(int nr, const volatile unsigned long *addr); 50f20e2561SAndrew Jones extern int test_and_set_bit(int nr, volatile unsigned long *addr); 51f20e2561SAndrew Jones extern int test_and_clear_bit(int nr, volatile unsigned long *addr); 52f20e2561SAndrew Jones 53f20e2561SAndrew Jones #endif /* _ASMARM64_BITOPS_H_ */ 54