mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
drm/vmwgfx: Add connector properties to switch between explicit and implicit placement
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
parent
578e609a09
commit
76404ac0a2
6 changed files with 54 additions and 2 deletions
|
@ -409,6 +409,7 @@ struct vmw_private {
|
|||
struct vmw_legacy_display *ldu_priv;
|
||||
struct vmw_overlay *overlay_priv;
|
||||
struct drm_property *hotplug_mode_update_property;
|
||||
struct drm_property *implicit_placement_property;
|
||||
unsigned num_implicit;
|
||||
struct vmw_framebuffer *implicit_fb;
|
||||
|
||||
|
|
|
@ -1622,6 +1622,12 @@ int vmw_du_connector_set_property(struct drm_connector *connector,
|
|||
struct drm_property *property,
|
||||
uint64_t val)
|
||||
{
|
||||
struct vmw_display_unit *du = vmw_connector_to_du(connector);
|
||||
struct vmw_private *dev_priv = vmw_priv(connector->dev);
|
||||
|
||||
if (property == dev_priv->implicit_placement_property)
|
||||
du->is_implicit = val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2219,3 +2225,27 @@ void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv,
|
|||
|
||||
dev_priv->implicit_fb = vfb;
|
||||
}
|
||||
|
||||
/**
|
||||
* vmw_kms_create_implicit_placement_proparty - Set up the implicit placement
|
||||
* property.
|
||||
*
|
||||
* @dev_priv: Pointer to a device private struct.
|
||||
* @immutable: Whether the property is immutable.
|
||||
*
|
||||
* Sets up the implicit placement property unless it's already set up.
|
||||
*/
|
||||
void
|
||||
vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv,
|
||||
bool immutable)
|
||||
{
|
||||
if (dev_priv->implicit_placement_property)
|
||||
return;
|
||||
|
||||
dev_priv->implicit_placement_property =
|
||||
drm_property_create_range(dev_priv->dev,
|
||||
immutable ?
|
||||
DRM_MODE_PROP_IMMUTABLE : 0,
|
||||
"implicit_placement", 0, 1);
|
||||
|
||||
}
|
||||
|
|
|
@ -264,7 +264,8 @@ bool vmw_kms_crtc_flippable(struct vmw_private *dev_priv,
|
|||
struct drm_crtc *crtc);
|
||||
void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv,
|
||||
struct drm_crtc *crtc);
|
||||
|
||||
void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv,
|
||||
bool immutable);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -383,6 +383,11 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
|
|||
dev->mode_config.suggested_x_property, 0);
|
||||
drm_object_attach_property(&connector->base,
|
||||
dev->mode_config.suggested_y_property, 0);
|
||||
if (dev_priv->implicit_placement_property)
|
||||
drm_object_attach_property
|
||||
(&connector->base,
|
||||
dev_priv->implicit_placement_property,
|
||||
1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -418,6 +423,8 @@ int vmw_kms_ldu_init_display(struct vmw_private *dev_priv)
|
|||
if (ret != 0)
|
||||
goto err_vblank_cleanup;
|
||||
|
||||
vmw_kms_create_implicit_placement_property(dev_priv, true);
|
||||
|
||||
if (dev_priv->capabilities & SVGA_CAP_MULTIMON)
|
||||
for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i)
|
||||
vmw_ldu_init(dev_priv, i);
|
||||
|
|
|
@ -541,6 +541,11 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
|
|||
dev->mode_config.suggested_x_property, 0);
|
||||
drm_object_attach_property(&connector->base,
|
||||
dev->mode_config.suggested_y_property, 0);
|
||||
if (dev_priv->implicit_placement_property)
|
||||
drm_object_attach_property
|
||||
(&connector->base,
|
||||
dev_priv->implicit_placement_property,
|
||||
sou->base.is_implicit);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -568,6 +573,8 @@ int vmw_kms_sou_init_display(struct vmw_private *dev_priv)
|
|||
if (unlikely(ret != 0))
|
||||
goto err_vblank_cleanup;
|
||||
|
||||
vmw_kms_create_implicit_placement_property(dev_priv, false);
|
||||
|
||||
for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i)
|
||||
vmw_sou_init(dev_priv, i);
|
||||
|
||||
|
|
|
@ -1134,7 +1134,11 @@ static int vmw_stdu_init(struct vmw_private *dev_priv, unsigned unit)
|
|||
dev->mode_config.suggested_x_property, 0);
|
||||
drm_object_attach_property(&connector->base,
|
||||
dev->mode_config.suggested_y_property, 0);
|
||||
|
||||
if (dev_priv->implicit_placement_property)
|
||||
drm_object_attach_property
|
||||
(&connector->base,
|
||||
dev_priv->implicit_placement_property,
|
||||
stdu->base.is_implicit);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1199,6 +1203,8 @@ int vmw_kms_stdu_init_display(struct vmw_private *dev_priv)
|
|||
|
||||
dev_priv->active_display_unit = vmw_du_screen_target;
|
||||
|
||||
vmw_kms_create_implicit_placement_property(dev_priv, false);
|
||||
|
||||
for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i) {
|
||||
ret = vmw_stdu_init(dev_priv, i);
|
||||
|
||||
|
|
Loading…
Reference in a new issue