[Intel-gfx] [PATCH v2] drm/i915: Add debugfs to read any DPCD register
R, Durgadoss
durgadoss.r at intel.com
Mon Apr 20 04:29:16 PDT 2015
>-----Original Message-----
>From: Ville Syrjälä [mailto:ville.syrjala at linux.intel.com]
>Sent: Friday, April 17, 2015 3:30 PM
>To: R, Durgadoss
>Cc: Jani Nikula; intel-gfx at lists.freedesktop.org; Syrjala, Ville; Zanoni, Paulo R
>Subject: Re: [Intel-gfx] [PATCH v2] drm/i915: Add debugfs to read any DPCD register
>
>On Fri, Apr 17, 2015 at 06:33:57AM +0000, R, Durgadoss wrote:
>> >-----Original Message-----
>> >From: Ville Syrjälä [mailto:ville.syrjala at linux.intel.com]
>> >Sent: Thursday, April 16, 2015 8:03 PM
>> >To: Jani Nikula
>> >Cc: R, Durgadoss; intel-gfx at lists.freedesktop.org; Syrjala, Ville; Zanoni, Paulo R
>> >Subject: Re: [Intel-gfx] [PATCH v2] drm/i915: Add debugfs to read any DPCD register
>> >
>> >On Thu, Apr 16, 2015 at 05:07:00PM +0300, Jani Nikula wrote:
>> >> On Wed, 08 Apr 2015, Durgadoss R <durgadoss.r at intel.com> wrote:
>> >> > This patch creates a connector specific debugfs
>> >> > interface to read any particular DPCD register.
>> >> > The DPCD register address (hex format) is written
>> >> > to 'i915_dpcd_addr' interface and the corresponding
>> >> > value can be read from 'i915_dpcd_val' interface.
>> >> >
>> >> > Example usage:
>> >> > echo 0x70 > i915_dpcd_addr
>> >> > cat i915_dpcd_val
>> >> > 0x1
>> >> >
>> >> > v2: Address Jani's comments.
>> >>
>> >> So, code-wise this looks good to me.
>> >>
>> >> But like I said in my review of v1, I am undecided on whether we want to
>> >> have this interface or not. I could really be persuaded either way.
>> >>
>> >> Perhaps Ville or Paulo have an opinion?
>> >
>> >I think having the ability to read (and also write actually) DPCD would
>> >be nice.
>> >
>> >So I like the idea, but it does seem a bit limited since it doesn't
>> >allow writes. So perhaps we should just expose the entire DPCD as a
>> >binary file and include a tool in i-g-t to read/write individual
>> >pieces?
Ok, I started with this, but realized that it becomes almost
equivalent of the 'i915_dpcd' interface introduced by Jani.
So, it looks like, extending that interface by adding more
relevant offsets seems to be a better option,
than creating one more interface for dumping.
Thanks,
Durga
>> >
>> >We could also have a tool to parse the entire thing like we have
>> >for the vbt stuff.
>>
>> Yes, This seems to be a good idea. I will start working on this.
>> Although I am not sure on the 'write' part.. I guess we can discuss
>> as we go along..
>>
>> But I still think, a pointed read/write would also be useful
>> at times for debug. So, If you agree, I can extend this interface
>> to take values for write as well and submit a v3.
>
>For me at least i-g-t is always around so if a small tool is needed
>to make the read/write a single register case easy, I'm fine with
>that. We anyway need tools to read/write everything else, so I don't
>see a big difference here. But if other people would prefer something
>that doesn't need a specific tool I won't object to it either.
>
>>
>> Thanks,
>> Durga
>>
>> >
>> >>
>> >> BR,
>> >> Jani.
>> >>
>> >>
>> >> >
>> >> > Signed-off-by: Durgadoss R <durgadoss.r at intel.com>
>> >> > ---
>> >> > drivers/gpu/drm/i915/i915_debugfs.c | 88 ++++++++++++++++++++++++++++++++++++-
>> >> > drivers/gpu/drm/i915/intel_drv.h | 1 +
>> >> > 2 files changed, 88 insertions(+), 1 deletion(-)
>> >> >
>> >> > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
>> >> > index 10ca511..f1f365e 100644
>> >> > --- a/drivers/gpu/drm/i915/i915_debugfs.c
>> >> > +++ b/drivers/gpu/drm/i915/i915_debugfs.c
>> >> > @@ -4865,6 +4865,87 @@ static const struct file_operations i915_dpcd_fops = {
>> >> > .release = single_release,
>> >> > };
>> >> >
>> >> > +static ssize_t i915_dpcd_addr_write(struct file *file, const char __user *ubuf,
>> >> > + size_t len, loff_t *offp)
>> >> > +{
>> >> > + struct seq_file *m = file->private_data;
>> >> > + struct drm_connector *connector = m->private;
>> >> > + struct intel_dp *intel_dp =
>> >> > + enc_to_intel_dp(&intel_attached_encoder(connector)->base);
>> >> > + unsigned int reg_addr;
>> >> > + char tmp[16];
>> >> > +
>> >> > + if (len >= sizeof(tmp))
>> >> > + return -EINVAL;
>> >> > +
>> >> > + if (copy_from_user(tmp, ubuf, len))
>> >> > + return -EFAULT;
>> >> > +
>> >> > + tmp[len] = '\0';
>> >> > +
>> >> > + if (kstrtouint(tmp, 16, ®_addr))
>> >> > + return -EINVAL;
>> >> > +
>> >> > + intel_dp->debugfs_dpcd_addr = reg_addr;
>> >> > +
>> >> > + return len;
>> >> > +}
>> >> > +
>> >> > +static int i915_dpcd_addr_show(struct seq_file *m, void *data)
>> >> > +{
>> >> > + struct drm_connector *connector = m->private;
>> >> > + struct intel_dp *intel_dp =
>> >> > + enc_to_intel_dp(&intel_attached_encoder(connector)->base);
>> >> > +
>> >> > + seq_printf(m, "0x%x\n", intel_dp->debugfs_dpcd_addr);
>> >> > +
>> >> > + return 0;
>> >> > +}
>> >> > +
>> >> > +static int i915_dpcd_addr_open(struct inode *inode, struct file *file)
>> >> > +{
>> >> > + return single_open(file, i915_dpcd_addr_show, inode->i_private);
>> >> > +}
>> >> > +
>> >> > +static const struct file_operations i915_dpcd_addr_fops = {
>> >> > + .owner = THIS_MODULE,
>> >> > + .open = i915_dpcd_addr_open,
>> >> > + .read = seq_read,
>> >> > + .write = i915_dpcd_addr_write,
>> >> > + .llseek = seq_lseek,
>> >> > + .release = single_release,
>> >> > +};
>> >> > +
>> >> > +static int i915_dpcd_val_show(struct seq_file *m, void *data)
>> >> > +{
>> >> > + struct drm_connector *connector = m->private;
>> >> > + struct intel_dp *intel_dp =
>> >> > + enc_to_intel_dp(&intel_attached_encoder(connector)->base);
>> >> > + u8 val;
>> >> > + int ret;
>> >> > +
>> >> > + ret = drm_dp_dpcd_readb(&intel_dp->aux,
>> >> > + intel_dp->debugfs_dpcd_addr, &val);
>> >> > + if (ret < 0)
>> >> > + return ret;
>> >> > +
>> >> > + seq_printf(m, "0x%x\n", val);
>> >> > + return 0;
>> >> > +}
>> >> > +
>> >> > +static int i915_dpcd_val_open(struct inode *inode, struct file *file)
>> >> > +{
>> >> > + return single_open(file, i915_dpcd_val_show, inode->i_private);
>> >> > +}
>> >> > +
>> >> > +static const struct file_operations i915_dpcd_val_fops = {
>> >> > + .owner = THIS_MODULE,
>> >> > + .open = i915_dpcd_val_open,
>> >> > + .read = seq_read,
>> >> > + .llseek = seq_lseek,
>> >> > + .release = single_release,
>> >> > +};
>> >> > +
>> >> > /**
>> >> > * i915_debugfs_connector_add - add i915 specific connector debugfs files
>> >> > * @connector: pointer to a registered drm_connector
>> >> > @@ -4883,9 +4964,14 @@ int i915_debugfs_connector_add(struct drm_connector *connector)
>> >> > return -ENODEV;
>> >> >
>> >> > if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
>> >> > - connector->connector_type == DRM_MODE_CONNECTOR_eDP)
>> >> > + connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
>> >> > debugfs_create_file("i915_dpcd", S_IRUGO, root, connector,
>> >> > &i915_dpcd_fops);
>> >> > + debugfs_create_file("i915_dpcd_addr", S_IRUGO | S_IWUSR,
>> >> > + root, connector, &i915_dpcd_addr_fops);
>> >> > + debugfs_create_file("i915_dpcd_val", S_IRUGO, root,
>> >> > + connector, &i915_dpcd_val_fops);
>> >> > + }
>> >> >
>> >> > return 0;
>> >> > }
>> >> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
>> >> > index 4799b11..0594baa 100644
>> >> > --- a/drivers/gpu/drm/i915/intel_drv.h
>> >> > +++ b/drivers/gpu/drm/i915/intel_drv.h
>> >> > @@ -642,6 +642,7 @@ struct intel_dp {
>> >> > unsigned long last_power_cycle;
>> >> > unsigned long last_power_on;
>> >> > unsigned long last_backlight_off;
>> >> > + unsigned int debugfs_dpcd_addr;
>> >> >
>> >> > struct notifier_block edp_notifier;
>> >> >
>> >> > --
>> >> > 1.9.1
>> >> >
>> >>
>> >> --
>> >> Jani Nikula, Intel Open Source Technology Center
>> >> _______________________________________________
>> >> Intel-gfx mailing list
>> >> Intel-gfx at lists.freedesktop.org
>> >> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>> >
>> >--
>> >Ville Syrjälä
>> >Intel OTC
>
>--
>Ville Syrjälä
>Intel OTC
More information about the Intel-gfx
mailing list