arm: omap4: fix some cpuidle/display issues
This commit is contained in:
parent
473f80087b
commit
e603107af6
3 changed files with 123 additions and 0 deletions
75
arm-omap4-fix-lack-of-time-interupts-after-hotplug.patch
Normal file
75
arm-omap4-fix-lack-of-time-interupts-after-hotplug.patch
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
From 50d6b3cf9403879911e06d69c7ef41e43f8f7b4b Mon Sep 17 00:00:00 2001
|
||||
From: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
Date: Wed, 12 Dec 2018 11:49:47 +0000
|
||||
Subject: ARM: OMAP2+: fix lack of timer interrupts on CPU1 after hotplug
|
||||
|
||||
If we have a kernel configured for periodic timer interrupts, and we
|
||||
have cpuidle enabled, then we end up with CPU1 losing timer interupts
|
||||
after a hotplug.
|
||||
|
||||
This can manifest itself in RCU stall warnings, or userspace becoming
|
||||
unresponsive.
|
||||
|
||||
The problem is that the kernel initially wants to use the TWD timer
|
||||
for interrupts, but the TWD loses context when we enter the C3 cpuidle
|
||||
state. Nothing reprograms the TWD after idle.
|
||||
|
||||
We have solved this in the past by switching to broadcast timer ticks,
|
||||
and cpuidle44xx switches to that mode at boot time. However, there is
|
||||
nothing to switch from periodic mode local timers after a hotplug
|
||||
operation.
|
||||
|
||||
We call tick_broadcast_enter() in omap_enter_idle_coupled(), which one
|
||||
would expect would take care of the issue, but internally this only
|
||||
deals with one-shot local timers - tick_broadcast_enable() on the other
|
||||
hand only deals with periodic local timers. So, we need to call both.
|
||||
|
||||
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
[tony@atomide.com: just standardized the subject line]
|
||||
Signed-off-by: Tony Lindgren <tony@atomide.com>
|
||||
---
|
||||
arch/arm/mach-omap2/cpuidle44xx.c | 16 ++++------------
|
||||
1 file changed, 4 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
|
||||
index a8b291f00109..dae514c8276a 100644
|
||||
--- a/arch/arm/mach-omap2/cpuidle44xx.c
|
||||
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
|
||||
@@ -152,6 +152,10 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
|
||||
mpuss_can_lose_context = (cx->mpu_state == PWRDM_POWER_RET) &&
|
||||
(cx->mpu_logic_state == PWRDM_POWER_OFF);
|
||||
|
||||
+ /* Enter broadcast mode for periodic timers */
|
||||
+ tick_broadcast_enable();
|
||||
+
|
||||
+ /* Enter broadcast mode for one-shot timers */
|
||||
tick_broadcast_enter();
|
||||
|
||||
/*
|
||||
@@ -218,15 +222,6 @@ fail:
|
||||
return index;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * For each cpu, setup the broadcast timer because local timers
|
||||
- * stops for the states above C1.
|
||||
- */
|
||||
-static void omap_setup_broadcast_timer(void *arg)
|
||||
-{
|
||||
- tick_broadcast_enable();
|
||||
-}
|
||||
-
|
||||
static struct cpuidle_driver omap4_idle_driver = {
|
||||
.name = "omap4_idle",
|
||||
.owner = THIS_MODULE,
|
||||
@@ -319,8 +314,5 @@ int __init omap4_idle_init(void)
|
||||
if (!cpu_clkdm[0] || !cpu_clkdm[1])
|
||||
return -ENODEV;
|
||||
|
||||
- /* Configure the broadcast timer on each cpu */
|
||||
- on_each_cpu(omap_setup_broadcast_timer, NULL, 1);
|
||||
-
|
||||
return cpuidle_register(idle_driver, cpu_online_mask);
|
||||
}
|
||||
--
|
||||
cgit 1.2-0.3.lf.el7
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
From dc30e70391376ba3987aeb856ae6d9c0706534f1 Mon Sep 17 00:00:00 2001
|
||||
From: Yizhuo <yzhai003@ucr.edu>
|
||||
Date: Fri, 25 Jan 2019 22:32:20 -0800
|
||||
Subject: ARM: OMAP2+: Variable "reg" in function omap4_dsi_mux_pads() could be
|
||||
uninitialized
|
||||
|
||||
In function omap4_dsi_mux_pads(), local variable "reg" could
|
||||
be uninitialized if function regmap_read() returns -EINVAL.
|
||||
However, it will be used directly in the later context, which
|
||||
is potentially unsafe.
|
||||
|
||||
Signed-off-by: Yizhuo <yzhai003@ucr.edu>
|
||||
Signed-off-by: Tony Lindgren <tony@atomide.com>
|
||||
---
|
||||
arch/arm/mach-omap2/display.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c
|
||||
index f86b72d1d59e..1444b4b4bd9f 100644
|
||||
--- a/arch/arm/mach-omap2/display.c
|
||||
+++ b/arch/arm/mach-omap2/display.c
|
||||
@@ -83,6 +83,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
|
||||
u32 enable_mask, enable_shift;
|
||||
u32 pipd_mask, pipd_shift;
|
||||
u32 reg;
|
||||
+ int ret;
|
||||
|
||||
if (dsi_id == 0) {
|
||||
enable_mask = OMAP4_DSI1_LANEENABLE_MASK;
|
||||
@@ -98,7 +99,11 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
- regmap_read(omap4_dsi_mux_syscon, OMAP4_DSIPHY_SYSCON_OFFSET, ®);
|
||||
+ ret = regmap_read(omap4_dsi_mux_syscon,
|
||||
+ OMAP4_DSIPHY_SYSCON_OFFSET,
|
||||
+ ®);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
reg &= ~enable_mask;
|
||||
reg &= ~pipd_mask;
|
||||
--
|
||||
cgit 1.2-0.3.lf.el7
|
||||
|
|
@ -583,6 +583,10 @@ Patch307: wlcore-sdio-Fixup-power-on-off-sequence.patch
|
|||
# https://patchwork.kernel.org/patch/10778815/
|
||||
Patch308: drm-enable-uncached-DMA-optimization-for-ARM-and-arm64.patch
|
||||
|
||||
# omap4 fixes
|
||||
Patch309: arm-omap4-fix-lack-of-time-interupts-after-hotplug.patch
|
||||
Patch310: arm-omap4-fix-omap4_dsi_mux_pads-uninitialized-variable.patch
|
||||
|
||||
# https://patchwork.kernel.org/patch/10686407/
|
||||
Patch331: raspberrypi-Fix-firmware-calls-with-large-buffers.patch
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue