blob: 04bfb777189402152fd8e87a90f9786652fd5c9c [file] [log] [blame]
Nariman Poushin0ece80f2018-02-26 06:52:04 +00001/*
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +05302 * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
Nariman Poushin0ece80f2018-02-26 06:52:04 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <platform_def.h>
Chandni Cherukuri82718852018-08-02 12:29:07 +053010#include <cortex_a75.h>
John Tsichritzis56369c12019-02-19 13:49:06 +000011#include <neoverse_n1.h>
Deepak Pandeyb5615362018-10-11 13:44:43 +053012#include <cpu_macros.S>
Nariman Poushin0ece80f2018-02-26 06:52:04 +000013
Nariman Poushin0ece80f2018-02-26 06:52:04 +000014 .globl plat_arm_calc_core_pos
Chandni Cherukuri82718852018-08-02 12:29:07 +053015 .globl plat_reset_handler
Nariman Poushin0ece80f2018-02-26 06:52:04 +000016
17 /* -----------------------------------------------------
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053018 * unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
19 *
20 * Helper function to calculate the core position.
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053021 * (ChipId * PLAT_ARM_CLUSTER_COUNT *
22 * CSS_SGI_MAX_CPUS_PER_CLUSTER * CSS_SGI_MAX_PE_PER_CPU) +
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053023 * (ClusterId * CSS_SGI_MAX_CPUS_PER_CLUSTER * CSS_SGI_MAX_PE_PER_CPU) +
24 * (CPUId * CSS_SGI_MAX_PE_PER_CPU) +
25 * ThreadId
26 *
27 * which can be simplified as:
28 *
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053029 * ((((ChipId * PLAT_ARM_CLUSTER_COUNT) + ClusterId) *
30 * CSS_SGI_MAX_CPUS_PER_CLUSTER) + CPUId) * CSS_SGI_MAX_PE_PER_CPU +
31 * ThreadId
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053032 * ------------------------------------------------------
33 */
34
Nariman Poushin0ece80f2018-02-26 06:52:04 +000035func plat_arm_calc_core_pos
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053036 mov x4, x0
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053037
38 /*
39 * The MT bit in MPIDR is always set for SGI platforms
40 * and the affinity level 0 corresponds to thread affinity level.
41 */
42
43 /* Extract individual affinity fields from MPIDR */
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053044 ubfx x0, x4, #MPIDR_AFF0_SHIFT, #MPIDR_AFFINITY_BITS
45 ubfx x1, x4, #MPIDR_AFF1_SHIFT, #MPIDR_AFFINITY_BITS
46 ubfx x2, x4, #MPIDR_AFF2_SHIFT, #MPIDR_AFFINITY_BITS
47 ubfx x3, x4, #MPIDR_AFF3_SHIFT, #MPIDR_AFFINITY_BITS
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053048
49 /* Compute linear position */
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053050 mov x4, #PLAT_ARM_CLUSTER_COUNT
51 madd x2, x3, x4, x2
Vishwanatha HG64f0b6f2018-05-08 17:15:37 +053052 mov x4, #CSS_SGI_MAX_CPUS_PER_CLUSTER
53 madd x1, x2, x4, x1
Vijayenthiran Subramaniamdde6d3e2019-10-29 15:56:41 +053054 mov x4, #CSS_SGI_MAX_PE_PER_CPU
55 madd x0, x1, x4, x0
Nariman Poushin0ece80f2018-02-26 06:52:04 +000056 ret
57endfunc plat_arm_calc_core_pos
Chandni Cherukuri82718852018-08-02 12:29:07 +053058
Chandni Cherukuri82718852018-08-02 12:29:07 +053059 /* -----------------------------------------------------
60 * void plat_reset_handler(void);
61 *
62 * Determine the CPU MIDR and disable power down bit for
63 * that CPU.
64 * -----------------------------------------------------
65 */
66func plat_reset_handler
67 jump_if_cpu_midr CORTEX_A75_MIDR, A75
John Tsichritzis56369c12019-02-19 13:49:06 +000068 jump_if_cpu_midr NEOVERSE_N1_MIDR, N1
Chandni Cherukuri82718852018-08-02 12:29:07 +053069 ret
70
71 /* -----------------------------------------------------
72 * Disable CPU power down bit in power control register
73 * -----------------------------------------------------
74 */
75A75:
76 mrs x0, CORTEX_A75_CPUPWRCTLR_EL1
77 bic x0, x0, #CORTEX_A75_CORE_PWRDN_EN_MASK
78 msr CORTEX_A75_CPUPWRCTLR_EL1, x0
79 isb
80 ret
Chandni Cherukuri044e27a2018-08-07 14:52:55 +053081
John Tsichritzis56369c12019-02-19 13:49:06 +000082N1:
83 mrs x0, NEOVERSE_N1_CPUPWRCTLR_EL1
84 bic x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
85 msr NEOVERSE_N1_CPUPWRCTLR_EL1, x0
Chandni Cherukuri044e27a2018-08-07 14:52:55 +053086 isb
87 ret
Chandni Cherukuri82718852018-08-02 12:29:07 +053088endfunc plat_reset_handler