1/*
2 * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#ifndef CONSOLE_MACROS_S
7#define CONSOLE_MACROS_S
8
9#include <drivers/console.h>
10
11/*
12 * This macro encapsulates the common setup that has to be done at the end of
13 * a console driver's register function. It will register all of the driver's
14 * callbacks in the console_t structure and initialize the flags field (by
15 * default consoles are enabled for the "boot" and "crash" states, this can be
16 * changed after registration with the console_set_scope() function). It ends
17 * with a tail call that will include return to the caller.
18 * REQUIRES console_t pointer in x0 and a valid return address in x30.
19 */
20	.macro	finish_console_register _driver, putc=0, getc=0, flush=0
21	/*
22	 * If any of the callback is not specified or set as 0, then the
23	 * corresponding callback entry in console_t is set to 0.
24	 */
25	.ifne \putc
26	  adrp	x1, console_\_driver\()_putc
27	  add	x1, x1, :lo12:console_\_driver\()_putc
28	  str	x1, [x0, #CONSOLE_T_PUTC]
29	.else
30	  str	xzr, [x0, #CONSOLE_T_PUTC]
31	.endif
32
33	/*
34	 * If ENABLE_CONSOLE_GETC support is disabled, but a getc callback is
35	 * specified nonetheless, the assembler will abort on encountering the
36	 * CONSOLE_T_GETC macro, which is undefined.
37	 */
38	.ifne \getc
39	  adrp	x1, console_\_driver\()_getc
40	  add	x1, x1, :lo12:console_\_driver\()_getc
41	  str	x1, [x0, #CONSOLE_T_GETC]
42	.else
43#if ENABLE_CONSOLE_GETC
44	  str	xzr, [x0, #CONSOLE_T_GETC]
45#endif
46	.endif
47
48	.ifne \flush
49	  adrp	x1, console_\_driver\()_flush
50	  add	x1, x1, :lo12:console_\_driver\()_flush
51	  str	x1, [x0, #CONSOLE_T_FLUSH]
52	.else
53	  str	xzr, [x0, #CONSOLE_T_FLUSH]
54	.endif
55
56	mov	x1, #(CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH)
57	str	x1, [x0, #CONSOLE_T_FLAGS]
58	b	console_register
59	.endm
60
61#endif /* CONSOLE_MACROS_S */
62