blob: 10a7da21f384dd800e0746a798822f6230479dbf [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)
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020057void do_vtxprintf(const char *fmt, va_list args)
58{
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020059 vtxprintf(wrap_putchar, fmt, args, NULL);
Kyösti Mälkkib3356bb2014-03-06 16:55:05 +020060 console_tx_flush();
61}
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +100062#endif /* CONFIG_CHROMEOS */