Module Name: src Committed By: riastradh Date: Sun Jul 17 18:45:48 UTC 2022
Modified Files: src/sys/external/bsd/common/include/asm: barrier.h Log Message: drm: Comment *mb() vs smp_*mb() and omit default for *mb(). In general membar_*() is _not_ enough for *mb(), because membar_*() is only for CPU/CPU synchronization on normal memory, and *mb() requires machine-dependent I/O logic. Leave it as an `#error' case if the architecture isn't listed here. But membar_*() is OK for smp_*(). Fill in powerpc and sparc while here, as examples of what the now-removed defaults failed to do. If you want to use drm on a mips or alpha system yer gonna hafta fill this in yourself. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/common/include/asm/barrier.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/common/include/asm/barrier.h diff -u src/sys/external/bsd/common/include/asm/barrier.h:1.13 src/sys/external/bsd/common/include/asm/barrier.h:1.14 --- src/sys/external/bsd/common/include/asm/barrier.h:1.13 Sat Apr 9 23:43:30 2022 +++ src/sys/external/bsd/common/include/asm/barrier.h Sun Jul 17 18:45:48 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: barrier.h,v 1.13 2022/04/09 23:43:30 riastradh Exp $ */ +/* $NetBSD: barrier.h,v 1.14 2022/07/17 18:45:48 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -42,6 +42,14 @@ #define MULTIPROCESSOR 1 /* safer to assume multiprocessor */ #endif +/* + * I/O memory barriers. drm uses these to order memory operations on + * normal or write-combining/prefetchable, or uncacheable I/O + * operations, for coordination between the CPU and I/O devices. + * + * In NetBSD, this is normally done with bus_space_barrier, but Linux + * doesn't pass around the bus space tag and handle needed for that. + */ #if defined(__aarch64__) #define mb() __asm __volatile ("dsb sy" ::: "memory") #define wmb() __asm __volatile ("dsb st" ::: "memory") @@ -51,12 +59,27 @@ #define mb() x86_mfence() #define wmb() x86_sfence() #define rmb() x86_lfence() +#elif defined(__powerpc__) +#define mb() __asm __volatile ("eieio" ::: "memory") +#define wmb() mb() +#define rmb() mb() +#elif defined(__sparc__) || defined(__sparc64__) +#ifdef __sparc64__ +#define mb() __asm __volatile ("membar #MemIssue" ::: "memory") #else -#define mb membar_sync -#define wmb membar_producer -#define rmb membar_consumer +#define mb() membar_sync() /* ldstub */ +#endif +#define wmb() mb() /* XXX could maybe be __insn_barrier in TSO */ +#define rmb() mb() /* XXX could maybe be __insn_barrier in TSO */ +#else +#error Define machine-dependent memory-mapped I/O barriers for drm. #endif +/* + * MP memory barriers. drm uses these to order memory operations on + * normal memory for coordination between CPUs. Aliases for NetBSD's + * membar_*. + */ #ifdef MULTIPROCESSOR # define smp_mb membar_sync # define smp_wmb membar_producer