759e07bebe
PRE_KERNEL_1 is more suited for dealing with devices, so move out of EARLY. Verified on hardware and things seem to behave the same. Something was changed since this was first introduced as this was not possible for some reason. Fixes #62627 Signed-off-by: Anas Nashif <anas.nashif@intel.com>
66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2022 Intel Corporation
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/init.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/winstream.h>
|
|
#include <zephyr/devicetree.h>
|
|
|
|
#include <adsp_memory.h>
|
|
#include <mem_window.h>
|
|
#include <soc.h>
|
|
|
|
struct k_spinlock trace_lock;
|
|
|
|
static struct sys_winstream *winstream;
|
|
|
|
void winstream_console_trace_out(int8_t *str, size_t len)
|
|
{
|
|
if (len == 0) {
|
|
return;
|
|
}
|
|
|
|
#ifdef CONFIG_ADSP_TRACE_SIMCALL
|
|
register int a2 __asm__("a2") = 4; /* SYS_write */
|
|
register int a3 __asm__("a3") = 1; /* fd 1 == stdout */
|
|
register int a4 __asm__("a4") = (int)str;
|
|
register int a5 __asm__("a5") = len;
|
|
|
|
__asm__ volatile("simcall" : "+r"(a2), "+r"(a3) : "r"(a4), "r"(a5) : "memory");
|
|
#endif
|
|
|
|
k_spinlock_key_t key = k_spin_lock(&trace_lock);
|
|
|
|
sys_winstream_write(winstream, str, len);
|
|
k_spin_unlock(&trace_lock, key);
|
|
}
|
|
|
|
int arch_printk_char_out(int c)
|
|
{
|
|
int8_t s = c;
|
|
|
|
winstream_console_trace_out(&s, 1);
|
|
return 0;
|
|
}
|
|
|
|
static int winstream_console_init(void)
|
|
{
|
|
const struct device *dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));
|
|
|
|
if (!device_is_ready(dev)) {
|
|
return -ENODEV;
|
|
}
|
|
const struct mem_win_config *config = dev->config;
|
|
void *buf =
|
|
arch_xtensa_uncached_ptr((__sparse_force void __sparse_cache *)config->mem_base);
|
|
|
|
winstream = sys_winstream_init(buf, config->size);
|
|
|
|
return 0;
|
|
}
|
|
|
|
SYS_INIT(winstream_console_init, PRE_KERNEL_1, CONFIG_CONSOLE_INIT_PRIORITY);
|