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