Commit 225c228a authored by Chandra Konduru's avatar Chandra Konduru Committed by Daniel Vetter

drm/i915/skl: don't fail colorkey + scaler request

There is a mplayer video failure reported with xv.
This is because there is a request to do both plane scaling
and colorkey. Because skl hw doesn't support plane scaling
and colorkey at the same time, request is failed which is expected
behavior.

To make xv operate, this patch allows colorkey continue to work
without using scaler. Then behavior would be similar to platforms
without plane scaler support.
Signed-off-by: default avatarChandra Konduru <chandra.konduru@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90449
[danvet: change can_scale to bool as requested by Ville.]
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 6d50b065
...@@ -4502,9 +4502,10 @@ skl_update_scaler_users( ...@@ -4502,9 +4502,10 @@ skl_update_scaler_users(
} }
/* check colorkey */ /* check colorkey */
if (intel_plane && intel_plane->ckey.flags != I915_SET_COLORKEY_NONE) { if (WARN_ON(intel_plane &&
DRM_DEBUG_KMS("PLANE:%d scaling with color key not allowed", intel_plane->ckey.flags != I915_SET_COLORKEY_NONE)) {
intel_plane->base.base.id); DRM_DEBUG_KMS("PLANE:%d scaling %ux%u->%ux%u not allowed with colorkey",
intel_plane->base.base.id, src_w, src_h, dst_w, dst_h);
return -EINVAL; return -EINVAL;
} }
...@@ -13261,8 +13262,11 @@ intel_check_primary_plane(struct drm_plane *plane, ...@@ -13261,8 +13262,11 @@ intel_check_primary_plane(struct drm_plane *plane,
intel_atomic_get_crtc_state(state->base.state, intel_crtc) : NULL; intel_atomic_get_crtc_state(state->base.state, intel_crtc) : NULL;
if (INTEL_INFO(dev)->gen >= 9) { if (INTEL_INFO(dev)->gen >= 9) {
/* use scaler when colorkey is not required */
if (to_intel_plane(plane)->ckey.flags == I915_SET_COLORKEY_NONE) {
min_scale = 1; min_scale = 1;
max_scale = skl_max_scale(intel_crtc, crtc_state); max_scale = skl_max_scale(intel_crtc, crtc_state);
}
can_position = true; can_position = true;
} }
......
...@@ -770,6 +770,7 @@ intel_check_sprite_plane(struct drm_plane *plane, ...@@ -770,6 +770,7 @@ intel_check_sprite_plane(struct drm_plane *plane,
const struct drm_rect *clip = &state->clip; const struct drm_rect *clip = &state->clip;
int hscale, vscale; int hscale, vscale;
int max_scale, min_scale; int max_scale, min_scale;
bool can_scale;
int pixel_size; int pixel_size;
int ret; int ret;
...@@ -794,18 +795,29 @@ intel_check_sprite_plane(struct drm_plane *plane, ...@@ -794,18 +795,29 @@ intel_check_sprite_plane(struct drm_plane *plane,
return -EINVAL; return -EINVAL;
} }
/* setup can_scale, min_scale, max_scale */
if (INTEL_INFO(dev)->gen >= 9) {
/* use scaler when colorkey is not required */
if (intel_plane->ckey.flags == I915_SET_COLORKEY_NONE) {
can_scale = 1;
min_scale = 1;
max_scale = skl_max_scale(intel_crtc, crtc_state);
} else {
can_scale = 0;
min_scale = DRM_PLANE_HELPER_NO_SCALING;
max_scale = DRM_PLANE_HELPER_NO_SCALING;
}
} else {
can_scale = intel_plane->can_scale;
max_scale = intel_plane->max_downscale << 16;
min_scale = intel_plane->can_scale ? 1 : (1 << 16);
}
/* /*
* FIXME the following code does a bunch of fuzzy adjustments to the * FIXME the following code does a bunch of fuzzy adjustments to the
* coordinates and sizes. We probably need some way to decide whether * coordinates and sizes. We probably need some way to decide whether
* more strict checking should be done instead. * more strict checking should be done instead.
*/ */
max_scale = intel_plane->max_downscale << 16;
min_scale = intel_plane->can_scale ? 1 : (1 << 16);
if (INTEL_INFO(dev)->gen >= 9) {
min_scale = 1;
max_scale = skl_max_scale(intel_crtc, crtc_state);
}
drm_rect_rotate(src, fb->width << 16, fb->height << 16, drm_rect_rotate(src, fb->width << 16, fb->height << 16,
state->base.rotation); state->base.rotation);
...@@ -876,7 +888,7 @@ intel_check_sprite_plane(struct drm_plane *plane, ...@@ -876,7 +888,7 @@ intel_check_sprite_plane(struct drm_plane *plane,
* Must keep src and dst the * Must keep src and dst the
* same if we can't scale. * same if we can't scale.
*/ */
if (!intel_plane->can_scale) if (!can_scale)
crtc_w &= ~1; crtc_w &= ~1;
if (crtc_w == 0) if (crtc_w == 0)
...@@ -888,7 +900,7 @@ intel_check_sprite_plane(struct drm_plane *plane, ...@@ -888,7 +900,7 @@ intel_check_sprite_plane(struct drm_plane *plane,
if (state->visible && (src_w != crtc_w || src_h != crtc_h)) { if (state->visible && (src_w != crtc_w || src_h != crtc_h)) {
unsigned int width_bytes; unsigned int width_bytes;
WARN_ON(!intel_plane->can_scale); WARN_ON(!can_scale);
/* FIXME interlacing min height is 6 */ /* FIXME interlacing min height is 6 */
......
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