diff options
author | Dave Airlie <airlied@redhat.com> | 2014-10-27 21:28:44 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-11-14 18:47:48 -0500 |
commit | 7dea0941f8806e79fed562256822564d5f903edc (patch) | |
tree | f87ef401a48faaddc02c00f0b6adccfa89f853e6 | |
parent | 5bb2bbf596a0ca35b8ba2b0d5b734a1f270040ff (diff) |
drm/qxl: use suggested x/y offset properties to pass guest prefs
This passes the guest preferences for a where to place the
outputs through to userspace. Userspace would need to be updated
to take note of this information, X server and GNOME.
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index 8b7892880ad2..b8cf556b431c 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
@@ -101,14 +101,37 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev) | |||
101 | return 0; | 101 | return 0; |
102 | } | 102 | } |
103 | 103 | ||
104 | static void qxl_update_offset_props(struct qxl_device *qdev) | ||
105 | { | ||
106 | struct drm_device *dev = qdev->ddev; | ||
107 | struct drm_connector *connector; | ||
108 | struct qxl_output *output; | ||
109 | struct qxl_head *head; | ||
110 | |||
111 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
112 | output = drm_connector_to_qxl_output(connector); | ||
113 | |||
114 | head = &qdev->client_monitors_config->heads[output->index]; | ||
115 | |||
116 | drm_object_property_set_value(&connector->base, | ||
117 | dev->mode_config.suggested_x_property, head->x); | ||
118 | drm_object_property_set_value(&connector->base, | ||
119 | dev->mode_config.suggested_y_property, head->y); | ||
120 | } | ||
121 | } | ||
122 | |||
104 | void qxl_display_read_client_monitors_config(struct qxl_device *qdev) | 123 | void qxl_display_read_client_monitors_config(struct qxl_device *qdev) |
105 | { | 124 | { |
106 | 125 | ||
126 | struct drm_device *dev = qdev->ddev; | ||
107 | while (qxl_display_copy_rom_client_monitors_config(qdev)) { | 127 | while (qxl_display_copy_rom_client_monitors_config(qdev)) { |
108 | qxl_io_log(qdev, "failed crc check for client_monitors_config," | 128 | qxl_io_log(qdev, "failed crc check for client_monitors_config," |
109 | " retrying\n"); | 129 | " retrying\n"); |
110 | } | 130 | } |
111 | 131 | ||
132 | drm_modeset_lock_all(dev); | ||
133 | qxl_update_offset_props(qdev); | ||
134 | drm_modeset_unlock_all(dev); | ||
112 | if (!drm_helper_hpd_irq_event(qdev->ddev)) { | 135 | if (!drm_helper_hpd_irq_event(qdev->ddev)) { |
113 | /* notify that the monitor configuration changed, to | 136 | /* notify that the monitor configuration changed, to |
114 | adjust at the arbitrary resolution */ | 137 | adjust at the arbitrary resolution */ |
@@ -952,6 +975,10 @@ static int qdev_output_init(struct drm_device *dev, int num_output) | |||
952 | 975 | ||
953 | drm_object_attach_property(&connector->base, | 976 | drm_object_attach_property(&connector->base, |
954 | qdev->hotplug_mode_update_property, 0); | 977 | qdev->hotplug_mode_update_property, 0); |
978 | drm_object_attach_property(&connector->base, | ||
979 | dev->mode_config.suggested_x_property, 0); | ||
980 | drm_object_attach_property(&connector->base, | ||
981 | dev->mode_config.suggested_y_property, 0); | ||
955 | drm_connector_register(connector); | 982 | drm_connector_register(connector); |
956 | return 0; | 983 | return 0; |
957 | } | 984 | } |
@@ -1065,6 +1092,7 @@ int qxl_modeset_init(struct qxl_device *qdev) | |||
1065 | 1092 | ||
1066 | qdev->ddev->mode_config.fb_base = qdev->vram_base; | 1093 | qdev->ddev->mode_config.fb_base = qdev->vram_base; |
1067 | 1094 | ||
1095 | drm_mode_create_suggested_offset_properties(qdev->ddev); | ||
1068 | qxl_mode_create_hotplug_mode_update_property(qdev); | 1096 | qxl_mode_create_hotplug_mode_update_property(qdev); |
1069 | 1097 | ||
1070 | for (i = 0 ; i < qxl_num_crtc; ++i) { | 1098 | for (i = 0 ; i < qxl_num_crtc; ++i) { |