1 /************************************************************************** 2 * 3 * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA 4 * All Rights Reserved. 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 "vmwgfx_drv.h" 29 #include <drm/vmwgfx_drm.h> 30 #include <drm/ttm/ttm_object.h> 31 #include <drm/ttm/ttm_placement.h> 32 #include <drm/drmP.h> 33 #include "vmwgfx_resource_priv.h" 34 35 struct vmw_user_dma_buffer { 36 struct ttm_base_object base; 37 struct vmw_dma_buffer dma; 38 }; 39 40 struct vmw_bo_user_rep { 41 uint32_t handle; 42 uint64_t map_handle; 43 }; 44 45 struct vmw_stream { 46 struct vmw_resource res; 47 uint32_t stream_id; 48 }; 49 50 struct vmw_user_stream { 51 struct ttm_base_object base; 52 struct vmw_stream stream; 53 }; 54 55 56 static uint64_t vmw_user_stream_size; 57 58 static const struct vmw_res_func vmw_stream_func = { 59 .res_type = vmw_res_stream, 60 .needs_backup = false, 61 .may_evict = false, 62 .type_name = "video streams", 63 .backup_placement = NULL, 64 .create = NULL, 65 .destroy = NULL, 66 .bind = NULL, 67 .unbind = NULL 68 }; 69 70 static inline struct vmw_dma_buffer * 71 vmw_dma_buffer(struct ttm_buffer_object *bo) 72 { 73 return container_of(bo, struct vmw_dma_buffer, base); 74 } 75 76 static inline struct vmw_user_dma_buffer * 77 vmw_user_dma_buffer(struct ttm_buffer_object *bo) 78 { 79 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); 80 return container_of(vmw_bo, struct vmw_user_dma_buffer, dma); 81 } 82 83 struct vmw_resource *vmw_resource_reference(struct vmw_resource *res) 84 { 85 kref_get(&res->kref); 86 return res; 87 } 88 89 90 /** 91 * vmw_resource_release_id - release a resource id to the id manager. 92 * 93 * @res: Pointer to the resource. 94 * 95 * Release the resource id to the resource id manager and set it to -1 96 */ 97 void vmw_resource_release_id(struct vmw_resource *res) 98 { 99 struct vmw_private *dev_priv = res->dev_priv; 100 struct idr *idr = &dev_priv->res_idr[res->func->res_type]; 101 102 write_lock(&dev_priv->resource_lock); 103 if (res->id != -1) 104 idr_remove(idr, res->id); 105 res->id = -1; 106 write_unlock(&dev_priv->resource_lock); 107 } 108 109 static void vmw_resource_release(struct kref *kref) 110 { 111 struct vmw_resource *res = 112 container_of(kref, struct vmw_resource, kref); 113 struct vmw_private *dev_priv = res->dev_priv; 114 int id; 115 struct idr *idr = &dev_priv->res_idr[res->func->res_type]; 116 117 res->avail = false; 118 list_del_init(&res->lru_head); 119 write_unlock(&dev_priv->resource_lock); 120 if (res->backup) { 121 struct ttm_buffer_object *bo = &res->backup->base; 122 123 ttm_bo_reserve(bo, false, false, false, 0); 124 if (!list_empty(&res->mob_head) && 125 res->func->unbind != NULL) { 126 struct ttm_validate_buffer val_buf; 127 128 val_buf.bo = bo; 129 res->func->unbind(res, false, &val_buf); 130 } 131 res->backup_dirty = false; 132 list_del_init(&res->mob_head); 133 ttm_bo_unreserve(bo); 134 vmw_dmabuf_unreference(&res->backup); 135 } 136 137 if (likely(res->hw_destroy != NULL)) 138 res->hw_destroy(res); 139 140 id = res->id; 141 if (res->res_free != NULL) 142 res->res_free(res); 143 else 144 kfree(res); 145 146 write_lock(&dev_priv->resource_lock); 147 148 if (id != -1) 149 idr_remove(idr, id); 150 } 151 152 void vmw_resource_unreference(struct vmw_resource **p_res) 153 { 154 struct vmw_resource *res = *p_res; 155 struct vmw_private *dev_priv = res->dev_priv; 156 157 *p_res = NULL; 158 write_lock(&dev_priv->resource_lock); 159 kref_put(&res->kref, vmw_resource_release); 160 write_unlock(&dev_priv->resource_lock); 161 } 162 163 164 /** 165 * vmw_resource_alloc_id - release a resource id to the id manager. 166 * 167 * @res: Pointer to the resource. 168 * 169 * Allocate the lowest free resource from the resource manager, and set 170 * @res->id to that id. Returns 0 on success and -ENOMEM on failure. 171 */ 172 int vmw_resource_alloc_id(struct vmw_resource *res) 173 { 174 struct vmw_private *dev_priv = res->dev_priv; 175 int ret; 176 struct idr *idr = &dev_priv->res_idr[res->func->res_type]; 177 178 BUG_ON(res->id != -1); 179 180 do { 181 if (unlikely(idr_pre_get(idr, GFP_KERNEL) == 0)) 182 return -ENOMEM; 183 184 write_lock(&dev_priv->resource_lock); 185 ret = idr_get_new_above(idr, res, 1, &res->id); 186 write_unlock(&dev_priv->resource_lock); 187 188 } while (ret == -EAGAIN); 189 190 return ret; 191 } 192 193 /** 194 * vmw_resource_init - initialize a struct vmw_resource 195 * 196 * @dev_priv: Pointer to a device private struct. 197 * @res: The struct vmw_resource to initialize. 198 * @obj_type: Resource object type. 199 * @delay_id: Boolean whether to defer device id allocation until 200 * the first validation. 201 * @res_free: Resource destructor. 202 * @func: Resource function table. 203 */ 204 int vmw_resource_init(struct vmw_private *dev_priv, struct vmw_resource *res, 205 bool delay_id, 206 void (*res_free) (struct vmw_resource *res), 207 const struct vmw_res_func *func) 208 { 209 kref_init(&res->kref); 210 res->hw_destroy = NULL; 211 res->res_free = res_free; 212 res->avail = false; 213 res->dev_priv = dev_priv; 214 res->func = func; 215 INIT_LIST_HEAD(&res->lru_head); 216 INIT_LIST_HEAD(&res->mob_head); 217 res->id = -1; 218 res->backup = NULL; 219 res->backup_offset = 0; 220 res->backup_dirty = false; 221 res->res_dirty = false; 222 if (delay_id) 223 return 0; 224 else 225 return vmw_resource_alloc_id(res); 226 } 227 228 /** 229 * vmw_resource_activate 230 * 231 * @res: Pointer to the newly created resource 232 * @hw_destroy: Destroy function. NULL if none. 233 * 234 * Activate a resource after the hardware has been made aware of it. 235 * Set tye destroy function to @destroy. Typically this frees the 236 * resource and destroys the hardware resources associated with it. 237 * Activate basically means that the function vmw_resource_lookup will 238 * find it. 239 */ 240 void vmw_resource_activate(struct vmw_resource *res, 241 void (*hw_destroy) (struct vmw_resource *)) 242 { 243 struct vmw_private *dev_priv = res->dev_priv; 244 245 write_lock(&dev_priv->resource_lock); 246 res->avail = true; 247 res->hw_destroy = hw_destroy; 248 write_unlock(&dev_priv->resource_lock); 249 } 250 251 struct vmw_resource *vmw_resource_lookup(struct vmw_private *dev_priv, 252 struct idr *idr, int id) 253 { 254 struct vmw_resource *res; 255 256 read_lock(&dev_priv->resource_lock); 257 res = idr_find(idr, id); 258 if (res && res->avail) 259 kref_get(&res->kref); 260 else 261 res = NULL; 262 read_unlock(&dev_priv->resource_lock); 263 264 if (unlikely(res == NULL)) 265 return NULL; 266 267 return res; 268 } 269 270 /** 271 * vmw_user_resource_lookup_handle - lookup a struct resource from a 272 * TTM user-space handle and perform basic type checks 273 * 274 * @dev_priv: Pointer to a device private struct 275 * @tfile: Pointer to a struct ttm_object_file identifying the caller 276 * @handle: The TTM user-space handle 277 * @converter: Pointer to an object describing the resource type 278 * @p_res: On successful return the location pointed to will contain 279 * a pointer to a refcounted struct vmw_resource. 280 * 281 * If the handle can't be found or is associated with an incorrect resource 282 * type, -EINVAL will be returned. 283 */ 284 int vmw_user_resource_lookup_handle(struct vmw_private *dev_priv, 285 struct ttm_object_file *tfile, 286 uint32_t handle, 287 const struct vmw_user_resource_conv 288 *converter, 289 struct vmw_resource **p_res) 290 { 291 struct ttm_base_object *base; 292 struct vmw_resource *res; 293 int ret = -EINVAL; 294 295 base = ttm_base_object_lookup(tfile, handle); 296 if (unlikely(base == NULL)) 297 return -EINVAL; 298 299 if (unlikely(base->object_type != converter->object_type)) 300 goto out_bad_resource; 301 302 res = converter->base_obj_to_res(base); 303 304 read_lock(&dev_priv->resource_lock); 305 if (!res->avail || res->res_free != converter->res_free) { 306 read_unlock(&dev_priv->resource_lock); 307 goto out_bad_resource; 308 } 309 310 kref_get(&res->kref); 311 read_unlock(&dev_priv->resource_lock); 312 313 *p_res = res; 314 ret = 0; 315 316 out_bad_resource: 317 ttm_base_object_unref(&base); 318 319 return ret; 320 } 321 322 /** 323 * Helper function that looks either a surface or dmabuf. 324 * 325 * The pointer this pointed at by out_surf and out_buf needs to be null. 326 */ 327 int vmw_user_lookup_handle(struct vmw_private *dev_priv, 328 struct ttm_object_file *tfile, 329 uint32_t handle, 330 struct vmw_surface **out_surf, 331 struct vmw_dma_buffer **out_buf) 332 { 333 struct vmw_resource *res; 334 int ret; 335 336 BUG_ON(*out_surf || *out_buf); 337 338 ret = vmw_user_resource_lookup_handle(dev_priv, tfile, handle, 339 user_surface_converter, 340 &res); 341 if (!ret) { 342 *out_surf = vmw_res_to_srf(res); 343 return 0; 344 } 345 346 *out_surf = NULL; 347 ret = vmw_user_dmabuf_lookup(tfile, handle, out_buf); 348 return ret; 349 } 350 351 /** 352 * Buffer management. 353 */ 354 void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo) 355 { 356 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); 357 358 kfree(vmw_bo); 359 } 360 361 int vmw_dmabuf_init(struct vmw_private *dev_priv, 362 struct vmw_dma_buffer *vmw_bo, 363 size_t size, struct ttm_placement *placement, 364 bool interruptible, 365 void (*bo_free) (struct ttm_buffer_object *bo)) 366 { 367 struct ttm_bo_device *bdev = &dev_priv->bdev; 368 size_t acc_size; 369 int ret; 370 371 BUG_ON(!bo_free); 372 373 acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct vmw_dma_buffer)); 374 memset(vmw_bo, 0, sizeof(*vmw_bo)); 375 376 INIT_LIST_HEAD(&vmw_bo->res_list); 377 378 ret = ttm_bo_init(bdev, &vmw_bo->base, size, 379 ttm_bo_type_device, placement, 380 0, interruptible, 381 NULL, acc_size, NULL, bo_free); 382 return ret; 383 } 384 385 static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo) 386 { 387 struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo); 388 389 ttm_base_object_kfree(vmw_user_bo, base); 390 } 391 392 static void vmw_user_dmabuf_release(struct ttm_base_object **p_base) 393 { 394 struct vmw_user_dma_buffer *vmw_user_bo; 395 struct ttm_base_object *base = *p_base; 396 struct ttm_buffer_object *bo; 397 398 *p_base = NULL; 399 400 if (unlikely(base == NULL)) 401 return; 402 403 vmw_user_bo = container_of(base, struct vmw_user_dma_buffer, base); 404 bo = &vmw_user_bo->dma.base; 405 ttm_bo_unref(&bo); 406 } 407 408 /** 409 * vmw_user_dmabuf_alloc - Allocate a user dma buffer 410 * 411 * @dev_priv: Pointer to a struct device private. 412 * @tfile: Pointer to a struct ttm_object_file on which to register the user 413 * object. 414 * @size: Size of the dma buffer. 415 * @shareable: Boolean whether the buffer is shareable with other open files. 416 * @handle: Pointer to where the handle value should be assigned. 417 * @p_dma_buf: Pointer to where the refcounted struct vmw_dma_buffer pointer 418 * should be assigned. 419 */ 420 int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv, 421 struct ttm_object_file *tfile, 422 uint32_t size, 423 bool shareable, 424 uint32_t *handle, 425 struct vmw_dma_buffer **p_dma_buf) 426 { 427 struct vmw_user_dma_buffer *user_bo; 428 struct ttm_buffer_object *tmp; 429 int ret; 430 431 user_bo = kzalloc(sizeof(*user_bo), GFP_KERNEL); 432 if (unlikely(user_bo == NULL)) { 433 DRM_ERROR("Failed to allocate a buffer.\n"); 434 return -ENOMEM; 435 } 436 437 ret = vmw_dmabuf_init(dev_priv, &user_bo->dma, size, 438 &vmw_vram_sys_placement, true, 439 &vmw_user_dmabuf_destroy); 440 if (unlikely(ret != 0)) 441 return ret; 442 443 tmp = ttm_bo_reference(&user_bo->dma.base); 444 ret = ttm_base_object_init(tfile, 445 &user_bo->base, 446 shareable, 447 ttm_buffer_type, 448 &vmw_user_dmabuf_release, NULL); 449 if (unlikely(ret != 0)) { 450 ttm_bo_unref(&tmp); 451 goto out_no_base_object; 452 } 453 454 *p_dma_buf = &user_bo->dma; 455 *handle = user_bo->base.hash.key; 456 457 out_no_base_object: 458 return ret; 459 } 460 461 /** 462 * vmw_user_dmabuf_verify_access - verify access permissions on this 463 * buffer object. 464 * 465 * @bo: Pointer to the buffer object being accessed 466 * @tfile: Identifying the caller. 467 */ 468 int vmw_user_dmabuf_verify_access(struct ttm_buffer_object *bo, 469 struct ttm_object_file *tfile) 470 { 471 struct vmw_user_dma_buffer *vmw_user_bo; 472 473 if (unlikely(bo->destroy != vmw_user_dmabuf_destroy)) 474 return -EPERM; 475 476 vmw_user_bo = vmw_user_dma_buffer(bo); 477 return (vmw_user_bo->base.tfile == tfile || 478 vmw_user_bo->base.shareable) ? 0 : -EPERM; 479 } 480 481 int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data, 482 struct drm_file *file_priv) 483 { 484 struct vmw_private *dev_priv = vmw_priv(dev); 485 union drm_vmw_alloc_dmabuf_arg *arg = 486 (union drm_vmw_alloc_dmabuf_arg *)data; 487 struct drm_vmw_alloc_dmabuf_req *req = &arg->req; 488 struct drm_vmw_dmabuf_rep *rep = &arg->rep; 489 struct vmw_dma_buffer *dma_buf; 490 uint32_t handle; 491 struct vmw_master *vmaster = vmw_master(file_priv->master); 492 int ret; 493 494 ret = ttm_read_lock(&vmaster->lock, true); 495 if (unlikely(ret != 0)) 496 return ret; 497 498 ret = vmw_user_dmabuf_alloc(dev_priv, vmw_fpriv(file_priv)->tfile, 499 req->size, false, &handle, &dma_buf); 500 if (unlikely(ret != 0)) 501 goto out_no_dmabuf; 502 503 rep->handle = handle; 504 rep->map_handle = dma_buf->base.addr_space_offset; 505 rep->cur_gmr_id = handle; 506 rep->cur_gmr_offset = 0; 507 508 vmw_dmabuf_unreference(&dma_buf); 509 510 out_no_dmabuf: 511 ttm_read_unlock(&vmaster->lock); 512 513 return ret; 514 } 515 516 int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void *data, 517 struct drm_file *file_priv) 518 { 519 struct drm_vmw_unref_dmabuf_arg *arg = 520 (struct drm_vmw_unref_dmabuf_arg *)data; 521 522 return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, 523 arg->handle, 524 TTM_REF_USAGE); 525 } 526 527 int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile, 528 uint32_t handle, struct vmw_dma_buffer **out) 529 { 530 struct vmw_user_dma_buffer *vmw_user_bo; 531 struct ttm_base_object *base; 532 533 base = ttm_base_object_lookup(tfile, handle); 534 if (unlikely(base == NULL)) { 535 printk(KERN_ERR "Invalid buffer object handle 0x%08lx.\n", 536 (unsigned long)handle); 537 return -ESRCH; 538 } 539 540 if (unlikely(base->object_type != ttm_buffer_type)) { 541 ttm_base_object_unref(&base); 542 printk(KERN_ERR "Invalid buffer object handle 0x%08lx.\n", 543 (unsigned long)handle); 544 return -EINVAL; 545 } 546 547 vmw_user_bo = container_of(base, struct vmw_user_dma_buffer, base); 548 (void)ttm_bo_reference(&vmw_user_bo->dma.base); 549 ttm_base_object_unref(&base); 550 *out = &vmw_user_bo->dma; 551 552 return 0; 553 } 554 555 int vmw_user_dmabuf_reference(struct ttm_object_file *tfile, 556 struct vmw_dma_buffer *dma_buf) 557 { 558 struct vmw_user_dma_buffer *user_bo; 559 560 if (dma_buf->base.destroy != vmw_user_dmabuf_destroy) 561 return -EINVAL; 562 563 user_bo = container_of(dma_buf, struct vmw_user_dma_buffer, dma); 564 return ttm_ref_object_add(tfile, &user_bo->base, TTM_REF_USAGE, NULL); 565 } 566 567 /* 568 * Stream management 569 */ 570 571 static void vmw_stream_destroy(struct vmw_resource *res) 572 { 573 struct vmw_private *dev_priv = res->dev_priv; 574 struct vmw_stream *stream; 575 int ret; 576 577 DRM_INFO("%s: unref\n", __func__); 578 stream = container_of(res, struct vmw_stream, res); 579 580 ret = vmw_overlay_unref(dev_priv, stream->stream_id); 581 WARN_ON(ret != 0); 582 } 583 584 static int vmw_stream_init(struct vmw_private *dev_priv, 585 struct vmw_stream *stream, 586 void (*res_free) (struct vmw_resource *res)) 587 { 588 struct vmw_resource *res = &stream->res; 589 int ret; 590 591 ret = vmw_resource_init(dev_priv, res, false, res_free, 592 &vmw_stream_func); 593 594 if (unlikely(ret != 0)) { 595 if (res_free == NULL) 596 kfree(stream); 597 else 598 res_free(&stream->res); 599 return ret; 600 } 601 602 ret = vmw_overlay_claim(dev_priv, &stream->stream_id); 603 if (ret) { 604 vmw_resource_unreference(&res); 605 return ret; 606 } 607 608 DRM_INFO("%s: claimed\n", __func__); 609 610 vmw_resource_activate(&stream->res, vmw_stream_destroy); 611 return 0; 612 } 613 614 static void vmw_user_stream_free(struct vmw_resource *res) 615 { 616 struct vmw_user_stream *stream = 617 container_of(res, struct vmw_user_stream, stream.res); 618 struct vmw_private *dev_priv = res->dev_priv; 619 620 ttm_base_object_kfree(stream, base); 621 ttm_mem_global_free(vmw_mem_glob(dev_priv), 622 vmw_user_stream_size); 623 } 624 625 /** 626 * This function is called when user space has no more references on the 627 * base object. It releases the base-object's reference on the resource object. 628 */ 629 630 static void vmw_user_stream_base_release(struct ttm_base_object **p_base) 631 { 632 struct ttm_base_object *base = *p_base; 633 struct vmw_user_stream *stream = 634 container_of(base, struct vmw_user_stream, base); 635 struct vmw_resource *res = &stream->stream.res; 636 637 *p_base = NULL; 638 vmw_resource_unreference(&res); 639 } 640 641 int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, 642 struct drm_file *file_priv) 643 { 644 struct vmw_private *dev_priv = vmw_priv(dev); 645 struct vmw_resource *res; 646 struct vmw_user_stream *stream; 647 struct drm_vmw_stream_arg *arg = (struct drm_vmw_stream_arg *)data; 648 struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; 649 struct idr *idr = &dev_priv->res_idr[vmw_res_stream]; 650 int ret = 0; 651 652 653 res = vmw_resource_lookup(dev_priv, idr, arg->stream_id); 654 if (unlikely(res == NULL)) 655 return -EINVAL; 656 657 if (res->res_free != &vmw_user_stream_free) { 658 ret = -EINVAL; 659 goto out; 660 } 661 662 stream = container_of(res, struct vmw_user_stream, stream.res); 663 if (stream->base.tfile != tfile) { 664 ret = -EINVAL; 665 goto out; 666 } 667 668 ttm_ref_object_base_unref(tfile, stream->base.hash.key, TTM_REF_USAGE); 669 out: 670 vmw_resource_unreference(&res); 671 return ret; 672 } 673 674 int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, 675 struct drm_file *file_priv) 676 { 677 struct vmw_private *dev_priv = vmw_priv(dev); 678 struct vmw_user_stream *stream; 679 struct vmw_resource *res; 680 struct vmw_resource *tmp; 681 struct drm_vmw_stream_arg *arg = (struct drm_vmw_stream_arg *)data; 682 struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; 683 struct vmw_master *vmaster = vmw_master(file_priv->master); 684 int ret; 685 686 /* 687 * Approximate idr memory usage with 128 bytes. It will be limited 688 * by maximum number_of streams anyway? 689 */ 690 691 if (unlikely(vmw_user_stream_size == 0)) 692 vmw_user_stream_size = ttm_round_pot(sizeof(*stream)) + 128; 693 694 ret = ttm_read_lock(&vmaster->lock, true); 695 if (unlikely(ret != 0)) 696 return ret; 697 698 ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv), 699 vmw_user_stream_size, 700 false, true); 701 if (unlikely(ret != 0)) { 702 if (ret != -ERESTARTSYS) 703 DRM_ERROR("Out of graphics memory for stream" 704 " creation.\n"); 705 goto out_unlock; 706 } 707 708 709 stream = kmalloc(sizeof(*stream), GFP_KERNEL); 710 if (unlikely(stream == NULL)) { 711 ttm_mem_global_free(vmw_mem_glob(dev_priv), 712 vmw_user_stream_size); 713 ret = -ENOMEM; 714 goto out_unlock; 715 } 716 717 res = &stream->stream.res; 718 stream->base.shareable = false; 719 stream->base.tfile = NULL; 720 721 /* 722 * From here on, the destructor takes over resource freeing. 723 */ 724 725 ret = vmw_stream_init(dev_priv, &stream->stream, vmw_user_stream_free); 726 if (unlikely(ret != 0)) 727 goto out_unlock; 728 729 tmp = vmw_resource_reference(res); 730 ret = ttm_base_object_init(tfile, &stream->base, false, VMW_RES_STREAM, 731 &vmw_user_stream_base_release, NULL); 732 733 if (unlikely(ret != 0)) { 734 vmw_resource_unreference(&tmp); 735 goto out_err; 736 } 737 738 arg->stream_id = res->id; 739 out_err: 740 vmw_resource_unreference(&res); 741 out_unlock: 742 ttm_read_unlock(&vmaster->lock); 743 return ret; 744 } 745 746 int vmw_user_stream_lookup(struct vmw_private *dev_priv, 747 struct ttm_object_file *tfile, 748 uint32_t *inout_id, struct vmw_resource **out) 749 { 750 struct vmw_user_stream *stream; 751 struct vmw_resource *res; 752 int ret; 753 754 res = vmw_resource_lookup(dev_priv, &dev_priv->res_idr[vmw_res_stream], 755 *inout_id); 756 if (unlikely(res == NULL)) 757 return -EINVAL; 758 759 if (res->res_free != &vmw_user_stream_free) { 760 ret = -EINVAL; 761 goto err_ref; 762 } 763 764 stream = container_of(res, struct vmw_user_stream, stream.res); 765 if (stream->base.tfile != tfile) { 766 ret = -EPERM; 767 goto err_ref; 768 } 769 770 *inout_id = stream->stream.stream_id; 771 *out = res; 772 return 0; 773 err_ref: 774 vmw_resource_unreference(&res); 775 return ret; 776 } 777 778 779 int vmw_dumb_create(struct drm_file *file_priv, 780 struct drm_device *dev, 781 struct drm_mode_create_dumb *args) 782 { 783 struct vmw_private *dev_priv = vmw_priv(dev); 784 struct vmw_master *vmaster = vmw_master(file_priv->master); 785 struct vmw_user_dma_buffer *vmw_user_bo; 786 struct ttm_buffer_object *tmp; 787 int ret; 788 789 args->pitch = args->width * ((args->bpp + 7) / 8); 790 args->size = args->pitch * args->height; 791 792 vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL); 793 if (vmw_user_bo == NULL) 794 return -ENOMEM; 795 796 ret = ttm_read_lock(&vmaster->lock, true); 797 if (ret != 0) { 798 kfree(vmw_user_bo); 799 return ret; 800 } 801 802 ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size, 803 &vmw_vram_sys_placement, true, 804 &vmw_user_dmabuf_destroy); 805 if (ret != 0) 806 goto out_no_dmabuf; 807 808 tmp = ttm_bo_reference(&vmw_user_bo->dma.base); 809 ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, 810 &vmw_user_bo->base, 811 false, 812 ttm_buffer_type, 813 &vmw_user_dmabuf_release, NULL); 814 if (unlikely(ret != 0)) 815 goto out_no_base_object; 816 817 args->handle = vmw_user_bo->base.hash.key; 818 819 out_no_base_object: 820 ttm_bo_unref(&tmp); 821 out_no_dmabuf: 822 ttm_read_unlock(&vmaster->lock); 823 return ret; 824 } 825 826 int vmw_dumb_map_offset(struct drm_file *file_priv, 827 struct drm_device *dev, uint32_t handle, 828 uint64_t *offset) 829 { 830 struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; 831 struct vmw_dma_buffer *out_buf; 832 int ret; 833 834 ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf); 835 if (ret != 0) 836 return -EINVAL; 837 838 *offset = out_buf->base.addr_space_offset; 839 vmw_dmabuf_unreference(&out_buf); 840 return 0; 841 } 842 843 int vmw_dumb_destroy(struct drm_file *file_priv, 844 struct drm_device *dev, 845 uint32_t handle) 846 { 847 return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, 848 handle, TTM_REF_USAGE); 849 } 850 851 /** 852 * vmw_resource_buf_alloc - Allocate a backup buffer for a resource. 853 * 854 * @res: The resource for which to allocate a backup buffer. 855 * @interruptible: Whether any sleeps during allocation should be 856 * performed while interruptible. 857 */ 858 static int vmw_resource_buf_alloc(struct vmw_resource *res, 859 bool interruptible) 860 { 861 unsigned long size = 862 (res->backup_size + PAGE_SIZE - 1) & PAGE_MASK; 863 struct vmw_dma_buffer *backup; 864 int ret; 865 866 if (likely(res->backup)) { 867 BUG_ON(res->backup->base.num_pages * PAGE_SIZE < size); 868 return 0; 869 } 870 871 backup = kzalloc(sizeof(*backup), GFP_KERNEL); 872 if (unlikely(backup == NULL)) 873 return -ENOMEM; 874 875 ret = vmw_dmabuf_init(res->dev_priv, backup, res->backup_size, 876 res->func->backup_placement, 877 interruptible, 878 &vmw_dmabuf_bo_free); 879 if (unlikely(ret != 0)) 880 goto out_no_dmabuf; 881 882 res->backup = backup; 883 884 out_no_dmabuf: 885 return ret; 886 } 887 888 /** 889 * vmw_resource_do_validate - Make a resource up-to-date and visible 890 * to the device. 891 * 892 * @res: The resource to make visible to the device. 893 * @val_buf: Information about a buffer possibly 894 * containing backup data if a bind operation is needed. 895 * 896 * On hardware resource shortage, this function returns -EBUSY and 897 * should be retried once resources have been freed up. 898 */ 899 static int vmw_resource_do_validate(struct vmw_resource *res, 900 struct ttm_validate_buffer *val_buf) 901 { 902 int ret = 0; 903 const struct vmw_res_func *func = res->func; 904 905 if (unlikely(res->id == -1)) { 906 ret = func->create(res); 907 if (unlikely(ret != 0)) 908 return ret; 909 } 910 911 if (func->bind && 912 ((func->needs_backup && list_empty(&res->mob_head) && 913 val_buf->bo != NULL) || 914 (!func->needs_backup && val_buf->bo != NULL))) { 915 ret = func->bind(res, val_buf); 916 if (unlikely(ret != 0)) 917 goto out_bind_failed; 918 if (func->needs_backup) 919 list_add_tail(&res->mob_head, &res->backup->res_list); 920 } 921 922 /* 923 * Only do this on write operations, and move to 924 * vmw_resource_unreserve if it can be called after 925 * backup buffers have been unreserved. Otherwise 926 * sort out locking. 927 */ 928 res->res_dirty = true; 929 930 return 0; 931 932 out_bind_failed: 933 func->destroy(res); 934 935 return ret; 936 } 937 938 /** 939 * vmw_resource_unreserve - Unreserve a resource previously reserved for 940 * command submission. 941 * 942 * @res: Pointer to the struct vmw_resource to unreserve. 943 * @new_backup: Pointer to new backup buffer if command submission 944 * switched. 945 * @new_backup_offset: New backup offset if @new_backup is !NULL. 946 * 947 * Currently unreserving a resource means putting it back on the device's 948 * resource lru list, so that it can be evicted if necessary. 949 */ 950 void vmw_resource_unreserve(struct vmw_resource *res, 951 struct vmw_dma_buffer *new_backup, 952 unsigned long new_backup_offset) 953 { 954 struct vmw_private *dev_priv = res->dev_priv; 955 956 if (!list_empty(&res->lru_head)) 957 return; 958 959 if (new_backup && new_backup != res->backup) { 960 961 if (res->backup) { 962 BUG_ON(atomic_read(&res->backup->base.reserved) == 0); 963 list_del_init(&res->mob_head); 964 vmw_dmabuf_unreference(&res->backup); 965 } 966 967 res->backup = vmw_dmabuf_reference(new_backup); 968 BUG_ON(atomic_read(&new_backup->base.reserved) == 0); 969 list_add_tail(&res->mob_head, &new_backup->res_list); 970 } 971 if (new_backup) 972 res->backup_offset = new_backup_offset; 973 974 if (!res->func->may_evict) 975 return; 976 977 write_lock(&dev_priv->resource_lock); 978 list_add_tail(&res->lru_head, 979 &res->dev_priv->res_lru[res->func->res_type]); 980 write_unlock(&dev_priv->resource_lock); 981 } 982 983 /** 984 * vmw_resource_check_buffer - Check whether a backup buffer is needed 985 * for a resource and in that case, allocate 986 * one, reserve and validate it. 987 * 988 * @res: The resource for which to allocate a backup buffer. 989 * @interruptible: Whether any sleeps during allocation should be 990 * performed while interruptible. 991 * @val_buf: On successful return contains data about the 992 * reserved and validated backup buffer. 993 */ 994 int vmw_resource_check_buffer(struct vmw_resource *res, 995 bool interruptible, 996 struct ttm_validate_buffer *val_buf) 997 { 998 struct list_head val_list; 999 bool backup_dirty = false; 1000 int ret; 1001 1002 if (unlikely(res->backup == NULL)) { 1003 ret = vmw_resource_buf_alloc(res, interruptible); 1004 if (unlikely(ret != 0)) 1005 return ret; 1006 } 1007 1008 INIT_LIST_HEAD(&val_list); 1009 val_buf->bo = ttm_bo_reference(&res->backup->base); 1010 list_add_tail(&val_buf->head, &val_list); 1011 ret = ttm_eu_reserve_buffers(&val_list); 1012 if (unlikely(ret != 0)) 1013 goto out_no_reserve; 1014 1015 if (res->func->needs_backup && list_empty(&res->mob_head)) 1016 return 0; 1017 1018 backup_dirty = res->backup_dirty; 1019 ret = ttm_bo_validate(&res->backup->base, 1020 res->func->backup_placement, 1021 true, false); 1022 1023 if (unlikely(ret != 0)) 1024 goto out_no_validate; 1025 1026 return 0; 1027 1028 out_no_validate: 1029 ttm_eu_backoff_reservation(&val_list); 1030 out_no_reserve: 1031 ttm_bo_unref(&val_buf->bo); 1032 if (backup_dirty) 1033 vmw_dmabuf_unreference(&res->backup); 1034 1035 return ret; 1036 } 1037 1038 /** 1039 * vmw_resource_reserve - Reserve a resource for command submission 1040 * 1041 * @res: The resource to reserve. 1042 * 1043 * This function takes the resource off the LRU list and make sure 1044 * a backup buffer is present for guest-backed resources. However, 1045 * the buffer may not be bound to the resource at this point. 1046 * 1047 */ 1048 int vmw_resource_reserve(struct vmw_resource *res, bool no_backup) 1049 { 1050 struct vmw_private *dev_priv = res->dev_priv; 1051 int ret; 1052 1053 write_lock(&dev_priv->resource_lock); 1054 list_del_init(&res->lru_head); 1055 write_unlock(&dev_priv->resource_lock); 1056 1057 if (res->func->needs_backup && res->backup == NULL && 1058 !no_backup) { 1059 ret = vmw_resource_buf_alloc(res, true); 1060 if (unlikely(ret != 0)) 1061 return ret; 1062 } 1063 1064 return 0; 1065 } 1066 1067 /** 1068 * vmw_resource_backoff_reservation - Unreserve and unreference a 1069 * backup buffer 1070 *. 1071 * @val_buf: Backup buffer information. 1072 */ 1073 void vmw_resource_backoff_reservation(struct ttm_validate_buffer *val_buf) 1074 { 1075 struct list_head val_list; 1076 1077 if (likely(val_buf->bo == NULL)) 1078 return; 1079 1080 INIT_LIST_HEAD(&val_list); 1081 list_add_tail(&val_buf->head, &val_list); 1082 ttm_eu_backoff_reservation(&val_list); 1083 ttm_bo_unref(&val_buf->bo); 1084 } 1085 1086 /** 1087 * vmw_resource_do_evict - Evict a resource, and transfer its data 1088 * to a backup buffer. 1089 * 1090 * @res: The resource to evict. 1091 */ 1092 int vmw_resource_do_evict(struct vmw_resource *res) 1093 { 1094 struct ttm_validate_buffer val_buf; 1095 const struct vmw_res_func *func = res->func; 1096 int ret; 1097 1098 BUG_ON(!func->may_evict); 1099 1100 val_buf.bo = NULL; 1101 ret = vmw_resource_check_buffer(res, true, &val_buf); 1102 if (unlikely(ret != 0)) 1103 return ret; 1104 1105 if (unlikely(func->unbind != NULL && 1106 (!func->needs_backup || !list_empty(&res->mob_head)))) { 1107 ret = func->unbind(res, res->res_dirty, &val_buf); 1108 if (unlikely(ret != 0)) 1109 goto out_no_unbind; 1110 list_del_init(&res->mob_head); 1111 } 1112 ret = func->destroy(res); 1113 res->backup_dirty = true; 1114 res->res_dirty = false; 1115 out_no_unbind: 1116 vmw_resource_backoff_reservation(&val_buf); 1117 1118 return ret; 1119 } 1120 1121 1122 /** 1123 * vmw_resource_validate - Make a resource up-to-date and visible 1124 * to the device. 1125 * 1126 * @res: The resource to make visible to the device. 1127 * 1128 * On succesful return, any backup DMA buffer pointed to by @res->backup will 1129 * be reserved and validated. 1130 * On hardware resource shortage, this function will repeatedly evict 1131 * resources of the same type until the validation succeeds. 1132 */ 1133 int vmw_resource_validate(struct vmw_resource *res) 1134 { 1135 int ret; 1136 struct vmw_resource *evict_res; 1137 struct vmw_private *dev_priv = res->dev_priv; 1138 struct list_head *lru_list = &dev_priv->res_lru[res->func->res_type]; 1139 struct ttm_validate_buffer val_buf; 1140 1141 if (likely(!res->func->may_evict)) 1142 return 0; 1143 1144 val_buf.bo = NULL; 1145 if (res->backup) 1146 val_buf.bo = &res->backup->base; 1147 do { 1148 ret = vmw_resource_do_validate(res, &val_buf); 1149 if (likely(ret != -EBUSY)) 1150 break; 1151 1152 write_lock(&dev_priv->resource_lock); 1153 if (list_empty(lru_list) || !res->func->may_evict) { 1154 DRM_ERROR("Out of device device id entries " 1155 "for %s.\n", res->func->type_name); 1156 ret = -EBUSY; 1157 write_unlock(&dev_priv->resource_lock); 1158 break; 1159 } 1160 1161 evict_res = vmw_resource_reference 1162 (list_first_entry(lru_list, struct vmw_resource, 1163 lru_head)); 1164 list_del_init(&evict_res->lru_head); 1165 1166 write_unlock(&dev_priv->resource_lock); 1167 vmw_resource_do_evict(evict_res); 1168 vmw_resource_unreference(&evict_res); 1169 } while (1); 1170 1171 if (unlikely(ret != 0)) 1172 goto out_no_validate; 1173 else if (!res->func->needs_backup && res->backup) { 1174 list_del_init(&res->mob_head); 1175 vmw_dmabuf_unreference(&res->backup); 1176 } 1177 1178 return 0; 1179 1180 out_no_validate: 1181 return ret; 1182 } 1183 1184 /** 1185 * vmw_fence_single_bo - Utility function to fence a single TTM buffer 1186 * object without unreserving it. 1187 * 1188 * @bo: Pointer to the struct ttm_buffer_object to fence. 1189 * @fence: Pointer to the fence. If NULL, this function will 1190 * insert a fence into the command stream.. 1191 * 1192 * Contrary to the ttm_eu version of this function, it takes only 1193 * a single buffer object instead of a list, and it also doesn't 1194 * unreserve the buffer object, which needs to be done separately. 1195 */ 1196 void vmw_fence_single_bo(struct ttm_buffer_object *bo, 1197 struct vmw_fence_obj *fence) 1198 { 1199 struct ttm_bo_device *bdev = bo->bdev; 1200 struct ttm_bo_driver *driver = bdev->driver; 1201 struct vmw_fence_obj *old_fence_obj; 1202 struct vmw_private *dev_priv = 1203 container_of(bdev, struct vmw_private, bdev); 1204 1205 if (fence == NULL) 1206 vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL); 1207 else 1208 driver->sync_obj_ref(fence); 1209 1210 spin_lock(&bdev->fence_lock); 1211 1212 old_fence_obj = bo->sync_obj; 1213 bo->sync_obj = fence; 1214 1215 spin_unlock(&bdev->fence_lock); 1216 1217 if (old_fence_obj) 1218 vmw_fence_obj_unreference(&old_fence_obj); 1219 } 1220 1221 /** 1222 * vmw_resource_move_notify - TTM move_notify_callback 1223 * 1224 * @bo: The TTM buffer object about to move. 1225 * @mem: The truct ttm_mem_reg indicating to what memory 1226 * region the move is taking place. 1227 * 1228 * For now does nothing. 1229 */ 1230 void vmw_resource_move_notify(struct ttm_buffer_object *bo, 1231 struct ttm_mem_reg *mem) 1232 { 1233 } 1234 1235 /** 1236 * vmw_resource_needs_backup - Return whether a resource needs a backup buffer. 1237 * 1238 * @res: The resource being queried. 1239 */ 1240 bool vmw_resource_needs_backup(const struct vmw_resource *res) 1241 { 1242 return res->func->needs_backup; 1243 } 1244 1245 /** 1246 * vmw_resource_evict_type - Evict all resources of a specific type 1247 * 1248 * @dev_priv: Pointer to a device private struct 1249 * @type: The resource type to evict 1250 * 1251 * To avoid thrashing starvation or as part of the hibernation sequence, 1252 * evict all evictable resources of a specific type. 1253 */ 1254 static void vmw_resource_evict_type(struct vmw_private *dev_priv, 1255 enum vmw_res_type type) 1256 { 1257 struct list_head *lru_list = &dev_priv->res_lru[type]; 1258 struct vmw_resource *evict_res; 1259 1260 do { 1261 write_lock(&dev_priv->resource_lock); 1262 1263 if (list_empty(lru_list)) 1264 goto out_unlock; 1265 1266 evict_res = vmw_resource_reference( 1267 list_first_entry(lru_list, struct vmw_resource, 1268 lru_head)); 1269 list_del_init(&evict_res->lru_head); 1270 write_unlock(&dev_priv->resource_lock); 1271 vmw_resource_do_evict(evict_res); 1272 vmw_resource_unreference(&evict_res); 1273 } while (1); 1274 1275 out_unlock: 1276 write_unlock(&dev_priv->resource_lock); 1277 } 1278 1279 /** 1280 * vmw_resource_evict_all - Evict all evictable resources 1281 * 1282 * @dev_priv: Pointer to a device private struct 1283 * 1284 * To avoid thrashing starvation or as part of the hibernation sequence, 1285 * evict all evictable resources. In particular this means that all 1286 * guest-backed resources that are registered with the device are 1287 * evicted and the OTable becomes clean. 1288 */ 1289 void vmw_resource_evict_all(struct vmw_private *dev_priv) 1290 { 1291 enum vmw_res_type type; 1292 1293 mutex_lock(&dev_priv->cmdbuf_mutex); 1294 1295 for (type = 0; type < vmw_res_max; ++type) 1296 vmw_resource_evict_type(dev_priv, type); 1297 1298 mutex_unlock(&dev_priv->cmdbuf_mutex); 1299 } 1300