src/console: Add x86 romstage spinlock option and printk spinlock support

This paves the way for AP printk spinlock on AMD platforms

Change-Id: Ice42a0d3177736bf6e1bc601092e413601866f20
Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
Reviewed-on: https://review.coreboot.org/11958
Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Timothy Pearson 2015-05-18 16:04:10 -05:00 committed by Martin Roth
parent a09bb426d4
commit 44d5342835
4 changed files with 33 additions and 1 deletions

View File

@ -476,6 +476,10 @@ config HAVE_HARD_RESET
This variable specifies whether a given board has a hard_reset This variable specifies whether a given board has a hard_reset
function, no matter if it's provided by board code or chipset code. function, no matter if it's provided by board code or chipset code.
config HAVE_ROMSTAGE_CONSOLE_SPINLOCK
bool
default n
config HAVE_MONOTONIC_TIMER config HAVE_MONOTONIC_TIMER
def_bool n def_bool n
help help

View File

@ -1,7 +1,7 @@
#ifndef ARCH_SMP_SPINLOCK_H #ifndef ARCH_SMP_SPINLOCK_H
#define ARCH_SMP_SPINLOCK_H #define ARCH_SMP_SPINLOCK_H
#ifndef __PRE_RAM__ #if !defined(__PRE_RAM__) || IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
/* /*
* Your basic SMP spinlocks, allowing only a single CPU anywhere * Your basic SMP spinlocks, allowing only a single CPU anywhere
@ -11,9 +11,18 @@ typedef struct {
volatile unsigned int lock; volatile unsigned int lock;
} spinlock_t; } spinlock_t;
#ifdef __PRE_RAM__
spinlock_t *romstage_console_lock(void);
void initialize_romstage_console_lock(void);
#endif
#define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 } #define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 }
#ifndef __PRE_RAM__
#define DECLARE_SPIN_LOCK(x) static spinlock_t x = SPIN_LOCK_UNLOCKED; #define DECLARE_SPIN_LOCK(x) static spinlock_t x = SPIN_LOCK_UNLOCKED;
#else
#define DECLARE_SPIN_LOCK(x)
#endif
/* /*
* Simple spin lock operations. There are two variants, one clears IRQ's * Simple spin lock operations. There are two variants, one clears IRQ's

View File

@ -2,6 +2,7 @@
* blatantly copied from linux/kernel/printk.c * blatantly copied from linux/kernel/printk.c
* *
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
* *
*/ */
@ -13,7 +14,9 @@
#include <stddef.h> #include <stddef.h>
#include <trace.h> #include <trace.h>
#if (!defined(__PRE_RAM__) && IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)) || !IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
DECLARE_SPIN_LOCK(console_lock) DECLARE_SPIN_LOCK(console_lock)
#endif
void do_putchar(unsigned char byte) void do_putchar(unsigned char byte)
{ {
@ -39,7 +42,13 @@ int do_printk(int msg_level, const char *fmt, ...)
#endif #endif
DISABLE_TRACE; DISABLE_TRACE;
#ifdef __PRE_RAM__
#if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
spin_lock(romstage_console_lock());
#endif
#else
spin_lock(&console_lock); spin_lock(&console_lock);
#endif
va_start(args, fmt); va_start(args, fmt);
i = vtxprintf(wrap_putchar, fmt, args, NULL); i = vtxprintf(wrap_putchar, fmt, args, NULL);
@ -47,7 +56,13 @@ int do_printk(int msg_level, const char *fmt, ...)
console_tx_flush(); console_tx_flush();
#ifdef __PRE_RAM__
#if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
spin_unlock(romstage_console_lock());
#endif
#else
spin_unlock(&console_lock); spin_unlock(&console_lock);
#endif
ENABLE_TRACE; ENABLE_TRACE;
return i; return i;

View File

@ -76,6 +76,10 @@ static void prepare_ramstage_region(void *resume_backup_memory)
memset_((void*)0, 0, CONFIG_RAMTOP - backup_top); memset_((void*)0, 0, CONFIG_RAMTOP - backup_top);
} }
#if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK)
initialize_romstage_console_lock();
#endif
print_car_debug(" Done\n"); print_car_debug(" Done\n");
} }