drm/i915: Grab dev->struct_mutex in i915_gem_pageflip_info
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_debugfs.c
index 333dd12d62f43c193a2d589b27c6a749bdc93e6d..76c2572872f65cff0047b0e06319db8cc59a1505 100644 (file)
@@ -513,6 +513,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        unsigned long flags;
        struct intel_crtc *crtc;
+       int ret;
+
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
 
        for_each_intel_crtc(dev, crtc) {
                const char pipe = pipe_name(crtc->pipe);
@@ -554,6 +559,8 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
                spin_unlock_irqrestore(&dev->event_lock, flags);
        }
 
+       mutex_unlock(&dev->struct_mutex);
+
        return 0;
 }
 
@@ -1027,7 +1034,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                           MEMSTAT_VID_SHIFT);
                seq_printf(m, "Current P-state: %d\n",
                           (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
-       } else if ((IS_GEN6(dev) || IS_GEN7(dev)) && !IS_VALLEYVIEW(dev)) {
+       } else if (IS_GEN6(dev) || (IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) ||
+                  IS_BROADWELL(dev)) {
                u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
                u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
                u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
@@ -1046,7 +1054,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
 
                reqf = I915_READ(GEN6_RPNSWREQ);
                reqf &= ~GEN6_TURBO_DISABLE;
-               if (IS_HASWELL(dev))
+               if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                        reqf >>= 24;
                else
                        reqf >>= 25;
@@ -1063,7 +1071,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
                rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
                rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
-               if (IS_HASWELL(dev))
+               if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                        cagf = (rpstat & HSW_CAGF_MASK) >> HSW_CAGF_SHIFT;
                else
                        cagf = (rpstat & GEN6_CAGF_MASK) >> GEN6_CAGF_SHIFT;
@@ -1675,9 +1683,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 
 #ifdef CONFIG_DRM_I915_FBDEV
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int ret = mutex_lock_interruptible(&dev->mode_config.mutex);
-       if (ret)
-               return ret;
 
        ifbdev = dev_priv->fbdev;
        fb = to_intel_framebuffer(ifbdev->helper.fb);
@@ -1690,7 +1695,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
                   atomic_read(&fb->base.refcount.refcount));
        describe_obj(m, fb->obj);
        seq_putc(m, '\n');
-       mutex_unlock(&dev->mode_config.mutex);
 #endif
 
        mutex_lock(&dev->mode_config.fb_lock);
@@ -1721,7 +1725,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
        struct intel_context *ctx;
        int ret, i;
 
-       ret = mutex_lock_interruptible(&dev->mode_config.mutex);
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
 
@@ -1751,7 +1755,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
                seq_putc(m, '\n');
        }
 
-       mutex_unlock(&dev->mode_config.mutex);
+       mutex_unlock(&dev->struct_mutex);
 
        return 0;
 }
@@ -1976,10 +1980,12 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
 
        seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support));
        seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok));
+       seq_printf(m, "Enabled: %s\n", yesno(dev_priv->psr.enabled));
+       seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active));
 
        enabled = HAS_PSR(dev) &&
                I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE;
-       seq_printf(m, "Enabled: %s\n", yesno(enabled));
+       seq_printf(m, "HW Enabled & Active bit: %s\n", yesno(enabled));
 
        if (HAS_PSR(dev))
                psrperf = I915_READ(EDP_PSR_PERF_CNT(dev)) &
@@ -2197,12 +2203,12 @@ static void intel_encoder_info(struct seq_file *m,
 
        encoder = &intel_encoder->base;
        seq_printf(m, "\tencoder %d: type: %s, connectors:\n",
-                  encoder->base.id, drm_get_encoder_name(encoder));
+                  encoder->base.id, encoder->name);
        for_each_connector_on_encoder(dev, encoder, intel_connector) {
                struct drm_connector *connector = &intel_connector->base;
                seq_printf(m, "\t\tconnector %d: type: %s, status: %s",
                           connector->base.id,
-                          drm_get_connector_name(connector),
+                          connector->name,
                           drm_get_connector_status_name(connector->status));
                if (connector->status == connector_status_connected) {
                        struct drm_display_mode *mode = &crtc->mode;
@@ -2221,9 +2227,12 @@ static void intel_crtc_info(struct seq_file *m, struct intel_crtc *intel_crtc)
        struct drm_crtc *crtc = &intel_crtc->base;
        struct intel_encoder *intel_encoder;
 
-       seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
-                  crtc->primary->fb->base.id, crtc->x, crtc->y,
-                  crtc->primary->fb->width, crtc->primary->fb->height);
+       if (crtc->primary->fb)
+               seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
+                          crtc->primary->fb->base.id, crtc->x, crtc->y,
+                          crtc->primary->fb->width, crtc->primary->fb->height);
+       else
+               seq_puts(m, "\tprimary plane disabled\n");
        for_each_encoder_on_crtc(dev, crtc, intel_encoder)
                intel_encoder_info(m, intel_crtc, intel_encoder);
 }
@@ -2273,7 +2282,7 @@ static void intel_connector_info(struct seq_file *m,
        struct drm_display_mode *mode;
 
        seq_printf(m, "connector %d: type %s, status: %s\n",
-                  connector->base.id, drm_get_connector_name(connector),
+                  connector->base.id, connector->name,
                   drm_get_connector_status_name(connector->status));
        if (connector->status == connector_status_connected) {
                seq_printf(m, "\tname: %s\n", connector->display_info.name);
@@ -2353,10 +2362,14 @@ static int i915_display_info(struct seq_file *m, void *unused)
 
                        active = cursor_position(dev, crtc->pipe, &x, &y);
                        seq_printf(m, "\tcursor visible? %s, position (%d, %d), addr 0x%08x, active? %s\n",
-                                  yesno(crtc->cursor_visible),
+                                  yesno(crtc->cursor_base),
                                   x, y, crtc->cursor_addr,
                                   yesno(active));
                }
+
+               seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s \n",
+                          yesno(!crtc->cpu_fifo_underrun_disabled),
+                          yesno(!crtc->pch_fifo_underrun_disabled));
        }
 
        seq_printf(m, "\n");
@@ -2609,7 +2622,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_device *dev, enum pipe pipe,
 
        *source = INTEL_PIPE_CRC_SOURCE_PIPE;
 
-       mutex_lock(&dev->mode_config.mutex);
+       drm_modeset_lock_all(dev);
        list_for_each_entry(encoder, &dev->mode_config.encoder_list,
                            base.head) {
                if (!encoder->base.crtc)
@@ -2645,7 +2658,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_device *dev, enum pipe pipe,
                        break;
                }
        }
-       mutex_unlock(&dev->mode_config.mutex);
+       drm_modeset_unlock_all(dev);
 
        return ret;
 }
@@ -2923,11 +2936,16 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
        /* real source -> none transition */
        if (source == INTEL_PIPE_CRC_SOURCE_NONE) {
                struct intel_pipe_crc_entry *entries;
+               struct intel_crtc *crtc =
+                       to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
 
                DRM_DEBUG_DRIVER("stopping CRCs for pipe %c\n",
                                 pipe_name(pipe));
 
-               intel_wait_for_vblank(dev, pipe);
+               drm_modeset_lock(&crtc->base.mutex, NULL);
+               if (crtc->active)
+                       intel_wait_for_vblank(dev, pipe);
+               drm_modeset_unlock(&crtc->base.mutex);
 
                spin_lock_irq(&pipe_crc->lock);
                entries = pipe_crc->entries;
@@ -3500,7 +3518,7 @@ i915_max_freq_get(void *data, u64 *val)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3526,7 +3544,7 @@ i915_max_freq_set(void *data, u64 val)
        u32 rp_state_cap, hw_max, hw_min;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3581,7 +3599,7 @@ i915_min_freq_get(void *data, u64 *val)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3607,7 +3625,7 @@ i915_min_freq_set(void *data, u64 val)
        u32 rp_state_cap, hw_max, hw_min;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
This page took 0.028839 seconds and 5 git commands to generate.