mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00

This patch overhauls the console API to allow for multiple console instances of different drivers that are active at the same time. Instead of binding to well-known function names (like console_core_init), consoles now provide a register function (e.g. console_16550_register()) that will hook them into the list of active consoles. All console operations will be dispatched to all consoles currently in the list. The new API will be selected by the build-time option MULTI_CONSOLE_API, which defaults to ${ERROR_DEPRECATED} for now. The old console API code will be retained to stay backwards-compatible to older platforms, but should no longer be used for any newly added platforms and can hopefully be removed at some point in the future. The new console API is intended to be used for both normal (bootup) and crash use cases, freeing platforms of the need to set up the crash console separately. Consoles can be individually configured to be active active at boot (until first handoff to EL2), at runtime (after first handoff to EL2), and/or after a crash. Console drivers should set a sane default upon registration that can be overridden with the console_set_scope() call. Code to hook up the crash reporting mechanism to this framework will be added with a later patch. This patch only affects AArch64, but the new API could easily be ported to AArch32 as well if desired. Change-Id: I35c5aa2cb3f719cfddd15565eb13c7cde4162549 Signed-off-by: Julius Werner <jwerner@chromium.org>
110 lines
3.2 KiB
ArmAsm
110 lines
3.2 KiB
ArmAsm
/*
|
|
* Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#include <asm_macros.S>
|
|
|
|
/*
|
|
* This is the common console core code for the deprecated single-console API.
|
|
* New platforms should set MULTI_CONSOLE_API=1 and not use this file.
|
|
*/
|
|
|
|
.globl console_init
|
|
.globl console_uninit
|
|
.globl console_putc
|
|
.globl console_getc
|
|
.globl console_flush
|
|
|
|
/*
|
|
* The console base is in the data section and not in .bss
|
|
* even though it is zero-init. In particular, this allows
|
|
* the console functions to start using this variable before
|
|
* the runtime memory is initialized for images which do not
|
|
* need to copy the .data section from ROM to RAM.
|
|
*/
|
|
.section .data.console_base ; .align 3
|
|
console_base: .quad 0x0
|
|
|
|
/* -----------------------------------------------
|
|
* int console_init(uintptr_t base_addr,
|
|
* unsigned int uart_clk, unsigned int baud_rate)
|
|
* Function to initialize the console without a
|
|
* C Runtime to print debug information. It saves
|
|
* the console base to the data section.
|
|
* In: x0 - console base address
|
|
* w1 - Uart clock in Hz
|
|
* w2 - Baud rate
|
|
* out: return 1 on success else 0 on error
|
|
* Clobber list : x1 - x4
|
|
* -----------------------------------------------
|
|
*/
|
|
func console_init
|
|
/* Check the input base address */
|
|
cbz x0, init_fail
|
|
adrp x3, console_base
|
|
str x0, [x3, :lo12:console_base]
|
|
b console_core_init
|
|
init_fail:
|
|
ret
|
|
endfunc console_init
|
|
|
|
/* -----------------------------------------------
|
|
* void console_uninit(void)
|
|
* Function to finish the use of console driver.
|
|
* It sets the console_base as NULL so that any
|
|
* further invocation of `console_putc` or
|
|
* `console_getc` APIs would return error.
|
|
* -----------------------------------------------
|
|
*/
|
|
func console_uninit
|
|
mov x0, #0
|
|
adrp x3, console_base
|
|
str x0, [x3, :lo12:console_base]
|
|
ret
|
|
endfunc console_uninit
|
|
|
|
/* ---------------------------------------------
|
|
* int console_putc(int c)
|
|
* Function to output a character over the
|
|
* console. It returns the character printed on
|
|
* success or -1 on error.
|
|
* In : x0 - character to be printed
|
|
* Out : return -1 on error else return character.
|
|
* Clobber list : x1, x2
|
|
* ---------------------------------------------
|
|
*/
|
|
func console_putc
|
|
adrp x2, console_base
|
|
ldr x1, [x2, :lo12:console_base]
|
|
b console_core_putc
|
|
endfunc console_putc
|
|
|
|
/* ---------------------------------------------
|
|
* int console_getc(void)
|
|
* Function to get a character from the console.
|
|
* It returns the character grabbed on success
|
|
* or -1 on error.
|
|
* Clobber list : x0, x1
|
|
* ---------------------------------------------
|
|
*/
|
|
func console_getc
|
|
adrp x1, console_base
|
|
ldr x0, [x1, :lo12:console_base]
|
|
b console_core_getc
|
|
endfunc console_getc
|
|
|
|
/* ---------------------------------------------
|
|
* int console_flush(void)
|
|
* Function to force a write of all buffered
|
|
* data that hasn't been output. It returns 0
|
|
* upon successful completion, otherwise it
|
|
* returns -1.
|
|
* Clobber list : x0, x1
|
|
* ---------------------------------------------
|
|
*/
|
|
func console_flush
|
|
adrp x1, console_base
|
|
ldr x0, [x1, :lo12:console_base]
|
|
b console_core_flush
|
|
endfunc console_flush
|