Re: [Intel-gfx] [v3 09/13] drm/i915: Add rotation property for sprites

Daniel Vetter
2014-07-11T21:59:22Z

On Tue, Jul 08, 2014 at 10:31:59AM +0530, sonika.jindal@intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Sprite planes support 180 degree rotation. The lower layers are now in
> place, so hook in the standard rotation property to expose the feature
> to the users.
>
> v2: Moving rotation_property to drm_plane

This change is wrong and I haven't figured out who suggested it. The
actual property is global (i.e. we should only have 1), but then it can be
attached to different pieces.

So here's what we need to do instead:
- Add the rotation property to dev->mode_config.
- Convert omapdrm to also store it there by moving it out of the omap
driver private structure.
- Probably better to just unconditionally set it up, but not sure.
- Adjust the fb helper code accordingly.
- Rip the omap restore rotation code in lastclose since the fb helper will
now take care of this.

I've merged the drm core parts for now but dropped the i915 implementation
and the fb helper patch again.

Thanks, Daniel

>
> Cc: dri-devel@lists.freedesktop.org
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Sonika Jindal <sonika.jindal@intel.com>
> Reviewed-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/i915/intel_sprite.c | 40 ++++++++++++++++++++++++++++++++++-
> include/drm/drm_crtc.h | 1 +
> 2 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index cbad738..aa63027 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -1202,6 +1202,29 @@ out_unlock:
> return ret;
> }
>
> +static int intel_plane_set_property(struct drm_plane *plane,
> + struct drm_property *prop,
> + uint64_t val)
> +{
> + struct intel_plane *intel_plane = to_intel_plane(plane);
> + uint64_t old_val;
> + int ret = -ENOENT;
> +
> + if (prop == plane->rotation_property) {
> + /* exactly one rotation angle please */
> + if (hweight32(val & 0xf) != 1)
> + return -EINVAL;
> +
> + old_val = intel_plane->rotation;
> + intel_plane->rotation = val;
> + ret = intel_plane_restore(plane);
> + if (ret)
> + intel_plane->rotation = old_val;
> + }
> +
> + return ret;
> +}
> +
> int intel_plane_restore(struct drm_plane *plane)
> {
> struct intel_plane *intel_plane = to_intel_plane(plane);
> @@ -1228,6 +1251,7 @@ static const struct drm_plane_funcs intel_plane_funcs = {
> .update_plane = intel_update_plane,
> .disable_plane = intel_disable_plane,
> .destroy = intel_destroy_plane,
> + .set_property = intel_plane_set_property,
> };
>
> static uint32_t ilk_plane_formats[] = {
> @@ -1338,8 +1362,22 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
> &intel_plane_funcs,
> plane_formats, num_plane_formats,
> false);
> - if (ret)
> + if (ret) {
> kfree(intel_plane);
> + goto out;
> + }
> +
> + if (!intel_plane->base.rotation_property)
> + intel_plane->base.rotation_property =
> + drm_mode_create_rotation_property(dev,
> + BIT(DRM_ROTATE_0) |
> + BIT(DRM_ROTATE_180));
> +
> + if (intel_plane->base.rotation_property)
> + drm_object_attach_property(&intel_plane->base.base,
> + intel_plane->base.rotation_property,
> + intel_plane->rotation);
>
> + out:
> return ret;
> }
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 08ed55e..6006c70 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -615,6 +615,7 @@ struct drm_plane {
>
> const struct drm_plane_funcs *funcs;
>
> + struct drm_property *rotation_property;
> struct drm_object_properties properties;
>
> enum drm_plane_type type;
> --
> 1.7.10.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch