blob: 99f90a8e28480f6b74414b9adce3f50027203792 [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001/*
Martin Roth50d887d2013-07-08 16:22:54 -06002 * blatantly copied from linux/kernel/printk.c
Eric Biederman8ca8d762003-04-22 19:02:15 +00003 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
Timothy Pearson44d53422015-05-18 16:04:10 -05005 * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
Eric Biederman8ca8d762003-04-22 19:02:15 +00006 *
7 */
Eric Biederman8ca8d762003-04-22 19:02:15 +00008
Eric Biederman8ca8d762003-04-22 19:02:15 +00009#include <console/console.h>
Kyösti Mälkki40760722014-02-27 19:30:18 +020010#include <console/streams.h>
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100011#include <console/vtxprintf.h>
12#include <smp/spinlock.h>
13#include <smp/node.h>
14#include <stddef.h>
Rudolf Marek7f0e9302011-09-02 23:23:41 +020015#include <trace.h>
Eric Biederman8ca8d762003-04-22 19:02:15 +000016
Timothy Pearson44d53422015-05-18 16:04:10 -050017#if (!defined(__PRE_RAM__) && IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)) || !IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
Myles Watson2e672732009-11-12 16:38:03 +000018DECLARE_SPIN_LOCK(console_lock)
Timothy Pearson44d53422015-05-18 16:04:10 -050019#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000020
Kyösti Mälkki657e0be2014-02-04 19:03:57 +020021void do_putchar(unsigned char byte)
22{
Kyösti Mälkki657e0be2014-02-04 19:03:57 +020023 console_tx_byte(byte);
24}
25
Kyösti Mälkki77f43e92014-02-04 19:50:07 +020026static void wrap_putchar(unsigned char byte, void *data)
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020027{
28 do_putchar(byte);
29}
30
Eric Biederman8ca8d762003-04-22 19:02:15 +000031int do_printk(int msg_level, const char *fmt, ...)
32{
33 va_list args;
34 int i;
35
Kyösti Mälkki56ae1392014-02-28 14:37:27 +020036 if (!console_log_level(msg_level))
Eric Biederman8ca8d762003-04-22 19:02:15 +000037 return 0;
Eric Biederman8ca8d762003-04-22 19:02:15 +000038
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100039#if IS_ENABLED (CONFIG_SQUELCH_EARLY_SMP) && defined(__PRE_RAM__)
Kyösti Mälkkib2d25962014-01-27 15:09:13 +020040 if (!boot_cpu())
41 return 0;
42#endif
43
Rudolf Marek7f0e9302011-09-02 23:23:41 +020044 DISABLE_TRACE;
Timothy Pearson44d53422015-05-18 16:04:10 -050045#ifdef __PRE_RAM__
46#if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
47 spin_lock(romstage_console_lock());
48#endif
49#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000050 spin_lock(&console_lock);
Timothy Pearson44d53422015-05-18 16:04:10 -050051#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000052
53 va_start(args, fmt);
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020054 i = vtxprintf(wrap_putchar, fmt, args, NULL);
Eric Biederman8ca8d762003-04-22 19:02:15 +000055 va_end(args);
56
57 console_tx_flush();
58
Timothy Pearson44d53422015-05-18 16:04:10 -050059#ifdef __PRE_RAM__
60#if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
61 spin_unlock(romstage_console_lock());
62#endif
63#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000064 spin_unlock(&console_lock);
Timothy Pearson44d53422015-05-18 16:04:10 -050065#endif
Rudolf Marek7f0e9302011-09-02 23:23:41 +020066 ENABLE_TRACE;
Eric Biederman8ca8d762003-04-22 19:02:15 +000067
68 return i;
69}
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020070
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100071#if IS_ENABLED (CONFIG_CHROMEOS)
Aaron Durbin8fb36c02015-05-01 16:48:54 -050072void do_printk_va_list(int msg_level, const char *fmt, va_list args)
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020073{
Aaron Durbin8fb36c02015-05-01 16:48:54 -050074 if (!console_log_level(msg_level))
75 return;
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020076 vtxprintf(wrap_putchar, fmt, args, NULL);
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020077 console_tx_flush();
78}
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100079#endif /* CONFIG_CHROMEOS */