i915: Do not wait for pending flips on both pipes at the same time.
The MI_WAIT_FOR_EVENT instruction does not support waiting for several events at once, so this should fix the lockups with page flipping when both pipes are enabled.
parent
a33859184a
commit
0741064df4
|
@ -589,11 +589,12 @@ static void i915_do_dispatch_flip(drm_device_t * dev, int pipe, int sync)
|
||||||
dspbase);
|
dspbase);
|
||||||
|
|
||||||
BEGIN_LP_RING(4);
|
BEGIN_LP_RING(4);
|
||||||
|
OUT_RING(MI_WAIT_FOR_EVENT | (pipe ? MI_WAIT_FOR_PLANE_B_FLIP :
|
||||||
|
MI_WAIT_FOR_PLANE_A_FLIP));
|
||||||
OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) |
|
OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) |
|
||||||
(pipe ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));
|
(pipe ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));
|
||||||
OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);
|
OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);
|
||||||
OUT_RING(dspbase);
|
OUT_RING(dspbase);
|
||||||
OUT_RING(0);
|
|
||||||
ADVANCE_LP_RING();
|
ADVANCE_LP_RING();
|
||||||
|
|
||||||
dev_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
|
dev_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
|
||||||
|
@ -604,7 +605,6 @@ void i915_dispatch_flip(drm_device_t * dev, int pipes, int sync)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
int i;
|
int i;
|
||||||
RING_LOCALS;
|
|
||||||
|
|
||||||
DRM_DEBUG("%s: pipes=0x%x pfCurrentPage=%d\n",
|
DRM_DEBUG("%s: pipes=0x%x pfCurrentPage=%d\n",
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
|
@ -612,22 +612,6 @@ void i915_dispatch_flip(drm_device_t * dev, int pipes, int sync)
|
||||||
|
|
||||||
i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);
|
i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);
|
||||||
|
|
||||||
if (!sync) {
|
|
||||||
u32 mi_wait = MI_WAIT_FOR_EVENT;
|
|
||||||
|
|
||||||
/* Wait for pending flips to take effect */
|
|
||||||
if (pipes & 0x1)
|
|
||||||
mi_wait |= MI_WAIT_FOR_PLANE_A_FLIP;
|
|
||||||
|
|
||||||
if (pipes & 0x2)
|
|
||||||
mi_wait |= MI_WAIT_FOR_PLANE_B_FLIP;
|
|
||||||
|
|
||||||
BEGIN_LP_RING(2);
|
|
||||||
OUT_RING(mi_wait);
|
|
||||||
OUT_RING(0);
|
|
||||||
ADVANCE_LP_RING();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
if (pipes & (1 << i))
|
if (pipes & (1 << i))
|
||||||
i915_do_dispatch_flip(dev, i, sync);
|
i915_do_dispatch_flip(dev, i, sync);
|
||||||
|
|
Loading…
Reference in New Issue