drm: Restore GNOME monitors.xml support
Subsystems (2)
PATCH 1/1 drm: Restore GNOME monitors.xml support
Please CC me since I am not on this mailing list.
H.J.
---
My ~/.config/monitors.xml swaps primary/secondary displays as well as their horizontal positions. It works fine until:
commit 91eefc05f0ac71902906b2058360e61bd25137fe
Author: Daniel Vetter <[email protected]> Date: Wed Dec 14 00:08:10 2016 +0100
drm: Tighten locking in drm_mode_getconnector
which makes ~/.config/monitors.xml not effective. This patch reorders drm_mode_getconnector and restores monitors.xml support.
This may also fix:
https://bugs.freedesktop.org/show_bug.cgi?id=100576
--- drivers/gpu/drm/drm_connector.c | 74 ++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-)
drivers/gpu/drm/drm_connector.c +37 -37
@@ -1169,41 +1169,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,if (!connector)return -ENOENT ; -drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); - encoder =drm_connector_get_encoder (connector); -if (encoder) - out_resp->encoder_id = encoder->base.id; -else - out_resp->encoder_id =0 ; - - ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, - (uint32_t __user *)(unsigned long )(out_resp->props_ptr), - (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), - &out_resp->count_props); -drm_modeset_unlock (&dev->mode_config.connection_mutex); -if (ret) - goto out_unref; - -for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) -if (connector->encoder_ids[i] !=0 ) - encoders_count++; - -if ((out_resp->count_encoders >= encoders_count) && encoders_count) { - copied =0 ; - encoder_ptr = (uint32_t __user *)(unsigned long )(out_resp->encoders_ptr); -for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) { -if (connector->encoder_ids[i] !=0 ) { -if (put_user (connector->encoder_ids[i], - encoder_ptr + copied)) { - ret = -EFAULT ; - goto out_unref; - } - copied++; - } - } - } - out_resp->count_encoders = encoders_count; - out_resp->connector_id = connector->base.id; out_resp->connector_type = connector->connector_type; out_resp->connector_type_id = connector->connector_type_id;
@@ -1240,15 +1205,50 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,if (copy_to_user (mode_ptr + copied, &u_mode,sizeof (u_mode))) { ret = -EFAULT ; +mutex_unlock (&dev->mode_config.mutex); goto out; } copied++; } } out_resp->count_modes = mode_count; -out:mutex_unlock (&dev->mode_config.mutex); -out_unref: + +drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); + encoder =drm_connector_get_encoder (connector); +if (encoder) + out_resp->encoder_id = encoder->base.id; +else + out_resp->encoder_id =0 ; + + ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, + (uint32_t __user *)(unsigned long )(out_resp->props_ptr), + (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), + &out_resp->count_props); +drm_modeset_unlock (&dev->mode_config.connection_mutex); +if (ret) + goto out; + +for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) +if (connector->encoder_ids[i] !=0 ) + encoders_count++; + +if ((out_resp->count_encoders >= encoders_count) && encoders_count) { + copied =0 ; + encoder_ptr = (uint32_t __user *)(unsigned long )(out_resp->encoders_ptr); +for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) { +if (connector->encoder_ids[i] !=0 ) { +if (put_user (connector->encoder_ids[i], + encoder_ptr + copied)) { + ret = -EFAULT ; + goto out; + } + copied++; + } + } + } + out_resp->count_encoders = encoders_count; +out:drm_connector_unreference (connector);return ret;
Signature · 6 lines
2.9.4 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 1 line · H.J. Lu
Please CC me since I am not on this mailing list.
Sorry, should've instructed you to send to dri-devel instead of intel-gfx, because the patch touches drm helpers. Cc'd.
BR,
Jani.
Quoted 123 lines
H.J.
---
My~/.config/monitors.xmlswaps primary/secondary displays as well as their horizontal positions. It works fine until:commit
91eefc05f0ac71902906b2058360e61bd25137feAuthor: Daniel Vetter <[email protected]> Date: Wed Dec 14 00:08:10 2016 +0100drm: Tighten locking in
drm_mode_getconnectorwhich makes
~/.config/monitors.xmlnot effective. This patch reordersdrm_mode_getconnectorand restores monitors.xml support.This may also fix:
https://bugs.freedesktop.org/show_bug.cgi?id=100576
Signed-off-by H.J. Lu <[email protected]>--- drivers/gpu/drm/drm_connector.c | 74 ++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-)drivers/gpu/drm/drm_connector.c +37
-37@@ -1169,41 +1169,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,if (!connector)return -ENOENT ; -drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); - encoder =drm_connector_get_encoder (connector); -if (encoder) - out_resp->encoder_id = encoder->base.id; -else - out_resp->encoder_id =0 ; - - ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, - (uint32_t __user *)(unsigned long )(out_resp->props_ptr), - (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), - &out_resp->count_props); -drm_modeset_unlock (&dev->mode_config.connection_mutex); -if (ret) - goto out_unref; - -for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) -if (connector->encoder_ids[i] !=0 ) - encoders_count++; - -if ((out_resp->count_encoders >= encoders_count) && encoders_count) { - copied =0 ; - encoder_ptr = (uint32_t __user *)(unsigned long )(out_resp->encoders_ptr); -for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) { -if (connector->encoder_ids[i] !=0 ) { -if (put_user (connector->encoder_ids[i], - encoder_ptr + copied)) { - ret = -EFAULT ; - goto out_unref; - } - copied++; - } - } - } - out_resp->count_encoders = encoders_count; - out_resp->connector_id = connector->base.id; out_resp->connector_type = connector->connector_type; out_resp->connector_type_id = connector->connector_type_id;@@ -1240,15 +1205,50 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,if (copy_to_user (mode_ptr + copied, &u_mode,sizeof (u_mode))) { ret = -EFAULT ; +mutex_unlock (&dev->mode_config.mutex); goto out; } copied++; } } out_resp->count_modes = mode_count; -out:mutex_unlock (&dev->mode_config.mutex); -out_unref: + +drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); + encoder =drm_connector_get_encoder (connector); +if (encoder) + out_resp->encoder_id = encoder->base.id; +else + out_resp->encoder_id =0 ; + + ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, + (uint32_t __user *)(unsigned long )(out_resp->props_ptr), + (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), + &out_resp->count_props); +drm_modeset_unlock (&dev->mode_config.connection_mutex); +if (ret) + goto out; + +for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) +if (connector->encoder_ids[i] !=0 ) + encoders_count++; + +if ((out_resp->count_encoders >= encoders_count) && encoders_count) { + copied =0 ; + encoder_ptr = (uint32_t __user *)(unsigned long )(out_resp->encoders_ptr); +for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++) { +if (connector->encoder_ids[i] !=0 ) { +if (put_user (connector->encoder_ids[i], + encoder_ptr + copied)) { + ret = -EFAULT ; + goto out; + } + copied++; + } + } + } + out_resp->count_encoders = encoders_count; +out:drm_connector_unreference (connector);return ret;
Signature · 5 lines
Jani Nikula, Intel Open Source Technology Center _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 23 lines · Jani Nikula
Quoted 1 line · H.J. Lu
Please CC me since I am not on this mailing list.
Sorry, should've instructed you to send to dri-devel instead of intel-gfx, because the patch touches drm helpers. Cc'd.
BR,
Jani.Quoted 14 lines
H.J.
---
My~/.config/monitors.xmlswaps primary/secondary displays as well as their horizontal positions. It works fine until:commit
91eefc05f0ac71902906b2058360e61bd25137feAuthor: Daniel Vetter <[email protected]> Date: Wed Dec 14 00:08:10 2016 +0100drm: Tighten locking in
drm_mode_getconnectorwhich makes
~/.config/monitors.xmlnot effective. This patch reordersdrm_mode_getconnectorand restores monitors.xml support.
Ok, I think the real bugfix is just getting the properties after probing, to have the updated EDID. Please test the below more minimal fixup:
commit 4b5d7e764afaf9a2e80e1f78641b5bd17af4692b
Author: Daniel Vetter <[email protected]> Date: Tue Jun 20 11:13:42 2017 +0200
drm: Fix GETCONNECTOR regression
In
commit 91eefc05f0ac71902906b2058360e61bd25137fe
Author: Daniel Vetter <[email protected]>
Date: Wed Dec 14 00:08:10 2016 +0100
drm: Tighten locking in drm_mode_getconnector
I reordered the logic a bit in that IOCTL, but that broke userspace since it'll get the new mode list, but not the new property values. Fix that again.
drivers/gpu/drm/drm_connector.c +18 -15
@@ -1293,21 +1293,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,if (!connector)return -ENOENT ; -drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); - encoder =drm_connector_get_encoder (connector); -if (encoder) - out_resp->encoder_id = encoder->base.id; -else - out_resp->encoder_id =0 ; - - ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, - (uint32_t __user *)(unsigned long )(out_resp->props_ptr), - (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), - &out_resp->count_props); -drm_modeset_unlock (&dev->mode_config.connection_mutex); -if (ret) - goto out_unref; -for (i =0 ; i <DRM_CONNECTOR_MAX_ENCODER ; i++)if (connector->encoder_ids[i] !=0 ) encoders_count++;
@@ -1372,6 +1357,24 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, out_resp->count_modes = mode_count; out:mutex_unlock (&dev->mode_config.mutex); + +drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); + encoder =drm_connector_get_encoder (connector); +if (encoder) + out_resp->encoder_id = encoder->base.id; +else + out_resp->encoder_id =0 ; + +/* Only grab properties after probing, to make sure EDID and other +* properties reflect the latest status. */ + ret =drm_mode_object_get_properties (&connector->base, file_priv->atomic, + (uint32_t __user *)(unsigned long )(out_resp->props_ptr), + (uint64_t __user *)(unsigned long )(out_resp->prop_values_ptr), + &out_resp->count_props); +drm_modeset_unlock (&dev->mode_config.connection_mutex); +if (ret) + goto out_unref; + out_unref:drm_connector_put (connector);
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel