xref: /linux/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c (revision 5d97dde4d5f751858390b557729a1a12210024c1)
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
2 /**************************************************************************
3  *
4  * Copyright (c) 2009-2024 Broadcom. All Rights Reserved. The term
5  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
22  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
23  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
25  * USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28 #include "vmwgfx_kms.h"
29 
30 #include "vmwgfx_bo.h"
31 #include "vmwgfx_vkms.h"
32 #include "vmw_surface_cache.h"
33 
34 #include <drm/drm_atomic.h>
35 #include <drm/drm_atomic_helper.h>
36 #include <drm/drm_damage_helper.h>
37 #include <drm/drm_fourcc.h>
38 #include <drm/drm_rect.h>
39 #include <drm/drm_sysfs.h>
40 #include <drm/drm_edid.h>
41 
vmw_du_init(struct vmw_display_unit * du)42 void vmw_du_init(struct vmw_display_unit *du)
43 {
44 	vmw_vkms_crtc_init(&du->crtc);
45 }
46 
vmw_du_cleanup(struct vmw_display_unit * du)47 void vmw_du_cleanup(struct vmw_display_unit *du)
48 {
49 	struct vmw_private *dev_priv = vmw_priv(du->primary.dev);
50 
51 	vmw_vkms_crtc_cleanup(&du->crtc);
52 	drm_plane_cleanup(&du->primary);
53 	if (vmw_cmd_supported(dev_priv))
54 		drm_plane_cleanup(&du->cursor.base);
55 
56 	drm_connector_unregister(&du->connector);
57 	drm_crtc_cleanup(&du->crtc);
58 	drm_encoder_cleanup(&du->encoder);
59 	drm_connector_cleanup(&du->connector);
60 }
61 
62 /*
63  * Display Unit Cursor functions
64  */
65 
66 static int vmw_du_cursor_plane_unmap_cm(struct vmw_plane_state *vps);
67 static void vmw_cursor_update_mob(struct vmw_private *dev_priv,
68 				  struct vmw_plane_state *vps,
69 				  u32 *image, u32 width, u32 height,
70 				  u32 hotspotX, u32 hotspotY);
71 
72 struct vmw_svga_fifo_cmd_define_cursor {
73 	u32 cmd;
74 	SVGAFifoCmdDefineAlphaCursor cursor;
75 };
76 
77 /**
78  * vmw_send_define_cursor_cmd - queue a define cursor command
79  * @dev_priv: the private driver struct
80  * @image: buffer which holds the cursor image
81  * @width: width of the mouse cursor image
82  * @height: height of the mouse cursor image
83  * @hotspotX: the horizontal position of mouse hotspot
84  * @hotspotY: the vertical position of mouse hotspot
85  */
vmw_send_define_cursor_cmd(struct vmw_private * dev_priv,u32 * image,u32 width,u32 height,u32 hotspotX,u32 hotspotY)86 static void vmw_send_define_cursor_cmd(struct vmw_private *dev_priv,
87 				       u32 *image, u32 width, u32 height,
88 				       u32 hotspotX, u32 hotspotY)
89 {
90 	struct vmw_svga_fifo_cmd_define_cursor *cmd;
91 	const u32 image_size = width * height * sizeof(*image);
92 	const u32 cmd_size = sizeof(*cmd) + image_size;
93 
94 	/* Try to reserve fifocmd space and swallow any failures;
95 	   such reservations cannot be left unconsumed for long
96 	   under the risk of clogging other fifocmd users, so
97 	   we treat reservations separtely from the way we treat
98 	   other fallible KMS-atomic resources at prepare_fb */
99 	cmd = VMW_CMD_RESERVE(dev_priv, cmd_size);
100 
101 	if (unlikely(!cmd))
102 		return;
103 
104 	memset(cmd, 0, sizeof(*cmd));
105 
106 	memcpy(&cmd[1], image, image_size);
107 
108 	cmd->cmd = SVGA_CMD_DEFINE_ALPHA_CURSOR;
109 	cmd->cursor.id = 0;
110 	cmd->cursor.width = width;
111 	cmd->cursor.height = height;
112 	cmd->cursor.hotspotX = hotspotX;
113 	cmd->cursor.hotspotY = hotspotY;
114 
115 	vmw_cmd_commit_flush(dev_priv, cmd_size);
116 }
117 
118 /**
119  * vmw_cursor_update_image - update the cursor image on the provided plane
120  * @dev_priv: the private driver struct
121  * @vps: the plane state of the cursor plane
122  * @image: buffer which holds the cursor image
123  * @width: width of the mouse cursor image
124  * @height: height of the mouse cursor image
125  * @hotspotX: the horizontal position of mouse hotspot
126  * @hotspotY: the vertical position of mouse hotspot
127  */
vmw_cursor_update_image(struct vmw_private * dev_priv,struct vmw_plane_state * vps,u32 * image,u32 width,u32 height,u32 hotspotX,u32 hotspotY)128 static void vmw_cursor_update_image(struct vmw_private *dev_priv,
129 				    struct vmw_plane_state *vps,
130 				    u32 *image, u32 width, u32 height,
131 				    u32 hotspotX, u32 hotspotY)
132 {
133 	if (vps->cursor.bo)
134 		vmw_cursor_update_mob(dev_priv, vps, image,
135 				      vps->base.crtc_w, vps->base.crtc_h,
136 				      hotspotX, hotspotY);
137 
138 	else
139 		vmw_send_define_cursor_cmd(dev_priv, image, width, height,
140 					   hotspotX, hotspotY);
141 }
142 
143 
144 /**
145  * vmw_cursor_update_mob - Update cursor vis CursorMob mechanism
146  *
147  * Called from inside vmw_du_cursor_plane_atomic_update to actually
148  * make the cursor-image live.
149  *
150  * @dev_priv: device to work with
151  * @vps: the plane state of the cursor plane
152  * @image: cursor source data to fill the MOB with
153  * @width: source data width
154  * @height: source data height
155  * @hotspotX: cursor hotspot x
156  * @hotspotY: cursor hotspot Y
157  */
vmw_cursor_update_mob(struct vmw_private * dev_priv,struct vmw_plane_state * vps,u32 * image,u32 width,u32 height,u32 hotspotX,u32 hotspotY)158 static void vmw_cursor_update_mob(struct vmw_private *dev_priv,
159 				  struct vmw_plane_state *vps,
160 				  u32 *image, u32 width, u32 height,
161 				  u32 hotspotX, u32 hotspotY)
162 {
163 	SVGAGBCursorHeader *header;
164 	SVGAGBAlphaCursorHeader *alpha_header;
165 	const u32 image_size = width * height * sizeof(*image);
166 
167 	header = vmw_bo_map_and_cache(vps->cursor.bo);
168 	alpha_header = &header->header.alphaHeader;
169 
170 	memset(header, 0, sizeof(*header));
171 
172 	header->type = SVGA_ALPHA_CURSOR;
173 	header->sizeInBytes = image_size;
174 
175 	alpha_header->hotspotX = hotspotX;
176 	alpha_header->hotspotY = hotspotY;
177 	alpha_header->width = width;
178 	alpha_header->height = height;
179 
180 	memcpy(header + 1, image, image_size);
181 	vmw_write(dev_priv, SVGA_REG_CURSOR_MOBID,
182 		  vps->cursor.bo->tbo.resource->start);
183 }
184 
185 
vmw_du_cursor_mob_size(u32 w,u32 h)186 static u32 vmw_du_cursor_mob_size(u32 w, u32 h)
187 {
188 	return w * h * sizeof(u32) + sizeof(SVGAGBCursorHeader);
189 }
190 
191 /**
192  * vmw_du_cursor_plane_acquire_image -- Acquire the image data
193  * @vps: cursor plane state
194  */
vmw_du_cursor_plane_acquire_image(struct vmw_plane_state * vps)195 static u32 *vmw_du_cursor_plane_acquire_image(struct vmw_plane_state *vps)
196 {
197 	struct vmw_surface *surf;
198 
199 	if (vmw_user_object_is_null(&vps->uo))
200 		return NULL;
201 
202 	surf = vmw_user_object_surface(&vps->uo);
203 	if (surf && !vmw_user_object_is_mapped(&vps->uo))
204 		return surf->snooper.image;
205 
206 	return vmw_user_object_map(&vps->uo);
207 }
208 
vmw_du_cursor_plane_has_changed(struct vmw_plane_state * old_vps,struct vmw_plane_state * new_vps)209 static bool vmw_du_cursor_plane_has_changed(struct vmw_plane_state *old_vps,
210 					    struct vmw_plane_state *new_vps)
211 {
212 	void *old_image;
213 	void *new_image;
214 	u32 size;
215 	bool changed;
216 
217 	if (old_vps->base.crtc_w != new_vps->base.crtc_w ||
218 	    old_vps->base.crtc_h != new_vps->base.crtc_h)
219 	    return true;
220 
221 	if (old_vps->cursor.hotspot_x != new_vps->cursor.hotspot_x ||
222 	    old_vps->cursor.hotspot_y != new_vps->cursor.hotspot_y)
223 	    return true;
224 
225 	size = new_vps->base.crtc_w * new_vps->base.crtc_h * sizeof(u32);
226 
227 	old_image = vmw_du_cursor_plane_acquire_image(old_vps);
228 	new_image = vmw_du_cursor_plane_acquire_image(new_vps);
229 
230 	changed = false;
231 	if (old_image && new_image && old_image != new_image)
232 		changed = memcmp(old_image, new_image, size) != 0;
233 
234 	return changed;
235 }
236 
vmw_du_destroy_cursor_mob(struct vmw_bo ** vbo)237 static void vmw_du_destroy_cursor_mob(struct vmw_bo **vbo)
238 {
239 	if (!(*vbo))
240 		return;
241 
242 	ttm_bo_unpin(&(*vbo)->tbo);
243 	vmw_bo_unreference(vbo);
244 }
245 
vmw_du_put_cursor_mob(struct vmw_cursor_plane * vcp,struct vmw_plane_state * vps)246 static void vmw_du_put_cursor_mob(struct vmw_cursor_plane *vcp,
247 				  struct vmw_plane_state *vps)
248 {
249 	u32 i;
250 
251 	if (!vps->cursor.bo)
252 		return;
253 
254 	vmw_du_cursor_plane_unmap_cm(vps);
255 
256 	/* Look for a free slot to return this mob to the cache. */
257 	for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++) {
258 		if (!vcp->cursor_mobs[i]) {
259 			vcp->cursor_mobs[i] = vps->cursor.bo;
260 			vps->cursor.bo = NULL;
261 			return;
262 		}
263 	}
264 
265 	/* Cache is full: See if this mob is bigger than an existing mob. */
266 	for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++) {
267 		if (vcp->cursor_mobs[i]->tbo.base.size <
268 		    vps->cursor.bo->tbo.base.size) {
269 			vmw_du_destroy_cursor_mob(&vcp->cursor_mobs[i]);
270 			vcp->cursor_mobs[i] = vps->cursor.bo;
271 			vps->cursor.bo = NULL;
272 			return;
273 		}
274 	}
275 
276 	/* Destroy it if it's not worth caching. */
277 	vmw_du_destroy_cursor_mob(&vps->cursor.bo);
278 }
279 
vmw_du_get_cursor_mob(struct vmw_cursor_plane * vcp,struct vmw_plane_state * vps)280 static int vmw_du_get_cursor_mob(struct vmw_cursor_plane *vcp,
281 				 struct vmw_plane_state *vps)
282 {
283 	struct vmw_private *dev_priv = vcp->base.dev->dev_private;
284 	u32 size = vmw_du_cursor_mob_size(vps->base.crtc_w, vps->base.crtc_h);
285 	u32 i;
286 	u32 cursor_max_dim, mob_max_size;
287 	struct vmw_fence_obj *fence = NULL;
288 	int ret;
289 
290 	if (!dev_priv->has_mob ||
291 	    (dev_priv->capabilities2 & SVGA_CAP2_CURSOR_MOB) == 0)
292 		return -EINVAL;
293 
294 	mob_max_size = vmw_read(dev_priv, SVGA_REG_MOB_MAX_SIZE);
295 	cursor_max_dim = vmw_read(dev_priv, SVGA_REG_CURSOR_MAX_DIMENSION);
296 
297 	if (size > mob_max_size || vps->base.crtc_w > cursor_max_dim ||
298 	    vps->base.crtc_h > cursor_max_dim)
299 		return -EINVAL;
300 
301 	if (vps->cursor.bo) {
302 		if (vps->cursor.bo->tbo.base.size >= size)
303 			return 0;
304 		vmw_du_put_cursor_mob(vcp, vps);
305 	}
306 
307 	/* Look for an unused mob in the cache. */
308 	for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++) {
309 		if (vcp->cursor_mobs[i] &&
310 		    vcp->cursor_mobs[i]->tbo.base.size >= size) {
311 			vps->cursor.bo = vcp->cursor_mobs[i];
312 			vcp->cursor_mobs[i] = NULL;
313 			return 0;
314 		}
315 	}
316 	/* Create a new mob if we can't find an existing one. */
317 	ret = vmw_bo_create_and_populate(dev_priv, size,
318 					 VMW_BO_DOMAIN_MOB,
319 					 &vps->cursor.bo);
320 
321 	if (ret != 0)
322 		return ret;
323 
324 	/* Fence the mob creation so we are guarateed to have the mob */
325 	ret = ttm_bo_reserve(&vps->cursor.bo->tbo, false, false, NULL);
326 	if (ret != 0)
327 		goto teardown;
328 
329 	ret = vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL);
330 	if (ret != 0) {
331 		ttm_bo_unreserve(&vps->cursor.bo->tbo);
332 		goto teardown;
333 	}
334 
335 	dma_fence_wait(&fence->base, false);
336 	dma_fence_put(&fence->base);
337 
338 	ttm_bo_unreserve(&vps->cursor.bo->tbo);
339 	return 0;
340 
341 teardown:
342 	vmw_du_destroy_cursor_mob(&vps->cursor.bo);
343 	return ret;
344 }
345 
346 
vmw_cursor_update_position(struct vmw_private * dev_priv,bool show,int x,int y)347 static void vmw_cursor_update_position(struct vmw_private *dev_priv,
348 				       bool show, int x, int y)
349 {
350 	const uint32_t svga_cursor_on = show ? SVGA_CURSOR_ON_SHOW
351 					     : SVGA_CURSOR_ON_HIDE;
352 	uint32_t count;
353 
354 	spin_lock(&dev_priv->cursor_lock);
355 	if (dev_priv->capabilities2 & SVGA_CAP2_EXTRA_REGS) {
356 		vmw_write(dev_priv, SVGA_REG_CURSOR4_X, x);
357 		vmw_write(dev_priv, SVGA_REG_CURSOR4_Y, y);
358 		vmw_write(dev_priv, SVGA_REG_CURSOR4_SCREEN_ID, SVGA3D_INVALID_ID);
359 		vmw_write(dev_priv, SVGA_REG_CURSOR4_ON, svga_cursor_on);
360 		vmw_write(dev_priv, SVGA_REG_CURSOR4_SUBMIT, 1);
361 	} else if (vmw_is_cursor_bypass3_enabled(dev_priv)) {
362 		vmw_fifo_mem_write(dev_priv, SVGA_FIFO_CURSOR_ON, svga_cursor_on);
363 		vmw_fifo_mem_write(dev_priv, SVGA_FIFO_CURSOR_X, x);
364 		vmw_fifo_mem_write(dev_priv, SVGA_FIFO_CURSOR_Y, y);
365 		count = vmw_fifo_mem_read(dev_priv, SVGA_FIFO_CURSOR_COUNT);
366 		vmw_fifo_mem_write(dev_priv, SVGA_FIFO_CURSOR_COUNT, ++count);
367 	} else {
368 		vmw_write(dev_priv, SVGA_REG_CURSOR_X, x);
369 		vmw_write(dev_priv, SVGA_REG_CURSOR_Y, y);
370 		vmw_write(dev_priv, SVGA_REG_CURSOR_ON, svga_cursor_on);
371 	}
372 	spin_unlock(&dev_priv->cursor_lock);
373 }
374 
vmw_kms_cursor_snoop(struct vmw_surface * srf,struct ttm_object_file * tfile,struct ttm_buffer_object * bo,SVGA3dCmdHeader * header)375 void vmw_kms_cursor_snoop(struct vmw_surface *srf,
376 			  struct ttm_object_file *tfile,
377 			  struct ttm_buffer_object *bo,
378 			  SVGA3dCmdHeader *header)
379 {
380 	struct ttm_bo_kmap_obj map;
381 	unsigned long kmap_offset;
382 	unsigned long kmap_num;
383 	SVGA3dCopyBox *box;
384 	unsigned box_count;
385 	void *virtual;
386 	bool is_iomem;
387 	struct vmw_dma_cmd {
388 		SVGA3dCmdHeader header;
389 		SVGA3dCmdSurfaceDMA dma;
390 	} *cmd;
391 	int i, ret;
392 	const struct SVGA3dSurfaceDesc *desc =
393 		vmw_surface_get_desc(VMW_CURSOR_SNOOP_FORMAT);
394 	const u32 image_pitch = VMW_CURSOR_SNOOP_WIDTH * desc->pitchBytesPerBlock;
395 
396 	cmd = container_of(header, struct vmw_dma_cmd, header);
397 
398 	/* No snooper installed, nothing to copy */
399 	if (!srf->snooper.image)
400 		return;
401 
402 	if (cmd->dma.host.face != 0 || cmd->dma.host.mipmap != 0) {
403 		DRM_ERROR("face and mipmap for cursors should never != 0\n");
404 		return;
405 	}
406 
407 	if (cmd->header.size < 64) {
408 		DRM_ERROR("at least one full copy box must be given\n");
409 		return;
410 	}
411 
412 	box = (SVGA3dCopyBox *)&cmd[1];
413 	box_count = (cmd->header.size - sizeof(SVGA3dCmdSurfaceDMA)) /
414 			sizeof(SVGA3dCopyBox);
415 
416 	if (cmd->dma.guest.ptr.offset % PAGE_SIZE ||
417 	    box->x != 0    || box->y != 0    || box->z != 0    ||
418 	    box->srcx != 0 || box->srcy != 0 || box->srcz != 0 ||
419 	    box->d != 1    || box_count != 1 ||
420 	    box->w > VMW_CURSOR_SNOOP_WIDTH || box->h > VMW_CURSOR_SNOOP_HEIGHT) {
421 		/* TODO handle none page aligned offsets */
422 		/* TODO handle more dst & src != 0 */
423 		/* TODO handle more then one copy */
424 		DRM_ERROR("Can't snoop dma request for cursor!\n");
425 		DRM_ERROR("(%u, %u, %u) (%u, %u, %u) (%ux%ux%u) %u %u\n",
426 			  box->srcx, box->srcy, box->srcz,
427 			  box->x, box->y, box->z,
428 			  box->w, box->h, box->d, box_count,
429 			  cmd->dma.guest.ptr.offset);
430 		return;
431 	}
432 
433 	kmap_offset = cmd->dma.guest.ptr.offset >> PAGE_SHIFT;
434 	kmap_num = (VMW_CURSOR_SNOOP_HEIGHT*image_pitch) >> PAGE_SHIFT;
435 
436 	ret = ttm_bo_reserve(bo, true, false, NULL);
437 	if (unlikely(ret != 0)) {
438 		DRM_ERROR("reserve failed\n");
439 		return;
440 	}
441 
442 	ret = ttm_bo_kmap(bo, kmap_offset, kmap_num, &map);
443 	if (unlikely(ret != 0))
444 		goto err_unreserve;
445 
446 	virtual = ttm_kmap_obj_virtual(&map, &is_iomem);
447 
448 	if (box->w == VMW_CURSOR_SNOOP_WIDTH && cmd->dma.guest.pitch == image_pitch) {
449 		memcpy(srf->snooper.image, virtual,
450 		       VMW_CURSOR_SNOOP_HEIGHT*image_pitch);
451 	} else {
452 		/* Image is unsigned pointer. */
453 		for (i = 0; i < box->h; i++)
454 			memcpy(srf->snooper.image + i * image_pitch,
455 			       virtual + i * cmd->dma.guest.pitch,
456 			       box->w * desc->pitchBytesPerBlock);
457 	}
458 
459 	srf->snooper.age++;
460 
461 	ttm_bo_kunmap(&map);
462 err_unreserve:
463 	ttm_bo_unreserve(bo);
464 }
465 
466 /**
467  * vmw_kms_legacy_hotspot_clear - Clear legacy hotspots
468  *
469  * @dev_priv: Pointer to the device private struct.
470  *
471  * Clears all legacy hotspots.
472  */
vmw_kms_legacy_hotspot_clear(struct vmw_private * dev_priv)473 void vmw_kms_legacy_hotspot_clear(struct vmw_private *dev_priv)
474 {
475 	struct drm_device *dev = &dev_priv->drm;
476 	struct vmw_display_unit *du;
477 	struct drm_crtc *crtc;
478 
479 	drm_modeset_lock_all(dev);
480 	drm_for_each_crtc(crtc, dev) {
481 		du = vmw_crtc_to_du(crtc);
482 
483 		du->hotspot_x = 0;
484 		du->hotspot_y = 0;
485 	}
486 	drm_modeset_unlock_all(dev);
487 }
488 
vmw_kms_cursor_post_execbuf(struct vmw_private * dev_priv)489 void vmw_kms_cursor_post_execbuf(struct vmw_private *dev_priv)
490 {
491 	struct drm_device *dev = &dev_priv->drm;
492 	struct vmw_display_unit *du;
493 	struct drm_crtc *crtc;
494 
495 	mutex_lock(&dev->mode_config.mutex);
496 
497 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
498 		du = vmw_crtc_to_du(crtc);
499 		if (!du->cursor_surface ||
500 		    du->cursor_age == du->cursor_surface->snooper.age ||
501 		    !du->cursor_surface->snooper.image)
502 			continue;
503 
504 		du->cursor_age = du->cursor_surface->snooper.age;
505 		vmw_send_define_cursor_cmd(dev_priv,
506 					   du->cursor_surface->snooper.image,
507 					   VMW_CURSOR_SNOOP_WIDTH,
508 					   VMW_CURSOR_SNOOP_HEIGHT,
509 					   du->hotspot_x + du->core_hotspot_x,
510 					   du->hotspot_y + du->core_hotspot_y);
511 	}
512 
513 	mutex_unlock(&dev->mode_config.mutex);
514 }
515 
516 
vmw_du_cursor_plane_destroy(struct drm_plane * plane)517 void vmw_du_cursor_plane_destroy(struct drm_plane *plane)
518 {
519 	struct vmw_cursor_plane *vcp = vmw_plane_to_vcp(plane);
520 	u32 i;
521 
522 	vmw_cursor_update_position(plane->dev->dev_private, false, 0, 0);
523 
524 	for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++)
525 		vmw_du_destroy_cursor_mob(&vcp->cursor_mobs[i]);
526 
527 	drm_plane_cleanup(plane);
528 }
529 
530 
vmw_du_primary_plane_destroy(struct drm_plane * plane)531 void vmw_du_primary_plane_destroy(struct drm_plane *plane)
532 {
533 	drm_plane_cleanup(plane);
534 
535 	/* Planes are static in our case so we don't free it */
536 }
537 
538 
539 /**
540  * vmw_du_plane_unpin_surf - unpins resource associated with a framebuffer surface
541  *
542  * @vps: plane state associated with the display surface
543  */
vmw_du_plane_unpin_surf(struct vmw_plane_state * vps)544 void vmw_du_plane_unpin_surf(struct vmw_plane_state *vps)
545 {
546 	struct vmw_surface *surf = vmw_user_object_surface(&vps->uo);
547 
548 	if (surf) {
549 		if (vps->pinned) {
550 			vmw_resource_unpin(&surf->res);
551 			vps->pinned--;
552 		}
553 	}
554 }
555 
556 
557 /**
558  * vmw_du_plane_cleanup_fb - Unpins the plane surface
559  *
560  * @plane:  display plane
561  * @old_state: Contains the FB to clean up
562  *
563  * Unpins the framebuffer surface
564  *
565  * Returns 0 on success
566  */
567 void
vmw_du_plane_cleanup_fb(struct drm_plane * plane,struct drm_plane_state * old_state)568 vmw_du_plane_cleanup_fb(struct drm_plane *plane,
569 			struct drm_plane_state *old_state)
570 {
571 	struct vmw_plane_state *vps = vmw_plane_state_to_vps(old_state);
572 
573 	vmw_du_plane_unpin_surf(vps);
574 }
575 
576 
577 /**
578  * vmw_du_cursor_plane_map_cm - Maps the cursor mobs.
579  *
580  * @vps: plane_state
581  *
582  * Returns 0 on success
583  */
584 
585 static int
vmw_du_cursor_plane_map_cm(struct vmw_plane_state * vps)586 vmw_du_cursor_plane_map_cm(struct vmw_plane_state *vps)
587 {
588 	int ret;
589 	u32 size = vmw_du_cursor_mob_size(vps->base.crtc_w, vps->base.crtc_h);
590 	struct ttm_buffer_object *bo;
591 
592 	if (!vps->cursor.bo)
593 		return -EINVAL;
594 
595 	bo = &vps->cursor.bo->tbo;
596 
597 	if (bo->base.size < size)
598 		return -EINVAL;
599 
600 	if (vps->cursor.bo->map.virtual)
601 		return 0;
602 
603 	ret = ttm_bo_reserve(bo, false, false, NULL);
604 	if (unlikely(ret != 0))
605 		return -ENOMEM;
606 
607 	vmw_bo_map_and_cache(vps->cursor.bo);
608 
609 	ttm_bo_unreserve(bo);
610 
611 	if (unlikely(ret != 0))
612 		return -ENOMEM;
613 
614 	return 0;
615 }
616 
617 
618 /**
619  * vmw_du_cursor_plane_unmap_cm - Unmaps the cursor mobs.
620  *
621  * @vps: state of the cursor plane
622  *
623  * Returns 0 on success
624  */
625 
626 static int
vmw_du_cursor_plane_unmap_cm(struct vmw_plane_state * vps)627 vmw_du_cursor_plane_unmap_cm(struct vmw_plane_state *vps)
628 {
629 	int ret = 0;
630 	struct vmw_bo *vbo = vps->cursor.bo;
631 
632 	if (!vbo || !vbo->map.virtual)
633 		return 0;
634 
635 	ret = ttm_bo_reserve(&vbo->tbo, true, false, NULL);
636 	if (likely(ret == 0)) {
637 		vmw_bo_unmap(vbo);
638 		ttm_bo_unreserve(&vbo->tbo);
639 	}
640 
641 	return ret;
642 }
643 
644 
645 /**
646  * vmw_du_cursor_plane_cleanup_fb - Unpins the plane surface
647  *
648  * @plane: cursor plane
649  * @old_state: contains the state to clean up
650  *
651  * Unmaps all cursor bo mappings and unpins the cursor surface
652  *
653  * Returns 0 on success
654  */
655 void
vmw_du_cursor_plane_cleanup_fb(struct drm_plane * plane,struct drm_plane_state * old_state)656 vmw_du_cursor_plane_cleanup_fb(struct drm_plane *plane,
657 			       struct drm_plane_state *old_state)
658 {
659 	struct vmw_cursor_plane *vcp = vmw_plane_to_vcp(plane);
660 	struct vmw_plane_state *vps = vmw_plane_state_to_vps(old_state);
661 
662 	if (!vmw_user_object_is_null(&vps->uo))
663 		vmw_user_object_unmap(&vps->uo);
664 
665 	vmw_du_cursor_plane_unmap_cm(vps);
666 	vmw_du_put_cursor_mob(vcp, vps);
667 
668 	vmw_du_plane_unpin_surf(vps);
669 	vmw_user_object_unref(&vps->uo);
670 }
671 
672 
673 /**
674  * vmw_du_cursor_plane_prepare_fb - Readies the cursor by referencing it
675  *
676  * @plane:  display plane
677  * @new_state: info on the new plane state, including the FB
678  *
679  * Returns 0 on success
680  */
681 int
vmw_du_cursor_plane_prepare_fb(struct drm_plane * plane,struct drm_plane_state * new_state)682 vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane,
683 			       struct drm_plane_state *new_state)
684 {
685 	struct drm_framebuffer *fb = new_state->fb;
686 	struct vmw_cursor_plane *vcp = vmw_plane_to_vcp(plane);
687 	struct vmw_plane_state *vps = vmw_plane_state_to_vps(new_state);
688 	struct vmw_bo *bo = NULL;
689 	int ret = 0;
690 
691 	if (!vmw_user_object_is_null(&vps->uo)) {
692 		vmw_user_object_unmap(&vps->uo);
693 		vmw_user_object_unref(&vps->uo);
694 	}
695 
696 	if (fb) {
697 		if (vmw_framebuffer_to_vfb(fb)->bo) {
698 			vps->uo.buffer = vmw_framebuffer_to_vfbd(fb)->buffer;
699 			vps->uo.surface = NULL;
700 		} else {
701 			memcpy(&vps->uo, &vmw_framebuffer_to_vfbs(fb)->uo, sizeof(vps->uo));
702 		}
703 		vmw_user_object_ref(&vps->uo);
704 	}
705 
706 	bo = vmw_user_object_buffer(&vps->uo);
707 	if (bo) {
708 		struct ttm_operation_ctx ctx = {false, false};
709 
710 		ret = ttm_bo_reserve(&bo->tbo, true, false, NULL);
711 		if (ret != 0)
712 			return -ENOMEM;
713 
714 		ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
715 		if (ret != 0)
716 			return -ENOMEM;
717 
718 		vmw_bo_pin_reserved(bo, true);
719 		if (vmw_framebuffer_to_vfb(fb)->bo) {
720 			const u32 size = new_state->crtc_w * new_state->crtc_h * sizeof(u32);
721 
722 			(void)vmw_bo_map_and_cache_size(bo, size);
723 		} else {
724 			vmw_bo_map_and_cache(bo);
725 		}
726 		ttm_bo_unreserve(&bo->tbo);
727 	}
728 
729 	if (!vmw_user_object_is_null(&vps->uo)) {
730 		vmw_du_get_cursor_mob(vcp, vps);
731 		vmw_du_cursor_plane_map_cm(vps);
732 	}
733 
734 	return 0;
735 }
736 
737 
738 void
vmw_du_cursor_plane_atomic_update(struct drm_plane * plane,struct drm_atomic_state * state)739 vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
740 				  struct drm_atomic_state *state)
741 {
742 	struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state,
743 									   plane);
744 	struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
745 									   plane);
746 	struct drm_crtc *crtc = new_state->crtc ?: old_state->crtc;
747 	struct vmw_private *dev_priv = vmw_priv(crtc->dev);
748 	struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
749 	struct vmw_plane_state *vps = vmw_plane_state_to_vps(new_state);
750 	struct vmw_plane_state *old_vps = vmw_plane_state_to_vps(old_state);
751 	struct vmw_bo *old_bo = NULL;
752 	struct vmw_bo *new_bo = NULL;
753 	s32 hotspot_x, hotspot_y;
754 	int ret;
755 
756 	hotspot_x = du->hotspot_x + new_state->hotspot_x;
757 	hotspot_y = du->hotspot_y + new_state->hotspot_y;
758 
759 	du->cursor_surface = vmw_user_object_surface(&vps->uo);
760 
761 	if (vmw_user_object_is_null(&vps->uo)) {
762 		vmw_cursor_update_position(dev_priv, false, 0, 0);
763 		return;
764 	}
765 
766 	vps->cursor.hotspot_x = hotspot_x;
767 	vps->cursor.hotspot_y = hotspot_y;
768 
769 	if (du->cursor_surface)
770 		du->cursor_age = du->cursor_surface->snooper.age;
771 
772 	if (!vmw_user_object_is_null(&old_vps->uo)) {
773 		old_bo = vmw_user_object_buffer(&old_vps->uo);
774 		ret = ttm_bo_reserve(&old_bo->tbo, false, false, NULL);
775 		if (ret != 0)
776 			return;
777 	}
778 
779 	if (!vmw_user_object_is_null(&vps->uo)) {
780 		new_bo = vmw_user_object_buffer(&vps->uo);
781 		if (old_bo != new_bo) {
782 			ret = ttm_bo_reserve(&new_bo->tbo, false, false, NULL);
783 			if (ret != 0)
784 				return;
785 		} else {
786 			new_bo = NULL;
787 		}
788 	}
789 	if (!vmw_du_cursor_plane_has_changed(old_vps, vps)) {
790 		/*
791 		 * If it hasn't changed, avoid making the device do extra
792 		 * work by keeping the old cursor active.
793 		 */
794 		struct vmw_cursor_plane_state tmp = old_vps->cursor;
795 		old_vps->cursor = vps->cursor;
796 		vps->cursor = tmp;
797 	} else {
798 		void *image = vmw_du_cursor_plane_acquire_image(vps);
799 		if (image)
800 			vmw_cursor_update_image(dev_priv, vps, image,
801 						new_state->crtc_w,
802 						new_state->crtc_h,
803 						hotspot_x, hotspot_y);
804 	}
805 
806 	if (old_bo)
807 		ttm_bo_unreserve(&old_bo->tbo);
808 	if (new_bo)
809 		ttm_bo_unreserve(&new_bo->tbo);
810 
811 	du->cursor_x = new_state->crtc_x + du->set_gui_x;
812 	du->cursor_y = new_state->crtc_y + du->set_gui_y;
813 
814 	vmw_cursor_update_position(dev_priv, true,
815 				   du->cursor_x + hotspot_x,
816 				   du->cursor_y + hotspot_y);
817 
818 	du->core_hotspot_x = hotspot_x - du->hotspot_x;
819 	du->core_hotspot_y = hotspot_y - du->hotspot_y;
820 }
821 
822 
823 /**
824  * vmw_du_primary_plane_atomic_check - check if the new state is okay
825  *
826  * @plane: display plane
827  * @state: info on the new plane state, including the FB
828  *
829  * Check if the new state is settable given the current state.  Other
830  * than what the atomic helper checks, we care about crtc fitting
831  * the FB and maintaining one active framebuffer.
832  *
833  * Returns 0 on success
834  */
vmw_du_primary_plane_atomic_check(struct drm_plane * plane,struct drm_atomic_state * state)835 int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
836 				      struct drm_atomic_state *state)
837 {
838 	struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state,
839 									   plane);
840 	struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
841 									   plane);
842 	struct drm_crtc_state *crtc_state = NULL;
843 	struct drm_framebuffer *new_fb = new_state->fb;
844 	struct drm_framebuffer *old_fb = old_state->fb;
845 	int ret;
846 
847 	/*
848 	 * Ignore damage clips if the framebuffer attached to the plane's state
849 	 * has changed since the last plane update (page-flip). In this case, a
850 	 * full plane update should happen because uploads are done per-buffer.
851 	 */
852 	if (old_fb != new_fb)
853 		new_state->ignore_damage_clips = true;
854 
855 	if (new_state->crtc)
856 		crtc_state = drm_atomic_get_new_crtc_state(state,
857 							   new_state->crtc);
858 
859 	ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
860 						  DRM_PLANE_NO_SCALING,
861 						  DRM_PLANE_NO_SCALING,
862 						  false, true);
863 	return ret;
864 }
865 
866 
867 /**
868  * vmw_du_cursor_plane_atomic_check - check if the new state is okay
869  *
870  * @plane: cursor plane
871  * @state: info on the new plane state
872  *
873  * This is a chance to fail if the new cursor state does not fit
874  * our requirements.
875  *
876  * Returns 0 on success
877  */
vmw_du_cursor_plane_atomic_check(struct drm_plane * plane,struct drm_atomic_state * state)878 int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
879 				     struct drm_atomic_state *state)
880 {
881 	struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state,
882 									   plane);
883 	int ret = 0;
884 	struct drm_crtc_state *crtc_state = NULL;
885 	struct vmw_surface *surface = NULL;
886 	struct drm_framebuffer *fb = new_state->fb;
887 
888 	if (new_state->crtc)
889 		crtc_state = drm_atomic_get_new_crtc_state(new_state->state,
890 							   new_state->crtc);
891 
892 	ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
893 						  DRM_PLANE_NO_SCALING,
894 						  DRM_PLANE_NO_SCALING,
895 						  true, true);
896 	if (ret)
897 		return ret;
898 
899 	/* Turning off */
900 	if (!fb)
901 		return 0;
902 
903 	/* A lot of the code assumes this */
904 	if (new_state->crtc_w != 64 || new_state->crtc_h != 64) {
905 		DRM_ERROR("Invalid cursor dimensions (%d, %d)\n",
906 			  new_state->crtc_w, new_state->crtc_h);
907 		return -EINVAL;
908 	}
909 
910 	if (!vmw_framebuffer_to_vfb(fb)->bo) {
911 		surface = vmw_user_object_surface(&vmw_framebuffer_to_vfbs(fb)->uo);
912 
913 		WARN_ON(!surface);
914 
915 		if (!surface ||
916 		    (!surface->snooper.image && !surface->res.guest_memory_bo)) {
917 			DRM_ERROR("surface not suitable for cursor\n");
918 			return -EINVAL;
919 		}
920 	}
921 
922 	return 0;
923 }
924 
925 
vmw_du_crtc_atomic_check(struct drm_crtc * crtc,struct drm_atomic_state * state)926 int vmw_du_crtc_atomic_check(struct drm_crtc *crtc,
927 			     struct drm_atomic_state *state)
928 {
929 	struct vmw_private *vmw = vmw_priv(crtc->dev);
930 	struct drm_crtc_state *new_state = drm_atomic_get_new_crtc_state(state,
931 									 crtc);
932 	struct vmw_display_unit *du = vmw_crtc_to_du(new_state->crtc);
933 	int connector_mask = drm_connector_mask(&du->connector);
934 	bool has_primary = new_state->plane_mask &
935 			   drm_plane_mask(crtc->primary);
936 
937 	/*
938 	 * This is fine in general, but broken userspace might expect
939 	 * some actual rendering so give a clue as why it's blank.
940 	 */
941 	if (new_state->enable && !has_primary)
942 		drm_dbg_driver(&vmw->drm,
943 			       "CRTC without a primary plane will be blank.\n");
944 
945 
946 	if (new_state->connector_mask != connector_mask &&
947 	    new_state->connector_mask != 0) {
948 		DRM_ERROR("Invalid connectors configuration\n");
949 		return -EINVAL;
950 	}
951 
952 	/*
953 	 * Our virtual device does not have a dot clock, so use the logical
954 	 * clock value as the dot clock.
955 	 */
956 	if (new_state->mode.crtc_clock == 0)
957 		new_state->adjusted_mode.crtc_clock = new_state->mode.clock;
958 
959 	return 0;
960 }
961 
962 
vmw_du_crtc_atomic_begin(struct drm_crtc * crtc,struct drm_atomic_state * state)963 void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
964 			      struct drm_atomic_state *state)
965 {
966 	vmw_vkms_crtc_atomic_begin(crtc, state);
967 }
968 
969 /**
970  * vmw_du_crtc_duplicate_state - duplicate crtc state
971  * @crtc: DRM crtc
972  *
973  * Allocates and returns a copy of the crtc state (both common and
974  * vmw-specific) for the specified crtc.
975  *
976  * Returns: The newly allocated crtc state, or NULL on failure.
977  */
978 struct drm_crtc_state *
vmw_du_crtc_duplicate_state(struct drm_crtc * crtc)979 vmw_du_crtc_duplicate_state(struct drm_crtc *crtc)
980 {
981 	struct drm_crtc_state *state;
982 	struct vmw_crtc_state *vcs;
983 
984 	if (WARN_ON(!crtc->state))
985 		return NULL;
986 
987 	vcs = kmemdup(crtc->state, sizeof(*vcs), GFP_KERNEL);
988 
989 	if (!vcs)
990 		return NULL;
991 
992 	state = &vcs->base;
993 
994 	__drm_atomic_helper_crtc_duplicate_state(crtc, state);
995 
996 	return state;
997 }
998 
999 
1000 /**
1001  * vmw_du_crtc_reset - creates a blank vmw crtc state
1002  * @crtc: DRM crtc
1003  *
1004  * Resets the atomic state for @crtc by freeing the state pointer (which
1005  * might be NULL, e.g. at driver load time) and allocating a new empty state
1006  * object.
1007  */
vmw_du_crtc_reset(struct drm_crtc * crtc)1008 void vmw_du_crtc_reset(struct drm_crtc *crtc)
1009 {
1010 	struct vmw_crtc_state *vcs;
1011 
1012 
1013 	if (crtc->state) {
1014 		__drm_atomic_helper_crtc_destroy_state(crtc->state);
1015 
1016 		kfree(vmw_crtc_state_to_vcs(crtc->state));
1017 	}
1018 
1019 	vcs = kzalloc(sizeof(*vcs), GFP_KERNEL);
1020 
1021 	if (!vcs) {
1022 		DRM_ERROR("Cannot allocate vmw_crtc_state\n");
1023 		return;
1024 	}
1025 
1026 	__drm_atomic_helper_crtc_reset(crtc, &vcs->base);
1027 }
1028 
1029 
1030 /**
1031  * vmw_du_crtc_destroy_state - destroy crtc state
1032  * @crtc: DRM crtc
1033  * @state: state object to destroy
1034  *
1035  * Destroys the crtc state (both common and vmw-specific) for the
1036  * specified plane.
1037  */
1038 void
vmw_du_crtc_destroy_state(struct drm_crtc * crtc,struct drm_crtc_state * state)1039 vmw_du_crtc_destroy_state(struct drm_crtc *crtc,
1040 			  struct drm_crtc_state *state)
1041 {
1042 	drm_atomic_helper_crtc_destroy_state(crtc, state);
1043 }
1044 
1045 
1046 /**
1047  * vmw_du_plane_duplicate_state - duplicate plane state
1048  * @plane: drm plane
1049  *
1050  * Allocates and returns a copy of the plane state (both common and
1051  * vmw-specific) for the specified plane.
1052  *
1053  * Returns: The newly allocated plane state, or NULL on failure.
1054  */
1055 struct drm_plane_state *
vmw_du_plane_duplicate_state(struct drm_plane * plane)1056 vmw_du_plane_duplicate_state(struct drm_plane *plane)
1057 {
1058 	struct drm_plane_state *state;
1059 	struct vmw_plane_state *vps;
1060 
1061 	vps = kmemdup(plane->state, sizeof(*vps), GFP_KERNEL);
1062 
1063 	if (!vps)
1064 		return NULL;
1065 
1066 	vps->pinned = 0;
1067 	vps->cpp = 0;
1068 
1069 	memset(&vps->cursor, 0, sizeof(vps->cursor));
1070 
1071 	/* Each ref counted resource needs to be acquired again */
1072 	vmw_user_object_ref(&vps->uo);
1073 	state = &vps->base;
1074 
1075 	__drm_atomic_helper_plane_duplicate_state(plane, state);
1076 
1077 	return state;
1078 }
1079 
1080 
1081 /**
1082  * vmw_du_plane_reset - creates a blank vmw plane state
1083  * @plane: drm plane
1084  *
1085  * Resets the atomic state for @plane by freeing the state pointer (which might
1086  * be NULL, e.g. at driver load time) and allocating a new empty state object.
1087  */
vmw_du_plane_reset(struct drm_plane * plane)1088 void vmw_du_plane_reset(struct drm_plane *plane)
1089 {
1090 	struct vmw_plane_state *vps;
1091 
1092 	if (plane->state)
1093 		vmw_du_plane_destroy_state(plane, plane->state);
1094 
1095 	vps = kzalloc(sizeof(*vps), GFP_KERNEL);
1096 
1097 	if (!vps) {
1098 		DRM_ERROR("Cannot allocate vmw_plane_state\n");
1099 		return;
1100 	}
1101 
1102 	__drm_atomic_helper_plane_reset(plane, &vps->base);
1103 }
1104 
1105 
1106 /**
1107  * vmw_du_plane_destroy_state - destroy plane state
1108  * @plane: DRM plane
1109  * @state: state object to destroy
1110  *
1111  * Destroys the plane state (both common and vmw-specific) for the
1112  * specified plane.
1113  */
1114 void
vmw_du_plane_destroy_state(struct drm_plane * plane,struct drm_plane_state * state)1115 vmw_du_plane_destroy_state(struct drm_plane *plane,
1116 			   struct drm_plane_state *state)
1117 {
1118 	struct vmw_plane_state *vps = vmw_plane_state_to_vps(state);
1119 
1120 	/* Should have been freed by cleanup_fb */
1121 	vmw_user_object_unref(&vps->uo);
1122 
1123 	drm_atomic_helper_plane_destroy_state(plane, state);
1124 }
1125 
1126 
1127 /**
1128  * vmw_du_connector_duplicate_state - duplicate connector state
1129  * @connector: DRM connector
1130  *
1131  * Allocates and returns a copy of the connector state (both common and
1132  * vmw-specific) for the specified connector.
1133  *
1134  * Returns: The newly allocated connector state, or NULL on failure.
1135  */
1136 struct drm_connector_state *
vmw_du_connector_duplicate_state(struct drm_connector * connector)1137 vmw_du_connector_duplicate_state(struct drm_connector *connector)
1138 {
1139 	struct drm_connector_state *state;
1140 	struct vmw_connector_state *vcs;
1141 
1142 	if (WARN_ON(!connector->state))
1143 		return NULL;
1144 
1145 	vcs = kmemdup(connector->state, sizeof(*vcs), GFP_KERNEL);
1146 
1147 	if (!vcs)
1148 		return NULL;
1149 
1150 	state = &vcs->base;
1151 
1152 	__drm_atomic_helper_connector_duplicate_state(connector, state);
1153 
1154 	return state;
1155 }
1156 
1157 
1158 /**
1159  * vmw_du_connector_reset - creates a blank vmw connector state
1160  * @connector: DRM connector
1161  *
1162  * Resets the atomic state for @connector by freeing the state pointer (which
1163  * might be NULL, e.g. at driver load time) and allocating a new empty state
1164  * object.
1165  */
vmw_du_connector_reset(struct drm_connector * connector)1166 void vmw_du_connector_reset(struct drm_connector *connector)
1167 {
1168 	struct vmw_connector_state *vcs;
1169 
1170 
1171 	if (connector->state) {
1172 		__drm_atomic_helper_connector_destroy_state(connector->state);
1173 
1174 		kfree(vmw_connector_state_to_vcs(connector->state));
1175 	}
1176 
1177 	vcs = kzalloc(sizeof(*vcs), GFP_KERNEL);
1178 
1179 	if (!vcs) {
1180 		DRM_ERROR("Cannot allocate vmw_connector_state\n");
1181 		return;
1182 	}
1183 
1184 	__drm_atomic_helper_connector_reset(connector, &vcs->base);
1185 }
1186 
1187 
1188 /**
1189  * vmw_du_connector_destroy_state - destroy connector state
1190  * @connector: DRM connector
1191  * @state: state object to destroy
1192  *
1193  * Destroys the connector state (both common and vmw-specific) for the
1194  * specified plane.
1195  */
1196 void
vmw_du_connector_destroy_state(struct drm_connector * connector,struct drm_connector_state * state)1197 vmw_du_connector_destroy_state(struct drm_connector *connector,
1198 			  struct drm_connector_state *state)
1199 {
1200 	drm_atomic_helper_connector_destroy_state(connector, state);
1201 }
1202 /*
1203  * Generic framebuffer code
1204  */
1205 
1206 /*
1207  * Surface framebuffer code
1208  */
1209 
vmw_framebuffer_surface_destroy(struct drm_framebuffer * framebuffer)1210 static void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
1211 {
1212 	struct vmw_framebuffer_surface *vfbs =
1213 		vmw_framebuffer_to_vfbs(framebuffer);
1214 
1215 	drm_framebuffer_cleanup(framebuffer);
1216 	vmw_user_object_unref(&vfbs->uo);
1217 
1218 	kfree(vfbs);
1219 }
1220 
1221 /**
1222  * vmw_kms_readback - Perform a readback from the screen system to
1223  * a buffer-object backed framebuffer.
1224  *
1225  * @dev_priv: Pointer to the device private structure.
1226  * @file_priv: Pointer to a struct drm_file identifying the caller.
1227  * Must be set to NULL if @user_fence_rep is NULL.
1228  * @vfb: Pointer to the buffer-object backed framebuffer.
1229  * @user_fence_rep: User-space provided structure for fence information.
1230  * Must be set to non-NULL if @file_priv is non-NULL.
1231  * @vclips: Array of clip rects.
1232  * @num_clips: Number of clip rects in @vclips.
1233  *
1234  * Returns 0 on success, negative error code on failure. -ERESTARTSYS if
1235  * interrupted.
1236  */
vmw_kms_readback(struct vmw_private * dev_priv,struct drm_file * file_priv,struct vmw_framebuffer * vfb,struct drm_vmw_fence_rep __user * user_fence_rep,struct drm_vmw_rect * vclips,uint32_t num_clips)1237 int vmw_kms_readback(struct vmw_private *dev_priv,
1238 		     struct drm_file *file_priv,
1239 		     struct vmw_framebuffer *vfb,
1240 		     struct drm_vmw_fence_rep __user *user_fence_rep,
1241 		     struct drm_vmw_rect *vclips,
1242 		     uint32_t num_clips)
1243 {
1244 	switch (dev_priv->active_display_unit) {
1245 	case vmw_du_screen_object:
1246 		return vmw_kms_sou_readback(dev_priv, file_priv, vfb,
1247 					    user_fence_rep, vclips, num_clips,
1248 					    NULL);
1249 	case vmw_du_screen_target:
1250 		return vmw_kms_stdu_readback(dev_priv, file_priv, vfb,
1251 					     user_fence_rep, NULL, vclips, num_clips,
1252 					     1, NULL);
1253 	default:
1254 		WARN_ONCE(true,
1255 			  "Readback called with invalid display system.\n");
1256 }
1257 
1258 	return -ENOSYS;
1259 }
1260 
vmw_framebuffer_surface_create_handle(struct drm_framebuffer * fb,struct drm_file * file_priv,unsigned int * handle)1261 static int vmw_framebuffer_surface_create_handle(struct drm_framebuffer *fb,
1262 						 struct drm_file *file_priv,
1263 						 unsigned int *handle)
1264 {
1265 	struct vmw_framebuffer_surface *vfbs = vmw_framebuffer_to_vfbs(fb);
1266 	struct vmw_bo *bo = vmw_user_object_buffer(&vfbs->uo);
1267 
1268 	return drm_gem_handle_create(file_priv, &bo->tbo.base, handle);
1269 }
1270 
1271 static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
1272 	.create_handle = vmw_framebuffer_surface_create_handle,
1273 	.destroy = vmw_framebuffer_surface_destroy,
1274 	.dirty = drm_atomic_helper_dirtyfb,
1275 };
1276 
vmw_kms_new_framebuffer_surface(struct vmw_private * dev_priv,struct vmw_user_object * uo,struct vmw_framebuffer ** out,const struct drm_mode_fb_cmd2 * mode_cmd)1277 static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
1278 					   struct vmw_user_object *uo,
1279 					   struct vmw_framebuffer **out,
1280 					   const struct drm_mode_fb_cmd2
1281 					   *mode_cmd)
1282 
1283 {
1284 	struct drm_device *dev = &dev_priv->drm;
1285 	struct vmw_framebuffer_surface *vfbs;
1286 	struct vmw_surface *surface;
1287 	int ret;
1288 
1289 	/* 3D is only supported on HWv8 and newer hosts */
1290 	if (dev_priv->active_display_unit == vmw_du_legacy)
1291 		return -ENOSYS;
1292 
1293 	surface = vmw_user_object_surface(uo);
1294 
1295 	/*
1296 	 * Sanity checks.
1297 	 */
1298 
1299 	if (!drm_any_plane_has_format(&dev_priv->drm,
1300 				      mode_cmd->pixel_format,
1301 				      mode_cmd->modifier[0])) {
1302 		drm_dbg(&dev_priv->drm,
1303 			"unsupported pixel format %p4cc / modifier 0x%llx\n",
1304 			&mode_cmd->pixel_format, mode_cmd->modifier[0]);
1305 		return -EINVAL;
1306 	}
1307 
1308 	/* Surface must be marked as a scanout. */
1309 	if (unlikely(!surface->metadata.scanout))
1310 		return -EINVAL;
1311 
1312 	if (unlikely(surface->metadata.mip_levels[0] != 1 ||
1313 		     surface->metadata.num_sizes != 1 ||
1314 		     surface->metadata.base_size.width < mode_cmd->width ||
1315 		     surface->metadata.base_size.height < mode_cmd->height ||
1316 		     surface->metadata.base_size.depth != 1)) {
1317 		DRM_ERROR("Incompatible surface dimensions "
1318 			  "for requested mode.\n");
1319 		return -EINVAL;
1320 	}
1321 
1322 	vfbs = kzalloc(sizeof(*vfbs), GFP_KERNEL);
1323 	if (!vfbs) {
1324 		ret = -ENOMEM;
1325 		goto out_err1;
1326 	}
1327 
1328 	drm_helper_mode_fill_fb_struct(dev, &vfbs->base.base, mode_cmd);
1329 	memcpy(&vfbs->uo, uo, sizeof(vfbs->uo));
1330 	vmw_user_object_ref(&vfbs->uo);
1331 
1332 	*out = &vfbs->base;
1333 
1334 	ret = drm_framebuffer_init(dev, &vfbs->base.base,
1335 				   &vmw_framebuffer_surface_funcs);
1336 	if (ret)
1337 		goto out_err2;
1338 
1339 	return 0;
1340 
1341 out_err2:
1342 	vmw_user_object_unref(&vfbs->uo);
1343 	kfree(vfbs);
1344 out_err1:
1345 	return ret;
1346 }
1347 
1348 /*
1349  * Buffer-object framebuffer code
1350  */
1351 
vmw_framebuffer_bo_create_handle(struct drm_framebuffer * fb,struct drm_file * file_priv,unsigned int * handle)1352 static int vmw_framebuffer_bo_create_handle(struct drm_framebuffer *fb,
1353 					    struct drm_file *file_priv,
1354 					    unsigned int *handle)
1355 {
1356 	struct vmw_framebuffer_bo *vfbd =
1357 			vmw_framebuffer_to_vfbd(fb);
1358 	return drm_gem_handle_create(file_priv, &vfbd->buffer->tbo.base, handle);
1359 }
1360 
vmw_framebuffer_bo_destroy(struct drm_framebuffer * framebuffer)1361 static void vmw_framebuffer_bo_destroy(struct drm_framebuffer *framebuffer)
1362 {
1363 	struct vmw_framebuffer_bo *vfbd =
1364 		vmw_framebuffer_to_vfbd(framebuffer);
1365 
1366 	drm_framebuffer_cleanup(framebuffer);
1367 	vmw_bo_unreference(&vfbd->buffer);
1368 
1369 	kfree(vfbd);
1370 }
1371 
1372 static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
1373 	.create_handle = vmw_framebuffer_bo_create_handle,
1374 	.destroy = vmw_framebuffer_bo_destroy,
1375 	.dirty = drm_atomic_helper_dirtyfb,
1376 };
1377 
vmw_kms_new_framebuffer_bo(struct vmw_private * dev_priv,struct vmw_bo * bo,struct vmw_framebuffer ** out,const struct drm_mode_fb_cmd2 * mode_cmd)1378 static int vmw_kms_new_framebuffer_bo(struct vmw_private *dev_priv,
1379 				      struct vmw_bo *bo,
1380 				      struct vmw_framebuffer **out,
1381 				      const struct drm_mode_fb_cmd2
1382 				      *mode_cmd)
1383 
1384 {
1385 	struct drm_device *dev = &dev_priv->drm;
1386 	struct vmw_framebuffer_bo *vfbd;
1387 	unsigned int requested_size;
1388 	int ret;
1389 
1390 	requested_size = mode_cmd->height * mode_cmd->pitches[0];
1391 	if (unlikely(requested_size > bo->tbo.base.size)) {
1392 		DRM_ERROR("Screen buffer object size is too small "
1393 			  "for requested mode.\n");
1394 		return -EINVAL;
1395 	}
1396 
1397 	if (!drm_any_plane_has_format(&dev_priv->drm,
1398 				      mode_cmd->pixel_format,
1399 				      mode_cmd->modifier[0])) {
1400 		drm_dbg(&dev_priv->drm,
1401 			"unsupported pixel format %p4cc / modifier 0x%llx\n",
1402 			&mode_cmd->pixel_format, mode_cmd->modifier[0]);
1403 		return -EINVAL;
1404 	}
1405 
1406 	vfbd = kzalloc(sizeof(*vfbd), GFP_KERNEL);
1407 	if (!vfbd) {
1408 		ret = -ENOMEM;
1409 		goto out_err1;
1410 	}
1411 
1412 	vfbd->base.base.obj[0] = &bo->tbo.base;
1413 	drm_helper_mode_fill_fb_struct(dev, &vfbd->base.base, mode_cmd);
1414 	vfbd->base.bo = true;
1415 	vfbd->buffer = vmw_bo_reference(bo);
1416 	*out = &vfbd->base;
1417 
1418 	ret = drm_framebuffer_init(dev, &vfbd->base.base,
1419 				   &vmw_framebuffer_bo_funcs);
1420 	if (ret)
1421 		goto out_err2;
1422 
1423 	return 0;
1424 
1425 out_err2:
1426 	vmw_bo_unreference(&bo);
1427 	kfree(vfbd);
1428 out_err1:
1429 	return ret;
1430 }
1431 
1432 
1433 /**
1434  * vmw_kms_srf_ok - check if a surface can be created
1435  *
1436  * @dev_priv: Pointer to device private struct.
1437  * @width: requested width
1438  * @height: requested height
1439  *
1440  * Surfaces need to be less than texture size
1441  */
1442 static bool
vmw_kms_srf_ok(struct vmw_private * dev_priv,uint32_t width,uint32_t height)1443 vmw_kms_srf_ok(struct vmw_private *dev_priv, uint32_t width, uint32_t height)
1444 {
1445 	if (width  > dev_priv->texture_max_width ||
1446 	    height > dev_priv->texture_max_height)
1447 		return false;
1448 
1449 	return true;
1450 }
1451 
1452 /**
1453  * vmw_kms_new_framebuffer - Create a new framebuffer.
1454  *
1455  * @dev_priv: Pointer to device private struct.
1456  * @uo: Pointer to user object to wrap the kms framebuffer around.
1457  * Either the buffer or surface inside the user object must be NULL.
1458  * @mode_cmd: Frame-buffer metadata.
1459  */
1460 struct vmw_framebuffer *
vmw_kms_new_framebuffer(struct vmw_private * dev_priv,struct vmw_user_object * uo,const struct drm_mode_fb_cmd2 * mode_cmd)1461 vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
1462 			struct vmw_user_object *uo,
1463 			const struct drm_mode_fb_cmd2 *mode_cmd)
1464 {
1465 	struct vmw_framebuffer *vfb = NULL;
1466 	int ret;
1467 
1468 	/* Create the new framebuffer depending one what we have */
1469 	if (vmw_user_object_surface(uo)) {
1470 		ret = vmw_kms_new_framebuffer_surface(dev_priv, uo, &vfb,
1471 						      mode_cmd);
1472 	} else if (uo->buffer) {
1473 		ret = vmw_kms_new_framebuffer_bo(dev_priv, uo->buffer, &vfb,
1474 						 mode_cmd);
1475 	} else {
1476 		BUG();
1477 	}
1478 
1479 	if (ret)
1480 		return ERR_PTR(ret);
1481 
1482 	return vfb;
1483 }
1484 
1485 /*
1486  * Generic Kernel modesetting functions
1487  */
1488 
vmw_kms_fb_create(struct drm_device * dev,struct drm_file * file_priv,const struct drm_mode_fb_cmd2 * mode_cmd)1489 static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
1490 						 struct drm_file *file_priv,
1491 						 const struct drm_mode_fb_cmd2 *mode_cmd)
1492 {
1493 	struct vmw_private *dev_priv = vmw_priv(dev);
1494 	struct vmw_framebuffer *vfb = NULL;
1495 	struct vmw_user_object uo = {0};
1496 	int ret;
1497 
1498 	/* returns either a bo or surface */
1499 	ret = vmw_user_object_lookup(dev_priv, file_priv, mode_cmd->handles[0],
1500 				     &uo);
1501 	if (ret) {
1502 		DRM_ERROR("Invalid buffer object handle %u (0x%x).\n",
1503 			  mode_cmd->handles[0], mode_cmd->handles[0]);
1504 		goto err_out;
1505 	}
1506 
1507 
1508 	if (vmw_user_object_surface(&uo) &&
1509 	    !vmw_kms_srf_ok(dev_priv, mode_cmd->width, mode_cmd->height)) {
1510 		DRM_ERROR("Surface size cannot exceed %dx%d\n",
1511 			dev_priv->texture_max_width,
1512 			dev_priv->texture_max_height);
1513 		ret = -EINVAL;
1514 		goto err_out;
1515 	}
1516 
1517 
1518 	vfb = vmw_kms_new_framebuffer(dev_priv, &uo, mode_cmd);
1519 	if (IS_ERR(vfb)) {
1520 		ret = PTR_ERR(vfb);
1521 		goto err_out;
1522 	}
1523 
1524 err_out:
1525 	/* vmw_user_object_lookup takes one ref so does new_fb */
1526 	vmw_user_object_unref(&uo);
1527 
1528 	if (ret) {
1529 		DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret);
1530 		return ERR_PTR(ret);
1531 	}
1532 
1533 	return &vfb->base;
1534 }
1535 
1536 /**
1537  * vmw_kms_check_display_memory - Validates display memory required for a
1538  * topology
1539  * @dev: DRM device
1540  * @num_rects: number of drm_rect in rects
1541  * @rects: array of drm_rect representing the topology to validate indexed by
1542  * crtc index.
1543  *
1544  * Returns:
1545  * 0 on success otherwise negative error code
1546  */
vmw_kms_check_display_memory(struct drm_device * dev,uint32_t num_rects,struct drm_rect * rects)1547 static int vmw_kms_check_display_memory(struct drm_device *dev,
1548 					uint32_t num_rects,
1549 					struct drm_rect *rects)
1550 {
1551 	struct vmw_private *dev_priv = vmw_priv(dev);
1552 	struct drm_rect bounding_box = {0};
1553 	u64 total_pixels = 0, pixel_mem, bb_mem;
1554 	int i;
1555 
1556 	for (i = 0; i < num_rects; i++) {
1557 		/*
1558 		 * For STDU only individual screen (screen target) is limited by
1559 		 * SCREENTARGET_MAX_WIDTH/HEIGHT registers.
1560 		 */
1561 		if (dev_priv->active_display_unit == vmw_du_screen_target &&
1562 		    (drm_rect_width(&rects[i]) > dev_priv->stdu_max_width ||
1563 		     drm_rect_height(&rects[i]) > dev_priv->stdu_max_height)) {
1564 			VMW_DEBUG_KMS("Screen size not supported.\n");
1565 			return -EINVAL;
1566 		}
1567 
1568 		/* Bounding box upper left is at (0,0). */
1569 		if (rects[i].x2 > bounding_box.x2)
1570 			bounding_box.x2 = rects[i].x2;
1571 
1572 		if (rects[i].y2 > bounding_box.y2)
1573 			bounding_box.y2 = rects[i].y2;
1574 
1575 		total_pixels += (u64) drm_rect_width(&rects[i]) *
1576 			(u64) drm_rect_height(&rects[i]);
1577 	}
1578 
1579 	/* Virtual svga device primary limits are always in 32-bpp. */
1580 	pixel_mem = total_pixels * 4;
1581 
1582 	/*
1583 	 * For HV10 and below prim_bb_mem is vram size. When
1584 	 * SVGA_REG_MAX_PRIMARY_BOUNDING_BOX_MEM is not present vram size is
1585 	 * limit on primary bounding box
1586 	 */
1587 	if (pixel_mem > dev_priv->max_primary_mem) {
1588 		VMW_DEBUG_KMS("Combined output size too large.\n");
1589 		return -EINVAL;
1590 	}
1591 
1592 	/* SVGA_CAP_NO_BB_RESTRICTION is available for STDU only. */
1593 	if (dev_priv->active_display_unit != vmw_du_screen_target ||
1594 	    !(dev_priv->capabilities & SVGA_CAP_NO_BB_RESTRICTION)) {
1595 		bb_mem = (u64) bounding_box.x2 * bounding_box.y2 * 4;
1596 
1597 		if (bb_mem > dev_priv->max_primary_mem) {
1598 			VMW_DEBUG_KMS("Topology is beyond supported limits.\n");
1599 			return -EINVAL;
1600 		}
1601 	}
1602 
1603 	return 0;
1604 }
1605 
1606 /**
1607  * vmw_crtc_state_and_lock - Return new or current crtc state with locked
1608  * crtc mutex
1609  * @state: The atomic state pointer containing the new atomic state
1610  * @crtc: The crtc
1611  *
1612  * This function returns the new crtc state if it's part of the state update.
1613  * Otherwise returns the current crtc state. It also makes sure that the
1614  * crtc mutex is locked.
1615  *
1616  * Returns: A valid crtc state pointer or NULL. It may also return a
1617  * pointer error, in particular -EDEADLK if locking needs to be rerun.
1618  */
1619 static struct drm_crtc_state *
vmw_crtc_state_and_lock(struct drm_atomic_state * state,struct drm_crtc * crtc)1620 vmw_crtc_state_and_lock(struct drm_atomic_state *state, struct drm_crtc *crtc)
1621 {
1622 	struct drm_crtc_state *crtc_state;
1623 
1624 	crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
1625 	if (crtc_state) {
1626 		lockdep_assert_held(&crtc->mutex.mutex.base);
1627 	} else {
1628 		int ret = drm_modeset_lock(&crtc->mutex, state->acquire_ctx);
1629 
1630 		if (ret != 0 && ret != -EALREADY)
1631 			return ERR_PTR(ret);
1632 
1633 		crtc_state = crtc->state;
1634 	}
1635 
1636 	return crtc_state;
1637 }
1638 
1639 /**
1640  * vmw_kms_check_implicit - Verify that all implicit display units scan out
1641  * from the same fb after the new state is committed.
1642  * @dev: The drm_device.
1643  * @state: The new state to be checked.
1644  *
1645  * Returns:
1646  *   Zero on success,
1647  *   -EINVAL on invalid state,
1648  *   -EDEADLK if modeset locking needs to be rerun.
1649  */
vmw_kms_check_implicit(struct drm_device * dev,struct drm_atomic_state * state)1650 static int vmw_kms_check_implicit(struct drm_device *dev,
1651 				  struct drm_atomic_state *state)
1652 {
1653 	struct drm_framebuffer *implicit_fb = NULL;
1654 	struct drm_crtc *crtc;
1655 	struct drm_crtc_state *crtc_state;
1656 	struct drm_plane_state *plane_state;
1657 
1658 	drm_for_each_crtc(crtc, dev) {
1659 		struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
1660 
1661 		if (!du->is_implicit)
1662 			continue;
1663 
1664 		crtc_state = vmw_crtc_state_and_lock(state, crtc);
1665 		if (IS_ERR(crtc_state))
1666 			return PTR_ERR(crtc_state);
1667 
1668 		if (!crtc_state || !crtc_state->enable)
1669 			continue;
1670 
1671 		/*
1672 		 * Can't move primary planes across crtcs, so this is OK.
1673 		 * It also means we don't need to take the plane mutex.
1674 		 */
1675 		plane_state = du->primary.state;
1676 		if (plane_state->crtc != crtc)
1677 			continue;
1678 
1679 		if (!implicit_fb)
1680 			implicit_fb = plane_state->fb;
1681 		else if (implicit_fb != plane_state->fb)
1682 			return -EINVAL;
1683 	}
1684 
1685 	return 0;
1686 }
1687 
1688 /**
1689  * vmw_kms_check_topology - Validates topology in drm_atomic_state
1690  * @dev: DRM device
1691  * @state: the driver state object
1692  *
1693  * Returns:
1694  * 0 on success otherwise negative error code
1695  */
vmw_kms_check_topology(struct drm_device * dev,struct drm_atomic_state * state)1696 static int vmw_kms_check_topology(struct drm_device *dev,
1697 				  struct drm_atomic_state *state)
1698 {
1699 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
1700 	struct drm_rect *rects;
1701 	struct drm_crtc *crtc;
1702 	uint32_t i;
1703 	int ret = 0;
1704 
1705 	rects = kcalloc(dev->mode_config.num_crtc, sizeof(struct drm_rect),
1706 			GFP_KERNEL);
1707 	if (!rects)
1708 		return -ENOMEM;
1709 
1710 	drm_for_each_crtc(crtc, dev) {
1711 		struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
1712 		struct drm_crtc_state *crtc_state;
1713 
1714 		i = drm_crtc_index(crtc);
1715 
1716 		crtc_state = vmw_crtc_state_and_lock(state, crtc);
1717 		if (IS_ERR(crtc_state)) {
1718 			ret = PTR_ERR(crtc_state);
1719 			goto clean;
1720 		}
1721 
1722 		if (!crtc_state)
1723 			continue;
1724 
1725 		if (crtc_state->enable) {
1726 			rects[i].x1 = du->gui_x;
1727 			rects[i].y1 = du->gui_y;
1728 			rects[i].x2 = du->gui_x + crtc_state->mode.hdisplay;
1729 			rects[i].y2 = du->gui_y + crtc_state->mode.vdisplay;
1730 		} else {
1731 			rects[i].x1 = 0;
1732 			rects[i].y1 = 0;
1733 			rects[i].x2 = 0;
1734 			rects[i].y2 = 0;
1735 		}
1736 	}
1737 
1738 	/* Determine change to topology due to new atomic state */
1739 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
1740 				      new_crtc_state, i) {
1741 		struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
1742 		struct drm_connector *connector;
1743 		struct drm_connector_state *conn_state;
1744 		struct vmw_connector_state *vmw_conn_state;
1745 
1746 		if (!du->pref_active && new_crtc_state->enable) {
1747 			VMW_DEBUG_KMS("Enabling a disabled display unit\n");
1748 			ret = -EINVAL;
1749 			goto clean;
1750 		}
1751 
1752 		/*
1753 		 * For vmwgfx each crtc has only one connector attached and it
1754 		 * is not changed so don't really need to check the
1755 		 * crtc->connector_mask and iterate over it.
1756 		 */
1757 		connector = &du->connector;
1758 		conn_state = drm_atomic_get_connector_state(state, connector);
1759 		if (IS_ERR(conn_state)) {
1760 			ret = PTR_ERR(conn_state);
1761 			goto clean;
1762 		}
1763 
1764 		vmw_conn_state = vmw_connector_state_to_vcs(conn_state);
1765 		vmw_conn_state->gui_x = du->gui_x;
1766 		vmw_conn_state->gui_y = du->gui_y;
1767 	}
1768 
1769 	ret = vmw_kms_check_display_memory(dev, dev->mode_config.num_crtc,
1770 					   rects);
1771 
1772 clean:
1773 	kfree(rects);
1774 	return ret;
1775 }
1776 
1777 /**
1778  * vmw_kms_atomic_check_modeset- validate state object for modeset changes
1779  *
1780  * @dev: DRM device
1781  * @state: the driver state object
1782  *
1783  * This is a simple wrapper around drm_atomic_helper_check_modeset() for
1784  * us to assign a value to mode->crtc_clock so that
1785  * drm_calc_timestamping_constants() won't throw an error message
1786  *
1787  * Returns:
1788  * Zero for success or -errno
1789  */
1790 static int
vmw_kms_atomic_check_modeset(struct drm_device * dev,struct drm_atomic_state * state)1791 vmw_kms_atomic_check_modeset(struct drm_device *dev,
1792 			     struct drm_atomic_state *state)
1793 {
1794 	struct drm_crtc *crtc;
1795 	struct drm_crtc_state *crtc_state;
1796 	bool need_modeset = false;
1797 	int i, ret;
1798 
1799 	ret = drm_atomic_helper_check(dev, state);
1800 	if (ret)
1801 		return ret;
1802 
1803 	ret = vmw_kms_check_implicit(dev, state);
1804 	if (ret) {
1805 		VMW_DEBUG_KMS("Invalid implicit state\n");
1806 		return ret;
1807 	}
1808 
1809 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1810 		if (drm_atomic_crtc_needs_modeset(crtc_state))
1811 			need_modeset = true;
1812 	}
1813 
1814 	if (need_modeset)
1815 		return vmw_kms_check_topology(dev, state);
1816 
1817 	return ret;
1818 }
1819 
1820 static const struct drm_mode_config_funcs vmw_kms_funcs = {
1821 	.fb_create = vmw_kms_fb_create,
1822 	.atomic_check = vmw_kms_atomic_check_modeset,
1823 	.atomic_commit = drm_atomic_helper_commit,
1824 };
1825 
vmw_kms_generic_present(struct vmw_private * dev_priv,struct drm_file * file_priv,struct vmw_framebuffer * vfb,struct vmw_surface * surface,uint32_t sid,int32_t destX,int32_t destY,struct drm_vmw_rect * clips,uint32_t num_clips)1826 static int vmw_kms_generic_present(struct vmw_private *dev_priv,
1827 				   struct drm_file *file_priv,
1828 				   struct vmw_framebuffer *vfb,
1829 				   struct vmw_surface *surface,
1830 				   uint32_t sid,
1831 				   int32_t destX, int32_t destY,
1832 				   struct drm_vmw_rect *clips,
1833 				   uint32_t num_clips)
1834 {
1835 	return vmw_kms_sou_do_surface_dirty(dev_priv, vfb, NULL, clips,
1836 					    &surface->res, destX, destY,
1837 					    num_clips, 1, NULL, NULL);
1838 }
1839 
1840 
vmw_kms_present(struct vmw_private * dev_priv,struct drm_file * file_priv,struct vmw_framebuffer * vfb,struct vmw_surface * surface,uint32_t sid,int32_t destX,int32_t destY,struct drm_vmw_rect * clips,uint32_t num_clips)1841 int vmw_kms_present(struct vmw_private *dev_priv,
1842 		    struct drm_file *file_priv,
1843 		    struct vmw_framebuffer *vfb,
1844 		    struct vmw_surface *surface,
1845 		    uint32_t sid,
1846 		    int32_t destX, int32_t destY,
1847 		    struct drm_vmw_rect *clips,
1848 		    uint32_t num_clips)
1849 {
1850 	int ret;
1851 
1852 	switch (dev_priv->active_display_unit) {
1853 	case vmw_du_screen_target:
1854 		ret = vmw_kms_stdu_surface_dirty(dev_priv, vfb, NULL, clips,
1855 						 &surface->res, destX, destY,
1856 						 num_clips, 1, NULL, NULL);
1857 		break;
1858 	case vmw_du_screen_object:
1859 		ret = vmw_kms_generic_present(dev_priv, file_priv, vfb, surface,
1860 					      sid, destX, destY, clips,
1861 					      num_clips);
1862 		break;
1863 	default:
1864 		WARN_ONCE(true,
1865 			  "Present called with invalid display system.\n");
1866 		ret = -ENOSYS;
1867 		break;
1868 	}
1869 	if (ret)
1870 		return ret;
1871 
1872 	vmw_cmd_flush(dev_priv, false);
1873 
1874 	return 0;
1875 }
1876 
1877 static void
vmw_kms_create_hotplug_mode_update_property(struct vmw_private * dev_priv)1878 vmw_kms_create_hotplug_mode_update_property(struct vmw_private *dev_priv)
1879 {
1880 	if (dev_priv->hotplug_mode_update_property)
1881 		return;
1882 
1883 	dev_priv->hotplug_mode_update_property =
1884 		drm_property_create_range(&dev_priv->drm,
1885 					  DRM_MODE_PROP_IMMUTABLE,
1886 					  "hotplug_mode_update", 0, 1);
1887 }
1888 
1889 static void
vmw_atomic_commit_tail(struct drm_atomic_state * old_state)1890 vmw_atomic_commit_tail(struct drm_atomic_state *old_state)
1891 {
1892 	struct vmw_private *vmw = vmw_priv(old_state->dev);
1893 	struct drm_crtc *crtc;
1894 	struct drm_crtc_state *old_crtc_state;
1895 	int i;
1896 
1897 	drm_atomic_helper_commit_tail(old_state);
1898 
1899 	if (vmw->vkms_enabled) {
1900 		for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1901 			struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
1902 			(void)old_crtc_state;
1903 			flush_work(&du->vkms.crc_generator_work);
1904 		}
1905 	}
1906 }
1907 
1908 static const struct drm_mode_config_helper_funcs vmw_mode_config_helpers = {
1909 	.atomic_commit_tail = vmw_atomic_commit_tail,
1910 };
1911 
vmw_kms_init(struct vmw_private * dev_priv)1912 int vmw_kms_init(struct vmw_private *dev_priv)
1913 {
1914 	struct drm_device *dev = &dev_priv->drm;
1915 	int ret;
1916 	static const char *display_unit_names[] = {
1917 		"Invalid",
1918 		"Legacy",
1919 		"Screen Object",
1920 		"Screen Target",
1921 		"Invalid (max)"
1922 	};
1923 
1924 	drm_mode_config_init(dev);
1925 	dev->mode_config.funcs = &vmw_kms_funcs;
1926 	dev->mode_config.min_width = 1;
1927 	dev->mode_config.min_height = 1;
1928 	dev->mode_config.max_width = dev_priv->texture_max_width;
1929 	dev->mode_config.max_height = dev_priv->texture_max_height;
1930 	dev->mode_config.preferred_depth = dev_priv->assume_16bpp ? 16 : 32;
1931 	dev->mode_config.helper_private = &vmw_mode_config_helpers;
1932 
1933 	drm_mode_create_suggested_offset_properties(dev);
1934 	vmw_kms_create_hotplug_mode_update_property(dev_priv);
1935 
1936 	ret = vmw_kms_stdu_init_display(dev_priv);
1937 	if (ret) {
1938 		ret = vmw_kms_sou_init_display(dev_priv);
1939 		if (ret) /* Fallback */
1940 			ret = vmw_kms_ldu_init_display(dev_priv);
1941 	}
1942 	BUILD_BUG_ON(ARRAY_SIZE(display_unit_names) != (vmw_du_max + 1));
1943 	drm_info(&dev_priv->drm, "%s display unit initialized\n",
1944 		 display_unit_names[dev_priv->active_display_unit]);
1945 
1946 	return ret;
1947 }
1948 
vmw_kms_close(struct vmw_private * dev_priv)1949 int vmw_kms_close(struct vmw_private *dev_priv)
1950 {
1951 	int ret = 0;
1952 
1953 	/*
1954 	 * Docs says we should take the lock before calling this function
1955 	 * but since it destroys encoders and our destructor calls
1956 	 * drm_encoder_cleanup which takes the lock we deadlock.
1957 	 */
1958 	drm_mode_config_cleanup(&dev_priv->drm);
1959 	if (dev_priv->active_display_unit == vmw_du_legacy)
1960 		ret = vmw_kms_ldu_close_display(dev_priv);
1961 
1962 	return ret;
1963 }
1964 
vmw_kms_cursor_bypass_ioctl(struct drm_device * dev,void * data,struct drm_file * file_priv)1965 int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data,
1966 				struct drm_file *file_priv)
1967 {
1968 	struct drm_vmw_cursor_bypass_arg *arg = data;
1969 	struct vmw_display_unit *du;
1970 	struct drm_crtc *crtc;
1971 	int ret = 0;
1972 
1973 	mutex_lock(&dev->mode_config.mutex);
1974 	if (arg->flags & DRM_VMW_CURSOR_BYPASS_ALL) {
1975 
1976 		list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1977 			du = vmw_crtc_to_du(crtc);
1978 			du->hotspot_x = arg->xhot;
1979 			du->hotspot_y = arg->yhot;
1980 		}
1981 
1982 		mutex_unlock(&dev->mode_config.mutex);
1983 		return 0;
1984 	}
1985 
1986 	crtc = drm_crtc_find(dev, file_priv, arg->crtc_id);
1987 	if (!crtc) {
1988 		ret = -ENOENT;
1989 		goto out;
1990 	}
1991 
1992 	du = vmw_crtc_to_du(crtc);
1993 
1994 	du->hotspot_x = arg->xhot;
1995 	du->hotspot_y = arg->yhot;
1996 
1997 out:
1998 	mutex_unlock(&dev->mode_config.mutex);
1999 
2000 	return ret;
2001 }
2002 
vmw_kms_write_svga(struct vmw_private * vmw_priv,unsigned width,unsigned height,unsigned pitch,unsigned bpp,unsigned depth)2003 int vmw_kms_write_svga(struct vmw_private *vmw_priv,
2004 			unsigned width, unsigned height, unsigned pitch,
2005 			unsigned bpp, unsigned depth)
2006 {
2007 	if (vmw_priv->capabilities & SVGA_CAP_PITCHLOCK)
2008 		vmw_write(vmw_priv, SVGA_REG_PITCHLOCK, pitch);
2009 	else if (vmw_fifo_have_pitchlock(vmw_priv))
2010 		vmw_fifo_mem_write(vmw_priv, SVGA_FIFO_PITCHLOCK, pitch);
2011 	vmw_write(vmw_priv, SVGA_REG_WIDTH, width);
2012 	vmw_write(vmw_priv, SVGA_REG_HEIGHT, height);
2013 	if ((vmw_priv->capabilities & SVGA_CAP_8BIT_EMULATION) != 0)
2014 		vmw_write(vmw_priv, SVGA_REG_BITS_PER_PIXEL, bpp);
2015 
2016 	if (vmw_read(vmw_priv, SVGA_REG_DEPTH) != depth) {
2017 		DRM_ERROR("Invalid depth %u for %u bpp, host expects %u\n",
2018 			  depth, bpp, vmw_read(vmw_priv, SVGA_REG_DEPTH));
2019 		return -EINVAL;
2020 	}
2021 
2022 	return 0;
2023 }
2024 
2025 static
vmw_kms_validate_mode_vram(struct vmw_private * dev_priv,u64 pitch,u64 height)2026 bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
2027 				u64 pitch,
2028 				u64 height)
2029 {
2030 	return (pitch * height) < (u64)dev_priv->vram_size;
2031 }
2032 
2033 /**
2034  * vmw_du_update_layout - Update the display unit with topology from resolution
2035  * plugin and generate DRM uevent
2036  * @dev_priv: device private
2037  * @num_rects: number of drm_rect in rects
2038  * @rects: toplogy to update
2039  */
vmw_du_update_layout(struct vmw_private * dev_priv,unsigned int num_rects,struct drm_rect * rects)2040 static int vmw_du_update_layout(struct vmw_private *dev_priv,
2041 				unsigned int num_rects, struct drm_rect *rects)
2042 {
2043 	struct drm_device *dev = &dev_priv->drm;
2044 	struct vmw_display_unit *du;
2045 	struct drm_connector *con;
2046 	struct drm_connector_list_iter conn_iter;
2047 	struct drm_modeset_acquire_ctx ctx;
2048 	struct drm_crtc *crtc;
2049 	int ret;
2050 
2051 	/* Currently gui_x/y is protected with the crtc mutex */
2052 	mutex_lock(&dev->mode_config.mutex);
2053 	drm_modeset_acquire_init(&ctx, 0);
2054 retry:
2055 	drm_for_each_crtc(crtc, dev) {
2056 		ret = drm_modeset_lock(&crtc->mutex, &ctx);
2057 		if (ret < 0) {
2058 			if (ret == -EDEADLK) {
2059 				drm_modeset_backoff(&ctx);
2060 				goto retry;
2061 		}
2062 			goto out_fini;
2063 		}
2064 	}
2065 
2066 	drm_connector_list_iter_begin(dev, &conn_iter);
2067 	drm_for_each_connector_iter(con, &conn_iter) {
2068 		du = vmw_connector_to_du(con);
2069 		if (num_rects > du->unit) {
2070 			du->pref_width = drm_rect_width(&rects[du->unit]);
2071 			du->pref_height = drm_rect_height(&rects[du->unit]);
2072 			du->pref_active = true;
2073 			du->gui_x = rects[du->unit].x1;
2074 			du->gui_y = rects[du->unit].y1;
2075 		} else {
2076 			du->pref_width  = VMWGFX_MIN_INITIAL_WIDTH;
2077 			du->pref_height = VMWGFX_MIN_INITIAL_HEIGHT;
2078 			du->pref_active = false;
2079 			du->gui_x = 0;
2080 			du->gui_y = 0;
2081 		}
2082 	}
2083 	drm_connector_list_iter_end(&conn_iter);
2084 
2085 	list_for_each_entry(con, &dev->mode_config.connector_list, head) {
2086 		du = vmw_connector_to_du(con);
2087 		if (num_rects > du->unit) {
2088 			drm_object_property_set_value
2089 			  (&con->base, dev->mode_config.suggested_x_property,
2090 			   du->gui_x);
2091 			drm_object_property_set_value
2092 			  (&con->base, dev->mode_config.suggested_y_property,
2093 			   du->gui_y);
2094 		} else {
2095 			drm_object_property_set_value
2096 			  (&con->base, dev->mode_config.suggested_x_property,
2097 			   0);
2098 			drm_object_property_set_value
2099 			  (&con->base, dev->mode_config.suggested_y_property,
2100 			   0);
2101 		}
2102 		con->status = vmw_du_connector_detect(con, true);
2103 	}
2104 out_fini:
2105 	drm_modeset_drop_locks(&ctx);
2106 	drm_modeset_acquire_fini(&ctx);
2107 	mutex_unlock(&dev->mode_config.mutex);
2108 
2109 	drm_sysfs_hotplug_event(dev);
2110 
2111 	return 0;
2112 }
2113 
vmw_du_crtc_gamma_set(struct drm_crtc * crtc,u16 * r,u16 * g,u16 * b,uint32_t size,struct drm_modeset_acquire_ctx * ctx)2114 int vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
2115 			  u16 *r, u16 *g, u16 *b,
2116 			  uint32_t size,
2117 			  struct drm_modeset_acquire_ctx *ctx)
2118 {
2119 	struct vmw_private *dev_priv = vmw_priv(crtc->dev);
2120 	int i;
2121 
2122 	for (i = 0; i < size; i++) {
2123 		DRM_DEBUG("%d r/g/b = 0x%04x / 0x%04x / 0x%04x\n", i,
2124 			  r[i], g[i], b[i]);
2125 		vmw_write(dev_priv, SVGA_PALETTE_BASE + i * 3 + 0, r[i] >> 8);
2126 		vmw_write(dev_priv, SVGA_PALETTE_BASE + i * 3 + 1, g[i] >> 8);
2127 		vmw_write(dev_priv, SVGA_PALETTE_BASE + i * 3 + 2, b[i] >> 8);
2128 	}
2129 
2130 	return 0;
2131 }
2132 
vmw_du_connector_dpms(struct drm_connector * connector,int mode)2133 int vmw_du_connector_dpms(struct drm_connector *connector, int mode)
2134 {
2135 	return 0;
2136 }
2137 
2138 enum drm_connector_status
vmw_du_connector_detect(struct drm_connector * connector,bool force)2139 vmw_du_connector_detect(struct drm_connector *connector, bool force)
2140 {
2141 	uint32_t num_displays;
2142 	struct drm_device *dev = connector->dev;
2143 	struct vmw_private *dev_priv = vmw_priv(dev);
2144 	struct vmw_display_unit *du = vmw_connector_to_du(connector);
2145 
2146 	num_displays = vmw_read(dev_priv, SVGA_REG_NUM_DISPLAYS);
2147 
2148 	return ((vmw_connector_to_du(connector)->unit < num_displays &&
2149 		 du->pref_active) ?
2150 		connector_status_connected : connector_status_disconnected);
2151 }
2152 
2153 /**
2154  * vmw_guess_mode_timing - Provide fake timings for a
2155  * 60Hz vrefresh mode.
2156  *
2157  * @mode: Pointer to a struct drm_display_mode with hdisplay and vdisplay
2158  * members filled in.
2159  */
vmw_guess_mode_timing(struct drm_display_mode * mode)2160 void vmw_guess_mode_timing(struct drm_display_mode *mode)
2161 {
2162 	mode->hsync_start = mode->hdisplay + 50;
2163 	mode->hsync_end = mode->hsync_start + 50;
2164 	mode->htotal = mode->hsync_end + 50;
2165 
2166 	mode->vsync_start = mode->vdisplay + 50;
2167 	mode->vsync_end = mode->vsync_start + 50;
2168 	mode->vtotal = mode->vsync_end + 50;
2169 
2170 	mode->clock = (u32)mode->htotal * (u32)mode->vtotal / 100 * 6;
2171 }
2172 
2173 
2174 /**
2175  * vmw_kms_update_layout_ioctl - Handler for DRM_VMW_UPDATE_LAYOUT ioctl
2176  * @dev: drm device for the ioctl
2177  * @data: data pointer for the ioctl
2178  * @file_priv: drm file for the ioctl call
2179  *
2180  * Update preferred topology of display unit as per ioctl request. The topology
2181  * is expressed as array of drm_vmw_rect.
2182  * e.g.
2183  * [0 0 640 480] [640 0 800 600] [0 480 640 480]
2184  *
2185  * NOTE:
2186  * The x and y offset (upper left) in drm_vmw_rect cannot be less than 0. Beside
2187  * device limit on topology, x + w and y + h (lower right) cannot be greater
2188  * than INT_MAX. So topology beyond these limits will return with error.
2189  *
2190  * Returns:
2191  * Zero on success, negative errno on failure.
2192  */
vmw_kms_update_layout_ioctl(struct drm_device * dev,void * data,struct drm_file * file_priv)2193 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
2194 				struct drm_file *file_priv)
2195 {
2196 	struct vmw_private *dev_priv = vmw_priv(dev);
2197 	struct drm_mode_config *mode_config = &dev->mode_config;
2198 	struct drm_vmw_update_layout_arg *arg =
2199 		(struct drm_vmw_update_layout_arg *)data;
2200 	const void __user *user_rects;
2201 	struct drm_vmw_rect *rects;
2202 	struct drm_rect *drm_rects;
2203 	unsigned rects_size;
2204 	int ret, i;
2205 
2206 	if (!arg->num_outputs) {
2207 		struct drm_rect def_rect = {0, 0,
2208 					    VMWGFX_MIN_INITIAL_WIDTH,
2209 					    VMWGFX_MIN_INITIAL_HEIGHT};
2210 		vmw_du_update_layout(dev_priv, 1, &def_rect);
2211 		return 0;
2212 	} else if (arg->num_outputs > VMWGFX_NUM_DISPLAY_UNITS) {
2213 		return -E2BIG;
2214 	}
2215 
2216 	rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect);
2217 	rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect),
2218 			GFP_KERNEL);
2219 	if (unlikely(!rects))
2220 		return -ENOMEM;
2221 
2222 	user_rects = (void __user *)(unsigned long)arg->rects;
2223 	ret = copy_from_user(rects, user_rects, rects_size);
2224 	if (unlikely(ret != 0)) {
2225 		DRM_ERROR("Failed to get rects.\n");
2226 		ret = -EFAULT;
2227 		goto out_free;
2228 	}
2229 
2230 	drm_rects = (struct drm_rect *)rects;
2231 
2232 	VMW_DEBUG_KMS("Layout count = %u\n", arg->num_outputs);
2233 	for (i = 0; i < arg->num_outputs; i++) {
2234 		struct drm_vmw_rect curr_rect;
2235 
2236 		/* Verify user-space for overflow as kernel use drm_rect */
2237 		if ((rects[i].x + rects[i].w > INT_MAX) ||
2238 		    (rects[i].y + rects[i].h > INT_MAX)) {
2239 			ret = -ERANGE;
2240 			goto out_free;
2241 		}
2242 
2243 		curr_rect = rects[i];
2244 		drm_rects[i].x1 = curr_rect.x;
2245 		drm_rects[i].y1 = curr_rect.y;
2246 		drm_rects[i].x2 = curr_rect.x + curr_rect.w;
2247 		drm_rects[i].y2 = curr_rect.y + curr_rect.h;
2248 
2249 		VMW_DEBUG_KMS("  x1 = %d y1 = %d x2 = %d y2 = %d\n",
2250 			      drm_rects[i].x1, drm_rects[i].y1,
2251 			      drm_rects[i].x2, drm_rects[i].y2);
2252 
2253 		/*
2254 		 * Currently this check is limiting the topology within
2255 		 * mode_config->max (which actually is max texture size
2256 		 * supported by virtual device). This limit is here to address
2257 		 * window managers that create a big framebuffer for whole
2258 		 * topology.
2259 		 */
2260 		if (drm_rects[i].x1 < 0 ||  drm_rects[i].y1 < 0 ||
2261 		    drm_rects[i].x2 > mode_config->max_width ||
2262 		    drm_rects[i].y2 > mode_config->max_height) {
2263 			VMW_DEBUG_KMS("Invalid layout %d %d %d %d\n",
2264 				      drm_rects[i].x1, drm_rects[i].y1,
2265 				      drm_rects[i].x2, drm_rects[i].y2);
2266 			ret = -EINVAL;
2267 			goto out_free;
2268 		}
2269 	}
2270 
2271 	ret = vmw_kms_check_display_memory(dev, arg->num_outputs, drm_rects);
2272 
2273 	if (ret == 0)
2274 		vmw_du_update_layout(dev_priv, arg->num_outputs, drm_rects);
2275 
2276 out_free:
2277 	kfree(rects);
2278 	return ret;
2279 }
2280 
2281 /**
2282  * vmw_kms_helper_dirty - Helper to build commands and perform actions based
2283  * on a set of cliprects and a set of display units.
2284  *
2285  * @dev_priv: Pointer to a device private structure.
2286  * @framebuffer: Pointer to the framebuffer on which to perform the actions.
2287  * @clips: A set of struct drm_clip_rect. Either this os @vclips must be NULL.
2288  * Cliprects are given in framebuffer coordinates.
2289  * @vclips: A set of struct drm_vmw_rect cliprects. Either this or @clips must
2290  * be NULL. Cliprects are given in source coordinates.
2291  * @dest_x: X coordinate offset for the crtc / destination clip rects.
2292  * @dest_y: Y coordinate offset for the crtc / destination clip rects.
2293  * @num_clips: Number of cliprects in the @clips or @vclips array.
2294  * @increment: Integer with which to increment the clip counter when looping.
2295  * Used to skip a predetermined number of clip rects.
2296  * @dirty: Closure structure. See the description of struct vmw_kms_dirty.
2297  */
vmw_kms_helper_dirty(struct vmw_private * dev_priv,struct vmw_framebuffer * framebuffer,const struct drm_clip_rect * clips,const struct drm_vmw_rect * vclips,s32 dest_x,s32 dest_y,int num_clips,int increment,struct vmw_kms_dirty * dirty)2298 int vmw_kms_helper_dirty(struct vmw_private *dev_priv,
2299 			 struct vmw_framebuffer *framebuffer,
2300 			 const struct drm_clip_rect *clips,
2301 			 const struct drm_vmw_rect *vclips,
2302 			 s32 dest_x, s32 dest_y,
2303 			 int num_clips,
2304 			 int increment,
2305 			 struct vmw_kms_dirty *dirty)
2306 {
2307 	struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS];
2308 	struct drm_crtc *crtc;
2309 	u32 num_units = 0;
2310 	u32 i, k;
2311 
2312 	dirty->dev_priv = dev_priv;
2313 
2314 	/* If crtc is passed, no need to iterate over other display units */
2315 	if (dirty->crtc) {
2316 		units[num_units++] = vmw_crtc_to_du(dirty->crtc);
2317 	} else {
2318 		list_for_each_entry(crtc, &dev_priv->drm.mode_config.crtc_list,
2319 				    head) {
2320 			struct drm_plane *plane = crtc->primary;
2321 
2322 			if (plane->state->fb == &framebuffer->base)
2323 				units[num_units++] = vmw_crtc_to_du(crtc);
2324 		}
2325 	}
2326 
2327 	for (k = 0; k < num_units; k++) {
2328 		struct vmw_display_unit *unit = units[k];
2329 		s32 crtc_x = unit->crtc.x;
2330 		s32 crtc_y = unit->crtc.y;
2331 		s32 crtc_width = unit->crtc.mode.hdisplay;
2332 		s32 crtc_height = unit->crtc.mode.vdisplay;
2333 		const struct drm_clip_rect *clips_ptr = clips;
2334 		const struct drm_vmw_rect *vclips_ptr = vclips;
2335 
2336 		dirty->unit = unit;
2337 		if (dirty->fifo_reserve_size > 0) {
2338 			dirty->cmd = VMW_CMD_RESERVE(dev_priv,
2339 						      dirty->fifo_reserve_size);
2340 			if (!dirty->cmd)
2341 				return -ENOMEM;
2342 
2343 			memset(dirty->cmd, 0, dirty->fifo_reserve_size);
2344 		}
2345 		dirty->num_hits = 0;
2346 		for (i = 0; i < num_clips; i++, clips_ptr += increment,
2347 		       vclips_ptr += increment) {
2348 			s32 clip_left;
2349 			s32 clip_top;
2350 
2351 			/*
2352 			 * Select clip array type. Note that integer type
2353 			 * in @clips is unsigned short, whereas in @vclips
2354 			 * it's 32-bit.
2355 			 */
2356 			if (clips) {
2357 				dirty->fb_x = (s32) clips_ptr->x1;
2358 				dirty->fb_y = (s32) clips_ptr->y1;
2359 				dirty->unit_x2 = (s32) clips_ptr->x2 + dest_x -
2360 					crtc_x;
2361 				dirty->unit_y2 = (s32) clips_ptr->y2 + dest_y -
2362 					crtc_y;
2363 			} else {
2364 				dirty->fb_x = vclips_ptr->x;
2365 				dirty->fb_y = vclips_ptr->y;
2366 				dirty->unit_x2 = dirty->fb_x + vclips_ptr->w +
2367 					dest_x - crtc_x;
2368 				dirty->unit_y2 = dirty->fb_y + vclips_ptr->h +
2369 					dest_y - crtc_y;
2370 			}
2371 
2372 			dirty->unit_x1 = dirty->fb_x + dest_x - crtc_x;
2373 			dirty->unit_y1 = dirty->fb_y + dest_y - crtc_y;
2374 
2375 			/* Skip this clip if it's outside the crtc region */
2376 			if (dirty->unit_x1 >= crtc_width ||
2377 			    dirty->unit_y1 >= crtc_height ||
2378 			    dirty->unit_x2 <= 0 || dirty->unit_y2 <= 0)
2379 				continue;
2380 
2381 			/* Clip right and bottom to crtc limits */
2382 			dirty->unit_x2 = min_t(s32, dirty->unit_x2,
2383 					       crtc_width);
2384 			dirty->unit_y2 = min_t(s32, dirty->unit_y2,
2385 					       crtc_height);
2386 
2387 			/* Clip left and top to crtc limits */
2388 			clip_left = min_t(s32, dirty->unit_x1, 0);
2389 			clip_top = min_t(s32, dirty->unit_y1, 0);
2390 			dirty->unit_x1 -= clip_left;
2391 			dirty->unit_y1 -= clip_top;
2392 			dirty->fb_x -= clip_left;
2393 			dirty->fb_y -= clip_top;
2394 
2395 			dirty->clip(dirty);
2396 		}
2397 
2398 		dirty->fifo_commit(dirty);
2399 	}
2400 
2401 	return 0;
2402 }
2403 
2404 /**
2405  * vmw_kms_helper_validation_finish - Helper for post KMS command submission
2406  * cleanup and fencing
2407  * @dev_priv: Pointer to the device-private struct
2408  * @file_priv: Pointer identifying the client when user-space fencing is used
2409  * @ctx: Pointer to the validation context
2410  * @out_fence: If non-NULL, returned refcounted fence-pointer
2411  * @user_fence_rep: If non-NULL, pointer to user-space address area
2412  * in which to copy user-space fence info
2413  */
vmw_kms_helper_validation_finish(struct vmw_private * dev_priv,struct drm_file * file_priv,struct vmw_validation_context * ctx,struct vmw_fence_obj ** out_fence,struct drm_vmw_fence_rep __user * user_fence_rep)2414 void vmw_kms_helper_validation_finish(struct vmw_private *dev_priv,
2415 				      struct drm_file *file_priv,
2416 				      struct vmw_validation_context *ctx,
2417 				      struct vmw_fence_obj **out_fence,
2418 				      struct drm_vmw_fence_rep __user *
2419 				      user_fence_rep)
2420 {
2421 	struct vmw_fence_obj *fence = NULL;
2422 	uint32_t handle = 0;
2423 	int ret = 0;
2424 
2425 	if (file_priv || user_fence_rep || vmw_validation_has_bos(ctx) ||
2426 	    out_fence)
2427 		ret = vmw_execbuf_fence_commands(file_priv, dev_priv, &fence,
2428 						 file_priv ? &handle : NULL);
2429 	vmw_validation_done(ctx, fence);
2430 	if (file_priv)
2431 		vmw_execbuf_copy_fence_user(dev_priv, vmw_fpriv(file_priv),
2432 					    ret, user_fence_rep, fence,
2433 					    handle, -1);
2434 	if (out_fence)
2435 		*out_fence = fence;
2436 	else
2437 		vmw_fence_obj_unreference(&fence);
2438 }
2439 
2440 /**
2441  * vmw_kms_create_implicit_placement_property - Set up the implicit placement
2442  * property.
2443  *
2444  * @dev_priv: Pointer to a device private struct.
2445  *
2446  * Sets up the implicit placement property unless it's already set up.
2447  */
2448 void
vmw_kms_create_implicit_placement_property(struct vmw_private * dev_priv)2449 vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv)
2450 {
2451 	if (dev_priv->implicit_placement_property)
2452 		return;
2453 
2454 	dev_priv->implicit_placement_property =
2455 		drm_property_create_range(&dev_priv->drm,
2456 					  DRM_MODE_PROP_IMMUTABLE,
2457 					  "implicit_placement", 0, 1);
2458 }
2459 
2460 /**
2461  * vmw_kms_suspend - Save modesetting state and turn modesetting off.
2462  *
2463  * @dev: Pointer to the drm device
2464  * Return: 0 on success. Negative error code on failure.
2465  */
vmw_kms_suspend(struct drm_device * dev)2466 int vmw_kms_suspend(struct drm_device *dev)
2467 {
2468 	struct vmw_private *dev_priv = vmw_priv(dev);
2469 
2470 	dev_priv->suspend_state = drm_atomic_helper_suspend(dev);
2471 	if (IS_ERR(dev_priv->suspend_state)) {
2472 		int ret = PTR_ERR(dev_priv->suspend_state);
2473 
2474 		DRM_ERROR("Failed kms suspend: %d\n", ret);
2475 		dev_priv->suspend_state = NULL;
2476 
2477 		return ret;
2478 	}
2479 
2480 	return 0;
2481 }
2482 
2483 
2484 /**
2485  * vmw_kms_resume - Re-enable modesetting and restore state
2486  *
2487  * @dev: Pointer to the drm device
2488  * Return: 0 on success. Negative error code on failure.
2489  *
2490  * State is resumed from a previous vmw_kms_suspend(). It's illegal
2491  * to call this function without a previous vmw_kms_suspend().
2492  */
vmw_kms_resume(struct drm_device * dev)2493 int vmw_kms_resume(struct drm_device *dev)
2494 {
2495 	struct vmw_private *dev_priv = vmw_priv(dev);
2496 	int ret;
2497 
2498 	if (WARN_ON(!dev_priv->suspend_state))
2499 		return 0;
2500 
2501 	ret = drm_atomic_helper_resume(dev, dev_priv->suspend_state);
2502 	dev_priv->suspend_state = NULL;
2503 
2504 	return ret;
2505 }
2506 
2507 /**
2508  * vmw_kms_lost_device - Notify kms that modesetting capabilities will be lost
2509  *
2510  * @dev: Pointer to the drm device
2511  */
vmw_kms_lost_device(struct drm_device * dev)2512 void vmw_kms_lost_device(struct drm_device *dev)
2513 {
2514 	drm_atomic_helper_shutdown(dev);
2515 }
2516 
2517 /**
2518  * vmw_du_helper_plane_update - Helper to do plane update on a display unit.
2519  * @update: The closure structure.
2520  *
2521  * Call this helper after setting callbacks in &vmw_du_update_plane to do plane
2522  * update on display unit.
2523  *
2524  * Return: 0 on success or a negative error code on failure.
2525  */
vmw_du_helper_plane_update(struct vmw_du_update_plane * update)2526 int vmw_du_helper_plane_update(struct vmw_du_update_plane *update)
2527 {
2528 	struct drm_plane_state *state = update->plane->state;
2529 	struct drm_plane_state *old_state = update->old_state;
2530 	struct drm_atomic_helper_damage_iter iter;
2531 	struct drm_rect clip;
2532 	struct drm_rect bb;
2533 	DECLARE_VAL_CONTEXT(val_ctx, NULL, 0);
2534 	uint32_t reserved_size = 0;
2535 	uint32_t submit_size = 0;
2536 	uint32_t curr_size = 0;
2537 	uint32_t num_hits = 0;
2538 	void *cmd_start;
2539 	char *cmd_next;
2540 	int ret;
2541 
2542 	/*
2543 	 * Iterate in advance to check if really need plane update and find the
2544 	 * number of clips that actually are in plane src for fifo allocation.
2545 	 */
2546 	drm_atomic_helper_damage_iter_init(&iter, old_state, state);
2547 	drm_atomic_for_each_plane_damage(&iter, &clip)
2548 		num_hits++;
2549 
2550 	if (num_hits == 0)
2551 		return 0;
2552 
2553 	if (update->vfb->bo) {
2554 		struct vmw_framebuffer_bo *vfbbo =
2555 			container_of(update->vfb, typeof(*vfbbo), base);
2556 
2557 		/*
2558 		 * For screen targets we want a mappable bo, for everything else we want
2559 		 * accelerated i.e. host backed (vram or gmr) bo. If the display unit
2560 		 * is not screen target then mob's shouldn't be available.
2561 		 */
2562 		if (update->dev_priv->active_display_unit == vmw_du_screen_target) {
2563 			vmw_bo_placement_set(vfbbo->buffer,
2564 					     VMW_BO_DOMAIN_SYS | VMW_BO_DOMAIN_MOB | VMW_BO_DOMAIN_GMR,
2565 					     VMW_BO_DOMAIN_SYS | VMW_BO_DOMAIN_MOB | VMW_BO_DOMAIN_GMR);
2566 		} else {
2567 			WARN_ON(update->dev_priv->has_mob);
2568 			vmw_bo_placement_set_default_accelerated(vfbbo->buffer);
2569 		}
2570 		ret = vmw_validation_add_bo(&val_ctx, vfbbo->buffer);
2571 	} else {
2572 		struct vmw_framebuffer_surface *vfbs =
2573 			container_of(update->vfb, typeof(*vfbs), base);
2574 		struct vmw_surface *surf = vmw_user_object_surface(&vfbs->uo);
2575 
2576 		ret = vmw_validation_add_resource(&val_ctx, &surf->res,
2577 						  0, VMW_RES_DIRTY_NONE, NULL,
2578 						  NULL);
2579 	}
2580 
2581 	if (ret)
2582 		return ret;
2583 
2584 	ret = vmw_validation_prepare(&val_ctx, update->mutex, update->intr);
2585 	if (ret)
2586 		goto out_unref;
2587 
2588 	reserved_size = update->calc_fifo_size(update, num_hits);
2589 	cmd_start = VMW_CMD_RESERVE(update->dev_priv, reserved_size);
2590 	if (!cmd_start) {
2591 		ret = -ENOMEM;
2592 		goto out_revert;
2593 	}
2594 
2595 	cmd_next = cmd_start;
2596 
2597 	if (update->post_prepare) {
2598 		curr_size = update->post_prepare(update, cmd_next);
2599 		cmd_next += curr_size;
2600 		submit_size += curr_size;
2601 	}
2602 
2603 	if (update->pre_clip) {
2604 		curr_size = update->pre_clip(update, cmd_next, num_hits);
2605 		cmd_next += curr_size;
2606 		submit_size += curr_size;
2607 	}
2608 
2609 	bb.x1 = INT_MAX;
2610 	bb.y1 = INT_MAX;
2611 	bb.x2 = INT_MIN;
2612 	bb.y2 = INT_MIN;
2613 
2614 	drm_atomic_helper_damage_iter_init(&iter, old_state, state);
2615 	drm_atomic_for_each_plane_damage(&iter, &clip) {
2616 		uint32_t fb_x = clip.x1;
2617 		uint32_t fb_y = clip.y1;
2618 
2619 		vmw_du_translate_to_crtc(state, &clip);
2620 		if (update->clip) {
2621 			curr_size = update->clip(update, cmd_next, &clip, fb_x,
2622 						 fb_y);
2623 			cmd_next += curr_size;
2624 			submit_size += curr_size;
2625 		}
2626 		bb.x1 = min_t(int, bb.x1, clip.x1);
2627 		bb.y1 = min_t(int, bb.y1, clip.y1);
2628 		bb.x2 = max_t(int, bb.x2, clip.x2);
2629 		bb.y2 = max_t(int, bb.y2, clip.y2);
2630 	}
2631 
2632 	curr_size = update->post_clip(update, cmd_next, &bb);
2633 	submit_size += curr_size;
2634 
2635 	if (reserved_size < submit_size)
2636 		submit_size = 0;
2637 
2638 	vmw_cmd_commit(update->dev_priv, submit_size);
2639 
2640 	vmw_kms_helper_validation_finish(update->dev_priv, NULL, &val_ctx,
2641 					 update->out_fence, NULL);
2642 	return ret;
2643 
2644 out_revert:
2645 	vmw_validation_revert(&val_ctx);
2646 
2647 out_unref:
2648 	vmw_validation_unref_lists(&val_ctx);
2649 	return ret;
2650 }
2651 
2652 /**
2653  * vmw_connector_mode_valid - implements drm_connector_helper_funcs.mode_valid callback
2654  *
2655  * @connector: the drm connector, part of a DU container
2656  * @mode: drm mode to check
2657  *
2658  * Returns MODE_OK on success, or a drm_mode_status error code.
2659  */
vmw_connector_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)2660 enum drm_mode_status vmw_connector_mode_valid(struct drm_connector *connector,
2661 					      struct drm_display_mode *mode)
2662 {
2663 	enum drm_mode_status ret;
2664 	struct drm_device *dev = connector->dev;
2665 	struct vmw_private *dev_priv = vmw_priv(dev);
2666 	u32 assumed_cpp = 4;
2667 
2668 	if (dev_priv->assume_16bpp)
2669 		assumed_cpp = 2;
2670 
2671 	ret = drm_mode_validate_size(mode, dev_priv->texture_max_width,
2672 				     dev_priv->texture_max_height);
2673 	if (ret != MODE_OK)
2674 		return ret;
2675 
2676 	if (!vmw_kms_validate_mode_vram(dev_priv,
2677 					mode->hdisplay * assumed_cpp,
2678 					mode->vdisplay))
2679 		return MODE_MEM;
2680 
2681 	return MODE_OK;
2682 }
2683 
2684 /**
2685  * vmw_connector_get_modes - implements drm_connector_helper_funcs.get_modes callback
2686  *
2687  * @connector: the drm connector, part of a DU container
2688  *
2689  * Returns the number of added modes.
2690  */
vmw_connector_get_modes(struct drm_connector * connector)2691 int vmw_connector_get_modes(struct drm_connector *connector)
2692 {
2693 	struct vmw_display_unit *du = vmw_connector_to_du(connector);
2694 	struct drm_device *dev = connector->dev;
2695 	struct vmw_private *dev_priv = vmw_priv(dev);
2696 	struct drm_display_mode *mode = NULL;
2697 	struct drm_display_mode prefmode = { DRM_MODE("preferred",
2698 		DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
2699 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2700 		DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC)
2701 	};
2702 	u32 max_width;
2703 	u32 max_height;
2704 	u32 num_modes;
2705 
2706 	/* Add preferred mode */
2707 	mode = drm_mode_duplicate(dev, &prefmode);
2708 	if (!mode)
2709 		return 0;
2710 
2711 	mode->hdisplay = du->pref_width;
2712 	mode->vdisplay = du->pref_height;
2713 	vmw_guess_mode_timing(mode);
2714 	drm_mode_set_name(mode);
2715 
2716 	drm_mode_probed_add(connector, mode);
2717 	drm_dbg_kms(dev, "preferred mode " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
2718 
2719 	/* Probe connector for all modes not exceeding our geom limits */
2720 	max_width  = dev_priv->texture_max_width;
2721 	max_height = dev_priv->texture_max_height;
2722 
2723 	if (dev_priv->active_display_unit == vmw_du_screen_target) {
2724 		max_width  = min(dev_priv->stdu_max_width,  max_width);
2725 		max_height = min(dev_priv->stdu_max_height, max_height);
2726 	}
2727 
2728 	num_modes = 1 + drm_add_modes_noedid(connector, max_width, max_height);
2729 
2730 	return num_modes;
2731 }
2732 
vmw_user_object_ref(struct vmw_user_object * uo)2733 struct vmw_user_object *vmw_user_object_ref(struct vmw_user_object *uo)
2734 {
2735 	if (uo->buffer)
2736 		vmw_user_bo_ref(uo->buffer);
2737 	else if (uo->surface)
2738 		vmw_surface_reference(uo->surface);
2739 	return uo;
2740 }
2741 
vmw_user_object_unref(struct vmw_user_object * uo)2742 void vmw_user_object_unref(struct vmw_user_object *uo)
2743 {
2744 	if (uo->buffer)
2745 		vmw_user_bo_unref(&uo->buffer);
2746 	else if (uo->surface)
2747 		vmw_surface_unreference(&uo->surface);
2748 }
2749 
2750 struct vmw_bo *
vmw_user_object_buffer(struct vmw_user_object * uo)2751 vmw_user_object_buffer(struct vmw_user_object *uo)
2752 {
2753 	if (uo->buffer)
2754 		return uo->buffer;
2755 	else if (uo->surface)
2756 		return uo->surface->res.guest_memory_bo;
2757 	return NULL;
2758 }
2759 
2760 struct vmw_surface *
vmw_user_object_surface(struct vmw_user_object * uo)2761 vmw_user_object_surface(struct vmw_user_object *uo)
2762 {
2763 	if (uo->buffer)
2764 		return uo->buffer->dumb_surface;
2765 	return uo->surface;
2766 }
2767 
vmw_user_object_map(struct vmw_user_object * uo)2768 void *vmw_user_object_map(struct vmw_user_object *uo)
2769 {
2770 	struct vmw_bo *bo = vmw_user_object_buffer(uo);
2771 
2772 	WARN_ON(!bo);
2773 	return vmw_bo_map_and_cache(bo);
2774 }
2775 
vmw_user_object_map_size(struct vmw_user_object * uo,size_t size)2776 void *vmw_user_object_map_size(struct vmw_user_object *uo, size_t size)
2777 {
2778 	struct vmw_bo *bo = vmw_user_object_buffer(uo);
2779 
2780 	WARN_ON(!bo);
2781 	return vmw_bo_map_and_cache_size(bo, size);
2782 }
2783 
vmw_user_object_unmap(struct vmw_user_object * uo)2784 void vmw_user_object_unmap(struct vmw_user_object *uo)
2785 {
2786 	struct vmw_bo *bo = vmw_user_object_buffer(uo);
2787 	int ret;
2788 
2789 	WARN_ON(!bo);
2790 
2791 	/* Fence the mob creation so we are guarateed to have the mob */
2792 	ret = ttm_bo_reserve(&bo->tbo, false, false, NULL);
2793 	if (ret != 0)
2794 		return;
2795 
2796 	vmw_bo_unmap(bo);
2797 	vmw_bo_pin_reserved(bo, false);
2798 
2799 	ttm_bo_unreserve(&bo->tbo);
2800 }
2801 
vmw_user_object_is_mapped(struct vmw_user_object * uo)2802 bool vmw_user_object_is_mapped(struct vmw_user_object *uo)
2803 {
2804 	struct vmw_bo *bo;
2805 
2806 	if (!uo || vmw_user_object_is_null(uo))
2807 		return false;
2808 
2809 	bo = vmw_user_object_buffer(uo);
2810 
2811 	if (WARN_ON(!bo))
2812 		return false;
2813 
2814 	WARN_ON(bo->map.bo && !bo->map.virtual);
2815 	return bo->map.virtual;
2816 }
2817 
vmw_user_object_is_null(struct vmw_user_object * uo)2818 bool vmw_user_object_is_null(struct vmw_user_object *uo)
2819 {
2820 	return !uo->buffer && !uo->surface;
2821 }
2822