Commit 578e609a authored by Thomas Hellstrom's avatar Thomas Hellstrom

drm/vmwgfx: Add suggested screen x and y connector properties

Introduced by qxl, add these properties as a generic way to tell a
display manager about the GUI layout.

Also add the hotplug_mode_update_property which advises display managers to
reread the mode list on a hotplug event.
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarJakob Bornecrantz <jakob@vmware.com>
parent 4d492a07
...@@ -408,6 +408,7 @@ struct vmw_private { ...@@ -408,6 +408,7 @@ struct vmw_private {
enum vmw_display_unit_type active_display_unit; enum vmw_display_unit_type active_display_unit;
struct vmw_legacy_display *ldu_priv; struct vmw_legacy_display *ldu_priv;
struct vmw_overlay *overlay_priv; struct vmw_overlay *overlay_priv;
struct drm_property *hotplug_mode_update_property;
unsigned num_implicit; unsigned num_implicit;
struct vmw_framebuffer *implicit_fb; struct vmw_framebuffer *implicit_fb;
......
...@@ -1108,6 +1108,22 @@ int vmw_kms_present(struct vmw_private *dev_priv, ...@@ -1108,6 +1108,22 @@ int vmw_kms_present(struct vmw_private *dev_priv,
return 0; return 0;
} }
static void
vmw_kms_create_hotplug_mode_update_property(struct vmw_private *dev_priv)
{
if (dev_priv->hotplug_mode_update_property)
return;
dev_priv->hotplug_mode_update_property =
drm_property_create_range(dev_priv->dev,
DRM_MODE_PROP_IMMUTABLE,
"hotplug_mode_update", 0, 1);
if (!dev_priv->hotplug_mode_update_property)
return;
}
int vmw_kms_init(struct vmw_private *dev_priv) int vmw_kms_init(struct vmw_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
...@@ -1120,6 +1136,9 @@ int vmw_kms_init(struct vmw_private *dev_priv) ...@@ -1120,6 +1136,9 @@ int vmw_kms_init(struct vmw_private *dev_priv)
dev->mode_config.max_width = dev_priv->texture_max_width; dev->mode_config.max_width = dev_priv->texture_max_width;
dev->mode_config.max_height = dev_priv->texture_max_height; dev->mode_config.max_height = dev_priv->texture_max_height;
drm_mode_create_suggested_offset_properties(dev);
vmw_kms_create_hotplug_mode_update_property(dev_priv);
ret = vmw_kms_stdu_init_display(dev_priv); ret = vmw_kms_stdu_init_display(dev_priv);
if (ret) { if (ret) {
ret = vmw_kms_sou_init_display(dev_priv); ret = vmw_kms_sou_init_display(dev_priv);
...@@ -1359,15 +1378,28 @@ static int vmw_du_update_layout(struct vmw_private *dev_priv, unsigned num, ...@@ -1359,15 +1378,28 @@ static int vmw_du_update_layout(struct vmw_private *dev_priv, unsigned num,
du->pref_active = true; du->pref_active = true;
du->gui_x = rects[du->unit].x; du->gui_x = rects[du->unit].x;
du->gui_y = rects[du->unit].y; du->gui_y = rects[du->unit].y;
drm_object_property_set_value
(&con->base, dev->mode_config.suggested_x_property,
du->gui_x);
drm_object_property_set_value
(&con->base, dev->mode_config.suggested_y_property,
du->gui_y);
} else { } else {
du->pref_width = 800; du->pref_width = 800;
du->pref_height = 600; du->pref_height = 600;
du->pref_active = false; du->pref_active = false;
drm_object_property_set_value
(&con->base, dev->mode_config.suggested_x_property,
0);
drm_object_property_set_value
(&con->base, dev->mode_config.suggested_y_property,
0);
} }
con->status = vmw_du_connector_detect(con, true); con->status = vmw_du_connector_detect(con, true);
} }
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
drm_sysfs_hotplug_event(dev);
return 0; return 0;
} }
......
...@@ -377,6 +377,12 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit) ...@@ -377,6 +377,12 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
drm_object_attach_property(&connector->base, drm_object_attach_property(&connector->base,
dev->mode_config.dirty_info_property, dev->mode_config.dirty_info_property,
1); 1);
drm_object_attach_property(&connector->base,
dev_priv->hotplug_mode_update_property, 1);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_x_property, 0);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_y_property, 0);
return 0; return 0;
} }
......
...@@ -535,6 +535,12 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit) ...@@ -535,6 +535,12 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
drm_object_attach_property(&connector->base, drm_object_attach_property(&connector->base,
dev->mode_config.dirty_info_property, dev->mode_config.dirty_info_property,
1); 1);
drm_object_attach_property(&connector->base,
dev_priv->hotplug_mode_update_property, 1);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_x_property, 0);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_y_property, 0);
return 0; return 0;
} }
......
...@@ -1128,6 +1128,12 @@ static int vmw_stdu_init(struct vmw_private *dev_priv, unsigned unit) ...@@ -1128,6 +1128,12 @@ static int vmw_stdu_init(struct vmw_private *dev_priv, unsigned unit)
drm_object_attach_property(&connector->base, drm_object_attach_property(&connector->base,
dev->mode_config.dirty_info_property, dev->mode_config.dirty_info_property,
1); 1);
drm_object_attach_property(&connector->base,
dev_priv->hotplug_mode_update_property, 1);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_x_property, 0);
drm_object_attach_property(&connector->base,
dev->mode_config.suggested_y_property, 0);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment