Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 1 | /* |
Anup patel | 20990ee | 2019-01-24 11:41:10 +0530 | [diff] [blame] | 2 | * SPDX-License-Identifier: BSD-2-Clause |
| 3 | * |
| 4 | * Copyright (c) 2019 Western Digital Corporation or its affiliates. |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 5 | * |
| 6 | * Authors: |
| 7 | * Anup Patel <anup.patel@wdc.com> |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 8 | */ |
| 9 | |
| 10 | #ifndef __RISCV_BARRIER_H__ |
| 11 | #define __RISCV_BARRIER_H__ |
| 12 | |
Olof Johansson | fbf986a | 2019-04-10 17:41:46 -0700 | [diff] [blame] | 13 | /* clang-format off */ |
| 14 | |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 15 | #define RISCV_ACQUIRE_BARRIER "\tfence r , rw\n" |
| 16 | #define RISCV_RELEASE_BARRIER "\tfence rw, w\n" |
| 17 | |
| 18 | #define RISCV_FENCE(p, s) \ |
| 19 | __asm__ __volatile__ ("fence " #p "," #s : : : "memory") |
| 20 | |
Guo Ren | 49e422c | 2021-04-17 16:26:17 +0000 | [diff] [blame] | 21 | #define RISCV_FENCE_I \ |
| 22 | __asm__ __volatile__ ("fence.i" : : : "memory") |
| 23 | |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 24 | /* Read & Write Memory barrier */ |
| 25 | #define mb() RISCV_FENCE(iorw,iorw) |
| 26 | |
| 27 | /* Read Memory barrier */ |
| 28 | #define rmb() RISCV_FENCE(ir,ir) |
| 29 | |
| 30 | /* Write Memory barrier */ |
| 31 | #define wmb() RISCV_FENCE(ow,ow) |
| 32 | |
| 33 | /* SMP Read & Write Memory barrier */ |
| 34 | #define smp_mb() RISCV_FENCE(rw,rw) |
| 35 | |
| 36 | /* SMP Read Memory barrier */ |
| 37 | #define smp_rmb() RISCV_FENCE(r,r) |
| 38 | |
| 39 | /* SMP Write Memory barrier */ |
| 40 | #define smp_wmb() RISCV_FENCE(w,w) |
| 41 | |
| 42 | /* CPU relax for busy loop */ |
| 43 | #define cpu_relax() asm volatile ("" : : : "memory") |
| 44 | |
Olof Johansson | fbf986a | 2019-04-10 17:41:46 -0700 | [diff] [blame] | 45 | /* clang-format on */ |
| 46 | |
Olof Johansson | 10baa64 | 2019-04-10 17:41:52 -0700 | [diff] [blame] | 47 | #define __smp_store_release(p, v) \ |
| 48 | do { \ |
| 49 | RISCV_FENCE(rw, w); \ |
| 50 | *(p) = (v); \ |
| 51 | } while (0) |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 52 | |
Olof Johansson | 10baa64 | 2019-04-10 17:41:52 -0700 | [diff] [blame] | 53 | #define __smp_load_acquire(p) \ |
| 54 | ({ \ |
| 55 | typeof(*p) ___p1 = *(p); \ |
| 56 | RISCV_FENCE(r, rw); \ |
| 57 | ___p1; \ |
| 58 | }) |
Anup Patel | 9e8ff05 | 2018-12-11 19:24:06 +0530 | [diff] [blame] | 59 | |
| 60 | #endif |