[Intel-gfx] [PATCH v2 2/3] drm: Introduce change counter to drm_connector
Ramalingam C
ramalingam.c at intel.com
Fri Jun 28 04:16:13 UTC 2019
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.lisovskiy at 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
>
More information about the Intel-gfx
mailing list