]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'drm-intel-next-fixes-2015-04-15' of git://anongit.freedesktop.org/drm...
authorDave Airlie <airlied@redhat.com>
Wed, 15 Apr 2015 22:34:51 +0000 (08:34 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 15 Apr 2015 22:34:51 +0000 (08:34 +1000)
Misc i915 fixes.

* tag 'drm-intel-next-fixes-2015-04-15' of git://anongit.freedesktop.org/drm-intel:
  drm/i915: Dont enable CS_PARSER_ERROR interrupts at all
  drm/i915: Move drm_framebuffer_unreference out of struct_mutex for takeover
  drm/i915: Allocate connector state together with the connectors
  drm/i915/chv: Remove DPIO force latency causing interpair skew issue
  drm/i915: Don't cancel DRRS worker synchronously for flush/invalidate
  drm/i915: Fix locking in DRRS flush/invalidate hooks

13 files changed:
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_dp_mst.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_dsi.c
drivers/gpu/drm/i915/intel_dvo.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/i915/intel_tv.c

index 14ecb4d13a1aa2b24ca102097c90811bddc8c190..6d494432b19f6a79cc11df25f920e5e0621ca868 100644 (file)
@@ -3598,14 +3598,12 @@ static int i8xx_irq_postinstall(struct drm_device *dev)
                ~(I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
                  I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
                  I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
-                 I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT |
-                 I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT);
+                 I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT);
        I915_WRITE16(IMR, dev_priv->irq_mask);
 
        I915_WRITE16(IER,
                     I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
                     I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
-                    I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT |
                     I915_USER_INTERRUPT);
        POSTING_READ16(IER);
 
@@ -3767,14 +3765,12 @@ static int i915_irq_postinstall(struct drm_device *dev)
                  I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
                  I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
                  I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
-                 I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT |
-                 I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT);
+                 I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT);
 
        enable_mask =
                I915_ASLE_INTERRUPT |
                I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
                I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
-               I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT |
                I915_USER_INTERRUPT;
 
        if (I915_HAS_HOTPLUG(dev)) {
index 6095a998bdac38d32bc2abb30f8d82ee4bbd7f36..515d7123785dc6fda34aceda21a2bb6f6cbe963e 100644 (file)
@@ -851,7 +851,7 @@ void intel_crt_init(struct drm_device *dev)
        if (!crt)
                return;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(crt);
                return;
index 47b9307da24b23c8fe03f9d90381560ad57bf523..3eb0efc2dd0d7824f445b8a667fdb46733022346 100644 (file)
@@ -2200,7 +2200,7 @@ intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
        struct intel_connector *connector;
        enum port port = intel_dig_port->port;
 
-       connector = kzalloc(sizeof(*connector), GFP_KERNEL);
+       connector = intel_connector_alloc();
        if (!connector)
                return NULL;
 
@@ -2219,7 +2219,7 @@ intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
        struct intel_connector *connector;
        enum port port = intel_dig_port->port;
 
-       connector = kzalloc(sizeof(*connector), GFP_KERNEL);
+       connector = intel_connector_alloc();
        if (!connector)
                return NULL;
 
index 75955fee6d24b1aaa2b622d5c22704c8241b4c53..d547d9c8dda2226909fcdbc5193dde4e2013246a 100644 (file)
@@ -5636,6 +5636,34 @@ static void intel_connector_check_state(struct intel_connector *connector)
        }
 }
 
+int intel_connector_init(struct intel_connector *connector)
+{
+       struct drm_connector_state *connector_state;
+
+       connector_state = kzalloc(sizeof *connector_state, GFP_KERNEL);
+       if (!connector_state)
+               return -ENOMEM;
+
+       connector->base.state = connector_state;
+       return 0;
+}
+
+struct intel_connector *intel_connector_alloc(void)
+{
+       struct intel_connector *connector;
+
+       connector = kzalloc(sizeof *connector, GFP_KERNEL);
+       if (!connector)
+               return NULL;
+
+       if (intel_connector_init(connector) < 0) {
+               kfree(connector);
+               return NULL;
+       }
+
+       return connector;
+}
+
 /* Even simpler default implementation, if there's really no special case to
  * consider. */
 void intel_connector_dpms(struct drm_connector *connector, int mode)
@@ -13003,7 +13031,6 @@ static void intel_setup_outputs(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *encoder;
-       struct drm_connector *connector;
        bool dpd_is_edp = false;
 
        intel_lvds_init(dev);
@@ -13139,39 +13166,6 @@ static void intel_setup_outputs(struct drm_device *dev)
        if (SUPPORTS_TV(dev))
                intel_tv_init(dev);
 
-       /*
-        * FIXME:  We don't have full atomic support yet, but we want to be
-        * able to enable/test plane updates via the atomic interface in the
-        * meantime.  However as soon as we flip DRIVER_ATOMIC on, the DRM core
-        * will take some atomic codepaths to lookup properties during
-        * drmModeGetConnector() that unconditionally dereference
-        * connector->state.
-        *
-        * We create a dummy connector state here for each connector to ensure
-        * the DRM core doesn't try to dereference a NULL connector->state.
-        * The actual connector properties will never be updated or contain
-        * useful information, but since we're doing this specifically for
-        * testing/debug of the plane operations (and only when a specific
-        * kernel module option is given), that shouldn't really matter.
-        *
-        * We are also relying on these states to convert the legacy mode set
-        * to use a drm_atomic_state struct. The states are kept consistent
-        * with actual state, so that it is safe to rely on that instead of
-        * the staged config.
-        *
-        * Once atomic support for crtc's + connectors lands, this loop should
-        * be removed since we'll be setting up real connector state, which
-        * will contain Intel-specific properties.
-        */
-       list_for_each_entry(connector,
-                           &dev->mode_config.connector_list,
-                           head) {
-               if (!WARN_ON(connector->state)) {
-                       connector->state = kzalloc(sizeof(*connector->state),
-                                                  GFP_KERNEL);
-               }
-       }
-
        intel_psr_init(dev);
 
        for_each_intel_encoder(dev, encoder) {
@@ -14265,6 +14259,7 @@ void intel_modeset_gem_init(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_crtc *c;
        struct drm_i915_gem_object *obj;
+       int ret;
 
        mutex_lock(&dev->struct_mutex);
        intel_init_gt_powersave(dev);
@@ -14289,16 +14284,18 @@ void intel_modeset_gem_init(struct drm_device *dev)
         * pinned & fenced.  When we do the allocation it's too early
         * for this.
         */
-       mutex_lock(&dev->struct_mutex);
        for_each_crtc(dev, c) {
                obj = intel_fb_obj(c->primary->fb);
                if (obj == NULL)
                        continue;
 
-               if (intel_pin_and_fence_fb_obj(c->primary,
-                                              c->primary->fb,
-                                              c->primary->state,
-                                              NULL)) {
+               mutex_lock(&dev->struct_mutex);
+               ret = intel_pin_and_fence_fb_obj(c->primary,
+                                                c->primary->fb,
+                                                c->primary->state,
+                                                NULL);
+               mutex_unlock(&dev->struct_mutex);
+               if (ret) {
                        DRM_ERROR("failed to pin boot fb on pipe %d\n",
                                  to_intel_crtc(c)->pipe);
                        drm_framebuffer_unreference(c->primary->fb);
@@ -14306,7 +14303,6 @@ void intel_modeset_gem_init(struct drm_device *dev)
                        update_state_fb(c->primary);
                }
        }
-       mutex_unlock(&dev->struct_mutex);
 
        intel_backlight_register(dev);
 }
index b70e635ccaf4f249c7527dbc9c2c2a39d3530143..d0237102c27ecf1323e39ee1d67cee07e3760f60 100644 (file)
@@ -2742,11 +2742,6 @@ static void chv_pre_enable_dp(struct intel_encoder *encoder)
 
        /* Program Tx lane latency optimal setting*/
        for (i = 0; i < 4; i++) {
-               /* Set the latency optimal bit */
-               data = (i == 1) ? 0x0 : 0x6;
-               vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i),
-                               data << DPIO_FRC_LATENCY_SHFIT);
-
                /* Set the upar bit */
                data = (i == 1) ? 0x0 : 0x1;
                vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
@@ -5157,7 +5152,6 @@ static void intel_edp_drrs_downclock_work(struct work_struct *work)
                        downclock_mode->vrefresh);
 
 unlock:
-
        mutex_unlock(&dev_priv->drrs.mutex);
 }
 
@@ -5179,12 +5173,17 @@ void intel_edp_drrs_invalidate(struct drm_device *dev,
        struct drm_crtc *crtc;
        enum pipe pipe;
 
-       if (!dev_priv->drrs.dp)
+       if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED)
                return;
 
-       cancel_delayed_work_sync(&dev_priv->drrs.work);
+       cancel_delayed_work(&dev_priv->drrs.work);
 
        mutex_lock(&dev_priv->drrs.mutex);
+       if (!dev_priv->drrs.dp) {
+               mutex_unlock(&dev_priv->drrs.mutex);
+               return;
+       }
+
        crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
        pipe = to_intel_crtc(crtc)->pipe;
 
@@ -5218,12 +5217,17 @@ void intel_edp_drrs_flush(struct drm_device *dev,
        struct drm_crtc *crtc;
        enum pipe pipe;
 
-       if (!dev_priv->drrs.dp)
+       if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED)
                return;
 
-       cancel_delayed_work_sync(&dev_priv->drrs.work);
+       cancel_delayed_work(&dev_priv->drrs.work);
 
        mutex_lock(&dev_priv->drrs.mutex);
+       if (!dev_priv->drrs.dp) {
+               mutex_unlock(&dev_priv->drrs.mutex);
+               return;
+       }
+
        crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
        pipe = to_intel_crtc(crtc)->pipe;
        dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits;
@@ -5294,6 +5298,9 @@ intel_dp_drrs_init(struct intel_connector *intel_connector,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_display_mode *downclock_mode = NULL;
 
+       INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
+       mutex_init(&dev_priv->drrs.mutex);
+
        if (INTEL_INFO(dev)->gen <= 6) {
                DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n");
                return NULL;
@@ -5312,10 +5319,6 @@ intel_dp_drrs_init(struct intel_connector *intel_connector,
                return NULL;
        }
 
-       INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
-
-       mutex_init(&dev_priv->drrs.mutex);
-
        dev_priv->drrs.type = dev_priv->vbt.drrs_type;
 
        dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR;
@@ -5587,7 +5590,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
        if (!intel_dig_port)
                return;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(intel_dig_port);
                return;
index 5329c855acce71f4fab98385900e5c99511be986..5cb47482d29fb7f70ddeb540f5d41579152c66f1 100644 (file)
@@ -415,7 +415,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
        struct drm_connector *connector;
        int i;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector)
                return NULL;
 
index 6036e3b73b7b9dd7a20cef915643dcb707e055be..744db4d0c68fb39cf9448edbabb85acfb6a6c76b 100644 (file)
@@ -930,6 +930,8 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc);
 void intel_crtc_control(struct drm_crtc *crtc, bool enable);
 void intel_crtc_update_dpms(struct drm_crtc *crtc);
 void intel_encoder_destroy(struct drm_encoder *encoder);
+int intel_connector_init(struct intel_connector *);
+struct intel_connector *intel_connector_alloc(void);
 void intel_connector_dpms(struct drm_connector *, int mode);
 bool intel_connector_get_hw_state(struct intel_connector *connector);
 void intel_modeset_check_state(struct drm_device *dev);
index 572251e9810bc40bacc3862ed23387d281fced4d..51966426addfbd612fa4d34f97e565590b6fbd51 100644 (file)
@@ -1007,7 +1007,7 @@ void intel_dsi_init(struct drm_device *dev)
        if (!intel_dsi)
                return;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(intel_dsi);
                return;
index 4ccd6c3f133d3d3812bd2edc969760ff4a041ff9..770040ff486ecd62f029f74b1697a3f4aa0d6c04 100644 (file)
@@ -469,7 +469,7 @@ void intel_dvo_init(struct drm_device *dev)
        if (!intel_dvo)
                return;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(intel_dvo);
                return;
index cacbafdad3abd300a02d2d35e22dcc9fd2de037f..bfbe07b6ddcedb3d00b724ad5691084c0621c2ef 100644 (file)
@@ -1515,11 +1515,6 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
 
        /* Program Tx latency optimal setting */
        for (i = 0; i < 4; i++) {
-               /* Set the latency optimal bit */
-               data = (i == 1) ? 0x0 : 0x6;
-               vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i),
-                               data << DPIO_FRC_LATENCY_SHFIT);
-
                /* Set the upar bit */
                data = (i == 1) ? 0x0 : 0x1;
                vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
@@ -1755,7 +1750,7 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
        if (!intel_dig_port)
                return;
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(intel_dig_port);
                return;
index 06d2da336f7c863d7ccff9438f2cc54487b4caa8..5abda1d2c0182ad9f4bec4ad7e9fa4c640cb9d32 100644 (file)
@@ -946,6 +946,12 @@ void intel_lvds_init(struct drm_device *dev)
                return;
        }
 
+       if (intel_connector_init(&lvds_connector->base) < 0) {
+               kfree(lvds_connector);
+               kfree(lvds_encoder);
+               return;
+       }
+
        lvds_encoder->attached_connector = lvds_connector;
 
        intel_encoder = &lvds_encoder->base;
index f5b7e1e7c5e039ffe53023fcb166c9fd9b5f6e76..e87d2f418de4f381d50471494e5fe8050de4bdb2 100644 (file)
@@ -2426,6 +2426,22 @@ intel_sdvo_add_hdmi_properties(struct intel_sdvo *intel_sdvo,
        }
 }
 
+static struct intel_sdvo_connector *intel_sdvo_connector_alloc(void)
+{
+       struct intel_sdvo_connector *sdvo_connector;
+
+       sdvo_connector = kzalloc(sizeof(*sdvo_connector), GFP_KERNEL);
+       if (!sdvo_connector)
+               return NULL;
+
+       if (intel_connector_init(&sdvo_connector->base) < 0) {
+               kfree(sdvo_connector);
+               return NULL;
+       }
+
+       return sdvo_connector;
+}
+
 static bool
 intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
 {
@@ -2437,7 +2453,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
 
        DRM_DEBUG_KMS("initialising DVI device %d\n", device);
 
-       intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL);
+       intel_sdvo_connector = intel_sdvo_connector_alloc();
        if (!intel_sdvo_connector)
                return false;
 
@@ -2491,7 +2507,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
 
        DRM_DEBUG_KMS("initialising TV type %d\n", type);
 
-       intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL);
+       intel_sdvo_connector = intel_sdvo_connector_alloc();
        if (!intel_sdvo_connector)
                return false;
 
@@ -2570,7 +2586,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
 
        DRM_DEBUG_KMS("initialising LVDS device %d\n", device);
 
-       intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL);
+       intel_sdvo_connector = intel_sdvo_connector_alloc();
        if (!intel_sdvo_connector)
                return false;
 
index bc1d9d74090411acfedacd5df725f80be75a151b..8b9d325bda3c7e1c73af68afb6dc46ac3cb9d4fc 100644 (file)
@@ -1621,7 +1621,7 @@ intel_tv_init(struct drm_device *dev)
                return;
        }
 
-       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       intel_connector = intel_connector_alloc();
        if (!intel_connector) {
                kfree(intel_tv);
                return;