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