aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDeepak Rawat <drawat@vmware.com>2018-06-20 05:34:26 -0400
committerThomas Hellstrom <thellstrom@vmware.com>2018-07-03 14:39:46 -0400
commit3e79ecdad8897dad4d311576989b6856dbcb958e (patch)
treed557670a0ca383d95b9db4ef86f57a1c0aabb87a /drivers/gpu
parentb89e5ff9eeeb8b1fe3d2d7477fb9e1c1aed5dd5b (diff)
drm/vmwgfx: Add gui_x/y to vmw_connector_state
As gui_x/y positioning is display unit is protected by requested_layout_mutex adding vmw_connector_state copy of the same and modeset commit will refer the state copy to sync with modeset_check state. v2: Tested with CONFIG_PROVE_LOCKING enabled. Signed-off-by: Deepak Rawat <drawat@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.c37
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.h18
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c38
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c29
4 files changed, 86 insertions, 36 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index a592d10e5c76..0fb363458ab5 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -1609,26 +1609,43 @@ static int vmw_kms_check_topology(struct drm_device *dev,
1609 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 1609 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
1610 new_crtc_state, i) { 1610 new_crtc_state, i) {
1611 struct vmw_display_unit *du = vmw_crtc_to_du(crtc); 1611 struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
1612 struct drm_connector *connector;
1613 struct drm_connector_state *conn_state;
1614 struct vmw_connector_state *vmw_conn_state;
1612 1615
1613 if (!new_crtc_state->enable && old_crtc_state->enable) { 1616 if (!new_crtc_state->enable && old_crtc_state->enable) {
1614 rects[i].x1 = 0; 1617 rects[i].x1 = 0;
1615 rects[i].y1 = 0; 1618 rects[i].y1 = 0;
1616 rects[i].x2 = 0; 1619 rects[i].x2 = 0;
1617 rects[i].y2 = 0; 1620 rects[i].y2 = 0;
1621 continue;
1618 } 1622 }
1619 1623
1620 if (new_crtc_state->enable) { 1624 if (!du->pref_active) {
1621 /* If display unit is not active cannot enable CRTC */ 1625 ret = -EINVAL;
1622 if (!du->pref_active) { 1626 goto clean;
1623 ret = -EINVAL; 1627 }
1624 goto clean;
1625 }
1626 1628
1627 rects[i].x1 = du->gui_x; 1629 /*
1628 rects[i].y1 = du->gui_y; 1630 * For vmwgfx each crtc has only one connector attached and it
1629 rects[i].x2 = du->gui_x + new_crtc_state->mode.hdisplay; 1631 * is not changed so don't really need to check the
1630 rects[i].y2 = du->gui_y + new_crtc_state->mode.vdisplay; 1632 * crtc->connector_mask and iterate over it.
1633 */
1634 connector = &du->connector;
1635 conn_state = drm_atomic_get_connector_state(state, connector);
1636 if (IS_ERR(conn_state)) {
1637 ret = PTR_ERR(conn_state);
1638 goto clean;
1631 } 1639 }
1640
1641 vmw_conn_state = vmw_connector_state_to_vcs(conn_state);
1642 vmw_conn_state->gui_x = du->gui_x;
1643 vmw_conn_state->gui_y = du->gui_y;
1644
1645 rects[i].x1 = du->gui_x;
1646 rects[i].y1 = du->gui_y;
1647 rects[i].x2 = du->gui_x + new_crtc_state->mode.hdisplay;
1648 rects[i].y2 = du->gui_y + new_crtc_state->mode.vdisplay;
1632 } 1649 }
1633 1650
1634 ret = vmw_kms_check_display_memory(dev, dev->mode_config.num_crtc, 1651 ret = vmw_kms_check_display_memory(dev, dev->mode_config.num_crtc,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index ff1caed38f94..1f2b01862652 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -192,6 +192,24 @@ struct vmw_connector_state {
192 struct drm_connector_state base; 192 struct drm_connector_state base;
193 193
194 bool is_implicit; 194 bool is_implicit;
195
196 /**
197 * @gui_x:
198 *
199 * vmwgfx connector property representing the x position of this display
200 * unit (connector is synonymous to display unit) in overall topology.
201 * This is what the device expect as xRoot while creating screen.
202 */
203 int gui_x;
204
205 /**
206 * @gui_y:
207 *
208 * vmwgfx connector property representing the y position of this display
209 * unit (connector is synonymous to display unit) in overall topology.
210 * This is what the device expect as yRoot while creating screen.
211 */
212 int gui_y;
195}; 213};
196 214
197/** 215/**
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
index 74dfd4621b7e..df21d5a6f84a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
@@ -109,7 +109,7 @@ static void vmw_sou_crtc_destroy(struct drm_crtc *crtc)
109 */ 109 */
110static int vmw_sou_fifo_create(struct vmw_private *dev_priv, 110static int vmw_sou_fifo_create(struct vmw_private *dev_priv,
111 struct vmw_screen_object_unit *sou, 111 struct vmw_screen_object_unit *sou,
112 uint32_t x, uint32_t y, 112 int x, int y,
113 struct drm_display_mode *mode) 113 struct drm_display_mode *mode)
114{ 114{
115 size_t fifo_size; 115 size_t fifo_size;
@@ -139,13 +139,8 @@ static int vmw_sou_fifo_create(struct vmw_private *dev_priv,
139 (sou->base.unit == 0 ? SVGA_SCREEN_IS_PRIMARY : 0); 139 (sou->base.unit == 0 ? SVGA_SCREEN_IS_PRIMARY : 0);
140 cmd->obj.size.width = mode->hdisplay; 140 cmd->obj.size.width = mode->hdisplay;
141 cmd->obj.size.height = mode->vdisplay; 141 cmd->obj.size.height = mode->vdisplay;
142 if (sou->base.is_implicit) { 142 cmd->obj.root.x = x;
143 cmd->obj.root.x = x; 143 cmd->obj.root.y = y;
144 cmd->obj.root.y = y;
145 } else {
146 cmd->obj.root.x = sou->base.gui_x;
147 cmd->obj.root.y = sou->base.gui_y;
148 }
149 sou->base.set_gui_x = cmd->obj.root.x; 144 sou->base.set_gui_x = cmd->obj.root.x;
150 sou->base.set_gui_y = cmd->obj.root.y; 145 sou->base.set_gui_y = cmd->obj.root.y;
151 146
@@ -222,12 +217,11 @@ static void vmw_sou_crtc_mode_set_nofb(struct drm_crtc *crtc)
222 struct vmw_plane_state *vps; 217 struct vmw_plane_state *vps;
223 int ret; 218 int ret;
224 219
225 220 sou = vmw_crtc_to_sou(crtc);
226 sou = vmw_crtc_to_sou(crtc);
227 dev_priv = vmw_priv(crtc->dev); 221 dev_priv = vmw_priv(crtc->dev);
228 ps = crtc->primary->state; 222 ps = crtc->primary->state;
229 fb = ps->fb; 223 fb = ps->fb;
230 vps = vmw_plane_state_to_vps(ps); 224 vps = vmw_plane_state_to_vps(ps);
231 225
232 vfb = (fb) ? vmw_framebuffer_to_vfb(fb) : NULL; 226 vfb = (fb) ? vmw_framebuffer_to_vfb(fb) : NULL;
233 227
@@ -240,11 +234,25 @@ static void vmw_sou_crtc_mode_set_nofb(struct drm_crtc *crtc)
240 } 234 }
241 235
242 if (vfb) { 236 if (vfb) {
237 struct drm_connector_state *conn_state;
238 struct vmw_connector_state *vmw_conn_state;
239 int x, y;
240
243 sou->buffer = vps->bo; 241 sou->buffer = vps->bo;
244 sou->buffer_size = vps->bo_size; 242 sou->buffer_size = vps->bo_size;
245 243
246 ret = vmw_sou_fifo_create(dev_priv, sou, crtc->x, crtc->y, 244 if (sou->base.is_implicit) {
247 &crtc->mode); 245 x = crtc->x;
246 y = crtc->y;
247 } else {
248 conn_state = sou->base.connector.state;
249 vmw_conn_state = vmw_connector_state_to_vcs(conn_state);
250
251 x = vmw_conn_state->gui_x;
252 y = vmw_conn_state->gui_y;
253 }
254
255 ret = vmw_sou_fifo_create(dev_priv, sou, x, y, &crtc->mode);
248 if (ret) 256 if (ret)
249 DRM_ERROR("Failed to define Screen Object %dx%d\n", 257 DRM_ERROR("Failed to define Screen Object %dx%d\n",
250 crtc->x, crtc->y); 258 crtc->x, crtc->y);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
index 537df9034008..15f2cb2a151b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
@@ -178,13 +178,9 @@ static int vmw_stdu_define_st(struct vmw_private *dev_priv,
178 cmd->body.height = mode->vdisplay; 178 cmd->body.height = mode->vdisplay;
179 cmd->body.flags = (0 == cmd->body.stid) ? SVGA_STFLAG_PRIMARY : 0; 179 cmd->body.flags = (0 == cmd->body.stid) ? SVGA_STFLAG_PRIMARY : 0;
180 cmd->body.dpi = 0; 180 cmd->body.dpi = 0;
181 if (stdu->base.is_implicit) { 181 cmd->body.xRoot = crtc_x;
182 cmd->body.xRoot = crtc_x; 182 cmd->body.yRoot = crtc_y;
183 cmd->body.yRoot = crtc_y; 183
184 } else {
185 cmd->body.xRoot = stdu->base.gui_x;
186 cmd->body.yRoot = stdu->base.gui_y;
187 }
188 stdu->base.set_gui_x = cmd->body.xRoot; 184 stdu->base.set_gui_x = cmd->body.xRoot;
189 stdu->base.set_gui_y = cmd->body.yRoot; 185 stdu->base.set_gui_y = cmd->body.yRoot;
190 186
@@ -374,11 +370,14 @@ static void vmw_stdu_crtc_mode_set_nofb(struct drm_crtc *crtc)
374{ 370{
375 struct vmw_private *dev_priv; 371 struct vmw_private *dev_priv;
376 struct vmw_screen_target_display_unit *stdu; 372 struct vmw_screen_target_display_unit *stdu;
377 int ret; 373 struct drm_connector_state *conn_state;
378 374 struct vmw_connector_state *vmw_conn_state;
375 int x, y, ret;
379 376
380 stdu = vmw_crtc_to_stdu(crtc); 377 stdu = vmw_crtc_to_stdu(crtc);
381 dev_priv = vmw_priv(crtc->dev); 378 dev_priv = vmw_priv(crtc->dev);
379 conn_state = stdu->base.connector.state;
380 vmw_conn_state = vmw_connector_state_to_vcs(conn_state);
382 381
383 if (stdu->defined) { 382 if (stdu->defined) {
384 ret = vmw_stdu_bind_st(dev_priv, stdu, NULL); 383 ret = vmw_stdu_bind_st(dev_priv, stdu, NULL);
@@ -397,8 +396,16 @@ static void vmw_stdu_crtc_mode_set_nofb(struct drm_crtc *crtc)
397 if (!crtc->state->enable) 396 if (!crtc->state->enable)
398 return; 397 return;
399 398
399 if (stdu->base.is_implicit) {
400 x = crtc->x;
401 y = crtc->y;
402 } else {
403 x = vmw_conn_state->gui_x;
404 y = vmw_conn_state->gui_y;
405 }
406
400 vmw_svga_enable(dev_priv); 407 vmw_svga_enable(dev_priv);
401 ret = vmw_stdu_define_st(dev_priv, stdu, &crtc->mode, crtc->x, crtc->y); 408 ret = vmw_stdu_define_st(dev_priv, stdu, &crtc->mode, x, y);
402 409
403 if (ret) 410 if (ret)
404 DRM_ERROR("Failed to define Screen Target of size %dx%d\n", 411 DRM_ERROR("Failed to define Screen Target of size %dx%d\n",