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@xxxxxxxxx> > --- > 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 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel