xlat_table_v2: Fix enable WARMBOOT_ENABLE_DCACHE_EARLY config
authorArtsem Artsemenka <artsem.artsemenka@arm.com>
Thu, 17 Oct 2019 12:51:27 +0000 (13:51 +0100)
committerArtsem Artsemenka <artsem.artsemenka@arm.com>
Fri, 18 Oct 2019 09:26:34 +0000 (10:26 +0100)
The WARMBOOT_ENABLE_DCACHE_EARLY allows caches to be turned on early during
the boot. But the xlat_change_mem_attributes_ctx() API did not do the required
cache maintenance after the mmap tables are modified if
WARMBOOT_ENABLE_DCACHE_EARLY is enabled. This meant that when the caches are turned
off during power down, the tables in memory are accessed as part of cache
maintenance for power down, and the tables are not correct at this point which
results in a data abort.
This patch removes the optimization within xlat_change_mem_attributes_ctx()
when WARMBOOT_ENABLE_DCACHE_EARLY is enabled.

Signed-off-by: Artsem Artsemenka <artsem.artsemenka@arm.com>
Change-Id: I82de3decba87dd13e9856b5f3620a1c8571c8d87

lib/xlat_tables_v2/xlat_tables_utils.c

index 232142e84cd517710e99f8849b4c69290cb2d09e..30babc63f11b0b99bd9c06a1964caca9854f4e08 100644 (file)
@@ -551,7 +551,7 @@ int xlat_change_mem_attributes_ctx(const xlat_ctx_t *ctx, uintptr_t base_va,
                 * before writing the new descriptor.
                 */
                *entry = INVALID_DESC;
-#if !(HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY)
+#if !HW_ASSISTED_COHERENCY
                dccvac((uintptr_t)entry);
 #endif
                /* Invalidate any cached copy of this mapping in the TLBs. */
@@ -562,7 +562,7 @@ int xlat_change_mem_attributes_ctx(const xlat_ctx_t *ctx, uintptr_t base_va,
 
                /* Write new descriptor */
                *entry = xlat_desc(ctx, new_attr, addr_pa, level);
-#if !(HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY)
+#if !HW_ASSISTED_COHERENCY
                dccvac((uintptr_t)entry);
 #endif
                base_va += PAGE_SIZE;