Commit 67f19766 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2018-03-14' of...

Merge tag 'drm-intel-fixes-2018-03-14' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

- 1 display fix for bxt
- 1 gem fix for fences
- 1 gem/pm fix for rps freq

* tag 'drm-intel-fixes-2018-03-14' of git://anongit.freedesktop.org/drm/drm-intel:
  drm/i915: Kick the rps worker when changing the boost frequency
  drm/i915: Only prune fences after wait-for-all
  drm/i915: Enable VBT based BL control for DP
parents 4cdc8f12 f1430f14
...@@ -434,20 +434,28 @@ i915_gem_object_wait_reservation(struct reservation_object *resv, ...@@ -434,20 +434,28 @@ i915_gem_object_wait_reservation(struct reservation_object *resv,
dma_fence_put(shared[i]); dma_fence_put(shared[i]);
kfree(shared); kfree(shared);
/*
* If both shared fences and an exclusive fence exist,
* then by construction the shared fences must be later
* than the exclusive fence. If we successfully wait for
* all the shared fences, we know that the exclusive fence
* must all be signaled. If all the shared fences are
* signaled, we can prune the array and recover the
* floating references on the fences/requests.
*/
prune_fences = count && timeout >= 0; prune_fences = count && timeout >= 0;
} else { } else {
excl = reservation_object_get_excl_rcu(resv); excl = reservation_object_get_excl_rcu(resv);
} }
if (excl && timeout >= 0) { if (excl && timeout >= 0)
timeout = i915_gem_object_wait_fence(excl, flags, timeout, timeout = i915_gem_object_wait_fence(excl, flags, timeout,
rps_client); rps_client);
prune_fences = timeout >= 0;
}
dma_fence_put(excl); dma_fence_put(excl);
/* Oportunistically prune the fences iff we know they have *all* been /*
* Opportunistically prune the fences iff we know they have *all* been
* signaled and that the reservation object has not been changed (i.e. * signaled and that the reservation object has not been changed (i.e.
* no new fences have been added). * no new fences have been added).
*/ */
......
...@@ -304,8 +304,9 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, ...@@ -304,8 +304,9 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
{ {
struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
struct intel_rps *rps = &dev_priv->gt_pm.rps; struct intel_rps *rps = &dev_priv->gt_pm.rps;
u32 val; bool boost = false;
ssize_t ret; ssize_t ret;
u32 val;
ret = kstrtou32(buf, 0, &val); ret = kstrtou32(buf, 0, &val);
if (ret) if (ret)
...@@ -317,8 +318,13 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, ...@@ -317,8 +318,13 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev,
return -EINVAL; return -EINVAL;
mutex_lock(&dev_priv->pcu_lock); mutex_lock(&dev_priv->pcu_lock);
if (val != rps->boost_freq) {
rps->boost_freq = val; rps->boost_freq = val;
boost = atomic_read(&rps->num_waiters);
}
mutex_unlock(&dev_priv->pcu_lock); mutex_unlock(&dev_priv->pcu_lock);
if (boost)
schedule_work(&rps->work);
return count; return count;
} }
......
...@@ -620,19 +620,15 @@ static int ...@@ -620,19 +620,15 @@ static int
bxt_power_sequencer_idx(struct intel_dp *intel_dp) bxt_power_sequencer_idx(struct intel_dp *intel_dp)
{ {
struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp)); struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
int backlight_controller = dev_priv->vbt.backlight.controller;
lockdep_assert_held(&dev_priv->pps_mutex); lockdep_assert_held(&dev_priv->pps_mutex);
/* We should never land here with regular DP ports */ /* We should never land here with regular DP ports */
WARN_ON(!intel_dp_is_edp(intel_dp)); WARN_ON(!intel_dp_is_edp(intel_dp));
/*
* TODO: BXT has 2 PPS instances. The correct port->PPS instance
* mapping needs to be retrieved from VBT, for now just hard-code to
* use instance #0 always.
*/
if (!intel_dp->pps_reset) if (!intel_dp->pps_reset)
return 0; return backlight_controller;
intel_dp->pps_reset = false; intel_dp->pps_reset = false;
...@@ -642,7 +638,7 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp) ...@@ -642,7 +638,7 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp)
*/ */
intel_dp_init_panel_power_sequencer_registers(intel_dp, false); intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
return 0; return backlight_controller;
} }
typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv,
......
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