summaryrefslogtreecommitdiff
path: root/arch/powerpc/boot/opal.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2016-12-11 13:07:13 +0100
committerIngo Molnar <mingo@kernel.org>2016-12-11 13:07:13 +0100
commit6f38751510073cc054c5dffc3339b22f9385ceed (patch)
treeb7704b2d3388293118a6794f7a858e8891bcec60 /arch/powerpc/boot/opal.c
parentf4ec57b632fe15ed7a355099cb96ed4b647416de (diff)
parent045169816b31b10faed984b01c390db1b32ee4c1 (diff)
Merge branch 'linus' into locking/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/powerpc/boot/opal.c')
-rw-r--r--arch/powerpc/boot/opal.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/powerpc/boot/opal.c b/arch/powerpc/boot/opal.c
index 1f37e1c1d6d8..0272570d02de 100644
--- a/arch/powerpc/boot/opal.c
+++ b/arch/powerpc/boot/opal.c
@@ -13,7 +13,7 @@
#include <libfdt.h>
#include "../include/asm/opal-api.h"
-#ifdef __powerpc64__
+#ifdef CONFIG_PPC64_BOOT_WRAPPER
/* Global OPAL struct used by opal-call.S */
struct opal {
@@ -23,14 +23,25 @@ struct opal {
static u32 opal_con_id;
+/* see opal-wrappers.S */
int64_t opal_console_write(int64_t term_number, u64 *length, const u8 *buffer);
int64_t opal_console_read(int64_t term_number, uint64_t *length, u8 *buffer);
int64_t opal_console_write_buffer_space(uint64_t term_number, uint64_t *length);
int64_t opal_console_flush(uint64_t term_number);
int64_t opal_poll_events(uint64_t *outstanding_event_mask);
+void opal_kentry(unsigned long fdt_addr, void *vmlinux_addr);
+
static int opal_con_open(void)
{
+ /*
+ * When OPAL loads the boot kernel it stashes the OPAL base and entry
+ * address in r8 and r9 so the kernel can use the OPAL console
+ * before unflattening the devicetree. While executing the wrapper will
+ * probably trash r8 and r9 so this kentry hook restores them before
+ * entering the decompressed kernel.
+ */
+ platform_ops.kentry = opal_kentry;
return 0;
}