-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARCv2 based HS38 cores are weakly ordered and thus explicit barriers for kernel proper. SMP barrier is provided by DMB instruction which also guarantees local barrier hence used as backend of smp_*mb() as well as *mb() APIs Also hookup barriers into MMIO accessors to avoid ordering issues in IO Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
- Loading branch information
Vineet Gupta
committed
Jun 25, 2015
1 parent
470c27e
commit b8a0330
Showing
3 changed files
with
87 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __ASM_BARRIER_H | ||
#define __ASM_BARRIER_H | ||
|
||
#ifdef CONFIG_ISA_ARCV2 | ||
|
||
/* | ||
* ARCv2 based HS38 cores are in-order issue, but still weakly ordered | ||
* due to micro-arch buffering/queuing of load/store, cache hit vs. miss ... | ||
* | ||
* Explicit barrier provided by DMB instruction | ||
* - Operand supports fine grained load/store/load+store semantics | ||
* - Ensures that selected memory operation issued before it will complete | ||
* before any subsequent memory operation of same type | ||
* - DMB guarantees SMP as well as local barrier semantics | ||
* (asm-generic/barrier.h ensures sane smp_*mb if not defined here, i.e. | ||
* UP: barrier(), SMP: smp_*mb == *mb) | ||
* - DSYNC provides DMB+completion_of_cache_bpu_maintenance_ops hence not needed | ||
* in the general case. Plus it only provides full barrier. | ||
*/ | ||
|
||
#define mb() asm volatile("dmb 3\n" : : : "memory") | ||
#define rmb() asm volatile("dmb 1\n" : : : "memory") | ||
#define wmb() asm volatile("dmb 2\n" : : : "memory") | ||
|
||
#endif | ||
|
||
#ifdef CONFIG_ISA_ARCOMPACT | ||
|
||
/* | ||
* ARCompact based cores (ARC700) only have SYNC instruction which is super | ||
* heavy weight as it flushes the pipeline as well. | ||
* There are no real SMP implementations of such cores. | ||
*/ | ||
|
||
#define mb() asm volatile("sync\n" : : : "memory") | ||
#endif | ||
|
||
#include <asm-generic/barrier.h> | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters