From: Paulo Zanoni <paulo.r.zan...@intel.com>

This property is needed by to inform the KVMr feature about our
current rotation: whenever we change the rotation, we should change
that property so that the KVMr knows that the screen is rotated.

Signed-off-by: Paulo Zanoni <paulo.r.zan...@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h      |    5 +++
 drivers/gpu/drm/i915/intel_display.c |   57 ++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_drv.h     |    2 +
 3 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index c3afb78..49e4f10 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2324,6 +2324,11 @@
 #define   PIPECONF_INTERLACE_FIELD_0_ONLY              (7 << 21)
 #define   PIPECONF_INTERLACE_MASK      (7 << 21)
 #define   PIPECONF_CXSR_DOWNCLOCK      (1<<16)
+#define   PIPECONF_ROTATION_MASK       (3 << 14)
+#define   PIPECONF_ROTATION_0  (0 << 14)
+#define   PIPECONF_ROTATION_90 (1 << 14)
+#define   PIPECONF_ROTATION_180        (2 << 14)
+#define   PIPECONF_ROTATION_270        (3 << 14)
 #define   PIPECONF_BPP_MASK    (0x000000e0)
 #define   PIPECONF_BPP_8       (0<<5)
 #define   PIPECONF_BPP_10      (1<<5)
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 29743de..7ec1b18 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7072,6 +7072,8 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
                kfree(work);
        }
 
+       drm_property_destroy(dev, intel_crtc->rotation_property);
+
        drm_crtc_cleanup(crtc);
 
        kfree(intel_crtc);
@@ -7529,6 +7531,49 @@ static void intel_crtc_reset(struct drm_crtc *crtc)
        intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);
 }
 
+static void intel_crtc_set_rotation(struct drm_crtc *crtc,
+                                   uint64_t rotation)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       int reg = PIPECONF(intel_crtc->pipe);
+       u32 val = I915_READ(reg);
+
+       val &= ~PIPECONF_ROTATION_MASK;
+
+       switch (rotation) {
+       case 0:
+               val |= PIPECONF_ROTATION_0;
+               break;
+       case 90:
+               val |= PIPECONF_ROTATION_90;
+               break;
+       case 180:
+               val |= PIPECONF_ROTATION_180;
+               break;
+       case 270:
+               val |= PIPECONF_ROTATION_270;
+               break;
+       default:
+               DRM_ERROR("Unsupported rotation: %Lu\n", rotation);
+               val |= PIPECONF_ROTATION_0;
+       }
+
+       I915_WRITE(reg, val);
+}
+
+static int intel_crtc_set_property(struct drm_crtc *crtc,
+                                  struct drm_property *property,
+                                  uint64_t val)
+{
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+
+       if (property == intel_crtc->rotation_property)
+               intel_crtc_set_rotation(crtc, val);
+       return 0;
+}
+
 static struct drm_crtc_helper_funcs intel_helper_funcs = {
        .dpms = intel_crtc_dpms,
        .mode_fixup = intel_crtc_mode_fixup,
@@ -7547,12 +7592,14 @@ static const struct drm_crtc_funcs intel_crtc_funcs = {
        .set_config = drm_crtc_helper_set_config,
        .destroy = intel_crtc_destroy,
        .page_flip = intel_crtc_page_flip,
+       .set_property = intel_crtc_set_property,
 };
 
 static void intel_crtc_init(struct drm_device *dev, int pipe)
 {
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc;
+       struct drm_property *prop;
        int i;
 
        intel_crtc = kzalloc(sizeof(struct intel_crtc) + (INTELFB_CONN_LIMIT * 
sizeof(struct drm_connector *)), GFP_KERNEL);
@@ -7568,6 +7615,16 @@ static void intel_crtc_init(struct drm_device *dev, int 
pipe)
                intel_crtc->lut_b[i] = i;
        }
 
+       prop = drm_property_create(dev, DRM_MODE_PROP_RANGE, "rotation", 2);
+       if (prop == NULL) {
+               DRM_ERROR("Failed to create rotation property!\n");
+               BUG();
+       }
+       prop->values[0] = 0;
+       prop->values[1] = 359;
+       drm_crtc_attach_property(&intel_crtc->base, prop, 0);
+       intel_crtc->rotation_property = prop;
+
        /* Swap pipes & planes for FBC on pre-965 */
        intel_crtc->pipe = pipe;
        intel_crtc->plane = pipe;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 5ac8a16..26bdc65 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -176,6 +176,8 @@ struct intel_crtc {
 
        bool no_pll; /* tertiary pipe for IVB */
        bool use_pll_a;
+
+       struct drm_property *rotation_property;
 };
 
 struct intel_plane {
-- 
1.7.8.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to