[RFC linux dev-4.19] clocksource: fttmr010: Detect back-pressure for Aspeed controllers

Cédric Le Goater clg at kaod.org
Mon Jan 14 18:40:16 AEDT 2019


On 1/14/19 12:04 AM, Andrew Jeffery wrote:
> On Fri, 11 Jan 2019, at 19:36, Cédric Le Goater wrote:
>> On 1/11/19 4:36 AM, Andrew Jeffery wrote:
>>> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
>>
>> This patch should not have any impact on a real system where l == cycles.
>> It might be difficult to merge though.
> 
> I agree.
> 
> Note however that the qemu patches resolve the issue regardless of whether this
> patch to Linux is applied, just if it's not Linux will not be aware that the timer isn't
> behaving how Linux requested.

Indeed. I checked on a ppc64el.

> Maybe we live with that?

yes ! Could please send your QEMU patchset ?  
 
Thanks,

C. 


> Andrew
> 
>>
>> C. 
>>
>>> ---
>>>
>>> See the cover letter on the corresponding qemu RFC series, to be sent after
>>> this patch.
>>>
>>>  arch/arm/mach-aspeed/Kconfig         | 1 +
>>>  drivers/clocksource/timer-fttmr010.c | 7 +++++++
>>>  2 files changed, 8 insertions(+)
>>>
>>> diff --git a/arch/arm/mach-aspeed/Kconfig b/arch/arm/mach-aspeed/Kconfig
>>> index 2d5570e6e186..6b82d5416cf0 100644
>>> --- a/arch/arm/mach-aspeed/Kconfig
>>> +++ b/arch/arm/mach-aspeed/Kconfig
>>> @@ -7,6 +7,7 @@ menuconfig ARCH_ASPEED
>>>  	select FTTMR010_TIMER
>>>  	select MFD_SYSCON
>>>  	select PINCTRL
>>> +	select GENERIC_CLOCKEVENTS_MIN_ADJUST
>>>  	help
>>>  	  Say Y here if you want to run your kernel on an ASpeed BMC SoC.
>>>  
>>> diff --git a/drivers/clocksource/timer-fttmr010.c b/drivers/clocksource/timer-fttmr010.c
>>> index cf93f6419b51..f15386b98289 100644
>>> --- a/drivers/clocksource/timer-fttmr010.c
>>> +++ b/drivers/clocksource/timer-fttmr010.c
>>> @@ -124,6 +124,7 @@ static int fttmr010_timer_set_next_event(unsigned long cycles,
>>>  {
>>>  	struct fttmr010 *fttmr010 = to_fttmr010(evt);
>>>  	u32 cr;
>>> +	u32 l;
>>>  
>>>  	/* Stop */
>>>  	cr = readl(fttmr010->base + TIMER_CR);
>>> @@ -136,6 +137,12 @@ static int fttmr010_timer_set_next_event(unsigned long cycles,
>>>  		 * into TIMER1_COUNT register when the timer is re-enabled.
>>>  		 */
>>>  		writel(cycles, fttmr010->base + TIMER1_LOAD);
>>> +#if CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST> +		/* QEMU model may provide back-pressure on requested period */
>>> +		l = readl(fttmr010->base + TIMER1_LOAD);
>>> +		if (l > cycles)
>>> +			return -EINVAL;
>>> +#endif
>>>  	} else {
>>>  		/* Setup the match register forward in time */
>>>  		cr = readl(fttmr010->base + TIMER1_COUNT);
>>>
>>



More information about the openbmc mailing list