1 /* 2 * kmsg dumper that ensures the OPAL console fully flushes panic messages 3 * 4 * Author: Russell Currey <ruscur@russell.cc> 5 * 6 * Copyright 2015 IBM Corporation. 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 */ 13 14 #include <linux/kmsg_dump.h> 15 16 #include <asm/opal.h> 17 #include <asm/opal-api.h> 18 19 /* 20 * Console output is controlled by OPAL firmware. The kernel regularly calls 21 * OPAL_POLL_EVENTS, which flushes some console output. In a panic state, 22 * however, the kernel no longer calls OPAL_POLL_EVENTS and the panic message 23 * may not be completely printed. This function does not actually dump the 24 * message, it just ensures that OPAL completely flushes the console buffer. 25 */ 26 static void kmsg_dump_opal_console_flush(struct kmsg_dumper *dumper, 27 enum kmsg_dump_reason reason) 28 { 29 /* 30 * Outside of a panic context the pollers will continue to run, 31 * so we don't need to do any special flushing. 32 */ 33 if (reason != KMSG_DUMP_PANIC) 34 return; 35 36 opal_flush_console(0); 37 } 38 39 static struct kmsg_dumper opal_kmsg_dumper = { 40 .dump = kmsg_dump_opal_console_flush 41 }; 42 43 void __init opal_kmsg_init(void) 44 { 45 int rc; 46 47 /* Add our dumper to the list */ 48 rc = kmsg_dump_register(&opal_kmsg_dumper); 49 if (rc != 0) 50 pr_err("opal: kmsg_dump_register failed; returned %d\n", rc); 51 } 52