1/*
2 * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <asm_macros.S>
8#include <lib/el3_runtime/cpu_data.h>
9
10.globl	init_cpu_data_ptr
11.globl	_cpu_data_by_index
12
13/* -----------------------------------------------------------------
14 * void init_cpu_data_ptr(void)
15 *
16 * Initialise the TPIDR_EL3 register to refer to the cpu_data_t
17 * for the calling CPU. This must be called before cm_get_cpu_data()
18 *
19 * This can be called without a valid stack. It assumes that
20 * plat_my_core_pos() does not clobber register x10.
21 * clobbers: x0, x1, x10
22 * -----------------------------------------------------------------
23 */
24func init_cpu_data_ptr
25	mov	x10, x30
26	bl	plat_my_core_pos
27	bl	_cpu_data_by_index
28	msr	tpidr_el3, x0
29	ret	x10
30endfunc init_cpu_data_ptr
31
32/* -----------------------------------------------------------------
33 * cpu_data_t *_cpu_data_by_index(uint32_t cpu_index)
34 *
35 * Return the cpu_data structure for the CPU with given linear index
36 *
37 * This can be called without a valid stack.
38 * clobbers: x0, x1
39 * -----------------------------------------------------------------
40 */
41func _cpu_data_by_index
42	mov_imm	x1, CPU_DATA_SIZE
43	mul	x0, x0, x1
44	adrp	x1, percpu_data
45	add	x1, x1, :lo12:percpu_data
46	add	x0, x0, x1
47	ret
48endfunc _cpu_data_by_index
49