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