drm/i915: export error state ref handling
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_debugfs.c
index c16926ca15bea2f9e263cb5aa9f1aff6598a98ab..eef4c01ab61ae928592773db14ab19b47f13d45b 100644 (file)
@@ -830,15 +830,8 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
        err_printf(m, "  ring->tail: 0x%08x\n", error->cpu_ring_tail[ring]);
 }
 
-struct i915_error_state_file_priv {
-       struct drm_device *dev;
-       struct drm_i915_error_state *error;
-};
-
-
-static int i915_error_state(struct i915_error_state_file_priv *error_priv,
-                           struct drm_i915_error_state_buf *m)
-
+int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
+                           const struct i915_error_state_file_priv *error_priv)
 {
        struct drm_device *dev = error_priv->dev;
        drm_i915_private_t *dev_priv = dev->dev_private;
@@ -848,7 +841,7 @@ static int i915_error_state(struct i915_error_state_file_priv *error_priv,
 
        if (!error) {
                err_printf(m, "no error state collected\n");
-               return 0;
+               goto out;
        }
 
        err_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
@@ -958,6 +951,10 @@ static int i915_error_state(struct i915_error_state_file_priv *error_priv,
        if (error->display)
                intel_display_print_error_state(m, dev, error->display);
 
+out:
+       if (m->bytes == 0 && m->err)
+               return m->err;
+
        return 0;
 }
 
@@ -983,12 +980,30 @@ i915_error_state_write(struct file *filp,
        return cnt;
 }
 
+void i915_error_state_get(struct drm_device *dev,
+                         struct i915_error_state_file_priv *error_priv)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev_priv->gpu_error.lock, flags);
+       error_priv->error = dev_priv->gpu_error.first_error;
+       if (error_priv->error)
+               kref_get(&error_priv->error->ref);
+       spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags);
+
+}
+
+void i915_error_state_put(struct i915_error_state_file_priv *error_priv)
+{
+       if (error_priv->error)
+               kref_put(&error_priv->error->ref, i915_error_state_free);
+}
+
 static int i915_error_state_open(struct inode *inode, struct file *file)
 {
        struct drm_device *dev = inode->i_private;
-       drm_i915_private_t *dev_priv = dev->dev_private;
        struct i915_error_state_file_priv *error_priv;
-       unsigned long flags;
 
        error_priv = kzalloc(sizeof(*error_priv), GFP_KERNEL);
        if (!error_priv)
@@ -996,11 +1011,7 @@ static int i915_error_state_open(struct inode *inode, struct file *file)
 
        error_priv->dev = dev;
 
-       spin_lock_irqsave(&dev_priv->gpu_error.lock, flags);
-       error_priv->error = dev_priv->gpu_error.first_error;
-       if (error_priv->error)
-               kref_get(&error_priv->error->ref);
-       spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags);
+       i915_error_state_get(dev, error_priv);
 
        file->private_data = error_priv;
 
@@ -1011,8 +1022,7 @@ static int i915_error_state_release(struct inode *inode, struct file *file)
 {
        struct i915_error_state_file_priv *error_priv = file->private_data;
 
-       if (error_priv->error)
-               kref_put(&error_priv->error->ref, i915_error_state_free);
+       i915_error_state_put(error_priv);
        kfree(error_priv);
 
        return 0;
@@ -1051,15 +1061,10 @@ static ssize_t i915_error_state_read(struct file *file, char __user *userbuf,
 
        error_str.start = *pos;
 
-       ret = i915_error_state(error_priv, &error_str);
+       ret = i915_error_state_to_str(&error_str, error_priv);
        if (ret)
                goto out;
 
-       if (error_str.bytes == 0 && error_str.err) {
-               ret = error_str.err;
-               goto out;
-       }
-
        ret_count = simple_read_from_buffer(userbuf, count, &tmp_pos,
                                            error_str.buf,
                                            error_str.bytes);
@@ -1492,7 +1497,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
                seq_puts(m, "FBC enabled\n");
        } else {
                seq_puts(m, "FBC disabled: ");
-               switch (dev_priv->no_fbc_reason) {
+               switch (dev_priv->fbc.no_fbc_reason) {
                case FBC_NO_OUTPUT:
                        seq_puts(m, "no outputs");
                        break;
This page took 0.026204 seconds and 5 git commands to generate.