/*
 * Copyright (C) 2016 Marvell International Ltd.
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 * https://spdx.org/licenses
 */

#include <arch.h>
#include <asm_macros.S>
#include <console_macros.S>
#include <drivers/marvell/uart/a3700_console.h>

	/*
	 * "core" functions are low-level implementations that don't require
	 * writable memory and are thus safe to call in BL1 crash context.
	 */
	.globl console_a3700_core_putc
	.globl console_a3700_core_init
	.globl console_a3700_core_getc
	.globl console_a3700_core_flush

	.globl console_a3700_putc
	.globl console_a3700_getc
	.globl console_a3700_flush

	/* -----------------------------------------------
	 * int console_a3700_core_init(unsigned long base_addr,
	 * unsigned int uart_clk, unsigned int baud_rate)
	 * Function to initialize the console without a
	 * C Runtime to print debug information. This
	 * function will be accessed by console_init and
	 * crash reporting.
	 * In: x0 - console base address
	 *     w1 - Uart clock in Hz
	 *     w2 - Baud rate
	 * Out: return 1 on success
	 * Clobber list : x1, x2, x3, x4
	 * -----------------------------------------------
	 */
func console_a3700_core_init
	/* Check the input base address */
	cbz	x0, init_fail
	/* Check baud rate and uart clock for sanity */
	cbz	w1, init_fail
	cbz	w2, init_fail

	/*
	 * Wait for the TX (THR and TSR) to be empty. If wait for 3ms, the TX FIFO is
	 * still not empty, TX FIFO will reset by all means.
	 */
	mov	w4, #30				/* max time out 30 * 100 us */
2:
	/* Check whether TX (THR and TSR) is empty */
	ldr	w3, [x0, #UART_STATUS_REG]
	and	w3, w3, #UARTLSR_TXEMPTY
	cmp	w3, #0
	b.ne	4f

	/* Delay */
	mov	w3, #60000	/* 60000 cycles of below 3 instructions on 1200 MHz CPU ~~ 100 us */
3:
	sub	w3, w3, #1
	cmp	w3, #0
	b.ne	3b

	/* Check whether wait timeout expired */
	sub	w4, w4, #1
	cmp	w4, #0
	b.ne	2b

4:
	/* Reset FIFO */
	mov	w3, #UART_CTRL_RXFIFO_RESET
	orr	w3, w3, #UART_CTRL_TXFIFO_RESET
	str	w3, [x0, #UART_CTRL_REG]

	/* Delay */
	mov	w3, #2000
1:
	sub	w3, w3, #1
	cmp	w3, #0
	b.ne	1b

	/* Program the baudrate */
	/* Divisor = Round(Uartclock / (16 * baudrate)) */
	lsl	w2, w2, #4
	add	w1, w1, w2, lsr #1
	udiv	w2, w1, w2
	and	w2, w2, #0x3ff /* clear all other bits to use default clock */

	str	w2, [x0, #UART_BAUD_REG]/* set baud rate divisor */

	/* Set UART to default 16X scheme */
	mov	w3, #0
	str	w3, [x0, #UART_POSSR_REG]

	/* No Parity, 1 Stop */
	mov	w3, #0
	str	w3, [x0, #UART_CTRL_REG]

	mov	w0, #1
	ret
init_fail:
	mov	w0, #0
	ret
endfunc console_a3700_core_init

	.globl console_a3700_register

	/* -----------------------------------------------
	 * int console_a3700_register(console_t *console,
		uintptr_t base, uint32_t clk, uint32_t baud)
	 * Function to initialize and register a new a3700
	 * console. Storage passed in for the console struct
	 * *must* be persistent (i.e. not from the stack).
	 * In: x0 - UART register base address
	 *     w1 - UART clock in Hz
	 *     w2 - Baud rate
	 *     x3 - pointer to empty console_t struct
	 * Out: return 1 on success, 0 on error
	 * Clobber list : x0, x1, x2, x3, x4, x6, x7, x14
	 * -----------------------------------------------
	 */
func console_a3700_register
	mov	x7, x30
	mov	x6, x3
	cbz	x6, register_fail
	str	x0, [x6, #CONSOLE_T_BASE]

	bl	console_a3700_core_init
	cbz	x0, register_fail

	mov	x0, x6
	mov	x30, x7
	finish_console_register a3700, putc=1, getc=1, flush=1

register_fail:
	ret	x7
endfunc console_a3700_register

	/* --------------------------------------------------------
	 * int console_a3700_core_putc(int c, unsigned int base_addr)
	 * Function to output a character over the console. It
	 * returns the character printed on success or -1 on error.
	 * In : w0 - character to be printed
	 *      x1 - console base address
	 * Out : return -1 on error else return character.
	 * Clobber list : x2
	 * --------------------------------------------------------
	 */
func console_a3700_core_putc
	/* Check the input parameter */
	cbz	x1, putc_error

	/* Prepend '\r' to '\n' */
	cmp	w0, #0xA
	b.ne	2f
	/* Check if the transmit FIFO is full */
1:	ldr	w2, [x1, #UART_STATUS_REG]
	and	w2, w2, #UARTLSR_TXFIFOFULL
	cmp	w2, #UARTLSR_TXFIFOFULL
	b.eq	1b
	mov	w2, #0xD		/* '\r' */
	str	w2, [x1, #UART_TX_REG]

	/* Check if the transmit FIFO is full */
2:	ldr	w2, [x1, #UART_STATUS_REG]
	and	w2, w2, #UARTLSR_TXFIFOFULL
	cmp	w2, #UARTLSR_TXFIFOFULL
	b.eq	2b
	str	w0, [x1, #UART_TX_REG]
	ret
putc_error:
	mov	w0, #-1
	ret
endfunc console_a3700_core_putc

	/* --------------------------------------------------------
	 * int console_a3700_putc(int c, console_t *console)
	 * Function to output a character over the console. It
	 * returns the character printed on success or -1 on error.
	 * In : w0 - character to be printed
	 *      x1 - pointer to console_t structure
	 * Out : return -1 on error else return character.
	 * Clobber list : x2
	 * --------------------------------------------------------
	 */
func console_a3700_putc
	ldr	x1, [x1, #CONSOLE_T_BASE]
	b	console_a3700_core_putc
endfunc console_a3700_putc

	/* ---------------------------------------------
	 * int console_a3700_core_getc(void)
	 * Function to get a character from the console.
	 * It returns the character grabbed on success
	 * or -1 if no character is available.
	 * In : w0 - console base address
	 * Out : w0 - character if available, else -1
	 * Clobber list : x0, x1
	 * ---------------------------------------------
	 */
func console_a3700_core_getc
	/* Check if there is a pending character */
	ldr	w1, [x0, #UART_STATUS_REG]
	and	w1, w1, #UARTLSR_RXRDY
	cmp	w1, #UARTLSR_RXRDY
	b.ne	getc_no_char
	ldr	w0, [x0, #UART_RX_REG]
	and	w0, w0, #0xff
	ret
getc_no_char:
	mov	w0, #ERROR_NO_PENDING_CHAR
	ret
endfunc console_a3700_core_getc

	/* ---------------------------------------------
	 * int console_a3700_getc(console_t *console)
	 * Function to get a character from the console.
	 * It returns the character grabbed on success
	 * or -1 on if no character is available.
	 * In :  x0 - pointer to console_t structure
	 * Out : w0 - character if available, else -1
	 * Clobber list : x0, x1
	 * ---------------------------------------------
	 */
func console_a3700_getc
	ldr	x0, [x0, #CONSOLE_T_BASE]
	b	console_a3700_core_getc
endfunc console_a3700_getc

	/* ---------------------------------------------
	 * void console_a3700_core_flush(uintptr_t base_addr)
	 * Function to force a write of all buffered
	 * data that hasn't been output.
	 * In : x0 - console base address
	 * Out : void.
	 * Clobber list : x0, x1
	 * ---------------------------------------------
	 */
func console_a3700_core_flush
	/* Wait for the TX (THR and TSR) to be empty */
1:	ldr	w1, [x0, #UART_STATUS_REG]
	and	w1, w1, #UARTLSR_TXEMPTY
	cmp	w1, #UARTLSR_TXEMPTY
	b.ne	1b
	ret
endfunc console_a3700_core_flush

	/* ---------------------------------------------
	 * void console_a3700_flush(console_t *console)
	 * Function to force a write of all buffered
	 * data that hasn't been output.
	 * In : x0 - pointer to console_t structure
	 * Out : void.
	 * Clobber list : x0, x1
	 * ---------------------------------------------
	 */
func console_a3700_flush
	ldr	x0, [x0, #CONSOLE_T_BASE]
	b	console_a3700_core_flush
endfunc console_a3700_flush

