@ -2,6 +2,10 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#include <stdbool.h>
 
					 
					 
					 
					#include <stdbool.h>
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#include "console.h"
 
					 
					 
					 
					#include "console.h"
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					#include "microwatt_soc.h"
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					#include "io.h"
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					#define UART_FREQ 115200
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					/*
 
					 
					 
					 
					/*
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 * Core UART functions to implement for a port
 
					 
					 
					 
					 * Core UART functions to implement for a port
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -9,32 +13,14 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static uint64_t potato_uart_base;
 
					 
					 
					 
					static uint64_t potato_uart_base;
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define PROC_FREQ 100000000
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define UART_FREQ 115200
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define UART_BASE 0xc0002000
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define POTATO_CONSOLE_TX		0x00
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define POTATO_CONSOLE_RX		0x08
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define POTATO_CONSOLE_STATUS		0x10
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define   POTATO_CONSOLE_STATUS_RX_EMPTY		0x01
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define   POTATO_CONSOLE_STATUS_TX_EMPTY		0x02
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define   POTATO_CONSOLE_STATUS_RX_FULL			0x04
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define   POTATO_CONSOLE_STATUS_TX_FULL			0x08
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define POTATO_CONSOLE_CLOCK_DIV	0x18
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					#define POTATO_CONSOLE_IRQ_EN		0x20
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static uint64_t potato_uart_reg_read(int offset)
 
					 
					 
					 
					static uint64_t potato_uart_reg_read(int offset)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{
 
					 
					 
					 
					{
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						uint64_t val;
 
					 
					 
					 
						return readq(potato_uart_base + offset);
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						__asm__ volatile("ldcix %0,%1,%2" : "=r" (val) : "b" (potato_uart_base), "r" (offset));
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						return val;
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					}
 
					 
					 
					 
					}
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static void potato_uart_reg_write(int offset, uint64_t val)
 
					 
					 
					 
					static void potato_uart_reg_write(int offset, uint64_t val)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{
 
					 
					 
					 
					{
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						__asm__ volatile("stdcix %0,%1,%2" : : "r" (val), "b" (potato_uart_base), "r" (offset));
 
					 
					 
					 
						writeq(val, potato_uart_base + offset);
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					}
 
					 
					 
					 
					}
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static int potato_uart_rx_empty(void)
 
					 
					 
					 
					static int potato_uart_rx_empty(void)
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -86,9 +72,12 @@ static unsigned long potato_uart_divisor(unsigned long proc_freq, unsigned long
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					void potato_uart_init(void)
 
					 
					 
					 
					void potato_uart_init(void)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{
 
					 
					 
					 
					{
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						uint64_t proc_freq;
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						potato_uart_base = UART_BASE;
 
					 
					 
					 
						potato_uart_base = UART_BASE;
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						proc_freq = readq(SYSCON_BASE + SYS_REG_CLKINFO);
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						potato_uart_reg_write(POTATO_CONSOLE_CLOCK_DIV, potato_uart_divisor(PROC_FREQ, UART_FREQ));
 
					 
					 
					 
						potato_uart_reg_write(POTATO_CONSOLE_CLOCK_DIV, potato_uart_divisor(proc_freq, UART_FREQ));
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					}
 
					 
					 
					 
					}
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					void potato_uart_irq_en(void)
 
					 
					 
					 
					void potato_uart_irq_en(void)