From a10d3632acbd1135648f07c2a998cba8c5c77cfd Mon Sep 17 00:00:00 2001 From: Jeenu Viswambharan Date: Fri, 6 Jan 2017 14:58:11 +0000 Subject: PSCI: Introduce cache and barrier wrappers The PSCI implementation performs cache maintenance operations on its data structures to ensure their visibility to both cache-coherent and non-cache-coherent participants. These cache maintenance operations can be skipped if all PSCI participants are cache-coherent. When HW_ASSISTED_COHERENCY build option is enabled, we assume PSCI participants are cache-coherent. For usage abstraction, this patch introduces wrappers for PSCI cache maintenance and barrier operations used for state coordination: they are effectively NOPs when HW_ASSISTED_COHERENCY is enabled, but are applied otherwise. Also refactor local state usage and associated cache operations to make it clearer. Change-Id: I77f17a90cba41085b7188c1345fe5731c99fad87 Signed-off-by: Jeenu Viswambharan --- lib/psci/psci_private.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'lib/psci/psci_private.h') diff --git a/lib/psci/psci_private.h b/lib/psci/psci_private.h index ca8291e4..7f0204ad 100644 --- a/lib/psci/psci_private.h +++ b/lib/psci/psci_private.h @@ -38,6 +38,29 @@ #include #include +#if HW_ASSISTED_COHERENCY +/* + * On systems with hardware-assisted coherency, make PSCI cache operations NOP, + * as PSCI participants are cache-coherent, and there's no need for explicit + * cache maintenance operations or barriers to coordinate their state. + */ +#define psci_flush_dcache_range(addr, size) +#define psci_flush_cpu_data(member) +#define psci_inv_cpu_data(member) + +#define psci_dsbish() +#else +/* + * If not all PSCI participants are cache-coherent, perform cache maintenance + * and issue barriers wherever required to coordinate state. + */ +#define psci_flush_dcache_range(addr, size) flush_dcache_range(addr, size) +#define psci_flush_cpu_data(member) flush_cpu_data(member) +#define psci_inv_cpu_data(member) inv_cpu_data(member) + +#define psci_dsbish() dsbish() +#endif + /* * The following helper macros abstract the interface to the Bakery * Lock API. -- cgit v1.2.3