AArch32: Add SP_MIN support for JUNO
authorYatharth Kochar <yatharth.kochar@arm.com>
Mon, 14 Nov 2016 12:00:41 +0000 (12:00 +0000)
committerdp-arm <dimitris.papastamos@arm.com>
Thu, 20 Apr 2017 14:05:21 +0000 (15:05 +0100)
This patch adds support for SP_MIN on JUNO platform.
The changes include addition of AArch32 assembly files,
JUNO specific SP_MIN make file and miscellaneous changes
in ARM platform files to enable support for SP_MIN.

Change-Id: Id1303f422fc9b98b9362c757b1a4225a16fffc0b
Signed-off-by: Yatharth Kochar <yatharth.kochar@arm.com>
Signed-off-by: dp-arm <dimitris.papastamos@arm.com>
include/lib/aarch32/arch.h
include/lib/aarch32/arch_helpers.h
include/plat/arm/common/plat_arm.h
plat/arm/board/common/board_css_common.c
plat/arm/board/juno/aarch32/juno_helpers.S [new file with mode: 0644]
plat/arm/board/juno/include/platform_def.h
plat/arm/board/juno/sp_min/sp_min-juno.mk [new file with mode: 0644]
plat/arm/css/common/aarch32/css_helpers.S [new file with mode: 0644]
plat/arm/css/common/css_common.mk

index fec9829573a37f392f3d824be4792af318b4cd5f..3c69f9823abbe136ba42dc473de95ddb139c9746 100644 (file)
 #define HCR            p15, 4, c1, c1, 0
 #define HCPTR          p15, 4, c1, c1, 2
 #define CNTHCTL                p15, 4, c14, c1, 0
+#define CNTKCTL                p15, 0, c14, c1, 0
 #define VPIDR          p15, 4, c0, c0, 0
 #define VMPIDR         p15, 4, c0, c0, 5
 #define ISR            p15, 0, c12, c1, 0
index a7d33d86adbceec21df0dd1558c01f6eb753fb6f..472a8859afacf96b16ec2ac7b42d5dac88467817 100644 (file)
@@ -209,6 +209,8 @@ DEFINE_SYSOP_FUNC(wfe)
 DEFINE_SYSOP_FUNC(sev)
 DEFINE_SYSOP_TYPE_FUNC(dsb, sy)
 DEFINE_SYSOP_TYPE_FUNC(dmb, sy)
+DEFINE_SYSOP_TYPE_FUNC(dmb, st)
+DEFINE_SYSOP_TYPE_FUNC(dmb, ld)
 DEFINE_SYSOP_TYPE_FUNC(dsb, ish)
 DEFINE_SYSOP_TYPE_FUNC(dsb, ishst)
 DEFINE_SYSOP_TYPE_FUNC(dmb, ish)
index d68a3e3bd79775061b9c5be5b8ecab77b4951019..5430da0fc1e136a50e4fb75eafaf10a080d417cf 100644 (file)
@@ -81,7 +81,7 @@ void arm_setup_page_tables(uintptr_t total_base,
 #else
 
 /*
- * Empty macros for all other BL stages other than BL31
+ * Empty macros for all other BL stages other than BL31 and BL32
  */
 #define ARM_INSTANTIATE_LOCK
 #define arm_lock_init()
index 3fcc6ee02ccf07b6426e7cd24a69a5727d30b39f..6593d2a0c456a7cb6c39ffc0f8738ba10915d5f6 100644 (file)
@@ -79,6 +79,9 @@ const mmap_region_t plat_arm_mmap[] = {
 #endif
 #ifdef IMAGE_BL32
 const mmap_region_t plat_arm_mmap[] = {
+#ifdef AARCH32
+       ARM_MAP_SHARED_RAM,
+#endif
        V2M_MAP_IOFPGA,
        CSS_MAP_DEVICE,
        SOC_CSS_MAP_DEVICE,
diff --git a/plat/arm/board/juno/aarch32/juno_helpers.S b/plat/arm/board/juno/aarch32/juno_helpers.S
new file mode 100644 (file)
index 0000000..86eeb2c
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <bl_common.h>
+#include <cortex_a53.h>
+#include <cortex_a57.h>
+#include <cortex_a72.h>
+#include <v2m_def.h>
+#include "../juno_def.h"
+
+
+       .globl  plat_reset_handler
+       .globl  plat_arm_calc_core_pos
+
+#define JUNO_REVISION(rev)     REV_JUNO_R##rev
+#define JUNO_HANDLER(rev)      plat_reset_handler_juno_r##rev
+#define JUMP_TO_HANDLER_IF_JUNO_R(revision)    \
+       jump_to_handler JUNO_REVISION(revision), JUNO_HANDLER(revision)
+
+       /* --------------------------------------------------------------------
+        * Helper macro to jump to the given handler if the board revision
+        * matches.
+        * Expects the Juno board revision in x0.
+        * --------------------------------------------------------------------
+        */
+       .macro jump_to_handler _revision, _handler
+       cmp     r0, #\_revision
+       beq     \_handler
+       .endm
+
+       /* --------------------------------------------------------------------
+        * Helper macro that reads the part number of the current CPU and jumps
+        * to the given label if it matches the CPU MIDR provided.
+        *
+        * Clobbers r0.
+        * --------------------------------------------------------------------
+        */
+       .macro  jump_if_cpu_midr _cpu_midr, _label
+       ldcopr  r0, MIDR
+       ubfx    r0, r0, #MIDR_PN_SHIFT, #12
+       ldr     r1, =((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
+       cmp     r0, r1
+       beq     \_label
+       .endm
+
+       /* --------------------------------------------------------------------
+        * Platform reset handler for Juno R0.
+        *
+        * Juno R0 has the following topology:
+        * - Quad core Cortex-A53 processor cluster;
+        * - Dual core Cortex-A57 processor cluster.
+        *
+        * This handler does the following:
+        * - Implement workaround for defect id 831273 by enabling an event
+        *   stream every 65536 cycles.
+        * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
+        * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
+        * --------------------------------------------------------------------
+        */
+func JUNO_HANDLER(0)
+       /* --------------------------------------------------------------------
+        * Enable the event stream every 65536 cycles
+        * --------------------------------------------------------------------
+        */
+       mov     r0, #(0xf << EVNTI_SHIFT)
+       orr     r0, r0, #EVNTEN_BIT
+       stcopr  r0, CNTKCTL
+
+       /* --------------------------------------------------------------------
+        * Nothing else to do on Cortex-A53.
+        * --------------------------------------------------------------------
+        */
+       jump_if_cpu_midr CORTEX_A53_MIDR, 1f
+
+       /* --------------------------------------------------------------------
+        * Cortex-A57 specific settings
+        * --------------------------------------------------------------------
+        */
+       mov     r0, #((L2_DATA_RAM_LATENCY_3_CYCLES << L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
+                     (L2_TAG_RAM_LATENCY_3_CYCLES << L2CTLR_TAG_RAM_LATENCY_SHIFT))
+       stcopr  r0, L2CTLR
+1:
+       isb
+       bx      lr
+endfunc JUNO_HANDLER(0)
+
+       /* --------------------------------------------------------------------
+        * Platform reset handler for Juno R1.
+        *
+        * Juno R1 has the following topology:
+        * - Quad core Cortex-A53 processor cluster;
+        * - Dual core Cortex-A57 processor cluster.
+        *
+        * This handler does the following:
+        * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
+        *
+        * Note that:
+        * - The default value for the L2 Tag RAM latency for Cortex-A57 is
+        *   suitable.
+        * - Defect #831273 doesn't affect Juno R1.
+        * --------------------------------------------------------------------
+        */
+func JUNO_HANDLER(1)
+       /* --------------------------------------------------------------------
+        * Nothing to do on Cortex-A53.
+        * --------------------------------------------------------------------
+        */
+       jump_if_cpu_midr CORTEX_A57_MIDR, A57
+       bx      lr
+
+A57:
+       /* --------------------------------------------------------------------
+        * Cortex-A57 specific settings
+        * --------------------------------------------------------------------
+        */
+       mov     r0, #(L2_DATA_RAM_LATENCY_3_CYCLES << L2CTLR_DATA_RAM_LATENCY_SHIFT)
+       stcopr  r0, L2CTLR
+       isb
+       bx      lr
+endfunc JUNO_HANDLER(1)
+
+       /* --------------------------------------------------------------------
+        * Platform reset handler for Juno R2.
+        *
+        * Juno R2 has the following topology:
+        * - Quad core Cortex-A53 processor cluster;
+        * - Dual core Cortex-A72 processor cluster.
+        *
+        * This handler does the following:
+        * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72
+        * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72
+        *
+        * Note that:
+        * - Defect #831273 doesn't affect Juno R2.
+        * --------------------------------------------------------------------
+        */
+func JUNO_HANDLER(2)
+       /* --------------------------------------------------------------------
+        * Nothing to do on Cortex-A53.
+        * --------------------------------------------------------------------
+        */
+       jump_if_cpu_midr CORTEX_A72_MIDR, A72
+       bx      lr
+
+A72:
+       /* --------------------------------------------------------------------
+        * Cortex-A72 specific settings
+        * --------------------------------------------------------------------
+        */
+       mov     r0, #((L2_DATA_RAM_LATENCY_3_CYCLES << L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
+                     (L2_TAG_RAM_LATENCY_2_CYCLES << L2CTLR_TAG_RAM_LATENCY_SHIFT))
+       stcopr  r0, L2CTLR
+       isb
+       bx      lr
+endfunc JUNO_HANDLER(2)
+
+       /* --------------------------------------------------------------------
+        * void plat_reset_handler(void);
+        *
+        * Determine the Juno board revision and call the appropriate reset
+        * handler.
+        * --------------------------------------------------------------------
+        */
+func plat_reset_handler
+       /* Read the V2M SYS_ID register */
+       ldr     r0, =(V2M_SYSREGS_BASE + V2M_SYS_ID)
+       ldr     r1, [r0]
+       /* Extract board revision from the SYS_ID */
+       ubfx    r0, r1, #V2M_SYS_ID_REV_SHIFT, #4
+
+       JUMP_TO_HANDLER_IF_JUNO_R(0)
+       JUMP_TO_HANDLER_IF_JUNO_R(1)
+       JUMP_TO_HANDLER_IF_JUNO_R(2)
+
+       /* Board revision is not supported */
+       no_ret  plat_panic_handler
+
+endfunc plat_reset_handler
+
+       /* -----------------------------------------------------
+        *  unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
+        *  Helper function to calculate the core position.
+        * -----------------------------------------------------
+        */
+func plat_arm_calc_core_pos
+       b       css_calc_core_pos_swap_cluster
+endfunc plat_arm_calc_core_pos
index f89f7b4634b45dd56dc5bc56db03deaafca46425..4da8ab06de0863cbda4d7dca10dd845442cb6fe8 100644 (file)
 #endif
 
 #ifdef IMAGE_BL32
-# define PLAT_ARM_MMAP_ENTRIES         4
-# define MAX_XLAT_TABLES               3
+# define PLAT_ARM_MMAP_ENTRIES         5
+# define MAX_XLAT_TABLES               4
 #endif
 
 /*
diff --git a/plat/arm/board/juno/sp_min/sp_min-juno.mk b/plat/arm/board/juno/sp_min/sp_min-juno.mk
new file mode 100644 (file)
index 0000000..fb3c55e
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# Neither the name of ARM nor the names of its contributors may be used
+# to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+# SP_MIN source files specific to JUNO platform
+BL32_SOURCES   +=      lib/cpus/aarch32/cortex_a53.S           \
+                       lib/cpus/aarch32/cortex_a57.S           \
+                       lib/cpus/aarch32/cortex_a72.S           \
+                       plat/arm/board/juno/juno_pm.c           \
+                       plat/arm/board/juno/juno_topology.c     \
+                       plat/arm/css/common/css_pm.c            \
+                       plat/arm/css/common/css_topology.c      \
+                       plat/arm/soc/common/soc_css_security.c  \
+                       plat/arm/css/drivers/scp/css_pm_scpi.c  \
+                       plat/arm/css/drivers/scpi/css_mhu.c     \
+                       plat/arm/css/drivers/scpi/css_scpi.c    \
+                       ${JUNO_GIC_SOURCES}                     \
+                       ${JUNO_INTERCONNECT_SOURCES}            \
+                       ${JUNO_SECURITY_SOURCES}
+
+include plat/arm/common/sp_min/arm_sp_min.mk
diff --git a/plat/arm/css/common/aarch32/css_helpers.S b/plat/arm/css/common/aarch32/css_helpers.S
new file mode 100644 (file)
index 0000000..b7075bd
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of ARM nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <arch.h>
+#include <asm_macros.S>
+#include <cpu_macros.S>
+#include <css_def.h>
+
+       .weak   plat_secondary_cold_boot_setup
+       .weak   plat_get_my_entrypoint
+       .globl  css_calc_core_pos_swap_cluster
+       .weak   plat_is_my_cpu_primary
+
+       /* ---------------------------------------------------------------------
+        * void plat_secondary_cold_boot_setup(void);
+        * In the normal boot flow, cold-booting secondary
+        * CPUs is not yet implemented and they panic.
+        * ---------------------------------------------------------------------
+        */
+func plat_secondary_cold_boot_setup
+       /* TODO: Implement secondary CPU cold boot setup on CSS platforms */
+cb_panic:
+       b       cb_panic
+endfunc plat_secondary_cold_boot_setup
+
+       /* ---------------------------------------------------------------------
+        * uintptr_t plat_get_my_entrypoint (void);
+        *
+        * Main job of this routine is to distinguish between a cold and a warm
+        * boot. On CSS platforms, this distinction is based on the contents of
+        * the Trusted Mailbox. It is initialised to zero by the SCP before the
+        * AP cores are released from reset. Therefore, a zero mailbox means
+        * it's a cold reset.
+        *
+        * This functions returns the contents of the mailbox, i.e.:
+        *  - 0 for a cold boot;
+        *  - the warm boot entrypoint for a warm boot.
+        * ---------------------------------------------------------------------
+        */
+func plat_get_my_entrypoint
+       ldr     r0, =PLAT_ARM_TRUSTED_MAILBOX_BASE
+       ldr     r0, [r0]
+       bx      lr
+endfunc plat_get_my_entrypoint
+
+       /* -----------------------------------------------------------
+        * unsigned int css_calc_core_pos_swap_cluster(u_register_t mpidr)
+        * Utility function to calculate the core position by
+        * swapping the cluster order. This is necessary in order to
+        * match the format of the boot information passed by the SCP
+        * and read in plat_is_my_cpu_primary below.
+        * -----------------------------------------------------------
+        */
+func css_calc_core_pos_swap_cluster
+       and     r1, r0, #MPIDR_CPU_MASK
+       and     r0, r0, #MPIDR_CLUSTER_MASK
+       eor     r0, r0, #(1 << MPIDR_AFFINITY_BITS)  // swap cluster order
+       add     r0, r1, r0, LSR #6
+       bx      lr
+endfunc css_calc_core_pos_swap_cluster
+
+       /* -----------------------------------------------------
+        * unsigned int plat_is_my_cpu_primary (void);
+        *
+        * Find out whether the current cpu is the primary
+        * cpu (applicable ony after a cold boot)
+        * -----------------------------------------------------
+        */
+func plat_is_my_cpu_primary
+       mov     r10, lr
+       bl      plat_my_core_pos
+       ldr     r1, =SCP_BOOT_CFG_ADDR
+       ldr     r1, [r1]
+       ubfx    r1, r1, #PLAT_CSS_PRIMARY_CPU_SHIFT, \
+                       #PLAT_CSS_PRIMARY_CPU_BIT_WIDTH
+       cmp     r0, r1
+       moveq   r0, #1
+       movne   r0, #0
+       bx      r10
+endfunc plat_is_my_cpu_primary
index 7829e8b25d003582d7dddcfb37fface7e5769b56..24215a5d1151e6a369e5844ffe29c610d4a9c078 100644 (file)
@@ -36,7 +36,7 @@ PLAT_INCLUDES         +=      -Iinclude/plat/arm/css/common                   \
                                -Iinclude/plat/arm/css/common/aarch64
 
 
-PLAT_BL_COMMON_SOURCES +=      plat/arm/css/common/aarch64/css_helpers.S
+PLAT_BL_COMMON_SOURCES +=      plat/arm/css/common/${ARCH}/css_helpers.S
 
 BL1_SOURCES            +=      plat/arm/css/common/css_bl1_setup.c