Skip to content

Commit

Permalink
drm/i915: Clear FlipDone semantics change for pageflipping on gen3
Browse files Browse the repository at this point in the history
On later gen3, you are able to select the meaning of the FlipPending
status bit in IIR and change it to FlipDone. This was sometimes done by
the BIOS leading to confusion on just how pageflipping worked on gen3.
Simplify the implementation by using the legacy meaning for all gen3
machines.

Note: this makes all gen3 machines equally broken...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Chris Wilson authored and Daniel Vetter committed May 3, 2012
1 parent a266c7d commit 4f7d1e7
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 29 deletions.
1 change: 0 additions & 1 deletion drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -748,7 +748,6 @@ typedef struct drm_i915_private {
struct drm_crtc *plane_to_crtc_mapping[3];
struct drm_crtc *pipe_to_crtc_mapping[3];
wait_queue_head_t pending_flip_queue;
bool gen3_flip_pending_is_done;

struct intel_pch_pll pch_plls[I915_NUM_PLLS];

Expand Down
39 changes: 11 additions & 28 deletions drivers/gpu/drm/i915/i915_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -2510,26 +2510,18 @@ static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
if (iir & I915_BSD_USER_INTERRUPT)
notify_ring(dev, &dev_priv->ring[VCS]);

if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT)
intel_prepare_page_flip(dev, 0);
if (dev_priv->gen3_flip_pending_is_done)
intel_finish_page_flip_plane(dev, 0);
}

if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT)
intel_prepare_page_flip(dev, 1);
if (dev_priv->gen3_flip_pending_is_done)
intel_finish_page_flip_plane(dev, 1);
}

for_each_pipe(pipe) {
if (pipe_stats[pipe] & vblank_status &&
drm_handle_vblank(dev, pipe)) {
vblank++;
if (!dev_priv->gen3_flip_pending_is_done) {
i915_pageflip_stall_check(dev, pipe);
intel_finish_page_flip(dev, pipe);
}
i915_pageflip_stall_check(dev, pipe);
intel_finish_page_flip(dev, pipe);
}

if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
Expand Down Expand Up @@ -2771,26 +2763,18 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
if (iir & I915_BSD_USER_INTERRUPT)
notify_ring(dev, &dev_priv->ring[VCS]);

if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT)
intel_prepare_page_flip(dev, 0);
if (dev_priv->gen3_flip_pending_is_done)
intel_finish_page_flip_plane(dev, 0);
}

if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT)
intel_prepare_page_flip(dev, 1);
if (dev_priv->gen3_flip_pending_is_done)
intel_finish_page_flip_plane(dev, 1);
}

for_each_pipe(pipe) {
if (pipe_stats[pipe] & vblank_status &&
drm_handle_vblank(dev, pipe)) {
vblank++;
if (!dev_priv->gen3_flip_pending_is_done) {
i915_pageflip_stall_check(dev, pipe);
intel_finish_page_flip(dev, pipe);
}
i915_pageflip_stall_check(dev, pipe);
intel_finish_page_flip(dev, pipe);
}

if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
Expand Down Expand Up @@ -2857,10 +2841,6 @@ void intel_irq_init(struct drm_device *dev)
INIT_WORK(&dev_priv->error_work, i915_error_work_func);
INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);

/* IIR "flip pending" bit means done if this bit is set */
if (IS_GEN3(dev) && (I915_READ(ECOSKPD) & ECO_FLIP_DONE))
dev_priv->gen3_flip_pending_is_done = true;

dev->driver->get_vblank_counter = i915_get_vblank_counter;
dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev) ||
Expand Down Expand Up @@ -2904,6 +2884,9 @@ void intel_irq_init(struct drm_device *dev)
dev->driver->irq_handler = i8xx_irq_handler;
dev->driver->irq_uninstall = i8xx_irq_uninstall;
} else if (INTEL_INFO(dev)->gen == 3) {
/* IIR "flip pending" means done if this bit is set */
I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));

dev->driver->irq_preinstall = i915_irq_preinstall;
dev->driver->irq_postinstall = i915_irq_postinstall;
dev->driver->irq_uninstall = i915_irq_uninstall;
Expand Down

0 comments on commit 4f7d1e7

Please sign in to comment.