From patchwork Mon Apr 9 05:24:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 896112 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Y6BSbCo4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40KJfp3LXRz9s29 for ; Mon, 9 Apr 2018 15:25:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752322AbeDIFZh (ORCPT ); Mon, 9 Apr 2018 01:25:37 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:44988 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752323AbeDIFZh (ORCPT ); Mon, 9 Apr 2018 01:25:37 -0400 Received: by mail-pf0-f193.google.com with SMTP id p15so5208073pff.11 for ; Sun, 08 Apr 2018 22:25:36 -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=C9vvMifHDr4ZXgUaBhMgMGxD83S/d15V7qdhAMadwbE=; b=Y6BSbCo4HQOEhnieU6+Jx3lyKP1c3kDDoOflq1Jxp3P5DF34jGgti0YGnXmzGgwt9h Nz3sMudfCnSNlsy8uxozsyqtPCFPsN/3OHzu4S9SkdT+Vt9nK+4aPEJh5quPQOW7Is99 xdd+xLPTvQdavsqsyWGo8EuIpwhc0x2H8oioKFXUg4aNaiS59J5ZaOqQnbY6hjpKy1RK To3BuYtHv9YpXGROIdeL13q0aN/CK4S8h/cGqK4CZ346xKYR4A+eIG+mUvuol0mejp5t ZCLzrlRcDC/PQSygPxFKHplkp4YlQ98QwrMYMXxnKKAgT2k33dEZ+rYSmPySq6HiTG/e FIdQ== 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=C9vvMifHDr4ZXgUaBhMgMGxD83S/d15V7qdhAMadwbE=; b=OSmpCDEfzbIEEveLIi/Clo3ToTRZoy6S37xQHKNE/idx/f716qHF1OsHwDN5xr07YN pBwiKQJAEyiLSesSdY77Ob/NUZri/NJdeKS5n47XxTDaRdIfRJrfaXTN1lPh/0zmRVRL DUUJEWcVzWGs0YFW9z9LzipsJ62/ZjpLfIz0M+nhvhhdwZ97jWX4kCzDwgcptPDAUOqA 7Siffy8vbaHrjiuEL3oOwIWjSoDqbx8Xa2D4pq7V40zwxJc0ZfGn8+XavhBy+MzhqNCw 47bDxCJ/A4MJ/iettxgi5phBuTVycQ89x8MZyOQ9RbeFWQ6lAwKX/LLRwlDlWGpbnBpY 5+1A== X-Gm-Message-State: AElRT7EPGmZSHKdkRlq8d5woSw7IcfkWXpMNxt//vWciFxyNXO3e0HLM wprLj/45vsCxjomys7JbCJInzw== X-Google-Smtp-Source: AIpwx48j2d5b0TtXJivMjcImqzHR56KQwmP/cDtfCLTd/jWUnlJt9myUIuKx2QFUmf0DYC6vF42Gog== X-Received: by 10.99.115.84 with SMTP id d20mr24092710pgn.362.1523251536541; Sun, 08 Apr 2018 22:25:36 -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 v7sm24464425pfm.147.2018.04.08.22.25.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 08 Apr 2018 22:25:35 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Cc: Nicholas Piggin , linux-rtc@vger.kernel.org Subject: [PATCH v2 2/9] powerpc/powernv: OPAL RTC driver standardise OPAL_BUSY loops Date: Mon, 9 Apr 2018 15:24:24 +1000 Message-Id: <20180409052431.26405-3-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180409052431.26405-1-npiggin@gmail.com> References: <20180409052431.26405-1-npiggin@gmail.com> Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org Convert to using the standard delay poll/delay form. The OPAL RTC driver: - Did not previously delay or sleep in the OPAL_BUSY_EVENT case. There have been scheduling delays of up to 50 seconds observed here (BMC reboot can do it), which this should fix. Cc: linux-rtc@vger.kernel.org Signed-off-by: Nicholas Piggin --- arch/powerpc/platforms/powernv/opal-rtc.c | 6 +++-- drivers/rtc/rtc-opal.c | 33 ++++++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/platforms/powernv/opal-rtc.c b/arch/powerpc/platforms/powernv/opal-rtc.c index f8868864f373..f530cf62594d 100644 --- a/arch/powerpc/platforms/powernv/opal-rtc.c +++ b/arch/powerpc/platforms/powernv/opal-rtc.c @@ -48,10 +48,12 @@ unsigned long __init opal_get_boot_time(void) while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); - if (rc == OPAL_BUSY_EVENT) + if (rc == OPAL_BUSY_EVENT) { + mdelay(OPAL_BUSY_DELAY_MS); opal_poll_events(NULL); - else if (rc == OPAL_BUSY) + } else if (rc == OPAL_BUSY) { mdelay(10); + } } if (rc != OPAL_SUCCESS) return 0; diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c index 304e891e35fc..cddcc4749d39 100644 --- a/drivers/rtc/rtc-opal.c +++ b/drivers/rtc/rtc-opal.c @@ -57,7 +57,7 @@ static void tm_to_opal(struct rtc_time *tm, u32 *y_m_d, u64 *h_m_s_ms) static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) { - long rc = OPAL_BUSY; + s64 rc = OPAL_BUSY; int retries = 10; u32 y_m_d; u64 h_m_s_ms; @@ -66,13 +66,17 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); - if (rc == OPAL_BUSY_EVENT) + if (rc == OPAL_BUSY_EVENT) { + msleep(OPAL_BUSY_DELAY_MS); opal_poll_events(NULL); - else if (retries-- && (rc == OPAL_HARDWARE - || rc == OPAL_INTERNAL_ERROR)) + } else if (rc == OPAL_BUSY) { msleep(10); - else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) - break; + } else if (rc == OPAL_HARDWARE || rc == OPAL_INTERNAL_ERROR) { + if (retries--) { + msleep(10); /* Wait 10ms before retry */ + rc = OPAL_BUSY; /* go around again */ + } + } } if (rc != OPAL_SUCCESS) @@ -87,21 +91,26 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm) { - long rc = OPAL_BUSY; + s64 rc = OPAL_BUSY; int retries = 10; u32 y_m_d = 0; u64 h_m_s_ms = 0; tm_to_opal(tm, &y_m_d, &h_m_s_ms); + while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { rc = opal_rtc_write(y_m_d, h_m_s_ms); - if (rc == OPAL_BUSY_EVENT) + if (rc == OPAL_BUSY_EVENT) { + msleep(OPAL_BUSY_DELAY_MS); opal_poll_events(NULL); - else if (retries-- && (rc == OPAL_HARDWARE - || rc == OPAL_INTERNAL_ERROR)) + } else if (rc == OPAL_BUSY) { msleep(10); - else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) - break; + } else if (rc == OPAL_HARDWARE || rc == OPAL_INTERNAL_ERROR) { + if (retries--) { + msleep(10); /* Wait 10ms before retry */ + rc = OPAL_BUSY; /* go around again */ + } + } } return rc == OPAL_SUCCESS ? 0 : -EIO;