#pragma once
#include <cdefs.h>
#include <debug.hh>
#include <stdint.h>
#include <utils.hh>

namespace SonataSpi
{
	/// Sonata SPI Interrupts
	typedef enum [[clang::flag_enum]]
	: uint32_t{
	    /// Raised when a SPI operation completes and the block has become idle.
	    InterruptComplete = 1 << 4,
	    /*
	     * Asserted whilst the transmit FIFO level is at or below the
	     * transmit watermark.
	     */
	    InterruptTransmitWatermark = 1 << 3,
	    /// Asserted whilst the transmit FIFO is empty.
	    InterruptTransmitEmpty = 1 << 2,
	    /*
	     * Asserted whilst the receive FIFO level is at or above the receive
	     * watermark.
	     */
	    InterruptReceiveWatermark = 1 << 1,
	    /// Asserted whilst the receive FIFO is full.
	    InterruptReceiveFull = 1 << 0,
	  } Interrupt;

	/// Configuration Register Fields
	enum : uint32_t
	{
		/**
		 * The length of a half period (i.e. positive edge to negative edge) of
		 * the SPI clock, measured in system clock cycles reduced by 1. For
		 * example, at a 50 MHz system clock, a value of 0 gives a 25 MHz SPI
		 * clock, a value of 1 gives a 12.5 MHz SPI clock, a value of 2 gives
		 * a 8.33 MHz SPI clock and so on.
		 */
		ConfigurationHalfClockPeriodMask = 0xffu << 0,
		/*
		 * When set the most significant bit (MSB) is the first bit sent and
		 * received with each byte
		 */
		ConfigurationMSBFirst = 1u << 29,
		/*
		 * The phase of the spi_clk signal. when clockphase is 0, data is
		 * sampled on the leading edge and changes on the trailing edge. The
		 * first data bit is immediately available before the first leading edge
		 * of the clock when transmission begins. When clockphase is 1, data is
		 * sampled on the trailing edge and change on the leading edge.
		 */
		ConfigurationClockPhase = 1u << 30,
		/*
		 * The polarity of the spi_clk signal. When ClockPolarity is 0, clock is
		 * low when idle and the leading edge is positive. When ClkPolarity is
		 * 1, clock is high when idle and the leading edge is negative
		 */
		ConfigurationClockPolarity = 1u << 31,
	};

	/// Control Register Fields
	enum : uint32_t
	{
		/// Write 1 to clear the transmit FIFO.
		ControlTransmitClear = 1 << 0,
		/// Write 1 to clear the receive FIFO.
		ControlReceiveClear = 1 << 1,
		/**
		 * When set bytes from the transmit FIFO are sent. When clear the state
		 * of the outgoing spi_cipo is undefined whilst the SPI clock is
		 * running.
		 */
		ControlTransmitEnable = 1 << 2,
		/**
		 * When set incoming bits are written to the receive FIFO. When clear
		 * incoming bits are ignored.
		 */
		ControlReceiveEnable = 1 << 3,
		/**
		 * The watermark level for the transmit FIFO, depending on the value
		 * the interrupt will trigger at different points
		 */
		ControlTransmitWatermarkMask = 0xf << 4,
		/**
		 * The watermark level for the receive FIFO, depending on the value the
		 * interrupt will trigger at different points
		 */
		ControlReceiveWatermarkMask = 0xf << 8,
		/**
		 * Internal loopback function enabled when set to 1.
		 */
		ControlInternalLoopback = 1 << 30,
		/**
		 * Software reset performed when written as 1.
		 */
		ControlSoftwareReset = 1u << 31,
	};

	/// Status Register Fields
	enum : uint32_t
	{
		/// Number of items in the transmit FIFO.
		StatusTxFifoLevel = 0xffu << 0,
		/// Number of items in the receive FIFO.
		StatusRxFifoLevel = 0xffu << 8,
		/**
		 * When set the transmit FIFO is full and any data written to it will
		 * be ignored.
		 */
		StatusTxFifoFull = 1u << 16,
		/**
		 * When set the receive FIFO is empty and any data read from it will be
		 * undefined.
		 */
		StatusRxFifoEmpty = 1u << 17,
		/// When set the SPI block is idle and can accept a new start command.
		StatusIdle = 1u << 18,
	};

	/// Start Register Fields
	enum : uint32_t
	{
		/// Number of bytes to receive/transmit in the SPI operation
		StartByteCountMask = 0x7ffu,
	};

	/// Info Register Fields
	enum : uint32_t
	{
		/// Maximum number of items in the transmit FIFO.
		InfoTxFifoDepth = 0xffu << 0,
		/// Maximum number of items in the receive FIFO.
		InfoRxFifoDepth = 0xffu << 8,
	};

	/**
	 * A driver for the Sonata's SPI device block.
	 *
	 * Documentation source can be found at:
	 * https://github.com/lowRISC/sonata-system/blob/1a59633d2515d4fe186a07d53e49ff95c18d9bbf/doc/ip/spi.md
	 *
	 * Rendered documentation is served from:
	 * https://lowrisc.org/sonata-system/doc/ip/spi.html
	 */
	template<size_t NumChipSelects = 4>
	struct Generic : private utils::NoCopyNoMove
	{
		/// The current state of the SPI interrupts.
		uint32_t interruptState;
		/// Controls which interrupts are enabled.
		uint32_t interruptEnable;
		/// Allows one to manually trigger an interrupt for testing.
		uint32_t interruptTest;
		/**
		 * Configuration register. Controls how the SPI block transmits and
		 * receives data. This register can be modified only whilst the SPI
		 * block is idle.
		 */
		uint32_t configuration;
		/**
		 * Controls the operation of the SPI block. This register can
		 * be modified only whilst the SPI block is idle.
		 */
		uint32_t control;
		/// Status information about the SPI block
		uint32_t status;
		/**
		 * Writes to this begin an SPI operation.
		 * Writes are ignored when the SPI block is active.
		 */
		uint32_t start;
		/**
		 * Data from the receive FIFO. When read the data is popped from the
		 * FIFO. If the FIFO is empty data read is undefined.
		 */
		uint32_t receiveFifo;
		/**
		 * Bytes written here are pushed to the transmit FIFO. If the FIFO is
		 * full writes are ignored.
		 */
		uint32_t transmitFifo;
		/**
		 * Information about the SPI controller. This register reports the
		 * depths of the transmit and receive FIFOs within the controller.
		 */
		uint32_t info;
		/**
		 * Chip Select lines; each bit controls a chip select line.
		 * When a bit set to zero, a chip select line is pulled low.
		 * Multiple chip select lines can be pulled low at a time.
		 */
		uint32_t chipSelects;

		/// Flag set when we're debugging this driver.
		static constexpr bool DebugSonataSpi = false;

		/// Helper for conditional debug logs and assertions.
		using Debug = ConditionalDebug<DebugSonataSpi, "Sonata SPI">;

		/// Enable the given interrupt(s).
		inline void interrupt_enable(Interrupt interrupt) volatile
		{
			interruptEnable = interruptEnable | interrupt;
		}

		/// Disable the given interrupt(s).
		inline void interrupt_disable(Interrupt interrupt) volatile
		{
			interruptEnable = interruptEnable & ~interrupt;
		}

		/**
		 * Initialises the SPI block
		 *
		 * @param ClockPolarity When false, the clock is low when idle and the
		 *        leading edge is positive. When true, the opposite behaviour is
		 *        set.
		 * @param ClockPhase When false, data is sampled on the leading edge and
		 *        changes on the trailing edge. When true, the opposite
		 * behaviour is set.
		 * @param MsbFirst When true, the first bit of each byte sent is the
		 * most significant bit, as oppose to the least significant bit.
		 * @param HalfClockPeriod The length of a half period of the SPI clock,
		 *        measured in system clock cycles reduced by 1.
		 */
		void init(const bool     ClockPolarity,
		          const bool     ClockPhase,
		          const bool     MsbFirst,
		          const uint16_t HalfClockPeriod) volatile
		{
			configuration =
			  (ClockPolarity ? ConfigurationClockPolarity : 0) |
			  (ClockPhase ? ConfigurationClockPhase : 0) |
			  (MsbFirst ? ConfigurationMSBFirst : 0) |
			  (HalfClockPeriod & ConfigurationHalfClockPeriodMask);

			// Ensure that FIFOs are emptied of any stale data and the
			// controller core has returned to Idle if it is presently active
			// (eg. an incomplete previous operation, perhaps one that was
			// interrupted/failed).
			//
			// Note: although, from a logical perspective, the three operations
			// (i) tx clear, (ii) core reset and (iii) rx clear should be
			// performed in that order, presently the implementation supports
			// performing them as a single write.
			control =
			  ControlTransmitClear | ControlSoftwareReset | ControlReceiveClear;
		}

		/// Waits for the SPI device to become idle
		void wait_idle() volatile
		{
			// Wait whilst IDLE field in STATUS is low
			while ((status & StatusIdle) == 0) {}
		}

		/**
		 * Sends `len` bytes from the given `data` buffer,
		 * where `len` is at most `0x7ff`.
		 */
		void blocking_write(const uint8_t data[], uint16_t len) volatile
		{
			Debug::Assert(
			  len <= StartByteCountMask,
			  "You can't transfer more than 0x7ff bytes at a time.");
			len &= StartByteCountMask;

			wait_idle();
			// Do not attempt a zero-byte transfer; not supported by the
			// controller.
			if (len)
			{
				control = ControlTransmitEnable;
				start   = len;

				uint32_t transmitAvailable = 0;
				for (uint32_t i = 0; i < len; ++i)
				{
					while (!transmitAvailable)
					{
						// Read number of bytes in TX FIFO to calculate space
						// available for more bytes
						transmitAvailable = 8 - (status & StatusTxFifoLevel);
					}
					transmitFifo = data[i];
					transmitAvailable--;
				}
			}
		}

		/*
		 * Receives `len` bytes and puts them in the `data` buffer,
		 * where `len` is at most `0x7ff`.
		 *
		 * This method will block until the requested number of bytes
		 * has been seen. There is currently no timeout.
		 */
		void blocking_read(uint8_t data[], uint16_t len) volatile
		{
			Debug::Assert(len <= StartByteCountMask,
			              "You can't receive more than 0x7ff bytes at a time.");
			len &= StartByteCountMask;
			wait_idle();
			// Do not attempt a zero-byte transfer; not supported by the
			// controller.
			if (len)
			{
				control = ControlReceiveEnable;
				start   = len;

				for (uint32_t i = 0; i < len; ++i)
				{
					// Wait for at least one byte to be available in the RX FIFO
					while ((status & StatusRxFifoLevel) == 0) {}
					data[i] = uint8_t(receiveFifo);
				}
			}
		}

		/**
		 * Asserts/de-asserts a given chip select.
		 *
		 * Note, SPI chip selects are active low signals, so the register bit is
		 * zero when asserted and one when de-asserted.
		 *
		 * @tparam Index The index of the chip select to be set.
		 * @tparam DeassertOthers Whether to de-assert all other chip selects.
		 * @param Assert Whether to assert (true) or de-assert (false).
		 */
		template<uint8_t Index, bool DeassertOthers = true>
		inline void chip_select_assert(const bool Assert = true) volatile
		{
			static_assert(Index < NumChipSelects,
			              "SPI chip select index out of bounds");

			const uint32_t State =
			  DeassertOthers ? (1 << NumChipSelects) - 1 : chipSelects;

			const uint32_t Bit = (1 << Index);
			chipSelects        = Assert ? State & ~Bit : State | Bit;
		}
	};

	/// A specialised driver for the SPI device connected to the Ethernet MAC.
	class EthernetMac : public Generic<2>
	{
		enum : uint8_t
		{
			ChipSelectLine = 0,
			ResetLine      = 1,
		};

		public:
		/**
		 * Assert the chip select line.
		 * @param Assert Whether to assert (true) or de-assert (false) the chip
		 * select line.
		 */
		inline void chip_select_assert(const bool Assert) volatile
		{
			this->Generic<2>::chip_select_assert<ChipSelectLine, false>(Assert);
		}
		/**
		 * Assert the reset line.
		 * @param Assert Whether to assert (true) or de-assert (false) the reset
		 * line.
		 */
		inline void reset_assert(const bool Assert = true) volatile
		{
			this->Generic<2>::chip_select_assert<ResetLine, false>(Assert);
		}
	};

	/// A specialised driver for the SPI device connected to the LCD screen.
	class Lcd : public Generic<3>
	{
		enum : uint8_t
		{
			ChipSelectLine  = 0,
			DataCommandLine = 1,
			ResetLine       = 2,
		};

		public:
		/**
		 * Assert the chip select line.
		 * @param Assert Whether to assert (true) or de-assert (false) the chip
		 * select line.
		 */
		inline void chip_select_assert(const bool Assert) volatile
		{
			this->Generic<3>::chip_select_assert<ChipSelectLine, false>(Assert);
		}
		/**
		 * Assert the chip select line.
		 * @param Assert Whether to assert (true) or de-assert (false) the reset
		 * line.
		 */
		inline void reset_assert(const bool Assert = true) volatile
		{
			this->Generic<3>::chip_select_assert<ResetLine, false>(Assert);
		}
		/**
		 * Set the data/command line.
		 * @param high Whether to set high (true) or low (false).
		 */
		inline void data_command_set(const bool High) volatile
		{
			this->Generic<3>::chip_select_assert<DataCommandLine, false>(!High);
		}
	};
} // namespace SonataSpi
