drm/i915: export error state to string conversion
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Thu, 6 Jun 2013 12:18:39 +0000 (15:18 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 1 Jul 2013 17:38:19 +0000 (19:38 +0200)
In preparation for accessing error state from sysfs, export
error state to string conversion function. Also tuck buffer
error handling inside the function.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h

index f82134f8e9fb7390f697030a3eda1562f81da52d..b64af15eb38872d1c48002054fe4c1d6fe6cef1e 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;
 }
 
@@ -1051,15 +1048,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);
index 810c9fab525eac583d28d834d093d0cd584cb96f..52fe9763b9691f6b45e9b5f1c98dfe5f81594296 100644 (file)
@@ -916,6 +916,11 @@ struct drm_i915_error_state_buf {
        loff_t pos;
 };
 
+struct i915_error_state_file_priv {
+       struct drm_device *dev;
+       struct drm_i915_error_state *error;
+};
+
 struct i915_gpu_error {
        /* For hangcheck timer */
 #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */
@@ -1921,6 +1926,8 @@ int i915_debugfs_init(struct drm_minor *minor);
 void i915_debugfs_cleanup(struct drm_minor *minor);
 __printf(2, 3)
 void i915_error_printf(struct drm_i915_error_state_buf *e, const char *f, ...);
+int i915_error_state_to_str(struct drm_i915_error_state_buf *estr,
+                           const struct i915_error_state_file_priv *error);
 
 /* i915_suspend.c */
 extern int i915_save_state(struct drm_device *dev);