Home | History | Annotate | Download | only in aarch32
      1 /*
      2  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #include <arch.h>
      8 #include <asm_macros.S>
      9 #include <bl_common.h>
     10 #include <cortex_a53.h>
     11 #include <cortex_a57.h>
     12 #include <cortex_a72.h>
     13 #include <v2m_def.h>
     14 #include "../juno_def.h"
     15 
     16 
     17 	.globl	plat_reset_handler
     18 	.globl	plat_arm_calc_core_pos
     19 
     20 #define JUNO_REVISION(rev)	REV_JUNO_R##rev
     21 #define JUNO_HANDLER(rev)	plat_reset_handler_juno_r##rev
     22 #define JUMP_TO_HANDLER_IF_JUNO_R(revision)	\
     23 	jump_to_handler JUNO_REVISION(revision), JUNO_HANDLER(revision)
     24 
     25 	/* --------------------------------------------------------------------
     26 	 * Helper macro to jump to the given handler if the board revision
     27 	 * matches.
     28 	 * Expects the Juno board revision in x0.
     29 	 * --------------------------------------------------------------------
     30 	 */
     31 	.macro jump_to_handler _revision, _handler
     32 	cmp	r0, #\_revision
     33 	beq	\_handler
     34 	.endm
     35 
     36 	/* --------------------------------------------------------------------
     37 	 * Helper macro that reads the part number of the current CPU and jumps
     38 	 * to the given label if it matches the CPU MIDR provided.
     39 	 *
     40 	 * Clobbers r0.
     41 	 * --------------------------------------------------------------------
     42 	 */
     43 	.macro  jump_if_cpu_midr _cpu_midr, _label
     44 	ldcopr	r0, MIDR
     45 	ubfx	r0, r0, #MIDR_PN_SHIFT, #12
     46 	ldr	r1, =((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
     47 	cmp	r0, r1
     48 	beq	\_label
     49 	.endm
     50 
     51 	/* --------------------------------------------------------------------
     52 	 * Platform reset handler for Juno R0.
     53 	 *
     54 	 * Juno R0 has the following topology:
     55 	 * - Quad core Cortex-A53 processor cluster;
     56 	 * - Dual core Cortex-A57 processor cluster.
     57 	 *
     58 	 * This handler does the following:
     59 	 * - Implement workaround for defect id 831273 by enabling an event
     60 	 *   stream every 65536 cycles.
     61 	 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
     62 	 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
     63 	 * --------------------------------------------------------------------
     64 	 */
     65 func JUNO_HANDLER(0)
     66 	/* --------------------------------------------------------------------
     67 	 * Enable the event stream every 65536 cycles
     68 	 * --------------------------------------------------------------------
     69 	 */
     70 	mov	r0, #(0xf << EVNTI_SHIFT)
     71 	orr	r0, r0, #EVNTEN_BIT
     72 	stcopr	r0, CNTKCTL
     73 
     74 	/* --------------------------------------------------------------------
     75 	 * Nothing else to do on Cortex-A53.
     76 	 * --------------------------------------------------------------------
     77 	 */
     78 	jump_if_cpu_midr CORTEX_A53_MIDR, 1f
     79 
     80 	/* --------------------------------------------------------------------
     81 	 * Cortex-A57 specific settings
     82 	 * --------------------------------------------------------------------
     83 	 */
     84 	mov	r0, #((CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT) |	\
     85 		      (CORTEX_A57_L2_TAG_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_TAG_RAM_LATENCY_SHIFT))
     86 	stcopr	r0, CORTEX_A57_L2CTLR
     87 1:
     88 	isb
     89 	bx	lr
     90 endfunc JUNO_HANDLER(0)
     91 
     92 	/* --------------------------------------------------------------------
     93 	 * Platform reset handler for Juno R1.
     94 	 *
     95 	 * Juno R1 has the following topology:
     96 	 * - Quad core Cortex-A53 processor cluster;
     97 	 * - Dual core Cortex-A57 processor cluster.
     98 	 *
     99 	 * This handler does the following:
    100 	 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
    101 	 *
    102 	 * Note that:
    103 	 * - The default value for the L2 Tag RAM latency for Cortex-A57 is
    104 	 *   suitable.
    105 	 * - Defect #831273 doesn't affect Juno R1.
    106 	 * --------------------------------------------------------------------
    107 	 */
    108 func JUNO_HANDLER(1)
    109 	/* --------------------------------------------------------------------
    110 	 * Nothing to do on Cortex-A53.
    111 	 * --------------------------------------------------------------------
    112 	 */
    113 	jump_if_cpu_midr CORTEX_A57_MIDR, A57
    114 	bx	lr
    115 
    116 A57:
    117 	/* --------------------------------------------------------------------
    118 	 * Cortex-A57 specific settings
    119 	 * --------------------------------------------------------------------
    120 	 */
    121 	mov	r0, #(CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT)
    122 	stcopr	r0, CORTEX_A57_L2CTLR
    123 	isb
    124 	bx	lr
    125 endfunc JUNO_HANDLER(1)
    126 
    127 	/* --------------------------------------------------------------------
    128 	 * Platform reset handler for Juno R2.
    129 	 *
    130 	 * Juno R2 has the following topology:
    131 	 * - Quad core Cortex-A53 processor cluster;
    132 	 * - Dual core Cortex-A72 processor cluster.
    133 	 *
    134 	 * This handler does the following:
    135 	 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72
    136 	 * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72
    137 	 *
    138 	 * Note that:
    139 	 * - Defect #831273 doesn't affect Juno R2.
    140 	 * --------------------------------------------------------------------
    141 	 */
    142 func JUNO_HANDLER(2)
    143 	/* --------------------------------------------------------------------
    144 	 * Nothing to do on Cortex-A53.
    145 	 * --------------------------------------------------------------------
    146 	 */
    147 	jump_if_cpu_midr CORTEX_A72_MIDR, A72
    148 	bx	lr
    149 
    150 A72:
    151 	/* --------------------------------------------------------------------
    152 	 * Cortex-A72 specific settings
    153 	 * --------------------------------------------------------------------
    154 	 */
    155 	mov	r0, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) |	\
    156 		      (CORTEX_A72_L2_TAG_RAM_LATENCY_2_CYCLES << CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT))
    157 	stcopr	r0, CORTEX_A72_L2CTLR
    158 	isb
    159 	bx	lr
    160 endfunc JUNO_HANDLER(2)
    161 
    162 	/* --------------------------------------------------------------------
    163 	 * void plat_reset_handler(void);
    164 	 *
    165 	 * Determine the Juno board revision and call the appropriate reset
    166 	 * handler.
    167 	 * --------------------------------------------------------------------
    168 	 */
    169 func plat_reset_handler
    170 	/* Read the V2M SYS_ID register */
    171 	ldr	r0, =(V2M_SYSREGS_BASE + V2M_SYS_ID)
    172 	ldr	r1, [r0]
    173 	/* Extract board revision from the SYS_ID */
    174 	ubfx	r0, r1, #V2M_SYS_ID_REV_SHIFT, #4
    175 
    176 	JUMP_TO_HANDLER_IF_JUNO_R(0)
    177 	JUMP_TO_HANDLER_IF_JUNO_R(1)
    178 	JUMP_TO_HANDLER_IF_JUNO_R(2)
    179 
    180 	/* Board revision is not supported */
    181 	no_ret	plat_panic_handler
    182 
    183 endfunc plat_reset_handler
    184 
    185 	/* -----------------------------------------------------
    186 	 *  unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
    187 	 *  Helper function to calculate the core position.
    188 	 * -----------------------------------------------------
    189 	 */
    190 func plat_arm_calc_core_pos
    191 	b	css_calc_core_pos_swap_cluster
    192 endfunc plat_arm_calc_core_pos
    193