| .. | .. |
|---|
| 25 | 25 | * |
|---|
| 26 | 26 | **************************************************************************/ |
|---|
| 27 | 27 | |
|---|
| 28 | +#include <linux/highmem.h> |
|---|
| 29 | + |
|---|
| 28 | 30 | #include "vmwgfx_drv.h" |
|---|
| 29 | 31 | |
|---|
| 30 | 32 | /* |
|---|
| .. | .. |
|---|
| 146 | 148 | mob->pt_level += VMW_MOBFMT_PTDEPTH_1 - SVGA3D_MOBFMT_PTDEPTH_1; |
|---|
| 147 | 149 | } |
|---|
| 148 | 150 | |
|---|
| 149 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
|---|
| 151 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
|---|
| 150 | 152 | if (unlikely(cmd == NULL)) { |
|---|
| 151 | | - DRM_ERROR("Failed reserving FIFO space for OTable setup.\n"); |
|---|
| 152 | 153 | ret = -ENOMEM; |
|---|
| 153 | 154 | goto out_no_fifo; |
|---|
| 154 | 155 | } |
|---|
| .. | .. |
|---|
| 202 | 203 | return; |
|---|
| 203 | 204 | |
|---|
| 204 | 205 | bo = otable->page_table->pt_bo; |
|---|
| 205 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
|---|
| 206 | | - if (unlikely(cmd == NULL)) { |
|---|
| 207 | | - DRM_ERROR("Failed reserving FIFO space for OTable " |
|---|
| 208 | | - "takedown.\n"); |
|---|
| 206 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
|---|
| 207 | + if (unlikely(cmd == NULL)) |
|---|
| 209 | 208 | return; |
|---|
| 210 | | - } |
|---|
| 211 | 209 | |
|---|
| 212 | 210 | memset(cmd, 0, sizeof(*cmd)); |
|---|
| 213 | 211 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; |
|---|
| .. | .. |
|---|
| 240 | 238 | unsigned long offset; |
|---|
| 241 | 239 | unsigned long bo_size; |
|---|
| 242 | 240 | struct vmw_otable *otables = batch->otables; |
|---|
| 243 | | - struct ttm_operation_ctx ctx = { |
|---|
| 244 | | - .interruptible = false, |
|---|
| 245 | | - .no_wait_gpu = false |
|---|
| 246 | | - }; |
|---|
| 247 | 241 | SVGAOTableType i; |
|---|
| 248 | 242 | int ret; |
|---|
| 249 | 243 | |
|---|
| .. | .. |
|---|
| 257 | 251 | bo_size += otables[i].size; |
|---|
| 258 | 252 | } |
|---|
| 259 | 253 | |
|---|
| 260 | | - ret = ttm_bo_create(&dev_priv->bdev, bo_size, |
|---|
| 261 | | - ttm_bo_type_device, |
|---|
| 262 | | - &vmw_sys_ne_placement, |
|---|
| 263 | | - 0, false, &batch->otable_bo); |
|---|
| 264 | | - |
|---|
| 254 | + ret = vmw_bo_create_and_populate(dev_priv, bo_size, &batch->otable_bo); |
|---|
| 265 | 255 | if (unlikely(ret != 0)) |
|---|
| 266 | | - goto out_no_bo; |
|---|
| 267 | | - |
|---|
| 268 | | - ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL); |
|---|
| 269 | | - BUG_ON(ret != 0); |
|---|
| 270 | | - ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm, &ctx); |
|---|
| 271 | | - if (unlikely(ret != 0)) |
|---|
| 272 | | - goto out_unreserve; |
|---|
| 273 | | - ret = vmw_bo_map_dma(batch->otable_bo); |
|---|
| 274 | | - if (unlikely(ret != 0)) |
|---|
| 275 | | - goto out_unreserve; |
|---|
| 276 | | - |
|---|
| 277 | | - ttm_bo_unreserve(batch->otable_bo); |
|---|
| 256 | + return ret; |
|---|
| 278 | 257 | |
|---|
| 279 | 258 | offset = 0; |
|---|
| 280 | 259 | for (i = 0; i < batch->num_otables; ++i) { |
|---|
| .. | .. |
|---|
| 291 | 270 | |
|---|
| 292 | 271 | return 0; |
|---|
| 293 | 272 | |
|---|
| 294 | | -out_unreserve: |
|---|
| 295 | | - ttm_bo_unreserve(batch->otable_bo); |
|---|
| 296 | 273 | out_no_setup: |
|---|
| 297 | 274 | for (i = 0; i < batch->num_otables; ++i) { |
|---|
| 298 | 275 | if (batch->otables[i].enabled) |
|---|
| .. | .. |
|---|
| 300 | 277 | &batch->otables[i]); |
|---|
| 301 | 278 | } |
|---|
| 302 | 279 | |
|---|
| 303 | | - ttm_bo_unref(&batch->otable_bo); |
|---|
| 304 | | -out_no_bo: |
|---|
| 280 | + ttm_bo_put(batch->otable_bo); |
|---|
| 281 | + batch->otable_bo = NULL; |
|---|
| 305 | 282 | return ret; |
|---|
| 306 | 283 | } |
|---|
| 307 | 284 | |
|---|
| .. | .. |
|---|
| 321 | 298 | struct vmw_otable **otables = &dev_priv->otable_batch.otables; |
|---|
| 322 | 299 | int ret; |
|---|
| 323 | 300 | |
|---|
| 324 | | - if (dev_priv->has_dx) { |
|---|
| 301 | + if (has_sm4_context(dev_priv)) { |
|---|
| 325 | 302 | *otables = kmemdup(dx_tables, sizeof(dx_tables), GFP_KERNEL); |
|---|
| 326 | 303 | if (!(*otables)) |
|---|
| 327 | 304 | return -ENOMEM; |
|---|
| .. | .. |
|---|
| 365 | 342 | vmw_bo_fence_single(bo, NULL); |
|---|
| 366 | 343 | ttm_bo_unreserve(bo); |
|---|
| 367 | 344 | |
|---|
| 368 | | - ttm_bo_unref(&batch->otable_bo); |
|---|
| 345 | + ttm_bo_put(batch->otable_bo); |
|---|
| 346 | + batch->otable_bo = NULL; |
|---|
| 369 | 347 | } |
|---|
| 370 | 348 | |
|---|
| 371 | 349 | /* |
|---|
| .. | .. |
|---|
| 432 | 410 | static int vmw_mob_pt_populate(struct vmw_private *dev_priv, |
|---|
| 433 | 411 | struct vmw_mob *mob) |
|---|
| 434 | 412 | { |
|---|
| 435 | | - int ret; |
|---|
| 436 | | - struct ttm_operation_ctx ctx = { |
|---|
| 437 | | - .interruptible = false, |
|---|
| 438 | | - .no_wait_gpu = false |
|---|
| 439 | | - }; |
|---|
| 440 | | - |
|---|
| 441 | 413 | BUG_ON(mob->pt_bo != NULL); |
|---|
| 442 | 414 | |
|---|
| 443 | | - ret = ttm_bo_create(&dev_priv->bdev, mob->num_pages * PAGE_SIZE, |
|---|
| 444 | | - ttm_bo_type_device, |
|---|
| 445 | | - &vmw_sys_ne_placement, |
|---|
| 446 | | - 0, false, &mob->pt_bo); |
|---|
| 447 | | - if (unlikely(ret != 0)) |
|---|
| 448 | | - return ret; |
|---|
| 449 | | - |
|---|
| 450 | | - ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL); |
|---|
| 451 | | - |
|---|
| 452 | | - BUG_ON(ret != 0); |
|---|
| 453 | | - ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm, &ctx); |
|---|
| 454 | | - if (unlikely(ret != 0)) |
|---|
| 455 | | - goto out_unreserve; |
|---|
| 456 | | - ret = vmw_bo_map_dma(mob->pt_bo); |
|---|
| 457 | | - if (unlikely(ret != 0)) |
|---|
| 458 | | - goto out_unreserve; |
|---|
| 459 | | - |
|---|
| 460 | | - ttm_bo_unreserve(mob->pt_bo); |
|---|
| 461 | | - |
|---|
| 462 | | - return 0; |
|---|
| 463 | | - |
|---|
| 464 | | -out_unreserve: |
|---|
| 465 | | - ttm_bo_unreserve(mob->pt_bo); |
|---|
| 466 | | - ttm_bo_unref(&mob->pt_bo); |
|---|
| 467 | | - |
|---|
| 468 | | - return ret; |
|---|
| 415 | + return vmw_bo_create_and_populate(dev_priv, mob->num_pages * PAGE_SIZE, &mob->pt_bo); |
|---|
| 469 | 416 | } |
|---|
| 470 | 417 | |
|---|
| 471 | 418 | /** |
|---|
| .. | .. |
|---|
| 580 | 527 | */ |
|---|
| 581 | 528 | void vmw_mob_destroy(struct vmw_mob *mob) |
|---|
| 582 | 529 | { |
|---|
| 583 | | - if (mob->pt_bo) |
|---|
| 584 | | - ttm_bo_unref(&mob->pt_bo); |
|---|
| 530 | + if (mob->pt_bo) { |
|---|
| 531 | + ttm_bo_put(mob->pt_bo); |
|---|
| 532 | + mob->pt_bo = NULL; |
|---|
| 533 | + } |
|---|
| 585 | 534 | kfree(mob); |
|---|
| 586 | 535 | } |
|---|
| 587 | 536 | |
|---|
| .. | .. |
|---|
| 609 | 558 | BUG_ON(ret != 0); |
|---|
| 610 | 559 | } |
|---|
| 611 | 560 | |
|---|
| 612 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
|---|
| 613 | | - if (unlikely(cmd == NULL)) { |
|---|
| 614 | | - DRM_ERROR("Failed reserving FIFO space for Memory " |
|---|
| 615 | | - "Object unbinding.\n"); |
|---|
| 616 | | - } else { |
|---|
| 561 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
|---|
| 562 | + if (cmd) { |
|---|
| 617 | 563 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; |
|---|
| 618 | 564 | cmd->header.size = sizeof(cmd->body); |
|---|
| 619 | 565 | cmd->body.mobid = mob->id; |
|---|
| 620 | 566 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); |
|---|
| 621 | 567 | } |
|---|
| 568 | + |
|---|
| 622 | 569 | if (bo) { |
|---|
| 623 | 570 | vmw_bo_fence_single(bo, NULL); |
|---|
| 624 | 571 | ttm_bo_unreserve(bo); |
|---|
| .. | .. |
|---|
| 678 | 625 | |
|---|
| 679 | 626 | vmw_fifo_resource_inc(dev_priv); |
|---|
| 680 | 627 | |
|---|
| 681 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
|---|
| 682 | | - if (unlikely(cmd == NULL)) { |
|---|
| 683 | | - DRM_ERROR("Failed reserving FIFO space for Memory " |
|---|
| 684 | | - "Object binding.\n"); |
|---|
| 628 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
|---|
| 629 | + if (unlikely(cmd == NULL)) |
|---|
| 685 | 630 | goto out_no_cmd_space; |
|---|
| 686 | | - } |
|---|
| 687 | 631 | |
|---|
| 688 | 632 | cmd->header.id = SVGA_3D_CMD_DEFINE_GB_MOB64; |
|---|
| 689 | 633 | cmd->header.size = sizeof(cmd->body); |
|---|
| .. | .. |
|---|
| 698 | 642 | |
|---|
| 699 | 643 | out_no_cmd_space: |
|---|
| 700 | 644 | vmw_fifo_resource_dec(dev_priv); |
|---|
| 701 | | - if (pt_set_up) |
|---|
| 702 | | - ttm_bo_unref(&mob->pt_bo); |
|---|
| 645 | + if (pt_set_up) { |
|---|
| 646 | + ttm_bo_put(mob->pt_bo); |
|---|
| 647 | + mob->pt_bo = NULL; |
|---|
| 648 | + } |
|---|
| 703 | 649 | |
|---|
| 704 | 650 | return -ENOMEM; |
|---|
| 705 | 651 | } |
|---|