blob: 2eb33d97a82f8690acb0cb8c42f5164cd984581b [file] [log] [blame]
Saurabh Gorecha70389ca2020-04-22 21:31:24 +05301/*
2 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
3 * Copyright (c) 2018,2020 The Linux Foundation. All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#include <asm_macros.S>
9#include <console_macros.S>
10
11#include <platform_def.h>
12#include <qti_uart_console.h>
13
14/*
15 * This driver implements console logging into a ring buffer.
16 */
17
18 .globl qti_console_uart_register
19
20 /* -----------------------------------------------
21 * int qti_console_uart_register(console_t *console,
22 * uintptr_t uart_base_addr)
23 * Registers uart console instance.
24 * In: x0 - pointer to empty console_t struct
25 * x1 - start address of uart block.
26 * Out: x0 - 1 to indicate success
27 * Clobber list: x0, x1, x14
28 * -----------------------------------------------
29 */
30func qti_console_uart_register
31 str x1, [x0, #CONSOLE_T_BASE] /* Save UART base. */
32 finish_console_register uart putc=1, flush=1
33endfunc qti_console_uart_register
34
35 /* -----------------------------------------------
36 * int qti_console_uart_puts(int c, console_t *console)
37 * Writes a character to the UART console.
38 * The character must be preserved in x0.
39 * In: x0 - character to be stored
40 * x1 - pointer to console_t struct
41 * Clobber list: x1, x2
42 * -----------------------------------------------
43 */
44func console_uart_putc
45 /* set x1 = UART base. */
46 ldr x1, [x1, #CONSOLE_T_BASE]
47
48 /* Loop until M_GENI_CMD_ACTIVE bit not clear. */
491: ldr w2, [x1, #GENI_STATUS_REG]
50 and w2, w2, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
51 cmp w2, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
52 b.eq 1b
53
54 /* Transmit data. */
55 cmp w0, #0xA
56 b.ne 3f
57
58 /* Add '\r' when input char is '\n' */
59 mov w2, #0x1
60 mov w0, #0xD
61 str w2, [x1, #UART_TX_TRANS_LEN_REG]
62 mov w2, #GENI_M_CMD_TX
63 str w2, [x1, #GENI_M_CMD0_REG]
64 str w0, [x1, #GENI_TX_FIFOn_REG]
65 mov w0, #0xA
66
67 /* Loop until M_GENI_CMD_ACTIVE bit not clear. */
682: ldr w2, [x1, #GENI_STATUS_REG]
69 and w2, w2, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
70 cmp w2, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
71 b.eq 2b
72
73 /* Transmit i/p data. */
743: mov w2, #0x1
75 str w2, [x1, #UART_TX_TRANS_LEN_REG]
76 mov w2, #GENI_M_CMD_TX
77 str w2, [x1, #GENI_M_CMD0_REG]
78 str w0, [x1, #GENI_TX_FIFOn_REG]
79
80 ret
81endfunc console_uart_putc
82
83 /* -----------------------------------------------
84 * int qti_console_uart_flush(console_t *console)
85 * In: x0 - pointer to console_t struct
86 * Out: x0 - 0 for success
87 * Clobber list: x0, x1
88 * -----------------------------------------------
89 */
90func console_uart_flush
91 /* set x0 = UART base. */
92 ldr x0, [x0, #CONSOLE_T_BASE]
93
94 /* Loop until M_GENI_CMD_ACTIVE bit not clear. */
951: ldr w1, [x0, #GENI_STATUS_REG]
96 and w1, w1, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
97 cmp w1, #GENI_STATUS_M_GENI_CMD_ACTIVE_MASK
98 b.eq 1b
99
100 mov w0, #0
101 ret
102endfunc console_uart_flush