• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2015-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 <assert_macros.S>
10#include <platform_def.h>
11
12	.globl	plat_my_core_pos
13	.globl	plat_get_my_entrypoint
14	.globl	platform_mem_init
15	.globl	plat_qemu_calc_core_pos
16	.globl	plat_crash_console_init
17	.globl	plat_crash_console_putc
18	.globl  plat_secondary_cold_boot_setup
19	.globl  plat_get_my_entrypoint
20	.globl  plat_is_my_cpu_primary
21
22
23func plat_my_core_pos
24	mrs	x0, mpidr_el1
25	b	plat_qemu_calc_core_pos
26endfunc plat_my_core_pos
27
28/*
29 *  unsigned int plat_qemu_calc_core_pos(u_register_t mpidr);
30 *  With this function: CorePos = (ClusterId * 4) + CoreId
31 */
32func plat_qemu_calc_core_pos
33	and	x1, x0, #MPIDR_CPU_MASK
34	and	x0, x0, #MPIDR_CLUSTER_MASK
35	add	x0, x1, x0, LSR #6
36	ret
37endfunc plat_qemu_calc_core_pos
38
39	/* -----------------------------------------------------
40	 * unsigned int plat_is_my_cpu_primary (void);
41	 *
42	 * Find out whether the current cpu is the primary
43	 * cpu.
44	 * -----------------------------------------------------
45	 */
46func plat_is_my_cpu_primary
47	mrs	x0, mpidr_el1
48	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
49	cmp	x0, #QEMU_PRIMARY_CPU
50	cset	w0, eq
51	ret
52endfunc plat_is_my_cpu_primary
53
54	/* -----------------------------------------------------
55	 * void plat_secondary_cold_boot_setup (void);
56	 *
57	 * This function performs any platform specific actions
58	 * needed for a secondary cpu after a cold reset e.g
59	 * mark the cpu's presence, mechanism to place it in a
60	 * holding pen etc.
61	 * -----------------------------------------------------
62	 */
63func plat_secondary_cold_boot_setup
64	/* Calculate address of our hold entry */
65	bl	plat_my_core_pos
66	lsl	x0, x0, #PLAT_QEMU_HOLD_ENTRY_SHIFT
67	mov_imm	x2, PLAT_QEMU_HOLD_BASE
68
69	/* Wait until we have a go */
70poll_mailbox:
71	ldr	x1, [x2, x0]
72	cbz	x1, 1f
73	mov_imm	x0, PLAT_QEMU_TRUSTED_MAILBOX_BASE
74	ldr	x1, [x0]
75	br	x1
761:
77	wfe
78	b	poll_mailbox
79endfunc plat_secondary_cold_boot_setup
80
81func plat_get_my_entrypoint
82	/* TODO support warm boot */
83	mov	x0, #0
84	ret
85endfunc plat_get_my_entrypoint
86
87func platform_mem_init
88	ret
89endfunc platform_mem_init
90
91	/* ---------------------------------------------
92	 * int plat_crash_console_init(void)
93	 * Function to initialize the crash console
94	 * without a C Runtime to print crash report.
95	 * Clobber list : x0, x1, x2
96	 * ---------------------------------------------
97	 */
98func plat_crash_console_init
99	mov_imm	x0, PLAT_QEMU_CRASH_UART_BASE
100	mov_imm	x1, PLAT_QEMU_CRASH_UART_CLK_IN_HZ
101	mov_imm	x2, PLAT_QEMU_CONSOLE_BAUDRATE
102	b	console_core_init
103endfunc plat_crash_console_init
104
105	/* ---------------------------------------------
106	 * int plat_crash_console_putc(int c)
107	 * Function to print a character on the crash
108	 * console without a C Runtime.
109	 * Clobber list : x1, x2
110	 * ---------------------------------------------
111	 */
112func plat_crash_console_putc
113	mov_imm	x1, PLAT_QEMU_CRASH_UART_BASE
114	b	console_core_putc
115endfunc plat_crash_console_putc
116
117
118