summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrnoland <rnoland@FreeBSD.org>2009-06-20 16:45:14 +0000
committerrnoland <rnoland@FreeBSD.org>2009-06-20 16:45:14 +0000
commit4f053b746068039dffb792ad21ebb9873a095484 (patch)
tree8cc110213abb93223d0459a173133d65c5cfa8cf
parent36023fcd0281ea8e5b75983968d2738a6e73204f (diff)
downloadFreeBSD-src-4f053b746068039dffb792ad21ebb9873a095484.zip
FreeBSD-src-4f053b746068039dffb792ad21ebb9873a095484.tar.gz
The G45 docs indicate that all G4X chips use the new framecount register.
Intel agrees with my reading of the docs, make it so for all G4X chips. The new register also has a 32 bit width as opposed to 24 bits. Fix things up so that the counters roll over properly. MFC after: 3 days
-rw-r--r--sys/dev/drm/i915_dma.c9
-rw-r--r--sys/dev/drm/i915_drv.h2
-rw-r--r--sys/dev/drm/i915_irq.c4
3 files changed, 8 insertions, 7 deletions
diff --git a/sys/dev/drm/i915_dma.c b/sys/dev/drm/i915_dma.c
index a701a5e..d2f27b6 100644
--- a/sys/dev/drm/i915_dma.c
+++ b/sys/dev/drm/i915_dma.c
@@ -871,10 +871,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
ret = drm_addmap(dev, base, size, _DRM_REGISTERS,
_DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map);
- if (IS_GM45(dev))
- dev->driver->get_vblank_counter = gm45_get_vblank_counter;
- else
+ if (IS_G4X(dev)) {
+ dev->driver->get_vblank_counter = g45_get_vblank_counter;
+ dev->max_vblank_count = 0xffffffff; /* 32 bits of frame count */
+ } else {
dev->driver->get_vblank_counter = i915_get_vblank_counter;
+ dev->max_vblank_count = 0x00ffffff; /* 24 bits of frame count */
+ }
#ifdef I915_HAVE_GEM
i915_gem_load(dev);
diff --git a/sys/dev/drm/i915_drv.h b/sys/dev/drm/i915_drv.h
index 92c8f74..f1300f4 100644
--- a/sys/dev/drm/i915_drv.h
+++ b/sys/dev/drm/i915_drv.h
@@ -453,7 +453,7 @@ extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
extern int i915_enable_vblank(struct drm_device *dev, int crtc);
extern void i915_disable_vblank(struct drm_device *dev, int crtc);
extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
-extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
+extern u32 g45_get_vblank_counter(struct drm_device *dev, int crtc);
extern int i915_vblank_swap(struct drm_device *dev, void *data,
struct drm_file *file_priv);
diff --git a/sys/dev/drm/i915_irq.c b/sys/dev/drm/i915_irq.c
index 7583031..dac1058 100644
--- a/sys/dev/drm/i915_irq.c
+++ b/sys/dev/drm/i915_irq.c
@@ -177,7 +177,7 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
return count;
}
-u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
+u32 g45_get_vblank_counter(struct drm_device *dev, int pipe)
{
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45;
@@ -516,8 +516,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
- dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
-
/* Unmask the interrupts that we always want on. */
dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX;
OpenPOWER on IntegriCloud