Spdk/include/spdk/barrier.h
paul luse a6dbe3721e update Intel copyright notices
per Intel policy to include file commit date using git cmd
below.  The policy does not apply to non-Intel (C) notices.

git log --follow -C90% --format=%ad --date default <file> | tail -1

and then pull just the 4 digit year from the result.

Intel copyrights were not added to files where Intel either had
no contribution ot the contribution lacked substance (ie license
header updates, formatting changes, etc).  Contribution date used
"--follow -C95%" to get the most accurate date.

Note that several files in this patch didn't end the license/(c)
block with a blank comment line so these were added as the vast
majority of files do have this last blank line.  Simply there for
consistency.

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: Id5b7ce4f658fe87132f14139ead58d6e285c04d4
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15192
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Community-CI: Mellanox Build Bot
2022-11-10 08:28:53 +00:00

106 lines
3.0 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C) 2015 Intel Corporation.
* Copyright (c) 2017, IBM Corporation.
* All rights reserved.
*/
/** \file
* Memory barriers
*/
#ifndef SPDK_BARRIER_H
#define SPDK_BARRIER_H
#include "spdk/stdinc.h"
#ifdef __cplusplus
extern "C" {
#endif
/** Compiler memory barrier */
#define spdk_compiler_barrier() __asm volatile("" ::: "memory")
/** Read memory barrier */
#define spdk_rmb() _spdk_rmb()
/** Write memory barrier */
#define spdk_wmb() _spdk_wmb()
/** Full read/write memory barrier */
#define spdk_mb() _spdk_mb()
/** SMP read memory barrier. */
#define spdk_smp_rmb() _spdk_smp_rmb()
/** SMP write memory barrier. */
#define spdk_smp_wmb() _spdk_smp_wmb()
/** SMP read/write memory barrier. */
#define spdk_smp_mb() _spdk_smp_mb()
/** Invalidate data cache, input is data pointer */
#define spdk_ivdt_dcache(pdata) _spdk_ivdt_dcache(pdata)
#ifdef __PPC64__
#define _spdk_rmb() __asm volatile("sync" ::: "memory")
#define _spdk_wmb() __asm volatile("sync" ::: "memory")
#define _spdk_mb() __asm volatile("sync" ::: "memory")
#define _spdk_smp_rmb() __asm volatile("lwsync" ::: "memory")
#define _spdk_smp_wmb() __asm volatile("lwsync" ::: "memory")
#define _spdk_smp_mb() spdk_mb()
#define _spdk_ivdt_dcache(pdata)
#elif defined(__aarch64__)
#define _spdk_rmb() __asm volatile("dsb ld" ::: "memory")
#define _spdk_wmb() __asm volatile("dsb st" ::: "memory")
#define _spdk_mb() __asm volatile("dsb sy" ::: "memory")
#define _spdk_smp_rmb() __asm volatile("dmb ishld" ::: "memory")
#define _spdk_smp_wmb() __asm volatile("dmb ishst" ::: "memory")
#define _spdk_smp_mb() __asm volatile("dmb ish" ::: "memory")
#define _spdk_ivdt_dcache(pdata) asm volatile("dc civac, %0" : : "r"(pdata) : "memory");
#elif defined(__i386__) || defined(__x86_64__)
#define _spdk_rmb() __asm volatile("lfence" ::: "memory")
#define _spdk_wmb() __asm volatile("sfence" ::: "memory")
#define _spdk_mb() __asm volatile("mfence" ::: "memory")
#define _spdk_smp_rmb() spdk_compiler_barrier()
#define _spdk_smp_wmb() spdk_compiler_barrier()
#if defined(__x86_64__)
#define _spdk_smp_mb() __asm volatile("lock addl $0, -128(%%rsp); " ::: "memory");
#elif defined(__i386__)
#define _spdk_smp_mb() __asm volatile("lock addl $0, -128(%%esp); " ::: "memory");
#endif
#define _spdk_ivdt_dcache(pdata)
#elif defined(__riscv)
#define _spdk_rmb() __asm__ __volatile__("fence ir, ir" ::: "memory")
#define _spdk_wmb() __asm__ __volatile__("fence ow, ow" ::: "memory")
#define _spdk_mb() __asm__ __volatile__("fence iorw, iorw" ::: "memory")
#define _spdk_smp_rmb() __asm__ __volatile__("fence r, r" ::: "memory")
#define _spdk_smp_wmb() __asm__ __volatile__("fence w, w" ::: "memory")
#define _spdk_smp_mb() __asm__ __volatile__("fence rw, rw" ::: "memory")
#define _spdk_ivdt_dcache(pdata)
#else
#define _spdk_rmb()
#define _spdk_wmb()
#define _spdk_mb()
#define _spdk_smp_rmb()
#define _spdk_smp_wmb()
#define _spdk_smp_mb()
#define _spdk_ivdt_dcache(pdata)
#error Unknown architecture
#endif
#ifdef __cplusplus
}
#endif
#endif