// Copyright Microsoft and CHERIoT Contributors.
// SPDX-License-Identifier: MIT

#pragma once

#include <concepts>
#include <stdint.h>

/**
 * Concept for checking that a UART driver exposes the right interface.
 */
template<typename T>
concept IsUart = requires(volatile T *v, uint8_t byte)
{
	{v->init()};
	{
		v->can_write()
		} -> std::same_as<bool>;
	{
		v->can_read()
		} -> std::same_as<bool>;
	{
		v->blocking_read()
		} -> std::same_as<uint8_t>;
	{v->blocking_write(byte)};
};

/**
 * Generic 16550A memory-mapped register layout.
 *
 * The registers are 8 bits wide, but typically the bus supports only 4-byte
 * (or larger) transactions and so they are padded to a 32-bit word.  The
 * template parameter allows this to be controlled.
 */
template<typename RegisterType = uint32_t>
class Uart16550
{
	static void no_custom_init() {}

	public:
	/**
	 * The interface to the read/write FIFOs for this UART.
	 *
	 * This is also the low byte of the divisor when the divisor latch (bit 7 of
	 * the `lineControl`) is set.
	 */
	RegisterType data;
	/**
	 * Interrupt-enabled control / status.  Write 1 to enabled, 0 to disable, to
	 * each of the low four bits:
	 *
	 * 0: Data-receive interrupt
	 * 1: Transmit holding register empty interrupt
	 * 2: Receive line status interrupts
	 * 3: Modem status interrupts.
	 *
	 * When bit 7 of `lineControl` is set, this is instead the
	 * divisor-latch-high register and stores the high 8 bits of the divisor.
	 */
	RegisterType intrEnable;
	/**
	 * Interrupt identification and FIFO enable/disable.
	 *
	 * We only care about the low bit here, which enables the FIFO.
	 */
	RegisterType intrIDandFifo;
	/**
	 * Specifies properties of the line (stop bit, parity, and so on).  The
	 * only bit that we use is bit 7, the divisor latch, which enables writing
	 * the speed.
	 */
	RegisterType lineControl;
	/**
	 * Modem control.
	 */
	RegisterType modemControl;
	/**
	 * The line status word.  The bits that we care about are:
	 *
	 * 0: Receive ready
	 * 5: Transmit buffer empty
	 */
	const RegisterType LineStatus;
	/**
	 * Modem status.
	 */
	const RegisterType ModemStatus;
	/**
	 * Scratch register.  Unused.
	 */
	RegisterType scratch;

	/**
	 * Returns true if the transmit buffer is empty.
	 */
	__always_inline bool can_write() volatile
	{
#ifdef SIMULATION
		// If we're in a simulator, we're running *much* slower than the thing
		// handling the UART, so assume that you can always write to the UART.
		return true;
#else
		return LineStatus & (1 << 5);
#endif
	}

	/**
	 * Returns true if the receive buffer is not.
	 */
	__always_inline bool can_read() volatile
	{
		return LineStatus & (1 << 0);
	}

	/**
	 * Read one byte, blocking until a byte is available.
	 */
	uint8_t blocking_read() volatile
	{
		while (!can_read()) {}
		return data;
	}

	/**
	 * Write one byte, blocking until the byte is written.
	 */
	void blocking_write(uint8_t byte) volatile
	{
		while (!can_write()) {}
		data = byte;
	}

	/**
	 * Initialise the UART.
	 */
	template<typename T = decltype(no_custom_init)>
	void init(int divisor = 1, T &&otherSetup = no_custom_init) volatile
	{
		// Disable interrupts
		intrEnable = 0x00;
		// Set the divisor latch (we're going to write the divisor) and set the
		// character width to 8 bits, one stop bit, no parity.
		lineControl = 0x83;
		// Set the divisor
		data       = divisor & 0xff;
		intrEnable = (divisor >> 8) & 0xff;
		// Run any other setup that we were asked to do.
		otherSetup();
		// Clear the divisor latch
		lineControl = 0x03;
		// Enable the FIFO and reset
		// Enabled bits:
		// 0 - Enable FIFOs
		// 1 - Clear receive FIFO
		// 2 - Clear send FIFO
		// 5 - 64-byte FIFO (if available)
		intrIDandFifo = 0x1;
	}
};

// A platform can provide a custom version of this.
#ifndef CHERIOT_PLATFORM_CUSTOM_UART
/// The default UART type.
using Uart = Uart16550<uint32_t>;
// Check that our UART matches the concept.
static_assert(IsUart<Uart>);
#endif
