[PATCH RFC v3 12/37] drm/connector: hdmi: Create Infoframe DebugFS entries

Jeff Hennessey jhennessey558 at gmail.com
Tue Nov 7 22:30:56 UTC 2023


The flux capacitor stopped fluxing...

On Fri, Nov 3, 2023, 5:06 AM Hans Verkuil <hverkuil at xs4all.nl> wrote:

> Hi Maxime,
>
> Thank you for posting v3, this time it runs fine on my RPi 4, thank you for
> fixing that.
>
> I'll start working on a conformity checker for this.
>
> I have a few remarks:
>
> On 31/10/2023 17:48, Maxime Ripard wrote:
> > There has been some discussions recently about the infoframes sent by
> > drivers and if they were properly generated.
> >
> > In parallel, there's been some interest in creating an infoframe-decode
> > tool similar to edid-decode.
> >
> > Both would be much easier if we were to expose the infoframes programmed
> > in the hardware. It won't be perfect since we have no guarantee that
> > it's actually what goes through the wire, but it's the best we can do.
> >
> > Signed-off-by: Maxime Ripard <mripard at kernel.org>
> > ---
> >  drivers/gpu/drm/drm_debugfs.c | 110
> ++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 110 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_debugfs.c
> b/drivers/gpu/drm/drm_debugfs.c
> > index 2de43ff3ce0a..3c65b1d3f926 100644
> > --- a/drivers/gpu/drm/drm_debugfs.c
> > +++ b/drivers/gpu/drm/drm_debugfs.c
> > @@ -538,6 +538,114 @@ static const struct file_operations
> drm_connector_fops = {
> >       .write = connector_write
> >  };
> >
> > +struct debugfs_wrapper {
> > +     struct drm_connector *connector;
> > +     struct drm_connector_hdmi_infoframe *frame;
> > +};
> > +
> > +#define HDMI_MAX_INFOFRAME_SIZE              29
> > +
> > +static ssize_t
> > +infoframe_read(struct file *filp, char __user *ubuf, size_t count,
> loff_t *ppos)
> > +{
> > +     const struct debugfs_wrapper *wrapper = filp->private_data;
> > +     struct drm_connector *connector = wrapper->connector;
> > +     struct drm_connector_hdmi_infoframe *infoframe = wrapper->frame;
> > +     union hdmi_infoframe *frame = &infoframe->data;
> > +     u8 buf[HDMI_MAX_INFOFRAME_SIZE];
> > +     ssize_t len = 0;
> > +
> > +     mutex_lock(&connector->hdmi.infoframes.lock);
> > +
> > +     if (!infoframe->set)
> > +             goto out;
> > +
> > +     len = hdmi_infoframe_pack(frame, buf, sizeof(buf));
> > +     if (len < 0)
> > +             goto out;
> > +
> > +     len = simple_read_from_buffer(ubuf, count, ppos, buf, len);
> > +
> > +out:
> > +     mutex_unlock(&connector->hdmi.infoframes.lock);
> > +     return len;
> > +}
> > +
> > +static const struct file_operations infoframe_fops = {
> > +     .owner   = THIS_MODULE,
> > +     .open    = simple_open,
> > +     .read    = infoframe_read,
> > +};
> > +
> > +static int create_hdmi_infoframe_file(struct drm_connector *connector,
> > +                                   struct dentry *parent,
> > +                                   const char *filename,
> > +                                   struct drm_connector_hdmi_infoframe
> *frame)
> > +{
> > +     struct drm_device *dev = connector->dev;
> > +     struct debugfs_wrapper *wrapper;
> > +     struct dentry *file;
> > +
> > +     wrapper = drmm_kzalloc(dev, sizeof(*wrapper), GFP_KERNEL);
> > +     if (!wrapper)
> > +             return -ENOMEM;
> > +
> > +     wrapper->connector = connector;
> > +     wrapper->frame = frame;
> > +
> > +     file = debugfs_create_file(filename, 0400, parent, wrapper,
> &infoframe_fops);
> > +     if (IS_ERR(file))
> > +             return PTR_ERR(file);
> > +
> > +     return 0;
> > +}
> > +
> > +#define CREATE_HDMI_INFOFRAME_FILE(c, p, i)          \
> > +     create_hdmi_infoframe_file(c, p, #i, &(c)->hdmi.infoframes.i)
> > +
> > +static int create_hdmi_infoframe_files(struct drm_connector *connector,
> > +                                    struct dentry *parent)
> > +{
> > +     int ret;
> > +
> > +     ret = CREATE_HDMI_INFOFRAME_FILE(connector, parent, audio);
> > +     if (ret)
> > +             return ret;
> > +
> > +     ret = CREATE_HDMI_INFOFRAME_FILE(connector, parent, avi);
> > +     if (ret)
> > +             return ret;
> > +
> > +     ret = CREATE_HDMI_INFOFRAME_FILE(connector, parent, drm);
>
> Hmm, I had to look into the code to figure out that 'drm' stands for
> Dynamic Range and Mastering InfoFrame. While entirely correct, it is
> also very confusing in the context of the 'drm' subsystem.
>
> I am not quite certain what the best approach is here.
>
> Internally in the drm code it is talking about 'hdr' or 'hdr metadata',
> but that's a bit confusing as well since there is also an HDR Dynamic
> Metadata Extended InfoFrame defined in CTA-861, even though support for
> that is not (yet) implemented in drm.
>
> At minimum there should be a comment in the code explaining what drm
> stands for in this context.
>
> One option to consider is renaming this file to hdr_drm, thus indicating
> that this is HDR related.
>
> > +     if (ret)
> > +             return ret;
> > +
> > +     ret = CREATE_HDMI_INFOFRAME_FILE(connector, parent, spd);
> > +     if (ret)
> > +             return ret;
> > +
> > +     ret = CREATE_HDMI_INFOFRAME_FILE(connector, parent, vendor);
>
> There may be multiple vendor specific InfoFrames in the future, so how
> would that be handled? Perhaps add a comment here that currently only one
> vendor specific InfoFrame is supported, but suggest how to handle multiple
> VSIFs in the future.
>
> What would actually be nice (although probably not that easy to fix) is if
> the name of the file would be "vendor-XXXXXX' where 'XXXXXX' is the IEEE
> OUI
> number.
>
> Regards,
>
>         Hans
>
> > +     if (ret)
> > +             return ret;
> > +
> > +     return 0;
> > +}
> > +
> > +static void hdmi_debugfs_add(struct drm_connector *connector)
> > +{
> > +     struct dentry *dir;
> > +
> > +     if (!(connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
> > +           connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
> > +             return;
> > +
> > +     dir = debugfs_create_dir("infoframes", connector->debugfs_entry);
> > +     if (IS_ERR(dir))
> > +             return;
> > +
> > +     create_hdmi_infoframe_files(connector, dir);
> > +}
> > +
> >  void drm_debugfs_connector_add(struct drm_connector *connector)
> >  {
> >       struct drm_minor *minor = connector->dev->primary;
> > @@ -565,6 +673,8 @@ void drm_debugfs_connector_add(struct drm_connector
> *connector)
> >       debugfs_create_file("output_bpc", 0444, root, connector,
> >                           &output_bpc_fops);
> >
> > +     hdmi_debugfs_add(connector);
> > +
> >       if (connector->funcs->debugfs_init)
> >               connector->funcs->debugfs_init(connector, root);
> >  }
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20231107/de639ca9/attachment.htm>


More information about the dri-devel mailing list