blob: aab7ff5f679fe596d2bb315cd960a89d8fafefb8 [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
5 *
6 */
Eric Biederman8ca8d762003-04-22 19:02:15 +00007
Eric Biederman8ca8d762003-04-22 19:02:15 +00008#include <console/console.h>
Kyösti Mälkki40760722014-02-27 19:30:18 +02009#include <console/streams.h>
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100010#include <console/vtxprintf.h>
11#include <smp/spinlock.h>
12#include <smp/node.h>
13#include <stddef.h>
Rudolf Marek7f0e9302011-09-02 23:23:41 +020014#include <trace.h>
Eric Biederman8ca8d762003-04-22 19:02:15 +000015
Myles Watson2e672732009-11-12 16:38:03 +000016DECLARE_SPIN_LOCK(console_lock)
Eric Biederman8ca8d762003-04-22 19:02:15 +000017
Kyösti Mälkki657e0be2014-02-04 19:03:57 +020018void do_putchar(unsigned char byte)
19{
Kyösti Mälkki657e0be2014-02-04 19:03:57 +020020 console_tx_byte(byte);
21}
22
Kyösti Mälkki77f43e92014-02-04 19:50:07 +020023static void wrap_putchar(unsigned char byte, void *data)
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020024{
25 do_putchar(byte);
26}
27
Eric Biederman8ca8d762003-04-22 19:02:15 +000028int do_printk(int msg_level, const char *fmt, ...)
29{
30 va_list args;
31 int i;
32
Kyösti Mälkki56ae1392014-02-28 14:37:27 +020033 if (!console_log_level(msg_level))
Eric Biederman8ca8d762003-04-22 19:02:15 +000034 return 0;
Eric Biederman8ca8d762003-04-22 19:02:15 +000035
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100036#if IS_ENABLED (CONFIG_SQUELCH_EARLY_SMP) && defined(__PRE_RAM__)
Kyösti Mälkkib2d25962014-01-27 15:09:13 +020037 if (!boot_cpu())
38 return 0;
39#endif
40
Rudolf Marek7f0e9302011-09-02 23:23:41 +020041 DISABLE_TRACE;
Eric Biederman8ca8d762003-04-22 19:02:15 +000042 spin_lock(&console_lock);
43
44 va_start(args, fmt);
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020045 i = vtxprintf(wrap_putchar, fmt, args, NULL);
Eric Biederman8ca8d762003-04-22 19:02:15 +000046 va_end(args);
47
48 console_tx_flush();
49
50 spin_unlock(&console_lock);
Rudolf Marek7f0e9302011-09-02 23:23:41 +020051 ENABLE_TRACE;
Eric Biederman8ca8d762003-04-22 19:02:15 +000052
53 return i;
54}
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020055
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100056#if IS_ENABLED (CONFIG_CHROMEOS)
Aaron Durbin8fb36c02015-05-01 16:48:54 -050057void do_printk_va_list(int msg_level, const char *fmt, va_list args)
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020058{
Aaron Durbin8fb36c02015-05-01 16:48:54 -050059 if (!console_log_level(msg_level))
60 return;
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020061 vtxprintf(wrap_putchar, fmt, args, NULL);
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020062 console_tx_flush();
63}
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100064#endif /* CONFIG_CHROMEOS */