AArch32: Add SP_MIN support for JUNO
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>
This commit is contained in:
parent
07570d592e
commit
6f249345e2
|
@ -394,6 +394,7 @@
|
|||
#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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
|
@ -103,8 +103,8 @@
|
|||
#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
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue