Received: by 10.192.165.148 with SMTP id m20csp3882243imm; Mon, 30 Apr 2018 08:00:04 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpuivqwi0HK8/fdPe+VSKSOLkeutzWd4Kd4hBXzZ8rqBVCK+7Mmxl6UGa0lcdN9gH8nLq0A X-Received: by 10.98.222.2 with SMTP id h2mr10383376pfg.205.1525100404374; Mon, 30 Apr 2018 08:00:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525100404; cv=none; d=google.com; s=arc-20160816; b=Fy/h9HFiezhxqiVbDHxrUGSvd5RXSeXBwv97M5ZD7hn86oPvY05UhPtRfEshthXXmf DQB1zYhBUHCEoZZwt7CU/x75FXvvpTn8I4i4Lf6VYLKCqXU8qRufaAwqS7h477cU5GXe ZkmczY9rdWMhgj205YaacW0OXngni1mE2zMsmlFRkSufv/waOIQZyhTLJ53lyHoOyQON 5PtC3oISNKWDJDaOpqH1GlryNvN9MdsPhwBKxnS1XRO3Rtos0VIFfzU51JZRT+QYLUPH eMCTvuG8FYQnsBX7VW6mgj5zhF97ooXAqE0V1coDbfjqVQoaomCfn60eMXICNVB/lUPU Hhgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=9VWdaNcBe168QUlocAIIDT1HHLHdwjg/FSD6ADUNg4g=; b=u/zI1f6/lGAkDzwBN9yFi9jmVo6Lwd5aks5NLu2+ES3hhXF0HBRTw5Kv3N1InaTZCN KZzx1Wap6rboZ3YMcxeKugiebM5iuv46mY1TLhya4fnSXM6NEvrLIkGCIz0fVmef8nwj 0V8EWm1spB51yPwP46+gOYHzWti8pKpaUwllPackGXRDzLzguq9sfg8q8kmLqARwl6oz VDqZS+9+5TRLIg/E/J5O0HPyf/U4TUEmoMpGFt+Ulo99zSRZGWO6e4XXcmO/yQxMYmqi Q2NtPO/DjRAeWNHGB31WZTzETKhemJdXj/5rc7PwSMCOhgDmdOgHcF+XPuE5DoFR/L30 0n/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JgBw+ZRu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q4-v6si6252489pgn.685.2018.04.30.07.59.50; Mon, 30 Apr 2018 08:00:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JgBw+ZRu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754626AbeD3O4c (ORCPT + 99 others); Mon, 30 Apr 2018 10:56:32 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:41070 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754500AbeD3O42 (ORCPT ); Mon, 30 Apr 2018 10:56:28 -0400 Received: by mail-pf0-f195.google.com with SMTP id v63so6924833pfk.8 for ; Mon, 30 Apr 2018 07:56:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9VWdaNcBe168QUlocAIIDT1HHLHdwjg/FSD6ADUNg4g=; b=JgBw+ZRuNiNKm1YG1REMYTQscfLJxhv7zcxnB4rjXxpcMyonw/kp3kPV9RSHOJUVrK OevZ9M2yROzGgw5JZP58k3PvdWWBoPlF0GtmTGizE+DY+RzaEhRl26Hus+dnQ7f1FCbX 84BzARnE0/jBRsm5NNokxpkwSu8Qu2nN3uUm20PAnvz0LvWB1T+BcDj/WdD7XVZp322Z ZdlPAr1sWjoHfAEgUT7JohhI+3oxk7fLXxHURJHi+cxqargc5NBsaor+uLcnzEFuYWo5 qu1YUF5KuOPBKSZCf0p5E6O36rffg/n5uP6ZGTpp8LpOyHbNY7QC8oTHCJ5ityznMDu7 iiAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9VWdaNcBe168QUlocAIIDT1HHLHdwjg/FSD6ADUNg4g=; b=d5jZitjVHQpaeOZTxp3O2Zon/kk6mu9ijAhcdcKZNBi7KrjCJm0cEcmIF3qxQxfJxx vjIOSii/p2dhupuFX3V0YqS1iQPG11v/CmLpJc1hkchJSaeb0AMLQQx/sEbTlEu+dal/ seohRuUspkI9IOZ3cNYlWff0vvsstsfEU9UA+5H5imI6JCSyUK2wvH7++WbbNRVks5+U U3XDQM7Iqt5AqCDj1F+Np46bMAWhRWblqe7tcYeTimJdyoLOLjKQPosf4ZrgTtMn4ehv F1MHxUpJ0oWnAKpAr1U1NIFsTvvFB9ykgWh9f4RQoZgkNy3Kl8lLfEKGfK32GBRKPR7z k+3Q== X-Gm-Message-State: ALQs6tAn4fRVmO6+kJpjszQMtEJ4PUDMZ+wwbNQGkQ6aWzi9eO72sKwF iqS625U6h3rnnL+L/nmbmW5R8A== X-Received: by 2002:a17:902:28ab:: with SMTP id f40-v6mr12740529plb.208.1525100187884; Mon, 30 Apr 2018 07:56:27 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id a12sm19132534pfe.78.2018.04.30.07.56.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Apr 2018 07:56:27 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Cc: Nicholas Piggin , Benjamin Herrenschmidt , Greg Kroah-Hartman , Jiri Slaby , linux-kernel@vger.kernel.org Subject: [PATCH 05/15] powerpc/powernv: Implement and use opal_flush_console Date: Tue, 1 May 2018 00:55:48 +1000 Message-Id: <20180430145558.4308-6-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180430145558.4308-1-npiggin@gmail.com> References: <20180430145558.4308-1-npiggin@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A new console flushing firmware API was introduced to replace event polling loops, and implemented in opal-kmsg with affddff69c55e ("powerpc/powernv: Add a kmsg_dumper that flushes console output on panic"), to flush the console in the panic path. The OPAL console driver has other situations where interrupts are off and it needs to flush the console synchronously. These still use a polling loop. So move the opal-kmsg flush code to opal_flush_console, and use the new function in opal-kmsg and opal_put_chars. Cc: Benjamin Herrenschmidt Reviewed-by: Russell Currey Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/opal.h | 1 + arch/powerpc/platforms/powernv/opal-kmsg.c | 35 ++---------------- arch/powerpc/platforms/powernv/opal.c | 42 +++++++++++++++++++--- 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 03e1a920491e..bbff49fab0e5 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -303,6 +303,7 @@ extern void opal_configure_cores(void); extern int opal_get_chars(uint32_t vtermno, char *buf, int count); extern int opal_put_chars(uint32_t vtermno, const char *buf, int total_len); +extern int opal_flush_console(uint32_t vtermno); extern void hvc_opal_init_early(void); diff --git a/arch/powerpc/platforms/powernv/opal-kmsg.c b/arch/powerpc/platforms/powernv/opal-kmsg.c index fd2bbf4fd6dc..55691950d981 100644 --- a/arch/powerpc/platforms/powernv/opal-kmsg.c +++ b/arch/powerpc/platforms/powernv/opal-kmsg.c @@ -12,7 +12,6 @@ */ #include -#include #include #include @@ -24,11 +23,9 @@ * may not be completely printed. This function does not actually dump the * message, it just ensures that OPAL completely flushes the console buffer. */ -static void force_opal_console_flush(struct kmsg_dumper *dumper, +static void kmsg_dump_opal_console_flush(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason) { - s64 rc; - /* * Outside of a panic context the pollers will continue to run, * so we don't need to do any special flushing. @@ -36,37 +33,11 @@ static void force_opal_console_flush(struct kmsg_dumper *dumper, if (reason != KMSG_DUMP_PANIC) return; - if (opal_check_token(OPAL_CONSOLE_FLUSH)) { - do { - rc = OPAL_BUSY; - while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { - rc = opal_console_flush(0); - if (rc == OPAL_BUSY_EVENT) { - mdelay(OPAL_BUSY_DELAY_MS); - opal_poll_events(NULL); - } else if (rc == OPAL_BUSY) { - mdelay(OPAL_BUSY_DELAY_MS); - } - } - } while (rc == OPAL_PARTIAL); /* More to flush */ - - } else { - __be64 evt; - - WARN_ONCE(1, "opal: OPAL_CONSOLE_FLUSH missing.\n"); - /* - * If OPAL_CONSOLE_FLUSH is not implemented in the firmware, - * the console can still be flushed by calling the polling - * function while it has OPAL_EVENT_CONSOLE_OUTPUT events. - */ - do { - opal_poll_events(&evt); - } while (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT); - } + opal_flush_console(0); } static struct kmsg_dumper opal_kmsg_dumper = { - .dump = force_opal_console_flush + .dump = kmsg_dump_opal_console_flush }; void __init opal_kmsg_init(void) diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 6b621d47ac29..6640fccbf30c 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -350,7 +350,6 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) __be64 olen; s64 len, rc; unsigned long flags; - __be64 evt; if (!opal.entry) return -ENODEV; @@ -371,7 +370,7 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) /* Closed -> drop characters */ if (rc) return total_len; - opal_poll_events(NULL); + opal_flush_console(vtermno); return -EAGAIN; } @@ -410,12 +409,47 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) * things a bit later to limit that to synchronous path * such as the kernel console and xmon/udbg */ + opal_flush_console(vtermno); + } + spin_unlock_irqrestore(&opal_write_lock, flags); + + return written; +} + +int opal_flush_console(uint32_t vtermno) +{ + s64 rc; + + if (!opal_check_token(OPAL_CONSOLE_FLUSH)) { + __be64 evt; + + WARN_ONCE(1, "opal: OPAL_CONSOLE_FLUSH missing.\n"); + /* + * If OPAL_CONSOLE_FLUSH is not implemented in the firmware, + * the console can still be flushed by calling the polling + * function while it has OPAL_EVENT_CONSOLE_OUTPUT events. + */ do { opal_poll_events(&evt); } while (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT); + + return OPAL_SUCCESS; } - spin_unlock_irqrestore(&opal_write_lock, flags); - return written; + + do { + rc = OPAL_BUSY; + while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { + rc = opal_console_flush(vtermno); + if (rc == OPAL_BUSY_EVENT) { + mdelay(OPAL_BUSY_DELAY_MS); + opal_poll_events(NULL); + } else if (rc == OPAL_BUSY) { + mdelay(OPAL_BUSY_DELAY_MS); + } + } + } while (rc == OPAL_PARTIAL); /* More to flush */ + + return opal_error_code(rc); } static int opal_recover_mce(struct pt_regs *regs, -- 2.17.0