Merge tag 'drm-intel-next-2018-03-08' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
UAPI Changes: - Query uAPI interface (used for GPU topology information currently) * Mesa: https://patchwork.freedesktop.org/series/38795/ Driver Changes: - Increase PSR2 size for CNL (DK) - Avoid retraining LSPCON link unnecessarily (Ville) - Decrease request signaling latency (Chris) - GuC error capture fix (Daniele) * tag 'drm-intel-next-2018-03-08' of git://anongit.freedesktop.org/drm/drm-intel: (127 commits) drm/i915: Update DRIVER_DATE to 20180308 drm/i915: add schedule out notification of preempted but completed request drm/i915: expose rcs topology through query uAPI drm/i915: add query uAPI drm/i915: add rcs topology to error state drm/i915/debugfs: add rcs topology entry drm/i915/debugfs: reuse max slice/subslices already stored in sseu drm/i915: store all subslice masks drm/i915/guc: work around gcc-4.4.4 union initializer issue drm/i915/cnl: Add Wa_2201832410 drm/i915/icl: Gen11 forcewake support drm/i915/icl: Add Indirect Context Offset for Gen11 drm/i915/icl: Enhanced execution list support drm/i915/icl: new context descriptor support drm/i915/icl: Correctly initialize the Gen11 engines drm/i915: Assert that the request is indeed complete when signaled from irq drm/i915: Handle changing enable_fbc parameter at runtime better. drm/i915: Track whether the DP link is trained or not drm/i915: Nuke intel_dp->channel_eq_status drm/i915: Move SST DP link retraining into the ->post_hotplug() hook ...
This commit is contained in:
@@ -2067,9 +2067,18 @@ static unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
|
||||
}
|
||||
}
|
||||
|
||||
static bool intel_plane_uses_fence(const struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
|
||||
return INTEL_GEN(dev_priv) < 4 || plane->has_fbc;
|
||||
}
|
||||
|
||||
struct i915_vma *
|
||||
intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
|
||||
unsigned int rotation,
|
||||
bool uses_fence,
|
||||
unsigned long *out_flags)
|
||||
{
|
||||
struct drm_device *dev = fb->dev;
|
||||
@@ -2122,7 +2131,9 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
|
||||
if (IS_ERR(vma))
|
||||
goto err;
|
||||
|
||||
if (i915_vma_is_map_and_fenceable(vma)) {
|
||||
if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
|
||||
int ret;
|
||||
|
||||
/* Install a fence for tiled scan-out. Pre-i965 always needs a
|
||||
* fence, whereas 965+ only requires a fence if using
|
||||
* framebuffer compression. For simplicity, we always, when
|
||||
@@ -2139,7 +2150,14 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
|
||||
* something and try to run the system in a "less than optimal"
|
||||
* mode that matches the user configuration.
|
||||
*/
|
||||
if (i915_vma_pin_fence(vma) == 0 && vma->fence)
|
||||
ret = i915_vma_pin_fence(vma);
|
||||
if (ret != 0 && INTEL_GEN(dev_priv) < 4) {
|
||||
i915_gem_object_unpin_from_display_plane(vma);
|
||||
vma = ERR_PTR(ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (ret == 0 && vma->fence)
|
||||
*out_flags |= PLANE_HAS_FENCE;
|
||||
}
|
||||
|
||||
@@ -2828,6 +2846,7 @@ valid_fb:
|
||||
intel_state->vma =
|
||||
intel_pin_and_fence_fb_obj(fb,
|
||||
primary->state->rotation,
|
||||
intel_plane_uses_fence(intel_state),
|
||||
&intel_state->flags);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
if (IS_ERR(intel_state->vma)) {
|
||||
@@ -12034,6 +12053,14 @@ static int intel_atomic_check(struct drm_device *dev,
|
||||
int ret, i;
|
||||
bool any_ms = false;
|
||||
|
||||
/* Catch I915_MODE_FLAG_INHERITED */
|
||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
|
||||
crtc_state, i) {
|
||||
if (crtc_state->mode.private_flags !=
|
||||
old_crtc_state->mode.private_flags)
|
||||
crtc_state->mode_changed = true;
|
||||
}
|
||||
|
||||
ret = drm_atomic_helper_check_modeset(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -12042,10 +12069,6 @@ static int intel_atomic_check(struct drm_device *dev,
|
||||
struct intel_crtc_state *pipe_config =
|
||||
to_intel_crtc_state(crtc_state);
|
||||
|
||||
/* Catch I915_MODE_FLAG_INHERITED */
|
||||
if (crtc_state->mode.private_flags != old_crtc_state->mode.private_flags)
|
||||
crtc_state->mode_changed = true;
|
||||
|
||||
if (!needs_modeset(crtc_state))
|
||||
continue;
|
||||
|
||||
@@ -12054,13 +12077,6 @@ static int intel_atomic_check(struct drm_device *dev,
|
||||
continue;
|
||||
}
|
||||
|
||||
/* FIXME: For only active_changed we shouldn't need to do any
|
||||
* state recomputation at all. */
|
||||
|
||||
ret = drm_atomic_add_affected_connectors(state, crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = intel_modeset_pipe_config(crtc, pipe_config);
|
||||
if (ret) {
|
||||
intel_dump_pipe_config(to_intel_crtc(crtc),
|
||||
@@ -12079,10 +12095,6 @@ static int intel_atomic_check(struct drm_device *dev,
|
||||
if (needs_modeset(crtc_state))
|
||||
any_ms = true;
|
||||
|
||||
ret = drm_atomic_add_affected_planes(state, crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
|
||||
needs_modeset(crtc_state) ?
|
||||
"[modeset]" : "[fastset]");
|
||||
@@ -12600,23 +12612,23 @@ struct wait_rps_boost {
|
||||
struct wait_queue_entry wait;
|
||||
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_i915_gem_request *request;
|
||||
struct i915_request *request;
|
||||
};
|
||||
|
||||
static int do_rps_boost(struct wait_queue_entry *_wait,
|
||||
unsigned mode, int sync, void *key)
|
||||
{
|
||||
struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
|
||||
struct drm_i915_gem_request *rq = wait->request;
|
||||
struct i915_request *rq = wait->request;
|
||||
|
||||
/*
|
||||
* If we missed the vblank, but the request is already running it
|
||||
* is reasonable to assume that it will complete before the next
|
||||
* vblank without our intervention, so leave RPS alone.
|
||||
*/
|
||||
if (!i915_gem_request_started(rq))
|
||||
if (!i915_request_started(rq))
|
||||
gen6_rps_boost(rq, NULL);
|
||||
i915_gem_request_put(rq);
|
||||
i915_request_put(rq);
|
||||
|
||||
drm_crtc_vblank_put(wait->crtc);
|
||||
|
||||
@@ -12654,6 +12666,42 @@ static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
|
||||
add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
|
||||
}
|
||||
|
||||
static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
struct drm_framebuffer *fb = plane_state->base.fb;
|
||||
struct i915_vma *vma;
|
||||
|
||||
if (plane->id == PLANE_CURSOR &&
|
||||
INTEL_INFO(dev_priv)->cursor_needs_physical) {
|
||||
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
||||
const int align = intel_cursor_alignment(dev_priv);
|
||||
|
||||
return i915_gem_object_attach_phys(obj, align);
|
||||
}
|
||||
|
||||
vma = intel_pin_and_fence_fb_obj(fb,
|
||||
plane_state->base.rotation,
|
||||
intel_plane_uses_fence(plane_state),
|
||||
&plane_state->flags);
|
||||
if (IS_ERR(vma))
|
||||
return PTR_ERR(vma);
|
||||
|
||||
plane_state->vma = vma;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
|
||||
{
|
||||
struct i915_vma *vma;
|
||||
|
||||
vma = fetch_and_zero(&old_plane_state->vma);
|
||||
if (vma)
|
||||
intel_unpin_fb_vma(vma, old_plane_state->flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_prepare_plane_fb - Prepare fb for usage on plane
|
||||
* @plane: drm plane to prepare for
|
||||
@@ -12728,22 +12776,7 @@ intel_prepare_plane_fb(struct drm_plane *plane,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (plane->type == DRM_PLANE_TYPE_CURSOR &&
|
||||
INTEL_INFO(dev_priv)->cursor_needs_physical) {
|
||||
const int align = intel_cursor_alignment(dev_priv);
|
||||
|
||||
ret = i915_gem_object_attach_phys(obj, align);
|
||||
} else {
|
||||
struct i915_vma *vma;
|
||||
|
||||
vma = intel_pin_and_fence_fb_obj(fb,
|
||||
new_state->rotation,
|
||||
&to_intel_plane_state(new_state)->flags);
|
||||
if (!IS_ERR(vma))
|
||||
to_intel_plane_state(new_state)->vma = vma;
|
||||
else
|
||||
ret = PTR_ERR(vma);
|
||||
}
|
||||
ret = intel_plane_pin_fb(to_intel_plane_state(new_state));
|
||||
|
||||
i915_gem_object_wait_priority(obj, 0, I915_PRIORITY_DISPLAY);
|
||||
|
||||
@@ -12787,15 +12820,12 @@ void
|
||||
intel_cleanup_plane_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *old_state)
|
||||
{
|
||||
struct i915_vma *vma;
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->dev);
|
||||
|
||||
/* Should only be called after a successful intel_prepare_plane_fb()! */
|
||||
vma = fetch_and_zero(&to_intel_plane_state(old_state)->vma);
|
||||
if (vma) {
|
||||
mutex_lock(&plane->dev->struct_mutex);
|
||||
intel_unpin_fb_vma(vma, to_intel_plane_state(old_state)->flags);
|
||||
mutex_unlock(&plane->dev->struct_mutex);
|
||||
}
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
intel_plane_unpin_fb(to_intel_plane_state(old_state));
|
||||
mutex_unlock(&dev_priv->drm.struct_mutex);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -13080,7 +13110,6 @@ intel_legacy_cursor_update(struct drm_plane *plane,
|
||||
struct intel_plane *intel_plane = to_intel_plane(plane);
|
||||
struct drm_framebuffer *old_fb;
|
||||
struct drm_crtc_state *crtc_state = crtc->state;
|
||||
struct i915_vma *old_vma, *vma;
|
||||
|
||||
/*
|
||||
* When crtc is inactive or there is a modeset pending,
|
||||
@@ -13139,27 +13168,9 @@ intel_legacy_cursor_update(struct drm_plane *plane,
|
||||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
if (INTEL_INFO(dev_priv)->cursor_needs_physical) {
|
||||
int align = intel_cursor_alignment(dev_priv);
|
||||
|
||||
ret = i915_gem_object_attach_phys(intel_fb_obj(fb), align);
|
||||
if (ret) {
|
||||
DRM_DEBUG_KMS("failed to attach phys object\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
} else {
|
||||
vma = intel_pin_and_fence_fb_obj(fb,
|
||||
new_plane_state->rotation,
|
||||
&to_intel_plane_state(new_plane_state)->flags);
|
||||
if (IS_ERR(vma)) {
|
||||
DRM_DEBUG_KMS("failed to pin object\n");
|
||||
|
||||
ret = PTR_ERR(vma);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
to_intel_plane_state(new_plane_state)->vma = vma;
|
||||
}
|
||||
ret = intel_plane_pin_fb(to_intel_plane_state(new_plane_state));
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
old_fb = old_plane_state->fb;
|
||||
|
||||
@@ -13179,10 +13190,7 @@ intel_legacy_cursor_update(struct drm_plane *plane,
|
||||
intel_plane->disable_plane(intel_plane, to_intel_crtc(crtc));
|
||||
}
|
||||
|
||||
old_vma = fetch_and_zero(&to_intel_plane_state(old_plane_state)->vma);
|
||||
if (old_vma)
|
||||
intel_unpin_fb_vma(old_vma,
|
||||
to_intel_plane_state(old_plane_state)->flags);
|
||||
intel_plane_unpin_fb(to_intel_plane_state(old_plane_state));
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&dev_priv->drm.struct_mutex);
|
||||
@@ -13210,6 +13218,32 @@ static const struct drm_plane_funcs intel_cursor_plane_funcs = {
|
||||
.format_mod_supported = intel_cursor_plane_format_mod_supported,
|
||||
};
|
||||
|
||||
static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
|
||||
enum i9xx_plane_id i9xx_plane)
|
||||
{
|
||||
if (!HAS_FBC(dev_priv))
|
||||
return false;
|
||||
|
||||
if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
|
||||
return i9xx_plane == PLANE_A; /* tied to pipe A */
|
||||
else if (IS_IVYBRIDGE(dev_priv))
|
||||
return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B ||
|
||||
i9xx_plane == PLANE_C;
|
||||
else if (INTEL_GEN(dev_priv) >= 4)
|
||||
return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B;
|
||||
else
|
||||
return i9xx_plane == PLANE_A;
|
||||
}
|
||||
|
||||
static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv,
|
||||
enum pipe pipe, enum plane_id plane_id)
|
||||
{
|
||||
if (!HAS_FBC(dev_priv))
|
||||
return false;
|
||||
|
||||
return pipe == PIPE_A && plane_id == PLANE_PRIMARY;
|
||||
}
|
||||
|
||||
static struct intel_plane *
|
||||
intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
|
||||
{
|
||||
@@ -13252,6 +13286,21 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
|
||||
primary->i9xx_plane = (enum i9xx_plane_id) pipe;
|
||||
primary->id = PLANE_PRIMARY;
|
||||
primary->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, primary->id);
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9)
|
||||
primary->has_fbc = skl_plane_has_fbc(dev_priv,
|
||||
primary->pipe,
|
||||
primary->id);
|
||||
else
|
||||
primary->has_fbc = i9xx_plane_has_fbc(dev_priv,
|
||||
primary->i9xx_plane);
|
||||
|
||||
if (primary->has_fbc) {
|
||||
struct intel_fbc *fbc = &dev_priv->fbc;
|
||||
|
||||
fbc->possible_framebuffer_bits |= primary->frontbuffer_bit;
|
||||
}
|
||||
|
||||
primary->check_plane = intel_check_primary_plane;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
|
Reference in New Issue
Block a user