On Thu, Oct 23, 2014 at 07:41:34AM -0700, Matt Roper wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > The cursor plane also supports 180 degree rotation. Add a new > "cursor-rotation" property on the crtc which controls this. > > Unlike sprites, the cursor has a fixed size, so if you have a small > cursor image with the rest of the bo filled by transparent pixels, > simply flipping the rotation property will cause the visible part > of the cursor to shift. This is something to keep in mind when > using cursor rotation. > > v2: Fix gen4/vlv by offsetting the base address appropriately > > v3: Removing cursor-rotation property and using rotation property on cursor > plane. > v4: Changing the author name back to Ville. > > v5 (by Matt Roper): Slight tweaking to apply against latest di-nightly > codebase. > > Cc: Sagar Kamble <sagar.a.kamble@xxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Sonika Jindal <sonika.jindal@xxxxxxxxx> > Reviewed-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > Tested-by (IVB): Matt Roper <matthew.d.roper@xxxxxxxxx> > Signed-off-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > --- > > This is the tweaked version of the patch I used for my review/testing. My only > review comment was about a comment that I thought could use some clarification, > so I'll leave it up to Sonika whether she wants to incorporate my suggestion or > not; either way this patch has my r-b tag. I think together with the HAS_GMCH_DISPLAY check the comment is clear. Queued for -next, thanks for the patch. -Daniel > > > drivers/gpu/drm/i915/i915_reg.h | 1 + > drivers/gpu/drm/i915/intel_display.c | 25 +++++++++++++++++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 345293c..7e7002b 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -4207,6 +4207,7 @@ enum punit_power_well { > #define MCURSOR_PIPE_A 0x00 > #define MCURSOR_PIPE_B (1 << 28) > #define MCURSOR_GAMMA_ENABLE (1 << 26) > +#define CURSOR_ROTATE_180 (1<<15) > #define CURSOR_TRICKLE_FEED_DISABLE (1 << 14) > #define _CURABASE 0x70084 > #define _CURAPOS 0x70088 > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 0529462..910e8a4 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -8343,6 +8343,9 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) > cntl |= CURSOR_PIPE_CSC_ENABLE; > } > > + if (to_intel_plane(crtc->cursor)->rotation == BIT(DRM_ROTATE_180)) > + cntl |= CURSOR_ROTATE_180; > + > if (intel_crtc->cursor_cntl != cntl) { > I915_WRITE(CURCNTR(pipe), cntl); > POSTING_READ(CURCNTR(pipe)); > @@ -8400,6 +8403,13 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, > > I915_WRITE(CURPOS(pipe), pos); > > + /* ILK+ do this automagically */ > + if (HAS_GMCH_DISPLAY(dev) && > + to_intel_plane(crtc->cursor)->rotation == BIT(DRM_ROTATE_180)) { > + base += (intel_crtc->cursor_height * > + intel_crtc->cursor_width - 1) * 4; > + } > + > if (IS_845G(dev) || IS_I865G(dev)) > i845_update_cursor(crtc, base); > else > @@ -12022,6 +12032,7 @@ static const struct drm_plane_funcs intel_cursor_plane_funcs = { > .update_plane = intel_cursor_plane_update, > .disable_plane = intel_cursor_plane_disable, > .destroy = intel_plane_destroy, > + .set_property = intel_plane_set_property, > }; > > static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev, > @@ -12037,12 +12048,26 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev, > cursor->max_downscale = 1; > cursor->pipe = pipe; > cursor->plane = pipe; > + cursor->rotation = BIT(DRM_ROTATE_0); > > drm_universal_plane_init(dev, &cursor->base, 0, > &intel_cursor_plane_funcs, > intel_cursor_formats, > ARRAY_SIZE(intel_cursor_formats), > DRM_PLANE_TYPE_CURSOR); > + > + if (INTEL_INFO(dev)->gen >= 4) { > + if (!dev->mode_config.rotation_property) > + dev->mode_config.rotation_property = > + drm_mode_create_rotation_property(dev, > + BIT(DRM_ROTATE_0) | > + BIT(DRM_ROTATE_180)); > + if (dev->mode_config.rotation_property) > + drm_object_attach_property(&cursor->base.base, > + dev->mode_config.rotation_property, > + cursor->rotation); > + } > + > return &cursor->base; > } > > -- > 1.8.5.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx