Commit bcafc4e3 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm/i915: Limit mmio flip RPS boosts

Since we will often pageflip to an active surface, we will often have to
wait for the surface to be written before issuing the flip. Also we are
likely to wait on that surface in plenty of time before the vblank.
Since we have a mechanism for boosting when a flip misses the expected
vblank, curtain the number of times we RPS boost when simply waiting for
mmioflip.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
[danvet: s/rq/req/]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent a6f766f3
...@@ -2312,6 +2312,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) ...@@ -2312,6 +2312,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
rcu_read_unlock(); rcu_read_unlock();
} }
seq_printf(m, "Semaphore boosts: %d\n", dev_priv->rps.semaphores.rps_boosts); seq_printf(m, "Semaphore boosts: %d\n", dev_priv->rps.semaphores.rps_boosts);
seq_printf(m, "MMIO flip boosts: %d\n", dev_priv->rps.mmioflips.rps_boosts);
seq_printf(m, "Kernel boosts: %d\n", dev_priv->rps.boosts); seq_printf(m, "Kernel boosts: %d\n", dev_priv->rps.boosts);
mutex_unlock(&dev_priv->rps.hw_lock); mutex_unlock(&dev_priv->rps.hw_lock);
......
...@@ -1087,6 +1087,7 @@ struct intel_gen6_power_mgmt { ...@@ -1087,6 +1087,7 @@ struct intel_gen6_power_mgmt {
unsigned boosts; unsigned boosts;
struct drm_i915_file_private semaphores; struct drm_i915_file_private semaphores;
struct drm_i915_file_private mmioflips;
/* manual wa residency calculations */ /* manual wa residency calculations */
struct intel_rps_ei up_ei, down_ei; struct intel_rps_ei up_ei, down_ei;
......
...@@ -10788,7 +10788,8 @@ static void intel_mmio_flip_work_func(struct work_struct *work) ...@@ -10788,7 +10788,8 @@ static void intel_mmio_flip_work_func(struct work_struct *work)
if (mmio_flip->req) if (mmio_flip->req)
WARN_ON(__i915_wait_request(mmio_flip->req, WARN_ON(__i915_wait_request(mmio_flip->req,
mmio_flip->crtc->reset_counter, mmio_flip->crtc->reset_counter,
false, NULL, NULL)); false, NULL,
&mmio_flip->i915->rps.mmioflips));
intel_do_mmio_flip(mmio_flip->crtc); intel_do_mmio_flip(mmio_flip->crtc);
...@@ -10809,6 +10810,7 @@ static int intel_queue_mmio_flip(struct drm_device *dev, ...@@ -10809,6 +10810,7 @@ static int intel_queue_mmio_flip(struct drm_device *dev,
if (mmio_flip == NULL) if (mmio_flip == NULL)
return -ENOMEM; return -ENOMEM;
mmio_flip->i915 = to_i915(dev);
mmio_flip->req = i915_gem_request_reference(obj->last_write_req); mmio_flip->req = i915_gem_request_reference(obj->last_write_req);
mmio_flip->crtc = to_intel_crtc(crtc); mmio_flip->crtc = to_intel_crtc(crtc);
......
...@@ -460,6 +460,7 @@ struct intel_pipe_wm { ...@@ -460,6 +460,7 @@ struct intel_pipe_wm {
struct intel_mmio_flip { struct intel_mmio_flip {
struct work_struct work; struct work_struct work;
struct drm_i915_private *i915;
struct drm_i915_gem_request *req; struct drm_i915_gem_request *req;
struct intel_crtc *crtc; struct intel_crtc *crtc;
}; };
......
...@@ -6885,6 +6885,7 @@ void intel_pm_setup(struct drm_device *dev) ...@@ -6885,6 +6885,7 @@ void intel_pm_setup(struct drm_device *dev)
intel_gen6_powersave_work); intel_gen6_powersave_work);
INIT_LIST_HEAD(&dev_priv->rps.clients); INIT_LIST_HEAD(&dev_priv->rps.clients);
INIT_LIST_HEAD(&dev_priv->rps.semaphores.rps_boost); INIT_LIST_HEAD(&dev_priv->rps.semaphores.rps_boost);
INIT_LIST_HEAD(&dev_priv->rps.mmioflips.rps_boost);
dev_priv->pm.suspended = false; dev_priv->pm.suspended = false;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment