Make generic code work in presence of system caches
On the ARMv8 architecture, cache maintenance operations by set/way on the last
level of integrated cache do not affect the system cache. This means that such a
flush or clean operation could result in the data being pushed out to the system
cache rather than main memory. Another CPU could access this data before it
enables its data cache or MMU. Such accesses could be serviced from the main
memory instead of the system cache. If the data in the sysem cache has not yet
been flushed or evicted to main memory then there could be a loss of
coherency. The only mechanism to guarantee that the main memory will be updated
is to use cache maintenance operations to the PoC by MVA(See section D3.4.11
(System level caches) of ARMv8-A Reference Manual (Issue A.g/ARM DDI0487A.G).

This patch removes the reliance of Trusted Firmware on the flush by set/way
operation to ensure visibility of data in the main memory. Cache maintenance
operations by MVA are now used instead. The following are the broad category of
changes:

1. The RW areas of BL2/BL31/BL32 are invalidated by MVA before the C runtime is
   initialised. This ensures that any stale cache lines at any level of cache
   are removed.

2. Updates to global data in runtime firmware (BL31) by the primary CPU are made
   visible to secondary CPUs using a cache clean operation by MVA.

3. Cache maintenance by set/way operations are only used prior to power down.

NOTE: NON-UPSTREAM TRUSTED FIRMWARE CODE SHOULD MAKE EQUIVALENT CHANGES IN
ORDER TO FUNCTION CORRECTLY ON PLATFORMS WITH SUPPORT FOR SYSTEM CACHES.

Fixes ARM-software/tf-issues#205

Change-Id: I64f1b398de0432813a0e0881d70f8337681f6e9a
1 parent 7dc28e9 commit 54dc71e7ec9f2a069907e8c0c24b5c8f8cc5f66a
@Achin Gupta Achin Gupta authored on 11 Sep 2015
Showing 14 changed files
View
bl2/aarch64/bl2_entrypoint.S
View
bl2/bl2.ld.S
View
bl31/aarch64/bl31_entrypoint.S
View
bl31/bl31.ld.S
View
bl31/bl31_main.c
View
bl32/tsp/aarch64/tsp_entrypoint.S
View
bl32/tsp/tsp.ld.S
View
include/common/el3_common_macros.S
View
include/lib/aarch64/arch_helpers.h
View
lib/aarch64/cache_helpers.S
View
lib/aarch64/misc_helpers.S
View
services/std_svc/psci/psci_on.c
View
services/std_svc/psci/psci_setup.c
View
services/std_svc/psci/psci_suspend.c