summaryrefslogtreecommitdiffstats
path: root/sys/mips/cavium/octeon_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mips/cavium/octeon_machdep.c')
-rw-r--r--sys/mips/cavium/octeon_machdep.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/sys/mips/cavium/octeon_machdep.c b/sys/mips/cavium/octeon_machdep.c
index 0a1480e..ddfe0d1 100644
--- a/sys/mips/cavium/octeon_machdep.c
+++ b/sys/mips/cavium/octeon_machdep.c
@@ -406,6 +406,49 @@ octeon_get_timecount(struct timecounter *tc)
return ((unsigned)octeon_get_ticks());
}
+/**
+ * version of printf that works better in exception context.
+ *
+ * @param format
+ *
+ * XXX If this function weren't in cvmx-interrupt.c, we'd use the SDK version.
+ */
+void cvmx_safe_printf(const char *format, ...)
+{
+ char buffer[256];
+ char *ptr = buffer;
+ int count;
+ va_list args;
+
+ va_start(args, format);
+#ifndef __U_BOOT__
+ count = vsnprintf(buffer, sizeof(buffer), format, args);
+#else
+ count = vsprintf(buffer, format, args);
+#endif
+ va_end(args);
+
+ while (count-- > 0)
+ {
+ cvmx_uart_lsr_t lsrval;
+
+ /* Spin until there is room */
+ do
+ {
+ lsrval.u64 = cvmx_read_csr(CVMX_MIO_UARTX_LSR(0));
+#if !defined(CONFIG_OCTEON_SIM_SPEED)
+ if (lsrval.s.temt == 0)
+ cvmx_wait(10000); /* Just to reduce the load on the system */
+#endif
+ }
+ while (lsrval.s.temt == 0);
+
+ if (*ptr == '\n')
+ cvmx_write_csr(CVMX_MIO_UARTX_THR(0), '\r');
+ cvmx_write_csr(CVMX_MIO_UARTX_THR(0), *ptr++);
+ }
+}
+
/* impSTART: This stuff should move back into the Cavium SDK */
/*
****************************************************************************************
@@ -490,8 +533,6 @@ octeon_is_simulation(void)
static void
octeon_process_app_desc_ver_6(void)
{
- void *phy_mem_desc_ptr;
-
/* XXX Why is 0x00000000ffffffffULL a bad value? */
if (app_desc_ptr->cvmx_desc_vaddr == 0 ||
app_desc_ptr->cvmx_desc_vaddr == 0xfffffffful)
@@ -506,9 +547,7 @@ octeon_process_app_desc_ver_6(void)
(int) octeon_bootinfo->major_version,
(int) octeon_bootinfo->minor_version, octeon_bootinfo);
- phy_mem_desc_ptr =
- (void *)MIPS_PHYS_TO_KSEG0(octeon_bootinfo->phy_mem_desc_addr);
- cvmx_sysinfo_minimal_initialize(phy_mem_desc_ptr,
+ cvmx_sysinfo_minimal_initialize(octeon_bootinfo->phy_mem_desc_addr,
octeon_bootinfo->board_type,
octeon_bootinfo->board_rev_major,
octeon_bootinfo->board_rev_minor,
@@ -529,9 +568,9 @@ octeon_boot_params_init(register_t ptr)
KASSERT(octeon_bootinfo != NULL, ("octeon_bootinfo should be set"));
- if (cvmx_sysinfo_get()->phy_mem_desc_ptr == NULL)
+ if (cvmx_sysinfo_get()->phy_mem_desc_addr == (uint64_t)0)
panic("Your boot loader did not supply a memory descriptor.");
- cvmx_bootmem_init(cvmx_sysinfo_get()->phy_mem_desc_ptr);
+ cvmx_bootmem_init(cvmx_sysinfo_get()->phy_mem_desc_addr);
printf("Boot Descriptor Ver: %u -> %u/%u",
app_desc_ptr->desc_version, octeon_bootinfo->major_version,
OpenPOWER on IntegriCloud