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:
parent
a09bb426d4
commit
44d5342835
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue