#include #include #include #include #include #include #include #include "microwatt_soc.h" #include "io.h" #include "sdram.h" #include "console.h" int _printf(const char *fmt, ...) { int count; char buffer[320]; va_list ap; va_start(ap, fmt); count = vsnprintf(buffer, sizeof(buffer), fmt, ap); va_end(ap); puts(buffer); return count; } void flush_cpu_dcache(void) { } void flush_cpu_icache(void) { __asm__ volatile ("icbi 0,0; isync" : : : "memory"); } void main(void) { unsigned long long ftr, val; /* Init the UART */ potato_uart_init(); printf("\n\nWelcome to Microwatt !\n\n"); /* TODO: Add core version information somewhere in syscon, possibly * extracted from git */ printf(" Soc signature: %016llx\n", (unsigned long long)readq(SYSCON_BASE + SYS_REG_SIGNATURE)); printf(" Soc features: "); ftr = readq(SYSCON_BASE + SYS_REG_INFO); if (ftr & SYS_REG_INFO_HAS_UART) printf("UART "); if (ftr & SYS_REG_INFO_HAS_DRAM) printf("DRAM "); if (ftr & SYS_REG_INFO_HAS_BRAM) printf("BRAM "); printf("\n"); if (ftr & SYS_REG_INFO_HAS_BRAM) { val = readq(SYSCON_BASE + SYS_REG_BRAMINFO); printf(" BRAM: %lld KB\n", val / 1024); } if (ftr & SYS_REG_INFO_HAS_DRAM) { val = readq(SYSCON_BASE + SYS_REG_DRAMINFO); printf(" DRAM: %lld MB\n", val / (1024 * 1024)); val = readq(SYSCON_BASE + SYS_REG_DRAMINITINFO); printf(" DRAM INIT: %lld KB\n", val / 1024); } val = readq(SYSCON_BASE + SYS_REG_CLKINFO); printf(" CLK: %lld MHz\n", val / 1000000); printf("\n"); if (ftr & SYS_REG_INFO_HAS_DRAM) { printf("LiteDRAM built from Migen %s and LiteX %s\n", MIGEN_GIT_SHA1, LITEX_GIT_SHA1); sdrinit(); } if (ftr & SYS_REG_INFO_HAS_BRAM) printf("Booting from BRAM...\n"); else { void *s = (void *)(DRAM_INIT_BASE + 0x4000); void *d = (void *)DRAM_BASE; int sz = (0x10000 - 0x4000); printf("Copying payload to DRAM...\n"); memcpy(d, s, sz); printf("Booting from DRAM...\n"); flush_cpu_icache(); } }