1/*
2 * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <arch.h>
7#include <asm_macros.S>
8#include <cadence/cdns_uart.h>
9
10	.globl  console_core_init
11	.globl  console_core_putc
12	.globl  console_core_getc
13	.globl	console_core_flush
14
15	/* -----------------------------------------------
16	 * int console_core_init(unsigned long base_addr,
17	 * unsigned int uart_clk, unsigned int baud_rate)
18	 * Function to initialize the console without a
19	 * C Runtime to print debug information. This
20	 * function will be accessed by console_init and
21	 * crash reporting.
22	 * We assume that the bootloader already set up
23	 * the HW (baud, ...) and only enable the trans-
24	 * mitter and receiver here.
25	 * In: x0 - console base address
26	 *     w1 - Uart clock in Hz
27	 *     w2 - Baud rate
28	 * Out: return 1 on success else 0 on error
29	 * Clobber list : x1, x2, x3
30	 * -----------------------------------------------
31	 */
32func console_core_init
33	/* Check the input base address */
34	cbz	x0, core_init_fail
35	/* Check baud rate and uart clock for sanity */
36	cbz	w1, core_init_fail
37	cbz	w2, core_init_fail
38
39	/* RX/TX enabled & reset */
40	mov	w3, #(R_UART_CR_TX_EN | R_UART_CR_RX_EN | R_UART_CR_TXRST | R_UART_CR_RXRST)
41	str	w3, [x0, #R_UART_CR]
42
43	mov	w0, #1
44	ret
45core_init_fail:
46	mov	w0, wzr
47	ret
48endfunc console_core_init
49
50	/* --------------------------------------------------------
51	 * int console_core_putc(int c, unsigned long base_addr)
52	 * Function to output a character over the console. It
53	 * returns the character printed on success or -1 on error.
54	 * In : w0 - character to be printed
55	 *      x1 - console base address
56	 * Out : return -1 on error else return character.
57	 * Clobber list : x2
58	 * --------------------------------------------------------
59	 */
60func console_core_putc
61	/* Check the input parameter */
62	cbz	x1, putc_error
63	/* Prepend '\r' to '\n' */
64	cmp	w0, #0xA
65	b.ne	2f
661:
67	/* Check if the transmit FIFO is full */
68	ldr	w2, [x1, #R_UART_SR]
69	tbnz	w2, #UART_SR_INTR_TFUL_BIT, 1b
70	mov	w2, #0xD
71	str	w2, [x1, #R_UART_TX]
722:
73	/* Check if the transmit FIFO is full */
74	ldr	w2, [x1, #R_UART_SR]
75	tbnz	w2, #UART_SR_INTR_TFUL_BIT, 2b
76	str	w0, [x1, #R_UART_TX]
77	ret
78putc_error:
79	mov	w0, #-1
80	ret
81endfunc console_core_putc
82
83	/* ---------------------------------------------
84	 * int console_core_getc(unsigned long base_addr)
85	 * Function to get a character from the console.
86	 * It returns the character grabbed on success
87	 * or -1 on error.
88	 * In : x0 - console base address
89	 * Clobber list : x0, x1
90	 * ---------------------------------------------
91	 */
92func console_core_getc
93	cbz	x0, getc_error
941:
95	/* Check if the receive FIFO is empty */
96	ldr	w1, [x0, #R_UART_SR]
97	tbnz	w1, #UART_SR_INTR_REMPTY_BIT, 1b
98	ldr	w1, [x0, #R_UART_RX]
99	mov	w0, w1
100	ret
101getc_error:
102	mov	w0, #-1
103	ret
104endfunc console_core_getc
105
106	/* ---------------------------------------------
107	 * int console_core_flush(uintptr_t base_addr)
108	 * Function to force a write of all buffered
109	 * data that hasn't been output.
110	 * In : x0 - console base address
111	 * Out : return -1 on error else return 0.
112	 * Clobber list : x0, x1
113	 * ---------------------------------------------
114	 */
115func console_core_flush
116	/* Placeholder */
117	mov	w0, #0
118	ret
119endfunc console_core_flush
120