On Thu, Nov 02, 2017 at 05:19:07PM +0200, Jani Nikula wrote: > On Thu, 02 Nov 2017, Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > > On Thu, Nov 02, 2017 at 02:56:51PM +0100, Maarten Lankhorst wrote: > >> This interface is deprecated, and has been replaced by the upstream > >> drm crc interface. > > > > Before we nuke this I would like to see an option in the new interface > > to not filter out the "bad" CRCs. When analyzing how the hardware > > behaves seeing every CRC can be valuable. And I'm not at all convinced > > we should be dropping as many CRCs as we are currently. > > I'm not against it, but do you have a concrete proposal on how that > option would look like? Some kind of of filter_bad_crcs file with a bool value perhaps? > > BR, > Jani. > > > > >> > >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > >> Cc: Tomi Sarvela <tomi.p.sarvela@xxxxxxxxx> > >> Cc: Petri Latvala <petri.latvala@xxxxxxxxx> > >> Cc: Jani Nikula <jani.nikula@xxxxxxxxx> > >> --- > >> drivers/gpu/drm/i915/i915_debugfs.c | 7 +- > >> drivers/gpu/drm/i915/i915_drv.h | 10 - > >> drivers/gpu/drm/i915/i915_irq.c | 79 ++---- > >> drivers/gpu/drm/i915/intel_drv.h | 2 - > >> drivers/gpu/drm/i915/intel_pipe_crc.c | 446 ---------------------------------- > >> 5 files changed, 23 insertions(+), 521 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > >> index 7efe57c0703e..a362370e5a68 100644 > >> --- a/drivers/gpu/drm/i915/i915_debugfs.c > >> +++ b/drivers/gpu/drm/i915/i915_debugfs.c > >> @@ -4991,7 +4991,6 @@ static const struct i915_debugfs_files { > >> {"i915_gpu_info", &i915_gpu_info_fops}, > >> #endif > >> {"i915_next_seqno", &i915_next_seqno_fops}, > >> - {"i915_display_crc_ctl", &i915_display_crc_ctl_fops}, > >> {"i915_pri_wm_latency", &i915_pri_wm_latency_fops}, > >> {"i915_spr_wm_latency", &i915_spr_wm_latency_fops}, > >> {"i915_cur_wm_latency", &i915_cur_wm_latency_fops}, > >> @@ -5008,7 +5007,7 @@ int i915_debugfs_register(struct drm_i915_private *dev_priv) > >> { > >> struct drm_minor *minor = dev_priv->drm.primary; > >> struct dentry *ent; > >> - int ret, i; > >> + int i; > >> > >> ent = debugfs_create_file("i915_forcewake_user", S_IRUSR, > >> minor->debugfs_root, to_i915(minor->dev), > >> @@ -5016,10 +5015,6 @@ int i915_debugfs_register(struct drm_i915_private *dev_priv) > >> if (!ent) > >> return -ENOMEM; > >> > >> - ret = intel_pipe_crc_create(minor); > >> - if (ret) > >> - return ret; > >> - > >> for (i = 0; i < ARRAY_SIZE(i915_debugfs_files); i++) { > >> ent = debugfs_create_file(i915_debugfs_files[i].name, > >> S_IRUGO | S_IWUSR, > >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > >> index d37fd11908d0..f4290c9739e1 100644 > >> --- a/drivers/gpu/drm/i915/i915_drv.h > >> +++ b/drivers/gpu/drm/i915/i915_drv.h > >> @@ -1948,19 +1948,9 @@ enum intel_pipe_crc_source { > >> INTEL_PIPE_CRC_SOURCE_MAX, > >> }; > >> > >> -struct intel_pipe_crc_entry { > >> - uint32_t frame; > >> - uint32_t crc[5]; > >> -}; > >> - > >> #define INTEL_PIPE_CRC_ENTRIES_NR 128 > >> struct intel_pipe_crc { > >> spinlock_t lock; > >> - bool opened; /* exclusive access to the result file */ > >> - struct intel_pipe_crc_entry *entries; > >> - enum intel_pipe_crc_source source; > >> - int head, tail; > >> - wait_queue_head_t wq; > >> int skipped; > >> }; > >> > >> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > >> index ff00e462697a..be119cb567a4 100644 > >> --- a/drivers/gpu/drm/i915/i915_irq.c > >> +++ b/drivers/gpu/drm/i915/i915_irq.c > >> @@ -1613,69 +1613,34 @@ static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, > >> uint32_t crc4) > >> { > >> struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; > >> - struct intel_pipe_crc_entry *entry; > >> struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe); > >> - struct drm_driver *driver = dev_priv->drm.driver; > >> uint32_t crcs[5]; > >> - int head, tail; > >> > >> spin_lock(&pipe_crc->lock); > >> - if (pipe_crc->source) { > >> - if (!pipe_crc->entries) { > >> - spin_unlock(&pipe_crc->lock); > >> - DRM_DEBUG_KMS("spurious interrupt\n"); > >> - return; > >> - } > >> - > >> - head = pipe_crc->head; > >> - tail = pipe_crc->tail; > >> - > >> - if (CIRC_SPACE(head, tail, INTEL_PIPE_CRC_ENTRIES_NR) < 1) { > >> - spin_unlock(&pipe_crc->lock); > >> - DRM_ERROR("CRC buffer overflowing\n"); > >> - return; > >> - } > >> - > >> - entry = &pipe_crc->entries[head]; > >> - > >> - entry->frame = driver->get_vblank_counter(&dev_priv->drm, pipe); > >> - entry->crc[0] = crc0; > >> - entry->crc[1] = crc1; > >> - entry->crc[2] = crc2; > >> - entry->crc[3] = crc3; > >> - entry->crc[4] = crc4; > >> - > >> - head = (head + 1) & (INTEL_PIPE_CRC_ENTRIES_NR - 1); > >> - pipe_crc->head = head; > >> - > >> - spin_unlock(&pipe_crc->lock); > >> - > >> - wake_up_interruptible(&pipe_crc->wq); > >> - } else { > >> - /* > >> - * For some not yet identified reason, the first CRC is > >> - * bonkers. So let's just wait for the next vblank and read > >> - * out the buggy result. > >> - * > >> - * On GEN8+ sometimes the second CRC is bonkers as well, so > >> - * don't trust that one either. > >> - */ > >> - if (pipe_crc->skipped == 0 || > >> - (INTEL_GEN(dev_priv) >= 8 && pipe_crc->skipped == 1)) { > >> - pipe_crc->skipped++; > >> - spin_unlock(&pipe_crc->lock); > >> - return; > >> - } > >> + /* > >> + * For some not yet identified reason, the first CRC is > >> + * bonkers. So let's just wait for the next vblank and read > >> + * out the buggy result. > >> + * > >> + * On GEN8+ sometimes the second CRC is bonkers as well, so > >> + * don't trust that one either. > >> + */ > >> + if (pipe_crc->skipped == 0 || > >> + (INTEL_GEN(dev_priv) >= 8 && pipe_crc->skipped == 1)) { > >> + pipe_crc->skipped++; > >> spin_unlock(&pipe_crc->lock); > >> - crcs[0] = crc0; > >> - crcs[1] = crc1; > >> - crcs[2] = crc2; > >> - crcs[3] = crc3; > >> - crcs[4] = crc4; > >> - drm_crtc_add_crc_entry(&crtc->base, true, > >> - drm_crtc_accurate_vblank_count(&crtc->base), > >> - crcs); > >> + return; > >> } > >> + spin_unlock(&pipe_crc->lock); > >> + > >> + crcs[0] = crc0; > >> + crcs[1] = crc1; > >> + crcs[2] = crc2; > >> + crcs[3] = crc3; > >> + crcs[4] = crc4; > >> + drm_crtc_add_crc_entry(&crtc->base, true, > >> + drm_crtc_accurate_vblank_count(&crtc->base), > >> + crcs); > >> } > >> #else > >> static inline void > >> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > >> index 2f8b9af225ef..6b030b6fb700 100644 > >> --- a/drivers/gpu/drm/i915/intel_drv.h > >> +++ b/drivers/gpu/drm/i915/intel_drv.h > >> @@ -2013,12 +2013,10 @@ void lspcon_resume(struct intel_lspcon *lspcon); > >> void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon); > >> > >> /* intel_pipe_crc.c */ > >> -int intel_pipe_crc_create(struct drm_minor *minor); > >> #ifdef CONFIG_DEBUG_FS > >> int intel_crtc_set_crc_source(struct drm_crtc *crtc, const char *source_name, > >> size_t *values_cnt); > >> #else > >> #define intel_crtc_set_crc_source NULL > >> #endif > >> -extern const struct file_operations i915_display_crc_ctl_fops; > >> #endif /* __INTEL_DRV_H__ */ > >> diff --git a/drivers/gpu/drm/i915/intel_pipe_crc.c b/drivers/gpu/drm/i915/intel_pipe_crc.c > >> index 899839f2f7c6..4ca4ba5a145b 100644 > >> --- a/drivers/gpu/drm/i915/intel_pipe_crc.c > >> +++ b/drivers/gpu/drm/i915/intel_pipe_crc.c > >> @@ -30,160 +30,6 @@ > >> #include <linux/debugfs.h> > >> #include "intel_drv.h" > >> > >> -struct pipe_crc_info { > >> - const char *name; > >> - struct drm_i915_private *dev_priv; > >> - enum pipe pipe; > >> -}; > >> - > >> -static int i915_pipe_crc_open(struct inode *inode, struct file *filep) > >> -{ > >> - struct pipe_crc_info *info = inode->i_private; > >> - struct drm_i915_private *dev_priv = info->dev_priv; > >> - struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; > >> - > >> - if (info->pipe >= INTEL_INFO(dev_priv)->num_pipes) > >> - return -ENODEV; > >> - > >> - spin_lock_irq(&pipe_crc->lock); > >> - > >> - if (pipe_crc->opened) { > >> - spin_unlock_irq(&pipe_crc->lock); > >> - return -EBUSY; /* already open */ > >> - } > >> - > >> - pipe_crc->opened = true; > >> - filep->private_data = inode->i_private; > >> - > >> - spin_unlock_irq(&pipe_crc->lock); > >> - > >> - return 0; > >> -} > >> - > >> -static int i915_pipe_crc_release(struct inode *inode, struct file *filep) > >> -{ > >> - struct pipe_crc_info *info = inode->i_private; > >> - struct drm_i915_private *dev_priv = info->dev_priv; > >> - struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; > >> - > >> - spin_lock_irq(&pipe_crc->lock); > >> - pipe_crc->opened = false; > >> - spin_unlock_irq(&pipe_crc->lock); > >> - > >> - return 0; > >> -} > >> - > >> -/* (6 fields, 8 chars each, space separated (5) + '\n') */ > >> -#define PIPE_CRC_LINE_LEN (6 * 8 + 5 + 1) > >> -/* account for \'0' */ > >> -#define PIPE_CRC_BUFFER_LEN (PIPE_CRC_LINE_LEN + 1) > >> - > >> -static int pipe_crc_data_count(struct intel_pipe_crc *pipe_crc) > >> -{ > >> - lockdep_assert_held(&pipe_crc->lock); > >> - return CIRC_CNT(pipe_crc->head, pipe_crc->tail, > >> - INTEL_PIPE_CRC_ENTRIES_NR); > >> -} > >> - > >> -static ssize_t > >> -i915_pipe_crc_read(struct file *filep, char __user *user_buf, size_t count, > >> - loff_t *pos) > >> -{ > >> - struct pipe_crc_info *info = filep->private_data; > >> - struct drm_i915_private *dev_priv = info->dev_priv; > >> - struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; > >> - char buf[PIPE_CRC_BUFFER_LEN]; > >> - int n_entries; > >> - ssize_t bytes_read; > >> - > >> - /* > >> - * Don't allow user space to provide buffers not big enough to hold > >> - * a line of data. > >> - */ > >> - if (count < PIPE_CRC_LINE_LEN) > >> - return -EINVAL; > >> - > >> - if (pipe_crc->source == INTEL_PIPE_CRC_SOURCE_NONE) > >> - return 0; > >> - > >> - /* nothing to read */ > >> - spin_lock_irq(&pipe_crc->lock); > >> - while (pipe_crc_data_count(pipe_crc) == 0) { > >> - int ret; > >> - > >> - if (filep->f_flags & O_NONBLOCK) { > >> - spin_unlock_irq(&pipe_crc->lock); > >> - return -EAGAIN; > >> - } > >> - > >> - ret = wait_event_interruptible_lock_irq(pipe_crc->wq, > >> - pipe_crc_data_count(pipe_crc), pipe_crc->lock); > >> - if (ret) { > >> - spin_unlock_irq(&pipe_crc->lock); > >> - return ret; > >> - } > >> - } > >> - > >> - /* We now have one or more entries to read */ > >> - n_entries = count / PIPE_CRC_LINE_LEN; > >> - > >> - bytes_read = 0; > >> - while (n_entries > 0) { > >> - struct intel_pipe_crc_entry *entry = > >> - &pipe_crc->entries[pipe_crc->tail]; > >> - > >> - if (CIRC_CNT(pipe_crc->head, pipe_crc->tail, > >> - INTEL_PIPE_CRC_ENTRIES_NR) < 1) > >> - break; > >> - > >> - BUILD_BUG_ON_NOT_POWER_OF_2(INTEL_PIPE_CRC_ENTRIES_NR); > >> - pipe_crc->tail = (pipe_crc->tail + 1) & > >> - (INTEL_PIPE_CRC_ENTRIES_NR - 1); > >> - > >> - bytes_read += snprintf(buf, PIPE_CRC_BUFFER_LEN, > >> - "%8u %8x %8x %8x %8x %8x\n", > >> - entry->frame, entry->crc[0], > >> - entry->crc[1], entry->crc[2], > >> - entry->crc[3], entry->crc[4]); > >> - > >> - spin_unlock_irq(&pipe_crc->lock); > >> - > >> - if (copy_to_user(user_buf, buf, PIPE_CRC_LINE_LEN)) > >> - return -EFAULT; > >> - > >> - user_buf += PIPE_CRC_LINE_LEN; > >> - n_entries--; > >> - > >> - spin_lock_irq(&pipe_crc->lock); > >> - } > >> - > >> - spin_unlock_irq(&pipe_crc->lock); > >> - > >> - return bytes_read; > >> -} > >> - > >> -static const struct file_operations i915_pipe_crc_fops = { > >> - .owner = THIS_MODULE, > >> - .open = i915_pipe_crc_open, > >> - .read = i915_pipe_crc_read, > >> - .release = i915_pipe_crc_release, > >> -}; > >> - > >> -static struct pipe_crc_info i915_pipe_crc_data[I915_MAX_PIPES] = { > >> - { > >> - .name = "i915_pipe_A_crc", > >> - .pipe = PIPE_A, > >> - }, > >> - { > >> - .name = "i915_pipe_B_crc", > >> - .pipe = PIPE_B, > >> - }, > >> - { > >> - .name = "i915_pipe_C_crc", > >> - .pipe = PIPE_C, > >> - }, > >> -}; > >> - > >> static const char * const pipe_crc_sources[] = { > >> "none", > >> "plane1", > >> @@ -197,29 +43,6 @@ static const char * const pipe_crc_sources[] = { > >> "auto", > >> }; > >> > >> -static const char *pipe_crc_source_name(enum intel_pipe_crc_source source) > >> -{ > >> - BUILD_BUG_ON(ARRAY_SIZE(pipe_crc_sources) != INTEL_PIPE_CRC_SOURCE_MAX); > >> - return pipe_crc_sources[source]; > >> -} > >> - > >> -static int display_crc_ctl_show(struct seq_file *m, void *data) > >> -{ > >> - struct drm_i915_private *dev_priv = m->private; > >> - enum pipe pipe; > >> - > >> - for_each_pipe(dev_priv, pipe) > >> - seq_printf(m, "%c %s\n", pipe_name(pipe), > >> - pipe_crc_source_name(dev_priv->pipe_crc[pipe].source)); > >> - > >> - return 0; > >> -} > >> - > >> -static int display_crc_ctl_open(struct inode *inode, struct file *file) > >> -{ > >> - return single_open(file, display_crc_ctl_show, inode->i_private); > >> -} > >> - > >> static int i8xx_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source, > >> uint32_t *val) > >> { > >> @@ -616,178 +439,6 @@ static int get_new_crc_ctl_reg(struct drm_i915_private *dev_priv, > >> return ivb_pipe_crc_ctl_reg(dev_priv, pipe, source, val); > >> } > >> > >> -static int pipe_crc_set_source(struct drm_i915_private *dev_priv, > >> - enum pipe pipe, > >> - enum intel_pipe_crc_source source) > >> -{ > >> - struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; > >> - enum intel_display_power_domain power_domain; > >> - u32 val = 0; /* shut up gcc */ > >> - int ret; > >> - > >> - if (pipe_crc->source == source) > >> - return 0; > >> - > >> - /* forbid changing the source without going back to 'none' */ > >> - if (pipe_crc->source && source) > >> - return -EINVAL; > >> - > >> - power_domain = POWER_DOMAIN_PIPE(pipe); > >> - if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) { > >> - DRM_DEBUG_KMS("Trying to capture CRC while pipe is off\n"); > >> - return -EIO; > >> - } > >> - > >> - ret = get_new_crc_ctl_reg(dev_priv, pipe, &source, &val); > >> - if (ret != 0) > >> - goto out; > >> - > >> - /* none -> real source transition */ > >> - if (source) { > >> - struct intel_pipe_crc_entry *entries; > >> - > >> - DRM_DEBUG_DRIVER("collecting CRCs for pipe %c, %s\n", > >> - pipe_name(pipe), pipe_crc_source_name(source)); > >> - > >> - entries = kcalloc(INTEL_PIPE_CRC_ENTRIES_NR, > >> - sizeof(pipe_crc->entries[0]), > >> - GFP_KERNEL); > >> - if (!entries) { > >> - ret = -ENOMEM; > >> - goto out; > >> - } > >> - > >> - spin_lock_irq(&pipe_crc->lock); > >> - kfree(pipe_crc->entries); > >> - pipe_crc->entries = entries; > >> - pipe_crc->head = 0; > >> - pipe_crc->tail = 0; > >> - spin_unlock_irq(&pipe_crc->lock); > >> - } > >> - > >> - pipe_crc->source = source; > >> - > >> - I915_WRITE(PIPE_CRC_CTL(pipe), val); > >> - POSTING_READ(PIPE_CRC_CTL(pipe)); > >> - > >> - /* real source -> none transition */ > >> - if (!source) { > >> - struct intel_pipe_crc_entry *entries; > >> - struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, > >> - pipe); > >> - > >> - DRM_DEBUG_DRIVER("stopping CRCs for pipe %c\n", > >> - pipe_name(pipe)); > >> - > >> - drm_modeset_lock(&crtc->base.mutex, NULL); > >> - if (crtc->base.state->active) > >> - intel_wait_for_vblank(dev_priv, pipe); > >> - drm_modeset_unlock(&crtc->base.mutex); > >> - > >> - spin_lock_irq(&pipe_crc->lock); > >> - entries = pipe_crc->entries; > >> - pipe_crc->entries = NULL; > >> - pipe_crc->head = 0; > >> - pipe_crc->tail = 0; > >> - spin_unlock_irq(&pipe_crc->lock); > >> - > >> - kfree(entries); > >> - > >> - if (IS_G4X(dev_priv)) > >> - g4x_undo_pipe_scramble_reset(dev_priv, pipe); > >> - else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) > >> - vlv_undo_pipe_scramble_reset(dev_priv, pipe); > >> - else if ((IS_HASWELL(dev_priv) || > >> - IS_BROADWELL(dev_priv)) && pipe == PIPE_A) > >> - hsw_pipe_A_crc_wa(dev_priv, false); > >> - } > >> - > >> - ret = 0; > >> - > >> -out: > >> - intel_display_power_put(dev_priv, power_domain); > >> - > >> - return ret; > >> -} > >> - > >> -/* > >> - * Parse pipe CRC command strings: > >> - * command: wsp* object wsp+ name wsp+ source wsp* > >> - * object: 'pipe' > >> - * name: (A | B | C) > >> - * source: (none | plane1 | plane2 | pf) > >> - * wsp: (#0x20 | #0x9 | #0xA)+ > >> - * > >> - * eg.: > >> - * "pipe A plane1" -> Start CRC computations on plane1 of pipe A > >> - * "pipe A none" -> Stop CRC > >> - */ > >> -static int display_crc_ctl_tokenize(char *buf, char *words[], int max_words) > >> -{ > >> - int n_words = 0; > >> - > >> - while (*buf) { > >> - char *end; > >> - > >> - /* skip leading white space */ > >> - buf = skip_spaces(buf); > >> - if (!*buf) > >> - break; /* end of buffer */ > >> - > >> - /* find end of word */ > >> - for (end = buf; *end && !isspace(*end); end++) > >> - ; > >> - > >> - if (n_words == max_words) { > >> - DRM_DEBUG_DRIVER("too many words, allowed <= %d\n", > >> - max_words); > >> - return -EINVAL; /* ran out of words[] before bytes */ > >> - } > >> - > >> - if (*end) > >> - *end++ = '\0'; > >> - words[n_words++] = buf; > >> - buf = end; > >> - } > >> - > >> - return n_words; > >> -} > >> - > >> -enum intel_pipe_crc_object { > >> - PIPE_CRC_OBJECT_PIPE, > >> -}; > >> - > >> -static const char * const pipe_crc_objects[] = { > >> - "pipe", > >> -}; > >> - > >> -static int > >> -display_crc_ctl_parse_object(const char *buf, enum intel_pipe_crc_object *o) > >> -{ > >> - int i; > >> - > >> - for (i = 0; i < ARRAY_SIZE(pipe_crc_objects); i++) > >> - if (!strcmp(buf, pipe_crc_objects[i])) { > >> - *o = i; > >> - return 0; > >> - } > >> - > >> - return -EINVAL; > >> -} > >> - > >> -static int display_crc_ctl_parse_pipe(struct drm_i915_private *dev_priv, > >> - const char *buf, enum pipe *pipe) > >> -{ > >> - const char name = buf[0]; > >> - > >> - if (name < 'A' || name >= pipe_name(INTEL_INFO(dev_priv)->num_pipes)) > >> - return -EINVAL; > >> - > >> - *pipe = name - 'A'; > >> - > >> - return 0; > >> -} > >> - > >> static int > >> display_crc_ctl_parse_source(const char *buf, enum intel_pipe_crc_source *s) > >> { > >> @@ -807,81 +458,6 @@ display_crc_ctl_parse_source(const char *buf, enum intel_pipe_crc_source *s) > >> return -EINVAL; > >> } > >> > >> -static int display_crc_ctl_parse(struct drm_i915_private *dev_priv, > >> - char *buf, size_t len) > >> -{ > >> -#define N_WORDS 3 > >> - int n_words; > >> - char *words[N_WORDS]; > >> - enum pipe pipe; > >> - enum intel_pipe_crc_object object; > >> - enum intel_pipe_crc_source source; > >> - > >> - n_words = display_crc_ctl_tokenize(buf, words, N_WORDS); > >> - if (n_words != N_WORDS) { > >> - DRM_DEBUG_DRIVER("tokenize failed, a command is %d words\n", > >> - N_WORDS); > >> - return -EINVAL; > >> - } > >> - > >> - if (display_crc_ctl_parse_object(words[0], &object) < 0) { > >> - DRM_DEBUG_DRIVER("unknown object %s\n", words[0]); > >> - return -EINVAL; > >> - } > >> - > >> - if (display_crc_ctl_parse_pipe(dev_priv, words[1], &pipe) < 0) { > >> - DRM_DEBUG_DRIVER("unknown pipe %s\n", words[1]); > >> - return -EINVAL; > >> - } > >> - > >> - if (display_crc_ctl_parse_source(words[2], &source) < 0) { > >> - DRM_DEBUG_DRIVER("unknown source %s\n", words[2]); > >> - return -EINVAL; > >> - } > >> - > >> - return pipe_crc_set_source(dev_priv, pipe, source); > >> -} > >> - > >> -static ssize_t display_crc_ctl_write(struct file *file, const char __user *ubuf, > >> - size_t len, loff_t *offp) > >> -{ > >> - struct seq_file *m = file->private_data; > >> - struct drm_i915_private *dev_priv = m->private; > >> - char *tmpbuf; > >> - int ret; > >> - > >> - if (len == 0) > >> - return 0; > >> - > >> - if (len > PAGE_SIZE - 1) { > >> - DRM_DEBUG_DRIVER("expected <%lu bytes into pipe crc control\n", > >> - PAGE_SIZE); > >> - return -E2BIG; > >> - } > >> - > >> - tmpbuf = memdup_user_nul(ubuf, len); > >> - if (IS_ERR(tmpbuf)) > >> - return PTR_ERR(tmpbuf); > >> - > >> - ret = display_crc_ctl_parse(dev_priv, tmpbuf, len); > >> - > >> - kfree(tmpbuf); > >> - if (ret < 0) > >> - return ret; > >> - > >> - *offp += len; > >> - return len; > >> -} > >> - > >> -const struct file_operations i915_display_crc_ctl_fops = { > >> - .owner = THIS_MODULE, > >> - .open = display_crc_ctl_open, > >> - .read = seq_read, > >> - .llseek = seq_lseek, > >> - .release = single_release, > >> - .write = display_crc_ctl_write > >> -}; > >> - > >> void intel_display_crc_init(struct drm_i915_private *dev_priv) > >> { > >> enum pipe pipe; > >> @@ -889,32 +465,10 @@ void intel_display_crc_init(struct drm_i915_private *dev_priv) > >> for_each_pipe(dev_priv, pipe) { > >> struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; > >> > >> - pipe_crc->opened = false; > >> spin_lock_init(&pipe_crc->lock); > >> - init_waitqueue_head(&pipe_crc->wq); > >> } > >> } > >> > >> -int intel_pipe_crc_create(struct drm_minor *minor) > >> -{ > >> - struct drm_i915_private *dev_priv = to_i915(minor->dev); > >> - struct dentry *ent; > >> - int i; > >> - > >> - for (i = 0; i < ARRAY_SIZE(i915_pipe_crc_data); i++) { > >> - struct pipe_crc_info *info = &i915_pipe_crc_data[i]; > >> - > >> - info->dev_priv = dev_priv; > >> - ent = debugfs_create_file(info->name, S_IRUGO, > >> - minor->debugfs_root, info, > >> - &i915_pipe_crc_fops); > >> - if (!ent) > >> - return -ENOMEM; > >> - } > >> - > >> - return 0; > >> -} > >> - > >> int intel_crtc_set_crc_source(struct drm_crtc *crtc, const char *source_name, > >> size_t *values_cnt) > >> { > >> -- > >> 2.14.1 > >> > >> _______________________________________________ > >> Intel-gfx mailing list > >> Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Jani Nikula, Intel Open Source Technology Center -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx