xref: /rk3399_ARM-atf/plat/socionext/synquacer/sq_helpers.S (revision 831b0e9824e6c7cb07308830c12977acb79156c7)
185427debSSumit Garg/*
2*831b0e98SJimmy Brisson * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
385427debSSumit Garg *
485427debSSumit Garg * SPDX-License-Identifier: BSD-3-Clause
585427debSSumit Garg */
685427debSSumit Garg
785427debSSumit Garg#include <arch.h>
885427debSSumit Garg#include <asm_macros.S>
985427debSSumit Garg#include <assert_macros.S>
1085427debSSumit Garg#include <platform_def.h>
1185427debSSumit Garg
1285427debSSumit Garg	.global	sq_calc_core_pos
1385427debSSumit Garg	.global	plat_my_core_pos
1485427debSSumit Garg	.global	platform_mem_init
1585427debSSumit Garg	.global	plat_is_my_cpu_primary
1685427debSSumit Garg	.global plat_secondary_cold_boot_setup
1767b40070SSumit Garg	.global	plat_crash_console_init
1867b40070SSumit Garg	.global	plat_crash_console_putc
1967b40070SSumit Garg	.global	plat_crash_console_flush
2085427debSSumit Garg
2185427debSSumit Garg/*
2285427debSSumit Garg * unsigned int sq_calc_core_pos(u_register_t mpidr)
2385427debSSumit Garg * core_pos = (cluster_id * max_cpus_per_cluster) + core_id
2485427debSSumit Garg */
2585427debSSumit Gargfunc sq_calc_core_pos
2685427debSSumit Garg	and	x1, x0, #MPIDR_CPU_MASK
2785427debSSumit Garg	and	x0, x0, #MPIDR_CLUSTER_MASK
2885427debSSumit Garg	add	x0, x1, x0, lsr #7
2985427debSSumit Garg	ret
3085427debSSumit Gargendfunc sq_calc_core_pos
3185427debSSumit Garg
3285427debSSumit Gargfunc plat_my_core_pos
3385427debSSumit Garg	mrs	x0, mpidr_el1
3485427debSSumit Garg	b	sq_calc_core_pos
3585427debSSumit Gargendfunc plat_my_core_pos
3685427debSSumit Garg
3785427debSSumit Gargfunc platform_mem_init
3885427debSSumit Garg	ret
3985427debSSumit Gargendfunc platform_mem_init
4085427debSSumit Garg
4185427debSSumit Garg/*
4285427debSSumit Garg * Secondary CPUs are placed in a holding pen, waiting for their mailbox
4385427debSSumit Garg * to be populated. Note that all CPUs share the same mailbox ; therefore,
4485427debSSumit Garg * populating it will release all CPUs from their holding pen. If
4585427debSSumit Garg * finer-grained control is needed then this should be handled in the
4685427debSSumit Garg * code that secondary CPUs jump to.
4785427debSSumit Garg */
4885427debSSumit Gargfunc plat_secondary_cold_boot_setup
4985427debSSumit Garg	ldr	x0, sq_sec_entrypoint
5085427debSSumit Garg
5185427debSSumit Garg	/* Wait until the mailbox gets populated */
5285427debSSumit Gargpoll_mailbox:
5385427debSSumit Garg	cbz	x0, 1f
5485427debSSumit Garg	br	x0
5585427debSSumit Garg1:
5685427debSSumit Garg	wfe
5785427debSSumit Garg	b	poll_mailbox
5885427debSSumit Gargendfunc plat_secondary_cold_boot_setup
5985427debSSumit Garg
6085427debSSumit Garg/*
6185427debSSumit Garg * Find out whether the current cpu is the primary
6285427debSSumit Garg * cpu (applicable only after a cold boot)
6385427debSSumit Garg */
6485427debSSumit Gargfunc plat_is_my_cpu_primary
6585427debSSumit Garg	mov	x9, x30
6685427debSSumit Garg	bl	plat_my_core_pos
6785427debSSumit Garg	ldr	x1, =SQ_BOOT_CFG_ADDR
6885427debSSumit Garg	ldr	x1, [x1]
6985427debSSumit Garg	ubfx	x1, x1, #PLAT_SQ_PRIMARY_CPU_SHIFT, \
7085427debSSumit Garg			#PLAT_SQ_PRIMARY_CPU_BIT_WIDTH
7185427debSSumit Garg	cmp	x0, x1
7285427debSSumit Garg	cset	w0, eq
7385427debSSumit Garg	ret	x9
7485427debSSumit Gargendfunc plat_is_my_cpu_primary
7567b40070SSumit Garg
7667b40070SSumit Garg/*
7767b40070SSumit Garg * int plat_crash_console_init(void)
7867b40070SSumit Garg * Function to initialize the crash console
7967b40070SSumit Garg * without a C Runtime to print crash report.
8067b40070SSumit Garg * Clobber list : x0, x1, x2
8167b40070SSumit Garg */
8267b40070SSumit Gargfunc plat_crash_console_init
8367b40070SSumit Garg	mov_imm x0, PLAT_SQ_BOOT_UART_BASE
8467b40070SSumit Garg	mov_imm x1, PLAT_SQ_BOOT_UART_CLK_IN_HZ
8567b40070SSumit Garg	mov_imm x2, SQ_CONSOLE_BAUDRATE
8667b40070SSumit Garg	b	console_pl011_core_init
8767b40070SSumit Gargendfunc plat_crash_console_init
8867b40070SSumit Garg
8967b40070SSumit Garg/*
9067b40070SSumit Garg * int plat_crash_console_putc(int c)
9167b40070SSumit Garg * Function to print a character on the crash
9267b40070SSumit Garg * console without a C Runtime.
9367b40070SSumit Garg * Clobber list : x1, x2
9467b40070SSumit Garg */
9567b40070SSumit Gargfunc plat_crash_console_putc
9667b40070SSumit Garg	mov_imm	x1, PLAT_SQ_BOOT_UART_BASE
9767b40070SSumit Garg	b	console_pl011_core_putc
9867b40070SSumit Gargendfunc plat_crash_console_putc
9967b40070SSumit Garg
10067b40070SSumit Garg/*
101*831b0e98SJimmy Brisson * void plat_crash_console_flush(int c)
10267b40070SSumit Garg * Function to force a write of all buffered
10367b40070SSumit Garg * data that hasn't been output.
104*831b0e98SJimmy Brisson * Out : void.
10567b40070SSumit Garg * Clobber list : x0, x1
10667b40070SSumit Garg */
10767b40070SSumit Gargfunc plat_crash_console_flush
10867b40070SSumit Garg	mov_imm	x0, PLAT_SQ_BOOT_UART_BASE
10967b40070SSumit Garg	b	console_pl011_core_flush
11067b40070SSumit Gargendfunc plat_crash_console_flush
111