summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/powernv/opal-rtc.c
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2018-04-10 13:49:32 +0200
committerMichael Ellerman <mpe@ellerman.id.au>2018-04-25 05:24:13 +0200
commit682e6b4da5cbe8e9a53f979a58c2a9d7dc997175 (patch)
tree25b4eb837ae2f09cfd0ba5a54dc975fa0cfcaa92 /arch/powerpc/platforms/powernv/opal-rtc.c
parentpowerpc/mce: Fix a bug where mce loops on memory UE. (diff)
downloadlinux-682e6b4da5cbe8e9a53f979a58c2a9d7dc997175.tar.xz
linux-682e6b4da5cbe8e9a53f979a58c2a9d7dc997175.zip
rtc: opal: Fix OPAL RTC driver OPAL_BUSY loops
The OPAL RTC driver does not sleep in case it gets OPAL_BUSY or OPAL_BUSY_EVENT from firmware, which causes large scheduling latencies, up to 50 seconds have been observed here when RTC stops responding (BMC reboot can do it). Fix this by converting it to the standard form OPAL_BUSY loop that sleeps. Fixes: 628daa8d5abf ("powerpc/powernv: Add RTC and NVRAM support plus RTAS fallbacks") Cc: stable@vger.kernel.org # v3.2+ Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/platforms/powernv/opal-rtc.c')
-rw-r--r--arch/powerpc/platforms/powernv/opal-rtc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/powerpc/platforms/powernv/opal-rtc.c b/arch/powerpc/platforms/powernv/opal-rtc.c
index f8868864f373..aa2a5139462e 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)
- mdelay(10);
+ } else if (rc == OPAL_BUSY) {
+ mdelay(OPAL_BUSY_DELAY_MS);
+ }
}
if (rc != OPAL_SUCCESS)
return 0;