diff options
author | Deepak Rawat <drawat@vmware.com> | 2018-06-20 05:34:26 -0400 |
---|---|---|
committer | Thomas Hellstrom <thellstrom@vmware.com> | 2018-07-03 14:39:46 -0400 |
commit | 3e79ecdad8897dad4d311576989b6856dbcb958e (patch) | |
tree | d557670a0ca383d95b9db4ef86f57a1c0aabb87a /drivers/gpu | |
parent | b89e5ff9eeeb8b1fe3d2d7477fb9e1c1aed5dd5b (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.c | 37 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 29 |
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 | */ |
110 | static int vmw_sou_fifo_create(struct vmw_private *dev_priv, | 110 | static 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", |