/*
 * Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net>
 *
 * Based on aarch64/skeleton_console.S:
 * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <asm_macros.S>
#include <console_macros.S>

/* UART DM registers */
#define UART_DM_DMEN		0x03c		/* DMA / data packing */
#define UART_DM_SR		0x0a4		/* status register */
#define UART_DM_CR		0x0a8		/* command register */
#define UART_DM_TF		0x100		/* transmit FIFO */

#define UART_DM_DMEN_TX_SC	BIT_32(4)	/* TX single character mode */

#define UART_DM_SR_TXRDY_BIT	2		/* TX FIFO has space */
#define UART_DM_SR_TXEMT_BIT	3		/* TX FIFO is empty */

#define UART_DM_CR_RESET_RX	(U(0x01) << 4)	/* reset receiver */
#define UART_DM_CR_RESET_TX	(U(0x02) << 4)	/* reset transmitter */
#define UART_DM_CR_TX_ENABLE	BIT_32(2)	/* enable transmitter */

	.globl	console_uartdm_register
	.globl	console_uartdm_core_init
	.globl	console_uartdm_putc
	.globl	console_uartdm_core_putc
	.globl	console_uartdm_flush
	.globl	console_uartdm_core_flush

	/* -----------------------------------------------------------
	 * int console_uartdm_register(console_t *console,
	 * 	uintptr_t base_addr)
	 * Function to initialize and register the console. The caller
	 * needs to pass an empty console_t structure in which *MUST*
	 * be allocated in persistent memory (e.g. a global or static
	 * local variable, *NOT* on the stack).
	 * In : x0 - pointer to empty console_t structure
	 *      x1 - base address
	 * Out: x0 - 1 on success, 0 on error
	 * Clobber list : x0 - x7
	 * -----------------------------------------------------------
	 */
func console_uartdm_register
	str	x1, [x0, #CONSOLE_T_BASE]
	mov	x7, lr
	bl	console_uartdm_core_init
	mov	lr, x7

	/* Register the new console */
	finish_console_register uartdm putc=1, flush=1
endfunc console_uartdm_register

	/* -----------------------------------------------------------
	 * void console_uartdm_core_init(unused, uintptr_t base_addr)
	 * Function to initialize the console.
	 * In : x0 - unused
	 *      x1 - base address
	 * Out: void
	 * Clobber list : x1, x2, x3
	 * -----------------------------------------------------------
	 */
func console_uartdm_core_init
	/*
	 * Try to flush remaining characters from the TX FIFO before resetting
	 * the transmitter. Unfortunately there is no good way to check if
	 * the transmitter is actually enabled (and will finish eventually),
	 * so use a timeout to avoid looping forever.
	 */
	mov	w2, #65536
1:
	ldr	w3, [x1, #UART_DM_SR]
	tbnz	w3, #UART_DM_SR_TXEMT_BIT, 2f
	subs	w2, w2, #1
	b.ne	1b
	/* Timeout */

2:	/* Reset receiver */
	mov	w3, #UART_DM_CR_RESET_RX
	str	w3, [x1, #UART_DM_CR]

	/* Reset transmitter */
	mov	w3, #UART_DM_CR_RESET_TX
	str	w3, [x1, #UART_DM_CR]

	/*
	 * Disable BAM/DMA modes but enable single-character mode for TX.
	 * The single character mode allows simplifying the putc implementation
	 * since characters can be written directly to the FIFO instead of
	 * having to initiate a new transfer and waiting for its completion.
	 */
	mov	w3, #UART_DM_DMEN_TX_SC
	str	w3, [x1, #UART_DM_DMEN]

	/* Enable transmitter */
	mov	w3, #UART_DM_CR_TX_ENABLE
	str	w3, [x1, #UART_DM_CR]

	ret
endfunc console_uartdm_core_init

	/* -----------------------------------------------------------
	 * int console_uartdm_putc(int c, console_t *console)
	 * Function to output a character over the console.
	 * In : w0 - character to be printed
	 *      x1 - pointer to console_t struct
	 * Out: w0 - printed character on success, < 0 on error.
	 * Clobber list : x0, x1, x2
	 * -----------------------------------------------------------
	 */
func console_uartdm_putc
	ldr	x1, [x1, #CONSOLE_T_BASE]
	b	console_uartdm_core_putc
endfunc console_uartdm_putc

	/* -----------------------------------------------------------
	 * int console_uartdm_core_putc(int c, uintptr_t base_addr)
	 * Function to output a character over the console.
	 * In : w0 - character to be printed
	 *      x1 - base address
	 * Out: w0 - printed character on success, < 0 on error.
	 * Clobber list : x2
	 * -----------------------------------------------------------
	 */
func console_uartdm_core_putc
	cmp	w0, #'\n'
	b.ne	2f

1:	/* Loop until TX FIFO has space */
	ldr	w2, [x1, #UART_DM_SR]
	tbz	w2, #UART_DM_SR_TXRDY_BIT, 1b

	/* Prepend '\r' to '\n' */
	mov	w2, #'\r'
	str	w2, [x1, #UART_DM_TF]

2:	/* Loop until TX FIFO has space */
	ldr	w2, [x1, #UART_DM_SR]
	tbz	w2, #UART_DM_SR_TXRDY_BIT, 2b

	/* Write character to FIFO */
	str	w0, [x1, #UART_DM_TF]
	ret
endfunc console_uartdm_core_putc

	/* -----------------------------------------------------------
	 * void console_uartdm_flush(console_t *console)
	 * Function to force a write of all buffered data
	 * that has not been output.
	 * In : x0 - pointer to console_t struct
	 * Out: void
	 * Clobber list : x0, x1, x2, x3, x4, x5
	 * -----------------------------------------------------------
	 */
func console_uartdm_flush
	ldr	x1, [x0, #CONSOLE_T_BASE]
	b	console_uartdm_core_flush
endfunc console_uartdm_flush

	/* -----------------------------------------------------------
	 * void console_uartdm_core_flush(unused, uintptr_t base_addr)
	 * Function to force a write of all buffered data
	 * that has not been output.
	 * In : x0 - unused
	 *      x1 - base address
	 * Out: void
	 * Clobber list : x2
	 * -----------------------------------------------------------
	 */
func console_uartdm_core_flush
1:	/* Loop until TX FIFO is empty */
	ldr	w2, [x1, #UART_DM_SR]
	tbz	w2, #UART_DM_SR_TXEMT_BIT, 1b
	ret
endfunc console_uartdm_core_flush
