All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations
@ 2009-11-23 17:33 Kevin Hilman
  2009-11-23 17:33 ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Kevin Hilman
  2009-12-01 12:55 ` [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Paul Walmsley
  0 siblings, 2 replies; 6+ messages in thread
From: Kevin Hilman @ 2009-11-23 17:33 UTC (permalink / raw)
  To: linux-omap

Use

   usecs = nsecs / NSEC_PER_USEC;

instead of

   usecs = nsecs * NSEC_PER_USEC;

Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
---
 arch/arm/plat-omap/omap_device.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 288fd12..722f2c8 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -142,7 +142,7 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
 		read_persistent_clock(&b);
 
 		c = timespec_sub(b, a);
-		act_lat = timespec_to_ns(&c) * NSEC_PER_USEC;
+		act_lat = timespec_to_ns(&c) / NSEC_PER_USEC;
 
 		pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time "
 			 "%llu usec\n", od->pdev.name, od->pm_lat_level,
@@ -198,7 +198,7 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
 		read_persistent_clock(&b);
 
 		c = timespec_sub(b, a);
-		deact_lat = timespec_to_ns(&c) * NSEC_PER_USEC;
+		deact_lat = timespec_to_ns(&c) / NSEC_PER_USEC;
 
 		pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time "
 			 "%llu usec\n", od->pdev.name, od->pm_lat_level,
-- 
1.6.5.1


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

* [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds
  2009-11-23 17:33 [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Kevin Hilman
@ 2009-11-23 17:33 ` Kevin Hilman
  2009-11-23 17:33   ` [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies Kevin Hilman
  2009-12-01 12:55   ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Paul Walmsley
  2009-12-01 12:55 ` [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Paul Walmsley
  1 sibling, 2 replies; 6+ messages in thread
From: Kevin Hilman @ 2009-11-23 17:33 UTC (permalink / raw)
  To: linux-omap

Rather than having to do a usecs = nsecs / NSECS_PER_USEC to
track latency in usecs, just track it in nanoseconds.

Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
---
 arch/arm/plat-omap/include/plat/omap_device.h |    4 ++--
 arch/arm/plat-omap/omap_device.c              |    8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index c504780..3b2f3a6 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -50,8 +50,8 @@
  * @pm_lats: ptr to an omap_device_pm_latency table
  * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats
  * @pm_lat_level: array index of the last odpl entry executed - -1 if never
- * @dev_wakeup_lat: dev wakeup latency in microseconds
- * @_dev_wakeup_lat_limit: dev wakeup latency limit in usec - set by OMAP PM
+ * @dev_wakeup_lat: dev wakeup latency in nanoseconds
+ * @_dev_wakeup_lat_limit: dev wakeup latency limit in nsec - set by OMAP PM
  * @_state: one of OMAP_DEVICE_STATE_* (see above)
  * @flags: device flags
  *
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 722f2c8..7bf665c 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -142,10 +142,10 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
 		read_persistent_clock(&b);
 
 		c = timespec_sub(b, a);
-		act_lat = timespec_to_ns(&c) / NSEC_PER_USEC;
+		act_lat = timespec_to_ns(&c);
 
 		pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time "
-			 "%llu usec\n", od->pdev.name, od->pm_lat_level,
+			 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
 			 act_lat);
 
 		WARN(act_lat > odpl->activate_lat, "omap_device: %s.%d: "
@@ -198,10 +198,10 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
 		read_persistent_clock(&b);
 
 		c = timespec_sub(b, a);
-		deact_lat = timespec_to_ns(&c) / NSEC_PER_USEC;
+		deact_lat = timespec_to_ns(&c);
 
 		pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time "
-			 "%llu usec\n", od->pdev.name, od->pm_lat_level,
+			 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
 			 deact_lat);
 
 		WARN(deact_lat > odpl->deactivate_lat, "omap_device: %s.%d: "
-- 
1.6.5.1


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

* [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies
  2009-11-23 17:33 ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Kevin Hilman
@ 2009-11-23 17:33   ` Kevin Hilman
  2009-11-23 18:35     ` Kevin Hilman
  2009-12-01 12:55   ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Paul Walmsley
  1 sibling, 1 reply; 6+ messages in thread
From: Kevin Hilman @ 2009-11-23 17:33 UTC (permalink / raw)
  To: linux-omap

First, this patch adds new worst-case latency values to the
omap_device_pm_latency struct.  Here the worst-case measured latencies
for the activate and deactivate hooks are stored.

In addition, add an option to auto-adjust the latency values used for
device activate/deactivate.

By setting a new 'OMAP_DEVICE_LATENCY_AUTO_ADJUST' flag in the
omap_device_pm_latency struct, the omap_device layer automatically
adjusts the activate/deactivate latencies to the worst-case measured
values.

Anytime a new worst-case value is found, it is printed to the console.
Here is an example log during boot using UART2 s an example.  After
boot, the OPP is manually changed to the 125MHz OPP:

[...]
Freeing init memory: 128K
omap_device: serial8250.2: new worst case deactivate latency 0: 30517
omap_device: serial8250.2: new worst case activate latency 0: 30517
omap_device: serial8250.2: new worst case activate latency 0: 218139648
omap_device: serial8250.2: new worst case deactivate latency 0: 61035
omap_device: serial8250.2: new worst case activate latency 0: 278076171
omap_device: serial8250.2: new worst case activate latency 0: 298614501
omap_device: serial8250.2: new worst case activate latency 0: 327331542

/ # echo 125000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

omap_device: serial8250.2: new worst case deactivate latency 0: 91552

Motivation: this can be used as a technique to automatically determine
the worst case latency values.  The current method of printing a
warning on every violation is too noisy to actually interact the
console in order to set low OPP to discover latencies.

Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
---
 arch/arm/plat-omap/include/plat/omap_device.h |    4 ++
 arch/arm/plat-omap/omap_device.c              |   41 ++++++++++++++++++++-----
 2 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index 3b2f3a6..e0634fe 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -132,11 +132,15 @@ int omap_device_enable_clocks(struct omap_device *od);
  */
 struct omap_device_pm_latency {
 	u32 deactivate_lat;
+	u32 deactivate_lat_worst;
 	int (*deactivate_func)(struct omap_device *od);
 	u32 activate_lat;
+	u32 activate_lat_worst;
 	int (*activate_func)(struct omap_device *od);
+	u32 flags;
 };
 
+#define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1)
 
 /* Get omap_device pointer from platform_device pointer */
 #define to_omap_device(x) container_of((x), struct omap_device, pdev)
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 7bf665c..8ba12a6 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -148,10 +148,22 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
 			 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
 			 act_lat);
 
-		WARN(act_lat > odpl->activate_lat, "omap_device: %s.%d: "
-		     "activate step %d took longer than expected (%llu > %d)\n",
-		     od->pdev.name, od->pdev.id, od->pm_lat_level,
-		     act_lat, odpl->activate_lat);
+		if (act_lat > odpl->activate_lat) {
+			odpl->activate_lat_worst = act_lat;
+			if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
+				odpl->activate_lat = act_lat;
+				pr_warning("omap_device: %s.%d: new worst case "
+					   "activate latency %d: %llu\n",
+					   od->pdev.name, od->pdev.id, 
+					   od->pm_lat_level, act_lat);
+			} else
+				pr_warning("omap_device: %s.%d: activate "
+					   "latency %d higher than exptected. "
+					   "(%llu > %d)\n",
+					   od->pdev.name, od->pdev.id, 
+					   od->pm_lat_level, act_lat,
+					   odpl->activate_lat);
+		}
 
 		od->dev_wakeup_lat -= odpl->activate_lat;
 	}
@@ -204,10 +216,23 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
 			 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
 			 deact_lat);
 
-		WARN(deact_lat > odpl->deactivate_lat, "omap_device: %s.%d: "
-		     "deactivate step %d took longer than expected "
-		     "(%llu > %d)\n", od->pdev.name, od->pdev.id,
-		     od->pm_lat_level, deact_lat, odpl->deactivate_lat);
+		if (deact_lat > odpl->deactivate_lat) {
+			odpl->deactivate_lat_worst = deact_lat;
+			if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
+				odpl->deactivate_lat = deact_lat;
+				pr_warning("omap_device: %s.%d: new worst case "
+					   "deactivate latency %d: %llu\n",
+					   od->pdev.name, od->pdev.id,
+					   od->pm_lat_level, deact_lat);
+			} else
+				pr_warning("omap_device: %s.%d: deactivate "
+					   "latency %d higher than exptected. "
+					   "(%llu > %d)\n",
+					   od->pdev.name, od->pdev.id, 
+					   od->pm_lat_level, deact_lat,
+					   odpl->deactivate_lat);
+		}
+ 
 
 		od->dev_wakeup_lat += odpl->activate_lat;
 
-- 
1.6.5.1


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

* Re: [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies
  2009-11-23 17:33   ` [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies Kevin Hilman
@ 2009-11-23 18:35     ` Kevin Hilman
  0 siblings, 0 replies; 6+ messages in thread
From: Kevin Hilman @ 2009-11-23 18:35 UTC (permalink / raw)
  To: linux-omap

Kevin Hilman wrote:
> First, this patch adds new worst-case latency values to the
> omap_device_pm_latency struct.  Here the worst-case measured latencies
> for the activate and deactivate hooks are stored.
> 
> In addition, add an option to auto-adjust the latency values used for
> device activate/deactivate.
> 
> By setting a new 'OMAP_DEVICE_LATENCY_AUTO_ADJUST' flag in the
> omap_device_pm_latency struct, the omap_device layer automatically
> adjusts the activate/deactivate latencies to the worst-case measured
> values.
> 
> Anytime a new worst-case value is found, it is printed to the console.
> Here is an example log during boot using UART2 s an example.  After
> boot, the OPP is manually changed to the 125MHz OPP:
> 
> [...]
> Freeing init memory: 128K
> omap_device: serial8250.2: new worst case deactivate latency 0: 30517
> omap_device: serial8250.2: new worst case activate latency 0: 30517
> omap_device: serial8250.2: new worst case activate latency 0: 218139648
> omap_device: serial8250.2: new worst case deactivate latency 0: 61035
> omap_device: serial8250.2: new worst case activate latency 0: 278076171
> omap_device: serial8250.2: new worst case activate latency 0: 298614501
> omap_device: serial8250.2: new worst case activate latency 0: 327331542
> 
> / # echo 125000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
> 
> omap_device: serial8250.2: new worst case deactivate latency 0: 91552
> 
> Motivation: this can be used as a technique to automatically determine
> the worst case latency values.  The current method of printing a
> warning on every violation is too noisy to actually interact the
> console in order to set low OPP to discover latencies.

Another motivation for this patch is that the activate/deactivate 
latenices can vary depending on the idlemode of the device.  While 
working on the UART I noticed that when using no-idle, the activate 
latencies were as high as several hundred msecs as shown above.  When 
the UARTs are in smart-idle, the max latency is well under 100 usecs.

Kevin

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

* Re: [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations
  2009-11-23 17:33 [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Kevin Hilman
  2009-11-23 17:33 ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Kevin Hilman
@ 2009-12-01 12:55 ` Paul Walmsley
  1 sibling, 0 replies; 6+ messages in thread
From: Paul Walmsley @ 2009-12-01 12:55 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap

On Mon, 23 Nov 2009, Kevin Hilman wrote:

> Use
> 
>    usecs = nsecs / NSEC_PER_USEC;
> 
> instead of
> 
>    usecs = nsecs * NSEC_PER_USEC;
> 
> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>

Thanks, looks good.  Will queue this up with the rest of the hwmod 
patches for .33.

- Paul

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

* Re: [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds
  2009-11-23 17:33 ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Kevin Hilman
  2009-11-23 17:33   ` [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies Kevin Hilman
@ 2009-12-01 12:55   ` Paul Walmsley
  1 sibling, 0 replies; 6+ messages in thread
From: Paul Walmsley @ 2009-12-01 12:55 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap

On Mon, 23 Nov 2009, Kevin Hilman wrote:

> Rather than having to do a usecs = nsecs / NSECS_PER_USEC to
> track latency in usecs, just track it in nanoseconds.
> 
> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>

Thanks, looks good.  Will queue this up with the rest of the hwmod
patches for .33.

- Paul

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

end of thread, other threads:[~2009-12-01 12:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-23 17:33 [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Kevin Hilman
2009-11-23 17:33 ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Kevin Hilman
2009-11-23 17:33   ` [PATCH 3/3] OMAP: omap_device: optionally auto-adjust device activate/deactivate latencies Kevin Hilman
2009-11-23 18:35     ` Kevin Hilman
2009-12-01 12:55   ` [PATCH 2/3] OMAP: omap_device: track latency in nanoseconds Paul Walmsley
2009-12-01 12:55 ` [PATCH 1/3] OMAP: omap_device: fix nsec/usec conversion in latency calculations Paul Walmsley

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.