From 6923f2a0c59cf92ba5ad50ec1d658a357b4ba5d7 Mon Sep 17 00:00:00 2001
From: Jaxson Han <jaxson.han@arm.com>
Date: Tue, 2 Nov 2021 10:48:39 +0800
Subject: [PATCH] PSCI: Apply flush cache after setting branch_data

For v8-R64, Hypervisor calls boot-wrapper's PSCI service using simple
function call (instead of hvc).

In this case, hypervisor's main core has enabled MPU and cache, but
the secondary cores which are spinning have not enabled cache.
That means if the main core set the branch_data to 1 to boot other
cores, the secondary cores cannot see the change of branch_data and
also cannot break the spin.

Thus, the PSCI service in boot-wrapper needs a cache flush after
setting branch_data in order to let other cores see the change.

Issue-ID: SCM-3816
Upstream-Status: Inappropriate [other]
  Implementation pending further discussion
Signed-off-by: Jaxson Han <jaxson.han@arm.com>
Change-Id: Ifc282091c54d8fb2ffdb8cfa7fd3ffc1f4be717e
---
 common/psci.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/common/psci.c b/common/psci.c
index 945780b..6efc695 100644
--- a/common/psci.c
+++ b/common/psci.c
@@ -24,12 +24,18 @@ static unsigned long branch_table[NR_CPUS];
 
 bakery_ticket_t branch_table_lock[NR_CPUS];
 
+static inline void flush_per_cpu_data(void *data)
+{
+	asm volatile ("dc cvac, %0" : : "r" (data));
+}
+
 static int psci_store_address(unsigned int cpu, unsigned long address)
 {
 	if (branch_table[cpu] != PSCI_ADDR_INVALID)
 		return PSCI_RET_ALREADY_ON;
 
 	branch_table[cpu] = address;
+	flush_per_cpu_data((void*)&(branch_table[cpu]));
 	return PSCI_RET_SUCCESS;
 }
 
-- 
2.25.1

