xref: /aosp_15_r20/external/arm-trusted-firmware/include/drivers/console.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #ifndef CONSOLE_H
8*54fd6939SJiyong Park #define CONSOLE_H
9*54fd6939SJiyong Park 
10*54fd6939SJiyong Park #include <lib/utils_def.h>
11*54fd6939SJiyong Park 
12*54fd6939SJiyong Park #define CONSOLE_T_NEXT			(U(0) * REGSZ)
13*54fd6939SJiyong Park #define CONSOLE_T_FLAGS			(U(1) * REGSZ)
14*54fd6939SJiyong Park #define CONSOLE_T_PUTC			(U(2) * REGSZ)
15*54fd6939SJiyong Park #define CONSOLE_T_GETC			(U(3) * REGSZ)
16*54fd6939SJiyong Park #define CONSOLE_T_FLUSH			(U(4) * REGSZ)
17*54fd6939SJiyong Park #define CONSOLE_T_BASE			(U(5) * REGSZ)
18*54fd6939SJiyong Park #define CONSOLE_T_DRVDATA		(U(6) * REGSZ)
19*54fd6939SJiyong Park 
20*54fd6939SJiyong Park #define CONSOLE_FLAG_BOOT		(U(1) << 0)
21*54fd6939SJiyong Park #define CONSOLE_FLAG_RUNTIME		(U(1) << 1)
22*54fd6939SJiyong Park #define CONSOLE_FLAG_CRASH		(U(1) << 2)
23*54fd6939SJiyong Park /* Bits 3 to 7 reserved for additional scopes in future expansion. */
24*54fd6939SJiyong Park #define CONSOLE_FLAG_SCOPE_MASK		((U(1) << 8) - 1)
25*54fd6939SJiyong Park /* Bits 8 to 31 for non-scope use. */
26*54fd6939SJiyong Park #define CONSOLE_FLAG_TRANSLATE_CRLF	(U(1) << 8)
27*54fd6939SJiyong Park 
28*54fd6939SJiyong Park /* Returned by getc callbacks when receive FIFO is empty. */
29*54fd6939SJiyong Park #define ERROR_NO_PENDING_CHAR		(-1)
30*54fd6939SJiyong Park /* Returned by console_xxx() if no registered console implements xxx. */
31*54fd6939SJiyong Park #define ERROR_NO_VALID_CONSOLE		(-128)
32*54fd6939SJiyong Park 
33*54fd6939SJiyong Park #ifndef __ASSEMBLER__
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park #include <stdint.h>
36*54fd6939SJiyong Park 
37*54fd6939SJiyong Park typedef struct console {
38*54fd6939SJiyong Park 	struct console *next;
39*54fd6939SJiyong Park 	/*
40*54fd6939SJiyong Park 	 * Only the low 32 bits are used. The type is u_register_t to align the
41*54fd6939SJiyong Park 	 * fields of the struct to 64 bits in AArch64 and 32 bits in AArch32
42*54fd6939SJiyong Park 	 */
43*54fd6939SJiyong Park 	u_register_t flags;
44*54fd6939SJiyong Park 	int (*const putc)(int character, struct console *console);
45*54fd6939SJiyong Park 	int (*const getc)(struct console *console);
46*54fd6939SJiyong Park 	void (*const flush)(struct console *console);
47*54fd6939SJiyong Park 	uintptr_t base;
48*54fd6939SJiyong Park 	/* Additional private driver data may follow here. */
49*54fd6939SJiyong Park } console_t;
50*54fd6939SJiyong Park 
51*54fd6939SJiyong Park /* offset macro assertions for console_t */
52*54fd6939SJiyong Park #include <drivers/console_assertions.h>
53*54fd6939SJiyong Park 
54*54fd6939SJiyong Park /*
55*54fd6939SJiyong Park  * Add a console_t instance to the console list. This should only be called by
56*54fd6939SJiyong Park  * console drivers after they have initialized all fields in the console
57*54fd6939SJiyong Park  * structure. Platforms seeking to register a new console need to call the
58*54fd6939SJiyong Park  * respective console__register() function instead.
59*54fd6939SJiyong Park  */
60*54fd6939SJiyong Park int console_register(console_t *console);
61*54fd6939SJiyong Park /* Remove a single console_t instance from the console list. Return a pointer to
62*54fd6939SJiyong Park  * the console that was removed if it was found, or NULL if not. */
63*54fd6939SJiyong Park console_t *console_unregister(console_t *console);
64*54fd6939SJiyong Park /* Returns 1 if this console is already registered, 0 if not */
65*54fd6939SJiyong Park int console_is_registered(console_t *console);
66*54fd6939SJiyong Park /*
67*54fd6939SJiyong Park  * Set scope mask of a console that determines in what states it is active.
68*54fd6939SJiyong Park  * By default they are registered with (CONSOLE_FLAG_BOOT|CONSOLE_FLAG_CRASH).
69*54fd6939SJiyong Park  */
70*54fd6939SJiyong Park void console_set_scope(console_t *console, unsigned int scope);
71*54fd6939SJiyong Park 
72*54fd6939SJiyong Park /* Switch to a new global console state (CONSOLE_FLAG_BOOT/RUNTIME/CRASH). */
73*54fd6939SJiyong Park void console_switch_state(unsigned int new_state);
74*54fd6939SJiyong Park /* Output a character on all consoles registered for the current state. */
75*54fd6939SJiyong Park int console_putc(int c);
76*54fd6939SJiyong Park /* Read a character (blocking) from any console registered for current state. */
77*54fd6939SJiyong Park int console_getc(void);
78*54fd6939SJiyong Park /* Flush all consoles registered for the current state. */
79*54fd6939SJiyong Park void console_flush(void);
80*54fd6939SJiyong Park 
81*54fd6939SJiyong Park #endif /* __ASSEMBLER__ */
82*54fd6939SJiyong Park 
83*54fd6939SJiyong Park #endif /* CONSOLE_H */
84