diff options
author | Pekka Paalanen <pq@iki.fi> | 2007-07-06 19:34:15 +0300 |
---|---|---|
committer | Pekka Paalanen <pq@iki.fi> | 2007-07-18 14:12:26 +0300 |
commit | 696bee093f6f75dbb48699ff32bbebe2d3a1e307 (patch) | |
tree | a55cab4810c47752dee1669dc5f03737bb692a70 /shared-core/nv04_timer.c | |
parent | 0c77f5abeadcbb89643740889cc865ba0ae66538 (diff) |
nouveau: Add read() method to Engine.timer.
This is not called from anywhere, yet.
Diffstat (limited to 'shared-core/nv04_timer.c')
-rw-r--r-- | shared-core/nv04_timer.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/shared-core/nv04_timer.c b/shared-core/nv04_timer.c index efe78da7..08a27f4f 100644 --- a/shared-core/nv04_timer.c +++ b/shared-core/nv04_timer.c @@ -17,6 +17,27 @@ nv04_timer_init(struct drm_device *dev) return 0; } +uint64_t +nv04_timer_read(struct drm_device *dev) +{ + struct drm_nouveau_private *dev_priv = dev->dev_private; + uint32_t low; + /* From kmmio dumps on nv28 this looks like how the blob does this. + * It reads the high dword twice, before and after. + * The only explanation seems to be that the 64-bit timer counter + * advances between high and low dword reads and may corrupt the + * result. Not confirmed. + */ + uint32_t high2 = NV_READ(NV04_PTIMER_TIME_1); + uint32_t high1; + do { + high1 = high2; + low = NV_READ(NV04_PTIMER_TIME_0); + high2 = NV_READ(NV04_PTIMER_TIME_1); + } while(high1 != high2); + return (((uint64_t)high2) << 32) | (uint64_t)low; +} + void nv04_timer_takedown(struct drm_device *dev) { |