DynamIQ: Enable MMU without using stack
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>
Fri, 27 Apr 2018 14:17:03 +0000 (15:17 +0100)
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>
Wed, 27 Jun 2018 10:31:30 +0000 (11:31 +0100)
Having an active stack while enabling MMU has shown coherency problems.
This patch builds on top of translation library changes that introduces
MMU-enabling without using stacks.

Previously, with HW_ASSISTED_COHERENCY, data caches were disabled while
enabling MMU only because of active stack. Now that we can enable MMU
without using stack, we can enable both MMU and data caches at the same
time.

NOTE: Since this feature depends on using translation table library v2,
disallow using translation table library v1 with HW_ASSISTED_COHERENCY.

Fixes ARM-software/tf-issues#566

Change-Id: Ie55aba0c23ee9c5109eb3454cb8fa45d74f8bbb2
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
bl31/aarch64/bl31_entrypoint.S
bl32/sp_min/aarch32/entrypoint.S
docs/porting-guide.rst
docs/user-guide.rst
lib/xlat_tables/xlat_tables_private.h
plat/common/aarch64/plat_common.c
plat/common/aarch64/platform_helpers.S

index 0d1077cbd608a39ee7b9b23f8f70b2fda237d841..58e8afbd2fc07264baa81ebbc1e851247dc923ac 100644 (file)
@@ -170,15 +170,12 @@ func bl31_warm_entrypoint
         * enter coherency (as CPUs already are); and there's no reason to have
         * caches disabled either.
         */
-       mov     x0, #DISABLE_DCACHE
-       bl      bl31_plat_enable_mmu
-
 #if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
-       mrs     x0, sctlr_el3
-       orr     x0, x0, #SCTLR_C_BIT
-       msr     sctlr_el3, x0
-       isb
+       mov     x0, xzr
+#else
+       mov     x0, #DISABLE_DCACHE
 #endif
+       bl      bl31_plat_enable_mmu
 
        bl      psci_warmboot_entrypoint
 
index 87ef3f36e534ef00872c1956a27564296782b746..d6853cc406886036a16ec24e0c5340f405cc0550 100644 (file)
@@ -298,20 +298,17 @@ func sp_min_warm_entrypoint
         * enter coherency (as CPUs already are); and there's no reason to have
         * caches disabled either.
         */
+#if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
+       mov     r0, #0
+#else
        mov     r0, #DISABLE_DCACHE
+#endif
        bl      bl32_plat_enable_mmu
 
 #if SP_MIN_WITH_SECURE_FIQ
        route_fiq_to_sp_min r0
 #endif
 
-#if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
-       ldcopr  r0, SCTLR
-       orr     r0, r0, #SCTLR_C_BIT
-       stcopr  r0, SCTLR
-       isb
-#endif
-
        bl      sp_min_warm_boot
        bl      smc_get_next_ctx
        /* r0 points to `smc_ctx_t` */
index a737cf4e62630735426ef22541d6529ca47e8f67..5462cc1ec21bae7e6c19c0fe41399f173f64041a 100644 (file)
@@ -1997,6 +1997,25 @@ state. This function must return a pointer to the ``entry_point_info`` structure
 (that was copied during ``bl31_early_platform_setup()``) if the image exists. It
 should return NULL otherwise.
 
+Function : bl31_plat_enable_mmu [optional]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    Argument : uint32_t
+    Return   : void
+
+This function enables the MMU. The boot code calls this function with MMU and
+caches disabled. This function should program necessary registers to enable
+translation, and upon return, the MMU on the calling PE must be enabled.
+
+The function must honor flags passed in the first argument. These flags are
+defined by the translation library, and can be found in the file
+``include/lib/xlat_tables/xlat_mmu_helpers.h``.
+
+On DynamIQ systems, this function must not use stack while enabling MMU, which
+is how the function in xlat table library version 2 is implementated.
+
 Function : plat\_get\_syscnt\_freq2() [mandatory]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index a40615dbfbfd85fc5034fafab9742bbfb08c8569..68a74edd5fd22a8bae0cdf85655459f25a703eb4 100644 (file)
@@ -454,6 +454,10 @@ Common build options
    management operations. This option defaults to 0 and if it is enabled,
    then it implies ``WARMBOOT_ENABLE_DCACHE_EARLY`` is also enabled.
 
+   Note that, when ``HW_ASSISTED_COHERENCY`` is enabled, version 2 of
+   translation library (xlat tables v2) must be used; version 1 of translation
+   library is not supported.
+
 -  ``JUNO_AARCH32_EL3_RUNTIME``: This build flag enables you to execute EL3
    runtime software in AArch32 mode, which is required to run AArch32 on Juno.
    By default this flag is set to '0'. Enabling this flag builds BL1 and BL2 in
index 50d6bd59ca3f57566643d6925c7560e8727e690e..810c48e1a05fb28eb1d3c6b1f414b637b1a02734 100644 (file)
 #include <platform_def.h>
 #include <xlat_tables_arch.h>
 
+#if HW_ASSISTED_COHERENCY
+#error xlat tables v2 must be used with HW_ASSISTED_COHERENCY
+#endif
+
 /*
  * If the platform hasn't defined a physical and a virtual address space size
  * default to ADDR_SPACE_SIZE.
index 409ae55a2ff8bab66a4932b4f6613bfef4400236..5f2972cc49e6e6d3aa5792649dcb301a0158ae65 100644 (file)
@@ -18,8 +18,6 @@
  * provide typical implementations that may be re-used by multiple
  * platforms but may also be overridden by a platform if required.
  */
-#pragma weak bl31_plat_enable_mmu
-#pragma weak bl32_plat_enable_mmu
 #pragma weak bl31_plat_runtime_setup
 #if !ERROR_DEPRECATED
 #pragma weak plat_get_syscnt_freq2
 
 #pragma weak plat_ea_handler
 
-void bl31_plat_enable_mmu(uint32_t flags)
-{
-       enable_mmu_el3(flags);
-}
-
-void bl32_plat_enable_mmu(uint32_t flags)
-{
-       enable_mmu_el1(flags);
-}
-
 void bl31_plat_runtime_setup(void)
 {
 #if MULTI_CONSOLE_API
index 033a12f8e94dccb923cac22191cf178ee07b69e9..a413f5fd1f000479ebe7908bde5c6e3f1be5ad13 100644 (file)
@@ -17,6 +17,8 @@
        .weak   plat_disable_acp
        .weak   bl1_plat_prepare_exit
        .weak   plat_panic_handler
+       .weak   bl31_plat_enable_mmu
+       .weak   bl32_plat_enable_mmu
 
 #if !ENABLE_PLAT_COMPAT
        .globl  platform_get_core_pos
@@ -164,3 +166,23 @@ func plat_panic_handler
        wfi
        b       plat_panic_handler
 endfunc plat_panic_handler
+
+       /* -----------------------------------------------------
+        * void bl31_plat_enable_mmu(uint32_t flags);
+        *
+        * Enable MMU in BL31.
+        * -----------------------------------------------------
+        */
+func bl31_plat_enable_mmu
+       b       enable_mmu_direct_el3
+endfunc bl31_plat_enable_mmu
+
+       /* -----------------------------------------------------
+        * void bl32_plat_enable_mmu(uint32_t flags);
+        *
+        * Enable MMU in BL32.
+        * -----------------------------------------------------
+        */
+func bl32_plat_enable_mmu
+       b       enable_mmu_direct_el1
+endfunc bl32_plat_enable_mmu