On 2019-06-28 at 11:24:53 +0300, Stanislav Lisovskiy wrote:
> This counter will be used by drm_helper_probe_detect caller to determine
> if something else had changed except connection status,
> like for example edid. Hardware specific drivers are responsible
> for updating this counter when some change is detected to notify
> the drm part, which can trigger for example hotplug event.
> 
> Currently there is no way to propagate that to a calling layer,
> as we send only connection_status update, however as we see with
> edid the changes can be broader.
> 
> v2: Added documentation for the new counter. Rename change_counter to
>     epoch_counter.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105540
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovs...@intel.com>
> ---
>  drivers/gpu/drm/drm_connector.c    |  1 +
>  drivers/gpu/drm/drm_probe_helper.c | 29 +++++++++++++++++++++++++++--
>  include/drm/drm_connector.h        |  3 +++
>  3 files changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 3ccdcf3dfcde..065eee61859e 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -245,6 +245,7 @@ int drm_connector_init(struct drm_device *dev,
>       INIT_LIST_HEAD(&connector->modes);
>       mutex_init(&connector->mutex);
>       connector->edid_blob_ptr = NULL;
> +     connector->epoch_counter = 0;
>       connector->tile_blob_ptr = NULL;
>       connector->status = connector_status_unknown;
>       connector->display_info.panel_orientation =
> diff --git a/drivers/gpu/drm/drm_probe_helper.c 
> b/drivers/gpu/drm/drm_probe_helper.c
> index ef2c468205a2..5857053174da 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -776,6 +776,7 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
>       struct drm_connector_list_iter conn_iter;
>       enum drm_connector_status old_status;
>       bool changed = false;
> +     uint64_t old_epoch_counter;
>  
>       if (!dev->mode_config.poll_enabled)
>               return false;
> @@ -789,20 +790,44 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
>  
>               old_status = connector->status;
>  
> +             old_epoch_counter = connector->epoch_counter;
> +
> +             DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old change counter %llu\n", 
> connector->base.id,
> +                           connector->name,
> +                           old_epoch_counter);
> +
>               connector->status = drm_helper_probe_detect(connector, NULL, 
> false);
>               DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to 
> %s\n",
>                             connector->base.id,
>                             connector->name,
>                             drm_get_connector_status_name(old_status),
>                             drm_get_connector_status_name(connector->status));
> -             if (old_status != connector->status)
> +
> +             DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New change counter %llu\n",
> +                           connector->base.id,
> +                           connector->name,
> +                           connector->epoch_counter);
> +
> +             if (old_status != connector->status) {
{} is not required here.
>                       changed = true;
> +             }
> +
> +             /* Check changing of edid when a connector status still remains
> +              * as "connector_status_connected".
> +              */
> +             if (connector->status == connector_status_connected &&
> +                 old_status == connector_status_connected &&
> +                 old_epoch_counter != connector->epoch_counter) {
> +                     changed = true;
> +             }
>       }
>       drm_connector_list_iter_end(&conn_iter);
>       mutex_unlock(&dev->mode_config.mutex);
>  
> -     if (changed)
> +     if (changed) {
>               drm_kms_helper_hotplug_event(dev);
> +             DRM_DEBUG_KMS("Sent hotplug event\n");
> +     }
>  
>       return changed;
>  }
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index c6f8486d8b8f..a296bdac085f 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1155,6 +1155,9 @@ struct drm_connector {
>       /** @override_edid: has the EDID been overwritten through debugfs for 
> testing? */
>       bool override_edid;
>  
> +     /** @epoch_counter: used to detect any other changes in connector, 
> besides status */
Might want to wrap at 80char.

-Ram
> +     uint64_t epoch_counter;
> +
>  #define DRM_CONNECTOR_MAX_ENCODER 3
>       /**
>        * @encoder_ids: Valid encoders for this connector. Please only use
> -- 
> 2.17.1
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to