Added functionality to the OpenTitanUart driver.
diff --git a/sdk/include/platform/sunburst/platform-uart.hh b/sdk/include/platform/sunburst/platform-uart.hh
index 663957e..a9acf85 100644
--- a/sdk/include/platform/sunburst/platform-uart.hh
+++ b/sdk/include/platform/sunburst/platform-uart.hh
@@ -70,6 +70,39 @@
 	 */
 	uint32_t timeoutControl;
 
+	/// OpenTitan UART Interrupts
+	typedef enum [[clang::flag_enum]]
+	: uint32_t{
+	    /// Raised if the transmit FIFO is empty.
+	    InterruptTransmitEmpty = 1 << 8,
+	    /// Raised if the receiver has detected a parity error.
+	    InterruptReceiveParityErr = 1 << 7,
+	    /// Raised if the receive FIFO has characters remaining in the FIFO
+	    /// without being
+	    /// retreived for the programmed time period.
+	    InterruptReceiveTimeout = 1 << 6,
+	    /// Raised if break condition has been detected on receive.
+	    InterruptReceiveBreakErr = 1 << 5,
+	    /// Raised if a framing error has been detected on receive.
+	    InterruptReceiveFrameErr = 1 << 4,
+	    /// Raised if the receive FIFO has overflowed.
+	    InterruptReceiveOverflow = 1 << 3,
+	    /// Raised if the transmit FIFO has emptied and no transmit is ongoing.
+	    InterruptTransmitDone = 1 << 2,
+	    /// Raised if the receive FIFO is past the high-water mark.
+	    InterruptReceiveWatermark = 1 << 1,
+	    /// Raised if the transmit FIFO is past the high-water mark.
+	    InterruptTransmitWatermark = 1 << 0,
+	  } OpenTitanUartInterrupt;
+
+	/// FIFO Control Register Fields
+	enum [[clang::flag_enum]] : uint32_t{
+	  /// Reset the transmit FIFO.
+	  FifoControlTransmitReset = 1 << 1,
+	  /// Reset the receive FIFO.
+	  FifoControlReceiveReset = 1 << 0,
+	};
+
 	/// Control Register Fields
 	enum : uint32_t
 	{
@@ -95,6 +128,97 @@
 		ControlTransmitEnable = 1 << 0,
 	};
 
+	/// The encoding for different transmit watermark levels.
+	enum class TransmitWatermark
+	{
+		Level1  = 0x0,
+		Level2  = 0x1,
+		Level4  = 0x2,
+		Level8  = 0x3,
+		Level16 = 0x4,
+	};
+
+	/// The encoding for different receive watermark levels.
+	enum class ReceiveWatermark
+	{
+		Level1  = 0x0,
+		Level2  = 0x1,
+		Level4  = 0x2,
+		Level8  = 0x3,
+		Level16 = 0x4,
+		Level32 = 0x5,
+		Level64 = 0x6,
+	};
+
+	/**
+	 * Configure parity.
+	 *
+	 * When `enableParity` is set, parity will be enabled.
+	 * When `oddParity` is set, the odd parity will be used.
+	 */
+	void parity(bool enableParity = true, bool oddParity = false) volatile
+	{
+		control = (control & ~(ControlParityEnable | ControlParityOdd)) |
+		          (enableParity ? ControlParityEnable : 0) |
+		          (oddParity ? ControlParityOdd : 0);
+	}
+
+	/**
+	 * Configure loopback.
+	 *
+	 * When `systemLoopback` is set, outgoing transmitted bits are routed back
+	 * the receiving line. When `lineLoopback` is set, incoming received bits
+	 * are forwarded to the transmit line.
+	 */
+	void loopback(bool systemLoopback = true,
+	              bool lineLoopback   = false) volatile
+	{
+		control = (control & ~(ControlSystemLoopback | ControlLineLoopback)) |
+		          (systemLoopback ? ControlSystemLoopback : 0) |
+		          (lineLoopback ? ControlLineLoopback : 0);
+	}
+
+	/// Clears the contents of the receive and transmit FIFOs.
+	void fifos_clear() volatile
+	{
+		fifoCtrl = (fifoCtrl & ~0b11) | FifoControlTransmitReset |
+		           FifoControlReceiveReset;
+	}
+
+	/**
+	 * Sets the level transmit watermark.
+	 *
+	 * When the number of bytes in the transmit FIFO reach this level,
+	 * the transmit watermark interrupt will fire.
+	 */
+	void transmit_watermark(TransmitWatermark level) volatile
+	{
+		fifoCtrl = static_cast<uint32_t>(level) << 5 | (fifoCtrl & 0x1f);
+	}
+
+	/**
+	 * Sets the level receive watermark.
+	 *
+	 * When the number of bytes in the receive FIFO reach this level,
+	 * the receive watermark interrupt will fire.
+	 */
+	void receive_watermark(ReceiveWatermark level) volatile
+	{
+		fifoCtrl = static_cast<uint32_t>(level) << 5 | (fifoCtrl & 0b11100011);
+	}
+
+	/// Enable the given interrupt.
+	void interrupt_enable(OpenTitanUartInterrupt interrupt) volatile
+	{
+		interruptEnable = interruptEnable | interrupt;
+	}
+
+	/// Disable the given interrupt.
+	void interrupt_disable(OpenTitanUartInterrupt interrupt) volatile
+	{
+		interruptEnable = interruptEnable & ~interrupt;
+	}
+
 	void init(unsigned baudRate = 115'200) volatile
 	{
 		// Nco = 2^20 * baud rate / cpu frequency