123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /*
- * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <arch.h>
- #include <asm_macros.S>
- #include <common/bl_common.h>
- #include <cortex_a53.h>
- #include <cortex_a57.h>
- #include <cortex_a72.h>
- #include <cpu_macros.S>
- #include <platform_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
- /* --------------------------------------------------------------------
- * 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, #((CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
- (CORTEX_A57_L2_TAG_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_TAG_RAM_LATENCY_SHIFT))
- stcopr r0, CORTEX_A57_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, #(CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT)
- stcopr r0, CORTEX_A57_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, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
- (CORTEX_A72_L2_TAG_RAM_LATENCY_2_CYCLES << CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT))
- stcopr r0, CORTEX_A72_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
|