]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/i915_debugfs.c
drm/i915: Fix possible null dereference in framebuffer_info debugfs function
[karo-tx-linux.git] / drivers / gpu / drm / i915 / i915_debugfs.c
index 464fceb17d6d6123d647e409e0f44bc1fb86da90..bfd57fb597dc681ddb2954208404bddb91feb80b 100644 (file)
@@ -956,7 +956,6 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
        if (ret)
                return ret;
 
-       seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start);
        seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs);
        for (i = 0; i < dev_priv->num_fence_regs; i++) {
                struct drm_i915_gem_object *obj = dev_priv->fence_regs[i].obj;
@@ -1870,31 +1869,29 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 {
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
-       struct intel_fbdev *ifbdev = NULL;
-       struct intel_framebuffer *fb;
+       struct intel_framebuffer *fbdev_fb = NULL;
        struct drm_framebuffer *drm_fb;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       ifbdev = dev_priv->fbdev;
-       fb = to_intel_framebuffer(ifbdev->helper.fb);
-
-       seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
-                  fb->base.width,
-                  fb->base.height,
-                  fb->base.depth,
-                  fb->base.bits_per_pixel,
-                  fb->base.modifier[0],
-                  atomic_read(&fb->base.refcount.refcount));
-       describe_obj(m, fb->obj);
-       seq_putc(m, '\n');
+       if (to_i915(dev)->fbdev) {
+               fbdev_fb = to_intel_framebuffer(to_i915(dev)->fbdev->helper.fb);
+
+               seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
+                         fbdev_fb->base.width,
+                         fbdev_fb->base.height,
+                         fbdev_fb->base.depth,
+                         fbdev_fb->base.bits_per_pixel,
+                         fbdev_fb->base.modifier[0],
+                         atomic_read(&fbdev_fb->base.refcount.refcount));
+               describe_obj(m, fbdev_fb->obj);
+               seq_putc(m, '\n');
+       }
 #endif
 
        mutex_lock(&dev->mode_config.fb_lock);
        drm_for_each_fb(drm_fb, dev) {
-               fb = to_intel_framebuffer(drm_fb);
-               if (ifbdev && &fb->base == ifbdev->helper.fb)
+               struct intel_framebuffer *fb = to_intel_framebuffer(drm_fb);
+               if (fb == fbdev_fb)
                        continue;
 
                seq_printf(m, "user size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
@@ -2581,8 +2578,11 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
                }
        seq_puts(m, "\n");
 
-       /* CHV PSR has no kind of performance counter */
-       if (HAS_DDI(dev)) {
+       /*
+        * VLV/CHV PSR has no kind of performance counter
+        * SKL+ Perf counter is reset to 0 everytime DC state is entered
+        */
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
                psrperf = I915_READ(EDP_PSR_PERF_CNT) &
                        EDP_PSR_PERF_CNT_MASK;
 
@@ -2684,77 +2684,6 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused)
        return 0;
 }
 
-static const char *power_domain_str(enum intel_display_power_domain domain)
-{
-       switch (domain) {
-       case POWER_DOMAIN_PIPE_A:
-               return "PIPE_A";
-       case POWER_DOMAIN_PIPE_B:
-               return "PIPE_B";
-       case POWER_DOMAIN_PIPE_C:
-               return "PIPE_C";
-       case POWER_DOMAIN_PIPE_A_PANEL_FITTER:
-               return "PIPE_A_PANEL_FITTER";
-       case POWER_DOMAIN_PIPE_B_PANEL_FITTER:
-               return "PIPE_B_PANEL_FITTER";
-       case POWER_DOMAIN_PIPE_C_PANEL_FITTER:
-               return "PIPE_C_PANEL_FITTER";
-       case POWER_DOMAIN_TRANSCODER_A:
-               return "TRANSCODER_A";
-       case POWER_DOMAIN_TRANSCODER_B:
-               return "TRANSCODER_B";
-       case POWER_DOMAIN_TRANSCODER_C:
-               return "TRANSCODER_C";
-       case POWER_DOMAIN_TRANSCODER_EDP:
-               return "TRANSCODER_EDP";
-       case POWER_DOMAIN_PORT_DDI_A_2_LANES:
-               return "PORT_DDI_A_2_LANES";
-       case POWER_DOMAIN_PORT_DDI_A_4_LANES:
-               return "PORT_DDI_A_4_LANES";
-       case POWER_DOMAIN_PORT_DDI_B_2_LANES:
-               return "PORT_DDI_B_2_LANES";
-       case POWER_DOMAIN_PORT_DDI_B_4_LANES:
-               return "PORT_DDI_B_4_LANES";
-       case POWER_DOMAIN_PORT_DDI_C_2_LANES:
-               return "PORT_DDI_C_2_LANES";
-       case POWER_DOMAIN_PORT_DDI_C_4_LANES:
-               return "PORT_DDI_C_4_LANES";
-       case POWER_DOMAIN_PORT_DDI_D_2_LANES:
-               return "PORT_DDI_D_2_LANES";
-       case POWER_DOMAIN_PORT_DDI_D_4_LANES:
-               return "PORT_DDI_D_4_LANES";
-       case POWER_DOMAIN_PORT_DDI_E_2_LANES:
-               return "PORT_DDI_E_2_LANES";
-       case POWER_DOMAIN_PORT_DSI:
-               return "PORT_DSI";
-       case POWER_DOMAIN_PORT_CRT:
-               return "PORT_CRT";
-       case POWER_DOMAIN_PORT_OTHER:
-               return "PORT_OTHER";
-       case POWER_DOMAIN_VGA:
-               return "VGA";
-       case POWER_DOMAIN_AUDIO:
-               return "AUDIO";
-       case POWER_DOMAIN_PLLS:
-               return "PLLS";
-       case POWER_DOMAIN_AUX_A:
-               return "AUX_A";
-       case POWER_DOMAIN_AUX_B:
-               return "AUX_B";
-       case POWER_DOMAIN_AUX_C:
-               return "AUX_C";
-       case POWER_DOMAIN_AUX_D:
-               return "AUX_D";
-       case POWER_DOMAIN_GMBUS:
-               return "GMBUS";
-       case POWER_DOMAIN_INIT:
-               return "INIT";
-       default:
-               MISSING_CASE(domain);
-               return "?";
-       }
-}
-
 static int i915_power_domain_info(struct seq_file *m, void *unused)
 {
        struct drm_info_node *node = m->private;
@@ -2780,7 +2709,7 @@ static int i915_power_domain_info(struct seq_file *m, void *unused)
                                continue;
 
                        seq_printf(m, "  %-23s %d\n",
-                                power_domain_str(power_domain),
+                                intel_display_power_domain_str(power_domain),
                                 power_domains->domain_use_count[power_domain]);
                }
        }
@@ -3273,7 +3202,8 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
 
        seq_printf(m, "Workarounds applied: %d\n", dev_priv->workarounds.count);
        for (i = 0; i < dev_priv->workarounds.count; ++i) {
-               u32 addr, mask, value, read;
+               i915_reg_t addr;
+               u32 mask, value, read;
                bool ok;
 
                addr = dev_priv->workarounds.reg[i].addr;
@@ -3282,7 +3212,7 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
                read = I915_READ(addr);
                ok = (value & mask) == (read & mask);
                seq_printf(m, "0x%X: 0x%08X, mask: 0x%08X, read: 0x%08x, status: %s\n",
-                          addr, value, mask, read, ok ? "OK" : "FAIL");
+                          i915_mmio_reg_offset(addr), value, mask, read, ok ? "OK" : "FAIL");
        }
 
        intel_runtime_pm_put(dev_priv);