Message ID | 1352814508-31559-1-git-send-email-mika.kuoppala@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 13 Nov 2012 15:48:28 +0200, Mika Kuoppala <mika.kuoppala@linux.intel.com> wrote: > This is needed for testing seqno wrapping. Be careful to not bump next_seqno > more than 0x7FFFFFFF at a time (between some handled requests) as > i915_seqno_passed() can't handle bigger difference in between. > > Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> > --- > drivers/gpu/drm/i915/i915_debugfs.c | 83 +++++++++++++++++++++++++++++++++++ > 1 file changed, 83 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 4568e7d..8da4f55 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -839,6 +839,83 @@ static const struct file_operations i915_error_state_fops = { > .release = i915_error_state_release, > }; > > +static ssize_t > +i915_next_seqno_read(struct file *filp, > + char __user *ubuf, > + size_t max, > + loff_t *ppos) > +{ > + struct drm_device *dev = filp->private_data; > + drm_i915_private_t *dev_priv = dev->dev_private; > + char buf[80]; > + int len; > + > + len = snprintf(buf, sizeof(buf), > + "next_seqno : 0x%x\n", > + dev_priv->next_seqno); Probably worth the overhead of taking the mutex here for consistency. Saves actual having to think in future. > + > + if (len > sizeof(buf)) > + len = sizeof(buf); > + > + return simple_read_from_buffer(ubuf, max, ppos, buf, len); > +} > + > +static ssize_t > +i915_next_seqno_write(struct file *filp, > + const char __user *ubuf, > + size_t cnt, > + loff_t *ppos) > +{ > + struct drm_device *dev = filp->private_data; > + drm_i915_private_t *dev_priv = dev->dev_private; > + char buf[20]; > + u32 val = 1; > + int ret; > + > + if (cnt > 0) { > + if (cnt > sizeof(buf) - 1) > + return -EINVAL; > + > + if (copy_from_user(buf, ubuf, cnt)) > + return -EFAULT; > + buf[cnt] = 0; > + > + ret = kstrtouint(buf, 0, &val); > + if (ret < 0) > + return ret; > + } > + > + if (val == 0) > + return -EINVAL; > + ret = mutex_lock_interruptible(&dev->struct_mutex); > + if (ret) > + return ret; > + > + if (val > dev_priv->next_seqno) { i915_seqno_passed() ? > + dev_priv->next_seqno = val; > + ret = 0; redundant > + DRM_DEBUG_DRIVER("Advancing seqno to %u\n", val); > + } else { > + ret = -EINVAL; > + } > + > + mutex_unlock(&dev->struct_mutex); > + > + if (ret) > + return ret; > + > + return cnt; return ret ?: cnt; > +} > + > +static const struct file_operations i915_next_seqno_fops = { > + .owner = THIS_MODULE, > + .open = simple_open, > + .read = i915_next_seqno_read, > + .write = i915_next_seqno_write, > + .llseek = default_llseek, > +}; > + > static int i915_rstdby_delays(struct seq_file *m, void *unused) > { > struct drm_info_node *node = (struct drm_info_node *) m->private; > @@ -2103,6 +2180,12 @@ int i915_debugfs_init(struct drm_minor *minor) > if (ret) > return ret; > > + ret = i915_debugfs_create(minor->debugfs_root, minor, > + "i915_next_seqno", > + &i915_next_seqno_fops); > + if (ret) > + return ret; We really need to start cleaning up these files along an error path... -Chris
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 4568e7d..8da4f55 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -839,6 +839,83 @@ static const struct file_operations i915_error_state_fops = { .release = i915_error_state_release, }; +static ssize_t +i915_next_seqno_read(struct file *filp, + char __user *ubuf, + size_t max, + loff_t *ppos) +{ + struct drm_device *dev = filp->private_data; + drm_i915_private_t *dev_priv = dev->dev_private; + char buf[80]; + int len; + + len = snprintf(buf, sizeof(buf), + "next_seqno : 0x%x\n", + dev_priv->next_seqno); + + if (len > sizeof(buf)) + len = sizeof(buf); + + return simple_read_from_buffer(ubuf, max, ppos, buf, len); +} + +static ssize_t +i915_next_seqno_write(struct file *filp, + const char __user *ubuf, + size_t cnt, + loff_t *ppos) +{ + struct drm_device *dev = filp->private_data; + drm_i915_private_t *dev_priv = dev->dev_private; + char buf[20]; + u32 val = 1; + int ret; + + if (cnt > 0) { + if (cnt > sizeof(buf) - 1) + return -EINVAL; + + if (copy_from_user(buf, ubuf, cnt)) + return -EFAULT; + buf[cnt] = 0; + + ret = kstrtouint(buf, 0, &val); + if (ret < 0) + return ret; + } + + if (val == 0) + return -EINVAL; + + ret = mutex_lock_interruptible(&dev->struct_mutex); + if (ret) + return ret; + + if (val > dev_priv->next_seqno) { + dev_priv->next_seqno = val; + ret = 0; + DRM_DEBUG_DRIVER("Advancing seqno to %u\n", val); + } else { + ret = -EINVAL; + } + + mutex_unlock(&dev->struct_mutex); + + if (ret) + return ret; + + return cnt; +} + +static const struct file_operations i915_next_seqno_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = i915_next_seqno_read, + .write = i915_next_seqno_write, + .llseek = default_llseek, +}; + static int i915_rstdby_delays(struct seq_file *m, void *unused) { struct drm_info_node *node = (struct drm_info_node *) m->private; @@ -2103,6 +2180,12 @@ int i915_debugfs_init(struct drm_minor *minor) if (ret) return ret; + ret = i915_debugfs_create(minor->debugfs_root, minor, + "i915_next_seqno", + &i915_next_seqno_fops); + if (ret) + return ret; + return drm_debugfs_create_files(i915_debugfs_list, I915_DEBUGFS_ENTRIES, minor->debugfs_root, minor);
This is needed for testing seqno wrapping. Be careful to not bump next_seqno more than 0x7FFFFFFF at a time (between some handled requests) as i915_seqno_passed() can't handle bigger difference in between. Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> --- drivers/gpu/drm/i915/i915_debugfs.c | 83 +++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+)