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