aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-10-27 21:28:44 -0400
committerDave Airlie <airlied@redhat.com>2014-11-14 18:47:48 -0500
commit7dea0941f8806e79fed562256822564d5f903edc (patch)
treef87ef401a48faaddc02c00f0b6adccfa89f853e6
parent5bb2bbf596a0ca35b8ba2b0d5b734a1f270040ff (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.c28
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
104static 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
104void qxl_display_read_client_monitors_config(struct qxl_device *qdev) 123void 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) {