On Tue 12 Oct 16:03 PDT 2021, abhin...@codeaurora.org wrote:

> On 2021-10-09 20:04, Bjorn Andersson wrote:
> > The debugfs code is provided an array of a single drm_connector. Then to
> > access the connector, the list of all connectors of the DRM device is
> > traversed and all non-DisplayPort connectors are skipped, to find the
> > one and only DisplayPort connector.
> > 
> > But as we move to support multiple DisplayPort controllers this will now
> > find multiple connectors and has no way to distinguish them.
> > 
> > Pass the single connector to dp_debug_get() and use this in the debugfs
> > functions instead, both to simplify the code and the support the
> > multiple instances.
> > 
> Change itself is fine, hence
> Reviewed-by: Abhinav Kumar <abhin...@codeaurora.org>
> 

Thanks.

> What has to be checked now is now to create multiple DP nodes for multi-DP
> cases.
> Today, the debug node will be created only once :
> 
> https://gitlab.freedesktop.org/drm/msm/-/blob/msm-next/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c#L206
> 
> This also needs to be expanded for multi-DP to make the solution complete.
> 

In my multi-DP support patch I end up invoking msm_dp_debugfs_init() for
each of the DP/eDP instances and in its current form the first one gets
registered and any others will fail because of the resulting name
collision.

This patch came as a byproduct of the effort of addressing that problem.

Regards,
Bjorn

> > Signed-off-by: Bjorn Andersson <bjorn.anders...@linaro.org>
> > ---
> >  drivers/gpu/drm/msm/dp/dp_debug.c   | 131 ++++++++++------------------
> >  drivers/gpu/drm/msm/dp/dp_debug.h   |   2 +-
> >  drivers/gpu/drm/msm/dp/dp_display.c |   2 +-
> >  3 files changed, 46 insertions(+), 89 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/msm/dp/dp_debug.c
> > b/drivers/gpu/drm/msm/dp/dp_debug.c
> > index af709d93bb9f..da4323556ef3 100644
> > --- a/drivers/gpu/drm/msm/dp/dp_debug.c
> > +++ b/drivers/gpu/drm/msm/dp/dp_debug.c
> > @@ -24,7 +24,7 @@ struct dp_debug_private {
> >     struct dp_usbpd *usbpd;
> >     struct dp_link *link;
> >     struct dp_panel *panel;
> > -   struct drm_connector **connector;
> > +   struct drm_connector *connector;
> >     struct device *dev;
> >     struct drm_device *drm_dev;
> > 
> > @@ -97,59 +97,35 @@ DEFINE_SHOW_ATTRIBUTE(dp_debug);
> > 
> >  static int dp_test_data_show(struct seq_file *m, void *data)
> >  {
> > -   struct drm_device *dev;
> > -   struct dp_debug_private *debug;
> > -   struct drm_connector *connector;
> > -   struct drm_connector_list_iter conn_iter;
> > +   const struct dp_debug_private *debug = m->private;
> > +   const struct drm_connector *connector = debug->connector;
> >     u32 bpc;
> > 
> > -   debug = m->private;
> > -   dev = debug->drm_dev;
> > -   drm_connector_list_iter_begin(dev, &conn_iter);
> > -   drm_for_each_connector_iter(connector, &conn_iter) {
> > -
> > -           if (connector->connector_type !=
> > -                   DRM_MODE_CONNECTOR_DisplayPort)
> > -                   continue;
> > -
> > -           if (connector->status == connector_status_connected) {
> > -                   bpc = debug->link->test_video.test_bit_depth;
> > -                   seq_printf(m, "hdisplay: %d\n",
> > -                                   debug->link->test_video.test_h_width);
> > -                   seq_printf(m, "vdisplay: %d\n",
> > -                                   debug->link->test_video.test_v_height);
> > -                   seq_printf(m, "bpc: %u\n",
> > -                                   dp_link_bit_depth_to_bpc(bpc));
> > -           } else
> > -                   seq_puts(m, "0");
> > +   if (connector->status == connector_status_connected) {
> > +           bpc = debug->link->test_video.test_bit_depth;
> > +           seq_printf(m, "hdisplay: %d\n",
> > +                           debug->link->test_video.test_h_width);
> > +           seq_printf(m, "vdisplay: %d\n",
> > +                           debug->link->test_video.test_v_height);
> > +           seq_printf(m, "bpc: %u\n",
> > +                           dp_link_bit_depth_to_bpc(bpc));
> > +   } else {
> > +           seq_puts(m, "0");
> >     }
> > 
> > -   drm_connector_list_iter_end(&conn_iter);
> > -
> >     return 0;
> >  }
> >  DEFINE_SHOW_ATTRIBUTE(dp_test_data);
> > 
> >  static int dp_test_type_show(struct seq_file *m, void *data)
> >  {
> > -   struct dp_debug_private *debug = m->private;
> > -   struct drm_device *dev = debug->drm_dev;
> > -   struct drm_connector *connector;
> > -   struct drm_connector_list_iter conn_iter;
> > -
> > -   drm_connector_list_iter_begin(dev, &conn_iter);
> > -   drm_for_each_connector_iter(connector, &conn_iter) {
> > -
> > -           if (connector->connector_type !=
> > -                   DRM_MODE_CONNECTOR_DisplayPort)
> > -                   continue;
> > +   const struct dp_debug_private *debug = m->private;
> > +   const struct drm_connector *connector = debug->connector;
> > 
> > -           if (connector->status == connector_status_connected)
> > -                   seq_printf(m, "%02x", DP_TEST_LINK_VIDEO_PATTERN);
> > -           else
> > -                   seq_puts(m, "0");
> > -   }
> > -   drm_connector_list_iter_end(&conn_iter);
> > +   if (connector->status == connector_status_connected)
> > +           seq_printf(m, "%02x", DP_TEST_LINK_VIDEO_PATTERN);
> > +   else
> > +           seq_puts(m, "0");
> > 
> >     return 0;
> >  }
> > @@ -161,14 +137,12 @@ static ssize_t dp_test_active_write(struct file
> > *file,
> >  {
> >     char *input_buffer;
> >     int status = 0;
> > -   struct dp_debug_private *debug;
> > -   struct drm_device *dev;
> > -   struct drm_connector *connector;
> > -   struct drm_connector_list_iter conn_iter;
> > +   const struct dp_debug_private *debug;
> > +   const struct drm_connector *connector;
> >     int val = 0;
> > 
> >     debug = ((struct seq_file *)file->private_data)->private;
> > -   dev = debug->drm_dev;
> > +   connector = debug->connector;
> > 
> >     if (len == 0)
> >             return 0;
> > @@ -179,30 +153,22 @@ static ssize_t dp_test_active_write(struct file
> > *file,
> > 
> >     DRM_DEBUG_DRIVER("Copied %d bytes from user\n", (unsigned int)len);
> > 
> > -   drm_connector_list_iter_begin(dev, &conn_iter);
> > -   drm_for_each_connector_iter(connector, &conn_iter) {
> > -           if (connector->connector_type !=
> > -                   DRM_MODE_CONNECTOR_DisplayPort)
> > -                   continue;
> > -
> > -           if (connector->status == connector_status_connected) {
> > -                   status = kstrtoint(input_buffer, 10, &val);
> > -                   if (status < 0)
> > -                           break;
> > -                   DRM_DEBUG_DRIVER("Got %d for test active\n", val);
> > -                   /* To prevent erroneous activation of the compliance
> > -                    * testing code, only accept an actual value of 1 here
> > -                    */
> > -                   if (val == 1)
> > -                           debug->panel->video_test = true;
> > -                   else
> > -                           debug->panel->video_test = false;
> > +   if (connector->status == connector_status_connected) {
> > +           status = kstrtoint(input_buffer, 10, &val);
> > +           if (status < 0) {
> > +                   kfree(input_buffer);
> > +                   return status;
> >             }
> > +           DRM_DEBUG_DRIVER("Got %d for test active\n", val);
> > +           /* To prevent erroneous activation of the compliance
> > +            * testing code, only accept an actual value of 1 here
> > +            */
> > +           if (val == 1)
> > +                   debug->panel->video_test = true;
> > +           else
> > +                   debug->panel->video_test = false;
> >     }
> > -   drm_connector_list_iter_end(&conn_iter);
> >     kfree(input_buffer);
> > -   if (status < 0)
> > -           return status;
> > 
> >     *offp += len;
> >     return len;
> > @@ -211,25 +177,16 @@ static ssize_t dp_test_active_write(struct file
> > *file,
> >  static int dp_test_active_show(struct seq_file *m, void *data)
> >  {
> >     struct dp_debug_private *debug = m->private;
> > -   struct drm_device *dev = debug->drm_dev;
> > -   struct drm_connector *connector;
> > -   struct drm_connector_list_iter conn_iter;
> > -
> > -   drm_connector_list_iter_begin(dev, &conn_iter);
> > -   drm_for_each_connector_iter(connector, &conn_iter) {
> > -           if (connector->connector_type !=
> > -                   DRM_MODE_CONNECTOR_DisplayPort)
> > -                   continue;
> > -
> > -           if (connector->status == connector_status_connected) {
> > -                   if (debug->panel->video_test)
> > -                           seq_puts(m, "1");
> > -                   else
> > -                           seq_puts(m, "0");
> > -           } else
> > +   struct drm_connector *connector = debug->connector;
> > +
> > +   if (connector->status == connector_status_connected) {
> > +           if (debug->panel->video_test)
> > +                   seq_puts(m, "1");
> > +           else
> >                     seq_puts(m, "0");
> > +   } else {
> > +           seq_puts(m, "0");
> >     }
> > -   drm_connector_list_iter_end(&conn_iter);
> > 
> >     return 0;
> >  }
> > @@ -278,7 +235,7 @@ static int dp_debug_init(struct dp_debug
> > *dp_debug, struct drm_minor *minor)
> > 
> >  struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel
> > *panel,
> >             struct dp_usbpd *usbpd, struct dp_link *link,
> > -           struct drm_connector **connector, struct drm_minor *minor)
> > +           struct drm_connector *connector, struct drm_minor *minor)
> >  {
> >     int rc = 0;
> >     struct dp_debug_private *debug;
> > diff --git a/drivers/gpu/drm/msm/dp/dp_debug.h
> > b/drivers/gpu/drm/msm/dp/dp_debug.h
> > index 7eaedfbb149c..3f90acfffc5a 100644
> > --- a/drivers/gpu/drm/msm/dp/dp_debug.h
> > +++ b/drivers/gpu/drm/msm/dp/dp_debug.h
> > @@ -43,7 +43,7 @@ struct dp_debug {
> >   */
> >  struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel
> > *panel,
> >             struct dp_usbpd *usbpd, struct dp_link *link,
> > -           struct drm_connector **connector,
> > +           struct drm_connector *connector,
> >             struct drm_minor *minor);
> > 
> >  /**
> > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c
> > b/drivers/gpu/drm/msm/dp/dp_display.c
> > index 1708b7cdc1b3..41a6f58916e6 100644
> > --- a/drivers/gpu/drm/msm/dp/dp_display.c
> > +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> > @@ -1464,7 +1464,7 @@ void msm_dp_debugfs_init(struct msm_dp
> > *dp_display, struct drm_minor *minor)
> >     dev = &dp->pdev->dev;
> > 
> >     dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
> > -                                   dp->link, &dp->dp_display.connector,
> > +                                   dp->link, dp->dp_display.connector,
> >                                     minor);
> >     if (IS_ERR(dp->debug)) {
> >             rc = PTR_ERR(dp->debug);

Reply via email to