linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] powerpc/mpic_timer: fix the time calculation is not accurate
@ 2013-12-23  2:33 Dongsheng Wang
  2013-12-27 23:59 ` Scott Wood
  0 siblings, 1 reply; 3+ messages in thread
From: Dongsheng Wang @ 2013-12-23  2:33 UTC (permalink / raw)
  To: scottwood, galak; +Cc: linuxppc-dev, Wang Dongsheng

From: Wang Dongsheng <dongsheng.wang@freescale.com>

When the timer GTCCR toggle bit is inverted, we calculated the rest
of the time is not accurate. So we need to ignore this bit.

Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>

diff --git a/arch/powerpc/sysdev/mpic_timer.c b/arch/powerpc/sysdev/mpic_timer.c
index 22d7d57..0fb70c9 100644
--- a/arch/powerpc/sysdev/mpic_timer.c
+++ b/arch/powerpc/sysdev/mpic_timer.c
@@ -41,6 +41,7 @@
 #define MPIC_TIMER_TCR_ROVR_OFFSET	24
 
 #define TIMER_STOP			0x80000000
+#define GTCCR_TOG			0x80000000
 #define TIMERS_PER_GROUP		4
 #define MAX_TICKS			(~0U >> 1)
 #define MAX_TICKS_CASCADE		(~0U)
@@ -96,8 +97,15 @@ static void convert_ticks_to_time(struct timer_group_priv *priv,
 	time->tv_sec = (__kernel_time_t)div_u64(ticks, priv->timerfreq);
 	tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq;
 
-	time->tv_usec = (__kernel_suseconds_t)
-		div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq);
+	time->tv_usec = 0;
+
+	/*
+	 * In some cases tmp_sec may be greater than ticks, because in the
+	 * process of calculation ticks and tmp_sec will be rounded.
+	 */
+	if (tmp_sec <= ticks)
+		time->tv_usec = (__kernel_suseconds_t)
+			div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq);
 
 	return;
 }
@@ -327,11 +335,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time)
 	casc_priv = priv->timer[handle->num].cascade_handle;
 	if (casc_priv) {
 		tmp_ticks = in_be32(&priv->regs[handle->num].gtccr);
+		tmp_ticks &= ~GTCCR_TOG;
 		ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE;
 		tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr);
 		ticks += tmp_ticks;
 	} else {
 		ticks = in_be32(&priv->regs[handle->num].gtccr);
+		ticks &= ~GTCCR_TOG;
 	}
 
 	convert_ticks_to_time(priv, ticks, time);
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] powerpc/mpic_timer: fix the time calculation is not accurate
  2013-12-23  2:33 [PATCH] powerpc/mpic_timer: fix the time calculation is not accurate Dongsheng Wang
@ 2013-12-27 23:59 ` Scott Wood
  2013-12-30  2:21   ` Dongsheng.Wang
  0 siblings, 1 reply; 3+ messages in thread
From: Scott Wood @ 2013-12-27 23:59 UTC (permalink / raw)
  To: Dongsheng Wang; +Cc: linuxppc-dev

On Mon, 2013-12-23 at 10:33 +0800, Dongsheng Wang wrote:
> From: Wang Dongsheng <dongsheng.wang@freescale.com>
> 
> When the timer GTCCR toggle bit is inverted, we calculated the rest
> of the time is not accurate. So we need to ignore this bit.
> 
> Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> 
> diff --git a/arch/powerpc/sysdev/mpic_timer.c b/arch/powerpc/sysdev/mpic_timer.c
> index 22d7d57..0fb70c9 100644
> --- a/arch/powerpc/sysdev/mpic_timer.c
> +++ b/arch/powerpc/sysdev/mpic_timer.c
> @@ -41,6 +41,7 @@
>  #define MPIC_TIMER_TCR_ROVR_OFFSET	24
>  
>  #define TIMER_STOP			0x80000000
> +#define GTCCR_TOG			0x80000000
>  #define TIMERS_PER_GROUP		4
>  #define MAX_TICKS			(~0U >> 1)
>  #define MAX_TICKS_CASCADE		(~0U)
> @@ -96,8 +97,15 @@ static void convert_ticks_to_time(struct timer_group_priv *priv,
>  	time->tv_sec = (__kernel_time_t)div_u64(ticks, priv->timerfreq);
>  	tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq;
>  
> -	time->tv_usec = (__kernel_suseconds_t)
> -		div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq);
> +	time->tv_usec = 0;
> +
> +	/*
> +	 * In some cases tmp_sec may be greater than ticks, because in the
> +	 * process of calculation ticks and tmp_sec will be rounded.
> +	 */
> +	if (tmp_sec <= ticks)
> +		time->tv_usec = (__kernel_suseconds_t)
> +			div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq);

I don't see how this part of the patch relates to the patch description.

-Scott

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH] powerpc/mpic_timer: fix the time calculation is not accurate
  2013-12-27 23:59 ` Scott Wood
@ 2013-12-30  2:21   ` Dongsheng.Wang
  0 siblings, 0 replies; 3+ messages in thread
From: Dongsheng.Wang @ 2013-12-30  2:21 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev@lists.ozlabs.org

DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogV29vZCBTY290dC1CMDc0
MjENCj4gU2VudDogU2F0dXJkYXksIERlY2VtYmVyIDI4LCAyMDEzIDg6MDAgQU0NCj4gVG86IFdh
bmcgRG9uZ3NoZW5nLUI0MDUzNA0KPiBDYzogZ2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZzsgbGlu
dXhwcGMtZGV2QGxpc3RzLm96bGFicy5vcmcNCj4gU3ViamVjdDogUmU6IFtQQVRDSF0gcG93ZXJw
Yy9tcGljX3RpbWVyOiBmaXggdGhlIHRpbWUgY2FsY3VsYXRpb24gaXMgbm90DQo+IGFjY3VyYXRl
DQo+IA0KPiBPbiBNb24sIDIwMTMtMTItMjMgYXQgMTA6MzMgKzA4MDAsIERvbmdzaGVuZyBXYW5n
IHdyb3RlOg0KPiA+IEZyb206IFdhbmcgRG9uZ3NoZW5nIDxkb25nc2hlbmcud2FuZ0BmcmVlc2Nh
bGUuY29tPg0KPiA+DQo+ID4gV2hlbiB0aGUgdGltZXIgR1RDQ1IgdG9nZ2xlIGJpdCBpcyBpbnZl
cnRlZCwgd2UgY2FsY3VsYXRlZCB0aGUgcmVzdCBvZg0KPiA+IHRoZSB0aW1lIGlzIG5vdCBhY2N1
cmF0ZS4gU28gd2UgbmVlZCB0byBpZ25vcmUgdGhpcyBiaXQuDQo+ID4NCj4gPiBTaWduZWQtb2Zm
LWJ5OiBXYW5nIERvbmdzaGVuZyA8ZG9uZ3NoZW5nLndhbmdAZnJlZXNjYWxlLmNvbT4NCj4gPg0K
PiA+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfdGltZXIuYw0KPiA+IGIv
YXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX3RpbWVyLmMNCj4gPiBpbmRleCAyMmQ3ZDU3Li4wZmI3
MGM5IDEwMDY0NA0KPiA+IC0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY190aW1lci5jDQo+
ID4gKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX3RpbWVyLmMNCj4gPiBAQCAtNDEsNiAr
NDEsNyBAQA0KPiA+ICAjZGVmaW5lIE1QSUNfVElNRVJfVENSX1JPVlJfT0ZGU0VUCTI0DQo+ID4N
Cj4gPiAgI2RlZmluZSBUSU1FUl9TVE9QCQkJMHg4MDAwMDAwMA0KPiA+ICsjZGVmaW5lIEdUQ0NS
X1RPRwkJCTB4ODAwMDAwMDANCj4gPiAgI2RlZmluZSBUSU1FUlNfUEVSX0dST1VQCQk0DQo+ID4g
ICNkZWZpbmUgTUFYX1RJQ0tTCQkJKH4wVSA+PiAxKQ0KPiA+ICAjZGVmaW5lIE1BWF9USUNLU19D
QVNDQURFCQkofjBVKQ0KPiA+IEBAIC05Niw4ICs5NywxNSBAQCBzdGF0aWMgdm9pZCBjb252ZXJ0
X3RpY2tzX3RvX3RpbWUoc3RydWN0IHRpbWVyX2dyb3VwX3ByaXYNCj4gKnByaXYsDQo+ID4gIAl0
aW1lLT50dl9zZWMgPSAoX19rZXJuZWxfdGltZV90KWRpdl91NjQodGlja3MsIHByaXYtPnRpbWVy
ZnJlcSk7DQo+ID4gIAl0bXBfc2VjID0gKHU2NCl0aW1lLT50dl9zZWMgKiAodTY0KXByaXYtPnRp
bWVyZnJlcTsNCj4gPg0KPiA+IC0JdGltZS0+dHZfdXNlYyA9IChfX2tlcm5lbF9zdXNlY29uZHNf
dCkNCj4gPiAtCQlkaXZfdTY0KCh0aWNrcyAtIHRtcF9zZWMpICogMTAwMDAwMCwgcHJpdi0+dGlt
ZXJmcmVxKTsNCj4gPiArCXRpbWUtPnR2X3VzZWMgPSAwOw0KPiA+ICsNCj4gPiArCS8qDQo+ID4g
KwkgKiBJbiBzb21lIGNhc2VzIHRtcF9zZWMgbWF5IGJlIGdyZWF0ZXIgdGhhbiB0aWNrcywgYmVj
YXVzZSBpbiB0aGUNCj4gPiArCSAqIHByb2Nlc3Mgb2YgY2FsY3VsYXRpb24gdGlja3MgYW5kIHRt
cF9zZWMgd2lsbCBiZSByb3VuZGVkLg0KPiA+ICsJICovDQo+ID4gKwlpZiAodG1wX3NlYyA8PSB0
aWNrcykNCj4gPiArCQl0aW1lLT50dl91c2VjID0gKF9fa2VybmVsX3N1c2Vjb25kc190KQ0KPiA+
ICsJCQlkaXZfdTY0KCh0aWNrcyAtIHRtcF9zZWMpICogMTAwMDAwMCwgcHJpdi0+dGltZXJmcmVx
KTsNCj4gDQo+IEkgZG9uJ3Qgc2VlIGhvdyB0aGlzIHBhcnQgb2YgdGhlIHBhdGNoIHJlbGF0ZXMg
dG8gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLg0KPiANClRoYW5rcywgSSBtaXNzIHRoaXMgZGVzY3Jp
cHRpb24sIDooLg0KSSBzaG91bGQgc3BsaXQgdGhlIHBhdGNoLg0KDQotRG9uZ3NoZW5nDQoNCj4g
LVNjb3R0DQo+IA0KDQo=

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-12-30  2:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-23  2:33 [PATCH] powerpc/mpic_timer: fix the time calculation is not accurate Dongsheng Wang
2013-12-27 23:59 ` Scott Wood
2013-12-30  2:21   ` Dongsheng.Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).