2015-11-27 19:48:09

by Grygorii Strashko

[permalink] [raw]
Subject: [PATCH v3] clocksource: arm_global_timer: fix suspend resume

Now the System stall is observed on TI AM437x based board
(am437x-gp-evm) during resuming from System suspend when ARM Global
timer is selected as clocksource device (CPUIdle not enabled) - SysRq are working,
but nothing else.

The reason of stall is that ARM Global timer loses its contexts during
System suspend:
GT_CONTROL.TIMER_ENABLE = 0 (unbanked)
GT_COUNTERx = 0

Hence, update ARM Global timer driver to reflect above behaviour
- re-enable ARM Global timer on resume GT_CONTROL.TIMER_ENABLE = 1.

CC: Arnd Bergmann <[email protected]>
Cc: John Stultz <[email protected]>
Cc: Felipe Balbi <[email protected]>
Cc: Tony Lindgren <[email protected]>
Cc: Santosh Shilimkar <[email protected]>
Cc: Marc Zyngier <[email protected]>
Signed-off-by: Grygorii Strashko <[email protected]>
---
Changes in v3:
- dropped all DT specific code
Changes in v2:
- suspend/resume simplified: nothing is stored any more and
ARM GT just re-enabled
Link on v2:
https://lkml.org/lkml/2015/11/20/355
Link on v1:
https://lkml.org/lkml/2015/11/13/456

drivers/clocksource/arm_global_timer.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
index a2cb6fa..10d1417 100644
--- a/drivers/clocksource/arm_global_timer.c
+++ b/drivers/clocksource/arm_global_timer.c
@@ -195,12 +195,19 @@ static cycle_t gt_clocksource_read(struct clocksource *cs)
return gt_counter_read();
}

+static void gt_resume(struct clocksource *cs)
+{
+ /* re-enable timer on resume */
+ writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);
+}
+
static struct clocksource gt_clocksource = {
.name = "arm_global_timer",
.rating = 300,
.read = gt_clocksource_read,
.mask = CLOCKSOURCE_MASK(64),
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
+ .resume = gt_resume,
};

#ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
--
2.6.3


2015-11-30 00:31:05

by Santosh Shilimkar

[permalink] [raw]
Subject: Re: [PATCH v3] clocksource: arm_global_timer: fix suspend resume

On 11/27/15 11:47 AM, Grygorii Strashko wrote:
> Now the System stall is observed on TI AM437x based board
> (am437x-gp-evm) during resuming from System suspend when ARM Global
> timer is selected as clocksource device (CPUIdle not enabled) - SysRq are working,
> but nothing else.
>
> The reason of stall is that ARM Global timer loses its contexts during
> System suspend:
> GT_CONTROL.TIMER_ENABLE = 0 (unbanked)
> GT_COUNTERx = 0
>
> Hence, update ARM Global timer driver to reflect above behaviour
> - re-enable ARM Global timer on resume GT_CONTROL.TIMER_ENABLE = 1.
>
> CC: Arnd Bergmann <[email protected]>
> Cc: John Stultz <[email protected]>
> Cc: Felipe Balbi <[email protected]>
> Cc: Tony Lindgren <[email protected]>
> Cc: Santosh Shilimkar <[email protected]>
> Cc: Marc Zyngier <[email protected]>
> Signed-off-by: Grygorii Strashko <[email protected]>
> ---
> Changes in v3:
> - dropped all DT specific code
> Changes in v2:
> - suspend/resume simplified: nothing is stored any more and
> ARM GT just re-enabled
> Link on v2:
> https://lkml.org/lkml/2015/11/20/355
> Link on v1:
> https://lkml.org/lkml/2015/11/13/456
>
Looks reasonable to me.
> drivers/clocksource/arm_global_timer.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
> index a2cb6fa..10d1417 100644
> --- a/drivers/clocksource/arm_global_timer.c
> +++ b/drivers/clocksource/arm_global_timer.c
> @@ -195,12 +195,19 @@ static cycle_t gt_clocksource_read(struct clocksource *cs)
> return gt_counter_read();
> }
>
> +static void gt_resume(struct clocksource *cs)
> +{
> + /* re-enable timer on resume */
> + writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);

Check if its disabled before enabling it.
Other than that,
Reviewed-by: Santosh Shilimkar <[email protected]>

2015-11-30 11:52:53

by Grygorii Strashko

[permalink] [raw]
Subject: Re: [PATCH v3] clocksource: arm_global_timer: fix suspend resume

On 11/30/2015 02:29 AM, [email protected] wrote:
> On 11/27/15 11:47 AM, Grygorii Strashko wrote:
>> Now the System stall is observed on TI AM437x based board
>> (am437x-gp-evm) during resuming from System suspend when ARM Global
>> timer is selected as clocksource device (CPUIdle not enabled) - SysRq
>> are working,
>> but nothing else.
>>
>> The reason of stall is that ARM Global timer loses its contexts during
>> System suspend:
>> GT_CONTROL.TIMER_ENABLE = 0 (unbanked)
>> GT_COUNTERx = 0
>>
>> Hence, update ARM Global timer driver to reflect above behaviour
>> - re-enable ARM Global timer on resume GT_CONTROL.TIMER_ENABLE = 1.
>>
>> CC: Arnd Bergmann <[email protected]>
>> Cc: John Stultz <[email protected]>
>> Cc: Felipe Balbi <[email protected]>
>> Cc: Tony Lindgren <[email protected]>
>> Cc: Santosh Shilimkar <[email protected]>
>> Cc: Marc Zyngier <[email protected]>
>> Signed-off-by: Grygorii Strashko <[email protected]>
>> ---
>> Changes in v3:
>> - dropped all DT specific code
>> Changes in v2:
>> - suspend/resume simplified: nothing is stored any more and
>> ARM GT just re-enabled
>> Link on v2:
>> https://lkml.org/lkml/2015/11/20/355
>> Link on v1:
>> https://lkml.org/lkml/2015/11/13/456
>>
> Looks reasonable to me.
>> drivers/clocksource/arm_global_timer.c | 7 +++++++
>> 1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/clocksource/arm_global_timer.c
>> b/drivers/clocksource/arm_global_timer.c
>> index a2cb6fa..10d1417 100644
>> --- a/drivers/clocksource/arm_global_timer.c
>> +++ b/drivers/clocksource/arm_global_timer.c
>> @@ -195,12 +195,19 @@ static cycle_t gt_clocksource_read(struct
>> clocksource *cs)
>> return gt_counter_read();
>> }
>>
>> +static void gt_resume(struct clocksource *cs)
>> +{
>> + /* re-enable timer on resume */
>> + writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);
>
> Check if its disabled before enabling it.
> Other than that,
> Reviewed-by: Santosh Shilimkar <[email protected]>

Sure, I'll update.

Thanks.
--
regards,
-grygorii